lambdacube-engine (empty) → 0.1.1
raw patch · 62 files changed
+12882/−0 lines, 62 filesdep +OpenGLdep +arraydep +basesetup-changed
Dependencies added: OpenGL, array, base, binary, bytestring, containers, directory, fgl, filepath, hslogger, stb-image, uulib, xml, zip-archive
Files
- Graphics/LambdaCube.hs +63/−0
- Graphics/LambdaCube/AnimationState.hs +28/−0
- Graphics/LambdaCube/BlendMode.hs +131/−0
- Graphics/LambdaCube/Common.hs +115/−0
- Graphics/LambdaCube/Compositor.hs +121/−0
- Graphics/LambdaCube/Entity.hs +228/−0
- Graphics/LambdaCube/Frustum.hs +153/−0
- Graphics/LambdaCube/GpuProgram.hs +65/−0
- Graphics/LambdaCube/GpuProgramParams.hs +925/−0
- Graphics/LambdaCube/GpuProgramUsage.hs +47/−0
- Graphics/LambdaCube/HardwareBuffer.hs +93/−0
- Graphics/LambdaCube/HardwareIndexBuffer.hs +20/−0
- Graphics/LambdaCube/HardwareOcclusionQuery.hs +41/−0
- Graphics/LambdaCube/HardwareVertexBuffer.hs +187/−0
- Graphics/LambdaCube/Image.hs +34/−0
- Graphics/LambdaCube/Light.hs +58/−0
- Graphics/LambdaCube/Loader/CompositorScript.hs +262/−0
- Graphics/LambdaCube/Loader/CompositorScriptScanner.x +63/−0
- Graphics/LambdaCube/Loader/FontDefinitionScriptScanner.x +56/−0
- Graphics/LambdaCube/Loader/Generated/CompositorScriptScanner.hs +268/−0
- Graphics/LambdaCube/Loader/Generated/MaterialScriptScanner.hs too large to diff
- Graphics/LambdaCube/Loader/Generated/ResourceScriptScanner.hs +265/−0
- Graphics/LambdaCube/Loader/Makefile +13/−0
- Graphics/LambdaCube/Loader/MaterialScript.hs +712/−0
- Graphics/LambdaCube/Loader/MaterialScriptScanner.x +115/−0
- Graphics/LambdaCube/Loader/MeshXML.hs +266/−0
- Graphics/LambdaCube/Loader/OverlayScriptScanner.x +69/−0
- Graphics/LambdaCube/Loader/ParserUtil.hs +493/−0
- Graphics/LambdaCube/Loader/ResourceScript.hs +42/−0
- Graphics/LambdaCube/Loader/ResourceScriptScanner.x +52/−0
- Graphics/LambdaCube/Loader/StbImage.hs +42/−0
- Graphics/LambdaCube/Material.hs +50/−0
- Graphics/LambdaCube/Math.hs +160/−0
- Graphics/LambdaCube/Mesh.hs +212/−0
- Graphics/LambdaCube/Pass.hs +120/−0
- Graphics/LambdaCube/PixelFormat.hs +494/−0
- Graphics/LambdaCube/RenderOperation.hs +31/−0
- Graphics/LambdaCube/RenderQueue.hs +225/−0
- Graphics/LambdaCube/RenderSystem.hs +1492/−0
- Graphics/LambdaCube/RenderSystem/GL.hs +13/−0
- Graphics/LambdaCube/RenderSystem/GL/GLCapabilities.hs +404/−0
- Graphics/LambdaCube/RenderSystem/GL/GLGpuProgram.hs +147/−0
- Graphics/LambdaCube/RenderSystem/GL/GLIndexBuffer.hs +142/−0
- Graphics/LambdaCube/RenderSystem/GL/GLOcclusionQuery.hs +37/−0
- Graphics/LambdaCube/RenderSystem/GL/GLRenderSystem.hs +1402/−0
- Graphics/LambdaCube/RenderSystem/GL/GLTexture.hs +361/−0
- Graphics/LambdaCube/RenderSystem/GL/GLUtils.hs +326/−0
- Graphics/LambdaCube/RenderSystem/GL/GLVertexBuffer.hs +133/−0
- Graphics/LambdaCube/RenderSystemCapabilities.hs +119/−0
- Graphics/LambdaCube/Resource.hs +145/−0
- Graphics/LambdaCube/SceneGraph.hs +141/−0
- Graphics/LambdaCube/Technique.hs +84/−0
- Graphics/LambdaCube/Texture.hs +81/−0
- Graphics/LambdaCube/TextureUnitState.hs +195/−0
- Graphics/LambdaCube/Types.hs +26/−0
- Graphics/LambdaCube/Utility.hs +11/−0
- Graphics/LambdaCube/VertexIndexData.hs +239/−0
- Graphics/LambdaCube/World.hs +904/−0
- LICENSE +28/−0
- README +18/−0
- Setup.hs +2/−0
- lambdacube-engine.cabal +113/−0
+ Graphics/LambdaCube.hs view
@@ -0,0 +1,63 @@+module Graphics.LambdaCube (+-- module Graphics.LambdaCube.Overlay,+ module Graphics.LambdaCube.Compositor,+ module Graphics.LambdaCube.Material,+ module Graphics.LambdaCube.Common,+ module Graphics.LambdaCube.Math,+ module Graphics.LambdaCube.Entity,+ module Graphics.LambdaCube.Frustum,+ module Graphics.LambdaCube.Mesh,+ module Graphics.LambdaCube.HardwareBuffer,+ module Graphics.LambdaCube.HardwareVertexBuffer,+ module Graphics.LambdaCube.HardwareIndexBuffer,+ module Graphics.LambdaCube.VertexIndexData,+ module Graphics.LambdaCube.Resource,+ module Graphics.LambdaCube.RenderQueue,+ module Graphics.LambdaCube.RenderSystem,+ module Graphics.LambdaCube.RenderOperation,+ module Graphics.LambdaCube.SceneGraph,+ module Graphics.LambdaCube.Loader.StbImage,+-- module Graphics.LambdaCube.Loader.MeshXML,+-- module Graphics.LambdaCube.Loader.MeshBinary,+-- module Graphics.LambdaCube.Loader.LMeshBinary,+ module Graphics.LambdaCube.Loader.CompositorScript,+ module Graphics.LambdaCube.Loader.MaterialScript,+ module Graphics.LambdaCube.Loader.ResourceScript,+ module Graphics.LambdaCube.World,+ module Graphics.LambdaCube.Types,+ module Graphics.LambdaCube.Texture,+ module Graphics.LambdaCube.GpuProgram,+ module Graphics.LambdaCube.Utility+-- module Graphics.LambdaCube.Loader.OverlayScript+) where++import Graphics.LambdaCube.Common+import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Utility+--import Graphics.LambdaCube.Overlay+import Graphics.LambdaCube.Compositor+import Graphics.LambdaCube.Material+import Graphics.LambdaCube.Math+import Graphics.LambdaCube.Entity+import Graphics.LambdaCube.Frustum+import Graphics.LambdaCube.Mesh+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.GpuProgram+import Graphics.LambdaCube.HardwareBuffer+import Graphics.LambdaCube.HardwareVertexBuffer+import Graphics.LambdaCube.HardwareIndexBuffer+import Graphics.LambdaCube.VertexIndexData+import Graphics.LambdaCube.Resource+import Graphics.LambdaCube.RenderQueue+import Graphics.LambdaCube.RenderSystem+import Graphics.LambdaCube.RenderOperation+import Graphics.LambdaCube.SceneGraph+import Graphics.LambdaCube.Loader.StbImage+--import Graphics.LambdaCube.Loader.MeshXML+--import Graphics.LambdaCube.Loader.MeshBinary+--import Graphics.LambdaCube.Loader.LMeshBinary+import Graphics.LambdaCube.Loader.MaterialScript+import Graphics.LambdaCube.Loader.CompositorScript+import Graphics.LambdaCube.Loader.ResourceScript+import Graphics.LambdaCube.World+--import Graphics.LambdaCube.Loader.OverlayScript
+ Graphics/LambdaCube/AnimationState.hs view
@@ -0,0 +1,28 @@+module Graphics.LambdaCube.AnimationState where++import Data.Map+import Graphics.LambdaCube.Types++{-| Represents the state of an animation and the weight of it's influence. +@remarks+ Other classes can hold instances of this class to store the state of any animations+ they are using.+-}+data AnimationState+ = AnimationState+ { asBlendMask :: [Float] -- ^ the blend mask (containing per bone weights)+ , asAnimationName :: String+ , asTimePos :: FloatType+ , asLength :: FloatType+ , asWeight :: FloatType+ , asEnabled :: Bool+ , asLoop :: Bool+ }++-- | Class encapsulating a set of AnimationState objects.+data AnimationStateSet+ = AnimationStateSet+ { assDirtyFrameNumber :: Int+ , assAnimationStates :: Map String AnimationState+ , assEnabledAnimationStates :: [AnimationState] -- ^ List of enabled animation states+ }
+ Graphics/LambdaCube/BlendMode.hs view
@@ -0,0 +1,131 @@+module Graphics.LambdaCube.BlendMode where++import Graphics.LambdaCube.Types++-- | Type of texture blend mode.+data LayerBlendType+ = LBT_COLOUR+ | LBT_ALPHA+ deriving Eq+ +{-| List of valid texture blending operations, for use with TextureUnitState::setColourOperation.+ @remarks+ This list is a more limited list than LayerBlendOperationEx because it only+ includes operations that are supportable in both multipass and multitexture+ rendering and thus provides automatic fallback if multitexture hardware+ is lacking or insufficient.+-}+data LayerBlendOperation+ = LBO_REPLACE -- ^ Replace all colour with texture with no adjustment+ | LBO_ADD -- ^ Add colour components together.+ | LBO_MODULATE -- ^ Multiply colour components together.+ | LBO_ALPHA_BLEND -- ^ Blend based on texture alpha+ deriving Eq++{-| Expert list of valid texture blending operations, for use with TextureUnitState::setColourOperationEx+ and TextureUnitState::setAlphaOperation, and internally in the LayerBlendModeEx class. It's worth+ noting that these operations are for blending <i>between texture layers</i> and not between rendered objects+ and the existing scene. Because all of these modes are only supported in multitexture hardware it may be+ required to set up a fallback operation where this hardware is not available.+-}+data LayerBlendOperationEx+ = LBX_SOURCE1 -- ^ use source1 without modification+ | LBX_SOURCE2 -- ^ use source2 without modification+ | LBX_MODULATE -- ^ multiply source1 and source2 together+ | LBX_MODULATE_X2 -- ^ as LBX_MODULATE but brighten afterwards (x2)+ | LBX_MODULATE_X4 -- ^ as LBX_MODULATE but brighten more afterwards (x4)+ | LBX_ADD -- ^ add source1 and source2 together+ | LBX_ADD_SIGNED -- ^ as LBX_ADD, but subtract 0.5 from the result+ | LBX_ADD_SMOOTH -- ^ as LBX_ADD, but subtract product from the sum+ | LBX_SUBTRACT -- ^ subtract source2 from source1+ | LBX_BLEND_DIFFUSE_ALPHA -- ^ use interpolated alpha value from vertices to scale source1, then add source2 scaled by (1-alpha)+ | LBX_BLEND_TEXTURE_ALPHA -- ^ as LBX_BLEND_DIFFUSE_ALPHA, but use alpha from texture+ | LBX_BLEND_CURRENT_ALPHA -- ^ as LBX_BLEND_DIFFUSE_ALPHA, but use current alpha from previous stages+ | LBX_BLEND_MANUAL -- ^ as LBX_BLEND_DIFFUSE_ALPHA but use a constant manual blend value (0.0-1.0)+ | LBX_DOTPRODUCT -- ^ dot product of color1 and color2 + | LBX_BLEND_DIFFUSE_COLOUR -- ^ use interpolated color values from vertices to scale source1, then add source2 scaled by (1-color)+ deriving Eq++{-| List of valid sources of values for blending operations used+ in TextureUnitState::setColourOperation and TextureUnitState::setAlphaOperation,+ and internally in the LayerBlendModeEx class.+-}+data LayerBlendSource+ = LBS_CURRENT -- ^ the colour as built up from previous stages+ | LBS_TEXTURE -- ^ the colour derived from the texture assigned to this layer+ | LBS_DIFFUSE -- ^ the interpolated diffuse colour from the vertices+ | LBS_SPECULAR -- ^ the interpolated specular colour from the vertices+ | LBS_MANUAL -- ^ a colour supplied manually as a separate argument+ deriving Eq+ ++data LayerBlendModeEx+ = LayerBlendModeEx+ { lbBlendType :: LayerBlendType -- ^ The type of blending (colour or alpha)+ , lbOperation :: LayerBlendOperationEx -- ^ The operation to be applied+ , lbSource1 :: LayerBlendSource -- ^ The first source of colour/alpha+ , lbSource2 :: LayerBlendSource -- ^ The second source of colour/alpha+ , lbColourArg1 :: ColourValue -- ^ Manual colour value for manual source1+ , lbColourArg2 :: ColourValue -- ^ Manual colour value for manual source2+ , lbAlphaArg1 :: FloatType -- ^ Manual alpha value for manual source1+ , lbAlphaArg2 :: FloatType -- ^ Manual alpha value for manual source2+ , lbFactor :: FloatType -- ^ Manual blending factor+ }+ deriving Eq++{-| Types of blending that you can specify between an object and the existing contents of the scene.+ @remarks+ As opposed to the LayerBlendType, which classifies blends between texture layers, these blending+ types blend between the output of the texture units and the pixels already in the viewport,+ allowing for object transparency, glows, etc.+ @par+ These types are provided to give quick and easy access to common effects. You can also use+ the more manual method of supplying source and destination blending factors.+ See Material::setSceneBlending for more details.+ @see+ Material::setSceneBlending+-}+data SceneBlendType+ = SBT_TRANSPARENT_ALPHA -- ^ Make the object transparent based on the final alpha values in the texture+ | SBT_TRANSPARENT_COLOUR -- ^ Make the object transparent based on the colour values in the texture (brighter = more opaque)+ | SBT_ADD -- ^ Add the texture values to the existing scene content+ | SBT_MODULATE -- ^ Multiply the 2 colours together+ | SBT_REPLACE -- ^ The default blend mode where source replaces destination+ deriving Eq++{-| Blending factors for manually blending objects with the scene. If there isn't a predefined+ SceneBlendType that you like, then you can specify the blending factors directly to affect the+ combination of object and the existing scene. See Material::setSceneBlending for more details.+-}+data SceneBlendFactor+ = SBF_ONE+ | SBF_ZERO+ | SBF_DEST_COLOUR+ | SBF_SOURCE_COLOUR+ | SBF_ONE_MINUS_DEST_COLOUR+ | SBF_ONE_MINUS_SOURCE_COLOUR+ | SBF_DEST_ALPHA+ | SBF_SOURCE_ALPHA+ | SBF_ONE_MINUS_DEST_ALPHA+ | SBF_ONE_MINUS_SOURCE_ALPHA+ deriving Eq++{-| Blending operations controls how objects are blended into the scene. The default operation+ is add (+) but by changing this you can change how drawn objects are blended into the+ existing scene.+-}+data SceneBlendOperation+ = SBO_ADD+ | SBO_SUBTRACT+ | SBO_REVERSE_SUBTRACT+ | SBO_MIN+ | SBO_MAX+ deriving Eq++-- | Converts SceneBlendType to SceneBlendFactor pair+convertSBTtoSBF :: SceneBlendType -> (SceneBlendFactor,SceneBlendFactor)+convertSBTtoSBF SBT_ADD = (SBF_ONE,SBF_ONE)+convertSBTtoSBF SBT_MODULATE = (SBF_DEST_COLOUR,SBF_ZERO)+convertSBTtoSBF SBT_TRANSPARENT_COLOUR = (SBF_SOURCE_COLOUR,SBF_ONE_MINUS_SOURCE_COLOUR)+convertSBTtoSBF SBT_TRANSPARENT_ALPHA = (SBF_SOURCE_ALPHA,SBF_ONE_MINUS_SOURCE_ALPHA)+convertSBTtoSBF SBT_REPLACE = (SBF_ONE,SBF_ZERO)
+ Graphics/LambdaCube/Common.hs view
@@ -0,0 +1,115 @@+module Graphics.LambdaCube.Common where++{-| Comparison functions used for the depth/stencil buffer operations and + others. -}+data CompareFunction+ = CMPF_ALWAYS_FAIL+ | CMPF_ALWAYS_PASS+ | CMPF_LESS+ | CMPF_LESS_EQUAL+ | CMPF_EQUAL+ | CMPF_NOT_EQUAL+ | CMPF_GREATER_EQUAL+ | CMPF_GREATER+ deriving Eq++{-| High-level filtering options providing shortcuts to settings the+ minification, magnification and mip filters. -}+data TextureFilterOptions+ = TFO_NONE -- ^ Equal to: min=FO_POINT, mag=FO_POINT, mip=FO_NONE+ | TFO_BILINEAR -- ^ Equal to: min=FO_LINEAR, mag=FO_LINEAR, mip=FO_POINT+ | TFO_TRILINEAR -- ^ Equal to: min=FO_LINEAR, mag=FO_LINEAR, mip=FO_LINEAR+ | TFO_ANISOTROPIC -- ^ Equal to: min=FO_ANISOTROPIC, max=FO_ANISOTROPIC, mip=FO_LINEAR+ deriving Eq++data FilterType+ = FT_MIN -- ^ The filter used when shrinking a texture+ | FT_MAG -- ^ The filter used when magnifying a texture+ | FT_MIP -- ^ The filter used when determining the mipmap+ deriving Eq+ +-- | Filtering options for textures / mipmaps.+data FilterOptions+ = FO_NONE -- ^ No filtering, used for FILT_MIP to turn off mipmapping+ | FO_POINT -- ^ Use the closest pixel+ | FO_LINEAR -- ^ Average of a 2x2 pixel area, denotes bilinear for MIN and MAG, trilinear for MIP+ | FO_ANISOTROPIC -- ^ Similar to FO_LINEAR, but compensates for the angle of the texture plane+ deriving Eq+ +-- | Light shading modes.+data ShadeOptions+ = SO_FLAT+ | SO_GOURAUD+ | SO_PHONG+ deriving Eq++-- | Fog modes.+data FogMode+ = FOG_NONE -- ^ No fog. Duh.+ | FOG_EXP -- ^ Fog density increases exponentially from the camera (fog = 1/e^(distance * density))+ | FOG_EXP2 -- ^ Fog density increases at the square of FOG_EXP, i.e. even quicker (fog = 1/e^(distance * density)^2)+ | FOG_LINEAR -- ^ Fog density increases linearly between the start and end distances+ deriving Eq++{-| Hardware culling modes based on vertex winding.+ This setting applies to how the hardware API culls triangles it is sent. -}+data CullingMode+ = CULL_NONE -- ^ Hardware never culls triangles and renders everything it receives.+ | CULL_CLOCKWISE -- ^ Hardware culls triangles whose vertices are listed clockwise in the view (default).+ | CULL_ANTICLOCKWISE -- ^ Hardware culls triangles whose vertices are listed anticlockwise in the view.+ deriving Eq++{-| Manual culling modes based on vertex normals.+ This setting applies to how the software culls triangles before sending them to the + hardware API. This culling mode is used by scene managers which choose to implement it -+ normally those which deal with large amounts of fixed world geometry which is often + planar (software culling movable variable geometry is expensive). -}+data ManualCullingMode+ = MANUAL_CULL_NONE -- ^ No culling so everything is sent to the hardware.+ | MANUAL_CULL_BACK -- ^ Cull triangles whose normal is pointing away from the camera (default).+ | MANUAL_CULL_FRONT -- ^ Cull triangles whose normal is pointing towards the camera.+ deriving Eq++-- | Enumerates the wave types usable with the Ogre engine.+data WaveformType+ = WFT_SINE -- ^ Standard sine wave which smoothly changes from low to high and back again.+ | WFT_TRIANGLE -- ^ An angular wave with a constant increase / decrease speed with pointed peaks.+ | WFT_SQUARE -- ^ Half of the time is spent at the min, half at the max with instant transition between.+ | WFT_SAWTOOTH -- ^ Gradual steady increase from min to max over the period with an instant return to min at the end.+ | WFT_INVERSE_SAWTOOTH -- ^ Gradual steady decrease from max to min over the period, with an instant return to max at the end.+ | WFT_PWM -- ^ Pulse Width Modulation. Works like WFT_SQUARE, except the high to low transition is controlled by duty cycle. + -- ^ With a duty cycle of 50% (0.5) will give the same output as WFT_SQUARE.+ deriving Eq++-- | The polygon mode to use when rasterising.+data PolygonMode+ = PM_POINTS -- ^ Only points are rendered.+ | PM_WIREFRAME -- ^ Wireframe models are rendered.+ | PM_SOLID -- ^ Solid polygons are rendered.+ deriving Eq++-- | An enumeration describing which material properties should track the vertex colours +data TrackVertexColourType+ = TrackVertexColourType+ { tvcAmbient :: Bool+ , tvcDiffuse :: Bool+ , tvcSpecular :: Bool+ , tvcEmissive :: Bool+ }+ deriving Eq++-- | Sort mode for billboard-set and particle-system+data SortMode+ = SM_DIRECTION -- ^ Sort by direction of the camera+ | SM_DISTANCE -- ^ Sort by distance from the camera+ deriving Eq++-- | Defines the frame buffer types.+data FrameBufferType+ = FrameBufferType+ { fbtColour :: Bool+ , fbtDepth :: Bool+ , fbtStencil :: Bool+ }+ deriving Eq+
+ Graphics/LambdaCube/Compositor.hs view
@@ -0,0 +1,121 @@+module Graphics.LambdaCube.Compositor where++import Data.Maybe+import Data.Word+import Data.IntMap (IntMap)++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Common+import Graphics.LambdaCube.PixelFormat+import Graphics.LambdaCube.RenderSystem+import Graphics.LambdaCube.Material+import Graphics.LambdaCube.GpuProgram+import Graphics.LambdaCube.Texture++-- | Enumeration that enumerates the various composition pass types.+data PassType+ = PT_CLEAR -- ^ Clear target to one colour+ | PT_STENCIL -- ^ Set stencil operation+ | PT_RENDERSCENE -- ^ Render the scene or part of it+ | PT_RENDERQUAD -- ^ Render a full screen quad++-- | Input mode of a TargetPass+data InputMode+ = IM_NONE -- ^ No input+ | IM_PREVIOUS -- ^ Output of previous Composition in chain+ deriving Eq+ +{-| Class representing a Compositor object. Compositors provide the means + to flexibly "composite" the final rendering result from multiple scene renders+ and intermediate operations like rendering fullscreen quads. This makes + it possible to apply postfilter effects, HDRI postprocessing, and shadow + effects to a Viewport. -}+data (Texture t, LinkedGpuProgram lp) => Compositor t lp+ = Compositor+ { cmpName :: String+ , cmpTechniques :: [CompositionTechnique t lp]+ , cmpSupportedTechniques :: Maybe [CompositionTechnique t lp]+ }++-- | Local texture definition+data Texture t => TextureDefinition t+ = TextureDefinition+ { tdName :: String+ , tdWidth :: Maybe Int -- Nothing means adapt to target width+ , tdHeight :: Maybe Int -- Nothing means adapt to target height+ , tdWidthFactor :: FloatType -- multiple of target width to use (if width = Nothing)+ , tdHeightFactor :: FloatType -- multiple of target height to use (if height = Nothing)+ , tdFormatList :: [PixelFormat] -- more than one means MRT+ , tdFsaa :: Bool -- FSAA enabled; true = determine from main target (if render_scene), false = disable+ , tdHwGammaWrite :: Bool -- Do sRGB gamma correction on write (only 8-bit per channel formats) + , tdShared :: Bool -- whether to use shared textures for this one+ , tdTexture :: Maybe t+ }++data InputTex+ = InputTex+ { itName :: String -- ^ Name (local) of the input texture+ , itMrtIndex :: Int -- ^ MRT surface index if applicable+ }++data (Texture t, LinkedGpuProgram lp) => CompositionTechnique t lp+ = CompositionTechnique+ { ctTextureDefinitions :: [TextureDefinition t] -- ^ Local texture definitions+ , ctTargetPasses :: [CompositionTargetPass t lp] -- ^ Intermediate target passes+ , ctOutputTarget :: CompositionTargetPass t lp -- ^ Output target pass (can be only one)+ , ctSchemeName :: String -- ^ Optional scheme name+ }++-- | Object representing one render to a RenderTarget or Viewport in the Ogre Composition framework.+data (Texture t, LinkedGpuProgram lp) => CompositionTargetPass t lp+ = CompositionTargetPass+ { ctpInputMode :: InputMode -- ^ Input name+ , ctpOutputName :: String -- ^ (local) output texture+ , ctpOutput :: Maybe (TextureDefinition t)+ , ctpPasses :: [CompositionPass t lp] -- ^ Passes+ , ctpOnlyInitial :: Bool -- ^ This target pass is only executed initially after the effect has been enabled.+ , ctpVisibilityMask :: Word32 -- ^ Visibility mask for this render+ , ctpLodBias :: FloatType -- ^ LOD bias of this render+ , ctpMaterialScheme :: String -- ^ Material scheme name+ , ctpShadowsEnabled :: Bool -- ^ Shadows option+ }++{-| Object representing one pass or operation in a composition sequence. This provides a + method to conveniently interleave RenderSystem commands between Render Queues. -}+data (Texture t, LinkedGpuProgram lp) => CompositionPass t lp+ = CompositionPass+ { cpType :: PassType -- ^ Type of composition pass+ , cpIdentifier :: Word32 -- ^ Identifier for this pass+ , cpMaterialName :: String -- ^ Material used for rendering+ , cpMaterial :: Maybe (Material t lp)+ , cpFirstRenderQueue :: Int -- ^ [first,last] render queue to render this pass (in case of PT_RENDERSCENE)+ , cpLastRenderQueue :: Int+ , cpClearBuffers :: (Bool,Bool,Bool) -- ^ Clear buffers (in case of PT_CLEAR), hint: [colour] [depth] [stencil]+ , cpClearColour :: ColourValue -- ^ Clear colour (in case of PT_CLEAR)+ , cpClearDepth :: FloatType -- ^ Clear depth (in case of PT_CLEAR)+ , cpClearStencil :: Word32 -- ^ Clear stencil value (in case of PT_CLEAR)+ , cpInputs :: IntMap InputTex -- ^ Inputs (for material used for rendering the quad)+ , cpStencilCheck :: Bool -- ^ Stencil operation parameters+ , cpStencilFunc :: CompareFunction+ , cpStencilRefValue :: Word32+ , cpStencilMask :: Word32+ , cpStencilFailOp :: StencilOperation+ , cpStencilDepthFailOp :: StencilOperation+ , cpStencilPassOp :: StencilOperation+ , cpStencilTwoSidedOperation :: Bool+ , cpQuadCornerModified :: Bool -- ^ true if quad should not cover whole screen+ , cpQuadLeft :: FloatType -- ^ quad positions in normalised coordinates [-1;1]x[-1;1] (in case of PT_RENDERQUAD)+ , cpQuadTop :: FloatType+ , cpQuadRight :: FloatType+ , cpQuadBottom :: FloatType+ , cpQuadFarCorners :: Bool+ , cpQuadFarCornersViewSpace :: Bool+ }+{- +data CompositionPass+ = CompositionRenderQuadPass+ , rqInput :: (Int, String, Int)+ }+-}+--compileCompositor+
+ Graphics/LambdaCube/Entity.hs view
@@ -0,0 +1,228 @@+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+module Graphics.LambdaCube.Entity where++import Data.Map (Map)+import qualified Data.Map as Map+import Data.Maybe+--import qualified Data.Set as Set++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Mesh+import Graphics.LambdaCube.AnimationState+import Graphics.LambdaCube.VertexIndexData+import Graphics.LambdaCube.Material+import Graphics.LambdaCube.RenderQueue+import Graphics.LambdaCube.RenderSystem+import Graphics.LambdaCube.RenderOperation+import Graphics.LambdaCube.Technique+import Graphics.LambdaCube.HardwareVertexBuffer+import Graphics.LambdaCube.HardwareIndexBuffer+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.GpuProgram++{-| Utility class which defines the sub-parts of an Entity.+ @remarks+ Just as meshes are split into submeshes, an Entity is made up of+ potentially multiple SubMeshes. These are mainly here to provide the+ link between the Material which the SubEntity uses (which may be the+ default Material for the SubMesh or may have been changed for this+ object) and the SubMesh data.+ @par+ The SubEntity also allows the application some flexibility in the+ material properties for this section of a particular instance of this+ Mesh, e.g. tinting the windows on a car model.+ @par+ SubEntity instances are never created manually. They are created at+ the same time as their parent Entity by the SceneManager method+ createEntity.+-}+data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => SubEntity vb ib t lp+ = SubEntity+ { seMaterial :: Material t lp -- ^ Cached pointer to material.+ , seSubMesh :: SubMesh vb ib -- ^ Pointer to the SubMesh defining geometry.+-- , seVisible :: Bool -- ^ Is this SubEntity visible?+-- , seMaterialLodIndex :: Int -- ^ The LOD number of the material to use, calculated by Entity::_notifyCurrentCamera+-- , seSkelAnimVertexData :: VertexData -- ^ blend buffer details for dedicated geometry+ -- | Quick lookup of buffers+ -- TODO: TempBlendedBufferInfo mTempSkelAnimInfo;+ -- | Temp buffer details for software Vertex anim geometry+ -- TODO: TempBlendedBufferInfo mTempVertexAnimInfo;+-- , seSoftwareVertexAnimVertexData :: VertexData -- ^ Vertex data details for software Vertex anim of shared geometry+ {-| Vertex data details for hardware Vertex anim of shared geometry+ - separate since we need to s/w anim for shadows whilst still altering+ the vertex data for hardware morphing (pos2 binding)+ -}+-- , seHardwareVertexAnimVertexData :: VertexData+-- , seVertexAnimationAppliedThisFrame :: Bool -- ^ Have we applied any vertex animation to geometry?+-- , seHardwarePoseCount :: Int -- ^ Number of hardware blended poses supported by material+ -- | Cached distance to last camera for getSquaredViewDepth+ -- TODO: , seCachedCameraDist :: FloatType+ -- | The camera for which the cached distance is valid+ -- TODO: , seCachedCamera :: Camera+ }++{-| Defines an instance of a discrete, movable object based on a Mesh.+@remarks+Ogre generally divides renderable objects into 2 groups, discrete+(separate) and relatively small objects which move around the world,+and large, sprawling geometry which makes up generally immovable+scenery, aka 'level geometry'.+@par+The Mesh and SubMesh classes deal with the definition of the geometry+used by discrete movable objects. Entities are actual instances of+objects based on this geometry in the world. Therefore there is+usually a single set Mesh for a car, but there may be multiple+entities based on it in the world. Entities are able to override+aspects of the Mesh it is defined by, such as changing material+properties per instance (so you can have many cars using the same+geometry but different textures for example). Because a Mesh is split+into SubMeshes for this purpose, the Entity class is a grouping class+(much like the Mesh class) and much of the detail regarding+individual changes is kept in the SubEntity class. There is a 1:1+relationship between SubEntity instances and the SubMesh instances+associated with the Mesh the Entity is based on.+@par+Entity and SubEntity classes are never created directly. Use the+createEntity method of the SceneManager (passing a model name) to+create one.+@par+Entities are included in the scene by associating them with a+SceneNode, using the attachEntity method. See the SceneNode class+for full information.+@note+No functions were declared virtual to improve performance.+-}+---------- new code below -----------+ {-| Nested class to allow entity shadows. -}+ {-+ class _OgreExport EntityShadowRenderable : public ShadowRenderable+ {+ protected:+ Entity* mParent;+ -- Shared link to position buffer+ HardwareVertexBufferSharedPtr mPositionBuffer;+ -- Shared link to w-coord buffer (optional)+ HardwareVertexBufferSharedPtr mWBuffer;+ -- Link to current vertex data used to bind (maybe changes)+ const VertexData* mCurrentVertexData;+ -- Original position buffer source binding+ unsigned short mOriginalPosBufferBinding;+ -- | Link to SubEntity, only present if SubEntity has it's own geometry+ SubEntity* mSubEntity;+++ public:+ EntityShadowRenderable(Entity* parent,+ HardwareIndexBufferSharedPtr* indexBuffer, const VertexData* vertexData,+ bool createSeparateLightCap, SubEntity* subent, bool isLightCap = false);+ ~EntityShadowRenderable();+ -- | Overridden from ShadowRenderable+ void getWorldTransforms(Matrix4* xform) const;+ HardwareVertexBufferSharedPtr getPositionBuffer(void) { return mPositionBuffer; }+ HardwareVertexBufferSharedPtr getWBuffer(void) { return mWBuffer; }+ -- | Rebind the source positions (for temp buffer users)+ void rebindPositionBuffer(const VertexData* vertexData, bool force);+ -- | Overridden from ShadowRenderable+ bool isVisible(void) const;++ };+ -}+-- | Identify which vertex data we should be sending to the renderer+data VertexDataBindChoice+ = BIND_ORIGINAL+ | BIND_SOFTWARE_SKELETAL+ | BIND_SOFTWARE_MORPH+ | BIND_HARDWARE_MORPH++data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => Entity vb ib t lp+ = Entity+ {+ -- MovableObject attributes+ -- TODO: add all attrs+ enName :: String+ , enRenderQueue :: Int + + -- Own attributes + , enMesh :: Mesh vb ib+ , enSubEntityList :: [SubEntity vb ib t lp]+-- TODO , enAnimationState :: AnimationStateSet -- ^ State of animation for animable meshes+-- TODO , enTempSkelAnimInfo :: TempBlendedBufferInfo -- ^ Temp buffer details for software skeletal anim of shared geometry+-- TODO , enSkelAnimVertexData :: VertexData -- ^ Vertex data details for software skeletal anim of shared geometry+-- TODO , enTempVertexAnimInfo :: TempBlendedBufferInfo -- ^ Temp buffer details for software vertex anim of shared geometry+-- TODO , enSoftwareVertexAnimVertexData :: VertexData -- ^ Vertex data details for software vertex anim of shared geometry+ -- | Vertex data details for hardware vertex anim of shared geometry+ -- | - separate since we need to s/w anim for shadows whilst still altering+ -- | the vertex data for hardware morphing (pos2 binding)+-- TODO , enHardwareVertexAnimVertexData :: VertexData+-- TODO , enVertexAnimationAppliedThisFrame :: Bool -- ^ Have we applied any vertex animation to shared geometry?+-- , enPreparedForShadowVolumes :: Bool -- ^ Have the temp buffers already had their geometry prepared for use in rendering shadow volumes?+-- TODO , enBoneWorldMatrices :: Matrix4 -- ^ Cached bone matrices, including any world transform++-- TODO , enBoneMatrices :: Matrix4 -- ^ Cached bone matrices in skeleton local space, might shares with other entity instances.+-- TODO , enNumBoneMatrices :: Int+-- , enFrameAnimationLastUpdated :: Int -- ^ Records the last frame in which animation was updated+ + -- | Records the last frame in which the bones was updated+ -- | It's a pointer because it can be shared between different entities with+ -- | a shared skeleton.+-- , enFrameBonesLastUpdated :: Int+ + {-|+ * A set of all the entities which shares a single SkeletonInstance.+ * This is only created if the entity is in fact sharing it's SkeletonInstance with+ * other Entities.+ -}+-- TODO , enSharedSkeletonEntities :: Set Entity+ +-- TODO , enDisplaySkeleton :: Bool -- ^ Flag determines whether or not to display skeleton+-- TODO , enHardwareAnimation :: Bool -- ^ Flag indicating whether hardware animation is supported by this entities materials+-- TODO , enHardwarePoseCount :: Bool -- ^ Number of hardware poses supported by materials+-- , enVertexProgramInUse :: Bool -- ^ Flag indicating whether we have a vertex program in use on any of our subentities+-- TODO , enSoftwareAnimationRequests :: Int -- ^ Counter indicating number of requests for software animation.+-- TODO , enSoftwareAnimationNormalsRequests :: Int -- ^ Counter indicating number of requests for software blended normals.+-- TODO , enSkipAnimStateUpdates :: Bool -- ^ Flag indicating whether to skip automatic updating of the Skeleton's AnimationState+ +-- , enMeshLodIndex :: Int -- ^ The LOD number of the mesh to use, calculated by _notifyCurrentCamera+ +-- , enMeshLodFactorTransformed :: FloatType -- ^ LOD bias factor, transformed for optimisation when calculating adjusted lod value+-- , enMinMeshLodIndex :: Int -- ^ Index of minimum detail LOD (NB higher index is lower detail)+-- , enMaxMeshLodIndex :: Int -- ^ Index of maximum detail LOD (NB lower index is higher detail)+ +-- , enMaterialLodFactor :: FloatType -- ^ LOD bias factor, not transformed+-- , enMaterialLodFactorTransformed :: FloatType -- ^ LOD bias factor, transformed for optimisation when calculating adjusted lod value+-- , enMinMaterialLodIndex :: Int -- ^ Index of minimum detail LOD (NB higher index is lower detail)+-- , enMaxMaterialLodIndex :: Int -- ^ Index of maximum detail LOD (NB lower index is higher detail)+ + {-| List of LOD Entity instances (for manual LODs).+ We don't know when the mesh is using manual LODs whether one LOD to the next will have the+ same number of SubMeshes, therefore we have to allow a separate Entity list+ with each alternate one.+ -}+-- , enLodEntityList :: [Entity]+ -- TODO: , enSkeletonInstance :: SkeletonInstance -- ^ This Entity's personal copy of the skeleton, if skeletally animated+-- , enInitialised :: Bool -- ^ Has this entity been initialised yet?+-- , enLastParentXform :: Matrix4 -- ^ Last parent xform+-- , enMeshStateCount :: Int -- ^ Mesh state count, used to detect differences+ -- TODO: , enChildObjectList :: Map String MovableObject -- ^ Contains the child objects (attached to bones) indexed by name+ -- TODO: , enFullBoundingBox :: AxisAlignedBox -- ^ Bounding box that 'contains' all the mesh of each child entity+ -- TODO: , enShadowRenderables :: [ShadowRenderable]+ }++instance (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => Renderable (Entity vb ib t lp) vb ib t lp where+ prepare = prepareEntity++prepareEntity m ent = map mkRenderEntity (enSubEntityList ent)+ where+ mkRenderEntity e = RenderEntity+ { rePassList = fromMaybe [] (fmap (tchPasses . head) (mtSupportedTechniques (seMaterial e)))+ , reOperation = mkOperation . seSubMesh $ e+ , reMatrix = m+ }++ mkOperation sm = RenderOperation+ { roVertexData = case smVertexData sm of+ Just vd -> vd+ Nothing -> fromMaybe (error "fromJust 11") . msSharedVertexData . enMesh $ ent+ , roOperationType = smOperationType sm+ , roIndexData = smIndexData sm+ }
+ Graphics/LambdaCube/Frustum.hs view
@@ -0,0 +1,153 @@+module Graphics.LambdaCube.Frustum where++import Graphics.LambdaCube.Types++{-+class Plane +{+public:++ Vec3 normal,point;+ float d;++ void set3Points( Vec3 &v1, Vec3 &v2, Vec3 &v3);+ float distance(Vec3 &p);+};++void Plane::set3Points( Vec3 &v1, Vec3 &v2, Vec3 &v3) {++ Vec3 aux1, aux2;++ aux1 = v1 - v2;+ aux2 = v3 - v2;++ normal = aux2 * aux1;++ normal.normalize();+ point.copy(v2);+ d = -(normal.innerProduct(point));+}++float Plane::distance(Vec3 &p) {++ return (d + normal.innerProduct(p));+}++class FrustumG +{+private:++ enum {+ TOP = 0,+ BOTTOM,+ LEFT,+ RIGHT,+ NEARP,+ FARP+ };+public:++ static enum {OUTSIDE, INTERSECT, INSIDE};++ Plane pl[6];++ Vec3 ntl,ntr,nbl,nbr,ftl,ftr,fbl,fbr;+ float nearD, farD, ratio, angle,tang;+ float nw,nh,fw,fh;++ void FrustumG::setCamInternals(float angle, float ratio, float nearD, float farD);+ void FrustumG::setCamDef(Vec3 &p, Vec3 &l, Vec3 &u);+ int FrustumG::pointInFrustum(Vec3 &p);+ int FrustumG::sphereInFrustum(Vec3 &p, float raio);+ int FrustumG::boxInFrustum(AABox &b);+};++#define ANG2RAD 3.14159265358979323846/180.0++void FrustumG::setCamInternals(float angle, float ratio, float nearD, float farD) {++ this->ratio = ratio;+ this->angle = angle;+ this->nearD = nearD;+ this->farD = farD;++ tang = (float)tan(angle* ANG2RAD * 0.5) ;+ nh = nearD * tang;+ nw = nh * ratio; + fh = farD * tang;+ fw = fh * ratio;+}++void FrustumG::setCamDef(Vec3 &p, Vec3 &l, Vec3 &u) {++ Vec3 dir,nc,fc,X,Y,Z;++ Z = p - l;+ Z.normalize();++ X = u * Z;+ X.normalize();++ Y = Z * X;++ nc = p - Z * nearD;+ fc = p - Z * farD;++ ntl = nc + Y * nh - X * nw;+ ntr = nc + Y * nh + X * nw;+ nbl = nc - Y * nh - X * nw;+ nbr = nc - Y * nh + X * nw;++ ftl = fc + Y * fh - X * fw;+ ftr = fc + Y * fh + X * fw;+ fbl = fc - Y * fh - X * fw;+ fbr = fc - Y * fh + X * fw;++ pl[TOP].set3Points(ntr,ntl,ftl);+ pl[BOTTOM].set3Points(nbl,nbr,fbr);+ pl[LEFT].set3Points(ntl,nbl,fbl);+ pl[RIGHT].set3Points(nbr,ntr,fbr);+ pl[NEARP].set3Points(ntl,ntr,nbr);+ pl[FARP].set3Points(ftr,ftl,fbl);+}++int FrustumG::pointInFrustum(Vec3 &p) {++ int result = INSIDE;+ for(int i=0; i < 6; i++) {++ if (pl[i].distance(p) < 0)+ return OUTSIDE;+ }+ return(result);+}++int FrustumG::sphereInFrustum(Vec3 &p, float raio) {++ int result = INSIDE;+ float distance;++ for(int i=0; i < 6; i++) {+ distance = pl[i].distance(p);+ if (distance < -raio)+ return OUTSIDE;+ else if (distance < raio)+ result = INTERSECT;+ }+ return(result);+}++int FrustumG::boxInFrustum(AABox &b) {++ int result = INSIDE;+ for(int i=0; i < 6; i++) {++ if (pl[i].distance(b.getVertexP(pl[i].normal)) < 0)+ return OUTSIDE;+ else if (pl[i].distance(b.getVertexN(pl[i].normal)) < 0)+ result = INTERSECT;+ }+ return(result);+ }++-}
+ Graphics/LambdaCube/GpuProgram.hs view
@@ -0,0 +1,65 @@+module Graphics.LambdaCube.GpuProgram where++import Graphics.LambdaCube.GpuProgramParams++data GpuProgramType+ = GPT_VERTEX_PROGRAM+ | GPT_FRAGMENT_PROGRAM+ | GPT_GEOMETRY_PROGRAM+ deriving Eq++class Eq p => GpuProgram p+class Eq lp => LinkedGpuProgram lp --where+-- lgpVertexProgramName :: lp -> String+-- lgpFragmentProgramName :: lp -> String+-- lgpGeometryProgramName :: lp -> String++{-+class GpuProgram p where+ gpType :: p -> GpuProgramType -- ^ The type of the program+ gpFilename :: p -> String -- ^ The name of the file to load source from (may be blank)+ gpSource :: p -> String -- ^ The assembler source of the program (may be blank until file loaded)+ gpLoadFromFile :: p -> Bool -- ^ Whether we need to load source from file or not+ gpSyntaxCode :: p -> String -- ^ Syntax code e.g. arbvp1, vs_2_0 etc+ gpSkeletalAnimation :: p -> Bool -- ^ Does this (vertex) program include skeletal animation?+ gpMorphAnimation :: p -> Bool -- ^ Does this (vertex) program include morph animation?+ gpPoseAnimation :: p -> Int -- ^ Does this (vertex) program include pose animation (count of number of poses supported)+ gpVertexTextureFetch :: p -> Bool -- ^ Does this (vertex) program require support for vertex texture fetch?+ gpNeedsAdjacencyInfo :: p -> Bool -- ^ Does this (geometry) program require adjacency information?+ gpDefaultParams :: p -> GpuProgramParameters -- ^ The default parameters for use with this object+ gpCompileError :: p -> Bool -- ^ Did we encounter a compilation error?+-}++data GpuProgram p => GpuProgramDescriptor p+ = GpuProgramDescriptor+ { gpdName :: String+ , gpdType :: GpuProgramType -- ^ The type of the program+ , gpdFilename :: String -- ^ The name of the file to load source from (may be blank)+-- , gpdSource :: String -- ^ The assembler source of the program (may be blank until file loaded)+-- , gpdLoadFromFile :: Bool -- ^ Whether we need to load source from file or not+ , gpdSyntaxCode :: String -- ^ Syntax code e.g. arbvp1, vs_2_0 etc+ , gpdAttach :: [String]+ , gpdSkeletalAnimation :: Bool -- ^ Does this (vertex) program include skeletal animation?+ , gpdMorphAnimation :: Bool -- ^ Does this (vertex) program include morph animation?+ , gpdPoseAnimation :: Int -- ^ Does this (vertex) program include pose animation (count of number of poses supported)+ , gpdVertexTextureFetch :: Bool -- ^ Does this (vertex) program require support for vertex texture fetch?+ , gpdNeedsAdjacencyInfo :: Bool -- ^ Does this (geometry) program require adjacency information?+ , gpdDefaultParams :: GpuProgramParameters -- ^ The default parameters for use with this object+-- , gpdCompileError :: Bool -- ^ Did we encounter a compilation error?+ + , gpdGpuProgram :: Maybe p+ +-- /** Record of logical to physical buffer maps. Mandatory for low-level+-- programs or high-level programs which set their params the same way. */+-- mutable GpuLogicalBufferStruct mFloatLogicalToPhysical;+-- /** Record of logical to physical buffer maps. Mandatory for low-level+-- programs or high-level programs which set their params the same way. */+-- mutable GpuLogicalBufferStruct mIntLogicalToPhysical;+-- /// Parameter name -> ConstantDefinition map, shared instance used by all parameter objects+-- mutable GpuNamedConstants mConstantDefs;+-- /// File from which to load named constants manually+-- String mManualNamedConstantsFile;+-- bool mLoadedManualNamedConstants;+ + }+-- deriving Eq
+ Graphics/LambdaCube/GpuProgramParams.hs view
@@ -0,0 +1,925 @@+module Graphics.LambdaCube.GpuProgramParams where++import Data.Map (Map)+import qualified Data.Map as Map+import Data.Word++import Graphics.LambdaCube.Types++{-| Enumeration of the types of constant we may encounter in programs. +@note Low-level programs, by definition, will always use either+float4 or int4 constant types since that is the fundamental underlying+type in assembler.+-}+data GpuConstantType+ = GCT_FLOAT1+ | GCT_FLOAT2+ | GCT_FLOAT3+ | GCT_FLOAT4+ | GCT_SAMPLER1D+ | GCT_SAMPLER2D+ | GCT_SAMPLER3D+ | GCT_SAMPLERCUBE+ | GCT_SAMPLER1DSHADOW+ | GCT_SAMPLER2DSHADOW+ | GCT_MATRIX_2X2+ | GCT_MATRIX_2X3+ | GCT_MATRIX_2X4+ | GCT_MATRIX_3X2+ | GCT_MATRIX_3X3+ | GCT_MATRIX_3X4+ | GCT_MATRIX_4X2+ | GCT_MATRIX_4X3+ | GCT_MATRIX_4X4+ | GCT_INT1+ | GCT_INT2+ | GCT_INT3+ | GCT_INT4+ | GCT_UNKNOWN+ deriving Eq+++{-| The variability of a GPU parameter, as derived from auto-params targetting it.+These values must be powers of two since they are used in masks.+-}+data GpuParamVariability+ = GpuParamVariability+ { gpvGlobal :: Bool -- ^ No variation except by manual setting - the default+ , gpvPerObject :: Bool -- ^ Varies per object (based on an auto param usually), but not per light setup+ , gpvLights :: Bool -- ^ Varies with light setup+ , gpvPassIterationNumber :: Bool -- ^ Varies with pass iteration number+ }+ deriving Eq+{-+enum GpuParamVariability+{+ + GPV_GLOBAL = 1, + -- |+ GPV_PER_OBJECT = 2, + -- |Varies with light setup+ GPV_LIGHTS = 4, + -- |Varies with pass iteration number+ GPV_PASS_ITERATION_NUMBER = 8,+++ -- |Full mask (16-bit)+ GPV_ALL = 0xFFFF++};+-}++{-| Information about predefined program constants. +@note Only available for high-level programs but is referenced generically+by GpuProgramParameters.+-}+data GpuConstantDefinition+ = GpuConstantDefinition+ { gcdConstType :: GpuConstantType -- ^ Data type+ , gcdPhysicalIndex :: Int -- ^ Physical start index in buffer (either float or int buffer)+ , gcdLogicalIndex :: Int -- ^ Logical index - used to communicate this constant to the rendersystem+ {-| Number of raw buffer slots per element + (some programs pack each array element to float4, some do not) -}+ , gcdElementSize :: Int+ , gcdArraySize :: Int -- ^ Length of array+ , gcdVariability :: GpuParamVariability -- ^ How this parameter varies (bitwise combination of GpuProgramVariability)+ }+ deriving Eq++isFloat :: GpuConstantType -> Bool+isFloat c = case c of+ { GCT_INT1 -> False+ ; GCT_INT2 -> False+ ; GCT_INT3 -> False+ ; GCT_INT4 -> False+ ; GCT_SAMPLER1D -> False+ ; GCT_SAMPLER2D -> False+ ; GCT_SAMPLER3D -> False+ ; GCT_SAMPLERCUBE -> False+ ; GCT_SAMPLER1DSHADOW -> False+ ; GCT_SAMPLER2DSHADOW -> False+ ; _ -> True+ }++isSampler :: GpuConstantType -> Bool+isSampler c = case c of+ {+ ; GCT_SAMPLER1D -> True+ ; GCT_SAMPLER2D -> True+ ; GCT_SAMPLER3D -> True+ ; GCT_SAMPLERCUBE -> True+ ; GCT_SAMPLER1DSHADOW -> True+ ; GCT_SAMPLER2DSHADOW -> True+ ; _ -> False+ }++{-| Get the element size of a given type, including whether to pad the + elements into multiples of 4 (e.g. SM1 and D3D does, GLSL doesn't)+-}+getElementSize :: GpuConstantType -> Bool -> Int+getElementSize ctype padToMultiplesOf4 = case padToMultiplesOf4 of+ { True -> case ctype of+ { GCT_FLOAT1 -> 4+ ; GCT_INT1 -> 4+ ; GCT_SAMPLER1D -> 4+ ; GCT_SAMPLER2D -> 4+ ; GCT_SAMPLER3D -> 4+ ; GCT_SAMPLERCUBE -> 4+ ; GCT_SAMPLER1DSHADOW -> 4+ ; GCT_SAMPLER2DSHADOW -> 4+ ; GCT_FLOAT2 -> 4+ ; GCT_INT2 -> 4+ ; GCT_FLOAT3 -> 4+ ; GCT_INT3 -> 4+ ; GCT_FLOAT4 -> 4+ ; GCT_INT4 -> 4+ ; GCT_MATRIX_2X2 -> 8+ ; GCT_MATRIX_2X3 -> 8+ ; GCT_MATRIX_2X4 -> 8+ ; GCT_MATRIX_3X2 -> 12+ ; GCT_MATRIX_3X3 -> 12+ ; GCT_MATRIX_3X4 -> 12+ ; GCT_MATRIX_4X2 -> 16+ ; GCT_MATRIX_4X3 -> 16+ ; GCT_MATRIX_4X4 -> 16+ ; _ -> 4+ }+ ; False -> case ctype of+ {+ ; GCT_FLOAT1 -> 1+ ; GCT_INT1 -> 1+ ; GCT_SAMPLER1D -> 1+ ; GCT_SAMPLER2D -> 1+ ; GCT_SAMPLER3D -> 1+ ; GCT_SAMPLERCUBE -> 1+ ; GCT_SAMPLER1DSHADOW -> 1+ ; GCT_SAMPLER2DSHADOW -> 1+ ; GCT_FLOAT2 -> 2+ ; GCT_INT2 -> 2+ ; GCT_FLOAT3 -> 3+ ; GCT_INT3 -> 3+ ; GCT_FLOAT4 -> 4+ ; GCT_INT4 -> 4+ ; GCT_MATRIX_2X2 -> 4+ ; GCT_MATRIX_2X3 -> 6+ ; GCT_MATRIX_3X2 -> 6+ ; GCT_MATRIX_2X4 -> 8+ ; GCT_MATRIX_4X2 -> 8+ ; GCT_MATRIX_3X3 -> 9+ ; GCT_MATRIX_3X4 -> 12+ ; GCT_MATRIX_4X3 -> 12+ ; GCT_MATRIX_4X4 -> 16+ ; _ -> 4+ }+ }++-- | Struct collecting together the information for named constants.+data GpuNamedConstants+ = GpuNamedConstants+ { gncFloatBufferSize :: Int -- ^ Total size of the float buffer required+ , gncIntBufferSize :: Int -- ^ Total size of the int buffer required+ , gncMap :: Map String GpuConstantDefinition -- ^ Map of parameter names to GpuConstantDefinition+ {-| Indicates whether all array entries will be generated and added to the definitions map+ @remarks+ Normally, the number of array entries added to the definitions map is capped at 16+ to save memory. Setting this value to <code>true</code> allows all of the entries+ to be generated and added to the map.+ -}+ , gncGenerateAllConstantDefinitionArrayEntries :: Bool+ }+ deriving Eq++{-| Structure recording the use of a physical buffer by a logical parameter+index. Only used for low-level programs.+-}+data GpuLogicalIndexUse+ = GpuLogicalIndexUse+ { gliPhysicalIndex :: Int -- ^ Physical buffer index+ , gliCurrentSize :: Int -- ^ Current physical size allocation+ , gliVariability :: Word16 -- ^ How the contents of this slot vary+ }+ deriving Eq++-- | Container struct to allow params to safely & update shared list of logical buffer assignments+data GpuLogicalBufferStruct+ = GpuLogicalBufferStruct+ { gluMap :: Map Int GpuLogicalIndexUse -- ^ Map from logical index to physical buffer location+ , gluBufferSize :: Int -- ^ Shortcut to know the buffer size needs+ }+ deriving Eq++{-| A group of manually updated parameters that are shared between many parameter sets.+@remarks+ Sometimes you want to set some common parameters across many otherwise + different parameter sets, and keep them all in sync together. This class+ allows you to define a set of parameters that you can share across many+ parameter sets and have the parameters that match automatically be pulled+ from the shared set, rather than you having to set them on all the parameter+ sets individually.+@par+ Parameters in a shared set are matched up with instances in a GpuProgramParameters+ structure by matching names. It is up to you to define the named parameters+ that a shared set contains, and ensuring the definition matches.+@note+ Shared parameter sets can be named, and looked up using the GpuProgramManager.+-}+data GpuSharedParameters+ = GpuSharedParameters+ { gspNamedConstants :: GpuNamedConstants+ , gspFloatConstants :: [Float]+ , gspIntConstants :: [Int]+ , gspName :: String+ -- Optional data the rendersystem might want to store+ --mutable Any mRenderSystemData;++ , gspFrameLastUpdated :: Int -- ^ Not used when copying data, but might be useful to RS using shared buffers+ , gspVersion :: Int -- ^ Version number of the definitions in this buffer+ }+ deriving Eq++-- list of physical mappings that we are going to bring in+data CopyDataEntry+ = CopyDataEntry+ { cdeSrcDefinition :: GpuConstantDefinition+ , cdeDstDefinition :: GpuConstantDefinition+ }+ deriving Eq++{-| This class records the usage of a set of shared parameters in a concrete+ set of GpuProgramParameters.+-}+data GpuSharedParametersUsage+ = GpuSharedParametersUsage+ { spuSharedParams :: GpuSharedParameters+-- , spuParams :: GpuProgramParameters -- ^ Not a shared pointer since this is also parent+ , spuCopyDataList :: [CopyDataEntry]+ -- Optional data the rendersystem might want to store+-- mutable Any mRenderSystemData;+ , spuCopyDataVersion :: Int -- ^ Version of shared params we based the copydata on+ }+ deriving Eq+ +{-| Defines the types of automatically updated values that may be bound to GpuProgram+parameters, or used to modify parameters on a per-object basis.+-}+data AutoConstantType+ = ACT_WORLD_MATRIX -- ^ The current world matrix+ | ACT_INVERSE_WORLD_MATRIX -- ^ The current world matrix, inverted+ {-|Provides transpose of world matrix.+ Equivalent to RenderMonkey's "WorldTranspose".+ -}+ | ACT_TRANSPOSE_WORLD_MATRIX+ | ACT_INVERSE_TRANSPOSE_WORLD_MATRIX -- ^ The current world matrix, inverted & transposed+++ | ACT_WORLD_MATRIX_ARRAY_3x4 -- ^ The current array of world matrices, as a 3x4 matrix, used for blending+ | ACT_WORLD_MATRIX_ARRAY -- ^ The current array of world matrices, used for blending++ | ACT_VIEW_MATRIX -- ^ The current view matrix+ | ACT_INVERSE_VIEW_MATRIX -- ^ The current view matrix, inverted+ {-|Provides transpose of view matrix.+ Equivalent to RenderMonkey's "ViewTranspose".+ -}+ | ACT_TRANSPOSE_VIEW_MATRIX+ {-|Provides inverse transpose of view matrix.+ Equivalent to RenderMonkey's "ViewInverseTranspose".+ -}+ | ACT_INVERSE_TRANSPOSE_VIEW_MATRIX+++ | ACT_PROJECTION_MATRIX -- ^ The current projection matrix+ {-|Provides inverse of projection matrix.+ Equivalent to RenderMonkey's "ProjectionInverse".+ -}+ | ACT_INVERSE_PROJECTION_MATRIX+ {-|Provides transpose of projection matrix.+ Equivalent to RenderMonkey's "ProjectionTranspose".+ -}+ | ACT_TRANSPOSE_PROJECTION_MATRIX+ {-|Provides inverse transpose of projection matrix.+ Equivalent to RenderMonkey's "ProjectionInverseTranspose".+ -}+ | ACT_INVERSE_TRANSPOSE_PROJECTION_MATRIX+++ | ACT_VIEWPROJ_MATRIX -- ^ The current view & projection matrices concatenated+ {-|Provides inverse of concatenated view and projection matrices.+ Equivalent to RenderMonkey's "ViewProjectionInverse".+ -}+ | ACT_INVERSE_VIEWPROJ_MATRIX+ {-|Provides transpose of concatenated view and projection matrices.+ Equivalent to RenderMonkey's "ViewProjectionTranspose".+ -}+ | ACT_TRANSPOSE_VIEWPROJ_MATRIX+ {-|Provides inverse transpose of concatenated view and projection matrices.+ Equivalent to RenderMonkey's "ViewProjectionInverseTranspose".+ -}+ | ACT_INVERSE_TRANSPOSE_VIEWPROJ_MATRIX+++ | ACT_WORLDVIEW_MATRIX -- ^ The current world & view matrices concatenated+ | ACT_INVERSE_WORLDVIEW_MATRIX -- ^ The current world & view matrices concatenated, then inverted+ {-|Provides transpose of concatenated world and view matrices.+ Equivalent to RenderMonkey's "WorldViewTranspose".+ -}+ | ACT_TRANSPOSE_WORLDVIEW_MATRIX+ | ACT_INVERSE_TRANSPOSE_WORLDVIEW_MATRIX -- ^ The current world & view matrices concatenated, then inverted & transposed+ -- |view matrices.+++ | ACT_WORLDVIEWPROJ_MATRIX -- ^ The current world, view & projection matrices concatenated+ {-|Provides inverse of concatenated world, view and projection matrices.+ Equivalent to RenderMonkey's "WorldViewProjectionInverse".+ -}+ | ACT_INVERSE_WORLDVIEWPROJ_MATRIX+ {-|Provides transpose of concatenated world, view and projection matrices.+ Equivalent to RenderMonkey's "WorldViewProjectionTranspose".+ -}+ | ACT_TRANSPOSE_WORLDVIEWPROJ_MATRIX+ {-|Provides inverse transpose of concatenated world, view and projection+ matrices. Equivalent to RenderMonkey's "WorldViewProjectionInverseTranspose".+ -}+ | ACT_INVERSE_TRANSPOSE_WORLDVIEWPROJ_MATRIX+++ -- |render target related values+ {-|-1 if requires texture flipping, +1 otherwise. It's useful when you bypassed+ projection matrix transform, still able use this value to adjust transformed y position.+ -}+ | ACT_RENDER_TARGET_FLIPPING+++ | ACT_FOG_COLOUR -- ^ Fog colour+ | ACT_FOG_PARAMS -- ^ Fog params: density, linear start, linear end, 1/(end-start)+++ | ACT_SURFACE_AMBIENT_COLOUR -- ^ Surface ambient colour, as set in Pass::setAmbient+ | ACT_SURFACE_DIFFUSE_COLOUR -- ^ Surface diffuse colour, as set in Pass::setDiffuse+ | ACT_SURFACE_SPECULAR_COLOUR -- ^ Surface specular colour, as set in Pass::setSpecular+ | ACT_SURFACE_EMISSIVE_COLOUR -- ^ Surface emissive colour, as set in Pass::setSelfIllumination+ | ACT_SURFACE_SHININESS -- ^ Surface shininess, as set in Pass::setShininess+++ | ACT_LIGHT_COUNT -- ^ The number of active light sources (better than gl_MaxLights)+++ | ACT_AMBIENT_LIGHT_COLOUR -- ^ The ambient light colour set in the scene++ | ACT_LIGHT_DIFFUSE_COLOUR -- ^ Light diffuse colour (index determined by setAutoConstant call)+ | ACT_LIGHT_SPECULAR_COLOUR -- ^ Light specular colour (index determined by setAutoConstant call)+ | ACT_LIGHT_ATTENUATION -- ^ Light attenuation parameters, Vector4(range, constant, linear, quadric)+ {-|Spotlight parameters, Vector4(innerFactor, outerFactor, falloff, isSpot)+ innerFactor and outerFactor are cos(angle/2)+ The isSpot parameter is 0.0f for non-spotlights, 1.0f for spotlights.+ Also for non-spotlights the inner and outer factors are 1 and nearly 1 respectively+ -} + | ACT_SPOTLIGHT_PARAMS+ | ACT_LIGHT_POSITION -- ^ A light position in world space (index determined by setAutoConstant call)+ | ACT_LIGHT_POSITION_OBJECT_SPACE -- ^ A light position in object space (index determined by setAutoConstant call)+ | ACT_LIGHT_POSITION_VIEW_SPACE -- ^ A light position in view space (index determined by setAutoConstant call)+ | ACT_LIGHT_DIRECTION -- ^ A light direction in world space (index determined by setAutoConstant call)+ | ACT_LIGHT_DIRECTION_OBJECT_SPACE -- ^ A light direction in object space (index determined by setAutoConstant call)+ | ACT_LIGHT_DIRECTION_VIEW_SPACE -- ^ A light direction in view space (index determined by setAutoConstant call)+ {-|The distance of the light from the center of the object+ a useful approximation as an alternative to per-vertex distance+ calculations.+ -}+ | ACT_LIGHT_DISTANCE_OBJECT_SPACE+ {-|Light power level, a single scalar as set in Light::setPowerScale (index determined by setAutoConstant call) -}+ | ACT_LIGHT_POWER_SCALE+ -- |Light diffuse colour pre-scaled by Light::setPowerScale (index determined by setAutoConstant call)+ | ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED+ -- |Light specular colour pre-scaled by Light::setPowerScale (index determined by setAutoConstant call)+ | ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED+ -- |Array of light diffuse colours (count set by extra param)+ | ACT_LIGHT_DIFFUSE_COLOUR_ARRAY+ -- |Array of light specular colours (count set by extra param)+ | ACT_LIGHT_SPECULAR_COLOUR_ARRAY+ -- |Array of light diffuse colours scaled by light power (count set by extra param)+ | ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED_ARRAY+ -- |Array of light specular colours scaled by light power (count set by extra param)+ | ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED_ARRAY+ -- |Array of light attenuation parameters, Vector4(range, constant, linear, quadric) (count set by extra param)+ | ACT_LIGHT_ATTENUATION_ARRAY+ -- |Array of light positions in world space (count set by extra param)+ | ACT_LIGHT_POSITION_ARRAY+ -- |Array of light positions in object space (count set by extra param)+ | ACT_LIGHT_POSITION_OBJECT_SPACE_ARRAY+ -- |Array of light positions in view space (count set by extra param)+ | ACT_LIGHT_POSITION_VIEW_SPACE_ARRAY+ -- |Array of light directions in world space (count set by extra param)+ | ACT_LIGHT_DIRECTION_ARRAY+ -- |Array of light directions in object space (count set by extra param)+ | ACT_LIGHT_DIRECTION_OBJECT_SPACE_ARRAY+ -- |Array of light directions in view space (count set by extra param)+ | ACT_LIGHT_DIRECTION_VIEW_SPACE_ARRAY+ {-|Array of distances of the lights from the center of the object+ a useful approximation as an alternative to per-vertex distance+ calculations. (count set by extra param)+ -}+ | ACT_LIGHT_DISTANCE_OBJECT_SPACE_ARRAY+ {-|Array of light power levels, a single scalar as set in Light::setPowerScale + (count set by extra param)+ -}+ | ACT_LIGHT_POWER_SCALE_ARRAY+ {-|Spotlight parameters array of Vector4(innerFactor, outerFactor, falloff, isSpot)+ innerFactor and outerFactor are cos(angle/2)+ The isSpot parameter is 0.0f for non-spotlights, 1.0f for spotlights.+ Also for non-spotlights the inner and outer factors are 1 and nearly 1 respectively.+ (count set by extra param)+ -} + | ACT_SPOTLIGHT_PARAMS_ARRAY++ {-|The derived ambient light colour, with 'r', 'g', 'b' components filled with+ product of surface ambient colour and ambient light colour, respectively,+ and 'a' component filled with surface ambient alpha component.+ -}+ | ACT_DERIVED_AMBIENT_LIGHT_COLOUR+ {-|The derived scene colour, with 'r', 'g' and 'b' components filled with sum+ of derived ambient light colour and surface emissive colour, respectively,+ and 'a' component filled with surface diffuse alpha component.+ -}+ | ACT_DERIVED_SCENE_COLOUR++ {-|The derived light diffuse colour (index determined by setAutoConstant call),+ with 'r', 'g' and 'b' components filled with product of surface diffuse colour,+ light power scale and light diffuse colour, respectively, and 'a' component filled with surface+ diffuse alpha component.+ -}+ | ACT_DERIVED_LIGHT_DIFFUSE_COLOUR+ {-|The derived light specular colour (index determined by setAutoConstant call),+ with 'r', 'g' and 'b' components filled with product of surface specular colour+ and light specular colour, respectively, and 'a' component filled with surface+ specular alpha component.+ -}+ | ACT_DERIVED_LIGHT_SPECULAR_COLOUR++ -- |Array of derived light diffuse colours (count set by extra param)+ | ACT_DERIVED_LIGHT_DIFFUSE_COLOUR_ARRAY+ -- |Array of derived light specular colours (count set by extra param)+ | ACT_DERIVED_LIGHT_SPECULAR_COLOUR_ARRAY+ {-|The absolute light number of a local light index. Each pass may have+ a number of lights passed to it, and each of these lights will have+ an index in the overall light list, which will differ from the local+ light index due to factors like setStartLight and setIteratePerLight.+ This binding provides the global light index for a local index.+ -}+ | ACT_LIGHT_NUMBER+ -- |Returns (int) 1 if the given light casts shadows, 0 otherwise (index set in extra param)+ | ACT_LIGHT_CASTS_SHADOWS+++ {-|The distance a shadow volume should be extruded when using+ finite extrusion programs.+ -}+ | ACT_SHADOW_EXTRUSION_DISTANCE+ -- |The current camera's position in world space+ | ACT_CAMERA_POSITION+ -- |The current camera's position in object space + | ACT_CAMERA_POSITION_OBJECT_SPACE+ -- |The view/projection matrix of the assigned texture projection frustum+ | ACT_TEXTURE_VIEWPROJ_MATRIX+ -- |Array of view/projection matrices of the first n texture projection frustums+ | ACT_TEXTURE_VIEWPROJ_MATRIX_ARRAY+ {-|The view/projection matrix of the assigned texture projection frustum, + combined with the current world matrix+ -}+ | ACT_TEXTURE_WORLDVIEWPROJ_MATRIX+ -- |Array of world/view/projection matrices of the first n texture projection frustums+ | ACT_TEXTURE_WORLDVIEWPROJ_MATRIX_ARRAY+ -- |The view/projection matrix of a given spotlight+ | ACT_SPOTLIGHT_VIEWPROJ_MATRIX+ {-|The view/projection matrix of a given spotlight projection frustum, + combined with the current world matrix+ -}+ | ACT_SPOTLIGHT_WORLDVIEWPROJ_MATRIX+ -- |A custom parameter which will come from the renderable, using 'data' as the identifier+ | ACT_CUSTOM+ {-|provides current elapsed time+ -}+ | ACT_TIME+ {-|Single float value, which repeats itself based on given as+ parameter "cycle time". Equivalent to RenderMonkey's "Time0_X".+ -}+ | ACT_TIME_0_X+ -- |Cosine of "Time0_X". Equivalent to RenderMonkey's "CosTime0_X".+ | ACT_COSTIME_0_X+ -- |Sine of "Time0_X". Equivalent to RenderMonkey's "SinTime0_X".+ | ACT_SINTIME_0_X+ -- |Tangent of "Time0_X". Equivalent to RenderMonkey's "TanTime0_X".+ | ACT_TANTIME_0_X+ {-|Vector of "Time0_X", "SinTime0_X", "CosTime0_X", + "TanTime0_X". Equivalent to RenderMonkey's "Time0_X_Packed".+ -}+ | ACT_TIME_0_X_PACKED+ {-|Single float value, which represents scaled time value [0..1],+ which repeats itself based on given as parameter "cycle time".+ Equivalent to RenderMonkey's "Time0_1".+ -}+ | ACT_TIME_0_1+ -- |Cosine of "Time0_1". Equivalent to RenderMonkey's "CosTime0_1".+ | ACT_COSTIME_0_1+ -- |Sine of "Time0_1". Equivalent to RenderMonkey's "SinTime0_1".+ | ACT_SINTIME_0_1+ -- |Tangent of "Time0_1". Equivalent to RenderMonkey's "TanTime0_1".+ | ACT_TANTIME_0_1+ {-|Vector of "Time0_1", "SinTime0_1", "CosTime0_1",+ "TanTime0_1". Equivalent to RenderMonkey's "Time0_1_Packed".+ -}+ | ACT_TIME_0_1_PACKED+ {-|Single float value, which represents scaled time value [0..2*Pi],+ which repeats itself based on given as parameter "cycle time".+ Equivalent to RenderMonkey's "Time0_2PI".+ -}+ | ACT_TIME_0_2PI+ -- |Cosine of "Time0_2PI". Equivalent to RenderMonkey's "CosTime0_2PI".+ | ACT_COSTIME_0_2PI+ -- |Sine of "Time0_2PI". Equivalent to RenderMonkey's "SinTime0_2PI".+ | ACT_SINTIME_0_2PI+ -- |Tangent of "Time0_2PI". Equivalent to RenderMonkey's "TanTime0_2PI".+ | ACT_TANTIME_0_2PI+ {-|Vector of "Time0_2PI", "SinTime0_2PI", "CosTime0_2PI",+ "TanTime0_2PI". Equivalent to RenderMonkey's "Time0_2PI_Packed".+ -}+ | ACT_TIME_0_2PI_PACKED+ -- |provides the scaled frame time, returned as a floating point value.+ | ACT_FRAME_TIME+ -- |provides the calculated frames per second, returned as a floating point value.+ | ACT_FPS+ -- |viewport-related values+ {-|Current viewport width (in pixels) as floating point value.+ Equivalent to RenderMonkey's "ViewportWidth".+ -}+ | ACT_VIEWPORT_WIDTH+ {-|Current viewport height (in pixels) as floating point value.+ Equivalent to RenderMonkey's "ViewportHeight".+ -}+ | ACT_VIEWPORT_HEIGHT+ {-|This variable represents 1.0/ViewportWidth. + Equivalent to RenderMonkey's "ViewportWidthInverse".+ -}+ | ACT_INVERSE_VIEWPORT_WIDTH+ {-|This variable represents 1.0/ViewportHeight.+ Equivalent to RenderMonkey's "ViewportHeightInverse".+ -}+ | ACT_INVERSE_VIEWPORT_HEIGHT+ {-|Packed of "ViewportWidth", "ViewportHeight", "ViewportWidthInverse",+ "ViewportHeightInverse".+ -}+ | ACT_VIEWPORT_SIZE++ -- |view parameters+ {-|This variable provides the view direction vector (world space).+ Equivalent to RenderMonkey's "ViewDirection".+ -}+ | ACT_VIEW_DIRECTION+ {-|This variable provides the view side vector (world space).+ Equivalent to RenderMonkey's "ViewSideVector".+ -}+ | ACT_VIEW_SIDE_VECTOR+ {-|This variable provides the view up vector (world space).+ Equivalent to RenderMonkey's "ViewUpVector".+ -}+ | ACT_VIEW_UP_VECTOR+ {-|This variable provides the field of view as a floating point value.+ Equivalent to RenderMonkey's "FOV".+ -}+ | ACT_FOV+ {-|This variable provides the near clip distance as a floating point value.+ Equivalent to RenderMonkey's "NearClipPlane".+ -}+ | ACT_NEAR_CLIP_DISTANCE+ {-|This variable provides the far clip distance as a floating point value.+ Equivalent to RenderMonkey's "FarClipPlane".+ -}+ | ACT_FAR_CLIP_DISTANCE++ {-|provides the pass index number within the technique+ of the active materil.+ -}+ | ACT_PASS_NUMBER++ {-|provides the current iteration number of the pass. The iteration+ number is the number of times the current render operation has+ been drawn for the active pass.+ -}+ | ACT_PASS_ITERATION_NUMBER+++ {-|Provides a parametric animation value [0..1], only available+ where the renderable specifically implements it.+ -}+ | ACT_ANIMATION_PARAMETRIC++ {-|Provides the texel offsets required by this rendersystem to map+ texels to pixels. Packed as + float4(absoluteHorizontalOffset, absoluteVerticalOffset, + horizontalOffset / viewportWidth, verticalOffset / viewportHeight)+ -}+ | ACT_TEXEL_OFFSETS++ {-|Provides information about the depth range of the scene as viewed+ from the current camera. + Passed as float4(minDepth, maxDepth, depthRange, 1 / depthRange)+ -}+ | ACT_SCENE_DEPTH_RANGE++ {-|Provides information about the depth range of the scene as viewed+ from a given shadow camera. Requires an index parameter which maps+ to a light index relative to the current light list.+ Passed as float4(minDepth, maxDepth, depthRange, 1 / depthRange)+ -}+ | ACT_SHADOW_SCENE_DEPTH_RANGE++ {-|Provides the fixed shadow colour as configured via SceneManager::setShadowColour;+ useful for integrated modulative shadows.+ -}+ | ACT_SHADOW_COLOUR+ {-|Provides texture size of the texture unit (index determined by setAutoConstant+ call). Packed as float4(width, height, depth, 1)+ -}+ | ACT_TEXTURE_SIZE+ {-|Provides inverse texture size of the texture unit (index determined by setAutoConstant+ call). Packed as float4(1 / width, 1 / height, 1 / depth, 1)+ -}+ | ACT_INVERSE_TEXTURE_SIZE+ {-|Provides packed texture size of the texture unit (index determined by setAutoConstant+ call). Packed as float4(width, height, 1 / width, 1 / height)+ -}+ | ACT_PACKED_TEXTURE_SIZE++ {-|Provides the current transform matrix of the texture unit (index determined by setAutoConstant+ call), as seen by the fixed-function pipeline. + -}+ | ACT_TEXTURE_MATRIX++ {-|Provides the position of the LOD camera in world space, allowing you + to perform separate LOD calculations in shaders independent of the rendering+ camera. If there is no separate LOD camera then this is the real camera+ position. See Camera::setLodCamera.+ -}+ | ACT_LOD_CAMERA_POSITION+ {-|Provides the position of the LOD camera in object space, allowing you + to perform separate LOD calculations in shaders independent of the rendering+ camera. If there is no separate LOD camera then this is the real camera+ position. See Camera::setLodCamera.+ -}+ | ACT_LOD_CAMERA_POSITION_OBJECT_SPACE+ {-|Binds custom per-light constants to the shaders. -}+ | ACT_LIGHT_CUSTOM+ deriving Eq+++-- | Defines the type of the extra data item used by the auto constant.+data ACDataType+ = ACDT_NONE -- ^ no data is required+ | ACDT_INT -- ^ the auto constant requires data of type int+ | ACDT_REAL -- ^ the auto constant requires data of type real+ deriving Eq++-- | Defines the base element type of the auto constant+data ElementType+ = ET_INT+ | ET_REAL+ deriving Eq++{-| Structure defining an auto constant that's available for use in +a parameters object.+-}+data AutoConstantDefinition+ = AutoConstantDefinition+ { acdType :: AutoConstantType+ , acdName :: String+ , acdElementCount :: Int+ , acdElementType :: ElementType -- ^ The type of the constant in the program+ , acdDataType :: ACDataType -- ^ The type of any extra data+ }+ deriving Eq+ +{-| Structure recording the use of an automatic parameter. -}+data AutoConstantEntry+ = AutoConstantEntry+ { aceParamType :: AutoConstantType -- ^ The type of parameter+ , acePhysicalIndex :: Int -- ^ The target (physical) constant index+ {-| The number of elements per individual entry in this constant+ Used in case people used packed elements smaller than 4 (e.g. GLSL)+ and bind an auto which is 4-element packed to it -}+ , aceElementCount :: Int+ -- | Additional information to go with the parameter+-- union{+-- size_t data;+-- Real fData;+-- };+ , aceVariability :: GpuParamVariability -- ^ The variability of this parameter (see GpuParamVariability)+ }+ deriving Eq+ +{-| Collects together the program parameters used for a GpuProgram.+@remarks+Gpu program state includes constant parameters used by the program, and+bindings to render system state which is propagated into the constants +by the engine automatically if requested.+@par+GpuProgramParameters objects should be created through the GpuProgram and+may be shared between multiple Pass instances. For this reason they+are managed using a shared pointer, which will ensure they are automatically+deleted when no Pass is using them anymore. +@par+High-level programs use named parameters (uniforms), low-level programs +use indexed constants. This class supports both, but you can tell whether +named constants are supported by calling hasNamedParameters(). There are+references in the documentation below to 'logical' and 'physical' indexes;+logical indexes are the indexes used by low-level programs and represent +indexes into an array of float4's, some of which may be settable, some of+which may be predefined constants in the program. We only store those+constants which have actually been set, therefore our buffer could have +gaps if we used the logical indexes in our own buffers. So instead we map+these logical indexes to physical indexes in our buffer. When using +high-level programs, logical indexes don't necessarily exist, although they+might if the high-level program has a direct, exposed mapping from parameter+names to logical indexes. In addition, high-level languages may or may not pack+arrays of elements that are smaller than float4 (e.g. float2/vec2) contiguously.+This kind of information is held in the ConstantDefinition structure which +is only populated for high-level programs. You don't have to worry about+any of this unless you intend to read parameters back from this structure+rather than just setting them.+-}+--data GpuProgramParameters'+-- = GpuProgramParameters' +-- { +---- static AutoConstantDefinition AutoConstantDictionary[];+-- gppFloatConstants :: [Float] -- ^ Packed list of floating-point constants (physical indexing)+-- , gppIntConstants :: [Int] -- ^ Packed list of integer constants (physical indexing)+-- {-| Logical index to physical index map - for low-level programs+-- or high-level programs which pass params this way. -}+-- , gppFloatLogicalToPhysical :: GpuLogicalBufferStruct+-- {-| Logical index to physical index map - for low-level programs+-- or high-level programs which pass params this way. -}+-- , gppIntLogicalToPhysical :: GpuLogicalBufferStruct+-- , gppNamedConstants :: GpuNamedConstants -- ^ Mapping from parameter names to def - high-level programs are expected to populate this+-- , gppAutoConstants :: [AutoConstantEntry] -- ^ List of automatically updated parameters+-- , gppCombinedVariability :: GpuParamVariability -- ^ The combined variability masks of all parameters+-- , gppTransposeMatrices :: Bool -- ^ Do we need to transpose matrices?+-- , gppIgnoreMissingParams :: Bool -- ^ flag to indicate if names not found will be ignored+-- , gppActivePassIterationIndex :: Int -- ^ physical index for active pass iteration parameter real constant entry;+-- , gppSharedParamSets :: [GpuSharedParametersUsage]+---- -- Optional data the rendersystem might want to store+---- mutable Any mRenderSystemData;+-- }+-- deriving Eq++-- TEMP CODE+data GpuProgramParameters+ = GpuProgramParameters+ { gppNamedConstants :: [GpuNamedConstant]+ }++data GpuNamedConstant+ = GpuNamedConstant+ { gncName :: String+ , gncType :: ElementType+ , gncIntValues :: [Int]+ , gncFloatValues :: [FloatType]+ }++autoConstantDictionary = + [ (ACT_WORLD_MATRIX, "world_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_INVERSE_WORLD_MATRIX, "inverse_world_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_TRANSPOSE_WORLD_MATRIX, "transpose_world_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_INVERSE_TRANSPOSE_WORLD_MATRIX, "inverse_transpose_world_matrix", 16, ET_REAL, ACDT_NONE)++ , (ACT_WORLD_MATRIX_ARRAY_3x4, "world_matrix_array_3x4", 12, ET_REAL, ACDT_NONE)+ , (ACT_WORLD_MATRIX_ARRAY, "world_matrix_array", 16, ET_REAL, ACDT_NONE)++ , (ACT_VIEW_MATRIX, "view_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_INVERSE_VIEW_MATRIX, "inverse_view_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_TRANSPOSE_VIEW_MATRIX, "transpose_view_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_INVERSE_TRANSPOSE_VIEW_MATRIX, "inverse_transpose_view_matrix", 16, ET_REAL, ACDT_NONE)++ , (ACT_PROJECTION_MATRIX, "projection_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_INVERSE_PROJECTION_MATRIX, "inverse_projection_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_TRANSPOSE_PROJECTION_MATRIX, "transpose_projection_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_INVERSE_TRANSPOSE_PROJECTION_MATRIX, "inverse_transpose_projection_matrix", 16, ET_REAL, ACDT_NONE)++ , (ACT_VIEWPROJ_MATRIX, "viewproj_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_INVERSE_VIEWPROJ_MATRIX, "inverse_viewproj_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_TRANSPOSE_VIEWPROJ_MATRIX, "transpose_viewproj_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_INVERSE_TRANSPOSE_VIEWPROJ_MATRIX, "inverse_transpose_viewproj_matrix", 16, ET_REAL, ACDT_NONE)++ , (ACT_WORLDVIEW_MATRIX, "worldview_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_INVERSE_WORLDVIEW_MATRIX, "inverse_worldview_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_TRANSPOSE_WORLDVIEW_MATRIX, "transpose_worldview_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_INVERSE_TRANSPOSE_WORLDVIEW_MATRIX, "inverse_transpose_worldview_matrix", 16, ET_REAL, ACDT_NONE)++ , (ACT_WORLDVIEWPROJ_MATRIX, "worldviewproj_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_INVERSE_WORLDVIEWPROJ_MATRIX, "inverse_worldviewproj_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_TRANSPOSE_WORLDVIEWPROJ_MATRIX, "transpose_worldviewproj_matrix", 16, ET_REAL, ACDT_NONE)+ , (ACT_INVERSE_TRANSPOSE_WORLDVIEWPROJ_MATRIX, "inverse_transpose_worldviewproj_matrix", 16, ET_REAL, ACDT_NONE)++ , (ACT_RENDER_TARGET_FLIPPING, "render_target_flipping", 1, ET_REAL, ACDT_NONE)++ , (ACT_FOG_COLOUR, "fog_colour", 4, ET_REAL, ACDT_NONE)+ , (ACT_FOG_PARAMS, "fog_params", 4, ET_REAL, ACDT_NONE)++ , (ACT_SURFACE_AMBIENT_COLOUR, "surface_ambient_colour", 4, ET_REAL, ACDT_NONE)+ , (ACT_SURFACE_DIFFUSE_COLOUR, "surface_diffuse_colour", 4, ET_REAL, ACDT_NONE)+ , (ACT_SURFACE_SPECULAR_COLOUR, "surface_specular_colour", 4, ET_REAL, ACDT_NONE)+ , (ACT_SURFACE_EMISSIVE_COLOUR, "surface_emissive_colour", 4, ET_REAL, ACDT_NONE)+ , (ACT_SURFACE_SHININESS, "surface_shininess", 1, ET_REAL, ACDT_NONE)++ , (ACT_LIGHT_COUNT, "light_count", 1, ET_REAL, ACDT_NONE)++ , (ACT_AMBIENT_LIGHT_COLOUR, "ambient_light_colour", 4, ET_REAL, ACDT_NONE)+ , (ACT_LIGHT_DIFFUSE_COLOUR, "light_diffuse_colour", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_SPECULAR_COLOUR, "light_specular_colour", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_ATTENUATION, "light_attenuation", 4, ET_REAL, ACDT_INT)+ , (ACT_SPOTLIGHT_PARAMS, "spotlight_params", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_POSITION, "light_position", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_POSITION_OBJECT_SPACE, "light_position_object_space", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_POSITION_VIEW_SPACE, "light_position_view_space", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_DIRECTION, "light_direction", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_DIRECTION_OBJECT_SPACE, "light_direction_object_space", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_DIRECTION_VIEW_SPACE, "light_direction_view_space", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_DISTANCE_OBJECT_SPACE, "light_distance_object_space", 1, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_POWER_SCALE, "light_power", 1, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED, "light_diffuse_colour_power_scaled", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED, "light_specular_colour_power_scaled", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_DIFFUSE_COLOUR_ARRAY, "light_diffuse_colour_array", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_SPECULAR_COLOUR_ARRAY, "light_specular_colour_array", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED_ARRAY, "light_diffuse_colour_power_scaled_array", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED_ARRAY, "light_specular_colour_power_scaled_array", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_ATTENUATION_ARRAY, "light_attenuation_array", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_POSITION_ARRAY, "light_position_array", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_POSITION_OBJECT_SPACE_ARRAY, "light_position_object_space_array", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_POSITION_VIEW_SPACE_ARRAY, "light_position_view_space_array", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_DIRECTION_ARRAY, "light_direction_array", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_DIRECTION_OBJECT_SPACE_ARRAY, "light_direction_object_space_array", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_DIRECTION_VIEW_SPACE_ARRAY, "light_direction_view_space_array", 4, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_DISTANCE_OBJECT_SPACE_ARRAY, "light_distance_object_space_array", 1, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_POWER_SCALE_ARRAY, "light_power_array", 1, ET_REAL, ACDT_INT)+ , (ACT_SPOTLIGHT_PARAMS_ARRAY, "spotlight_params_array", 4, ET_REAL, ACDT_INT)++ , (ACT_DERIVED_AMBIENT_LIGHT_COLOUR, "derived_ambient_light_colour", 4, ET_REAL, ACDT_NONE)+ , (ACT_DERIVED_SCENE_COLOUR, "derived_scene_colour", 4, ET_REAL, ACDT_NONE)+ , (ACT_DERIVED_LIGHT_DIFFUSE_COLOUR, "derived_light_diffuse_colour", 4, ET_REAL, ACDT_INT)+ , (ACT_DERIVED_LIGHT_SPECULAR_COLOUR, "derived_light_specular_colour", 4, ET_REAL, ACDT_INT)+ , (ACT_DERIVED_LIGHT_DIFFUSE_COLOUR_ARRAY, "derived_light_diffuse_colour_array", 4, ET_REAL, ACDT_INT)+ , (ACT_DERIVED_LIGHT_SPECULAR_COLOUR_ARRAY, "derived_light_specular_colour_array", 4, ET_REAL, ACDT_INT)++ , (ACT_LIGHT_NUMBER, "light_number", 1, ET_REAL, ACDT_INT)+ , (ACT_LIGHT_CASTS_SHADOWS, "light_casts_shadows", 1, ET_REAL, ACDT_INT)++ , (ACT_SHADOW_EXTRUSION_DISTANCE, "shadow_extrusion_distance", 1, ET_REAL, ACDT_INT)+ , (ACT_CAMERA_POSITION, "camera_position", 3, ET_REAL, ACDT_NONE)+ , (ACT_CAMERA_POSITION_OBJECT_SPACE, "camera_position_object_space", 3, ET_REAL, ACDT_NONE)+ , (ACT_TEXTURE_VIEWPROJ_MATRIX, "texture_viewproj_matrix", 16, ET_REAL, ACDT_INT)+ , (ACT_TEXTURE_VIEWPROJ_MATRIX_ARRAY, "texture_viewproj_matrix_array", 16, ET_REAL, ACDT_INT)+ , (ACT_TEXTURE_WORLDVIEWPROJ_MATRIX, "texture_worldviewproj_matrix", 16, ET_REAL, ACDT_INT)+ , (ACT_TEXTURE_WORLDVIEWPROJ_MATRIX_ARRAY, "texture_worldviewproj_matrix_array", 16, ET_REAL, ACDT_INT)+ , (ACT_SPOTLIGHT_VIEWPROJ_MATRIX, "spotlight_viewproj_matrix", 16, ET_REAL, ACDT_INT)+ , (ACT_SPOTLIGHT_WORLDVIEWPROJ_MATRIX, "spotlight_worldviewproj_matrix", 16, ET_REAL, ACDT_INT)+ , (ACT_CUSTOM, "custom", 4, ET_REAL, ACDT_INT) -- *** needs to be tested+ , (ACT_TIME, "time", 1, ET_REAL, ACDT_REAL)+ , (ACT_TIME_0_X, "time_0_x", 4, ET_REAL, ACDT_REAL)+ , (ACT_COSTIME_0_X, "costime_0_x", 4, ET_REAL, ACDT_REAL)+ , (ACT_SINTIME_0_X, "sintime_0_x", 4, ET_REAL, ACDT_REAL)+ , (ACT_TANTIME_0_X, "tantime_0_x", 4, ET_REAL, ACDT_REAL)+ , (ACT_TIME_0_X_PACKED, "time_0_x_packed", 4, ET_REAL, ACDT_REAL)+ , (ACT_TIME_0_1, "time_0_1", 4, ET_REAL, ACDT_REAL)+ , (ACT_COSTIME_0_1, "costime_0_1", 4, ET_REAL, ACDT_REAL)+ , (ACT_SINTIME_0_1, "sintime_0_1", 4, ET_REAL, ACDT_REAL)+ , (ACT_TANTIME_0_1, "tantime_0_1", 4, ET_REAL, ACDT_REAL)+ , (ACT_TIME_0_1_PACKED, "time_0_1_packed", 4, ET_REAL, ACDT_REAL)+ , (ACT_TIME_0_2PI, "time_0_2pi", 4, ET_REAL, ACDT_REAL)+ , (ACT_COSTIME_0_2PI, "costime_0_2pi", 4, ET_REAL, ACDT_REAL)+ , (ACT_SINTIME_0_2PI, "sintime_0_2pi", 4, ET_REAL, ACDT_REAL)+ , (ACT_TANTIME_0_2PI, "tantime_0_2pi", 4, ET_REAL, ACDT_REAL)+ , (ACT_TIME_0_2PI_PACKED, "time_0_2pi_packed", 4, ET_REAL, ACDT_REAL)+ , (ACT_FRAME_TIME, "frame_time", 1, ET_REAL, ACDT_REAL)+ , (ACT_FPS, "fps", 1, ET_REAL, ACDT_NONE)+ , (ACT_VIEWPORT_WIDTH, "viewport_width", 1, ET_REAL, ACDT_NONE)+ , (ACT_VIEWPORT_HEIGHT, "viewport_height", 1, ET_REAL, ACDT_NONE)+ , (ACT_INVERSE_VIEWPORT_WIDTH, "inverse_viewport_width", 1, ET_REAL, ACDT_NONE)+ , (ACT_INVERSE_VIEWPORT_HEIGHT, "inverse_viewport_height", 1, ET_REAL, ACDT_NONE)+ , (ACT_VIEWPORT_SIZE, "viewport_size", 4, ET_REAL, ACDT_NONE)+ , (ACT_VIEW_DIRECTION, "view_direction", 3, ET_REAL, ACDT_NONE)+ , (ACT_VIEW_SIDE_VECTOR, "view_side_vector", 3, ET_REAL, ACDT_NONE)+ , (ACT_VIEW_UP_VECTOR, "view_up_vector", 3, ET_REAL, ACDT_NONE)+ , (ACT_FOV, "fov", 1, ET_REAL, ACDT_NONE)+ , (ACT_NEAR_CLIP_DISTANCE, "near_clip_distance", 1, ET_REAL, ACDT_NONE)+ , (ACT_FAR_CLIP_DISTANCE, "far_clip_distance", 1, ET_REAL, ACDT_NONE)+ , (ACT_PASS_NUMBER, "pass_number", 1, ET_REAL, ACDT_NONE)+ , (ACT_PASS_ITERATION_NUMBER, "pass_iteration_number", 1, ET_REAL, ACDT_NONE)+ , (ACT_ANIMATION_PARAMETRIC, "animation_parametric", 4, ET_REAL, ACDT_INT)+ , (ACT_TEXEL_OFFSETS, "texel_offsets", 4, ET_REAL, ACDT_NONE)+ , (ACT_SCENE_DEPTH_RANGE, "scene_depth_range", 4, ET_REAL, ACDT_NONE)+ , (ACT_SHADOW_SCENE_DEPTH_RANGE, "shadow_scene_depth_range", 4, ET_REAL, ACDT_INT)+ , (ACT_SHADOW_COLOUR, "shadow_colour", 4, ET_REAL, ACDT_NONE)+ , (ACT_TEXTURE_SIZE, "texture_size", 4, ET_REAL, ACDT_INT)+ , (ACT_INVERSE_TEXTURE_SIZE, "inverse_texture_size", 4, ET_REAL, ACDT_INT)+ , (ACT_PACKED_TEXTURE_SIZE, "packed_texture_size", 4, ET_REAL, ACDT_INT)+ , (ACT_TEXTURE_MATRIX, "texture_matrix", 16, ET_REAL, ACDT_INT)+ , (ACT_LOD_CAMERA_POSITION, "lod_camera_position", 3, ET_REAL, ACDT_NONE)+ , (ACT_LOD_CAMERA_POSITION_OBJECT_SPACE, "lod_camera_position_object_space", 3, ET_REAL, ACDT_NONE)+ , (ACT_LIGHT_CUSTOM, "light_custom", 4, ET_REAL, ACDT_INT)+ ]
+ Graphics/LambdaCube/GpuProgramUsage.hs view
@@ -0,0 +1,47 @@+module Graphics.LambdaCube.GpuProgramUsage where++import Graphics.LambdaCube.GpuProgram+--import Graphics.LambdaCube.GpuProgramParams++{-| This class makes the usage of a vertex and fragment programs (low-level or high-level), + with a given set of parameters, explicit.+@remarks+ Using a vertex or fragment program can get fairly complex; besides the fairly rudimentary+ process of binding a program to the GPU for rendering, managing usage has few+ complications, such as:+ <ul>+ <li>Programs can be high level (e.g. Cg, RenderMonkey) or low level (assembler). Using+ either should be relatively seamless, although high-level programs give you the advantage+ of being able to use named parameters, instead of just indexed registers</li>+ <li>Programs and parameters can be shared between multiple usages, in order to save+ memory</li>+ <li>When you define a user of a program, such as a material, you often want to be able to+ set up the definition but not load / compile / assemble the program at that stage, because+ it is not needed just yet. The program should be loaded when it is first needed, or+ earlier if specifically requested. The program may not be defined at this time, you+ may want to have scripts that can set up the definitions independent of the order in which+ those scripts are loaded.</li>+ </ul>+ This class packages up those details so you don't have to worry about them. For example,+ this class lets you define a high-level program and set up the parameters for it, without+ having loaded the program (which you normally could not do). When the program is loaded and+ compiled, this class will then validate the parameters you supplied earlier and turn them+ into runtime parameters.+@par+ Just incase it wasn't clear from the above, this class provides linkage to both + GpuProgram and HighLevelGpuProgram, despite its name.+-}+data GpuProgramUsage+ = GpuProgramUsage+ { --gpuType :: GpuProgramType+-- , gpuParent :: Pass+ + gpuProgramName :: String+-- , gpuProgram :: Maybe p -- ^ The program link+-- , gpuProgram :: Either String (GpuProgramDescriptor p) -- ^ The program link+-- , gpuParameters :: GpuProgramParameters -- ^ program parameters++-- , gpuRecreateParams :: Bool -- ^ Whether to recreate parameters next load+ }+ deriving Eq+
+ Graphics/LambdaCube/HardwareBuffer.hs view
@@ -0,0 +1,93 @@+module Graphics.LambdaCube.HardwareBuffer where++import Data.Word+import Foreign.Ptr++-- | Enums describing buffer usage; not mutually exclusive+data Usage + {-| Static buffer which the application rarely modifies once created. Modifying + the contents of this buffer will involve a performance hit.+ -}+ = HBU_STATIC+ {-| Indicates the application would like to modify this buffer with the CPU+ fairly often. + Buffers created with this flag will typically end up in AGP memory rather + than video memory.+ -}+ | HBU_DYNAMIC+ {-| Indicates the application will never read the contents of the buffer back, + it will only ever write data. Locking a buffer with this flag will ALWAYS + return a pointer to new, blank memory rather than the memory associated + with the contents of the buffer; this avoids DMA stalls because you can + write to a new memory area while the previous one is being used. + -}+ | HBU_WRITE_ONLY+ {-| Indicates that the application will be refilling the contents+ of the buffer regularly (not just updating, but generating the+ contents from scratch), and therefore does not mind if the contents + of the buffer are lost somehow and need to be recreated. This+ allows and additional level of optimisation on the buffer.+ This option only really makes sense when combined with + HBU_DYNAMIC_WRITE_ONLY.+ -}+ | HBU_DISCARDABLE+ -- | Combination of HBU_STATIC and HBU_WRITE_ONLY+ | HBU_STATIC_WRITE_ONLY+ {-| Combination of HBU_DYNAMIC and HBU_WRITE_ONLY. If you use + this, strongly consider using HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE+ instead if you update the entire contents of the buffer very + regularly. + -}+ | HBU_DYNAMIC_WRITE_ONLY+ -- | Combination of HBU_DYNAMIC, HBU_WRITE_ONLY and HBU_DISCARDABLE+ | HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE+ deriving Eq++-- | Locking options+data LockOptions+ {-| Normal mode, ie allows read/write and contents are preserved. -}+ = HBL_NORMAL+ {-| Discards the <em>entire</em> buffer while locking; this allows optimisation to be + performed because synchronisation issues are relaxed. Only allowed on buffers + created with the HBU_DYNAMIC flag. + -}+ | HBL_DISCARD+ {-| Lock the buffer for reading only. Not allowed in buffers which are created with HBU_WRITE_ONLY. + Mandatory on static buffers, i.e. those created without the HBU_DYNAMIC flag. + -} + | HBL_READ_ONLY+ {-| As HBL_NORMAL, except the application guarantees not to overwrite any + region of the buffer which has already been used in this frame, can allow+ some optimisation on some APIs. -}+ | HBL_NO_OVERWRITE+ deriving Eq+++class Eq a => HardwareBuffer a where+ {-| Lock the buffer for (potentially) reading / writing.+ @param offset The byte offset from the start of the buffer to lock+ @param length The size of the area to lock, in bytes+ @param options Locking options+ @returns Pointer to the locked memory+ -}+ lock :: a -> Int -> Int -> LockOptions -> IO (Ptr Word8) -- virtual void* lock(size_t offset, size_t length, LockOptions options)++ {-| Releases the lock on this buffer. + @remarks + Locking and unlocking a buffer can, in some rare circumstances such as + switching video modes whilst the buffer is locked, corrupt the + contents of a buffer. This is pretty rare, but if it occurs, + this method will throw an exception, meaning you+ must re-upload the data.+ @par+ Note that using the 'read' and 'write' forms of updating the buffer does not+ suffer from this problem, so if you want to be 100% sure your+ data will not be lost, use the 'read' and 'write' forms instead.+ -}+ unlock :: a -> IO () -- virtual void unlock(void)++ getSizeInBytes :: a -> Int -- ^ Returns the size of this buffer in bytes+ getUsage :: a -> Usage -- ^ Returns the Usage flags with which this buffer was created+ isSystemMemory :: a -> Bool -- ^ Returns whether this buffer is held in system memory+ hasShadowBuffer :: a -> Bool -- ^ Returns whether this buffer has a system memory shadow for quicker reading+ isLocked :: a -> IO Bool -- ^ Returns whether or not this buffer is currently locked.
+ Graphics/LambdaCube/HardwareIndexBuffer.hs view
@@ -0,0 +1,20 @@+module Graphics.LambdaCube.HardwareIndexBuffer where++import Data.Word+import Data.IORef+import Foreign.Ptr+import Foreign.Marshal.Alloc+import Foreign.Marshal.Utils+import Control.Monad++import Graphics.LambdaCube.HardwareBuffer++data IndexType+ = IT_16BIT+ | IT_32BIT+ deriving (Eq,Show)++class (HardwareBuffer a) => HardwareIndexBuffer a where+ getIndexType :: a -> IndexType -- ^ Get the type of indexes used in this buffer+ getNumIndexes :: a -> Int -- ^ Get the number of indexes in this buffer+ getIndexSize :: a -> Int -- ^ Get the size in bytes of each index
+ Graphics/LambdaCube/HardwareOcclusionQuery.hs view
@@ -0,0 +1,41 @@+module Graphics.LambdaCube.HardwareOcclusionQuery where++-- | This is a abstract class that that provides the interface for the query class for hardware occlusion.+class HardwareOcclusionQuery a where+ {-| Starts the hardware occlusion query+ @Remarks Simple usage: Create one or more OcclusionQuery object one per outstanding query or one per tested object + OcclusionQuery* m_pOcclusionQuery;+ createOcclusionQuery( &m_pOcclusionQuery );+ In the rendering loop:+ Draw all occluders+ m_pOcclusionQuery->startOcclusionQuery();+ Draw the polygons to be tested+ m_pOcclusionQuery->endOcclusionQuery();+ + Results must be pulled using:+ UINT m_uintNumberOfPixelsVisable;+ pullOcclusionQuery( &m_dwNumberOfPixelsVisable );+ -}+ beginOcclusionQuery :: a -> IO ()+ endOcclusionQuery :: a -> IO () -- ^ Ends the hardware occlusion test++ {-| Pulls the hardware occlusion query.+ @note Waits until the query result is available; use isStillOutstanding+ if just want to test if the result is available.+ @retval NumOfFragments will get the resulting number of fragments.+ @return True if success or false if not.+ -}+ pullOcclusionQuery :: a -> IO Int++ {-| Let's you get the last pixel count with out doing the hardware occlusion test+ @return The last fragment count from the last test.+ Remarks This function won't give you new values, just the old value.+ -}+-- getLastQuerysPixelcount :: a -> IO Int++ {-| Lets you know when query is done, or still be processed by the Hardware+ @return true if query isn't finished.+ -}+ isStillOutstanding :: a -> IO Bool++
+ Graphics/LambdaCube/HardwareVertexBuffer.hs view
@@ -0,0 +1,187 @@+module Graphics.LambdaCube.HardwareVertexBuffer where++import Data.Word+import Data.IntMap+import Foreign.Marshal.Alloc+import Foreign.Marshal.Utils+import Foreign.Storable+import Foreign.C.Types+import Foreign.Ptr+import Data.IORef+import Control.Monad++import Graphics.LambdaCube.HardwareBuffer++class (HardwareBuffer a) => HardwareVertexBuffer a where+ getVertexSize :: a -> Int -- ^ Gets the size in bytes of a single vertex in this buffer+ getNumVertices :: a -> Int -- ^ Get the number of vertices in this buffer++-- | Vertex element semantics, used to identify the meaning of vertex buffer contents+data VertexElementSemantic+ = VES_POSITION -- ^ Position, 3 reals per vertex+ | VES_BLEND_WEIGHTS -- ^ Blending weights+ | VES_BLEND_INDICES -- ^ Blending indices+ | VES_NORMAL -- ^ Normal, 3 reals per vertex+ | VES_DIFFUSE -- ^ Diffuse colours+ | VES_SPECULAR -- ^ Specular colours+ | VES_TEXTURE_COORDINATES -- ^ Texture coordinates+ | VES_BINORMAL -- ^ Binormal (Y axis if normal is Z)+ | VES_TANGENT -- ^ Tangent (X axis if normal is Z)+ deriving (Enum,Eq,Ord,Show)+++-- | Vertex element type, used to identify the base types of the vertex contents+data VertexElementType+ = VET_FLOAT1+ | VET_FLOAT2+ | VET_FLOAT3+ | VET_FLOAT4+-- -- | alias to more specific colour type - use the current rendersystem's colour packing+-- | VET_COLOUR -- Deprecated by Ogre+ | VET_SHORT1+ | VET_SHORT2+ | VET_SHORT3+ | VET_SHORT4+ | VET_UBYTE4+ -- | D3D style compact colour+ | VET_COLOUR_ARGB+ -- | GL style compact colour+ | VET_COLOUR_ABGR+ deriving (Eq,Ord,Show)++{-| This class declares the usage of a single vertex buffer as a component+ of a complete VertexDeclaration.+ @remarks+ Several vertex buffers can be used to supply the input geometry for a+ rendering operation, and in each case a vertex buffer can be used in+ different ways for different operations; the buffer itself does not+ define the semantics (position, normal etc), the VertexElement+ class does.+-}+data VertexElement+ = VertexElement+ { veSource :: Int -- ^ The source vertex buffer, as bound to an index using VertexBufferBinding+ , veOffset :: Int -- ^ The offset in the buffer that this element starts at+ , veType :: VertexElementType -- ^ The type of element+ , veSemantic :: VertexElementSemantic -- ^ The meaning of the element+ , veIndex :: Int -- ^ Index of the item, only applicable for some elements like texture coords+ }+ deriving (Eq,Ord,Show)++-- | Utility method for helping to calculate offsets+getTypeSize :: VertexElementType -> Int+getTypeSize etype = case etype of+ { VET_COLOUR_ABGR -> sizeOf (undefined::Word32) -- sizeof(RGBA);+ ; VET_COLOUR_ARGB -> sizeOf (undefined::Word32) -- sizeof(RGBA);+ ; VET_FLOAT1 -> sizeOf (undefined::CFloat) -- sizeof(float);+ ; VET_FLOAT2 -> 2 * sizeOf (undefined::CFloat) -- sizeof(float)*2;+ ; VET_FLOAT3 -> 3 * sizeOf (undefined::CFloat) -- sizeof(float)*3;+ ; VET_FLOAT4 -> 4 * sizeOf (undefined::CFloat) -- sizeof(float)*4;+ ; VET_SHORT1 -> sizeOf (undefined::CShort) -- sizeof(short);+ ; VET_SHORT2 -> 2 * sizeOf (undefined::CShort) -- sizeof(short)*2;+ ; VET_SHORT3 -> 3 * sizeOf (undefined::CShort) -- sizeof(short)*3;+ ; VET_SHORT4 -> 4 * sizeOf (undefined::CShort) -- sizeof(short)*4;+ ; VET_UBYTE4 -> 4 * sizeOf (undefined::CUChar) -- sizeof(unsigned char)*4;+ }++-- | Utility method which returns the count of values in a given type+getTypeCount :: VertexElementType -> Int+getTypeCount etype = case etype of+ { VET_COLOUR_ABGR -> 1+ ; VET_COLOUR_ARGB -> 1+ ; VET_FLOAT1 -> 1+ ; VET_FLOAT2 -> 2+ ; VET_FLOAT3 -> 3+ ; VET_FLOAT4 -> 4+ ; VET_SHORT1 -> 1+ ; VET_SHORT2 -> 2+ ; VET_SHORT3 -> 3+ ; VET_SHORT4 -> 4+ ; VET_UBYTE4 -> 4+ }+ +{-| Simple converter function which will turn a single-value type into a+ multi-value type based on a parameter.+-}+multiplyTypeCount :: VertexElementType -> Int -> VertexElementType+multiplyTypeCount baseType count = case baseType of+ { VET_FLOAT1 -> case count of+ { 1 -> VET_FLOAT1+ ; 2 -> VET_FLOAT2+ ; 3 -> VET_FLOAT3+ ; 4 -> VET_FLOAT4+ ; _ -> error "Invalid type"+ }+ ; VET_SHORT1 -> case count of+ { 1 -> VET_SHORT1+ ; 2 -> VET_SHORT2+ ; 3 -> VET_SHORT3+ ; 4 -> VET_SHORT4+ ; _ -> error "Invalid type"+ }+ ; _ -> error "Invalid type"+ }++{-| Simple converter function which will a type into it's single-value+ equivalent - makes switches on type easier.+-}+getBaseType :: VertexElementType -> VertexElementType+getBaseType multiType = case multiType of+ { VET_FLOAT1 -> VET_FLOAT1+ ; VET_FLOAT2 -> VET_FLOAT2+ ; VET_FLOAT3 -> VET_FLOAT3+ ; VET_FLOAT4 -> VET_FLOAT4+ ; VET_COLOUR_ABGR -> VET_COLOUR_ABGR+ ; VET_COLOUR_ARGB -> VET_COLOUR_ARGB+ ; VET_SHORT1 -> VET_SHORT1+ ; VET_SHORT2 -> VET_SHORT2+ ; VET_SHORT3 -> VET_SHORT3+ ; VET_SHORT4 -> VET_SHORT4+ ; VET_UBYTE4 -> VET_UBYTE4+ }++{-| Utility method for converting colour from+ one packed 32-bit colour type to another.+@param srcType The source type+@param dstType The destination type+@param ptr Read / write value to change+-}+--static void convertColourValue(VertexElementType srcType,+-- VertexElementType dstType, uint32* ptr);++{-| Utility method for converting colour to+ a packed 32-bit colour type.+@param src source colour+@param dst The destination type+-}+--static uint32 convertColourValue(const ColourValue& src,+-- VertexElementType dst);++{-| Utility method to get the most appropriate packed colour vertex element format. -}+--static VertexElementType getBestColourVertexElementType(void);++data VertexDeclaration+ = VertexDeclaration+ { vdElementList :: [VertexElement] -- ^ Defines the list of vertex elements that makes up this declaration+ }+ deriving (Eq,Show)+++{-| Records the state of all the vertex buffer bindings required to provide a vertex declaration+ with the input data it needs for the vertex elements.+@remarks+ Why do we have this binding list rather than just have VertexElement referring to the+ vertex buffers direct? Well, in the underlying APIs, binding the vertex buffers to an+ index (or 'stream') is the way that vertex data is linked, so this structure better+ reflects the realities of that. In addition, by separating the vertex declaration from+ the list of vertex buffer bindings, it becomes possible to reuse bindings between declarations+ and vice versa, giving opportunities to reduce the state changes required to perform rendering.+@par+ Like the other classes in this functional area, these binding maps should be created and+ destroyed using the HardwareBufferManager.+-}+data HardwareVertexBuffer vb => VertexBufferBinding vb+ = VertexBufferBinding+ { vbbBindingMap :: IntMap vb+ }+ deriving Eq
+ Graphics/LambdaCube/Image.hs view
@@ -0,0 +1,34 @@+module Graphics.LambdaCube.Image where++import Data.Word+import Foreign.Ptr++import Data.ByteString.Lazy++import Graphics.LambdaCube.PixelFormat++-- | Image loader function+type ImageLoader = String -> ByteString -> IO (Maybe Image)++-- | Has information about the size and the pixel format of the image.+data Image+ = Image+ { imName :: String+ , imHeight :: Int+ , imWidth :: Int+ , imDepth :: Int+ , imSize :: Int+ , imNumMipmaps :: Int+-- uint flags;+ , imFormat :: PixelFormat+ , imData :: {-Maybe-} (Ptr Word8) -- ^ Image can be empty+ }++{-+ enum ImageFlags+ {+ IF_COMPRESSED = 0x00000001,+ IF_CUBEMAP = 0x00000002,+ IF_3D_TEXTURE = 0x00000004+ };+-}
+ Graphics/LambdaCube/Light.hs view
@@ -0,0 +1,58 @@+module Graphics.LambdaCube.Light where++import Graphics.LambdaCube.Types++-- | Defines the type of light+data LightTypes+ = LT_POINT -- ^ Point light sources give off light equally in all directions, so require only position not direction+ | LT_DIRECTIONAL -- ^ Directional lights simulate parallel light beams from a distant source, hence have direction but no position+ | LT_SPOTLIGHT -- ^ Spotlights simulate a cone of light from a source so require position and direction, plus extra values for falloff+ deriving Eq+ +data Light+ = Light+ { lgType :: LightTypes+ , lgDiffuse :: ColourValue+ , lgSpecular :: ColourValue+-- Vector3 mPosition;+-- Vector3 mDirection;+ , lgSpotOuter :: FloatType+ , lgSpotInner :: FloatType+ , lgSpotFalloff :: FloatType+ , lgRange :: FloatType+ , lgAttenuationConst :: FloatType+ , lgAttenuationLinear :: FloatType+ , lgAttenuationQuad :: FloatType+ , lgPowerScale :: FloatType+-- size_t mIndexInFrame;+-- , lgOwnShadowFarDist :: Bool+-- , lgShadowFarDist :: FloatType+-- , lgShadowFarDistSquared :: FloatType+-- , lgShadowNearClipDist :: FloatType+-- , lgShadowFarClipDist :: FloatType+ }+ +{-++ mutable Vector3 mDerivedPosition;+ mutable Vector3 mDerivedDirection;+ // Slightly hacky but unless we separate observed light render state from main Light...+ mutable Vector3 mDerivedCamRelativePosition;+ mutable bool mDerivedCamRelativeDirty;+ Camera* mCameraToBeRelativeTo;++ /// Shared class-level name for Movable type+ static String msMovableType;++ mutable PlaneBoundedVolume mNearClipVolume;+ mutable PlaneBoundedVolumeList mFrustumClipVolumes;+ /// Is the derived transform dirty?+ mutable bool mDerivedTransformDirty;++ /// Pointer to a custom shadow camera setup+ mutable ShadowCameraSetupPtr mCustomShadowCameraSetup;++ typedef map<uint16, Vector4>::type CustomParameterMap;+ /// Stores the custom parameters for the light+ CustomParameterMap mCustomParameters;+-}
+ Graphics/LambdaCube/Loader/CompositorScript.hs view
@@ -0,0 +1,262 @@+{-# LANGUAGE NoMonomorphismRestriction #-}+module Graphics.LambdaCube.Loader.CompositorScript (loadCompositor,parseCompositor) where++-- import the the library functions from uulib+import UU.Parsing+import UU.Scanner++import Data.Maybe+import Data.Either+import qualified Data.IntMap as IntMap++-- import our custom made Alex-scanner+import Graphics.LambdaCube.Loader.Generated.CompositorScriptScanner+import Graphics.LambdaCube.Loader.ParserUtil+import Graphics.LambdaCube.Compositor+import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Common+import Graphics.LambdaCube.RenderSystem+import Graphics.LambdaCube.PixelFormat+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.GpuProgram++----------------------+-- Boilerplate code --+----------------------++loadCompositor path file = do+ txt <- readFile file+ parseCompositor file txt++parseCompositor file txt+ = let res = parseTokens pCompositorScript (tokenize file txt)+ in case res of+ Left errs -> do+ mapM_ putStrLn errs+ return Nothing+ Right tree -> return (Just tree)+ +type TokenParser a = Parser Token a++parseTokens :: TokenParser a -> [Token] -> Either [String] a+parseTokens p tks = if null msgs then final `seq` Right v else Left (map show msgs)+ where+ steps = parse p tks+ msgs = getMsgs steps+ (Pair v final) = evalSteps steps++----------------------------------------------------+-- Compositor script top level parser combinators --+----------------------------------------------------+-- * AST definitions++data (Texture t, LinkedGpuProgram lp) => CS_Attr t lp+ = CS_compositor (Compositor t lp)++data (Texture t, LinkedGpuProgram lp) => C_Attr t lp+ = C_technique (CompositionTechnique t lp)++data (Texture t, LinkedGpuProgram lp) => T_Attr t lp+ = T_target (CompositionTargetPass t lp)+ | T_targetoutput (CompositionTargetPass t lp)+ | T_texture String (Either Int FloatType) (Either Int FloatType) [PixelFormat] Bool++data (Texture t, LinkedGpuProgram lp) => TR_Attr t lp+ = TR_input InputMode+ | TR_onlyinitial Bool+ | TR_visibilitymask Int+ | TR_lodbias FloatType+ | TR_shadows Bool+ | TR_materialscheme String+ | TR_pass (CompositionPass t lp)++data P_Attr+ = P_material String+ | P_input Int String Int+ | P_identifier Int+ | P_firstrenderqueue Int+ | P_lastrenderqueue Int+ | P_buffers [String]+ | P_colourvalue ColourValue+ | P_depthvalue FloatType+ | P_stencilvalue Int+ | P_check Bool+ | P_compfunc CompareFunction+ | P_refvalue Int+ | P_mask Int+ | P_failop StencilOperation+ | P_depthfailop StencilOperation+ | P_passop StencilOperation+ | P_twosided Bool++-- * Compositor parser combinators++pCompositorScript = mkCompositorScript <$> pList pCompositorScriptContent+mkCompositorScript l = [x | CS_compositor x <- l]+ +pCompositorScriptContent = pCompositor++-- * Compositor+pCompositor = (CS_compositor .) . mkCompositor <$= "compositor" <*> pName <*= "{" <*> pList pCompositorContent <*= "}"+pCompositorContent = pTechnique++mkCompositor name l = Compositor+ { cmpName = name+ , cmpTechniques = [x | C_technique x <- l]+ , cmpSupportedTechniques = Nothing+ }++-- * Technique+pTechnique = C_technique . mkTechnique <$= "technique" <*= "{" <*> pList pTechniqueContent <*= "}"+pTechniqueContent = T_texture <$= "texture" <*> pName <*> pTexWidth <*> pTexHeight <*> pList (pEnum compositorPixelFormatVals) <*> (True <$= "shared" <|> pSucceed False)+ <|> pTarget+ <|> pTargetOutput++pTexWidth = Left <$> pInt+ <|> Right 1 <$= "target_width"+ <|> Right <$= "target_width_scaled" <*> pFloat++pTexHeight = Left <$> pInt+ <|> Right 1 <$= "target_height"+ <|> Right <$= "target_height_scaled" <*> pFloat++mkTechnique l = CompositionTechnique+ { ctTextureDefinitions = [mkTextureDefinition n w h p s | T_texture n w h p s <- l]+ , ctTargetPasses = [x | T_target x <- l]+ , ctOutputTarget = head [x | T_targetoutput x <- l]+ , ctSchemeName = "" -- TODO+ }+ where + mkTextureDefinition n w h p s = TextureDefinition+ { tdName = n+ , tdWidth = listToMaybe $ map fromIntegral $ lefts [w]+ , tdHeight = listToMaybe $ map fromIntegral $ lefts [h]+ , tdWidthFactor = def 1 $ rights [w]+ , tdHeightFactor = def 1 $ rights [h]+ , tdFormatList = p+ , tdFsaa = False+ , tdHwGammaWrite = False+ , tdShared = s+ , tdTexture = Nothing+ }++-- * Target+pTargetOutput = T_targetoutput . (mkTarget "output") <$= "target_output" <*= "{" <*> pList pTargetContent <*= "}"+pTarget = (T_target .) . mkTarget <$= "target" <*> pName <*= "{" <*> pList pTargetContent <*= "}"+pTargetContent = TR_input <$= "input" <*> pEnum inputVals+ <|> TR_onlyinitial <$= "only_initial" <*> pOnOff+ <|> TR_visibilitymask <$= "visibbility_mask" <*> pInt+ <|> TR_lodbias <$= "lod_bias" <*> pFloat+ <|> TR_materialscheme <$= "material_scheme" <*> pName+ <|> TR_shadows <$= "shadows" <*> pOnOff+ <|> pPass++mkTarget n l = CompositionTargetPass+ { ctpInputMode = def IM_NONE [x | TR_input x <- l]+ , ctpOutputName = n+ , ctpOutput = Nothing+ , ctpPasses = [x | TR_pass x <- l]+ , ctpOnlyInitial = def False [x | TR_onlyinitial x <- l]+ , ctpVisibilityMask = def 4294967295 [fromIntegral x | TR_visibilitymask x <- l]+ , ctpLodBias = def 1 [x | TR_lodbias x <- l]+ , ctpMaterialScheme = def "" [x | TR_materialscheme x <- l]+ , ctpShadowsEnabled = def True [x | TR_shadows x <- l]+ }++-- * Pass+pPass = TR_pass . (mkPass PT_RENDERQUAD) <$= "pass" <*= "render_quad" <*= "{" <*> pList pPassRQContent <*= "}"+ <|> TR_pass . (mkPass PT_CLEAR) <$= "pass" <*= "clear" <*= "{" <*> pList pPassCContent <*= "}"+ <|> TR_pass . (mkPass PT_STENCIL) <$= "pass" <*= "stencil" <*= "{" <*> pList pPassSContent <*= "}"+ <|> TR_pass . (mkPass PT_RENDERSCENE) <$= "pass" <*= "render_scene" <*= "{" <*> pList pPassRSContent <*= "}"++pIdentifier = P_identifier <$= "identifier" <*> pInt++pPassRQContent = pIdentifier+ <|> P_material <$= "material" <*> pName+ <|> P_input <$= "input" <*> pInt <*> pName <*> (pInt <|> pSucceed 0)++pPassRSContent = pIdentifier+ <|> P_firstrenderqueue <$= "first_render_queue" <*> pInt+ <|> P_lastrenderqueue <$= "last_render_queue" <*> pInt++pPassCContent = pIdentifier+ <|> P_buffers <$= "buffers" <*> pList (pKey "colour" <|> pKey "depth" <|> pKey "stencil")+ <|> P_colourvalue <$= "colour_value" <*> pRGBA+ <|> P_depthvalue <$= "depth_value" <*> pFloat+ <|> P_stencilvalue <$= "stencil_value" <*> pInt++pPassSContent = pIdentifier+ <|> P_check <$= "check" <*> pOnOff+ <|> P_compfunc <$= "comp_func" <*> pEnum cmpfuncVals+ <|> P_refvalue <$= "ref_value" <*> pInt+ <|> P_mask <$= "mask" <*> pInt+ <|> P_failop <$= "fail_op" <*> pEnum stencilopVals+ <|> P_depthfailop <$= "depth_fail_op" <*> pEnum stencilopVals+ <|> P_passop <$= "pass_op" <*> pEnum stencilopVals+ <|> P_twosided <$= "two_sided" <*> pOnOff++mkPass t l = CompositionPass+ { cpType = t+ , cpIdentifier = def 0 [fromIntegral x | P_identifier x <- l]+ , cpMaterialName = def "" [x | P_material x <- l]+ , cpMaterial = Nothing+ , cpFirstRenderQueue = def 5 [x | P_firstrenderqueue x <- l]+ , cpLastRenderQueue = def 95 [x | P_lastrenderqueue x <- l]+ , cpClearBuffers = def (True,True,False) [(elem "colour" x, elem "depth" x, elem "stencil" x) | P_buffers x <- l]+ , cpClearColour = def (0,0,0,0) [x | P_colourvalue x <- l]+ , cpClearDepth = def 0 [x | P_depthvalue x <- l]+ , cpClearStencil = def 0 [fromIntegral x | P_stencilvalue x <- l]+ , cpInputs = IntMap.fromList [(i,InputTex n mi) | P_input i n mi <- l]+ , cpStencilCheck = def False [x | P_check x <- l]+ , cpStencilFunc = def CMPF_LESS [x | P_compfunc x <- l]+ , cpStencilRefValue = def 0 [fromIntegral x | P_refvalue x <- l]+ , cpStencilMask = def 0xFFFFFFFF [fromIntegral x | P_mask x <- l]+ , cpStencilFailOp = def SOP_KEEP [x | P_failop x <- l]+ , cpStencilDepthFailOp = def SOP_KEEP [x | P_depthfailop x <- l]+ , cpStencilPassOp = def SOP_KEEP [x | P_passop x <- l]+ , cpStencilTwoSidedOperation = def False [x | P_twosided x <- l]+-- , cpQuadCornerModified :: Bool -- ^ true if quad should not cover whole screen+-- , cpQuadLeft :: FloatType -- ^ quad positions in normalised coordinates [-1;1]x[-1;1] (in case of PT_RENDERQUAD)+-- , cpQuadTop :: FloatType+-- , cpQuadRight :: FloatType+-- , cpQuadBottom :: FloatType+-- , cpQuadFarCorners :: Bool+-- , cpQuadFarCornersViewSpace :: Bool+ }+{-+mkPassS l =+ (def Nothing [Just x | P_identifier x <- l],+ CompositionStencilPass+ { stCheck = def False [x | P_check x <- l]+ , stCompFunc = def CMPF_LESS [x | P_compfunc x <- l]+ , stRefValue = def 0 [x | P_refvalue x <- l]+ , stMask = def 4294967295 [x | P_mask x <- l]+ , stFailOp = def SOP_KEEP [x | P_failop x <- l]+ , stDepthFailOp = def SOP_KEEP [x | P_depthfailop x <- l]+ , stPassOp = def SOP_KEEP [x | P_passop x <- l]+ , stTwoSided = def False [x | P_twosided x <- l]+ })+mkPassRQ l =+ (def Nothing [Just x | P_identifier x <- l],+ CompositionRenderQuadPass+ { rqMaterial = def "" [x | P_material x <- l]+ , rqInput = def (0,"",0) [(a,b,c) | P_input a b c <- l]+ })+ +mkPassC l =+ (def Nothing [Just x | P_identifier x <- l],+ CompositionClearPass+ { clBuffers = def (True,True,False) [(elem "colour" x, elem "depth" x, elem "stencil" x) | P_buffers x <- l]+ , clColourValue = def (0,0,0,0) [x | P_colourvalue x <- l]+ , clDepthValue = def 0 [x | P_depthvalue x <- l]+ , clStencilValue = def 0 [x | P_stencilvalue x <- l]+ })+ +mkPassRS l =+ (def Nothing [Just x | P_identifier x <- l],+ CompositionRenderScenePass+ { rsFirstRenderQueue = def 5 [x | P_firstrenderqueue x <- l]+ , rsLastRenderQueue = def 95 [x | P_lastrenderqueue x <- l]+ })+ +-}
+ Graphics/LambdaCube/Loader/CompositorScriptScanner.x view
@@ -0,0 +1,63 @@+{+-- alex scanner for use with uulib+-- compile with alex -o Scanner.hs -g Scanner.x+module Graphics.LambdaCube.Loader.Generated.CompositorScriptScanner(tokenize) where++import UU.Scanner+}++$litChar = [^[\" \\]]+$identChar = [a-zA-Z0-9_\.\-\/\~\&]+++tokens :-+ $white+ ; -- whitespace+ "//".* ; -- comment++ \" ($litChar | \\ \\ | \\ \" )* \" { valueToken TkString } -- string+ [0-9]+ { valueToken TkInteger10 } -- int+ [0-9]+\.[0-9]+ { valueToken TkFraction } -- float+ + ( + on | off |+ compositor | technique | texture | target_width | target_height | target_width_scaled | target_height_scaled | shared |+ PF_A8R8G8B8 | PF_R8G8B8A8 | PF_R8G8B8 | PF_FLOAT16_RGBA | PF_FLOAT16_RGB | PF_FLOAT16_R | PF_FLOAT32_RGBA | PF_FLOAT32_RGB | PF_FLOAT32_R | + target | target_output | input | none | previous | only_initial | visibility_mask | lod_bias | shadows | material_scheme |+ pass | render_quad | clear | stencil | render_scene | material | identifier | first_render_queue | last_render_queue |+ buffers | colour | depth | colour_value | depth_value | stencil_value | check | comp_func |+ always_fail | always_pass | less | less_equal | not_equal | greater_equal | greater | ref_value | mask | fail_op |+ keep | zero | replace | increment | decrement | increment_wrap | decrement_wrap | invert | depth_fail_op | pass_op | two_sided+ ) { reserved } -- reserved keywords+ [\{\}] { reserved } -- reserved symbols++ $identChar+ { valueToken TkVarid } -- identifier+++{+-- boilerplate code needed for Alex+type AlexInput = (Pos, String)++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."++alexGetChar :: AlexInput -> Maybe (Char, AlexInput)+alexGetChar (_, []) = Nothing+alexGetChar (p, (c:cs))+ = let p' = adv p c+ in Just (c, (p', cs))++-- use the Alex scanner to generate a list of tokens for the uulib token parsers+tokenize :: String -> String -> [Token]+tokenize filename str+ = go (initpos, str)+ where+ initpos = Pos 1 1 filename+ + go inp@(pos, cs)+ = case alexScan inp 0 of+ AlexEOF -> []+ AlexError inp' -> valueToken TkError [head cs] pos : go inp'+ AlexSkip inp' _ -> go inp'+ AlexToken inp' len act -> act (take len cs) pos : go inp'+}+
+ Graphics/LambdaCube/Loader/FontDefinitionScriptScanner.x view
@@ -0,0 +1,56 @@+{+-- alex scanner for use with uulib+-- compile with alex -o Scanner.hs -g Scanner.x+module Graphics.LambdaCube.Loader.Generated.FontDefinitionScriptScanner(tokenize) where++import UU.Scanner+}++$litChar = [^[\" \\]]+$identChar = [a-zA-Z0-9_\.\-\/\~]+++tokens :-+ $white+ ; -- whitespace+ "//".* ; -- comment++ \" ($litChar | \\ \\ | \\ \" )* \" { valueToken TkString } -- string+ [0-9]+ { valueToken TkInteger16 } -- int+ + ( type | image | truetype |+ source | glyph | size |+ resolution | antialias_colour |+ true | false | code_points ) { reserved } -- reserved keywords+ [\{\}] { reserved } -- reserved symbols++ $identChar+ { valueToken TkVarid } -- identifier+++{+-- boilerplate code needed for Alex+type AlexInput = (Pos, String)++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."++alexGetChar :: AlexInput -> Maybe (Char, AlexInput)+alexGetChar (_, []) = Nothing+alexGetChar (p, (c:cs))+ = let p' = adv p c+ in Just (c, (p', cs))++-- use the Alex scanner to generate a list of tokens for the uulib token parsers+tokenize :: String -> String -> [Token]+tokenize filename str+ = go (initpos, str)+ where+ initpos = Pos 1 1 filename+ + go inp@(pos, cs)+ = case alexScan inp 0 of+ AlexEOF -> []+ AlexError inp' -> valueToken TkError [head cs] pos : go inp'+ AlexSkip inp' _ -> go inp'+ AlexToken inp' len act -> act (take len cs) pos : go inp'+}+
+ Graphics/LambdaCube/Loader/Generated/CompositorScriptScanner.hs view
@@ -0,0 +1,268 @@+{-# OPTIONS -fglasgow-exts -cpp #-}+{-# LINE 1 "CompositorScriptScanner.x" #-}++-- alex scanner for use with uulib+-- compile with alex -o Scanner.hs -g Scanner.x+module Graphics.LambdaCube.Loader.Generated.CompositorScriptScanner(tokenize) where++import UU.Scanner++#if __GLASGOW_HASKELL__ >= 603+#include "ghcconfig.h"+#elif defined(__GLASGOW_HASKELL__)+#include "config.h"+#endif+#if __GLASGOW_HASKELL__ >= 503+import Data.Array+import Data.Char (ord)+import Data.Array.Base (unsafeAt)+#else+import Array+import Char (ord)+#endif+#if __GLASGOW_HASKELL__ >= 503+import GHC.Exts+#else+import GlaExts+#endif+alex_base :: AlexAddr+alex_base = AlexA# "\xf8\xff\xff\xff\xfd\xff\xff\xff\x02\x00\x00\x00\x4e\x00\x00\x00\x06\x00\x00\x00\xa4\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x6a\x01\x00\x00\x6b\x01\x00\x00\xf7\xff\xff\xff\x69\x01\x00\x00\xbe\x01\x00\x00\x13\x02\x00\x00\x68\x02\x00\x00\xbd\x02\x00\x00\x12\x03\x00\x00\x67\x03\x00\x00\xbc\x03\x00\x00\x11\x04\x00\x00\x66\x04\x00\x00\xbb\x04\x00\x00\x10\x05\x00\x00\x65\x05\x00\x00\xba\x05\x00\x00\x0f\x06\x00\x00\x64\x06\x00\x00\xb9\x06\x00\x00\x0e\x07\x00\x00\x63\x07\x00\x00\xb8\x07\x00\x00\x0d\x08\x00\x00\x62\x08\x00\x00\xb7\x08\x00\x00\x0c\x09\x00\x00\x61\x09\x00\x00\xb6\x09\x00\x00\x0b\x0a\x00\x00\x60\x0a\x00\x00\xb5\x0a\x00\x00\x0a\x0b\x00\x00\x5f\x0b\x00\x00\xb4\x0b\x00\x00\x09\x0c\x00\x00\x5e\x0c\x00\x00\xb3\x0c\x00\x00\x08\x0d\x00\x00\x5d\x0d\x00\x00\xb2\x0d\x00\x00\x07\x0e\x00\x00\x5c\x0e\x00\x00\xb1\x0e\x00\x00\x06\x0f\x00\x00\x5b\x0f\x00\x00\xb0\x0f\x00\x00\x05\x10\x00\x00\x5a\x10\x00\x00\xaf\x10\x00\x00\x04\x11\x00\x00\x59\x11\x00\x00\xae\x11\x00\x00\x03\x12\x00\x00\x58\x12\x00\x00\xad\x12\x00\x00\x02\x13\x00\x00\x57\x13\x00\x00\xac\x13\x00\x00\x01\x14\x00\x00\x56\x14\x00\x00\xab\x14\x00\x00\x00\x15\x00\x00\x55\x15\x00\x00\xaa\x15\x00\x00\xff\x15\x00\x00\x54\x16\x00\x00\xa9\x16\x00\x00\xfe\x16\x00\x00\x53\x17\x00\x00\xa8\x17\x00\x00\xfd\x17\x00\x00\x52\x18\x00\x00\xa7\x18\x00\x00\xfc\x18\x00\x00\x51\x19\x00\x00\xa6\x19\x00\x00\xfb\x19\x00\x00\x50\x1a\x00\x00\xa5\x1a\x00\x00\xfa\x1a\x00\x00\x4f\x1b\x00\x00\xa4\x1b\x00\x00\xf9\x1b\x00\x00\x4e\x1c\x00\x00\xa3\x1c\x00\x00\xf8\x1c\x00\x00\x4d\x1d\x00\x00\xa2\x1d\x00\x00\xf7\x1d\x00\x00\x4c\x1e\x00\x00\xa1\x1e\x00\x00\xf6\x1e\x00\x00\x4b\x1f\x00\x00\xa0\x1f\x00\x00\xf5\x1f\x00\x00\x4a\x20\x00\x00\x9f\x20\x00\x00\xf4\x20\x00\x00\x49\x21\x00\x00\x9e\x21\x00\x00\xf3\x21\x00\x00\x48\x22\x00\x00\x9d\x22\x00\x00\xf2\x22\x00\x00\x47\x23\x00\x00\x9c\x23\x00\x00\xf1\x23\x00\x00\x46\x24\x00\x00\x9b\x24\x00\x00\xf0\x24\x00\x00\x45\x25\x00\x00\x9a\x25\x00\x00\xef\x25\x00\x00\x44\x26\x00\x00\x99\x26\x00\x00\xee\x26\x00\x00\x43\x27\x00\x00\x98\x27\x00\x00\xed\x27\x00\x00\x42\x28\x00\x00\x97\x28\x00\x00\xec\x28\x00\x00\x41\x29\x00\x00\x96\x29\x00\x00\xeb\x29\x00\x00\x40\x2a\x00\x00\x95\x2a\x00\x00\xea\x2a\x00\x00\x3f\x2b\x00\x00\x94\x2b\x00\x00\xe9\x2b\x00\x00\x3e\x2c\x00\x00\x93\x2c\x00\x00\xe8\x2c\x00\x00\x3d\x2d\x00\x00\x92\x2d\x00\x00\xe7\x2d\x00\x00\x3c\x2e\x00\x00\x91\x2e\x00\x00\xe6\x2e\x00\x00\x3b\x2f\x00\x00\x90\x2f\x00\x00\xe5\x2f\x00\x00\x3a\x30\x00\x00\x8f\x30\x00\x00\xe4\x30\x00\x00\x39\x31\x00\x00\x8e\x31\x00\x00\xe3\x31\x00\x00\x38\x32\x00\x00\x8d\x32\x00\x00\xe2\x32\x00\x00\x37\x33\x00\x00\x8c\x33\x00\x00\xe1\x33\x00\x00\x36\x34\x00\x00\x8b\x34\x00\x00\xe0\x34\x00\x00\x35\x35\x00\x00\x8a\x35\x00\x00\xdf\x35\x00\x00\x34\x36\x00\x00\x89\x36\x00\x00\xde\x36\x00\x00\x33\x37\x00\x00\x88\x37\x00\x00\xdd\x37\x00\x00\x32\x38\x00\x00\x87\x38\x00\x00\xdc\x38\x00\x00\x31\x39\x00\x00\x86\x39\x00\x00\xdb\x39\x00\x00\x30\x3a\x00\x00\x85\x3a\x00\x00\xda\x3a\x00\x00\x2f\x3b\x00\x00\x84\x3b\x00\x00\xd9\x3b\x00\x00\x2e\x3c\x00\x00\x83\x3c\x00\x00\xd8\x3c\x00\x00\x2d\x3d\x00\x00\x82\x3d\x00\x00\xd7\x3d\x00\x00\x2c\x3e\x00\x00\x81\x3e\x00\x00\xd6\x3e\x00\x00\x2b\x3f\x00\x00\x80\x3f\x00\x00\xd5\x3f\x00\x00\x2a\x40\x00\x00\x7f\x40\x00\x00\xd4\x40\x00\x00\x29\x41\x00\x00\x7e\x41\x00\x00\xd3\x41\x00\x00\x28\x42\x00\x00\x7d\x42\x00\x00\xd2\x42\x00\x00\x27\x43\x00\x00\x7c\x43\x00\x00\xd1\x43\x00\x00\x26\x44\x00\x00\x7b\x44\x00\x00\xd0\x44\x00\x00\x25\x45\x00\x00\x7a\x45\x00\x00\xcf\x45\x00\x00\x24\x46\x00\x00\x79\x46\x00\x00\xce\x46\x00\x00\x23\x47\x00\x00\x78\x47\x00\x00\xcd\x47\x00\x00\x22\x48\x00\x00\x77\x48\x00\x00\xcc\x48\x00\x00\x21\x49\x00\x00\x76\x49\x00\x00\xcb\x49\x00\x00\x20\x4a\x00\x00\x75\x4a\x00\x00\xca\x4a\x00\x00\x1f\x4b\x00\x00\x74\x4b\x00\x00\xc9\x4b\x00\x00\x1e\x4c\x00\x00\x73\x4c\x00\x00\xc8\x4c\x00\x00\x1d\x4d\x00\x00\x72\x4d\x00\x00\xc7\x4d\x00\x00\x1c\x4e\x00\x00\x71\x4e\x00\x00\xc6\x4e\x00\x00\x1b\x4f\x00\x00\x70\x4f\x00\x00\xc5\x4f\x00\x00\x1a\x50\x00\x00\x6f\x50\x00\x00\xc4\x50\x00\x00\x19\x51\x00\x00\x6e\x51\x00\x00\xc3\x51\x00\x00\x18\x52\x00\x00\x6d\x52\x00\x00\xc2\x52\x00\x00\x17\x53\x00\x00\x6c\x53\x00\x00\xc1\x53\x00\x00\x16\x54\x00\x00\x6b\x54\x00\x00\xc0\x54\x00\x00\x15\x55\x00\x00\x6a\x55\x00\x00\xbf\x55\x00\x00\x14\x56\x00\x00\x69\x56\x00\x00\xbe\x56\x00\x00\x13\x57\x00\x00\x68\x57\x00\x00\xbd\x57\x00\x00\x12\x58\x00\x00\x67\x58\x00\x00\xbc\x58\x00\x00\x11\x59\x00\x00\x66\x59\x00\x00\xbb\x59\x00\x00\x10\x5a\x00\x00\x65\x5a\x00\x00\xba\x5a\x00\x00\x0f\x5b\x00\x00\x64\x5b\x00\x00\xb9\x5b\x00\x00\x0e\x5c\x00\x00\x63\x5c\x00\x00\xb8\x5c\x00\x00\x0d\x5d\x00\x00\x62\x5d\x00\x00\xb7\x5d\x00\x00\x0c\x5e\x00\x00\x61\x5e\x00\x00\xb6\x5e\x00\x00\x0b\x5f\x00\x00\x60\x5f\x00\x00\xb5\x5f\x00\x00\x0a\x60\x00\x00\x5f\x60\x00\x00\xb4\x60\x00\x00\x09\x61\x00\x00\x5e\x61\x00\x00\xb3\x61\x00\x00\x08\x62\x00\x00\x5d\x62\x00\x00\xb2\x62\x00\x00\x07\x63\x00\x00\x5c\x63\x00\x00\xb1\x63\x00\x00\x06\x64\x00\x00\x5b\x64\x00\x00\xb0\x64\x00\x00\x05\x65\x00\x00\x5a\x65\x00\x00\xaf\x65\x00\x00\x04\x66\x00\x00\x59\x66\x00\x00\xae\x66\x00\x00\x03\x67\x00\x00\x58\x67\x00\x00\xad\x67\x00\x00\x02\x68\x00\x00\x57\x68\x00\x00\xac\x68\x00\x00\x01\x69\x00\x00\x56\x69\x00\x00\xab\x69\x00\x00\x00\x6a\x00\x00\x55\x6a\x00\x00\xaa\x6a\x00\x00\xff\x6a\x00\x00\x54\x6b\x00\x00\xa9\x6b\x00\x00\xfe\x6b\x00\x00\x53\x6c\x00\x00\xa8\x6c\x00\x00\xfd\x6c\x00\x00\x52\x6d\x00\x00\xa7\x6d\x00\x00\xfc\x6d\x00\x00\x51\x6e\x00\x00\xa6\x6e\x00\x00\xfb\x6e\x00\x00\x50\x6f\x00\x00\xa5\x6f\x00\x00\xfa\x6f\x00\x00\x4f\x70\x00\x00\xa4\x70\x00\x00\xf9\x70\x00\x00\x4e\x71\x00\x00\xa3\x71\x00\x00\xf8\x71\x00\x00\x4d\x72\x00\x00\xa2\x72\x00\x00\xf7\x72\x00\x00\x4c\x73\x00\x00\xa1\x73\x00\x00\xf6\x73\x00\x00\x4b\x74\x00\x00\xa0\x74\x00\x00\xf5\x74\x00\x00\x4a\x75\x00\x00\x9f\x75\x00\x00\xf4\x75\x00\x00\x49\x76\x00\x00\x9e\x76\x00\x00\xf3\x76\x00\x00\x48\x77\x00\x00\x9d\x77\x00\x00\xf2\x77\x00\x00\x47\x78\x00\x00\x9c\x78\x00\x00\xf1\x78\x00\x00\x46\x79\x00\x00\x9b\x79\x00\x00\xf0\x79\x00\x00\x45\x7a\x00\x00\x9a\x7a\x00\x00\x00\x00\x00\x00\xef\x7a\x00\x00"#++alex_table :: AlexAddr+alex_table = AlexA# "\x00\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x09\x00\x08\x00\x00\x00\x00\x00\x02\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x06\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x60\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x09\x00\x00\x00\x00\x00\x00\x00\x7a\x01\xff\xff\x21\x01\xfa\x00\x2b\x00\x01\x01\x7a\x01\xe5\x00\x3c\x01\x7a\x01\x7c\x00\x7a\x01\x4b\x01\xa4\x00\xb4\x00\x7f\x00\x21\x00\x86\x00\x7a\x01\xc0\x00\x56\x00\x33\x00\x7a\x01\x9d\x00\x7a\x01\x7a\x01\x7a\x01\x4e\x01\x79\x01\x05\x00\x79\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\xff\xff\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x05\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x7a\x01\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x03\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xff\xff\xff\xff\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x07\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x0d\x00\x7a\x01\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x0a\x00\x0a\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x51\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x67\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x70\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x8f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x10\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x36\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x62\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x66\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x71\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x22\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x16\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x23\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x24\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x25\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x26\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x27\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x28\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xfd\x00\x29\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x13\x01\x7a\x01\x7a\x01\x7a\x01\xc3\x00\x7a\x01\x7a\x01\x2a\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2c\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2d\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x30\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x31\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x37\x00\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x40\x00\x7a\x01\x7a\x01\x7a\x01\x32\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x78\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x34\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x35\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x36\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x0f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x38\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x39\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3a\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x45\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x78\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3b\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x0e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3d\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x10\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x41\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x42\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x43\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x44\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x46\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x47\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x48\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x49\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x4a\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x4c\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x4d\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x4e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x4f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x50\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x52\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\xa7\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x53\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x54\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x55\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xc8\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x57\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x58\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x59\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5a\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5b\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5c\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5d\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x66\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x11\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x62\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x63\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x64\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x65\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x12\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x13\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x69\x00\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6a\x00\x7a\x01\x73\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6b\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6d\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x14\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x15\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x72\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x74\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x75\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x76\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x77\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x79\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x58\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x69\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\xd4\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7b\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7d\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x31\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x80\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x81\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x82\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x83\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x84\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\xb6\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x85\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x87\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x88\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x89\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x8a\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x8b\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x8c\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x8e\x00\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x90\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x91\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x92\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x93\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x94\x00\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x95\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x96\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x97\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x98\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x99\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x9a\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x9b\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x9c\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x9e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x9f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\xa0\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\xa2\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\xf4\x00\x7a\x01\x7a\x01\x7a\x01\x26\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xa3\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xa5\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xa6\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xa8\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xa9\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xaa\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\xab\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xac\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x17\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\xae\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xaf\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xb0\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xb1\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x43\x01\xb2\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\xb3\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1f\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xb5\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\xb7\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xb8\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xb9\x00\x7a\x01\xcc\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xbb\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xbc\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\xbd\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x42\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xbe\x00\x7a\x01\x52\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xbf\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\xc1\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xc2\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1a\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xc4\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\xc5\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xc6\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xc7\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xc9\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xca\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\xcb\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xcd\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xce\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xcf\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd0\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd1\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd2\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd3\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd5\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd6\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd7\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xd8\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xda\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xdb\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\xdc\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xdd\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xde\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xdf\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe1\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe2\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe3\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x48\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe4\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe6\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe7\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe8\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xe9\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xeb\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xec\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\xed\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xee\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xef\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf0\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf2\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf3\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf5\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf6\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf7\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf8\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xf9\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x18\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xfb\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xfc\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x19\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xfe\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x5e\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\xff\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x02\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x03\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x04\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x05\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x07\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x08\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x09\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6f\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x0a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x0c\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x0d\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x0e\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x0f\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x11\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x12\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x14\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x15\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x16\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x18\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x19\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x24\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1c\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1d\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x1e\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1f\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x22\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x23\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1b\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x25\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x27\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x28\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x29\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x2c\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2d\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2e\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x2f\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x30\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x32\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x33\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x34\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x35\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1c\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x37\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x38\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x39\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3b\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3d\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x3e\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x3f\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x40\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x41\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x44\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x45\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x46\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x47\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x49\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x4a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x4c\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x4d\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x4f\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x50\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x51\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1d\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x53\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x54\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x55\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x56\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x57\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x1e\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x59\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5b\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5c\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x5d\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x5f\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x60\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x61\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x63\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x64\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x65\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x67\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x68\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6c\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x6d\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x6e\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x70\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x20\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x72\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x73\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x74\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x75\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x76\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x77\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++alex_check :: AlexAddr+alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x22\x00\x22\x00\xff\xff\xff\xff\x20\x00\x26\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5c\x00\xff\xff\xff\xff\xff\xff\x5f\x00\x0a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x26\x00\x7d\x00\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\x0a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\x26\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x0a\x00\x0a\x00\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x22\x00\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\x5c\x00\x5c\x00\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x26\x00\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++alex_deflt :: AlexAddr+alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\x04\x00\x04\x00\x04\x00\xff\xff\xff\xff\x09\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++alex_accept = listArray (0::Int,378) [[],[],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_2))],[],[],[],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_7))]]+{-# LINE 36 "CompositorScriptScanner.x" #-}++-- boilerplate code needed for Alex+type AlexInput = (Pos, String)++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."++alexGetChar :: AlexInput -> Maybe (Char, AlexInput)+alexGetChar (_, []) = Nothing+alexGetChar (p, (c:cs))+ = let p' = adv p c+ in Just (c, (p', cs))++-- use the Alex scanner to generate a list of tokens for the uulib token parsers+tokenize :: String -> String -> [Token]+tokenize filename str+ = go (initpos, str)+ where+ initpos = Pos 1 1 filename+ + go inp@(pos, cs)+ = case alexScan inp 0 of+ AlexEOF -> []+ AlexError inp' -> valueToken TkError [head cs] pos : go inp'+ AlexSkip inp' _ -> go inp'+ AlexToken inp' len act -> act (take len cs) pos : go inp'++alex_action_2 = valueToken TkString +alex_action_3 = valueToken TkInteger10 +alex_action_4 = valueToken TkFraction +alex_action_5 = reserved +alex_action_6 = reserved +alex_action_7 = valueToken TkVarid +{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 1 "<command-line>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- -----------------------------------------------------------------------------+-- ALEX TEMPLATE+--+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use+-- it for any purpose whatsoever.++-- -----------------------------------------------------------------------------+-- INTERNALS and main scanner engine++{-# LINE 35 "templates/GenericTemplate.hs" #-}++{-# LINE 45 "templates/GenericTemplate.hs" #-}+++data AlexAddr = AlexA# Addr#++#if __GLASGOW_HASKELL__ < 503+uncheckedShiftL# = shiftL#+#endif++{-# INLINE alexIndexInt16OffAddr #-}+alexIndexInt16OffAddr (AlexA# arr) off =+#ifdef WORDS_BIGENDIAN+ narrow16Int# i+ where+ i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)+ high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+ low = int2Word# (ord# (indexCharOffAddr# arr off'))+ off' = off *# 2#+#else+ indexInt16OffAddr# arr off+#endif++++++{-# INLINE alexIndexInt32OffAddr #-}+alexIndexInt32OffAddr (AlexA# arr) off = +#ifdef WORDS_BIGENDIAN+ narrow32Int# i+ where+ i = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`+ (b2 `uncheckedShiftL#` 16#) `or#`+ (b1 `uncheckedShiftL#` 8#) `or#` b0)+ b3 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))+ b2 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))+ b1 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+ b0 = int2Word# (ord# (indexCharOffAddr# arr off'))+ off' = off *# 4#+#else+ indexInt32OffAddr# arr off+#endif++++++#if __GLASGOW_HASKELL__ < 503+quickIndex arr i = arr ! i+#else+-- GHC >= 503, unsafeAt is available from Data.Array.Base.+quickIndex = unsafeAt+#endif+++++-- -----------------------------------------------------------------------------+-- Main lexing routines++data AlexReturn a+ = AlexEOF+ | AlexError !AlexInput+ | AlexSkip !AlexInput !Int+ | AlexToken !AlexInput !Int a++-- alexScan :: AlexInput -> StartCode -> AlexReturn a+alexScan input (I# (sc))+ = alexScanUser undefined input (I# (sc))++alexScanUser user input (I# (sc))+ = case alex_scan_tkn user input 0# input sc AlexNone of+ (AlexNone, input') ->+ case alexGetChar input of+ Nothing -> ++++ AlexEOF+ Just _ ->++++ AlexError input'++ (AlexLastSkip input len, _) ->++++ AlexSkip input len++ (AlexLastAcc k input len, _) ->++++ AlexToken input len k+++-- Push the input through the DFA, remembering the most recent accepting+-- state it encountered.++alex_scan_tkn user orig_input len input s last_acc =+ input `seq` -- strict in the input+ let + new_acc = check_accs (alex_accept `quickIndex` (I# (s)))+ in+ new_acc `seq`+ case alexGetChar input of+ Nothing -> (new_acc, input)+ Just (c, new_input) -> ++++ let+ base = alexIndexInt32OffAddr alex_base s+ (I# (ord_c)) = ord c+ offset = (base +# ord_c)+ check = alexIndexInt16OffAddr alex_check offset+ + new_s = if (offset >=# 0#) && (check ==# ord_c)+ then alexIndexInt16OffAddr alex_table offset+ else alexIndexInt16OffAddr alex_deflt s+ in+ case new_s of + -1# -> (new_acc, input)+ -- on an error, we want to keep the input *before* the+ -- character that failed, not after.+ _ -> alex_scan_tkn user orig_input (len +# 1#) + new_input new_s new_acc++ where+ check_accs [] = last_acc+ check_accs (AlexAcc a : _) = AlexLastAcc a input (I# (len))+ check_accs (AlexAccSkip : _) = AlexLastSkip input (I# (len))+ check_accs (AlexAccPred a pred : rest)+ | pred user orig_input (I# (len)) input+ = AlexLastAcc a input (I# (len))+ check_accs (AlexAccSkipPred pred : rest)+ | pred user orig_input (I# (len)) input+ = AlexLastSkip input (I# (len))+ check_accs (_ : rest) = check_accs rest++data AlexLastAcc a+ = AlexNone+ | AlexLastAcc a !AlexInput !Int+ | AlexLastSkip !AlexInput !Int++data AlexAcc a user+ = AlexAcc a+ | AlexAccSkip+ | AlexAccPred a (AlexAccPred user)+ | AlexAccSkipPred (AlexAccPred user)++type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool++-- -----------------------------------------------------------------------------+-- Predicates on a rule++alexAndPred p1 p2 user in1 len in2+ = p1 user in1 len in2 && p2 user in1 len in2++--alexPrevCharIsPred :: Char -> AlexAccPred _ +alexPrevCharIs c _ input _ _ = c == alexInputPrevChar input++--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ +alexPrevCharIsOneOf arr _ input _ _ = arr ! alexInputPrevChar input++--alexRightContext :: Int -> AlexAccPred _+alexRightContext (I# (sc)) user _ _ input = + case alex_scan_tkn user input 0# input sc AlexNone of+ (AlexNone, _) -> False+ _ -> True+ -- TODO: there's no need to find the longest+ -- match when checking the right context, just+ -- the first match will do.++-- used by wrappers+iUnbox (I# (i)) = i
+ Graphics/LambdaCube/Loader/Generated/MaterialScriptScanner.hs view
file too large to diff
+ Graphics/LambdaCube/Loader/Generated/ResourceScriptScanner.hs view
@@ -0,0 +1,265 @@+{-# OPTIONS -fglasgow-exts -cpp #-}+{-# LINE 1 "ResourceScriptScanner.x" #-}++-- alex scanner for use with uulib+-- compile with alex -o Scanner.hs -g Scanner.x+module Graphics.LambdaCube.Loader.Generated.ResourceScriptScanner(tokenize) where++import UU.Scanner++#if __GLASGOW_HASKELL__ >= 603+#include "ghcconfig.h"+#elif defined(__GLASGOW_HASKELL__)+#include "config.h"+#endif+#if __GLASGOW_HASKELL__ >= 503+import Data.Array+import Data.Char (ord)+import Data.Array.Base (unsafeAt)+#else+import Array+import Char (ord)+#endif+#if __GLASGOW_HASKELL__ >= 503+import GHC.Exts+#else+import GlaExts+#endif+alex_base :: AlexAddr+alex_base = AlexA# "\xf8\xff\xff\xff\xfd\xff\xff\xff\x02\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x46\x00\x00\x00\x94\x00\x00\x00\xe2\x00\x00\x00\x30\x01\x00\x00\x7e\x01\x00\x00\xcc\x01\x00\x00\x1a\x02\x00\x00\x68\x02\x00\x00\xb6\x02\x00\x00\x04\x03\x00\x00\x52\x03\x00\x00\xa0\x03\x00\x00\x00\x00\x00\x00\xee\x03\x00\x00"#++alex_table :: AlexAddr+alex_table = AlexA# "\x00\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0e\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x10\x00\x11\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x05\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x06\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x07\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x08\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x09\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0b\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0c\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0d\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x05\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0f\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++alex_check :: AlexAddr+alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x23\x00\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++alex_deflt :: AlexAddr+alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++alex_accept = listArray (0::Int,18) [[],[],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_2))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_4))]]+{-# LINE 25 "ResourceScriptScanner.x" #-}++-- boilerplate code needed for Alex+type AlexInput = (Pos, String)++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."++alexGetChar :: AlexInput -> Maybe (Char, AlexInput)+alexGetChar (_, []) = Nothing+alexGetChar (p, (c:cs))+ = let p' = adv p c+ in Just (c, (p', cs))++-- use the Alex scanner to generate a list of tokens for the uulib token parsers+tokenize :: String -> String -> [Token]+tokenize filename str+ = go (initpos, str)+ where+ initpos = Pos 1 1 filename+ + go inp@(pos, cs)+ = case alexScan inp 0 of+ AlexEOF -> []+ AlexError inp' -> valueToken TkError [head cs] pos : go inp'+ AlexSkip inp' _ -> go inp'+ AlexToken inp' len act -> act (take len cs) pos : go inp'++alex_action_2 = reserved +alex_action_3 = reserved +alex_action_4 = valueToken TkVarid +{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 1 "<command-line>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- -----------------------------------------------------------------------------+-- ALEX TEMPLATE+--+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use+-- it for any purpose whatsoever.++-- -----------------------------------------------------------------------------+-- INTERNALS and main scanner engine++{-# LINE 35 "templates/GenericTemplate.hs" #-}++{-# LINE 45 "templates/GenericTemplate.hs" #-}+++data AlexAddr = AlexA# Addr#++#if __GLASGOW_HASKELL__ < 503+uncheckedShiftL# = shiftL#+#endif++{-# INLINE alexIndexInt16OffAddr #-}+alexIndexInt16OffAddr (AlexA# arr) off =+#ifdef WORDS_BIGENDIAN+ narrow16Int# i+ where+ i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)+ high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+ low = int2Word# (ord# (indexCharOffAddr# arr off'))+ off' = off *# 2#+#else+ indexInt16OffAddr# arr off+#endif++++++{-# INLINE alexIndexInt32OffAddr #-}+alexIndexInt32OffAddr (AlexA# arr) off = +#ifdef WORDS_BIGENDIAN+ narrow32Int# i+ where+ i = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`+ (b2 `uncheckedShiftL#` 16#) `or#`+ (b1 `uncheckedShiftL#` 8#) `or#` b0)+ b3 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))+ b2 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))+ b1 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+ b0 = int2Word# (ord# (indexCharOffAddr# arr off'))+ off' = off *# 4#+#else+ indexInt32OffAddr# arr off+#endif++++++#if __GLASGOW_HASKELL__ < 503+quickIndex arr i = arr ! i+#else+-- GHC >= 503, unsafeAt is available from Data.Array.Base.+quickIndex = unsafeAt+#endif+++++-- -----------------------------------------------------------------------------+-- Main lexing routines++data AlexReturn a+ = AlexEOF+ | AlexError !AlexInput+ | AlexSkip !AlexInput !Int+ | AlexToken !AlexInput !Int a++-- alexScan :: AlexInput -> StartCode -> AlexReturn a+alexScan input (I# (sc))+ = alexScanUser undefined input (I# (sc))++alexScanUser user input (I# (sc))+ = case alex_scan_tkn user input 0# input sc AlexNone of+ (AlexNone, input') ->+ case alexGetChar input of+ Nothing -> ++++ AlexEOF+ Just _ ->++++ AlexError input'++ (AlexLastSkip input len, _) ->++++ AlexSkip input len++ (AlexLastAcc k input len, _) ->++++ AlexToken input len k+++-- Push the input through the DFA, remembering the most recent accepting+-- state it encountered.++alex_scan_tkn user orig_input len input s last_acc =+ input `seq` -- strict in the input+ let + new_acc = check_accs (alex_accept `quickIndex` (I# (s)))+ in+ new_acc `seq`+ case alexGetChar input of+ Nothing -> (new_acc, input)+ Just (c, new_input) -> ++++ let+ base = alexIndexInt32OffAddr alex_base s+ (I# (ord_c)) = ord c+ offset = (base +# ord_c)+ check = alexIndexInt16OffAddr alex_check offset+ + new_s = if (offset >=# 0#) && (check ==# ord_c)+ then alexIndexInt16OffAddr alex_table offset+ else alexIndexInt16OffAddr alex_deflt s+ in+ case new_s of + -1# -> (new_acc, input)+ -- on an error, we want to keep the input *before* the+ -- character that failed, not after.+ _ -> alex_scan_tkn user orig_input (len +# 1#) + new_input new_s new_acc++ where+ check_accs [] = last_acc+ check_accs (AlexAcc a : _) = AlexLastAcc a input (I# (len))+ check_accs (AlexAccSkip : _) = AlexLastSkip input (I# (len))+ check_accs (AlexAccPred a pred : rest)+ | pred user orig_input (I# (len)) input+ = AlexLastAcc a input (I# (len))+ check_accs (AlexAccSkipPred pred : rest)+ | pred user orig_input (I# (len)) input+ = AlexLastSkip input (I# (len))+ check_accs (_ : rest) = check_accs rest++data AlexLastAcc a+ = AlexNone+ | AlexLastAcc a !AlexInput !Int+ | AlexLastSkip !AlexInput !Int++data AlexAcc a user+ = AlexAcc a+ | AlexAccSkip+ | AlexAccPred a (AlexAccPred user)+ | AlexAccSkipPred (AlexAccPred user)++type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool++-- -----------------------------------------------------------------------------+-- Predicates on a rule++alexAndPred p1 p2 user in1 len in2+ = p1 user in1 len in2 && p2 user in1 len in2++--alexPrevCharIsPred :: Char -> AlexAccPred _ +alexPrevCharIs c _ input _ _ = c == alexInputPrevChar input++--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ +alexPrevCharIsOneOf arr _ input _ _ = arr ! alexInputPrevChar input++--alexRightContext :: Int -> AlexAccPred _+alexRightContext (I# (sc)) user _ _ input = + case alex_scan_tkn user input 0# input sc AlexNone of+ (AlexNone, _) -> False+ _ -> True+ -- TODO: there's no need to find the longest+ -- match when checking the right context, just+ -- the first match will do.++-- used by wrappers+iUnbox (I# (i)) = i
+ Graphics/LambdaCube/Loader/Makefile view
@@ -0,0 +1,13 @@+all: + alex -o Generated/CompositorScriptScanner.hs -g CompositorScriptScanner.x+ alex -o Generated/MaterialScriptScanner.hs -g MaterialScriptScanner.x+ alex -o Generated/ResourceScriptScanner.hs -g ResourceScriptScanner.x+ alex -o Generated/OverlayScriptScanner.hs -g OverlayScriptScanner.x+ alex -o Generated/FontDefinitionScriptScanner.hs -g FontDefinitionScriptScanner.x++clean:+ rm -f Generated/CompositorScriptScanner.hi Generated/CompositorScriptScanner.o Generated/CompositorScriptScanner.hs+ rm -f Generated/MaterialScriptScanner.hi Generated/MaterialScriptScanner.o Generated/MaterialScriptScanner.hs+ rm -f Generated/ResourceScriptScanner.hi Generated/ResourceScriptScanner.o Generated/ResourceScriptScanner.hs+ rm -f Generated/OverlayScriptScanner.hi Generated/OverlayScriptScanner.o Generated/OverlayScriptScanner.hs+ rm -f Generated/FontDefinitionScriptScanner.hi Generated/FontDefinitionScriptScanner.o Generated/FontDefinitionScriptScanner.hs
+ Graphics/LambdaCube/Loader/MaterialScript.hs view
@@ -0,0 +1,712 @@+{-# LANGUAGE NoMonomorphismRestriction #-}+module Graphics.LambdaCube.Loader.MaterialScript (loadMaterial,parseMaterial) where++-- import the the library functions from uulib+import UU.Parsing+import UU.Scanner++import Data.Maybe+import Data.Either+import System.FilePath.Posix++import System.Log.Logger++import Graphics.LambdaCube.Loader.Generated.MaterialScriptScanner+import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Common+import Graphics.LambdaCube.BlendMode+import Graphics.LambdaCube.Light+import Graphics.LambdaCube.PixelFormat+import Graphics.LambdaCube.RenderSystem+import Graphics.LambdaCube.Material+import Graphics.LambdaCube.Technique+import Graphics.LambdaCube.Pass+import Graphics.LambdaCube.TextureUnitState+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.GpuProgram+import Graphics.LambdaCube.GpuProgramUsage+import Graphics.LambdaCube.GpuProgramParams+import Graphics.LambdaCube.Loader.ParserUtil++----------------------+-- Boilerplate code --+----------------------+{-+loadMaterial path file = do+ txt <- readFile file+ parseMaterial file txt++parseMaterial file txt = parseFile pMaterialScript tokenize file txt+-}++loadMaterial path file = do+ txt <- readFile file+ parseMaterial file txt++parseMaterial file txt+ = let res = parseTokens pMaterialScript (tokenize file txt)+ in case res of+ Left errs -> do+ mapM_ (errorM "MaterialScript") errs+ return Nothing+ Right tree -> return (Just tree)+ +type TokenParser a = Parser Token a++parseTokens :: TokenParser a -> [Token] -> Either [String] a+parseTokens p tks = if null msgs then final `seq` Right v else Left (map show msgs)+ where+ steps = parse p tks+ msgs = getMsgs steps+ (Pair v final) = evalSteps steps++-- * AST definitions++-- |Material Script+data (Texture t, GpuProgram p, LinkedGpuProgram lp) => MS_Attr t p lp+ = MS_material (Material t lp)+ | MS_vertexprogram (GpuProgramDescriptor p)+ | MS_fragmentprogram (GpuProgramDescriptor p)++-- |Material+data (Texture t, LinkedGpuProgram lp) => M_Attr t lp+ = M_technique (Technique t lp)+ | M_receiveshadows Bool+ | M_transparencycastsshadows Bool+ | M_loddistances [FloatType]+ | M_settexturealias String String++-- |Technique+data (Texture t, LinkedGpuProgram lp) => T_Attr t lp+ = T_pass (Pass t lp)+ | T_scheme String+ | T_lodindex Int+ | T_shadowcastermaterial String+ | T_shadowreceivermaterial String+ | T_gpuvendorrule IncludeOrExclude String+ | T_gpudevicerule IncludeOrExclude String Bool++-- |Pass+type Colour = Either ColourValue ()+data Texture t => P_Attr t+ = P_textureunit (TextureUnitState t)+ | P_vertexprogramref String [PR_Attr]+ | P_fragmentprogramref String [PR_Attr]+ | P_shadowcastervertexprogramref -- NOT SUPPORTED+ | P_shadowreceiververtexprogramref -- NOT SUPPORTED+ | P_shadowreceiverfragmentprogramref -- NOT SUPPORTED+ | P_ambient Colour+ | P_diffuse Colour+ | P_specular Colour FloatType+ | P_emissive Colour+ | P_sceneblend (SceneBlendFactor,SceneBlendFactor)+ | P_sceneblendop SceneBlendOperation+ | P_separatesceneblend ((SceneBlendFactor,SceneBlendFactor),(SceneBlendFactor,SceneBlendFactor))+ | P_separatesceneblendop SceneBlendOperation SceneBlendOperation+ | P_depthcheck Bool+ | P_depthwrite Bool+ | P_depthfunc CompareFunction+ | P_depthbias FloatType FloatType+ | P_iterationdepthbias FloatType+ | P_alpharejection CompareFunction Int+ | P_alphatocoverage Bool+ | P_lightscissor Bool+ | P_lightclipplanes Bool+ | P_illuminationstage IlluminationStage+ | P_normalisenormals Bool+ | P_transparentsorting Bool Bool+ | P_cullhardware CullingMode+ | P_cullsoftware ManualCullingMode+ | P_lighting Bool+ | P_shading ShadeOptions+ | P_polygonmode PolygonMode+ | P_polygonmodeoverrideable Bool+ | P_fogoverride Bool FogMode FloatType3 FloatType FloatType FloatType+ | P_colourwrite Bool+ | P_startlight Int+ | P_maxlights Int+ | P_iteration Int (Maybe Int) (Maybe LightTypes) -- ^ iteration count, n_light, light type+ | P_pointsize FloatType+ | P_pointsprites Bool+ | P_pointsizeattenuation Bool FloatType3+ | P_pointsizemin FloatType+ | P_pointsizemax FloatType++-- |TextureUnit+data TU_Attr+ = TU_texturealias String+ + -- texture <texturename> [<type>] [unlimited | numMipMaps] [alpha] [<PixelFormat>] [gamma]+ | TU_texture String TextureType TextureMipmap Bool PixelFormat Bool++ | TU_animtexture [String] FloatType+ | TU_cubictexture String String String String String String Bool+ | TU_bindingtype BindingType+ | TU_contenttype ContentType+ | TU_texcoordset Int+ | TU_texaddressmode TextureAddressingMode TextureAddressingMode TextureAddressingMode+ | TU_texbordercolour ColourValue+ | TU_filtering (FilterOptions,FilterOptions,FilterOptions)+ | TU_maxanisotropy Int+ | TU_mipmapbias FloatType+ | TU_colourop LayerBlendOperation+ | TU_colouropex LayerBlendOperationEx LayerBlendSource LayerBlendSource FloatType ColourValue ColourValue+ | TU_colouropmultipassfallback (SceneBlendFactor,SceneBlendFactor)+ | TU_alphaopex LayerBlendOperationEx LayerBlendSource LayerBlendSource FloatType FloatType FloatType+ | TU_envmap (Maybe EnvMapType)+ | TU_scroll FloatType FloatType+ | TU_scrollanim FloatType FloatType+ | TU_rotate FloatType+ | TU_rotateanim FloatType+ | TU_scale FloatType FloatType+ | TU_wavexform TextureTransformType WaveformType FloatType FloatType FloatType FloatType+ | TU_transform FloatType4 FloatType4 FloatType4 FloatType4++-- |Texture+data TX_Attr+ = TX_type TextureType+ | TX_mipmap TextureMipmap+ | TX_alpha+ | TX_pixelformat PixelFormat+ | TX_gamma++-- |Shader+data SH_Attr+ = SH_source String+ | SH_attach [String]+ | SH_includesskeletalanimation Bool+ | SH_includesmorphanimation Bool+ | SH_includesposeanimation Int+ | SH_usesvertextexturefetch Bool+ | SH_usesadjacencyinformation Bool+ | SH_entrypoint String+ | SH_profiles [String]+ | SH_target String+ | SH_delegate String+ | SH_defaultparams [PR_Attr]+ +data PR_Attr+ = PR_paramnamed String String [FloatType]+ | PR_paramnamedauto String AutoConstantType [FloatType]+ | PR_paramindexed Int String [FloatType]+ | PR_paramindexedauto Int AutoConstantType [FloatType]++-- * Material script top level parser combinators++pMaterialScript = mkMaterialScript <$> pList pMaterialScriptContent+mkMaterialScript l = (mats,vertprogs,fragprogs)+ where+ mats = [x | MS_material x <- l]+ vertprogs = [x | MS_vertexprogram x <- l]+ fragprogs = [x | MS_fragmentprogram x <- l]++pMaterialScriptContent = (MS_material .) . mkMaterial <$= "material" <*> pName <*= "{" <*> pList pMaterialContent <*= "}"+ <|> ((MS_vertexprogram .) .) . (mkGpuProgramDesc GPT_VERTEX_PROGRAM) <$= "vertex_program" <*> pName <*> pName <*= "{" <*> pList pProgramContent <*= "}"+ <|> ((MS_fragmentprogram .) .) . (mkGpuProgramDesc GPT_FRAGMENT_PROGRAM) <$= "fragment_program" <*> pName <*> pName <*= "{" <*> pList pProgramContent <*= "}"++-- * Material+pMaterialContent = (M_technique .) . mkTechnique <$= "technique" <*> (pName <|> pSucceed "") <*= "{" <*> pList pTechniqueContent <*= "}"+ <|> M_loddistances <$= "lod_distances" <*> pList pFloat+ <|> M_receiveshadows <$= "receive_shadows" <*> pOnOff+ <|> M_transparencycastsshadows <$= "transparency_casts_shadows" <*> pOnOff+ <|> M_settexturealias <$= "set_texture_alias" <*> pName <*> pName++mkMaterial name l = Material+ { mtName = name+-- , mtLodDistances = def [] [x | M_loddistances x <- l]+ , mtReceiveShadows = def True [x | M_receiveshadows x <- l]+ , mtTransparencyCastsShadows = def False [x | M_transparencycastsshadows x <- l]+ --, mtTextureAlias = [(a,b) | M_settexturealias a b <- l]+ , mtTechniques = [x | M_technique x <- l]+---------------+ , mtSupportedTechniques = Nothing+ , mtUserLodValues = []+ , mtLodValues = []+ , mtUnsupportedReasons = ""+ }++-- * Technique+pTechniqueContent = (T_pass .) . mkPass <$= "pass" <*> (pName <|> pSucceed "") <*= "{" <*> pList pPassContent <*= "}"+ <|> T_scheme <$= "scheme" <*> pName+ <|> T_lodindex <$= "lod_index" <*> pInt+ <|> T_shadowcastermaterial <$= "shadow_caster_material" <*> pName+ <|> T_shadowreceivermaterial <$= "shadow_receiver_material" <*> pName+ <|> T_gpuvendorrule <$= "gpu_vendor_rule" <*> pEnum ruleopVals <*> pName+ <|> T_gpudevicerule <$= "gpu_device_rule" <*> pEnum ruleopVals <*> pName <*> (True <$= "case_sensitive" <|> pSucceed False)++mkTechnique n l = Technique+ -- TODO+ { tchName = n+ -- TODO+ , tchSchemeIndex = 0 --def "Default" [x | T_scheme x <- l]+ , tchLodIndex = def 0 [x | T_lodindex x <- l]+-- , tchShadowCasterMaterial = def "" [x | T_shadowcastermaterial x <- l]+-- , tchShadowReceiverMaterial = def "" [x | T_shadowreceivermaterial x <- l]+-- , tchGPUVendorRules = [GPUVendorRule (a,b) | T_gpuvendorrule a b <- l]+-- , tchGPUDeviceNameRules = [(a,b,c) | T_gpudevicerule a b c <- l]+ , tchPasses = [x | T_pass x <- l]+-------------------+ , tchGPUVendorRules = []+ , tchGPUDeviceNameRules = []++ }++-- * Pass+pPassContent = (P_textureunit .) . mkTextureUnitState <$= "texture_unit" <*> (pName <|> pSucceed "") <*= "{" <*> pList pTextureUnitContent <*= "}"+ <|> P_vertexprogramref <$= "vertex_program_ref" <*> pName <*= "{" <*> pList pParamContent <*= "}"+ <|> P_fragmentprogramref <$= "fragment_program_ref" <*> pName <*= "{" <*> pList pParamContent <*= "}"+ <|> P_shadowcastervertexprogramref <$= "shadow_caster_vertex_program_ref" <* pName <*= "{" <* pList pParamContent <*= "}"+ <|> P_shadowreceiververtexprogramref <$= "shadow_receiver_vertex_program_ref" <* pName <*= "{" <* pList pParamContent <*= "}"+ <|> P_shadowreceiverfragmentprogramref <$= "shadow_receiver_fragment_program_ref" <* pName <*= "{" <* pList pParamContent <*= "}"+ <|> P_ambient <$= "ambient" <*> pColour 1+ <|> P_diffuse <$= "diffuse" <*> pColour 1+ <|> P_specular <$= "specular" <*> pColour 0 <*> pFloat+ <|> P_emissive <$= "emissive" <*> pColour 0+ <|> P_sceneblendop <$= "scene_blend_op" <*> pEnum blendopVals+-- <|> P_sceneblend (convertSBTtoSBF SBT_MODULATE) <$= "scene_blend" <*= "modulate"+ <|> P_sceneblend . convertSBTtoSBF <$= "scene_blend" <*> pEnum sceneblendVals+ <|> curry P_sceneblend <$= "scene_blend" <*> pEnum blendVals <*> pEnum blendVals+ <|> P_separatesceneblendop <$= "separate_scene_blend_op" <*> pEnum blendopVals <*> pEnum blendopVals+ <|> curry P_separatesceneblend <$= "separate_scene_blend" <*> (convertSBTtoSBF <$> pEnum sceneblendVals) <*> (convertSBTtoSBF <$> pEnum sceneblendVals)+ <|> (\a b c d -> P_separatesceneblend ((a,b),(c,d))) <$= "separate_scene_blend" <*> pEnum blendVals <*> pEnum blendVals <*> pEnum blendVals <*> pEnum blendVals+ <|> P_depthcheck <$= "depth_check" <*> pOnOff+ <|> P_depthwrite <$= "depth_write" <*> pOnOff+ <|> P_depthfunc <$= "depth_func" <*> pEnum cmpfuncVals+ <|> P_depthbias <$= "depth_bias" <*> pFloat <*> (pFloat <|> pSucceed 0)+ <|> P_iterationdepthbias <$= "iteration_depth_bias" <*> pFloat+ <|> P_alpharejection <$= "alpha_rejection" <*> pEnum cmpfuncVals <*> pInt+ <|> P_alphatocoverage <$= "alpha_to_coverage" <*> pOnOff+ <|> P_lightscissor <$= "light_scissor" <*> pOnOff+ <|> P_lightclipplanes <$= "light_clip_planes" <*> pOnOff+ <|> P_illuminationstage <$= "illumination_stage" <*> pEnum illumstageVals+ <|> P_normalisenormals <$= "normalise_normals" <*> pOnOff+ <|> P_transparentsorting <$= "transparent_sorting" <*= "force" <*> pSucceed True <*> pSucceed True+ <|> P_transparentsorting <$= "transparent_sorting" <*> pOnOff <*> pSucceed False+ <|> P_cullhardware <$= "cull_hardware" <*> pEnum cullhwVals+ <|> P_cullsoftware <$= "cull_software" <*> pEnum cullswVals+ <|> P_lighting <$= "lighting" <*> pOnOff+ <|> P_shading <$= "shading" <*> pEnum shadingVals+ <|> P_polygonmode <$= "polygon_mode" <*> pEnum polymodeVals+ <|> P_polygonmodeoverrideable <$= "polygon_mode_overrideable" <*> pOnOff+ + <|> P_fogoverride False <$= "fog_override" <*= "false" <*> pSucceed FOG_NONE <*> pSucceed (0,0,0) <*> pSucceed 0 <*> pSucceed 0 <*> pSucceed 0+ <|> P_fogoverride True <$= "fog_override" <*= "true" <*> pSucceed FOG_NONE <*> pSucceed (0,0,0) <*> pSucceed 0 <*> pSucceed 0 <*> pSucceed 0+ <|> P_fogoverride True <$= "fog_override" <*= "true" <*> (FOG_NONE <$= "none") <*> pSucceed (0,0,0) <*> pSucceed 0 <*> pSucceed 0 <*> pSucceed 0+ <|> P_fogoverride True <$= "fog_override" <*= "true" <*> pEnum fogmodeVals <*> pFloat3 <*> pFloat <*> pFloat <*> pFloat+ + <|> P_colourwrite <$= "colour_write" <*> pOnOff+ <|> P_startlight <$= "start_light" <*> pInt+ <|> P_maxlights <$= "max_lights" <*> pInt+ + -- Format 1: iteration <once | once_per_light> [lightType]+ -- Format 2: iteration <number> [<per_light> [lightType]]+ -- Format 3: iteration <number> [<per_n_lights> <num_lights> [lightType]]+ -- lights of a single type (either 'point', 'directional' or 'spot').+ <|> P_iteration 1 Nothing <$= "iteration" <*= "once" <*> (Just <$> pEnum lighttypeVals <|> pSucceed Nothing)+ <|> P_iteration 1 (Just 1) <$= "iteration" <*= "once_per_light" <*> (Just <$> pEnum lighttypeVals <|> pSucceed Nothing)+ <|> (\n -> P_iteration n (Just 1)) <$= "iteration" <*> pInt <*= "per_light" <*> (Just <$> pEnum lighttypeVals <|> pSucceed Nothing)+ <|> P_iteration <$= "iteration" <*> pInt <*= "per_n_light" <*> (Just <$> pInt) <*> (Just <$> pEnum lighttypeVals <|> pSucceed Nothing)+ <|> P_iteration <$= "iteration" <*> pInt <*> pSucceed Nothing <*> pSucceed Nothing + + <|> P_pointsize <$= "point_size" <*> pFloat+ <|> P_pointsprites <$= "point_sprites" <*> pOnOff+ <|> P_pointsizeattenuation <$= "point_size_attenuation" <*> pOnOff <*> (pFloat3 <|> pSucceed (1,0,0))+ <|> P_pointsizemin <$= "point_size_min" <*> pFloat+ <|> P_pointsizemax <$= "point_size_max" <*> pFloat++mkPass n l = Pass+ { psName = n++ , psAmbient = def (1,1,1,1) $ lefts $ [x | P_ambient x <- l] + , psDiffuse = def (1,1,1,1) $ lefts $ [x | P_diffuse x <- l]+ , psSpecular = def (0,0,0,0) $ lefts $ [x | P_specular x _ <- l]+ , psEmissive = def (0,0,0,0) $ lefts $ [x | P_emissive x <- l]+ , psShininess = def 0 [x | P_specular _ x <- l]++ , psTracking = def (TrackVertexColourType False False False False)+ [ TrackVertexColourType+ (null $ lefts $ [x | P_ambient x <- l])+ (null $ lefts $ [x | P_diffuse x <- l])+ (null $ lefts $ [x | P_specular x _ <- l])+ (null $ lefts $ [x | P_emissive x <- l])+ ]++ , psSourceBlendFactor = def SBF_ONE $ [x | P_separatesceneblend ((x,_),_) <- l] ++ [x | P_sceneblend (x,_) <- l]+ , psDestBlendFactor = def SBF_ZERO $ [x | P_separatesceneblend ((_,x),_) <- l] ++ [x | P_sceneblend (_,x) <- l]+ , psSourceBlendFactorAlpha = def SBF_ONE [x | P_separatesceneblend (_,(x,_)) <- l]+ , psDestBlendFactorAlpha = def SBF_ZERO [x | P_separatesceneblend (_,(_,x)) <- l]++ , psSeparateBlend = (not . null) [() | P_separatesceneblend _ <- l]++ , psBlendOperation = def SBO_ADD $ [x | P_separatesceneblendop x _ <- l] ++ [x | P_sceneblendop x <- l]+ , psAlphaBlendOperation = def SBO_ADD [x | P_separatesceneblendop _ x <- l]+ , psSeparateBlendOperation = (not . null) [() | P_separatesceneblendop _ _ <- l]++ , psDepthCheck = def True [x | P_depthcheck x <- l]+ , psDepthWrite = def True [x | P_depthwrite x <- l]+ , psDepthFunc = def CMPF_LESS_EQUAL [x | P_depthfunc x <- l]+ , psDepthBiasConstant = def 0 [x | P_depthbias x _ <- l]+ , psDepthBiasSlopeScale = def 0 [x | P_depthbias _ x <- l]+ , psDepthBiasPerIteration = def 0 [x | P_iterationdepthbias x <- l]++ , psColourWrite = def True [x | P_colourwrite x <- l]++ , psAlphaRejectFunc = def CMPF_ALWAYS_PASS [x | P_alpharejection x _ <- l]+ , psAlphaRejectVal = def 0 [x | P_alpharejection _ x <- l]+ , psAlphaToCoverageEnabled = def False [x | P_alphatocoverage x <- l]+++ , psTransparentSorting = def True [x | P_transparentsorting x _ <- l]+ , psTransparentSortingForced = def False [x | P_transparentsorting _ x <- l]++ , psCullMode = def CULL_CLOCKWISE [x | P_cullhardware x <- l]+ , psManualCullMode = def MANUAL_CULL_BACK [x | P_cullsoftware x <- l]++ , psLightingEnabled = def True [x | P_lighting x <- l]+ , psMaxSimultaneousLights = def 0 [x | P_maxlights x <- l]+ , psStartLight = def 0 [x | P_startlight x <- l]+ , psLightsPerIteration = def Nothing [x | P_iteration _ x _ <- l]+ , psOnlyLightType = def Nothing [x | P_iteration _ _ x <- l]++ , psShadeOptions = def SO_GOURAUD [x | P_shading x <- l]+ , psPolygonMode = def PM_SOLID [x | P_polygonmode x <- l]++ , psNormaliseNormals = def False [x | P_normalisenormals x <- l]+ , psPolygonModeOverrideable = def True [x | P_polygonmodeoverrideable x <- l]++ , psFogOverride = def False [x | P_fogoverride x _ _ _ _ _ <- l]+ , psFogMode = def FOG_NONE [x | P_fogoverride _ x _ _ _ _ <- l]+ , psFogColour = def (0,0,0,0) [(r,g,b,1) | P_fogoverride _ _ (r,g,b) _ _ _ <- l]+ , psFogStart = def 0 [x | P_fogoverride _ _ _ _ x _ <- l]+ , psFogEnd = def 0 [x | P_fogoverride _ _ _ _ _ x <- l]+ , psFogDensity = def 0 [x | P_fogoverride _ _ _ x _ _ <- l]++ , psTextureUnitStates = [x | P_textureunit x <- l]++ , psVertexProgramUsage = def Nothing [Just $ GpuProgramUsage x | P_vertexprogramref x _ <- l] -- TODO+ , psFragmentProgramUsage = def Nothing [Just $ GpuProgramUsage x | P_fragmentprogramref x _ <- l] -- TODO+ , psGeometryProgramUsage = Nothing -- TODO+ , psLinkedGpuProgram = Nothing++ , psPassIterationCount = def 1 [x | P_iteration x _ _ <- l]++ , psPointSize = def 0 [x | P_pointsize x <- l]+ , psPointMinSize = def 0 [x | P_pointsizemin x <- l]+ , psPointMaxSize = def 0 [x | P_pointsizemax x <- l]+ , psPointSpritesEnabled = def False [x | P_pointsprites x <- l]+ , psPointAttenuationEnabled = def False [x | P_pointsizeattenuation x _ <- l]+ , psPointAttenuationCoeffs = def (0,0,0) [x | P_pointsizeattenuation _ x <- l]++ , psLightScissoring = def False [x | P_lightscissor x <- l]+ , psLightClipPlanes = def False [x | P_lightclipplanes x <- l]+ , psIlluminationStage = def IS_UNKNOWN [x | P_illuminationstage x <- l]+ }++-- * Texture+pTextureContent = TX_type <$> pEnum textypeVals+ <|> TX_mipmap <$> (pKey "unlimited" *> pSucceed MIP_UNLIMITED <|> MIP_NUMBER <$> pInt)+ <|> TX_alpha <$= "alpha"+ <|> TX_pixelformat <$> pEnum pixelformatVals+ <|> TX_gamma <$= "gamma"+ +-- * TextureUnit+pTextureUnitContent = TU_texturealias <$= "texture_alias" <*> pName+ -- Format: texture <texturename> [<type>] [unlimited | numMipMaps] [alpha] [<PixelFormat>] [gamma]+ <|> mkTU_Texture <$= "texture" <*> pName <*> pList pTextureContent+ -- Format1 (short): anim_texture <base_name> <num_frames> <duration>+-- <|> mkTU_animtexture <$= "anim_texture" <*> pName <*> pInt <*> pFloat+ -- Format2 (long): anim_texture <frame1> <frame2> ... <duration>+-- <|> TU_animtexture <$= "anim_texture" <*> pList pName <*> pFloat+ <|> (\a b -> TU_animtexture b a) <$= "anim_texture" <*> pFloat <*> pList pName++ -- Format2 (long): cubic_texture <front> <back> <left> <right> <up> <down> separateUV+ <|> TU_cubictexture <$= "cubic_texture" <*> pName <*> pName <*> pName <*> pName <*> pName <*> pName <*= "separateUV" <*> pSucceed False+ -- Format1 (short): cubic_texture <base_name> <combinedUVW|separateUV>+ <|> mkTU_cubictexture <$= "cubic_texture" <*> pName <*> (True <$= "combinedUVW" <|> False <$= "separateUV" )++ <|> TU_bindingtype <$= "binding_type" <*> pEnum btyVals+ <|> TU_contenttype <$= "content_type" <*> pEnum ctyVals+ <|> TU_texcoordset <$= "tex_coord_set" <*> pInt++ -- Extended Format: tex_address_mode <u_mode> <v_mode> [<w_mode>] + <|> TU_texaddressmode <$= "tex_address_mode" <*> pEnum texaddressVals <*> pEnum texaddressVals <*> (pEnum texaddressVals <|> pSucceed TAM_WRAP)+ -- Simple Format: tex_address_mode <uvw_mode> + <|> (\a -> TU_texaddressmode a a a) <$= "tex_address_mode" <*> pEnum texaddressVals+ + <|> TU_texbordercolour <$= "tex_border_colour" <*> pRGBOrRGBA 1++ -- Format: filtering <minification> <magnification> <mip>+ <|> (\a b c -> TU_filtering (a,b,c)) <$= "filtering" <*> pEnum filteringVals <*> pEnum filteringVals <*> pEnum filteringVals+ -- Format: filtering <none|bilinear|trilinear|anisotropic>+ <|> TU_filtering <$= "filtering" <*> pEnum texfilteringVals+ + <|> TU_maxanisotropy <$= "max_anisotropy" <*> pInt+ <|> TU_mipmapbias <$= "mipmap_bias" <*> pFloat+ <|> TU_colourop <$= "colour_op" <*> pEnum copVals+ + -- Format: colour_op_ex <operation> <source1> <source2> [<manual_factor>] [<manual_colour1>] [<manual_colour2>]+ <|> TU_colouropex <$= "colour_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pFloat <*> pFloat4 <*> pFloat4 + <|> TU_colouropex <$= "colour_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pFloat <*> pFloat4 <*> pSucceed (1,1,1,1) + <|> TU_colouropex <$= "colour_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pFloat <*> pSucceed (1,1,1,1) <*> pSucceed (1,1,1,1) + <|> TU_colouropex <$= "colour_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pSucceed 0 <*> pSucceed (1,1,1,1) <*> pSucceed (1,1,1,1) + + -- Format: colour_op_multipass_fallback <src_factor> <dest_factor>+ <|> TU_colouropmultipassfallback . convertSBTtoSBF <$= "colour_op_multipass_fallback" <*> pEnum sceneblendVals+ <|> curry TU_colouropmultipassfallback <$= "colour_op_multipass_fallback" <*> pEnum blendVals <*> pEnum blendVals+ + <|> TU_alphaopex <$= "alpha_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pFloat <*> pFloat <*> pFloat + <|> TU_alphaopex <$= "alpha_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pFloat <*> pFloat <*> pSucceed 1+ <|> TU_alphaopex <$= "alpha_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pFloat <*> pSucceed 1 <*> pSucceed 1+ <|> TU_alphaopex <$= "alpha_op_ex" <*> pEnum layerblendopexVals <*> pEnum layerblendsrcVals <*> pEnum layerblendsrcVals <*> pSucceed 0 <*> pSucceed 1 <*> pSucceed 1+ + -- Format: env_map <off|spherical|planar|cubic_reflection|cubic_normal>+ <|> TU_envmap <$= "env_map" <*> pEnum envmapVals+ <|> TU_scroll <$= "scroll" <*> pFloat <*> pFloat+ <|> TU_scrollanim <$= "scroll_anim" <*> pFloat <*> pFloat+ <|> TU_rotate <$= "rotate" <*> pFloat+ <|> TU_rotateanim <$= "rotate_anim" <*> pFloat+ <|> TU_scale <$= "scale" <*> pFloat <*> pFloat+ + -- Format: wave_xform <xform_type> <wave_type> <base> <frequency> <phase> <amplitude>+ <|> TU_wavexform <$= "wave_xform" <*> pEnum xformtypeVals <*> pEnum wavetypeVals <*> pFloat <*> pFloat <*> pFloat <*> pFloat+ <|> TU_transform <$= "transform" <*> pFloat4 <*> pFloat4 <*> pFloat4 <*> pFloat4+ where+ mkTU_Texture n l = TU_texture n t m a p g+ where+ t = def TEX_TYPE_2D [x | TX_type x <- l]+ m = def MIP_UNLIMITED [x | TX_mipmap x <- l]+ a = def False [True | TX_alpha <- l]+ p = def PF_UNKNOWN [x | TX_pixelformat x <- l]+ g = def False [True | TX_gamma <- l]+ f a e = (dropExtensions a) ++ e ++ (takeExtensions a)+ mkTU_cubictexture n True = TU_cubictexture n n n n n n True+ mkTU_cubictexture n False = TU_cubictexture (f n "_fr") (f n "_bk") (f n "_up") (f n "_dn") (f n "_lf") (f n "_rt") False+ -- Format1 (short): anim_texture <base_name> <num_frames> <duration>+ mkTU_animtexture basename numframes duration = TU_animtexture [f basename $ show i | i <- [0..(numframes-1)]] duration++{-+ -- texture <texturename> [<type>] [unlimited | numMipMaps] [alpha] [<PixelFormat>] [gamma]+ | TU_texture String TextureType TextureMipmap Bool PixelFormat Bool+-} +mkTextureUnitState n l = TextureUnitState+ { tusAnimDuration = def Nothing [Just x | TU_animtexture _ x <- l]+ , tusCubic = def False $ [TEX_TYPE_CUBE_MAP==x | TU_texture _ x _ _ _ _ <- l] ++ [True | TU_cubictexture _ _ _ _ _ _ _ <- l]+ + , tusTextureType = def TEX_TYPE_2D $ [x | TU_texture _ x _ _ _ _ <- l] ++ [TEX_TYPE_CUBE_MAP | TU_cubictexture _ _ _ _ _ _ _ <- l]+ , tusDesiredFormat = def PF_UNKNOWN [x | TU_texture _ _ _ _ x _ <- l]+ , tusTextureSrcMipmaps = def MIP_DEFAULT [x | TU_texture _ _ x _ _ _ <- l]++ , tusTextureCoordSetIndex = def 0 [x | TU_texcoordset x <- l]+ , tusAddressMode = def (UVWAddressingMode TAM_WRAP TAM_WRAP TAM_WRAP)+ [UVWAddressingMode a b c | TU_texaddressmode a b c <- l]+ , tusBorderColour = def (0,0,0,1) [x | TU_texbordercolour x <- l]++ , tusColourBlendMode = def cblendmode [LayerBlendModeEx LBT_COLOUR op src1 src2 c1 c2 1 1 f | TU_colouropex op src1 src2 f c1 c2 <- (l ++ colouropex)]+ , tusColourBlendFallbackSrc = def SBF_DEST_COLOUR [x | TU_colouropmultipassfallback (x,_) <- (l ++ fallbackop)]+ , tusColourBlendFallbackDest = def SBF_ZERO [x | TU_colouropmultipassfallback (_,x) <- (l ++ fallbackop)]++ , tusAlphaBlendMode = def ablendmode [LayerBlendModeEx LBT_ALPHA op src1 src2 white white a1 a2 f | TU_alphaopex op src1 src2 f a1 a2 <- l]+ , tusIsAlpha = def False [x | TU_texture _ _ _ x _ _ <- l]+ , tusHwGamma = def False [x | TU_texture _ _ _ _ _ x <- l]++ , tusUMod = def 0 [x | TU_scroll x _ <- l]+ , tusVMod = def 0 [x | TU_scroll _ x <- l]+ , tusUScale = def 1 [x | TU_scale x _ <- l]+ , tusVScale = def 1 [x | TU_scale _ x <- l]+ , tusRotate = def 0 [x | TU_rotate x <- l]++ , tusMinFilter = def FO_LINEAR [x | TU_filtering (x,_,_) <- l]+ , tusMagFilter = def FO_LINEAR [x | TU_filtering (_,x,_) <- l]+ , tusMipFilter = def FO_POINT [x | TU_filtering (_,_,x) <- l]+ + , tusMaxAniso = def 1 [x | TU_maxanisotropy x <- l]+ , tusMipmapBias = def 0 [x | TU_mipmapbias x <- l]++ , tusBindingType = def BT_FRAGMENT [x | TU_bindingtype x <- l]+ , tusContentType = def CONTENT_NAMED [x | TU_contenttype x <- l]+++ , tusFrameNames = animFrames ++ cubeFrames ++ [n | TU_texture n _ _ _ _ _ <- l]+ , tusFrames = Nothing+ , tusName = n+ , tusTextureAlias = def "" [x | TU_texturealias x <- l]+ , tusEffects = [e | Just e <- map mkEffect l]+ }+ where+ white = (1,1,1,1)+ colourop = def LBO_MODULATE [x | TU_colourop x <- l]+ animFrames = concat [x | TU_animtexture x _ <- l]+ cubeFrames = concat [[a,b,c,d,e,f] | TU_cubictexture a b c d e f _ <- l]+ fallbackop = case colourop of+ { LBO_REPLACE -> [TU_colouropmultipassfallback (SBF_ONE, SBF_ZERO)]+ ; LBO_ADD -> [TU_colouropmultipassfallback (SBF_ONE, SBF_ONE)]+ ; LBO_MODULATE -> [TU_colouropmultipassfallback (SBF_DEST_COLOUR, SBF_ZERO)]+ ; LBO_ALPHA_BLEND -> [TU_colouropmultipassfallback (SBF_SOURCE_ALPHA, SBF_ONE_MINUS_SOURCE_ALPHA)]+ }+ colouropex = case colourop of+ { LBO_REPLACE -> [TU_colouropex LBX_SOURCE1 LBS_TEXTURE LBS_CURRENT 0 white white]+ ; LBO_ADD -> [TU_colouropex LBX_ADD LBS_TEXTURE LBS_CURRENT 0 white white]+ ; LBO_MODULATE -> [TU_colouropex LBX_MODULATE LBS_TEXTURE LBS_CURRENT 0 white white]+ ; LBO_ALPHA_BLEND -> [TU_colouropex LBX_BLEND_TEXTURE_ALPHA LBS_TEXTURE LBS_CURRENT 0 white white]+ }+ cblendmode = LayerBlendModeEx+ { lbBlendType = LBT_COLOUR+ , lbOperation = LBX_MODULATE+ , lbSource1 = LBS_TEXTURE+ , lbSource2 = LBS_CURRENT+ , lbColourArg1 = white+ , lbColourArg2 = white+ , lbAlphaArg1 = 1+ , lbAlphaArg2 = 1+ , lbFactor = 0+ }+ ablendmode = LayerBlendModeEx+ { lbBlendType = LBT_ALPHA+ , lbOperation = LBX_MODULATE+ , lbSource1 = LBS_TEXTURE+ , lbSource2 = LBS_CURRENT+ , lbColourArg1 = white+ , lbColourArg2 = white+ , lbAlphaArg1 = 1+ , lbAlphaArg2 = 1+ , lbFactor = 0+ }+ mkEffect e = case e of + { TU_envmap _ -> Just $ TextureEffect+ { teType = ET_ENVIRONMENT_MAP+ , teSubType = 0+ , teArg1 = 0+ , teArg2 = 0+ , teWaveType = WFT_SINE+ , teBase = 0+ , teFrequency = 0+ , tePhase = 0+ , teAmplitude = 0+ }+-- ; TU_scrollanim+-- ; TU_rotateanim+-- ; TU_wavexform+-- ; TU_transform+ ; _ -> Nothing+ }+ {-+ void TextureUnitState::setEnvironmentMap(bool enable, EnvMapType envMapType)+ {+ if (enable)+ {+ TextureEffect eff;+ eff.type = ET_ENVIRONMENT_MAP;++ eff.subtype = envMapType;+ addEffect(eff);+ }+ else+ {+ removeEffect(ET_ENVIRONMENT_MAP);+ }+ }+ case ScriptCompiler::ID_OFF:+ mUnit->setEnvironmentMap(false);+ break;+ case ID_SPHERICAL:+ mUnit->setEnvironmentMap(true, TextureUnitState::ENV_CURVED);+ break;+ case ID_PLANAR:+ mUnit->setEnvironmentMap(true, TextureUnitState::ENV_PLANAR);+ break;+ case ID_CUBIC_REFLECTION:+ mUnit->setEnvironmentMap(true, TextureUnitState::ENV_REFLECTION);+ break;+ case ID_CUBIC_NORMAL:+ mUnit->setEnvironmentMap(true, TextureUnitState::ENV_NORMAL);+ break;++ | TU_envmap (Maybe EnvMapType)+ | TU_scrollanim FloatType FloatType+ | TU_rotateanim FloatType+ | TU_wavexform TextureTransformType WaveformType FloatType FloatType FloatType FloatType+ | TU_transform FloatType4 FloatType4 FloatType4 FloatType4++ = TextureEffect+ { teType :: TextureEffectType+ , teSubType :: Int+ , teArg1 :: FloatType+ , teArg2 :: FloatType+ , teWaveType :: WaveformType+ , teBase :: FloatType+ , teFrequency :: FloatType+ , tePhase :: FloatType+ , teAmplitude :: FloatType+ }+ -}++-- * Shaders+pProgramContent = SH_source <$= "source" <*> pName+ <|> SH_attach <$= "attach" <*> pList pName+ <|> SH_includesskeletalanimation <$= "includes_skeletal_animation" <*> pBool+ <|> SH_includesmorphanimation <$= "includes_morph_animation" <*> pBool+ <|> SH_includesposeanimation <$= "includes_pose_animation" <*> pInt+ <|> SH_usesvertextexturefetch <$= "uses_vertex_texture_fetch" <*> pBool+ <|> SH_usesadjacencyinformation <$= "uses_adjacency_information" <*> pBool+ <|> SH_entrypoint <$= "entry_point" <*> pName+ <|> SH_profiles <$= "profiles" <*> pList pName+ <|> SH_target <$= "target" <*> pName+ <|> SH_delegate <$= "delegate" <*> pName+-- <|> pPreprocessorDefines+ <|> SH_defaultparams <$= "default_params" <*= "{" <*> pList pParamContent <*= "}"++--pPreprocessorDefines = (\_ d -> []) <$> pKey "preprocessor_defines" <*> pName -- TODO: parse defines correctly not with pName++--format: param_indexed <index> <type> <value>+--format: param_indexed_auto <index> <value_code> <extra_params>+--format: param_named <name> <type> <value>+--format: param_named_auto <name> <value_code> <extra_params>+--The value of 'type' can be float4, matrix4x4, float<n>, int4, int<n>++--("matrix4x4", 16, pFloat)+--("float" , 1 , pFloat)+--("int" , 1 , pInt)+--[("float" ++ show i,i,pFloat) | i <- [1..32]]+--[("int" ++ show i,i,pInt) | i <- [1..32]]+autoparamVals = [(n,v) | (v,n,_,_,_) <- autoConstantDictionary]+pParamContent = PR_paramnamed <$= "param_named" <*> pName <*> pVarid <*> pList pFloat+ <|> PR_paramnamedauto <$= "param_named_auto" <*> pName <*> pEnum autoparamVals <*> pList pFloat+ <|> PR_paramindexed <$= "param_indexed" <*> pInt <*> pVarid <*> pList pFloat+ <|> PR_paramindexedauto <$= "param_indexed_auto" <*> pInt <*> pEnum autoparamVals <*> pList pFloat+++mkGpuProgramDesc t name s l = GpuProgramDescriptor+ { gpdName = name+ , gpdType = t+ , gpdFilename = def "" [x | SH_source x <- l]+ , gpdSyntaxCode = s+ , gpdAttach = def [] [x | SH_attach x <- l]+ , gpdSkeletalAnimation = def False [x | SH_includesskeletalanimation x <- l]+ , gpdMorphAnimation = def False [x | SH_includesmorphanimation x <- l]+ , gpdPoseAnimation = def 0 [x | SH_includesposeanimation x <- l]+ , gpdVertexTextureFetch = def False [x | SH_usesvertextexturefetch x <- l]+ , gpdNeedsAdjacencyInfo = def False [x | SH_usesadjacencyinformation x <- l]+-- , gpdDefaultParams :: GpuProgramParameters -- ^ The default parameters for use with this object+-- , gpdCompileError = False+ + , gpdGpuProgram = Nothing+ }++{-+fragment_program is same:+vertex_program myExteranalGLSLFunction1 glsl+{+ source myExternalGLSLfunction1.txt++ default_params+ {+ param_named_auto lightPosition light_position_object_space 0+ param_named_auto eyePosition camera_position_object_space+ param_named_auto worldViewProj worldviewproj_matrix+ param_named shininess float 10 + }++ preprocessor_defines CLEVERTECHNIQUE,NUMTHINGS=2+ attach myExteranalGLSLFunction1 myExteranalGLSLFunction2+}+-}
+ Graphics/LambdaCube/Loader/MaterialScriptScanner.x view
@@ -0,0 +1,115 @@+{+-- alex scanner for use with uulib+-- compile with alex -o Scanner.hs -g Scanner.x+module Graphics.LambdaCube.Loader.Generated.MaterialScriptScanner(tokenize) where++import UU.Scanner+}++$litChar = [^[\" \\]]+$identChar = [a-zA-Z0-9_\.\-\/\~\[\]]+++tokens :-+ $white+ ; -- whitespace+ "//".* ; -- comment++ \" ($litChar | \\ \\ | \\ \" )* \" { valueToken TkString } -- string+ (\+ | \-)?[0-9]+ { valueToken TkInteger10 } -- int+ (\+ | \-)?[0-9]+\.[0-9]+ { valueToken TkFraction } -- float+ + ( + on | off | true | false | force |+ material | technique | pass | texture_unit |+ lod_distances | receive_shadows | transparency_casts_shadows | set_texture_alias |+ scheme | lod_index | lod_distances | shadow_caster_material | shadow_receiver_material | + gpu_vendor_rule | gpu_device_rule | include | exclude | case_sensitive |+ ambient | vertexcolour | diffuse | specular | emissive | scene_blend |+ add | modulate | alpha_blend | colour_blend |+ one | zero | dest_colour | src_colour | one_minus_dest_colour | one_minus_src_colour | dest_alpha | src_alpha | one_minus_dest_alpha | one_minus_src_alpha |+ separate_scene_blend | depth_check | depth_write | depth_func | + always_fail | always_pass | less | less_equal | equal | not_equal | greater_equal | greater |+ depth_bias | iteration_depth_bias | alpha_rejection | alpha_to_coverage | light_scissor | light_clip_planes |+ illumination_stage | per_light | decal | normalise_normals | transparent_sorting | cull_hardware |+ clockwise | anticlockwise | none | cull_software | back | front | lighting | shading | + flat | gouraud | phong | polygon_mode | solid | wireframe | points |+ polygon_mode_overrideable | fog_override | exp | exp2 | colour_write | start_light | max_lights | iteration |+ once | once_per_light | directional | spot | point_size | point_sprites | point_size_attenuation | + point_size_min | point_size_max | texture_alias | texture | unlimited | alpha | gamma | + 1d | 2d | 3d | cubic |+ PF_L8 | PF_L16 | PF_A8 | PF_A4L4 | PF_BYTE_LA | PF_R5G6B5 | PF_B5G6R5 | PF_R3G3B2 | PF_A4R4G4B4 | PF_A1R5G5B5 | PF_R8G8B8 | PF_B8G8R8 | PF_A8R8G8B8 | PF_A8B8G8R8 | PF_B8G8R8A8 |+ PF_R8G8B8A8 | PF_X8R8G8B8 | PF_X8B8G8R8 | PF_A2R10G10B10 | PF_A2B10G10R10 | PF_FLOAT16_R | PF_FLOAT16_RGB | PF_FLOAT16_RGBA | PF_FLOAT32_R | PF_FLOAT32_RGB | PF_FLOAT32_RGBA | PF_SHORT_RGBA |+ anim_texture | cubic_texture | combinedUVW | separateUV | binding_type | vertex | fragment | content_type | named | shadow |+ tex_coord_set | tex_address_mode | wrap | clamp | mirror | border | tex_border_colour | filtering | bilinear | trilinear | anisotropic | linear | point |+ max_anisotropy | mipmap_bias | colour_op | replace | colour_op_ex | source1 | source2 | modulate_x2 | modulate_x4 |+ add_signed | add_smooth | subtract | blend_diffuse_alpha | blend_texture_alpha | blend_current_alpha | + blend_manual | dotproduct | blend_diffuse_colour | src_current | src_texture | src_diffuse | src_specular | src_manual |+ colour_op_multipass_fallback | alpha_op_ex | env_map | spherical | planar | cubic_reflection | cubic_normal |+ scroll | scroll_anim | rotate | rotate_anim | scale | wave_xform | scroll_x | scroll_y | scale_x | scale_y |+ sine | triangle | square | sawtooth | inverse_sawtooth | transform |+ scene_blend_op | reverse_subtract | min | max | separate_scene_blend_op | + keep | increment | decrement | increment_wrap | decrement_wrap | invert |+ + vertex_program | fragment_program | source | syntax | attach | manual_named_constants | profiles | entry_point |+ target | preprocessor_defines | column_major_matrices | + input_operation_type | output_operation_type | max_output_vertices | + delegate | vertex_program_ref |fragment_program_ref | shadow_caster_vertex_program_ref | shadow_receiver_vertex_program_ref | shadow_receiver_fragment_program_ref | + default_params | param_named_auto | param_named | param_indexed_auto | param_indexed | + includes_skeletal_animation | includes_morph_animation | includes_pose_animation | uses_vertex_texture_fetch | uses_adjacency_information |+ world_matrix | inverse_world_matrix | transpose_world_matrix | inverse_transpose_world_matrix | world_matrix_array_3x4 | view_matrix |+ inverse_view_matrix | transpose_view_matrix | inverse_transpose_view_matrix | projection_matrix | inverse_projection_matrix | + transpose_projection_matrix | inverse_transpose_projection_matrix | worldview_matrix | inverse_worldview_matrix | transpose_worldview_matrix |+ inverse_transpose_worldview_matrix | viewproj_matrix | inverse_viewproj_matrix | transpose_viewproj_matrix | inverse_transpose_viewproj_matrix |+ worldviewproj_matrix | inverse_worldviewproj_matrix | transpose_worldviewproj_matrix | inverse_transpose_worldviewproj_matrix |+ texture_matrix | render_target_flipping | light_diffuse_colour | light_specular_colour | light_attenuation | spotlight_params |+ light_position | light_direction | light_position_object_space | light_direction_object_space | light_distance_object_space |+ light_position_view_space | light_direction_view_space | light_power | light_diffuse_colour_power_scaled | light_specular_colour_power_scaled |+ light_number | light_diffuse_colour_array | light_specular_colour_array | light_diffuse_colour_power_scaled_array |+ light_specular_colour_power_scaled_array | light_attenuation_array | spotlight_params_array | light_position_array | light_direction_array |+ light_position_object_space_array | light_direction_object_space_array | light_distance_object_space_array | light_position_view_space_array |+ light_direction_view_space_array | light_power_array | light_count | light_casts_shadows | ambient_light_colour | surface_ambient_colour |+ surface_diffuse_colour | surface_specular_colour | surface_emissive_colour | surface_shininess | derived_ambient_light_colour | derived_scene_colour |+ derived_light_diffuse_colour | derived_light_specular_colour | derived_light_diffuse_colour_array | derived_light_specular_colour_array |+ fog_colour | fog_params | camera_position | camera_position_object_space | lod_camera_position | lod_camera_position_object_space | time |+ time_0_x | costime_0_x | sintime_0_x | tantime_0_x | time_0_x_packed | time_0_1 | costime_0_1 | sintime_0_1 | tantime_0_1 | time_0_1_packed |+ time_0_2pi | costime_0_2pi | sintime_0_2pi | tantime_0_2pi | time_0_2pi_packed | frame_time | fps | viewport_width | viewport_height |+ inverse_viewport_width | inverse_viewport_height | viewport_size | texel_offsets | view_direction | view_side_vector | view_up_vector | + fov | near_clip_distance | far_clip_distance | texture_viewproj_matrix | texture_viewproj_matrix_array | texture_worldviewproj_matrix |+ texture_worldviewproj_matrix_array | spotlight_viewproj_matrix | spotlight_worldviewproj_matrix | scene_depth_range | shadow_scene_depth_range |+ shadow_colour | shadow_extrusion_distance | texture_size | inverse_texture_size | packed_texture_size | pass_number | pass_iteration_number |+ animation_parametric | custom + ) { reserved } -- reserved keywords+ + [\{\}] { reserved } -- reserved symbols++ $identChar+ { valueToken TkVarid } -- identifier+++{+-- boilerplate code needed for Alex+type AlexInput = (Pos, String)++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."++alexGetChar :: AlexInput -> Maybe (Char, AlexInput)+alexGetChar (_, []) = Nothing+alexGetChar (p, (c:cs))+ = let p' = adv p c+ in Just (c, (p', cs))++-- use the Alex scanner to generate a list of tokens for the uulib token parsers+tokenize :: String -> String -> [Token]+tokenize filename str+ = go (initpos, str)+ where+ initpos = Pos 1 1 filename+ + go inp@(pos, cs)+ = case alexScan inp 0 of+ AlexEOF -> []+ AlexError inp' -> valueToken TkError [head cs] pos : go inp'+ AlexSkip inp' _ -> go inp'+ AlexToken inp' len act -> act (take len cs) pos : go inp'+}+
+ Graphics/LambdaCube/Loader/MeshXML.hs view
@@ -0,0 +1,266 @@+module Graphics.LambdaCube.Loader.MeshXML where++import Data.Maybe+import Data.List+import Data.Word+import qualified Data.IntMap as IntMap+import Foreign.Ptr+import Foreign.C.Types+import Foreign.Marshal.Array++import Text.XML.Light+import System.Log.Logger++import Graphics.LambdaCube.Mesh+import Graphics.LambdaCube.HardwareBuffer+import Graphics.LambdaCube.HardwareVertexBuffer+import Graphics.LambdaCube.HardwareIndexBuffer+import Graphics.LambdaCube.RenderSystem+import Graphics.LambdaCube.RenderOperation+import Graphics.LambdaCube.VertexIndexData+++{-+data MeshReader+ = MeshReader+ { mrInfo :: String+ , mrFileExtension :: String+ , mrReadFunction :: ByteString -> IO Mesh+ }+ +meshReader = MeshReader+ { mrInfo = "Ogre XML mesh reader"+ , mrFileExtension = "xml"+ , mrReadFunction = parseMesh+ }+-}++-- Load Mesh XML+readBool :: String -> Bool -> Element -> Bool+readBool n v e = maybe v (=="true") $ findAttr (unqual n) e+ +readInt :: String -> Int -> Element -> Int+readInt n v e = maybe v read $ findAttr (unqual n) e++readStr :: String -> String -> Element -> String+readStr n v e = fromMaybe v $ findAttr (unqual n) e++{-+data VertexElement+ = VertexElement+ { veSource :: Int -- ^ The source vertex buffer, as bound to an index using VertexBufferBinding+ , veOffset :: Int -- ^ The offset in the buffer that this element starts at+ , veType :: VertexElementType -- ^ The type of element+ , veSemantic :: VertexElementSemantic -- ^ The meaning of the element+ , veIndex :: Int -- ^ Index of the item, only applicable for some elements like texture coords+ }+-}++readDecl :: (Element,Int) -> [VertexElement]+readDecl (x,n) = [v { veIndex = i } | (v,i) <- zip declList $ reverse indexList]+ where+ hasPositions = readBool "positions" False x+ hasNormals = readBool "normals" False x+ hasDiffuse = readBool "colours_diffuse" False x+ hasSpecular = readBool "colours_specular" False x+ hasBinormals = readBool "binormals" False x+ hasTangents = readBool "tangents" False x+ dimTangents = readInt "tangent_dimensions" 3 x+ numTexCoords = readInt "texture_coords" 0 x+ dimTexCoords = [readInt ("texture_coord_dimensions_" ++ show (i-1)) 2 x | i <- [1..numTexCoords]]+ + mColourElementType = VET_COLOUR_ABGR+ + f a b = if a then [b] else [] + + l = [ f hasPositions (VET_FLOAT3, VES_POSITION)+ , f hasNormals (VET_FLOAT3, VES_NORMAL)+ , f hasTangents (if dimTangents == 4 then VET_FLOAT4 else VET_FLOAT3, VES_TANGENT)+ , f hasBinormals (VET_FLOAT3, VES_BINORMAL)+ , f hasDiffuse (mColourElementType, VES_DIFFUSE)+ , f hasSpecular (mColourElementType, VES_SPECULAR)+ ] ++ + [[(multiplyTypeCount VET_FLOAT1 dims,VES_TEXTURE_COORDINATES)] | dims <- dimTexCoords]+ l' = concat l+ offs = scanl (\a (b,_) -> a + getTypeSize b) 0 l'+ declList = [VertexElement n o t s 0 | (o,(t,s)) <- zip offs l']+ indexList = snd $ foldl fi (IntMap.empty,[]) declList+ fi (m,vl) e = case IntMap.lookup semIdx m of+ { Nothing -> (IntMap.insert semIdx 0 m,0:vl)+ ; Just i -> (IntMap.insert semIdx (i+1) m,(i+1):vl)+ }+ where+ semIdx = fromEnum $ veSemantic e+ +--readGeometry :: RenderSystem rs => rs -> Element -> IO VertexData+readGeometry rs x = do+ let vcount = read $ fromMaybe (error "fromJust 0") $ findAttr (unqual "vertexcount") x+ vbs = findElements (unqual "vertexbuffer") x+ elems = [readDecl v | v <- zip vbs [0..]]+ sizes = [foldl (\a b -> a + (getTypeSize $ veType b)) 0 e | e <- elems]+ -- create VertexDeclaration+ decl = VertexDeclaration $ concat elems+ -- create VertexBufferBinding+ usage = HBU_STATIC -- TODO+ + debugM "readGeometry" $ "gemetry declaration: " ++ show elems+ + bufs <- mapM (\s -> createVertexBuffer rs s vcount usage True) sizes+ let binding = VertexBufferBinding $ IntMap.fromList $ zip [0..] bufs+ fillBuffer (d,vx,b) = do+ -- 1. lock buffer+ ptr <- lock b 0 (getSizeInBytes b) HBL_NORMAL+ let fillVertex (i,vx) = do+ -- iterate over elements and read data from xml subelement+ let fillAttribute e = do+ let p = plusPtr ptr (i * (getVertexSize b) + veOffset e)+ setCFloatAttr :: String -> [String] -> IO () + setCFloatAttr en ea = pokeArray p $ getCFloat ((findElements (unqual en) vx ) !! veIndex e) ea+ + setColourAttr :: String -> IO ()+ setColourAttr en = pokeArray p $ getColour ((findElements (unqual en) vx ) !! veIndex e)+ + getCFloat :: Element -> [String] -> [CFloat]+ getCFloat xn ll = map ef ll+ where + ef nm = read $ fromMaybe (error "fromJust 1") $ findAttr (unqual nm) xn+ + getColour :: Element -> [Word8]+ getColour xn = if length values == 4 then values else 1:values+ where + values = map read $ words $ fromMaybe (error "fromJust 2") $ findAttr (unqual "value") xn+ + case veSemantic e of+ { VES_POSITION -> setCFloatAttr "position" ["x","y","z"]+ ; VES_BLEND_WEIGHTS -> error "invalid semantic"+ ; VES_BLEND_INDICES -> error "invalid semantic"+ ; VES_NORMAL -> setCFloatAttr "normal" ["x","y","z"]+ ; VES_DIFFUSE -> setColourAttr "colour_diffuse"+ ; VES_SPECULAR -> setColourAttr "colour_specular"+ ; VES_TEXTURE_COORDINATES -> setCFloatAttr "texcoord" $ take (getTypeCount $ veType e) ["u","v","w","x"]+ ; VES_BINORMAL -> setCFloatAttr "binormal" ["x","y","z"]+ ; VES_TANGENT -> setCFloatAttr "tangent" $ if veType e == VET_FLOAT4 then ["x","y","z","w"] else ["x","y","z"]+ }+ -- end fillAttribute+ + mapM_ fillAttribute d+ -- end fillVertex+ + -- 2. fill n-th vertex attributes according declaration+ mapM_ fillVertex $ zip [0..] $ findElements (unqual "vertex") vx+ -- 3. unlock buffer+ unlock b+ -- end fillBuffer+ + -- fill buffers with data+ mapM_ fillBuffer $ zip3 elems vbs bufs+ + -- create VertexData+ return $ VertexData decl binding 0 vcount+ +--readSubMesh :: RenderSystem rs => rs -> Element -> IO SubMesh+readSubMesh rs x = do+ let Just material = findAttr (unqual "material") x+ useShared = readBool "usesharedvertices" True x+ use32BitIndex = readBool "use32bitindexes" False x+ (hasFaces,oper) = readOpType $ readStr "operationtype" "triangle_list" x+ readOpType o = case o of+ { "triangle_list" -> (True, OT_TRIANGLE_LIST)+ ; "triangle_strip" -> (True, OT_TRIANGLE_STRIP)+ ; "triangle_fan" -> (True, OT_TRIANGLE_FAN)+ ; "line_strip" -> (False, OT_LINE_STRIP)+ ; "line_list" -> (False, OT_LINE_LIST)+ ; "point_list" -> (False, OT_POINT_LIST)+ }++ midata <- if not hasFaces then return Nothing else do+ let Just faces = findElement (unqual "faces") x+ faceCount = readInt "count" 0 faces+ faceList = findElements (unqual "face") faces+ indexCount = if oper == OT_TRIANGLE_LIST then 3 * faceCount else 2 + faceCount+ usage = HBU_STATIC -- TODO++ attrList = take (if oper == OT_TRIANGLE_LIST then 3 else 1) ["v1", "v2", "v3"]+ indexList gf = concat $ [gf (head faceList) ["v1", "v2", "v3"]] ++ [gf f attrList | f <- tail faceList]+ getWord16 :: Element -> [String] -> [Word16]+ getWord16 xn ll = map ef ll+ where + ef nm = read $ fromMaybe (error "fromJust 3") $ findAttr (unqual nm) xn++ getWord32 :: Element -> [String] -> [Word32]+ getWord32 xn ll = map ef ll+ where + ef nm = read $ fromMaybe (error "fromJust 4") $ findAttr (unqual nm) xn+ + -- create IndexData+ ib <- createIndexBuffer rs (if use32BitIndex then IT_32BIT else IT_16BIT) indexCount usage True+ -- 1. lock buffer+ ptr <- lock ib 0 (getSizeInBytes ib) HBL_NORMAL + -- 2. fill buffer+ case use32BitIndex of+ { True -> pokeArray (castPtr ptr) $ indexList getWord32+ ; False -> pokeArray (castPtr ptr) $ indexList getWord16+ }+ -- 3. unlock buffer+ unlock ib+ return $ Just IndexData+ { idIndexBuffer = ib+ , idIndexStart = 0+ , idIndexCount = indexCount+ }++ -- read geometry if necessary+ mvdata <- if useShared then return Nothing else do+ vd <- readGeometry rs $ fromMaybe (error "fromJust 5") $ findElement (unqual "geometry") x + return $ Just vd++ return $ SubMesh+ { smOperationType = oper+ , smVertexData = mvdata+ , smIndexData = midata+ , smExtremityPoints = undefined -- TODO+ , smMaterialName = material+ }++{-+ <levelofdetail strategy="Distance" numlevels="6" manual="false">+ <lodgenerated value="1000">+ <lodfacelist submeshindex="0" numfaces="60">+ <face v1="1" v2="2" v3="6" />+-}+--readMesh :: RenderSystem rs => rs -> Element -> IO Mesh+readMesh rs x = do+ let Just sml = findElement (unqual "submeshes") x+ submeshes <- mapM (readSubMesh rs) $ findElements (unqual "submesh") sml+ sharedVDs <- mapM (readGeometry rs) $ findElements (unqual "sharedgeometry") x+ return $ Mesh + { msSubMeshList = submeshes+ , msSharedVertexData = listToMaybe sharedVDs+ , msSubMeshNameMap = undefined -- TODO+ , msBoundRadius = undefined -- TODO+ , msSkeletonName = undefined -- TODO+ , msVertexBufferUsage = undefined -- TODO+ , msIndexBufferUsage = undefined -- TODO+ , msVertexBufferShadowBuffer = undefined -- TODO+ , msIndexBufferShadowBuffer = undefined -- TODO+ }+{-+ -- load LOD data+ e a n = read $ fromMaybe (error "fromJust 0") $ findAttr (unqual n) a+ lods = [ (getLod m) | m <- findElements (unqual "levelofdetail") x ]+ -- <lodgenerated value="1000">+ getLod a = [ (e m "value" ,getLodLevel m) | m <- findElements (unqual "lodgenerated") a ]+ -- <lodfacelist submeshindex="0" numfaces="60">+ getLodLevel a = [ (e m "submeshindex", e m "numfaces", getLodFaces m) | m <- findElements (unqual "lodfacelist") a ]+ -- <face v1="1" v2="2" v3="6" />+ getLodFaces a = [ (getFace m) | m <- findElements (unqual "face") a ]+-}+--parseMesh :: RenderSystem rs => rs -> String -> IO Mesh+parseMesh rs doc = do + let Just x = parseXMLDoc doc+ readMesh rs $ fromMaybe (error "fromJust 6") $ findElement (unqual "mesh") x++--loadMesh :: RenderSystem rs => rs -> String -> IO Mesh+loadMesh rs fileName = do+ doc <- readFile fileName+ parseMesh rs doc
+ Graphics/LambdaCube/Loader/OverlayScriptScanner.x view
@@ -0,0 +1,69 @@+{+-- alex scanner for use with uulib+-- compile with alex -o Scanner.hs -g Scanner.x+module Graphics.LambdaCube.Loader.Generated.OverlayScriptScanner(tokenize) where++import UU.Scanner+}++$litChar = [^[\" \\]]+$identChar = [a-zA-Z0-9_\.\-\/\~]+++tokens :-+ $white+ ; -- whitespace+ "//".* ; -- comment++ \" ($litChar | \\ \\ | \\ \" )* \" { valueToken TkString } -- string+ [0-9]+ { valueToken TkInteger16 } -- int+ + ( zorder | element | container |+ metrics_mode | pixels | relative |+ horz_align | left | center | right |+ vert_align | top | center | bottom |+ left | top | width | height |+ material | caption | rotation |+ Panel | transparent | true | false |+ tiling | uv_coords |+ BorderPanel | border_size |+ border_material | border_topleft_uv |+ border_topright_uv | border_bottomleft_uv |+ border_bottomright_uv | border_left_uv |+ border_right_uv | border_top_uv | border_bottom_uv |+ TextArea | font_name | char_height | colour |+ colour_top | colour_bottom | alignment |+ space_width |+ Panel | BorderPanel | TextArea) { reserved } -- reserved keywords+ [\{\}\:\(\)] { reserved } -- reserved symbols++ $identChar+ { valueToken TkVarid } -- identifier+++{+-- boilerplate code needed for Alex+type AlexInput = (Pos, String)++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."++alexGetChar :: AlexInput -> Maybe (Char, AlexInput)+alexGetChar (_, []) = Nothing+alexGetChar (p, (c:cs))+ = let p' = adv p c+ in Just (c, (p', cs))++-- use the Alex scanner to generate a list of tokens for the uulib token parsers+tokenize :: String -> String -> [Token]+tokenize filename str+ = go (initpos, str)+ where+ initpos = Pos 1 1 filename+ + go inp@(pos, cs)+ = case alexScan inp 0 of+ AlexEOF -> []+ AlexError inp' -> valueToken TkError [head cs] pos : go inp'+ AlexSkip inp' _ -> go inp'+ AlexToken inp' len act -> act (take len cs) pos : go inp'+}+
+ Graphics/LambdaCube/Loader/ParserUtil.hs view
@@ -0,0 +1,493 @@+{-# LANGUAGE FlexibleContexts #-}+module Graphics.LambdaCube.Loader.ParserUtil where++-- import the the library functions from uulib+import UU.Parsing+import UU.Scanner++import Data.Maybe++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Common+import Graphics.LambdaCube.BlendMode+import Graphics.LambdaCube.PixelFormat+import Graphics.LambdaCube.RenderSystem+import Graphics.LambdaCube.Technique+import Graphics.LambdaCube.Pass+import Graphics.LambdaCube.Light+import Graphics.LambdaCube.TextureUnitState+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.Compositor++{-++parseFile pFunc tokenize file txt+ = let res = parseTokens pFunc (tokenize file txt)+ in case res of+ Left errs -> do+ mapM_ putStrLn errs+ return Nothing+ Right tree -> return (Just tree)+ +type TokenParser a = Parser Token a++parseTokens :: TokenParser a -> [Token] -> Either [String] a+parseTokens p tks = if null msgs then final `seq` Right v else Left (map show msgs)+ where+ steps = parse p tks+ msgs = getMsgs steps+ (Pair v final) = evalSteps steps+-}++-- * Utility parser combinators++infixl 4 <$=, <*=++x <$= s = x <$ pKey s+x <*= s = x <* pKey s++pBool :: AnaParser [Token] Pair Token (Maybe Token) Bool+pBool = pEnum boolVals++pOnOff :: AnaParser [Token] Pair Token (Maybe Token) Bool+pOnOff = pEnum onoffVals++pInt :: AnaParser [Token] Pair Token (Maybe Token) Int+pInt = read <$> pInteger10++pFloat :: AnaParser [Token] Pair Token (Maybe Token) FloatType+pFloat = read <$> pFraction+ <|> read <$> pInteger10++pName :: AnaParser [Token] Pair Token (Maybe Token) String+pName = pVarid+ <|> (filter (/= '"') <$> pString)+ <|> pInteger10+ <|> pFraction+{-+ -- | Parses using any of the parsers in the list 'l'.+ --+ -- Warning: 'l' may not be an empty list.+ pAny :: (IsParser p s) =>(a -> p a1) -> [a] -> p a1+ pAny f l = if null l then usererror "pAny: argument may not be empty list" else foldr1 (<|>) (map f l)+ + -- | Parses any of the symbols in 'l'.+ pAnySym :: (IsParser p s) =>[s] -> p s+ pAnySym l = pAny pSym l -- used to be called pAnySym+ + pToks :: (IsParser p s) => [s] -> p [s]+ pToks [] = pSucceed []+ pToks (a:as) = (:) <$> pSym a <*> pToks as+-}+-- pEnum :: (IsParser p s) => [(s, t)] -> p t+-- pEnum v = pAny (\(a,b) -> pToks a *> pSucceed b) v +pEnum :: (IsParser p Token) => [(String, t)] -> p t+pEnum v = pAny (\(a,b) -> pKey a *> pSucceed b) v +{-+pEnum v = readVal v <$> pVarid+ where+ readVal l x = head [y | (x2,y) <- l, x == x2]+-}++pColour a = Left <$> pRGB a+ <|> Left <$> pRGBA+ <|> Right () <$= "vertex_colour"++pFloat3 = (,,) <$> pFloat <*> pFloat <*> pFloat+pFloat4 = (,,,) <$> pFloat <*> pFloat <*> pFloat <*> pFloat+pRGBOrRGBA a = pRGBA <|> pRGB a++pRGBA :: AnaParser [Token] Pair Token (Maybe Token) (FloatType, FloatType, FloatType, FloatType)+pRGBA = pFloat4+pRGB a = (,,,) <$> pFloat <*> pFloat <*> pFloat <*> pSucceed a++def dv l = if null l then dv else head l++-- * +boolVals =+ [ ("true", True)+ , ("false", False)+ ]+ +onoffVals =+ [ ("on", True)+ , ("off", False)+ ]++ruleopVals =+ [ ("include",INCLUDE)+ , ("exclude",EXCLUDE)+ ]++cmpfuncVals =+ [ ("always_fail", CMPF_ALWAYS_FAIL)+ , ("always_pass", CMPF_ALWAYS_PASS)+ , ("less", CMPF_LESS)+ , ("less_equal", CMPF_LESS_EQUAL)+ , ("equal", CMPF_EQUAL)+ , ("not_equal", CMPF_NOT_EQUAL)+ , ("greater_equal", CMPF_GREATER_EQUAL)+ , ("greater", CMPF_GREATER)+ ]++shadingVals =+ [ ("flat", SO_FLAT)+ , ("gouraud", SO_GOURAUD)+ , ("phong", SO_PHONG)+ ]++polymodeVals =+ [ ("points", PM_POINTS)+ , ("wireframe", PM_WIREFRAME)+ , ("solid", PM_SOLID)+ ]+ +blendopVals = + [ ("add", SBO_ADD)+ , ("subtract", SBO_SUBTRACT)+ , ("reverse_subtract", SBO_REVERSE_SUBTRACT)+ , ("min", SBO_MIN)+ , ("max", SBO_MAX)+ ]+ +blendVals =+ [ ("one", SBF_ONE)+ , ("zero", SBF_ZERO)+ , ("dest_colour", SBF_DEST_COLOUR)+ , ("src_colour", SBF_SOURCE_COLOUR)+ , ("one_minus_dest_colour", SBF_ONE_MINUS_DEST_COLOUR)+ , ("one_minus_src_colour", SBF_ONE_MINUS_SOURCE_COLOUR)+ , ("dest_alpha", SBF_DEST_ALPHA)+ , ("src_alpha", SBF_SOURCE_ALPHA)+ , ("one_minus_dest_alpha", SBF_ONE_MINUS_DEST_ALPHA)+ , ("one_minus_src_alpha", SBF_ONE_MINUS_SOURCE_ALPHA)+ ]++sceneblendVals =+ [ ("add", SBT_ADD)+ , ("modulate", SBT_MODULATE)+ , ("colour_blend", SBT_TRANSPARENT_COLOUR)+ , ("alpha_blend", SBT_TRANSPARENT_ALPHA)+ ]+ +illumstageVals = + [ ("ambient", IS_AMBIENT)+ , ("per_light", IS_PER_LIGHT)+ , ("decal", IS_DECAL)+ ]++cullhwVals = + [ ("clockwise", CULL_CLOCKWISE)+ , ("anticlockwise", CULL_ANTICLOCKWISE)+ , ("none", CULL_NONE)+ ]++cullswVals =+ [ ("back", MANUAL_CULL_BACK)+ , ("front", MANUAL_CULL_FRONT)+ , ("none", MANUAL_CULL_NONE)+ ]+ +lighttypeVals =+ [ ("point", LT_POINT)+ , ("directional", LT_DIRECTIONAL)+ , ("spot", LT_SPOTLIGHT)+ ]++copVals =+ [ ("replace", LBO_REPLACE)+ , ("add", LBO_ADD)+ , ("modulate", LBO_MODULATE)+ , ("alpha_blend", LBO_ALPHA_BLEND)+ ]+ +btyVals =+ [ ("vertex", BT_VERTEX)+ , ("fragment", BT_FRAGMENT)+ ]++ctyVals =+ [ ("named", CONTENT_NAMED)+ , ("shadow", CONTENT_SHADOW)+ ]++pixelformatVals = + [ ("PF_L8", PF_L8) + , ("PF_L16", PF_L16) + , ("PF_A8", PF_A8) + , ("PF_A4L4", PF_A4L4) + , ("PF_BYTE_LA", PF_BYTE_LA) + , ("PF_R5G6B5", PF_R5G6B5) + , ("PF_B5G6R5", PF_B5G6R5) + , ("PF_R3G3B2", PF_R3G3B2) + , ("PF_A4R4G4B4", PF_A4R4G4B4)+ , ("PF_A1R5G5B5", PF_A1R5G5B5)+ , ("PF_R8G8B8", PF_R8G8B8) + , ("PF_B8G8R8", PF_B8G8R8) + , ("PF_A8R8G8B8", PF_A8R8G8B8)+ , ("PF_A8B8G8R8", PF_A8B8G8R8)+ , ("PF_B8G8R8A8", PF_B8G8R8A8)+ , ("PF_R8G8B8A8", PF_R8G8B8A8)+ , ("PF_X8R8G8B8", PF_X8R8G8B8)+ , ("PF_X8B8G8R8", PF_X8B8G8R8)+ , ("PF_A2R10G10B10", PF_A2R10G10B10)+ , ("PF_A2B10G10R10", PF_A2B10G10R10)+ , ("PF_FLOAT16_R", PF_FLOAT16_R) + , ("PF_FLOAT16_RGB", PF_FLOAT16_RGB) + , ("PF_FLOAT16_RGBA", PF_FLOAT16_RGBA)+ , ("PF_FLOAT32_R", PF_FLOAT32_R) + , ("PF_FLOAT32_RGB", PF_FLOAT32_RGB) + , ("PF_FLOAT32_RGBA", PF_FLOAT32_RGBA)+ , ("PF_SHORT_RGBA", PF_SHORT_RGBA) + ]+ +textypeVals = + [ ("1d", TEX_TYPE_1D)+ , ("2d", TEX_TYPE_2D)+ , ("3d", TEX_TYPE_3D)+ , ("cubic", TEX_TYPE_CUBE_MAP)+ ]++texaddressVals =+ [ ("wrap", TAM_WRAP)+ , ("clamp", TAM_CLAMP)+ , ("mirror", TAM_MIRROR)+ , ("border", TAM_BORDER)+ ]+ +texfilteringVals =+ [ ("none", (FO_POINT,FO_POINT,FO_NONE))+ , ("bilinear", (FO_LINEAR,FO_LINEAR,FO_POINT))+ , ("trilinear", (FO_LINEAR,FO_LINEAR,FO_LINEAR))+ , ("anisotropic", (FO_ANISOTROPIC,FO_ANISOTROPIC,FO_LINEAR))+ ]++filteringVals =+ [ ("none", FO_NONE)+ , ("point", FO_POINT)+ , ("linear", FO_LINEAR)+ , ("anisotropic", FO_ANISOTROPIC)+ ]++envmapVals =+ [ ("off", Nothing)+ , ("spherical", Just ENV_CURVED)+ , ("planar", Just ENV_PLANAR)+ , ("cubic_reflection", Just ENV_REFLECTION)+ , ("cubic_normal", Just ENV_NORMAL)+ ] ++xformtypeVals =+ [ ("scroll_x", TT_TRANSLATE_U)+ , ("scroll_y", TT_TRANSLATE_V)+ , ("scale_x", TT_SCALE_U)+ , ("scale_y", TT_SCALE_V)+ , ("rotate", TT_ROTATE)+ ]++wavetypeVals =+ [ ("sine", WFT_SINE) + , ("triangle", WFT_TRIANGLE)+ , ("square", WFT_SQUARE) + , ("sawtooth", WFT_SAWTOOTH)+ , ("inverse_sawtooth", WFT_INVERSE_SAWTOOTH)+-- , ("",WFT_PWM)+ ] ++stencilopVals =+ [ ("keep", SOP_KEEP)+ , ("zero", SOP_ZERO)+ , ("replace", SOP_REPLACE)+ , ("increment", SOP_INCREMENT)+ , ("decrement", SOP_DECREMENT)+ , ("increment_wrap", SOP_INCREMENT_WRAP)+ , ("decrement_wrap", SOP_DECREMENT_WRAP)+ , ("invert", SOP_INVERT)+ ]++fogmodeVals =+ [ ("none", FOG_NONE)+ , ("linear", FOG_LINEAR)+ , ("exp", FOG_EXP)+ , ("exp2", FOG_EXP2)+ ]++layerblendopexVals =+ [ ("source1", LBX_SOURCE1)+ , ("source2", LBX_SOURCE2)+ , ("modulate", LBX_MODULATE)+ , ("modulate_x2", LBX_MODULATE_X2)+ , ("modulate_x4", LBX_MODULATE_X4)+ , ("add", LBX_ADD)+ , ("add_signed", LBX_ADD_SIGNED)+ , ("add_smooth", LBX_ADD_SMOOTH)+ , ("subtract", LBX_SUBTRACT)+ , ("blend_diffuse_alpha", LBX_BLEND_DIFFUSE_ALPHA)+ , ("blend_texture_alpha", LBX_BLEND_TEXTURE_ALPHA)+ , ("blend_current_alpha", LBX_BLEND_CURRENT_ALPHA)+ , ("blend_manual", LBX_BLEND_MANUAL)+ , ("dotproduct", LBX_DOTPRODUCT)+ , ("blend_diffuse_colour", LBX_BLEND_DIFFUSE_COLOUR)+ ]++layerblendsrcVals = + [ ("src_current", LBS_CURRENT)+ , ("src_texture", LBS_TEXTURE)+ , ("src_diffuse", LBS_DIFFUSE)+ , ("src_specular", LBS_SPECULAR)+ , ("src_manual", LBS_MANUAL)+ ]++inputVals =+ [ ("none", IM_NONE)+ , ("previous", IM_PREVIOUS)+ ]++compositorPixelFormatVals =+ [ ("PF_A8R8G8B8", PF_A8R8G8B8) + , ("PF_R8G8B8A8", PF_R8G8B8A8)+ , ("PF_R8G8B8", PF_R8G8B8)+ , ("PF_FLOAT16_RGBA", PF_FLOAT16_RGBA)+ , ("PF_FLOAT16_RGB", PF_FLOAT16_RGB)+ , ("PF_FLOAT16_R", PF_FLOAT16_R)+ , ("PF_FLOAT32_RGBA", PF_FLOAT32_RGBA)+ , ("PF_FLOAT32_RGB", PF_FLOAT32_RGB)+ , ("PF_FLOAT32_R", PF_FLOAT32_R)+ ]++--autoparamVals = [(n,v) | (v,n,_,_,_) <- autoConstantDictionary]+{-+ [ ("world_matrix", ACT_WORLD_MATRIX)+ , ("inverse_world_matrix", ACT_INVERSE_WORLD_MATRIX)+ , ("transpose_world_matrix", ACT_TRANSPOSE_WORLD_MATRIX)+ , ("inverse_transpose_world_matrix", ACT_INVERSE_TRANSPOSE_WORLD_MATRIX)+ , ("world_matrix_array_3x4", ACT_WORLD_MATRIX_ARRAY_3x4)+ , ("view_matrix", ACT_VIEW_MATRIX)+ , ("inverse_view_matrix", ACT_INVERSE_VIEW_MATRIX)+ , ("transpose_view_matrix", ACT_TRANSPOSE_VIEW_MATRIX)+ , ("inverse_transpose_view_matrix", ACT_INVERSE_TRANSPOSE_VIEW_MATRIX)+ , ("projection_matrix", ACT_PROJECTION_MATRIX)+ , ("inverse_projection_matrix", ACT_INVERSE_PROJECTION_MATRIX)+ , ("transpose_projection_matrix", ACT_TRANSPOSE_PROJECTION_MATRIX)+ , ("inverse_transpose_projection_matrix", ACT_INVERSE_TRANSPOSE_PROJECTION_MATRIX)+ , ("worldview_matrix", ACT_WORLDVIEW_MATRIX)+ , ("inverse_worldview_matrix", ACT_INVERSE_WORLDVIEW_MATRIX)+ , ("transpose_worldview_matrix", ACT_TRANSPOSE_WORLDVIEW_MATRIX)+ , ("inverse_transpose_worldview_matrix", ACT_INVERSE_TRANSPOSE_WORLDVIEW_MATRIX)+ , ("viewproj_matrix", ACT_VIEWPROJ_MATRIX)+ , ("inverse_viewproj_matrix", ACT_INVERSE_VIEWPROJ_MATRIX)+ , ("transpose_viewproj_matrix", ACT_TRANSPOSE_VIEWPROJ_MATRIX)+ , ("inverse_transpose_viewproj_matrix", ACT_INVERSE_TRANSPOSE_VIEWPROJ_MATRIX)+ , ("worldviewproj_matrix", ACT_WORLDVIEWPROJ_MATRIX)+ , ("inverse_worldviewproj_matrix", ACT_INVERSE_WORLDVIEWPROJ_MATRIX)+ , ("transpose_worldviewproj_matrix", ACT_TRANSPOSE_WORLDVIEWPROJ_MATRIX)+ , ("inverse_transpose_worldviewproj_matrix", ACT_INVERSE_TRANSPOSE_WORLDVIEWPROJ_MATRIX)+ , ("texture_matrix", ACT_TEXTURE_MATRIX)+ , ("render_target_flipping", ACT_RENDER_TARGET_FLIPPING)+ , ("light_diffuse_colour", ACT_LIGHT_DIFFUSE_COLOUR)+ , ("light_specular_colour", ACT_LIGHT_SPECULAR_COLOUR)+ , ("light_attenuation", ACT_LIGHT_ATTENUATION)+ , ("spotlight_params", ACT_SPOTLIGHT_PARAMS)+ , ("light_position", ACT_LIGHT_POSITION)+ , ("light_direction", ACT_LIGHT_DIRECTION)+ , ("light_position_object_space", ACT_LIGHT_POSITION_OBJECT_SPACE)+ , ("light_direction_object_space", ACT_LIGHT_DIRECTION_OBJECT_SPACE)+ , ("light_distance_object_space", ACT_LIGHT_DISTANCE_OBJECT_SPACE)+ , ("light_position_view_space", ACT_LIGHT_POSITION_VIEW_SPACE)+ , ("light_direction_view_space", ACT_LIGHT_DIRECTION_VIEW_SPACE)+ , ("light_power", )+ , ("light_diffuse_colour_power_scaled", )+ , ("light_specular_colour_power_scaled", )+ , ("light_number", ACT_LIGHT_NUMBER)+ , ("light_diffuse_colour_array", ACT_LIGHT_DIFFUSE_COLOUR_ARRAY)+ , ("light_specular_colour_array", ACT_LIGHT_SPECULAR_COLOUR_ARRAY)+ , ("light_diffuse_colour_power_scaled_array", ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED_ARRAY)+ , ("light_specular_colour_power_scaled_array", ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED_ARRAY)+ , ("light_attenuation_array", ACT_LIGHT_ATTENUATION_ARRAY)+ , ("spotlight_params_array", ACT_SPOTLIGHT_PARAMS_ARRAY)+ , ("light_position_array", ACT_LIGHT_POSITION_ARRAY)+ , ("light_direction_array", ACT_LIGHT_DIRECTION_ARRAY)+ , ("light_position_object_space_array", ACT_LIGHT_POSITION_OBJECT_SPACE_ARRAY)+ , ("light_direction_object_space_array", ACT_LIGHT_DIRECTION_OBJECT_SPACE_ARRAY)+ , ("light_distance_object_space_array", ACT_LIGHT_DISTANCE_OBJECT_SPACE_ARRAY)+ , ("light_position_view_space_array", ACT_LIGHT_POSITION_VIEW_SPACE_ARRAY)+ , ("light_direction_view_space_array", ACT_LIGHT_DIRECTION_VIEW_SPACE_ARRAY)+ , ("light_power_array", )+ , ("light_count", ACT_LIGHT_COUNT)+ , ("light_casts_shadows", ACT_LIGHT_CASTS_SHADOWS)+ , ("ambient_light_colour", ACT_AMBIENT_LIGHT_COLOUR)+ , ("surface_ambient_colour", ACT_SURFACE_AMBIENT_COLOUR)+ , ("surface_diffuse_colour", ACT_SURFACE_DIFFUSE_COLOUR)+ , ("surface_specular_colour", ACT_SURFACE_SPECULAR_COLOUR)+ , ("surface_emissive_colour", ACT_SURFACE_EMISSIVE_COLOUR)+ , ("surface_shininess", ACT_SURFACE_SHININESS)+ , ("derived_ambient_light_colour", ACT_DERIVED_AMBIENT_LIGHT_COLOUR)+ , ("derived_scene_colour", ACT_DERIVED_SCENE_COLOUR)+ , ("derived_light_diffuse_colour", ACT_DERIVED_LIGHT_DIFFUSE_COLOUR)+ , ("derived_light_specular_colour", ACT_DERIVED_LIGHT_SPECULAR_COLOUR)+ , ("derived_light_diffuse_colour_array", ACT_DERIVED_LIGHT_DIFFUSE_COLOUR_ARRAY)+ , ("derived_light_specular_colour_array", ACT_DERIVED_LIGHT_SPECULAR_COLOUR_ARRAY)+ , ("fog_colour", ACT_FOG_COLOUR)+ , ("fog_params", ACT_FOG_PARAMS)+ , ("camera_position", ACT_CAMERA_POSITION)+ , ("camera_position_object_space", ACT_CAMERA_POSITION_OBJECT_SPACE)+ , ("lod_camera_position", ACT_LOD_CAMERA_POSITION)+ , ("lod_camera_position_object_space", ACT_LOD_CAMERA_POSITION_OBJECT_SPACE)+ , ("time", ACT_TIME)+ , ("time_0_x", ACT_TIME_0_X)+ , ("costime_0_x", ACT_COSTIME_0_X)+ , ("sintime_0_x", ACT_SINTIME_0_X)+ , ("tantime_0_x", ACT_TANTIME_0_X)+ , ("time_0_x_packed", ACT_TIME_0_X_PACKED)+ , ("time_0_1", ACT_TIME_0_1)+ , ("costime_0_1", ACT_COSTIME_0_1)+ , ("sintime_0_1", ACT_SINTIME_0_1)+ , ("tantime_0_1", ACT_TANTIME_0_1)+ , ("time_0_1_packed", ACT_TIME_0_1_PACKED)+ , ("time_0_2pi", ACT_TIME_0_2PI)+ , ("costime_0_2pi", ACT_COSTIME_0_2PI)+ , ("sintime_0_2pi", ACT_SINTIME_0_2PI)+ , ("tantime_0_2pi", ACT_TANTIME_0_2PI)+ , ("time_0_2pi_packed", ACT_TIME_0_2PI_PACKED)+ , ("frame_time", ACT_FRAME_TIME)+ , ("fps", ACT_FPS)+ , ("viewport_width", ACT_VIEWPORT_WIDTH)+ , ("viewport_height", ACT_VIEWPORT_HEIGHT)+ , ("inverse_viewport_width", ACT_INVERSE_VIEWPORT_WIDTH)+ , ("inverse_viewport_height", ACT_INVERSE_VIEWPORT_HEIGHT)+ , ("viewport_size", ACT_VIEWPORT_SIZE)+ , ("texel_offsets", ACT_TEXEL_OFFSETS)+ , ("view_direction", ACT_VIEW_DIRECTION)+ , ("view_side_vector", ACT_VIEW_SIDE_VECTOR)+ , ("view_up_vector", ACT_VIEW_UP_VECTOR)+ , ("fov", ACT_FOV)+ , ("near_clip_distance", ACT_NEAR_CLIP_DISTANCE)+ , ("far_clip_distance", ACT_FAR_CLIP_DISTANCE)+ , ("texture_viewproj_matrix", ACT_TEXTURE_VIEWPROJ_MATRIX)+ , ("texture_viewproj_matrix_array", ACT_TEXTURE_VIEWPROJ_MATRIX_ARRAY)+ , ("texture_worldviewproj_matrix", ACT_TEXTURE_WORLDVIEWPROJ_MATRIX)+ , ("texture_worldviewproj_matrix_array", ACT_TEXTURE_WORLDVIEWPROJ_MATRIX_ARRAY)+ , ("spotlight_viewproj_matrix", ACT_SPOTLIGHT_VIEWPROJ_MATRIX)+ , ("spotlight_worldviewproj_matrix", ACT_SPOTLIGHT_WORLDVIEWPROJ_MATRIX)+ , ("scene_depth_range", ACT_SCENE_DEPTH_RANGE)+ , ("shadow_scene_depth_range", ACT_SHADOW_SCENE_DEPTH_RANGE)+ , ("shadow_colour", ACT_SHADOW_COLOUR)+ , ("shadow_extrusion_distance", ACT_SHADOW_EXTRUSION_DISTANCE)+ , ("texture_size", ACT_TEXTURE_SIZE)+ , ("inverse_texture_size", ACT_INVERSE_TEXTURE_SIZE)+ , ("packed_texture_size", ACT_PACKED_TEXTURE_SIZE)+ , ("pass_number", ACT_PASS_NUMBER)+ , ("pass_iteration_number", ACT_PASS_ITERATION_NUMBER)+ , ("animation_parametric", ACT_ANIMATION_PARAMETRIC)+ , ("custom ", ACT_CUSTOM)+ ]+ACT_WORLD_MATRIX_ARRAY++ACT_LIGHT_POWER_SCALE+ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED+ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED++ACT_LIGHT_POWER_SCALE_ARRAY++ACT_LIGHT_CUSTOM+-}
+ Graphics/LambdaCube/Loader/ResourceScript.hs view
@@ -0,0 +1,42 @@+module Graphics.LambdaCube.Loader.ResourceScript (loadResourcesCfg,PathType(..),ResourcePath,ResourceGroup) where++-- import the the library functions from uulib+import UU.Parsing+import UU.Scanner++-- import our custom made Alex-scanner+import Graphics.LambdaCube.Loader.Generated.ResourceScriptScanner+import Graphics.LambdaCube.Loader.ParserUtil+import System.Log.Logger++data PathType = PathDir | PathZip+type ResourcePath = (PathType,String)+type ResourceGroup = (String,[ResourcePath])++loadResourcesCfg file = do+ txt <- readFile file+ parseResourcesCfg file txt++parseResourcesCfg file txt+ = let res = parseTokens pResourceScript (tokenize file txt)+ in case res of+ Left errs -> do+ mapM_ (errorM "ResourceScript") errs+ return Nothing+ Right tree -> return (Just tree)+ +type TokenParser a = Parser Token a++parseTokens :: TokenParser a -> [Token] -> Either [String] a+parseTokens p tks = if null msgs then final `seq` Right v else Left (map show msgs)+ where+ steps = parse p tks+ msgs = getMsgs steps+ (Pair v final) = evalSteps steps++pResourceScript = pList pResourceGroup+pResourceGroup = (,) <$= "[" <*> pVarid <*= "]" <*> pList pResourceGroupContent+pResourceGroupContent = pFileSystem <|> pZip++pFileSystem = (,) PathDir <$= "FileSystem" <*= "=" <*> pVarid+pZip = (,) PathZip <$= "Zip" <*= "=" <*> pVarid
+ Graphics/LambdaCube/Loader/ResourceScriptScanner.x view
@@ -0,0 +1,52 @@+{+-- alex scanner for use with uulib+-- compile with alex -o Scanner.hs -g Scanner.x+module Graphics.LambdaCube.Loader.Generated.ResourceScriptScanner(tokenize) where++import UU.Scanner+}++--$litChar = [^[\n\r]]+--$litChar = [^[\" \\]]+--$litChar = [a-zA-Z0-9_\.\-\/ ]+$identChar = [a-zA-Z0-9_\.\-\/]+++tokens :-+ $white+ ; -- whitespace+ "#".* ; -- comment++ ( FileSystem | Zip ) { reserved } -- reserved keywords+ [\[\]\=] { reserved } -- reserved symbols++ $identChar+ { valueToken TkVarid } -- identifier+-- $litChar+ { valueToken TkString } -- string++{+-- boilerplate code needed for Alex+type AlexInput = (Pos, String)++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input."++alexGetChar :: AlexInput -> Maybe (Char, AlexInput)+alexGetChar (_, []) = Nothing+alexGetChar (p, (c:cs))+ = let p' = adv p c+ in Just (c, (p', cs))++-- use the Alex scanner to generate a list of tokens for the uulib token parsers+tokenize :: String -> String -> [Token]+tokenize filename str+ = go (initpos, str)+ where+ initpos = Pos 1 1 filename+ + go inp@(pos, cs)+ = case alexScan inp 0 of+ AlexEOF -> []+ AlexError inp' -> valueToken TkError [head cs] pos : go inp'+ AlexSkip inp' _ -> go inp'+ AlexToken inp' len act -> act (take len cs) pos : go inp'+}+
+ Graphics/LambdaCube/Loader/StbImage.hs view
@@ -0,0 +1,42 @@+module Graphics.LambdaCube.Loader.StbImage (loadImage) where++import System.Exit+import System.Log.Logger+import Foreign.Marshal.Array++import qualified Codec.Image.STB as STB+import qualified Data.ByteString as SB+import Data.ByteString.Lazy++import Graphics.LambdaCube.PixelFormat+import Graphics.LambdaCube.Image++loadImage :: ImageLoader+loadImage name buf = STB.decodeImage (SB.pack $ unpack buf) >>= \result -> case result of+ { Left err -> do+ debugM "StbImage loader" err+ return Nothing+ ; Right img -> STB.withImage img $ \p (x,y) c -> do+ let pf = case c of+ { 1 -> PF_L8+ ; 2 -> PF_BYTE_LA+ ; 3 -> PF_R8G8B8+ ; 4 -> PF_R8G8B8A8+ }+ debugM "StbImage loader" $ "\"" ++ name ++ "\" loaded"+ debugM "StbImage loader" $ "resolution = " ++ show x ++ " x " ++ show y ++ ", " ++ show c ++ " bytes per pixel"+ imgdata <- mallocArray (x * y * c)+ copyArray imgdata p (x * y * c)+ return $ Just Image+ { imName = name+ , imHeight = y+ , imWidth = x+ , imDepth = 1+ , imSize = x * y * c+ , imNumMipmaps = 0 -- TODO+ -- uint flags;+ , imFormat = pf+ , imData = imgdata+ }+ }+
+ Graphics/LambdaCube/Material.hs view
@@ -0,0 +1,50 @@+module Graphics.LambdaCube.Material where++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Technique+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.GpuProgram++{-+data Shader+ = Shader+ { shName :: String+ , shSource :: String+ , shAttach :: [String]+-- , shParameter :: [ShaderParameterValue]+-- , shObject :: GL.Shader s => Maybe s+ }+ +data Program+ = Program+ { prVertShaderName :: Maybe String+ , prFragShaderName :: Maybe String+ --prParameters :: [ShaderParameter],+-- , prObject :: Maybe GL.Program+ }+-}+---------------------------------------+-- NEW code+data (Texture t, LinkedGpuProgram lp) => Material t lp+ = Material+ { mtName :: String+ , mtTechniques :: [Technique t lp] -- ^ All techniques, supported and unsupported+ , mtSupportedTechniques :: Maybe [Technique t lp] -- ^ Supported techniques of any sort+{-+ typedef map<unsigned short, Technique*>::type LodTechniques;+ typedef map<unsigned short, LodTechniques*>::type BestTechniquesBySchemeList;+ /** Map of scheme -> list of LOD techniques. + Current scheme is set on MaterialManager,+ and can be set per Viewport for auto activation.+ */+ BestTechniquesBySchemeList mBestTechniquesBySchemeList;+-}+ , mtUserLodValues :: [FloatType] -- ^ distance list used to specify LOD+ , mtLodValues :: [FloatType] -- ^ distance list used to specify LOD+-- const LodStrategy *mLodStrategy;+ , mtReceiveShadows :: Bool+ , mtTransparencyCastsShadows :: Bool+-- /// Does this material require compilation?+-- bool mCompilationRequired;+ , mtUnsupportedReasons :: String -- ^ Text description of why any techniques are not supported+ }
+ Graphics/LambdaCube/Math.hs view
@@ -0,0 +1,160 @@+module Graphics.LambdaCube.Math where+import Graphics.LambdaCube.Types++vec4xscalar :: Vec4 -> FloatType -> Vec4+vec4xscalar (Vec4 x1 y1 z1 _) s = Vec4 (x1 * s) (y1 * s) (z1 * s) 0++vec4crossvec4 :: Vec4 -> Vec4 -> Vec4+vec4crossvec4 (Vec4 x1 y1 z1 _) (Vec4 x2 y2 z2 _) = Vec4 (y1*z2-y2*z1) (z1*x2-z2*x1) (x1*y2-x2*y1) 0++vec4subvec4 :: Vec4 -> Vec4 -> Vec4+vec4subvec4+ (Vec4+ a1 a2 a3 a4)+ (Vec4+ b1 b2 b3 b4)+ = (Vec4 (a1 - b1) (a2 - b2) (a3 - b3) (a4 - b4))++vec4addvec4 :: Vec4 -> Vec4 -> Vec4+vec4addvec4+ (Vec4+ a1 a2 a3 a4)+ (Vec4+ b1 b2 b3 b4)+ = (Vec4 (a1 + b1) (a2 + b2) (a3 + b3) (a4 + b4))++norm :: Vec4 -> Vec4+norm+ (Vec4+ a1 a2 a3 a4)+ = (Vec4 (a1 / l) (a2 / l) (a3 / l) (a4 / l))+ where+ l = sqrt (a1*a1 + a2*a2 + a3*a3 + a4*a4)++vec4xmat44 :: Vec4 -> Matrix4 -> Vec4+vec4xmat44+ (Vec4+ a1 a2 a3 a4)+ (Matrix4+ b11 b12 b13 b14+ b21 b22 b23 b24+ b31 b32 b33 b34+ b41 b42 b43 b44)+ = (Vec4+ (a1*b11+a2*b21+a3*b31+a4*b41) (a1*b12+a2*b22+a3*b32+a4*b42) (a1*b13+a2*b23+a3*b33+a4*b43) (a1*b14+a2*b24+a3*b34+a4*b44))++mat44xmat44 :: Matrix4 -> Matrix4 -> Matrix4+mat44xmat44+ (Matrix4+ a11 a12 a13 a14+ a21 a22 a23 a24+ a31 a32 a33 a34+ a41 a42 a43 a44)+ (Matrix4+ b11 b12 b13 b14+ b21 b22 b23 b24+ b31 b32 b33 b34+ b41 b42 b43 b44)+ = (Matrix4+ (a11*b11+a12*b21+a13*b31+a14*b41) (a11*b12+a12*b22+a13*b32+a14*b42) (a11*b13+a12*b23+a13*b33+a14*b43) (a11*b14+a12*b24+a13*b34+a14*b44)+ (a21*b11+a22*b21+a23*b31+a24*b41) (a21*b12+a22*b22+a23*b32+a24*b42) (a21*b13+a22*b23+a23*b33+a24*b43) (a21*b14+a22*b24+a23*b34+a24*b44)+ (a31*b11+a32*b21+a33*b31+a34*b41) (a31*b12+a32*b22+a33*b32+a34*b42) (a31*b13+a32*b23+a33*b33+a34*b43) (a31*b14+a32*b24+a33*b34+a34*b44)+ (a41*b11+a42*b21+a43*b31+a44*b41) (a41*b12+a42*b22+a43*b32+a44*b42) (a41*b13+a42*b23+a43*b33+a44*b43) (a41*b14+a42*b24+a43*b34+a44*b44))+++transMatrix4 :: Matrix4 -> Matrix4+transMatrix4+ (Matrix4+ a11 a12 a13 a14+ a21 a22 a23 a24+ a31 a32 a33 a34+ a41 a42 a43 a44)+ = (Matrix4+ a11 a21 a31 a41+ a12 a22 a32 a42+ a13 a23 a33 a43+ a14 a24 a34 a44)+ +infixl 7 <>+a <> b = a `mat44xmat44` b++toListsMatrix4+ (Matrix4+ a11 a12 a13 a14+ a21 a22 a23 a24+ a31 a32 a33 a34+ a41 a42 a43 a44) = [a11, a12, a13, a14, a21, a22, a23, a24, a31, a32, a33, a34, a41, a42, a43, a44]+ +scal a = Matrix4+ a 0 0 0+ 0 a 0 0+ 0 0 a 0+ 0 0 0 1 ++transl x y z = Matrix4+ 1 0 0 0+ 0 1 0 0+ 0 0 1 0+ x y z 1++rotX a = Matrix4+ 1 0 0 0+ 0 c s 0+ 0(-s) c 0+ 0 0 0 1+ where+ c = cos a+ s = sin a++rotY a = Matrix4+ c 0 s 0+ 0 1 0 0+ (-s) 0 c 0+ 0 0 0 1 + where+ c = cos a+ s = sin a++rotZ a = Matrix4+ c s 0 0+ (-s) c 0 0+ 0 0 1 0+ 0 0 0 1+ where+ c = cos a+ s = sin a+ +--lookat eye@(Vec4 ex ey ez _) dir up = (Matrix4 +lookat eye@(Vec4 ex ey ez _) dir up = (transl (-ex) (-ey) (-ez)) <> (Matrix4 +--lookat eye@(Vec4 ex ey ez _) dir up = (transl (ex) (ey) (ez)) <> Matrix4+ ux vx wx 0+ uy vy wy 0+ uz vz wz 0+ 0 0 0 1)-- <> (transl (-ex) (-ey) (-ez))+ where+ w@(Vec4 wx wy wz _) = norm $ dir+ u@(Vec4 ux uy uz _) = norm $ up `vec4crossvec4` w+ v@(Vec4 vx vy vz _) = norm $ w `vec4crossvec4` u+ ++mat44pos :: Matrix4 -> (FloatType,FloatType,FloatType,FloatType)+mat44pos+ (Matrix4+ _ _ _ _+ _ _ _ _+ _ _ _ _+ x y z w+ )+ = (x,y,z,w)++perpectiveMatrix fov aspect near far = Matrix4+ m00 0 0 0+ 0 m11 0 0+ 0 0 m22 (-1)+ 0 0 m32 0+ where+ slopey = tan $ fov * pi / 360+ m00 = 1 / slopey / aspect+ m11 = 1 / slopey+ m22 = -(near + far) / (far - near)+ m32 = -2 * near * far / (far - near)
+ Graphics/LambdaCube/Mesh.hs view
@@ -0,0 +1,212 @@+module Graphics.LambdaCube.Mesh where++import Data.Map (Map)+import qualified Data.Map as Map++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.RenderOperation+import Graphics.LambdaCube.HardwareBuffer+import Graphics.LambdaCube.HardwareVertexBuffer+import Graphics.LambdaCube.HardwareIndexBuffer+import Graphics.LambdaCube.VertexIndexData++data (HardwareVertexBuffer vb, HardwareIndexBuffer ib) => SubMesh vb ib+ = SubMesh+ { smOperationType :: OperationType -- ^ The render operation type used to render this submesh++ {-| Dedicated vertex data (only valid if useSharedVertices = false).+ @remarks+ This data is completely owned by this submesh.+ @par+ The use of shared or non-shared buffers is determined when+ model data is converted to the OGRE .mesh format.+ -}+ , smVertexData :: Maybe (VertexData vb) -- ^ Indicates if this submesh shares vertex data with other meshes or whether it has it's own vertices. + , smIndexData :: Maybe (IndexData ib) -- ^ Face index data++ {-| Dedicated index map for translate blend index to bone index (only valid if useSharedVertices = false).+ @remarks+ This data is completely owned by this submesh.+ @par+ We collect actually used bones of all bone assignments, and build the+ blend index in 'packed' form, then the range of the blend index in vertex+ data VES_BLEND_INDICES element is continuous, with no gaps. Thus, by+ minimising the world matrix array constants passing to GPU, we can support+ more bones for a mesh when hardware skinning is used. The hardware skinning+ support limit is applied to each set of vertex data in the mesh, in other words, the+ hardware skinning support limit is applied only to the actually used bones of each+ SubMeshes, not all bones across the entire Mesh.+ @par+ Because the blend index is different to the bone index, therefore, we use+ the index map to translate the blend index to bone index.+ @par+ The use of shared or non-shared index map is determined when+ model data is converted to the OGRE .mesh format.+ -}+ --typedef vector<unsigned short>::type IndexMap;+ --IndexMap blendIndexToBoneIndexMap;++ --ProgressiveMesh::LODFaceList mLodFaceList;++ {-| A list of extreme points on the submesh (optional).+ @remarks+ These points are some arbitrary points on the mesh that are used+ by engine to better sort submeshes by depth. This doesn't matter+ much for non-transparent submeshes, as Z-buffer takes care of invisible+ surface culling anyway, but is pretty useful for semi-transparent+ submeshes because the order in which transparent submeshes must be+ rendered cannot be always correctly deduced from entity position.+ @par+ These points are intelligently chosen from the points that make up+ the submesh, the criteria for choosing them should be that these points+ somewhat characterize the submesh outline, e.g. they should not be+ close to each other, and they should be on the outer hull of the submesh.+ They can be stored in the .mesh file, or generated at runtime+ (see generateExtremes ()).+ @par+ If this array is empty, submesh sorting is done like in older versions -+ by comparing the positions of the owning entity.+ -}+ , smExtremityPoints :: [FloatType3]+ , smMaterialName :: String -- ^ Name of the material this SubMesh uses.++ -- | Is there a material yet?+-- bool mMatInitialised;++ -- | paired list of texture aliases and texture names+-- AliasTextureNamePairList mTextureAliases;++-- VertexBoneAssignmentList mBoneAssignments;++ -- | Flag indicating that bone assignments need to be recompiled+-- bool mBoneAssignmentsOutOfDate;++ -- | Type of vertex animation for dedicated vertex data (populated by Mesh)+-- mutable VertexAnimationType mVertexAnimationType;++ -- | Is Build Edges Enabled+-- bool mBuildEdgesEnabled;+ }++data (HardwareVertexBuffer vb, HardwareIndexBuffer ib) => Mesh vb ib+ = Mesh+ { msSubMeshList :: [SubMesh vb ib]+ {-| A hashmap used to store optional SubMesh names.+ Translates a name into SubMesh index+ -}+--typedef HashMap<String, ushort> SubMeshNameMap ;+++--ected:++--DataStreamPtr mFreshFromDisk;++--SubMeshNameMap mSubMeshNameMap ;+ , msSubMeshNameMap :: Map String Int++ -- | Local bounding box volume+ -- TODO: AxisAlignedBox mAABB;+ ---- | Local bounding sphere radius (centered on object)+ , msBoundRadius :: FloatType++ -- | Optional linked skeleton+ , msSkeletonName :: String+-- TODO: , msSkeleton :: Skeleton+++-- TODO: VertexBoneAssignmentList mBoneAssignments;++-- | Flag indicating that bone assignments need to be recompiled+-- TODO: bool mBoneAssignmentsOutOfDate;++-- TODO: const LodStrategy *mLodStrategy;+-- TODO: bool mIsLodManual;+-- TODO: ushort mNumLods;+-- TODO: MeshLodUsageList mMeshLodUsageList;++ , msVertexBufferUsage :: Usage+ , msIndexBufferUsage :: Usage+ , msVertexBufferShadowBuffer :: Bool+ , msIndexBufferShadowBuffer :: Bool+++-- TODO: bool mPreparedForShadowVolumes;+-- TODO: bool mEdgeListsBuilt;+-- TODO: bool mAutoBuildEdgeLists;++-- | Storage of morph animations, lookup by name+-- TODO: typedef map<String, Animation*>::type AnimationList;+-- TODO: AnimationList mAnimationsList;+-- | The vertex animation type associated with the shared vertex data+-- TODO: mutable VertexAnimationType mSharedVertexDataAnimationType;+-- | Do we need to scan animations for animation types?+-- TODO: mutable bool mAnimationTypesDirty;++-- | List of available poses for shared and dedicated geometryPoseList+-- TODO: PoseList mPoseList;++{-| Shared vertex data.+ @remarks+ This vertex data can be shared among multiple submeshes. SubMeshes may not have+ their own VertexData, they may share this one.+ @par+ The use of shared or non-shared buffers is determined when+ model data is converted to the OGRE .mesh format.+-}+ , msSharedVertexData :: Maybe (VertexData vb)++{-| Shared index map for translating blend index to bone index.+ @remarks+ This index map can be shared among multiple submeshes. SubMeshes might not have+ their own IndexMap, they might share this one.+ @par+ We collect actually used bones of all bone assignments, and build the+ blend index in 'packed' form, then the range of the blend index in vertex+ data VES_BLEND_INDICES element is continuous, with no gaps. Thus, by+ minimising the world matrix array constants passing to GPU, we can support+ more bones for a mesh when hardware skinning is used. The hardware skinning+ support limit is applied to each set of vertex data in the mesh, in other words, the+ hardware skinning support limit is applied only to the actually used bones of each+ SubMeshes, not all bones across the entire Mesh.+ @par+ Because the blend index is different to the bone index, therefore, we use+ the index map to translate the blend index to bone index.+ @par+ The use of shared or non-shared index map is determined when+ model data is converted to the OGRE .mesh format.+-}+-- TODO: IndexMap sharedBlendIndexToBoneIndexMap;+ }++{-+-- TODO: create generic functions which operate on buffer elements+mapFloatType3M_ :: (FloatType -> FloatType -> FloatType -> IO a) -> (Int,Ptr FloatType,Int) -> IO ()+mapFloatType3M_ f (cnt,ptr,stride) = do+ let s' = if stride == 0 then 4 else stride+ mapM_ (g ptr s') [0..(cnt-1)]+ where+ g ptr stride i = do+ let p = plusPtr ptr $ stride * i+ x <- peekElemOff p 0+ y <- peekElemOff p 1+ z <- peekElemOff p 2+ f x y z++foldFloatType3M :: ((FloatType,FloatType,FloatType) -> b -> b) -> b -> (Int,Ptr FloatType,Int) -> IO b+foldFloatType3M f a (cnt,ptr,stride) = do+ let s' = if stride == 0 then 4 else stride+ foldM (g ptr s') a [0..(cnt-1)]+ where+ g ptr stride e i = do+ let p = plusPtr ptr $ stride * i+ x <- peekElemOff p 0+ y <- peekElemOff p 1+ z <- peekElemOff p 2+ return $ f (x,y,z) e+-}++--calculateBoundingRadius :: Mesh -> IO FloatType+--calculateBoundingRadius m = do+ -- collect vertex data+ -- find +-- return
+ Graphics/LambdaCube/Pass.hs view
@@ -0,0 +1,120 @@+module Graphics.LambdaCube.Pass where++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Common+import Graphics.LambdaCube.BlendMode+import Graphics.LambdaCube.Light+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.TextureUnitState+import Graphics.LambdaCube.GpuProgram+import Graphics.LambdaCube.GpuProgramUsage++-- | Categorisation of passes for the purpose of additive lighting+data IlluminationStage+ = IS_AMBIENT -- ^ Part of the rendering which occurs without any kind of direct lighting+ | IS_PER_LIGHT -- ^ Part of the rendering which occurs per light+ | IS_DECAL -- ^ Post-lighting rendering+ | IS_UNKNOWN -- ^ Not determined+ deriving Eq++data (Texture t, LinkedGpuProgram lp) => Pass t lp+ = Pass+ { psName :: String -- ^ optional name for the pass+ + -- Colour properties, only applicable in fixed-function passes+ , psAmbient :: ColourValue+ , psDiffuse :: ColourValue+ , psSpecular :: ColourValue+ , psEmissive :: ColourValue+ , psShininess :: FloatType+ , psTracking :: TrackVertexColourType+ + -- Blending factors+ , psSourceBlendFactor :: SceneBlendFactor+ , psDestBlendFactor :: SceneBlendFactor+ , psSourceBlendFactorAlpha :: SceneBlendFactor+ , psDestBlendFactorAlpha :: SceneBlendFactor++ , psSeparateBlend :: Bool -- ^ Used to determine if separate alpha blending should be used for color and alpha channels++ -- Blending operations+ , psBlendOperation :: SceneBlendOperation+ , psAlphaBlendOperation :: SceneBlendOperation+ , psSeparateBlendOperation :: Bool -- ^ Determines if we should use separate blending operations for color and alpha channels++ -- Depth buffer settings+ , psDepthCheck :: Bool+ , psDepthWrite :: Bool+ , psDepthFunc :: CompareFunction+ , psDepthBiasConstant :: FloatType+ , psDepthBiasSlopeScale :: FloatType+ , psDepthBiasPerIteration :: FloatType++ -- Colour buffer settings+ , psColourWrite :: Bool+ + -- Alpha reject settings+ , psAlphaRejectFunc :: CompareFunction+ , psAlphaRejectVal :: Int+ , psAlphaToCoverageEnabled :: Bool++ , psTransparentSorting :: Bool -- ^ Transparent depth sorting+ , psTransparentSortingForced :: Bool -- ^ Transparent depth sorting forced+ + -- Culling mode+ , psCullMode :: CullingMode+ , psManualCullMode :: ManualCullingMode+ + , psLightingEnabled :: Bool -- ^ Lighting enabled?+ , psMaxSimultaneousLights :: Int -- ^ Max simultaneous lights+ , psStartLight :: Int -- ^ Starting light index+ , psLightsPerIteration :: Maybe Int -- ^ Run this pass once per light? Iterate per how many lights?+ , psOnlyLightType :: Maybe LightTypes -- ^ Should it only be run for a certain light type?++ , psShadeOptions :: ShadeOptions -- ^ Shading options+ , psPolygonMode :: PolygonMode -- ^ Polygon mode++ -- Normalisation+ , psNormaliseNormals :: Bool+ , psPolygonModeOverrideable :: Bool+ + -- Fog+ , psFogOverride :: Bool+ , psFogMode :: FogMode+ , psFogColour :: ColourValue+ , psFogStart :: FloatType+ , psFogEnd :: FloatType+ , psFogDensity :: FloatType+ + , psTextureUnitStates :: [TextureUnitState t]++ , psVertexProgramUsage :: Maybe GpuProgramUsage -- ^ Vertex program details+-- , psShadowCasterVertexProgramUsage :: GpuProgramUsage -- ^ Vertex program details+-- , psShadowReceiverVertexProgramUsage :: GpuProgramUsage -- ^ Vertex program details+ , psFragmentProgramUsage :: Maybe GpuProgramUsage -- ^ Fragment program details+-- , psShadowReceiverFragmentProgramUsage :: GpuProgramUsage -- ^ Fragment program details+ , psGeometryProgramUsage :: Maybe GpuProgramUsage -- ^ Geometry program details+-- , psQueuedForDeletion :: Bool -- ^ Is this pass queued for deletion?+ , psLinkedGpuProgram :: Maybe lp++ , psPassIterationCount :: Int -- ^ number of pass iterations to perform++ , psPointSize :: FloatType -- ^ point size, applies when not using per-vertex point size+ , psPointMinSize :: FloatType+ , psPointMaxSize :: FloatType+ , psPointSpritesEnabled :: Bool+ , psPointAttenuationEnabled :: Bool+ , psPointAttenuationCoeffs :: FloatType3 -- ^ constant, linear, quadratic coeffs++ {-+ // TU Content type lookups+ typedef vector<unsigned short>::type ContentTypeLookup;+ mutable ContentTypeLookup mShadowContentTypeLookup;+ mutable bool mContentTypeLookupBuilt;+ -} + , psLightScissoring :: Bool -- ^ Scissoring for the light?+ , psLightClipPlanes :: Bool -- ^ User clip planes for light?+ , psIlluminationStage :: IlluminationStage -- ^ Illumination stage?+ }+ deriving Eq+
+ Graphics/LambdaCube/PixelFormat.hs view
@@ -0,0 +1,494 @@+module Graphics.LambdaCube.PixelFormat where++import Data.Word+import Foreign.Ptr++-- | The pixel format used for images, textures, and render surfaces+data PixelFormat+ = PF_UNKNOWN -- ^ Unknown pixel format.+ | PF_L8 -- ^ 8-bit pixel format, all bits luminace.+-- | PF_BYTE_L = PF_L8+ | PF_L16 -- ^ 16-bit pixel format, all bits luminace.+-- | PF_SHORT_L = PF_L16+ | PF_A8 -- ^ 8-bit pixel format, all bits alpha.+-- | PF_BYTE_A = PF_A8+ | PF_A4L4 -- ^ 8-bit pixel format, 4 bits alpha, 4 bits luminance.+ | PF_BYTE_LA -- ^ 2 byte pixel format, 1 byte luminance, 1 byte alpha+ | PF_R5G6B5 -- ^ 16-bit pixel format, 5 bits red, 6 bits green, 5 bits blue.+ | PF_B5G6R5 -- ^ 16-bit pixel format, 5 bits red, 6 bits green, 5 bits blue.+ | PF_R3G3B2 -- ^ 8-bit pixel format, 2 bits blue, 3 bits green, 3 bits red.+ | PF_A4R4G4B4 -- ^ 16-bit pixel format, 4 bits for alpha, red, green and blue.+ | PF_A1R5G5B5 -- ^ 16-bit pixel format, 5 bits for blue, green, red and 1 for alpha.+ | PF_R8G8B8 -- ^ 24-bit pixel format, 8 bits for red, green and blue.+ | PF_B8G8R8 -- ^ 24-bit pixel format, 8 bits for blue, green and red.+ | PF_A8R8G8B8 -- ^ 32-bit pixel format, 8 bits for alpha, red, green and blue.+ | PF_A8B8G8R8 -- ^ 32-bit pixel format, 8 bits for blue, green, red and alpha.+ | PF_B8G8R8A8 -- ^ 32-bit pixel format, 8 bits for blue, green, red and alpha.+ | PF_R8G8B8A8 -- ^ 32-bit pixel format, 8 bits for red, green, blue and alpha.+ | PF_X8R8G8B8 -- ^ 32-bit pixel format, 8 bits for red, 8 bits for green, 8 bits for blue+ -- like PF_A8R8G8B8, but alpha will get discarded+ | PF_X8B8G8R8 -- ^ 32-bit pixel format, 8 bits for blue, 8 bits for green, 8 bits for red+ -- like PF_A8B8G8R8, but alpha will get discarded+{-+#if OGRE_ENDIAN == OGRE_ENDIAN_BIG+-- ^ 3 byte pixel format, 1 byte for red, 1 byte for green, 1 byte for blue+PF_BYTE_RGB = PF_R8G8B8,+-- ^ 3 byte pixel format, 1 byte for blue, 1 byte for green, 1 byte for red+PF_BYTE_BGR = PF_B8G8R8,+-- ^ 4 byte pixel format, 1 byte for blue, 1 byte for green, 1 byte for red and one byte for alpha+PF_BYTE_BGRA = PF_B8G8R8A8,+-- ^ 4 byte pixel format, 1 byte for red, 1 byte for green, 1 byte for blue, and one byte for alpha+PF_BYTE_RGBA = PF_R8G8B8A8,+#else+-- ^ 3 byte pixel format, 1 byte for red, 1 byte for green, 1 byte for blue+PF_BYTE_RGB = PF_B8G8R8,+-- ^ 3 byte pixel format, 1 byte for blue, 1 byte for green, 1 byte for red+PF_BYTE_BGR = PF_R8G8B8,+-- ^ 4 byte pixel format, 1 byte for blue, 1 byte for green, 1 byte for red and one byte for alpha+PF_BYTE_BGRA = PF_A8R8G8B8,+-- ^ 4 byte pixel format, 1 byte for red, 1 byte for green, 1 byte for blue, and one byte for alpha+PF_BYTE_RGBA = PF_A8B8G8R8,+#endif +-}++ | PF_A2R10G10B10 -- ^ 32-bit pixel format, 2 bits for alpha, 10 bits for red, green and blue.+ | PF_A2B10G10R10 -- ^ 32-bit pixel format, 10 bits for blue, green and red, 2 bits for alpha.+ | PF_DXT1 -- ^ DDS (DirectDraw Surface) DXT1 format+ | PF_DXT2 -- ^ DDS (DirectDraw Surface) DXT2 format+ | PF_DXT3 -- ^ DDS (DirectDraw Surface) DXT3 format+ | PF_DXT4 -- ^ DDS (DirectDraw Surface) DXT4 format+ | PF_DXT5 -- ^ DDS (DirectDraw Surface) DXT5 format+ | PF_FLOAT16_R -- 16-bit pixel format, 16 bits (float) for red+ | PF_FLOAT16_RGB -- 48-bit pixel format, 16 bits (float) for red, 16 bits (float) for green, 16 bits (float) for blue+ | PF_FLOAT16_RGBA -- 64-bit pixel format, 16 bits (float) for red, 16 bits (float) for green, 16 bits (float) for blue, 16 bits (float) for alpha+ | PF_FLOAT32_R -- 16-bit pixel format, 16 bits (float) for red+ | PF_FLOAT32_RGB -- 96-bit pixel format, 32 bits (float) for red, 32 bits (float) for green, 32 bits (float) for blue+ | PF_FLOAT32_RGBA -- 128-bit pixel format, 32 bits (float) for red, 32 bits (float) for green, 32 bits (float) for blue, 32 bits (float) for alpha+ | PF_FLOAT16_GR -- 32-bit, 2-channel s10e5 floating point pixel format, 16-bit green, 16-bit red+ | PF_FLOAT32_GR -- 64-bit, 2-channel floating point pixel format, 32-bit green, 32-bit red+ | PF_DEPTH -- Depth texture format+ | PF_SHORT_RGBA -- 64-bit pixel format, 16 bits for red, green, blue and alpha+ | PF_SHORT_GR -- 32-bit pixel format, 16-bit green, 16-bit red+ | PF_SHORT_RGB -- 48-bit pixel format, 16 bits for red, green and blue+ deriving Eq++-- | Flags defining some on/off properties of pixel formats+{-+ PFF_HASALPHA = 0x00000001, + PFF_COMPRESSED = 0x00000002,+ PFF_FLOAT = 0x00000004, + PFF_DEPTH = 0x00000008,+ PFF_NATIVEENDIAN = 0x00000010,+ PFF_LUMINANCE = 0x00000020+-}+data PixelFormatFlags+ = PFF_HASALPHA -- ^ This format has an alpha channel+ | PFF_COMPRESSED -- ^ This format is compressed. This invalidates the values in elemBytes,+ -- elemBits and the bit counts as these might not be fixed in a compressed format.+ | PFF_FLOAT -- ^ This is a floating point format+ | PFF_DEPTH -- ^ This is a depth format (for depth textures)+ | PFF_NATIVEENDIAN -- ^ Format is in native endian. Generally true for the 16, 24 and 32 bits+ -- formats which can be represented as machine integers.+ | PFF_LUMINANCE -- ^ This is an intensity format instead of a RGB one. The luminance+ -- replaces R,G and B. (but not A)++-- | Pixel component format+data PixelComponentType+ = PCT_BYTE -- | Byte per component (8 bit fixed 0.0..1.0)+ | PCT_SHORT -- | Short per component (16 bit fixed 0.0..1.0))+ | PCT_FLOAT16 -- | 16 bit float per component+ | PCT_FLOAT32 -- | 32 bit float per component++ {-| Structure used to define a box in a 3-D integer space.+ Note that the left, top, and front edges are included but the right, + bottom and back ones are not.+ -}+-- struct Box+-- {+-- size_t left, top, right, bottom, front, back;+ -- | Parameterless constructor for setting the members manually+-- Box()+-- : left(0), top(0), right(1), bottom(1), front(0), back(1)+-- {+-- }+ {-| Define a box from left, top, right and bottom coordinates+ This box will have depth one (front=0 and back=1).+ @param l x value of left edge+ @param t y value of top edge+ @param r x value of right edge+ @param b y value of bottom edge+ @note Note that the left, top, and front edges are included + but the right, bottom and back ones are not.+ -}+-- Box( size_t l, size_t t, size_t r, size_t b ):+-- left(l),+-- top(t), +-- right(r),+-- bottom(b),+-- front(0),+-- back(1)+-- {+-- assert(right >= left && bottom >= top && back >= front);+-- }+ {-| Define a box from left, top, front, right, bottom and back+ coordinates.+ @param l x value of left edge+ @param t y value of top edge+ @param ff z value of front edge+ @param r x value of right edge+ @param b y value of bottom edge+ @param bb z value of back edge+ @note Note that the left, top, and front edges are included + but the right, bottom and back ones are not.+ -}+-- Box( size_t l, size_t t, size_t ff, size_t r, size_t b, size_t bb ):+-- left(l),+-- top(t), +-- right(r),+-- bottom(b),+-- front(ff),+-- back(bb)+-- {+-- assert(right >= left && bottom >= top && back >= front);+-- }+ + -- | Return true if the other box is a part of this one+-- bool contains(const Box &def) const+-- {+-- return (def.left >= left && def.top >= top && def.front >= front &&+-- def.right <= right && def.bottom <= bottom && def.back <= back);+-- }+ + -- | Get the width of this box+-- size_t getWidth() const { return right-left; }+ -- | Get the height of this box+-- size_t getHeight() const { return bottom-top; }+ -- | Get the depth of this box+-- size_t getDepth() const { return back-front; }+-- };++{-| A primitive describing a volume (3D), image (2D) or line (1D) of pixels in memory.+ In case of a rectangle, depth must be 1. + Pixels are stored as a succession of "depth" slices, each containing "height" rows of + "width" pixels.+-}+data PixelBox+ = PixelBox+ { pbPixelData :: Ptr Word8+ , pbPixelFormat :: PixelFormat+ , pbLeft :: Int+ , pbTop :: Int+ , pbRight :: Int+ , pbBottom :: Int+ , pbFront :: Int+ , pbBack :: Int+ }+ +-- class _OgreExport PixelBox: public Box, public ImageAlloc {+-- public:+ -- | Parameter constructor for setting the members manually+-- PixelBox() {}+-- ~PixelBox() {}+ {-| Constructor providing extents in the form of a Box object. This constructor+ assumes the pixel data is laid out consecutively in memory. (this+ means row after row, slice after slice, with no space in between)+ @param extents Extents of the region defined by data+ @param pixelFormat Format of this buffer+ @param pixelData Pointer to the actual data+ -}+-- PixelBox(const Box &extents, PixelFormat pixelFormat, void *pixelData=0):+-- Box(extents), data(pixelData), format(pixelFormat)+-- {+-- setConsecutive();+-- }+ {-| Constructor providing width, height and depth. This constructor+ assumes the pixel data is laid out consecutively in memory. (this+ means row after row, slice after slice, with no space in between)+ @param width Width of the region+ @param height Height of the region+ @param depth Depth of the region+ @param pixelFormat Format of this buffer+ @param pixelData Pointer to the actual data+ -}+-- PixelBox(size_t width, size_t height, size_t depth, PixelFormat pixelFormat, void *pixelData=0):+-- Box(0, 0, 0, width, height, depth),+-- data(pixelData), format(pixelFormat)+-- {+-- setConsecutive();+-- }+ + -- | The data pointer +-- void *data;+ -- | The pixel format +-- PixelFormat format;+ {-| Number of elements between the leftmost pixel of one row and the left+ pixel of the next. This value must always be equal to getWidth() (consecutive) + for compressed formats.+ -}+-- size_t rowPitch;+ {-| Number of elements between the top left pixel of one (depth) slice and + the top left pixel of the next. This can be a negative value. Must be a multiple of+ rowPitch. This value must always be equal to getWidth()*getHeight() (consecutive) + for compressed formats.+ -}+-- size_t slicePitch;+ + {-| Set the rowPitch and slicePitch so that the buffer is laid out consecutive + in memory.+ -} +-- void setConsecutive()+-- {+-- rowPitch = getWidth();+-- slicePitch = getWidth()*getHeight();+-- }+ {-| Get the number of elements between one past the rightmost pixel of + one row and the leftmost pixel of the next row. (IE this is zero if rows+ are consecutive).+ -}+-- size_t getRowSkip() const { return rowPitch - getWidth(); }+ {-| Get the number of elements between one past the right bottom pixel of+ one slice and the left top pixel of the next slice. (IE this is zero if slices+ are consecutive).+ -}+-- size_t getSliceSkip() const { return slicePitch - (getHeight() * rowPitch); }++ {-| Return whether this buffer is laid out consecutive in memory (ie the pitches+ are equal to the dimensions)+ -} +-- bool isConsecutive() const +-- { +-- return rowPitch == getWidth() && slicePitch == getWidth()*getHeight(); +-- }+ {-| Return the size (in bytes) this image would take if it was+ laid out consecutive in memory+ -}+-- size_t getConsecutiveSize() const;+ {-| Return a subvolume of this PixelBox.+ @param def Defines the bounds of the subregion to return+ @returns A pixel box describing the region and the data in it+ @remarks This function does not copy any data, it just returns+ a PixelBox object with a data pointer pointing somewhere inside + the data of object.+ @throws Exception(ERR_INVALIDPARAMS) if def is not fully contained+ -}+-- PixelBox getSubVolume(const Box &def) const;+-- };++{-| Returns the size in bytes of an element of the given pixel format.+ @returns+ The size in bytes of an element. See Remarks.+ @remarks+ Passing PF_UNKNOWN will result in returning a size of 0 bytes.+-}+--TODO getNumElemBytes :: PixelFormat -> Int+--static size_t getNumElemBytes( PixelFormat format );++{-| Returns the size in bits of an element of the given pixel format.+ @returns+ The size in bits of an element. See Remarks.+ @remarks+ Passing PF_UNKNOWN will result in returning a size of 0 bits.+-}+--TODO getNumElemBits :: PixelFormat -> Int+--static size_t getNumElemBits( PixelFormat format );++{-| Returns the size in memory of a region with the given extents and pixel+ format with consecutive memory layout.+ @param width+ The width of the area+ @param height+ The height of the area+ @param depth+ The depth of the area+ @param format+ The format of the area+ @returns+ The size in bytes+ @remarks+ In case that the format is non-compressed, this simply returns+ width*height*depth*PixelUtil::getNumElemBytes(format). In the compressed+ case, this does serious magic.+-}+--TODO getMemorySize :: Int -> Int -> Int -> PixelFormat -> Int+--static size_t getMemorySize(size_t width, size_t height, size_t depth, PixelFormat format);++{-| Returns the property flags for this pixel format+ @returns+ A bitfield combination of PFF_HASALPHA, PFF_ISCOMPRESSED,+ PFF_FLOAT, PFF_DEPTH, PFF_NATIVEENDIAN, PFF_LUMINANCE+ @remarks+ This replaces the seperate functions for formatHasAlpha, formatIsFloat, ...+-}+--static unsigned int getFlags( PixelFormat format );++-- | Shortcut method to determine if the format has an alpha component+--TODO hasAlpha :: PixelFormat -> Bool+--static bool hasAlpha(PixelFormat format);++-- | Shortcut method to determine if the format is floating point+--TODO isFloatingPoint :: PixelFormat -> Bool+--static bool isFloatingPoint(PixelFormat format);++-- | Shortcut method to determine if the format is compressed+--TODO isCompressed :: PixelFormat -> Bool+--static bool isCompressed(PixelFormat format);++-- | Shortcut method to determine if the format is a depth format.+--TODO isDepth :: PixelFormat -> Bool+--static bool isDepth(PixelFormat format);++-- | Shortcut method to determine if the format is in native endian format.+--TODO isNativeEndian :: PixelFormat -> Bool+--static bool isNativeEndian(PixelFormat format);++-- | Shortcut method to determine if the format is a luminance format.+--TODO isLuminance :: PixelFormat -> Bool+--static bool isLuminance(PixelFormat format);++{-| Return wether a certain image extent is valid for this image format.+ @param width+ The width of the area+ @param height+ The height of the area+ @param depth+ The depth of the area+ @param format+ The format of the area+ @remarks For non-compressed formats, this is always true. For DXT formats,+ only sizes with a width and height multiple of 4 and depth 1 are allowed.+-}+--TODO isValidExtent :: Int -> Int -> Int -> PixelFormat -> Bool+--static bool isValidExtent(size_t width, size_t height, size_t depth, PixelFormat format);++{-| Gives the number of bits (RGBA) for a format. See remarks. + @remarks For non-colour formats (dxt, depth) this returns [0,0,0,0].+-}+--TODO static void getBitDepths(PixelFormat format, int rgba[4]);++{-| Gives the masks for the R, G, B and A component+ @note Only valid for native endian formats+-}+--TODO static void getBitMasks(PixelFormat format, uint32 rgba[4]);++{-| Gives the bit shifts for R, G, B and A component+@note Only valid for native endian formats+-}+--TODO static void getBitShifts(PixelFormat format, unsigned char rgba[4]);++-- | Gets the name of an image format+--TODO getFormatName :: PixelFormat -> String+--static String getFormatName(PixelFormat srcformat);++{-| Returns wether the format can be packed or unpacked with the packColour()+and unpackColour() functions. This is generally not true for compressed and+depth formats as they are special. It can only be true for formats with a+fixed element size.+ @returns + true if yes, otherwise false+-}+--TODO static bool isAccessible(PixelFormat srcformat);++{-| Returns the component type for a certain pixel format. Returns PCT_BYTE+ in case there is no clear component type like with compressed formats.+ This is one of PCT_BYTE, PCT_SHORT, PCT_FLOAT16, PCT_FLOAT32.+-}+--TODO getComponentType :: PixelFormat -> PixelComponentType+--static PixelComponentType getComponentType(PixelFormat fmt);++{-| Returns the component count for a certain pixel format. Returns 3(no alpha) or + 4 (has alpha) in case there is no clear component type like with compressed formats.+ -}+--TODO getComponentCount :: PixelFormat -> Int+--static size_t getComponentCount(PixelFormat fmt);++{-| Gets the format from given name.+ @param name The string of format name+ @param accessibleOnly If true, non-accessible format will treat as invalid format,+ otherwise, all supported format are valid.+ @param caseSensitive Should be set true if string match should use case sensitivity.+ @returns The format match the format name, or PF_UNKNOWN if is invalid name.+-}+--TODO static PixelFormat getFormatFromName(const String& name, bool accessibleOnly = false, bool caseSensitive = false);++{-| Gets the BNF expression of the pixel-formats.+ @note The string returned by this function is intented to use as a BNF expression+ to work with Compiler2Pass.+ @param accessibleOnly If true, only accessible pixel format will take into account, otherwise all+ pixel formats list in PixelFormat enumeration will being returned.+ @returns A string contains the BNF expression.+-}+--TODO static String getBNFExpressionOfPixelFormats(bool accessibleOnly = false);++{-| Returns the similar format but acoording with given bit depths.+ @param fmt The original foamt.+ @param integerBits Preferred bit depth (pixel bits) for integer pixel format.+ Available values: 0, 16 and 32, where 0 (the default) means as it is.+ @param floatBits Preferred bit depth (channel bits) for float pixel format.+ Available values: 0, 16 and 32, where 0 (the default) means as it is.+ @returns The format that similar original format with bit depth according+ with preferred bit depth, or original format if no convertion occuring.+-}+--TODO getFormatForBitDepths :: PixelFormat -> Int -> Int -> PixelFormat+--static PixelFormat getFormatForBitDepths(PixelFormat fmt, ushort integerBits, ushort floatBits);++{-| Pack a colour value to memory+ @param colour The colour+ @param pf Pixelformat in which to write the colour+ @param dest Destination memory location+-}+--TODO static void packColour(const ColourValue &colour, const PixelFormat pf, void* dest);+{-| Pack a colour value to memory+ @param r,g,b,a The four colour components, range 0x00 to 0xFF+ @param pf Pixelformat in which to write the colour+ @param dest Destination memory location+-}+--TODO static void packColour(const uint8 r, const uint8 g, const uint8 b, const uint8 a, const PixelFormat pf, void* dest);+ {-| Pack a colour value to memory+ @param r,g,b,a The four colour components, range 0.0f to 1.0f+ (an exception to this case exists for floating point pixel+ formats, which don't clamp to 0.0f..1.0f)+ @param pf Pixelformat in which to write the colour+ @param dest Destination memory location+-}+--TODO static void packColour(const float r, const float g, const float b, const float a, const PixelFormat pf, void* dest);++{-| Unpack a colour value from memory+ @param colour The colour is returned here+ @param pf Pixelformat in which to read the colour+ @param src Source memory location+-}+--TODO static void unpackColour(ColourValue *colour, PixelFormat pf, const void* src);+{-| Unpack a colour value from memory+ @param r,g,b,a The colour is returned here (as byte)+ @param pf Pixelformat in which to read the colour+ @param src Source memory location+ @remarks This function returns the colour components in 8 bit precision,+ this will lose precision when coming from PF_A2R10G10B10 or floating+ point formats. +-}+--TODO static void unpackColour(uint8 *r, uint8 *g, uint8 *b, uint8 *a, PixelFormat pf, const void* src);+{-| Unpack a colour value from memory+ @param r,g,b,a The colour is returned here (as float)+ @param pf Pixelformat in which to read the colour+ @param src Source memory location+-}+--TODO static void unpackColour(float *r, float *g, float *b, float *a, PixelFormat pf, const void* src); ++{-| Convert consecutive pixels from one format to another. No dithering or filtering is being done. + Converting from RGB to luminance takes the R channel. In case the source and destination format match,+ just a copy is done.+ @param src Pointer to source region+ @param srcFormat Pixel format of source region+ @param dst Pointer to destination region+ @param dstFormat Pixel format of destination region+ -}+--TODO static void bulkPixelConversion(void *src, PixelFormat srcFormat, void *dest, PixelFormat dstFormat, unsigned int count);++{-| Convert pixels from one format to another. No dithering or filtering is being done. Converting+ from RGB to luminance takes the R channel. + @param src PixelBox containing the source pixels, pitches and format+ @param dst PixelBox containing the destination pixels, pitches and format+ @remarks The source and destination boxes must have the same+ dimensions. In case the source and destination format match, a plain copy is done.+-}+--TODO static void bulkPixelConversion(const PixelBox &src, const PixelBox &dst);
+ Graphics/LambdaCube/RenderOperation.hs view
@@ -0,0 +1,31 @@+module Graphics.LambdaCube.RenderOperation where++import Graphics.LambdaCube.HardwareVertexBuffer+import Graphics.LambdaCube.HardwareIndexBuffer+import Graphics.LambdaCube.VertexIndexData++-- | The rendering operation type to perform+data OperationType+ = OT_POINT_LIST -- ^ A list of points, 1 vertex per point+ | OT_LINE_LIST -- ^ A list of lines, 2 vertices per line+ | OT_LINE_STRIP -- ^ A strip of connected lines, 1 vertex per line plus 1 start vertex+ | OT_TRIANGLE_LIST -- ^ A list of triangles, 3 vertices per triangle+ | OT_TRIANGLE_STRIP -- ^ A strip of triangles, 3 vertices for the first triangle, and 1 per triangle after that + | OT_TRIANGLE_FAN -- ^ A fan of triangles, 3 vertices for the first triangle, and 1 per triangle after that+ deriving (Eq,Enum)+++-- | 'New' rendering operation using vertex buffers.+data (HardwareVertexBuffer vb, HardwareIndexBuffer ib) => RenderOperation vb ib+ = RenderOperation+ { roVertexData :: VertexData vb -- ^ Vertex source data+ , roOperationType :: OperationType -- ^ The type of operation to perform+ {-| Specifies whether to use indexes to determine the vertices to use as input. If false, the vertices are+ simply read in sequence to define the primitives. If true, indexes are used instead to identify vertices+ anywhere in the buffer, and allowing vertices to be used more than once.+ If true, then the indexBuffer, indexStart and numIndexes properties must be valid.+ -}+ , roIndexData :: Maybe (IndexData ib) -- ^ Index data - only valid if useIndexes is true+-- , roSrcRenderable :: Renderable -- ^ Debug pointer back to renderable which created this+ }+ deriving Eq
+ Graphics/LambdaCube/RenderQueue.hs view
@@ -0,0 +1,225 @@+module Graphics.LambdaCube.RenderQueue where++import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap+import Data.List+import Data.Maybe+import Control.Monad++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Utility+import Graphics.LambdaCube.Pass+import Graphics.LambdaCube.Light+import Graphics.LambdaCube.RenderOperation+import Graphics.LambdaCube.VertexIndexData+import Graphics.LambdaCube.RenderSystem+import Graphics.LambdaCube.HardwareVertexBuffer+import Graphics.LambdaCube.HardwareIndexBuffer+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.TextureUnitState+import Graphics.LambdaCube.GpuProgram++-- Standard Render Queues+constRenderQueueBackground = 0 :: Int+constRenderQueueSkiesEarly = 5 :: Int -- ^ First queue (after backgrounds), used for skyboxes if rendered first+constRenderQueue1 = 10 :: Int+constRenderQueue2 = 20 :: Int+constRenderQueueWorldGeometry1 = 25 :: Int+constRenderQueue3 = 30 :: Int+constRenderQueue4 = 40 :: Int+constRenderQueueMain = 50 :: Int -- ^ The default render queue+constRenderQueue6 = 60 :: Int+constRenderQueue7 = 70 :: Int+constRenderQueueWorldGeometry2 = 75 :: Int+constRenderQueue8 = 80 :: Int+constRenderQueue9 = 90 :: Int+constRenderQueueSkiesLate = 95 :: Int -- ^ Penultimate queue(before overlays), used for skyboxes if rendered last+constRenderQueueOverlay = 100 :: Int -- ^ Use this queue for objects which must be rendered last e.g. overlays+constRenderQueueMax = 105 :: Int -- ^ Final possible render queue, don't exceed this++constRenderableDefaultPriority = 100 :: Int++data RenderGroupOptions+ = RenderGroupOptions+ { rqoShadowsEnabled :: Bool+ }++defaultRenderGroupOptions = RenderGroupOptions+ { rqoShadowsEnabled = True+ }++-- | Struct associating a single Pass with a single Renderable. +data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => RenderablePass vb ib t lp+ = RenderablePass+ { rpOperation :: RenderOperation vb ib+ , rpPass :: Pass t lp+ , rpMatrix :: Matrix4+ , rpLights :: [(Matrix4,Light)]+ }++data RenderStatistics+ = RenderStatistics+ { rsFaceCount :: Int+ , rsVertexCount :: Int+ , rsBatchCount :: Int+ }+ deriving Show+ +emptyRenderStatistics = RenderStatistics+ { rsFaceCount = 0+ , rsVertexCount = 0+ , rsBatchCount = 0+ }++--renderPassGroup :: RenderSystem -> RenderablePass -> IO ()+renderPassGroup time rs rstat r = do+ let pass = rpPass $ head r+ depthBiasConstant = psDepthBiasConstant pass+ depthBiasPerIter = psDepthBiasPerIteration pass+ depthBiasSlopeScale = psDepthBiasSlopeScale pass+ iterationCnt = psPassIterationCount pass+ geomCmp a b = rpOperation a == rpOperation b+ geomSort a b = case geomCmp a b of+ { True -> EQ+ ; False -> GT+ }+ renderGeomGrp pass rst r = do+ let rop = rpOperation $ head r+ geomCnt = length r+-- print $ " geomGrp len: " ++ (show $ length r)+ --TODO: setup object related shader parameters+ bindGeometry rs rop $ psTextureUnitStates pass+ mapM_ (renderGeom pass) r+ unbindGeometry rs rop++ -- calculate statistics+ let val = if isNothing $ roIndexData rop then vdVertexCount $ roVertexData rop else idIndexCount $ fromJust $ roIndexData rop + val' = case roOperationType rop of+ { OT_TRIANGLE_LIST -> val `div` 3+ ; OT_TRIANGLE_STRIP -> val - 2+ ; OT_TRIANGLE_FAN -> val - 2+ ; _ -> 0+ }+ return RenderStatistics+ { rsFaceCount = geomCnt * iterationCnt * val' + rsFaceCount rst+ , rsVertexCount = geomCnt * (vdVertexCount $ roVertexData rop) + rsVertexCount rst+ , rsBatchCount = geomCnt * iterationCnt + rsBatchCount rst+ }++ renderGeom pass r = do+ setWorldMatrix rs $ rpMatrix r++ --TODO: do pass and per light iterations+ -- light list with attributes+ -- filter relevant lights+ let lights = drop (psStartLight pass) $ take (psMaxSimultaneousLights pass) $ filter filtL $ rpLights r+ filtL (m,l) = case psOnlyLightType pass of+ { Nothing -> True+ ; Just t -> t == (lgType l)+ }+ -- create light groups according requirement (per n light)+ lightGrp = case psLightsPerIteration pass of+ { Nothing -> [lights]+ ; Just n -> f n lights+ }+ f _ [] = []+ f n l = h:(f n t)+ where+ (h,t) = splitAt n l+ -- render n times each light group+ forM_ lightGrp $ \l -> do+ --TODO setup lights+ --TODO: useLights rs l+ --TODO: setup per light iteration shader parameters+ forM_ [1..iterationCnt] $ \pc -> do+ -- TODO: update iteration dependent parameteres:+ --TODO: setup pass iteration number shader parameter+ -- Update derived depth bias+ when (pc > 1 && depthBiasPerIter /= 0) $ setDepthBias rs (depthBiasConstant + (fromIntegral pc-1) * depthBiasPerIter) depthBiasSlopeScale+ render rs $ rpOperation r+ + setPass time rs pass +-- print $ "passGrp len: " ++ (show $ length r) ++ " " ++ show [ tusFrameNames tu | tu <- psTextureUnitStates pass ]+ --TODO: setup global pass related shader parameters+ --foldM (renderGeomGrp pass) rstat $ groupBy geomCmp $ sortBy geomSort r+ foldM (renderGeomGrp pass) rstat $ groupSetBy geomCmp r+ +--[(Matrix4,r,Int,Int)] -- ^ List of Renderable information including WorldMatrix RenderQueueID and RenderPriority+--renderCollection :: (RenderSystem rs, Renderable r) => rs -> IntMap RenderGroupOptions -> [(Matrix4,r,Int,Int)] -> IO ()+renderCollection time rs roptMap rstat rl = do++ let passCmp a b = rpPass a == rpPass b+ passSort a b = case passCmp a b of+ { True -> EQ+ ; False -> GT+ }+ --groupPass + + -- group by pass and geometry+ --passGroupRenderMethod rst a = foldM (renderPassGroup time rs) rst $ groupBy passCmp $ sortBy passSort a+ passGroupRenderMethod rst a = foldM (renderPassGroup time rs) rst $ groupSetBy passCmp a+ + -- sort by distance+ distanceSortRenderMethod = undefined+ + -- simple render+ simpleRenderMethod = undefined++ + rents = concat [r | (m,r,_,_) <- rl]+ lights = [] -- TODO+ (_,_,grpID,_) = head rl+ ropt = fromMaybe defaultRenderGroupOptions $ IntMap.lookup grpID roptMap++ -- Do solids+ rstat1 <- passGroupRenderMethod rstat [RenderablePass ro p m lights | RenderEntity ro pl m <- rents, p <- pl]+ + -- Do unsorted transparents+ --simpleRenderMethod $ rpgTransparentsUnsorted rpg+ + -- Do transparents (always descending)+ --distanceSortRenderMethod $ rpgTransparents rpg+ return rstat1++-- Fast +--renderQueue :: (RenderSystem rs, Renderable r) => rs -> IntMap RenderGroupOptions -> [(Matrix4,r,Int,Int)] -> IO ()+-- TODO: maybe we should try parallelize this code+-- HINT: Ogre uses radix sort+renderQueue time rs roptMap rstat rl = do+ let grpPriorGroupCmp (_,_,ga,pa) (_,_,gb,pb) = ga == gb && pa == pb+ grpPriorSortCmp al bl = case ga `compare` gb of+ { LT -> LT+ ; EQ -> pa `compare` pb+ ; GT -> GT+ }+ where+ (_,_,ga,pa) = {-head-} al+ (_,_,gb,pb) = {-head-} bl+-- foldM (renderCollection rs roptMap) rstat $ groupBy grpPriorGroupCmp $ sortBy grpPriorSortCmp rl+ foldM (renderCollection time rs roptMap) rstat $ groupSetBy grpPriorGroupCmp rl++----------------------------------------------------------------------------------------------------------------------------+-- Slow code below --------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------+{-+data RenderQueue+ = RenderQueue+ { rqGroupMap :: IntMap RenderGroup+ }++data RenderGroup+ = RenderGroup+ { rgPriorityGroups :: IntMap RenderPriorityGroup+ , rgShadowsEnabled :: Bool -- ^ Whether shadows are enabled for this queue+ }++data RenderPriorityGroup+ = RenderPriorityGroup+ { rpgSolidsBasic :: [RenderablePass] -- ^ Solid pass list, used when no shadows, modulative shadows, or ambient passes for additive+ , rpgSolidsDiffuseSpecular :: [RenderablePass] -- ^ Solid per-light pass list, used with additive shadows+ , rpgSolidsDecal :: [RenderablePass] -- ^ Solid decal (texture) pass list, used with additive shadows+ , rpgSolidsNoShadowReceive :: [RenderablePass] -- ^ Solid pass list, used when shadows are enabled but shadow receive is turned off for these passes+ , rpgTransparentsUnsorted :: [RenderablePass] -- ^ Unsorted transparent list+ , rpgTransparents :: [RenderablePass] -- ^ Transparent list+ }+-}
+ Graphics/LambdaCube/RenderSystem.hs view
@@ -0,0 +1,1492 @@+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}+module Graphics.LambdaCube.RenderSystem where++import Data.Word+import Data.Maybe+import qualified Data.Set as Set+import Foreign.C.Types+import Control.Monad++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Common+import Graphics.LambdaCube.BlendMode+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.GpuProgram+import Graphics.LambdaCube.TextureUnitState+import Graphics.LambdaCube.Image+import Graphics.LambdaCube.Light+import Graphics.LambdaCube.RenderSystemCapabilities+import Graphics.LambdaCube.RenderOperation+import Graphics.LambdaCube.HardwareBuffer+import Graphics.LambdaCube.HardwareVertexBuffer+import Graphics.LambdaCube.HardwareIndexBuffer+import Graphics.LambdaCube.HardwareOcclusionQuery+import Graphics.LambdaCube.PixelFormat+import Graphics.LambdaCube.Pass++-- | Enum describing the ways to generate texture coordinates+data TexCoordCalcMethod+ = TEXCALC_NONE -- ^ No calculated texture coordinates+ | TEXCALC_ENVIRONMENT_MAP -- ^ Environment map based on vertex normals+ | TEXCALC_ENVIRONMENT_MAP_PLANAR -- ^ Environment map based on vertex positions+ | TEXCALC_ENVIRONMENT_MAP_REFLECTION -- ^ Environment map based on vertex positions+ | TEXCALC_ENVIRONMENT_MAP_NORMAL -- ^ Environment map based on vertex positions+ | TEXCALC_PROJECTIVE_TEXTURE -- ^ Projective texture+ deriving Eq++-- | Enum describing the various actions which can be taken onthe stencil buffer+data StencilOperation+ = SOP_KEEP -- ^ Leave the stencil buffer unchanged+ | SOP_ZERO -- ^ Set the stencil value to zero+ | SOP_REPLACE -- ^ Set the stencil value to the reference value+ | SOP_INCREMENT -- ^ Increase the stencil value by 1, clamping at the maximum value+ | SOP_DECREMENT -- ^ Decrease the stencil value by 1, clamping at 0+ | SOP_INCREMENT_WRAP -- ^ Increase the stencil value by 1, wrapping back to 0 when incrementing the maximum value+ | SOP_DECREMENT_WRAP -- ^ Decrease the stencil value by 1, wrapping when decrementing 0+ | SOP_INVERT -- ^ Invert the bits of the stencil buffer+ deriving Eq++{-| Defines the functionality of a 3D API+@remarks+The RenderSystem class provides a base interface+which abstracts the general functionality of the 3D API+e.g. Direct3D or OpenGL. Whilst a few of the general+methods have implementations, most of this class is+abstract, requiring a subclass based on a specific API+to be constructed to provide the full functionality.+Note there are 2 levels to the interface - one which+will be used often by the caller of the Ogre library,+and one which is at a lower level and will be used by the+other classes provided by Ogre. These lower level+methods are prefixed with '_' to differentiate them.+The advanced user of the library may use these lower+level methods to access the 3D API at a more fundamental+level (dealing direct with render states and rendering+primitives), but still benefiting from Ogre's abstraction+of exactly which 3D API is in use.+@author+Steven Streeting+@version+1.0+-}+class (HardwareVertexBuffer vb, HardwareIndexBuffer ib, HardwareOcclusionQuery q, Texture t, GpuProgram p, LinkedGpuProgram lp) => RenderSystem a vb ib q t p lp | a -> vb ib q t p lp where+ {-| Create a hardware vertex buffer.+ @remarks+ This method creates a new vertex buffer; this will act as a source of geometry+ data for rendering objects. Note that because the meaning of the contents of+ the vertex buffer depends on the usage, this method does not specify a+ vertex format; the user of this buffer can actually insert whatever data + they wish, in any format. However, in order to use this with a RenderOperation,+ the data in this vertex buffer will have to be associated with a semantic element+ of the rendering pipeline, e.g. a position, or texture coordinates. This is done + using the VertexDeclaration class, which itself contains VertexElement structures+ referring to the source data.+ @remarks Note that because vertex buffers can be shared, they are reference+ counted so you do not need to worry about destroying themm this will be done+ automatically.+ @param vertexSize The size in bytes of each vertex in this buffer; you must calculate+ this based on the kind of data you expect to populate this buffer with.+ @param numVerts The number of vertices in this buffer.+ @param usage One or more members of the HardwareBuffer::Usage enumeration; you are+ strongly advised to use HBU_STATIC_WRITE_ONLY wherever possible, if you need to + update regularly, consider HBU_DYNAMIC_WRITE_ONLY and useShadowBuffer=true.+ @param useShadowBuffer If set to true, this buffer will be 'shadowed' by one stored in + system memory rather than GPU or AGP memory. You should set this flag if you intend + to read data back from the vertex buffer, because reading data from a buffer+ in the GPU or AGP memory is very expensive, and is in fact impossible if you+ specify HBU_WRITE_ONLY for the main buffer. If you use this option, all + reads and writes will be done to the shadow buffer, and the shadow buffer will+ be synchronised with the real buffer at an appropriate time.+ -}+ createVertexBuffer :: a -> Int -> Int -> Usage -> Bool -> IO vb+ {-| Create a hardware index buffer.+ @remarks Note that because buffers can be shared, they are reference+ counted so you do not need to worry about destroying them this will be done+ automatically.+ @param itype The type in index, either 16- or 32-bit, depending on how many vertices+ you need to be able to address+ @param numIndexes The number of indexes in the buffer+ @param usage One or more members of the HardwareBuffer::Usage enumeration.+ @param useShadowBuffer If set to true, this buffer will be 'shadowed' by one stored in + system memory rather than GPU or AGP memory. You should set this flag if you intend + to read data back from the index buffer, because reading data from a buffer+ in the GPU or AGP memory is very expensive, and is in fact impossible if you+ specify HBU_WRITE_ONLY for the main buffer. If you use this option, all + reads and writes will be done to the shadow buffer, and the shadow buffer will+ be synchronised with the real buffer at an appropriate time.+ -}+ createIndexBuffer :: a -> IndexType -> Int -> Usage -> Bool -> IO ib++ {-+ virtual TexturePtr createManual(const String & name, const String& group,+ TextureType texType, uint width, uint height, uint depth, + int num_mips, PixelFormat format, int usage = TU_DEFAULT, ManualResourceLoader* loader = 0,+ bool hwGammaCorrection = false, uint fsaa = 0, const String& fsaaHint = StringUtil::BLANK);+ TextureUsage = bufferUsage::Usage, autoMipmap::Bool, isTarget::Bool+ -}+ createTexture :: a -> String -> TextureType -> Int -> Int -> Int -> TextureMipmap -> PixelFormat -> TextureUsage -> Bool -> Int -> String -> Maybe [Image] -> IO t+ --FIXME: TEMP HACK!!!!!+ dirtyHackCopyTexImage :: a -> t -> Int -> Int -> Int -> Int -> IO ()+ createGpuProgram :: a -> GpuProgramType -> String -> IO (Either p String) -- TODO+ createLinkedGpuProgram :: a -> [p] -> IO (Either lp String) -- TODO+ getName :: a -> String -- ^ Returns the name of the rendering system.+ createOcclusionQuery :: a -> IO q -- ^ Create an object for performing hardware occlusion queries. +-- destroyOcclusionQuery :: a -> q -> IO () -- ^ Destroy a hardware occlusion query object. +--obsolete createRenderSystemCapabilities :: a -> IO RenderSystemCapabilities -- ^ Query the real capabilities of the GPU and driver in the RenderSystem+-- reinitialise :: a -> IO () -- ^ Restart the renderer (normally following a change in settings).+-- shutdown :: a -> IO () -- ^ Shutdown the renderer and cleanup resources.+ setAmbientLight :: a -> Float -> Float -> Float -> IO () -- ^ Sets the colour & strength of the ambient (global directionless) light in the world.+ setShadingType :: a -> ShadeOptions -> IO () -- ^ Sets the type of light shading required (default = Gouraud).++ {-| Sets whether or not dynamic lighting is enabled.+ @param+ enabled If true, dynamic lighting is performed on geometry with normals supplied, geometry without+ normals will not be displayed. If false, no lighting is applied and all geometry will be full brightness.+ -}+ setLightingEnabled :: a -> Bool -> IO ()++ {-| Sets whether or not W-buffers are enabled if they are available for this renderer.+ @param+ enabled If true and the renderer supports them W-buffers will be used. If false + W-buffers will not be used even if available. W-buffers are enabled by default + for 16bit depth buffers and disabled for all other depths.+ -}+ setWBufferEnabled :: a -> Bool -> IO ()+-- getWBufferEnabled :: a -> IO Bool -- ^ Returns true if the renderer will try to use W-buffers when avalible.++ {-| Create a MultiRenderTarget, which is a render target that renders to multiple RenderTextures+ at once. Surfaces can be bound and unbound at will.+ This fails if mCapabilities->getNumMultiRenderTargets() is smaller than 2.+ -}+ -- TODO: virtual MultiRenderTarget * createMultiRenderTarget(const String & name) = 0; ++ {-| Destroys a render texture -}+ -- TODO: virtual void destroyRenderTexture(const String& name);+ {-| Destroys a render target of any sort -}+ -- TODO: virtual void destroyRenderTarget(const String& name);++ {-| Attaches the passed render target to the render system.+ -}+ -- TODO: virtual void attachRenderTarget( RenderTarget &target );+ {-| Returns a pointer to the render target with the passed name, or NULL if that+ render target cannot be found.+ -}+ -- TODO: virtual RenderTarget * getRenderTarget( const String &name );+ {-| Detaches the render target with the passed name from the render system and+ returns a pointer to it.+ @note+ If the render target cannot be found, NULL is returned.+ -}+ -- TODO: virtual RenderTarget * detachRenderTarget( const String &name );++ -- | Iterator over RenderTargets+ -- TODO: typedef MapIterator<Ogre::RenderTargetMap> RenderTargetIterator;++ {-| Returns a specialised MapIterator over all render targets attached to the RenderSystem. -}+ -- TODO: virtual RenderTargetIterator getRenderTargetIterator(void) {+ -- TODO: return RenderTargetIterator( mRenderTargets.begin(), mRenderTargets.end() );+ -- TODO: }++ {-| Returns a description of an error code.+ -}+ -- TODO: virtual String getErrorDescription(long errorNumber) const = 0;++ {-| Defines whether or now fullscreen render windows wait for the vertical blank before flipping buffers.+ @remarks+ By default, all rendering windows wait for a vertical blank (when the CRT beam turns off briefly to move+ from the bottom right of the screen back to the top left) before flipping the screen buffers. This ensures+ that the image you see on the screen is steady. However it restricts the frame rate to the refresh rate of+ the monitor, and can slow the frame rate down. You can speed this up by not waiting for the blank, but+ this has the downside of introducing 'tearing' artefacts where part of the previous frame is still displayed+ as the buffers are switched. Speed vs quality, you choose.+ @note+ Has NO effect on windowed mode render targets. Only affects fullscreen mode.+ @param+ enabled If true, the system waits for vertical blanks - quality over speed. If false it doesn't - speed over quality.+ -}+ setWaitForVerticalBlank :: a -> Bool -> IO ()+-- getWaitForVerticalBlank :: a -> IO Bool -- ^ Returns true if the system is synchronising frames with the monitor vertical blank.++ -- ------------------------------------------------------------------------+ -- Internal Rendering Access+ -- All methods below here are normally only called by other OGRE classes+ -- They can be called by library user if required+ -- ------------------------------------------------------------------------+++ {-| Tells the rendersystem to use the attached set of lights (and no others) + up to the number specified (this allows the same list to be used with different+ count limits) -}+ useLights :: a -> [(Matrix4,Light)] -> IO ()+-- useLights :: a -> [Light] -> Int -> IO ()+ {-| Are fixed-function lights provided in view space? Affects optimisation. + -}+ -- TODO: virtual bool areFixedFunctionLightsInViewSpace() const { return false; }+ setWorldMatrix :: a -> Matrix4 -> IO () -- ^ Sets the world transform matrix.+ --_setWorldMatrices :: a -> [Matrix4] -> Int -> IO () -- ^ Sets multiple world matrices (vertex blending).+ setViewMatrix :: a -> Matrix4 -> IO () -- ^ Sets the view transform matrix+ setProjectionMatrix :: a -> Matrix4 -> IO () -- ^ Sets the projection transform matrix+ + {-| Sets the surface properties to be used for future rendering.+ + This method sets the the properties of the surfaces of objects+ to be rendered after it. In this context these surface properties+ are the amount of each type of light the object reflects (determining+ it's colour under different types of light), whether it emits light+ itself, and how shiny it is. Textures are not dealt with here,+ see the _setTetxure method for details.+ This method is used by _setMaterial so does not need to be called+ direct if that method is being used.+ + @param ambient The amount of ambient (sourceless and directionless)+ light an object reflects. Affected by the colour/amount of ambient light in the scene.+ @param diffuse The amount of light from directed sources that is+ reflected (affected by colour/amount of point, directed and spot light sources)+ @param specular The amount of specular light reflected. This is also+ affected by directed light sources but represents the colour at the+ highlights of the object.+ @param emissive The colour of light emitted from the object. Note that+ this will make an object seem brighter and not dependent on lights in+ the scene, but it will not act as a light, so will not illuminate other+ objects. Use a light attached to the same SceneNode as the object for this purpose.+ @param shininess A value which only has an effect on specular highlights (so+ specular must be non-black). The higher this value, the smaller and crisper the+ specular highlights will be, imitating a more highly polished surface.+ This value is not constrained to 0.0-1.0, in fact it is likely to+ be more (10.0 gives a modest sheen to an object).+ @param tracking A bit field that describes which of the ambient, diffuse, specular+ and emissive colours follow the vertex colour of the primitive. When a bit in this field is set+ its ColourValue is ignored. This is a combination of TVC_AMBIENT, TVC_DIFFUSE, TVC_SPECULAR(note that the shininess value is still+ taken from shininess) and TVC_EMISSIVE. TVC_NONE means that there will be no material property+ tracking the vertex colours.+ -}+ setSurfaceParams :: a -> ColourValue -> ColourValue -> ColourValue -> ColourValue -> FloatType -> TrackVertexColourType -> IO ()++ {-| Sets whether or not rendering points using OT_POINT_LIST will + render point sprites (textured quads) or plain points.+ @param enabled True enables point sprites, false returns to normal+ point rendering.+ -} + setPointSpritesEnabled :: a -> Bool -> IO ()++ {-| Sets the size of points and how they are attenuated with distance.+ @remarks+ When performing point rendering or point sprite rendering,+ point size can be attenuated with distance. The equation for+ doing this is attenuation = 1 / (constant + linear * dist + quadratic * d^2) .+ @par+ For example, to disable distance attenuation (constant screensize) + you would set constant to 1, and linear and quadratic to 0. A+ standard perspective attenuation would be 0, 1, 0 respectively.+ -}+ setPointParameters :: a -> FloatType -> Bool -> FloatType -> FloatType -> FloatType -> FloatType -> FloatType -> IO ()+++ setActiveTextureUnit :: a -> Int -> IO ()+ {-|+ Sets the texture to bind to a given texture unit.++ User processes would not normally call this direct unless rendering+ primitives themselves.++ @param unit The index of the texture unit to modify. Multitexturing + hardware can support multiple units (see + RenderSystemCapabilites::getNumTextureUnits)+ @param enabled Boolean to turn the unit on/off+ @param texPtr Pointer to the texture to use.+ -}+-- setTexture :: a -> Int -> Bool -> Maybe t -> IO ()+ setTexture :: a -> Maybe t -> IO ()+ {-|+ Sets the texture to bind to a given texture unit.++ User processes would not normally call this direct unless rendering+ primitives themselves.++ @param unit The index of the texture unit to modify. Multitexturing + hardware can support multiple units (see + RenderSystemCapabilites::getNumTextureUnits)+ @param enabled Boolean to turn the unit on/off+ @param texname The name of the texture to use - this should have+ already been loaded with TextureManager::load.+ -}+ --virtual void _setTexture(size_t unit, bool enabled, const String &texname);++ {-| Binds a texture to a vertex sampler.+ @remarks+ Not all rendersystems support separate vertex samplers. For those that+ do, you can set a texture for them, separate to the regular texture+ samplers, using this method. For those that don't, you should use the+ regular texture samplers which are shared between the vertex and+ fragment units; calling this method will throw an exception.+ @see RenderSystemCapabilites::getVertexTextureUnitsShared+ -}+ setVertexTexture :: a -> Maybe t -> IO ()++ {-|+ Sets the texture coordinate set to use for a texture unit.++ Meant for use internally - not generally used directly by apps - the Material and TextureUnitState+ classes let you manage textures far more easily.++ @param unit Texture unit as above+ @param index The index of the texture coordinate set to use.+ -}+-- setTextureCoordSet :: a -> Int -> Int -> IO ()++ {-|+ Sets a method for automatically calculating texture coordinates for a stage.+ Should not be used by apps - for use by Ogre only.+ @param unit Texture unit as above+ @param m Calculation method to use+ @param frustum Optional Frustum param, only used for projective effects+ -}+ setTextureCoordCalculation :: a -> TexCoordCalcMethod{- -> Frustum-} -> IO ()++ {-| Sets the texture blend modes from a TextureUnitState record.+ Meant for use internally only - apps should use the Material+ and TextureUnitState classes.+ @param unit Texture unit as above+ @param bm Details of the blending mode+ -}+ setTextureBlendMode :: a -> LayerBlendModeEx -> LayerBlendModeEx -> IO ()++ {-| Sets the filtering options for a given texture unit.+ @param unit The texture unit to set the filtering options for+ @param minFilter The filter used when a texture is reduced in size+ @param magFilter The filter used when a texture is magnified+ @param mipFilter The filter used between mipmap levels, FO_NONE disables mipmapping+ -}+ setTextureUnitFiltering :: a -> TextureType -> FilterOptions -> FilterOptions -> FilterOptions -> IO ()++ {-| Sets a single filter for a given texture unit.+ @param unit The texture unit to set the filtering options for+ @param ftype The filter type+ @param filter The filter to be used+ -}+-- setTextureUnitFiltering :: a -> Int -> FilterType -> FilterOptions -> IO ()++ {-| Sets the maximal anisotropy for the specified texture unit.-}+ setTextureLayerAnisotropy :: a -> TextureType -> Int -> IO ()++ {-| Sets the texture addressing mode for a texture unit.-}+ setTextureAddressingMode :: a -> TextureType -> UVWAddressingMode -> IO ()++ {-| Sets the texture border colour for a texture unit.-}+ setTextureBorderColour :: a -> TextureType -> ColourValue -> IO ()++ {-| Sets the mipmap bias value for a given texture unit.+ @remarks+ This allows you to adjust the mipmap calculation up or down for a+ given texture unit. Negative values force a larger mipmap to be used, + positive values force a smaller mipmap to be used. Units are in numbers+ of levels, so +1 forces the mipmaps to one smaller level.+ @note Only does something if render system has capability RSC_MIPMAP_LOD_BIAS.+ -}+ setTextureMipmapBias :: a -> FloatType -> IO ()++ {-| Sets the texture coordinate transformation matrix for a texture unit.+ @param unit Texture unit to affect+ @param xform The 4x4 matrix+ -}+ setTextureMatrix :: a -> Matrix4 -> IO ()++ {-| Sets the global blending factors for combining subsequent renders with the existing frame contents.+ The result of the blending operation is:</p>+ <p align="center">final = (texture * sourceFactor) + (pixel * destFactor)</p>+ Each of the factors is specified as one of a number of options, as specified in the SceneBlendFactor+ enumerated type.+ By changing the operation you can change addition between the source and destination pixels to a different operator.+ @param sourceFactor The source factor in the above calculation, i.e. multiplied by the texture colour components.+ @param destFactor The destination factor in the above calculation, i.e. multiplied by the pixel colour components.+ @param op The blend operation mode for combining pixels+ -}+ setSceneBlending :: a -> SceneBlendFactor -> SceneBlendFactor -> SceneBlendOperation -> IO ()++ {-| Sets the global blending factors for combining subsequent renders with the existing frame contents.+ The result of the blending operation is:</p>+ <p align="center">final = (texture * sourceFactor) + (pixel * destFactor)</p>+ Each of the factors is specified as one of a number of options, as specified in the SceneBlendFactor+ enumerated type.+ @param sourceFactor The source factor in the above calculation, i.e. multiplied by the texture colour components.+ @param destFactor The destination factor in the above calculation, i.e. multiplied by the pixel colour components.+ @param sourceFactorAlpha The source factor in the above calculation for the alpha channel, i.e. multiplied by the texture alpha components.+ @param destFactorAlpha The destination factor in the above calculation for the alpha channel, i.e. multiplied by the pixel alpha components.+ @param op The blend operation mode for combining pixels+ @param alphaOp The blend operation mode for combining pixel alpha values+ -}+ setSeparateSceneBlending :: a -> SceneBlendFactor -> SceneBlendFactor -> SceneBlendFactor -> SceneBlendFactor -> SceneBlendOperation -> SceneBlendOperation -> IO ()++ {-| Sets the global alpha rejection approach for future renders.+ By default images are rendered regardless of texture alpha. This method lets you change that.+ @param func The comparison function which must pass for a pixel to be written.+ @param val The value to compare each pixels alpha value to (0-255)+ @param alphaToCoverage Whether to enable alpha to coverage, if supported+ -}+ setAlphaRejectSettings :: a -> CompareFunction -> Int -> Bool -> IO ()++ {-| Notify the rendersystem that it should adjust texture projection to be + relative to a different origin.+ -}+ -- TODO: virtual void _setTextureProjectionRelativeTo(bool enabled, const Vector3& pos);+ {-|+ * Signifies the beginning of a frame, i.e. the start of rendering on a single viewport. Will occur+ * several times per complete frame if multiple viewports exist.+ -}+ -- TODO: virtual void _beginFrame(void) = 0;+++ {-|+ * Ends rendering of a frame to the current viewport.+ -}+ -- TODO: virtual void _endFrame(void) = 0;+ {-|+ Sets the provided viewport as the active one for future+ rendering operations. This viewport is aware of it's own+ camera and render target. Must be implemented by subclass.++ @param target Pointer to the appropriate viewport.+ -}+ setViewport :: a -> Int -> Int -> Int -> Int -> IO ()+ {-| Get the current active viewport for rendering. -}+ -- TODO: virtual Viewport* _getViewport(void);++ {-| Sets the culling mode for the render system based on the 'vertex winding'.+ A typical way for the rendering engine to cull triangles is based on the+ 'vertex winding' of triangles. Vertex winding refers to the direction in+ which the vertices are passed or indexed to in the rendering operation as viewed+ from the camera, and will wither be clockwise or anticlockwise (that's 'counterclockwise' for+ you Americans out there ;) The default is CULL_CLOCKWISE i.e. that only triangles whose vertices+ are passed/indexed in anticlockwise order are rendered - this is a common approach and is used in 3D studio models+ for example. You can alter this culling mode if you wish but it is not advised unless you know what you are doing.+ You may wish to use the CULL_NONE option for mesh data that you cull yourself where the vertex+ winding is uncertain.+ -}+ setCullingMode :: a -> CullingMode -> IO ()+-- getCullingMode :: a -> IO CullingMode++ {-| Sets the mode of operation for depth buffer tests from this point onwards.+ Sometimes you may wish to alter the behaviour of the depth buffer to achieve+ special effects. Because it's unlikely that you'll set these options for an entire frame,+ but rather use them to tweak settings between rendering objects, this is an internal+ method (indicated by the '_' prefix) which will be used by a SceneManager implementation+ rather than directly from the client application.+ If this method is never called the settings are automatically the same as the default parameters.+ @param depthTest If true, the depth buffer is tested for each pixel and the frame buffer is only updated+ if the depth function test succeeds. If false, no test is performed and pixels are always written.+ @param depthWrite If true, the depth buffer is updated with the depth of the new pixel if the depth test succeeds.+ If false, the depth buffer is left unchanged even if a new pixel is written.+ @param depthFunction Sets the function required for the depth test.+ -}+ setDepthBufferParams :: a -> Bool -> Bool -> CompareFunction -> IO ()++ {-| Sets whether or not the depth buffer check is performed before a pixel write.+ @param enabled If true, the depth buffer is tested for each pixel and the frame buffer is only updated+ if the depth function test succeeds. If false, no test is performed and pixels are always written.+ -}+ setDepthBufferCheckEnabled :: a -> Bool -> IO ()+ {-| Sets whether or not the depth buffer is updated after a pixel write.+ @param enabled If true, the depth buffer is updated with the depth of the new pixel if the depth test succeeds.+ If false, the depth buffer is left unchanged even if a new pixel is written.+ -}+ setDepthBufferWriteEnabled :: a -> Bool -> IO ()+ {-| Sets the comparison function for the depth buffer check.+ Advanced use only - allows you to choose the function applied to compare the depth values of+ new and existing pixels in the depth buffer. Only an issue if the deoth buffer check is enabled+ (see _setDepthBufferCheckEnabled)+ @param func The comparison between the new depth and the existing depth which must return true+ for the new pixel to be written.+ -}+ --setDepthBufferFunction :: a -> CompareFunction -> IO ()+ setDepthBufferFunction :: a -> Bool -> CompareFunction -> IO ()+ {-| Sets whether or not colour buffer writing is enabled, and for which channels. + @remarks+ For some advanced effects, you may wish to turn off the writing of certain colour+ channels, or even all of the colour channels so that only the depth buffer is updated+ in a rendering pass. However, the chances are that you really want to use this option+ through the Material class.+ @param red, green, blue, alpha Whether writing is enabled for each of the 4 colour channels. -}+ setColourBufferWriteEnabled :: a -> Bool -> Bool -> Bool -> Bool -> IO ()+ {-| Sets the depth bias, NB you should use the Material version of this. + @remarks+ When polygons are coplanar, you can get problems with 'depth fighting' where+ the pixels from the two polys compete for the same screen pixel. This is particularly+ a problem for decals (polys attached to another surface to represent details such as+ bulletholes etc.).+ @par+ A way to combat this problem is to use a depth bias to adjust the depth buffer value+ used for the decal such that it is slightly higher than the true value, ensuring that+ the decal appears on top.+ @note+ The final bias value is a combination of a constant bias and a bias proportional+ to the maximum depth slope of the polygon being rendered. The final bias+ is constantBias + slopeScaleBias * maxslope. Slope scale biasing is+ generally preferable but is not available on older hardware.+ @param constantBias The constant bias value, expressed as a value in + homogeneous depth coordinates.+ @param slopeScaleBias The bias value which is factored by the maximum slope+ of the polygon, see the description above. This is not supported by all+ cards.++ -}+ setDepthBias :: a -> FloatType -> FloatType -> IO ()+ {-| Sets the fogging mode for future geometry.+ @param mode Set up the mode of fog as described in the FogMode enum, or set to FOG_NONE to turn off.+ @param colour The colour of the fog. Either set this to the same as your viewport background colour,+ or to blend in with a skydome or skybox.+ @param expDensity The density of the fog in FOG_EXP or FOG_EXP2 mode, as a value between 0 and 1. The default is 1. i.e. completely opaque, lower values can mean+ that fog never completely obscures the scene.+ @param linearStart Distance at which linear fog starts to encroach. The distance must be passed+ as a parametric value between 0 and 1, with 0 being the near clipping plane, and 1 being the far clipping plane. Only applicable if mode is FOG_LINEAR.+ @param linearEnd Distance at which linear fog becomes completely opaque.The distance must be passed+ as a parametric value between 0 and 1, with 0 being the near clipping plane, and 1 being the far clipping plane. Only applicable if mode is FOG_LINEAR.+ -}+ setFog :: a -> FogMode -> ColourValue -> FloatType -> FloatType -> FloatType -> IO ()++ {-| The RenderSystem will keep a count of tris rendered, this resets the count. -}+ -- TODO: virtual void _beginGeometryCount(void);+ {-| Reports the number of tris rendered since the last _beginGeometryCount call. -}+ -- TODO: virtual unsigned int _getFaceCount(void) const;+ {-| Reports the number of batches rendered since the last _beginGeometryCount call. -}+ -- TODO: virtual unsigned int _getBatchCount(void) const;+ {-| Reports the number of vertices passed to the renderer since the last _beginGeometryCount call. -}+ -- TODO: virtual unsigned int _getVertexCount(void) const;++ {-| Generates a packed data version of the passed in ColourValue suitable for+ use as with this RenderSystem.+ @remarks+ Since different render systems have different colour data formats (eg+ RGBA for GL, ARGB for D3D) this method allows you to use 1 method for all.+ @param colour The colour to convert+ @param pDest Pointer to location to put the result.+ -}+ -- TODO: virtual void convertColourValue(const ColourValue& colour, uint32* pDest);+ {-| Get the native VertexElementType for a compact 32-bit colour value+ for this rendersystem.+ -}+ -- TODO: virtual VertexElementType getColourVertexElementType(void) const = 0;++ {-| Converts a uniform projection matrix to suitable for this render system.+ @remarks+ Because different APIs have different requirements (some incompatible) for the+ projection matrix, this method allows each to implement their own correctly and pass+ back a generic OGRE matrix for storage in the engine.+ -}+ -- TODO: virtual void _convertProjectionMatrix(const Matrix4& matrix,+ -- TODO: Matrix4& dest, bool forGpuProgram = false) = 0;++ {-| Builds a perspective projection matrix suitable for this render system.+ @remarks+ Because different APIs have different requirements (some incompatible) for the+ projection matrix, this method allows each to implement their own correctly and pass+ back a generic OGRE matrix for storage in the engine.+ -}+ -- TODO: virtual void _makeProjectionMatrix(const Radian& fovy, Real aspect, Real nearPlane, Real farPlane, + -- TODO: Matrix4& dest, bool forGpuProgram = false) = 0;++ {-| Builds a perspective projection matrix for the case when frustum is+ not centered around camera.+ @remarks+ Viewport coordinates are in camera coordinate frame, i.e. camera is + at the origin.+ -}+ -- TODO: virtual void _makeProjectionMatrix(Real left, Real right, Real bottom, Real top, + -- TODO: Real nearPlane, Real farPlane, Matrix4& dest, bool forGpuProgram = false) = 0;+ {-| Builds an orthographic projection matrix suitable for this render system.+ @remarks+ Because different APIs have different requirements (some incompatible) for the+ projection matrix, this method allows each to implement their own correctly and pass+ back a generic OGRE matrix for storage in the engine.+ -}+ -- TODO: virtual void _makeOrthoMatrix(const Radian& fovy, Real aspect, Real nearPlane, Real farPlane, + -- TODO: Matrix4& dest, bool forGpuProgram = false) = 0;++ {-| Update a perspective projection matrix to use 'oblique depth projection'.+ @remarks+ This method can be used to change the nature of a perspective + transform in order to make the near plane not perpendicular to the + camera view direction, but to be at some different orientation. + This can be useful for performing arbitrary clipping (e.g. to a + reflection plane) which could otherwise only be done using user+ clip planes, which are more expensive, and not necessarily supported+ on all cards.+ @param matrix The existing projection matrix. Note that this must be a+ perspective transform (not orthographic), and must not have already+ been altered by this method. The matrix will be altered in-place.+ @param plane The plane which is to be used as the clipping plane. This+ plane must be in CAMERA (view) space.+ @param forGpuProgram Is this for use with a Gpu program or fixed-function+ -}+ -- TODO: virtual void _applyObliqueDepthProjection(Matrix4& matrix, const Plane& plane, + -- TODO: bool forGpuProgram) = 0;++ {-| Sets how to rasterise triangles, as points, wireframe or solid polys. -}+ setPolygonMode :: a -> PolygonMode -> IO ()++ {-| Turns stencil buffer checking on or off. + @remarks+ Stencilling (masking off areas of the rendering target based on the stencil + buffer) can be turned on or off using this method. By default, stencilling is+ disabled.+ -}+ setStencilCheckEnabled :: a -> Bool -> IO ()+ {-| Determines if this system supports hardware accelerated stencil buffer. + @remarks+ Note that the lack of this function doesn't mean you can't do stencilling, but+ the stencilling operations will be provided in software, which will NOT be+ fast.+ @par+ Generally hardware stencils are only supported in 32-bit colour modes, because+ the stencil buffer shares the memory of the z-buffer, and in most cards the + z-buffer has to be the same depth as the colour buffer. This means that in 32-bit+ mode, 24 bits of the z-buffer are depth and 8 bits are stencil. In 16-bit mode there+ is no room for a stencil (although some cards support a 15:1 depth:stencil option,+ this isn't useful for very much) so 8 bits of stencil are provided in software.+ This can mean that if you use stencilling, your applications may be faster in + 32-but colour than in 16-bit, which may seem odd to some people.+ -}+ {-virtual bool hasHardwareStencil(void) = 0;-}++ {-| This method allows you to set all the stencil buffer parameters in one call.+ @remarks+ The stencil buffer is used to mask out pixels in the render target, allowing+ you to do effects like mirrors, cut-outs, stencil shadows and more. Each of+ your batches of rendering is likely to ignore the stencil buffer, + update it with new values, or apply it to mask the output of the render.+ The stencil test is:<PRE>+ (Reference Value & Mask) CompareFunction (Stencil Buffer Value & Mask)</PRE>+ The result of this will cause one of 3 actions depending on whether the test fails,+ succeeds but with the depth buffer check still failing, or succeeds with the+ depth buffer check passing too.+ @par+ Unlike other render states, stencilling is left for the application to turn+ on and off when it requires. This is because you are likely to want to change+ parameters between batches of arbitrary objects and control the ordering yourself.+ In order to batch things this way, you'll want to use OGRE's separate render queue+ groups (see RenderQueue) and register a RenderQueueListener to get notifications+ between batches.+ @par+ There are individual state change methods for each of the parameters set using + this method. + Note that the default values in this method represent the defaults at system + start up too.+ @param func The comparison function applied.+ @param refValue The reference value used in the comparison+ @param mask The bitmask applied to both the stencil value and the reference value + before comparison+ @param stencilFailOp The action to perform when the stencil check fails+ @param depthFailOp The action to perform when the stencil check passes, but the+ depth buffer check still fails+ @param passOp The action to take when both the stencil and depth check pass.+ @param twoSidedOperation If set to true, then if you render both back and front faces + (you'll have to turn off culling) then these parameters will apply for front faces, + and the inverse of them will happen for back faces (keep remains the same).+ -}+ setStencilBufferParams :: a -> CompareFunction -> Word32 -> Word32 -> StencilOperation -> StencilOperation -> StencilOperation -> Bool -> IO ()++++ {-| Sets the current vertex declaration, ie the source of vertex data. -}+-- setVertexDeclaration :: a -> VertexDeclaration -> IO ()+ {-| Sets the current vertex buffer binding state. -}+-- setVertexBufferBinding :: a -> VertexBufferBinding vb -> IO ()++ {-| Sets whether or not normals are to be automatically normalised.+ @remarks+ This is useful when, for example, you are scaling SceneNodes such that+ normals may not be unit-length anymore. Note though that this has an+ overhead so should not be turn on unless you really need it.+ @par+ You should not normally call this direct unless you are rendering+ world geometry; set it on the Renderable because otherwise it will be+ overridden by material settings. + -}+ setNormaliseNormals :: a -> Bool -> IO ()++ {-|+ Render something to the active viewport.++ Low-level rendering interface to perform rendering+ operations. Unlikely to be used directly by client+ applications, since the SceneManager and various support+ classes will be responsible for calling this method.+ Can only be called between _beginScene and _endScene++ @param Iteration count+ @param op A rendering operation instance, which contains+ details of the operation to be performed.+ -}+ render :: a -> RenderOperation vb ib -> IO ()+ bindGeometry :: a -> RenderOperation vb ib -> [TextureUnitState t] -> IO ()+ unbindGeometry :: a -> RenderOperation vb ib -> IO ()++ {-| Gets the capabilities of the render system. -}+ getCapabilities :: a -> RenderSystemCapabilities++ {-| Binds a given GpuProgram (but not the parameters). + @remarks Only one GpuProgram of each type can be bound at once, binding another+ one will simply replace the existing one.+ -}+ bindLinkedGpuProgram :: a -> lp -> IO () +-- bindGpuProgram :: a -> GpuProgram -> IO ()++ {-| Bind Gpu program parameters.+ @param gptype The type of program to bind the parameters to+ @param params The parameters to bind+ @param variabilityMask A mask of GpuParamVariability identifying which params need binding+ -}+-- bindGpuProgramParameters :: a -> GpuProgramType -> GpuProgramParameters -> Word16 -> IO ()++ {-| Only binds Gpu program parameters used for passes that have more than one iteration rendering+ -}+-- bindGpuProgramPassIterationParameters :: a -> GpuProgramType -> IO ()+ {-| Unbinds GpuPrograms of a given GpuProgramType.+ @remarks+ This returns the pipeline to fixed-function processing for this type.+ -}+ unbindLinkedGpuProgram :: a -> IO ()+-- unbindGpuProgram :: a -> GpuProgramType -> IO ()++ {-| Returns whether or not a Gpu program of the given type is currently bound. -}+-- isGpuProgramBound :: a -> GpuProgramType -> IO Bool++ {-| Sets the user clipping region.+ -}+ -- TODO: virtual void setClipPlanes(const PlaneList& clipPlanes);++ {-| Add a user clipping plane. -}+ -- TODO: virtual void addClipPlane (const Plane &p);+ {-| Add a user clipping plane. -}+ -- TODO: virtual void addClipPlane (Real A, Real B, Real C, Real D);++ {-| Clears the user clipping region.+ -}+ -- TODO: virtual void resetClipPlanes();++ {-| Utility method for initialising all render targets attached to this rendering system. -}+ -- TODO: virtual void _initRenderTargets(void);++ {-| Utility method to notify all render targets that a camera has been removed, + in case they were referring to it as their viewer. + -}+ -- TODO: virtual void _notifyCameraRemoved(const Camera* cam);++ {-| Internal method for updating all render targets attached to this rendering system. -}+ -- TODO: virtual void _updateAllRenderTargets(bool swapBuffers = true);+ {-| Internal method for swapping all the buffers on all render targets,+ if _updateAllRenderTargets was called with a 'false' parameter. -}+ -- TODO: virtual void _swapAllRenderTargetBuffers(bool waitForVsync = true);++ {-| Gets whether or not vertex windings set should be inverted; this can be important+ for rendering reflections. -}+ -- TODO: virtual bool getInvertVertexWinding(void);++ {-| Sets whether or not vertex windings set should be inverted; this can be important+ for rendering reflections. -}+ -- TODO: virtual void setInvertVertexWinding(bool invert);+ {-| Sets the 'scissor region' ie the region of the target in which rendering can take place.+ @remarks+ This method allows you to 'mask off' rendering in all but a given rectangular area+ as identified by the parameters to this method.+ @note+ Not all systems support this method. Check the RenderSystemCapabilities for the+ RSC_SCISSOR_TEST capability to see if it is supported.+ @param enabled True to enable the scissor test, false to disable it.+ @param left, top, right, bottom The location of the corners of the rectangle, expressed in+ <i>pixels</i>.+ -}+ setScissorTest :: a -> Bool -> Int -> Int -> Int -> Int -> IO ()++ {-| Clears one or more frame buffers on the active render target. + @param buffers Combination of one or more elements of FrameBufferType+ denoting which buffers are to be cleared+ @param colour The colour to clear the colour buffer with, if enabled+ @param depth The value to initialise the depth buffer with, if enabled+ @param stencil The value to initialise the stencil buffer with, if enabled.+ -}+ clearFrameBuffer :: a -> FrameBufferType -> ColourValue -> FloatType -> Word16 -> IO ()+ {-| Returns the horizontal texel offset value required for mapping + texel origins to pixel origins in this rendersystem.+ @remarks+ Since rendersystems sometimes disagree on the origin of a texel, + mapping from texels to pixels can sometimes be problematic to + implement generically. This method allows you to retrieve the offset+ required to map the origin of a texel to the origin of a pixel in+ the horizontal direction.+ -}+ getHorizontalTexelOffset :: a -> IO FloatType+ {-| Returns the vertical texel offset value required for mapping + texel origins to pixel origins in this rendersystem.+ @remarks+ Since rendersystems sometimes disagree on the origin of a texel, + mapping from texels to pixels can sometimes be problematic to + implement generically. This method allows you to retrieve the offset+ required to map the origin of a texel to the origin of a pixel in+ the vertical direction.+ -}+ getVerticalTexelOffset :: a -> IO FloatType++ {-| Gets the minimum (closest) depth value to be used when rendering+ using identity transforms.+ @remarks+ When using identity transforms you can manually set the depth+ of a vertex; however the input values required differ per+ rendersystem. This method lets you retrieve the correct value.+ @see Renderable::getUseIdentityView, Renderable::getUseIdentityProjection+ -}+ getMinimumDepthInputValue :: a -> FloatType+ {-| Gets the maximum (farthest) depth value to be used when rendering+ using identity transforms.+ @remarks+ When using identity transforms you can manually set the depth+ of a vertex; however the input values required differ per+ rendersystem. This method lets you retrieve the correct value.+ @see Renderable::getUseIdentityView, Renderable::getUseIdentityProjection+ -}+ getMaximumDepthInputValue :: a -> FloatType+ {-| set the current multi pass count value. This must be set prior to + calling _render() if multiple renderings of the same pass state are + required.+ @param count Number of times to render the current state.+ -}+ -- TODO: virtual void setCurrentPassIterationCount(const size_t count) { mCurrentPassIterationCount = count; }++ {-| Tell the render system whether to derive a depth bias on its own based on + the values passed to it in setCurrentPassIterationCount.+ The depth bias set will be baseValue + iteration * multiplier+ @param derive True to tell the RS to derive this automatically+ @param baseValue The base value to which the multiplier should be+ added+ @param multiplier The amount of depth bias to apply per iteration+ @param slopeScale The constant slope scale bias for completeness+ -}+ -- TODO: virtual void setDeriveDepthBias(bool derive, float baseValue = 0.0f,+ -- TODO: float multiplier = 0.0f, float slopeScale = 0.0f)+ -- TODO: {+ -- TODO: mDerivedDepthBias = derive;+ -- TODO: mDerivedDepthBiasBase = baseValue;+ -- TODO: mDerivedDepthBiasMultiplier = multiplier;+ -- TODO: mDerivedDepthBiasSlopeScale = slopeScale;+ -- TODO: }++ {-|+ * Set current render target to target, enabling its device context if needed+ -}+ -- TODO: virtual void _setRenderTarget(RenderTarget *target) = 0;++class (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => Renderable r vb ib t lp | r -> vb ib t lp where+ prepare :: Matrix4 -> r -> [RenderEntity vb ib t lp]++data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => RenderEntity vb ib t lp+ = RenderEntity+ { reOperation :: RenderOperation vb ib+ , rePassList :: [Pass t lp]+ , reMatrix :: Matrix4+ }++--setPass :: RenderSystem -> Pass -> IO ()+setPass time rs pass = do+ let rsc = getCapabilities rs+ caps = rscCapabilities rsc+ Pass+ { --psName :: String -- ^ optional name for the pass+ + -- Colour properties, only applicable in fixed-function passes+ psAmbient = ambient+ , psDiffuse = diffuse+ , psSpecular = specular+ , psEmissive = emissive+ , psShininess = shininess+ , psTracking = vertexColourTracking+ + -- Blending factors+ , psSourceBlendFactor = sourceBlendFactor+ , psDestBlendFactor = destBlendFactor+ , psSourceBlendFactorAlpha = sourceBlendFactorAlpha+ , psDestBlendFactorAlpha = destBlendFactorAlpha++ , psSeparateBlend = separateBlend++ -- Blending operations+ , psBlendOperation = blendOperation+ , psAlphaBlendOperation = alphaBlendOperation+ , psSeparateBlendOperation = separateBlendOperation++ -- Depth buffer settings+ , psDepthCheck = depthCheck+ , psDepthWrite = depthWrite+ , psDepthFunc = depthFunc+ , psDepthBiasConstant = depthBiasConstant+ , psDepthBiasSlopeScale = depthBiasSlopeScale+-- , psDepthBiasPerIteration :: FloatType++ -- Colour buffer settings+ , psColourWrite = colourWrite+ + -- Alpha reject settings+ , psAlphaRejectFunc = alphaRejectFunc+ , psAlphaRejectVal = alphaRejectVal+ , psAlphaToCoverageEnabled = alphaToCoverageEnabled+ +-- , psTransparentSorting :: Bool -- ^ Transparent depth sorting+-- , psTransparentSortingForced :: Bool -- ^ Transparent depth sorting forced+ + -- Culling mode+ , psCullMode = cullMode+-- , psManualCullMode :: ManualCullingMode+ + , psLightingEnabled = lightingEnabled+-- , psMaxSimultaneousLights :: Int -- ^ Max simultaneous lights+-- , psStartLight :: Int -- ^ Starting light index+-- , psLightsPerIteration :: Maybe Int -- ^ Run this pass once per light? Iterate per how many lights?+-- , psOnlyLightType :: Maybe LightTypes -- ^ Should it only be run for a certain light type?++ , psShadeOptions = shadeOptions+ , psPolygonMode = polygonMode++ -- Normalisation+-- , psNormaliseNormals :: Bool+ , psPolygonModeOverrideable = polygonModeOverrideable+ + -- Fog+ , psFogOverride = fogOverride+ , psFogMode = fogMode+ , psFogColour = fogColour+ , psFogStart = fogStart+ , psFogEnd = fogEnd+ , psFogDensity = fogDensity+ + , psTextureUnitStates = textureUnitStates++ , psVertexProgramUsage = vertexProgramUsage+ -- , psShadowCasterVertexProgramUsage :: GpuProgramUsage -- ^ Vertex program details+ -- , psShadowReceiverVertexProgramUsage :: GpuProgramUsage -- ^ Vertex program details+ , psFragmentProgramUsage = fragmentProgramUsage+ -- , psShadowReceiverFragmentProgramUsage :: GpuProgramUsage -- ^ Fragment program details+ , psGeometryProgramUsage = geometryProgramUsage+ , psLinkedGpuProgram = linkedGpuProgram+ -- , psQueuedForDeletion :: Bool -- ^ Is this pass queued for deletion?++-- , psPassIterationCount :: Int -- ^ number of pass iterations to perform++ , psPointSize = pointSize+ , psPointMinSize = pointMinSize+ , psPointMaxSize = pointMaxSize+ , psPointSpritesEnabled = pointSpritesEnabled+ , psPointAttenuationEnabled = pointAttenuationEnabled+-- , psPointAttenuationCoeffs :: FloatType3 -- ^ constant, linear, quadratic coeffs++ {-+ // TU Content type lookups+ typedef vector<unsigned short>::type ContentTypeLookup;+ mutable ContentTypeLookup mShadowContentTypeLookup;+ mutable bool mContentTypeLookupBuilt;+ -} +-- , psLightScissoring :: Bool -- ^ Scissoring for the light?+-- , psLightClipPlanes :: Bool -- ^ User clip planes for light?+-- , psIlluminationStage :: IlluminationStage -- ^ Illumination stage?+ } = pass+ {-+ if (!mSuppressRenderStateChanges || evenIfSuppressed)+ {+ if (mIlluminationStage == IRS_RENDER_TO_TEXTURE && shadowDerivation)+ {+ // Derive a special shadow caster pass from this one+ pass = deriveShadowCasterPass(pass);+ }+ else if (mIlluminationStage == IRS_RENDER_RECEIVER_PASS && shadowDerivation)+ {+ pass = deriveShadowReceiverPass(pass);+ }++ // Tell params about current pass+ mAutoParamDataSource->setCurrentPass(pass);++ bool passSurfaceAndLightParams = true;+ bool passFogParams = true;+ -}+ let passSurfaceAndLightParams = True+ passFogParams = True++ case linkedGpuProgram of+ { Nothing -> unbindLinkedGpuProgram rs+ ; Just lp -> bindLinkedGpuProgram rs lp+ }++ when passSurfaceAndLightParams $ do+ -- Set surface reflectance properties, only valid if lighting is enabled+ when lightingEnabled $+ setSurfaceParams rs ambient diffuse specular emissive shininess vertexColourTracking+ -- Dynamic lighting enabled?+ setLightingEnabled rs lightingEnabled+ + when passFogParams $ do+ -- New fog params can either be from scene or from material+ -- TODO: implement override + --setFog rs newFogMode newFogColour newFogDensity newFogStart newFogEnd+ setFog rs fogMode fogColour fogDensity fogStart fogEnd+ -- TODO+ {-+ if (passFogParams)+ {+ // New fog params can either be from scene or from material+ FogMode newFogMode;+ ColourValue newFogColour;+ Real newFogStart, newFogEnd, newFogDensity;+ if (pass->getFogOverride())+ {+ // New fog params from material+ newFogMode = pass->getFogMode();+ newFogColour = pass->getFogColour();+ newFogStart = pass->getFogStart();+ newFogEnd = pass->getFogEnd();+ newFogDensity = pass->getFogDensity();+ }+ else+ {+ // New fog params from scene+ newFogMode = mFogMode;+ newFogColour = mFogColour;+ newFogStart = mFogStart;+ newFogEnd = mFogEnd;+ newFogDensity = mFogDensity;+ }++ /* In D3D, it applies to shaders prior+ to version vs_3_0 and ps_3_0. And in OGL, it applies to "ARB_fog_XXX" in+ fragment program, and in other ways, them maybe access by gpu program via+ "state.fog.XXX".+ */+ mDestRenderSystem->_setFog(+ newFogMode, newFogColour, newFogDensity, newFogStart, newFogEnd);+ }++ // Tell params about ORIGINAL fog+ // Need to be able to override fixed function fog, but still have+ // original fog parameters available to a shader than chooses to use+ mAutoParamDataSource->setFog(+ mFogMode, mFogColour, mFogDensity, mFogStart, mFogEnd);+ -}++ -- The rest of the settings are the same no matter whether we use programs or not++ -- Set scene blending+ case separateBlend of+ { True -> setSeparateSceneBlending rs sourceBlendFactor destBlendFactor+ sourceBlendFactorAlpha destBlendFactorAlpha+ blendOperation+ (if separateBlendOperation then blendOperation else alphaBlendOperation)+ ; False -> case psSeparateBlendOperation pass of+ { True -> setSeparateSceneBlending rs sourceBlendFactor destBlendFactor+ sourceBlendFactor destBlendFactor+ blendOperation alphaBlendOperation+ ; False -> setSceneBlending rs sourceBlendFactor destBlendFactor blendOperation+ }+ }++ -- Set point parameters+ let (pac,pal,paq) = psPointAttenuationCoeffs pass -- TODO: refactor+ setPointParameters rs pointSize pointAttenuationEnabled pac pal paq pointMinSize pointMaxSize++ when (Set.member RSC_POINT_SPRITES caps) $+ setPointSpritesEnabled rs pointSpritesEnabled+ + -- Texture unit settings+ -- TODO+ {-+ Pass::ConstTextureUnitStateIterator texIter = pass->getTextureUnitStateIterator();+ size_t unit = 0;+ // Reset the shadow texture index for each pass+ size_t startLightIndex = pass->getStartLight();+ size_t shadowTexUnitIndex = 0;+ size_t shadowTexIndex = mShadowTextures.size();+ if (mShadowTextureIndexLightList.size() > startLightIndex)+ shadowTexIndex = mShadowTextureIndexLightList[startLightIndex];+ while(texIter.hasMoreElements())+ {+ TextureUnitState* pTex = texIter.getNext();+ if (!pass->getIteratePerLight() && + isShadowTechniqueTextureBased() && + pTex->getContentType() == TextureUnitState::CONTENT_SHADOW)+ {+ // Need to bind the correct shadow texture, based on the start light+ // Even though the light list can change per object, our restrictions+ // say that when texture shadows are enabled, the lights up to the+ // number of texture shadows will be fixed for all objects+ // to match the shadow textures that have been generated+ // see Listener::sortLightsAffectingFrustum and+ // MovableObject::Listener::objectQueryLights+ // Note that light iteration throws the indexes out so we don't bind here+ // if that's the case, we have to bind when lights are iterated+ // in renderSingleObject++ TexturePtr shadowTex;+ if (shadowTexIndex < mShadowTextures.size())+ {+ shadowTex = getShadowTexture(shadowTexIndex);+ // Hook up projection frustum+ Camera *cam = shadowTex->getBuffer()->getRenderTarget()->getViewport(0)->getCamera();+ // Enable projective texturing if fixed-function, but also need to+ // disable it explicitly for program pipeline.+ pTex->setProjectiveTexturing(!pass->hasVertexProgram(), cam);+ mAutoParamDataSource->setTextureProjector(cam, shadowTexUnitIndex);+ }+ else+ {+ // Use fallback 'null' shadow texture+ // no projection since all uniform colour anyway+ shadowTex = mNullShadowTexture;+ pTex->setProjectiveTexturing(false);+ mAutoParamDataSource->setTextureProjector(0, shadowTexUnitIndex);++ }+ pTex->_setTexturePtr(shadowTex);++ ++shadowTexIndex;+ ++shadowTexUnitIndex;+ }+ else if (mIlluminationStage == IRS_NONE && pass->hasVertexProgram())+ {+ // Manually set texture projector for shaders if present+ // This won't get set any other way if using manual projection+ TextureUnitState::EffectMap::const_iterator effi = + pTex->getEffects().find(TextureUnitState::ET_PROJECTIVE_TEXTURE);+ if (effi != pTex->getEffects().end())+ {+ mAutoParamDataSource->setTextureProjector(effi->second.frustum, unit);+ }+ }+ mDestRenderSystem->_setTextureUnitSettings(unit, *pTex);+ ++unit;+ }+ // Disable remaining texture units+ mDestRenderSystem->_disableTextureUnitsFrom(pass->getNumTextureUnitStates());+ -}+ -- TODO+ mapM_ (uncurry $ setTextureUnitSettings time rs) $ zip [0..] textureUnitStates++ -- Disable remaining texture units+ forM_ [(length textureUnitStates)..((rscNumTextureUnits $ getCapabilities rs) - 1)] $ \tu -> do+ -- TODO: dont disable disabled texunits+ setActiveTextureUnit rs tu+ setTexture rs Nothing++ -- Set up non-texture related material settings+ -- Depth buffer settings+ --FIXME: high level haskell gl binding handles depth check activation and depth function in one function+ setDepthBufferFunction rs depthCheck depthFunc+ {- -- HINT: GL has unified function for this+ setDepthBufferFunction rs depthFunc+ setDepthBufferCheckEnabled rs depthCheck+ -}+ setDepthBufferWriteEnabled rs depthWrite+ setDepthBias rs depthBiasConstant depthBiasSlopeScale++ -- Alpha-reject settings+ setAlphaRejectSettings rs alphaRejectFunc alphaRejectVal alphaToCoverageEnabled++ -- Set colour write mode+ -- Right now we only use on/off, not per-channel+ setColourBufferWriteEnabled rs colourWrite colourWrite colourWrite colourWrite+ -- TODO+ {-+ // Culling mode+ if (isShadowTechniqueTextureBased() + && mIlluminationStage == IRS_RENDER_TO_TEXTURE+ && mShadowCasterRenderBackFaces+ && pass->getCullingMode() == CULL_CLOCKWISE)+ {+ // render back faces into shadow caster, can help with depth comparison+ mPassCullingMode = CULL_ANTICLOCKWISE;+ }+ else+ {+ mPassCullingMode = pass->getCullingMode();+ }+ -}+ -- TODO: calc cull mode according illumination stage+ setCullingMode rs cullMode+ -- Shading+ setShadingType rs shadeOptions+ + -- Polygon mode+ unless polygonModeOverrideable $+ setPolygonMode rs polygonMode+ + -- TODO+ {-+ // set pass number+ mAutoParamDataSource->setPassNumber( pass->getIndex() );++ // mark global params as dirty+ mGpuParamsDirty |= (uint16)GPV_GLOBAL;+ -}+ return ()++{-+ const TexturePtr& TextureUnitState::_getTexturePtr(size_t frame) const+ {+ if (mContentType == CONTENT_NAMED)+ {+ if (frame < mFrames.size() && !mTextureLoadFailed)+ {+ ensureLoaded(frame);+ return mFramePtrs[frame];+ }+ else+ {+ // Silent fail with empty texture for internal method+ static TexturePtr nullTexPtr;+ return nullTexPtr;+ }+ }+ else+ {+ // Manually bound texture, no name or loading+ assert(frame < mFramePtrs.size());+ return mFramePtrs[frame];+ }+ }+-}++{-| Utility function for setting all the properties of a texture unit at once.+This method is also worth using over the individual texture unit settings because it+only sets those settings which are different from the current settings for this+unit, thus minimising render state changes.+-}+--setTextureUnitSettings :: RenderSystem a vb ib q t p => a -> Int -> TextureUnitState t -> IO ()+setTextureUnitSettings time rs texUnit tl = do+ -- This method is only ever called to set a texture unit to valid details+ -- The method _disableTextureUnit is called to turn a unit off+ let rsc = getCapabilities rs+ caps = rscCapabilities rsc+ TextureUnitState + { tusAnimDuration = animDuration+-- , tusCubic :: Bool -- ^ is this a series of 6 2D textures to make up a cube?+ + , tusTextureType = texType+-- , tusDesiredFormat :: PixelFormat+-- , tusTextureSrcMipmaps :: Int -- ^ Request number of mipmaps++-- , tusTextureCoordSetIndex :: Int+ , tusAddressMode = uvw+ , tusBorderColour = borderColour++ , tusColourBlendMode = colourBlendMode+-- , tusColourBlendFallbackSrc :: SceneBlendFactor+-- , tusColourBlendFallbackDest :: SceneBlendFactor++ , tusAlphaBlendMode = alphaBlendMode+ -- mutable bool mTextureLoadFailed;+ -- , tusTextureLoadFailed :: Bool+-- , tusIsAlpha :: Bool+-- , tusHwGamma :: Bool++ -- mutable bool mRecalcTexMatrix;+ -- Real mUMod, mVMod;+ -- Real mUScale, mVScale;+ -- Radian mRotate;+ -- mutable Matrix4 mTexModMatrix;++ , tusMinFilter = minFilter+ , tusMagFilter = magFilter+ , tusMipFilter = mipFilter++ , tusMaxAniso = maxAniso+ , tusMipmapBias = mipmapBias++ -- bool mIsDefaultAniso;+ -- bool mIsDefaultFiltering;+ , tusBindingType = bindingType+-- , tusContentType :: ContentType -- ^ Content type of texture (normal loaded texture, auto-texture)++-- , tusFrameNames :: [String]+ , tusFrames = frames+-- , tusName :: String -- ^ optional name for the TUS+-- , tusTextureAlias :: String -- ^ optional alias for texture frames+ , tusEffects = effects+ } = tl+ texl = fromMaybe (error "fromJust 12") frames -- TODO: const TexturePtr& tex = tl._getTexturePtr();++ -- Activate TextureUnit+ setActiveTextureUnit rs texUnit+ -- Vertex texture binding?+ unless (null texl) $ do+ let tex = case animDuration of+ { Nothing -> head texl+ ; Just 0 -> head texl+ ; Just d -> texl !! (floor $ (fromIntegral $ length texl) * (snd $ properFraction $ time / d))+ }+ case (Set.member RSC_VERTEX_TEXTURE_FETCH caps && (not $ rscVertexTextureUnitsShared rsc)) of+ { True -> case bindingType of+ { BT_VERTEX -> do+ -- Bind vertex texture+ setVertexTexture rs $ Just tex+ -- bind nothing to fragment unit (hardware isn't shared but fragment+ -- unit can't be using the same index+ setTexture rs Nothing+ ; _ -> do+ -- vice versa+ setVertexTexture rs Nothing+ setTexture rs $ Just tex+ }+ ; False -> do+ -- Shared vertex / fragment textures or no vertex texture support+ -- Bind texture (may be blank)+ setTexture rs $ Just tex+ }+ + -- Set texture layer filtering+ setTextureUnitFiltering rs texType minFilter magFilter mipFilter++ -- Set texture layer filtering+ when (Set.member RSC_ANISOTROPY caps) $+ setTextureLayerAnisotropy rs texType maxAniso++ -- Set mipmap biasing+ when (Set.member RSC_MIPMAP_LOD_BIAS caps) $+ setTextureMipmapBias rs mipmapBias++ -- Set blend modes+ -- Check to see if blending is supported+ when (Set.member RSC_BLENDING caps) $ do+ setTextureBlendMode rs colourBlendMode alphaBlendMode+ --HINT: Obsolete below, due to stateful behaviour+ -- Note, colour before alpha is important+ --setTextureBlendMode rs colourBlendMode + --setTextureBlendMode rs alphaBlendMode++ -- Texture addressing mode+ setTextureAddressingMode rs texType uvw+ -- Set texture border colour only if required+ when ( amU uvw == TAM_BORDER ||+ amV uvw == TAM_BORDER ||+ amW uvw == TAM_BORDER ) $+ setTextureBorderColour rs texType borderColour++ -- Set texture effects+ -- TODO+-- mapM_ effects+ setTextureCoordCalculation rs TEXCALC_NONE+ forM_ effects $ \ e -> case teType e of+ { ET_ENVIRONMENT_MAP -> setTextureCoordCalculation rs TEXCALC_ENVIRONMENT_MAP+ ; _ -> return ()+ }+-- effects+{-+ // Set texture effects+ TextureUnitState::EffectMap::iterator effi;+ // Iterate over new effects+ bool anyCalcs = false;+ for (effi = tl.mEffects.begin(); effi != tl.mEffects.end(); ++effi)+ {+ switch (effi->second.type)+ {+ case TextureUnitState::ET_ENVIRONMENT_MAP:+ if (effi->second.subtype == TextureUnitState::ENV_CURVED)+ {+ _setTextureCoordCalculation(texUnit, TEXCALC_ENVIRONMENT_MAP);+ anyCalcs = true;+ }+ else if (effi->second.subtype == TextureUnitState::ENV_PLANAR)+ {+ _setTextureCoordCalculation(texUnit, TEXCALC_ENVIRONMENT_MAP_PLANAR);+ anyCalcs = true;+ }+ else if (effi->second.subtype == TextureUnitState::ENV_REFLECTION)+ {+ _setTextureCoordCalculation(texUnit, TEXCALC_ENVIRONMENT_MAP_REFLECTION);+ anyCalcs = true;+ }+ else if (effi->second.subtype == TextureUnitState::ENV_NORMAL)+ {+ _setTextureCoordCalculation(texUnit, TEXCALC_ENVIRONMENT_MAP_NORMAL);+ anyCalcs = true;+ }+ break;+ case TextureUnitState::ET_UVSCROLL:+ case TextureUnitState::ET_USCROLL:+ case TextureUnitState::ET_VSCROLL:+ case TextureUnitState::ET_ROTATE:+ case TextureUnitState::ET_TRANSFORM:+ break;+ case TextureUnitState::ET_PROJECTIVE_TEXTURE:+ _setTextureCoordCalculation(texUnit, TEXCALC_PROJECTIVE_TEXTURE, + effi->second.frustum);+ anyCalcs = true;+ break;+ }+ }+ // Ensure any previous texcoord calc settings are reset if there are now none+ if (!anyCalcs)+ {+ _setTextureCoordCalculation(texUnit, TEXCALC_NONE);+ }++ // Change tetxure matrix + _setTextureMatrix(texUnit, tl.getTextureTransform());+ }+-}+ return ()+{-+ const Matrix4& TextureUnitState::getTextureTransform() const+ {+ if (mRecalcTexMatrix)+ recalcTextureMatrix();+ return mTexModMatrix;++ }+-}+calcTextureMatrix tus = do+ return ()+{-+ //-----------------------------------------------------------------------+ void TextureUnitState::recalcTextureMatrix() const+ {+ // Assumption: 2D texture coords+ Matrix4 xform;++ xform = Matrix4::IDENTITY;+ if (mUScale != 1 || mVScale != 1)+ {+ // Offset to center of texture+ xform[0][0] = 1/mUScale;+ xform[1][1] = 1/mVScale;+ // Skip matrix concat since first matrix update+ xform[0][3] = (-0.5 * xform[0][0]) + 0.5;+ xform[1][3] = (-0.5 * xform[1][1]) + 0.5;+ }++ if (mUMod || mVMod)+ {+ Matrix4 xlate = Matrix4::IDENTITY;++ xlate[0][3] = mUMod;+ xlate[1][3] = mVMod;++ xform = xlate * xform;+ }++ if (mRotate != Radian(0))+ {+ Matrix4 rot = Matrix4::IDENTITY;+ Radian theta ( mRotate );+ Real cosTheta = Math::Cos(theta);+ Real sinTheta = Math::Sin(theta);++ rot[0][0] = cosTheta;+ rot[0][1] = -sinTheta;+ rot[1][0] = sinTheta;+ rot[1][1] = cosTheta;+ // Offset center of rotation to center of texture+ rot[0][3] = 0.5 + ( (-0.5 * cosTheta) - (-0.5 * sinTheta) );+ rot[1][3] = 0.5 + ( (-0.5 * sinTheta) + (-0.5 * cosTheta) );++ xform = rot * xform;+ }++ mTexModMatrix = xform;+ mRecalcTexMatrix = false;++ }+-}
+ Graphics/LambdaCube/RenderSystem/GL.hs view
@@ -0,0 +1,13 @@+module Graphics.LambdaCube.RenderSystem.GL (mkGLRenderSystem,GLEntity,GLRenderEntity,GLVertexBuffer,GLIndexBuffer) where++import Graphics.LambdaCube.Entity+import Graphics.LambdaCube.RenderSystem+import Graphics.LambdaCube.RenderSystem.GL.GLRenderSystem+import Graphics.LambdaCube.RenderSystem.GL.GLVertexBuffer+import Graphics.LambdaCube.RenderSystem.GL.GLIndexBuffer+import Graphics.LambdaCube.RenderSystem.GL.GLTexture+import Graphics.LambdaCube.RenderSystem.GL.GLGpuProgram++type GLEntity = Entity GLVertexBuffer GLIndexBuffer GLTexture GLLinkedGpuProgram++type GLRenderEntity = RenderEntity GLVertexBuffer GLIndexBuffer GLTexture GLLinkedGpuProgram
+ Graphics/LambdaCube/RenderSystem/GL/GLCapabilities.hs view
@@ -0,0 +1,404 @@+module Graphics.LambdaCube.RenderSystem.GL.GLCapabilities where++import Data.Set (Set)+import qualified Data.Set as Set++import Graphics.Rendering.OpenGL (($=))+import qualified Graphics.Rendering.OpenGL as GL++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.RenderSystemCapabilities++ {-+ vendor, renderer, glVersion, glExtensions, shadingLanguageVersion,+ majorMinor, contextProfile+vendor :: GettableStateVar String+renderer :: GettableStateVar String+glVersion :: GettableStateVar String+glExtensions :: GettableStateVar [String]+shadingLanguageVersion :: GettableStateVar String++ = DriverVersion + { dvMajor :: Int+ , dvMinor :: Int+ , dvRelease :: Int+ , dvBuild :: Int+ }+ -}+++--mkRenderSystemCapabilities :: IO RenderSystemCapabilities+mkGLCapabilities = do+ vendorS <- GL.get GL.vendor+ versionS <- GL.get GL.glVersion+ extSList <- GL.get GL.glExtensions+ shLngVerS <- GL.get GL.shadingLanguageVersion++ -- setup driver version+ {-+ StringVector tokens = StringUtil::split(mGLSupport->getGLVersion(), ".");++ if (!tokens.empty())+ {+ mDriverVersion.major = StringConverter::parseInt(tokens[0]);+ if (tokens.size() > 1)+ mDriverVersion.minor = StringConverter::parseInt(tokens[1]);+ if (tokens.size() > 2)+ mDriverVersion.release = StringConverter::parseInt(tokens[2]); + }+ mDriverVersion.build = 0;+ -}+ -- setup device name+ deviceName <- GL.get GL.renderer+ {-+ const char* deviceName = (const char*)glGetString(GL_RENDERER);+ rsc->setDeviceName(deviceName);+ -}+ -- setup vendor + let v = words vendorS+ vendorName = if elem "NVIDIA" v then GPU_NVIDIA+ else if elem "ATI" v then GPU_ATI+ else if elem "Intel" v then GPU_INTEL+ else if elem "S3" v then GPU_S3+ else if elem "Matrox" v then GPU_MATROX+ else if elem "3DLabs" v then GPU_3DLABS+ else if elem "SiS" v then GPU_SIS+ else GPU_UNKNOWN++ (major,minor) <- GL.get $ GL.majorMinor GL.glVersion+ -- setup capabilities+ let ext = Set.fromList extSList+ glVer a b = major > a || (major >= a && minor >= b)+ supports s = Set.member s ext+ driverVersion = DriverVersion major minor 0 0 -- TODO+ caps0 =+ [ RSC_FIXED_FUNCTION -- Supports fixed-function+ , RSC_SCISSOR_TEST -- Scissor test is standard in GL 1.2 (is it emulated on some cards though?)+ , RSC_USER_CLIP_PLANES -- As are user clipping planes+ , RSC_VERTEX_FORMAT_UBYTE4 -- UBYTE4 always supported+ , RSC_INFINITE_FAR_PLANE -- Infinite far plane always supported+ , RSC_TEXTURE_3D -- 3D textures should be supported by GL 1.2, which is our minimum version+ ]+ + -- Check for hardware mipmapping support.+ caps1 = if not (glVer 1 4 || supports "GL_SGIS_generate_mipmap") then [] else+ [RSC_AUTOMIPMAP] -- FIXME+ {-+ case vendorName of+ { GPU_ATI -> [] -- Apple & Linux ATI drivers have faults in hardware mipmap generation+ -- The Intel 915G frequently corrupts textures when using hardware mip generation+ -- I'm not currently sure how many generations of hardware this affects, + -- so for now, be safe. + ; GPU_INTEL -> []+ ; GPU_SIS -> [] -- SiS chipsets also seem to have problems with this+ ; _ -> [RSC_AUTOMIPMAP]+ }+ -}+ -- Check for blending support+ caps2 = if (glVer 1 3 || supports "GL_ARB_texture_env_combine" || supports "GL_EXT_texture_env_combine") then [RSC_BLENDING] else []++ -- Check for Multitexturing support and set number of texture units+ numTexUnits <- case glVer 1 3 || supports "GL_ARB_multitexture" of+ { True -> do+ GL.TextureUnit mtu <- GL.get GL.maxTextureUnit+ mtimu <- case supports "GL_ARB_fragment_program" of + { True -> do+ -- Also check GL_MAX_TEXTURE_IMAGE_UNITS_ARB since NV at least+ -- only increased this on the FX/6x00 series+ GL.get GL.maxTextureImageUnits+ ; False -> return 0+ }+ -- FIXME: enable at becoming hgl binding+ return mtimu -- $ max mtu (fromIntegral mtimu)+ ; False -> return 1+ }++ -- Check for Anisotropy support+ let caps3 = if (supports "GL_EXT_texture_filter_anisotropic") then [RSC_ANISOTROPY] else []++ -- Check for DOT3 support+ caps4 = if (glVer 1 3 || supports "GL_ARB_texture_env_dot3" || supports "GL_EXT_texture_env_dot3") then [RSC_DOT3] else []++ -- Check for cube mapping+ caps5 = if (glVer 1 3 || supports "GL_ARB_texture_cube_map" || supports "GL_EXT_texture_cube_map") then [RSC_CUBEMAPPING] else []++ -- Point sprites+ caps6 = if (glVer 2 0 || supports "GL_ARB_point_sprite") then [RSC_POINT_SPRITES] else []++ -- Check for point parameters+ caps7 = if (glVer 1 4) then [RSC_POINT_EXTENDED_PARAMETERS] else []+ caps8 = if (supports "GL_ARB_point_parameters") then [RSC_POINT_EXTENDED_PARAMETERS_ARB] else []+ caps9 = if (supports "GL_EXT_point_parameters") then [RSC_POINT_EXTENDED_PARAMETERS_EXT] else []++ -- Check for hardware stencil support and set bit depth+ stencilBits <- GL.get GL.stencilBits+ let caps10 = if stencilBits > 0 then [RSC_HWSTENCIL] else []++ caps11 = if not (glVer 1 5 || supports "GL_ARB_vertex_buffer_object") then [] else+ [RSC_VBO] ++ (if not (supports "GL_ARB_vertex_buffer_object") then [RSC_GL1_5_NOVBO] else [])+-- TODO: haskell gl binding does not support query for GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB+{-+ if(GLEW_ARB_vertex_program)+ {+ rsc->setCapability(RSC_VERTEX_PROGRAM);++ // Vertex Program Properties+ rsc->setVertexProgramConstantBoolCount(0);+ rsc->setVertexProgramConstantIntCount(0);++ GLint floatConstantCount;+ glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &floatConstantCount);+ rsc->setVertexProgramConstantFloatCount(floatConstantCount);++ rsc->addShaderProfile("arbvp1");+ if (GLEW_NV_vertex_program2_option)+ {+ rsc->addShaderProfile("vp30");+ }++ if (GLEW_NV_vertex_program3)+ {+ rsc->addShaderProfile("vp40");+ }++ if (GLEW_NV_vertex_program4)+ {+ rsc->addShaderProfile("gp4vp");+ rsc->addShaderProfile("gpu_vp");+ }+ }+-}+ (prof1,caps12) = if supports "GL_NV_register_combiners2" && supports "GL_NV_texture_shader" then (["fp20"],[RSC_FRAGMENT_PROGRAM]) else ([],[])++ -- check for ATI fragment shader support+ -- no boolean params allowed+ -- no integer params allowed+ -- only 8 Vector4 constant floats supported+ (prof2,caps13,fragConstBool,fragConstInt,fragConstFloat) = if supports "GL_ATI_fragment_shader" then (["ps_1_4","ps_1_3","ps_1_2","ps_1_1"],[RSC_FRAGMENT_PROGRAM],0,0,8) else ([],[],0,0,0)+-- TODO+------------------------------------------------------------------------------+{-+ (prof,cap,fragConstBool,fragConstInt,fragConstFloat) <- case supports "GL_ARB_fragment_program" of+ { True -> do+ -- Fragment Program Properties+ return ([],[RSC_FRAGMENT_PROGRAM],0,0,)+ ; False -> ([],[],0,0,0)+ }+-}+{-++ if (GLEW_ARB_fragment_program)+ {+ rsc->setCapability(RSC_FRAGMENT_PROGRAM);++ // Fragment Program Properties+ rsc->setFragmentProgramConstantBoolCount(0);+ rsc->setFragmentProgramConstantIntCount(0);++ GLint floatConstantCount;+ glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &floatConstantCount);+ rsc->setFragmentProgramConstantFloatCount(floatConstantCount);++ rsc->addShaderProfile("arbfp1");+ if (GLEW_NV_fragment_program_option)+ {+ rsc->addShaderProfile("fp30");+ }++ if (GLEW_NV_fragment_program2)+ {+ rsc->addShaderProfile("fp40");+ } + }+-}+------------------------------------------------------------------------------+ -- Check if GLSL is supported+ prof3 = if glVer 2 0 ||+ (supports "GL_ARB_shading_language_100" + && supports "GL_ARB_shader_objects"+ && supports "GL_ARB_fragment_shader"+ && supports "GL_ARB_vertex_shader") then ["glsl"] else []+-- TODO+--------------------------------------------------------------------------------------+ -- Check if geometry shaders are supported+ {-+ (cap,prof,boolC,intC,floatC,outVertN) <- case glVer 2 0 && supports "GL_EXT_geometry_shader4" of+ { True -> do+ return ([RSC_GEOMETRY_PROGRAM],["nvgp4","gpu_gp","gp4gp"],0,0,)+ ; False -> return ([],[],0,0,0,0)+ }+ -}+{-+ // Check if geometry shaders are supported+ if (GLEW_VERSION_2_0 &&+ GLEW_EXT_geometry_shader4)+ {+ rsc->setCapability(RSC_GEOMETRY_PROGRAM);+ rsc->addShaderProfile("nvgp4");++ //Also add the CG profiles+ rsc->addShaderProfile("gpu_gp");+ rsc->addShaderProfile("gp4gp");++ rsc->setGeometryProgramConstantBoolCount(0);+ rsc->setGeometryProgramConstantIntCount(0);++ GLint floatConstantCount;+ glGetProgramivARB(GL_GEOMETRY_PROGRAM_NV, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &floatConstantCount);+ rsc->setGeometryProgramConstantFloatCount(floatConstantCount);++ GLint maxOutputVertices;+ glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT,&maxOutputVertices);+ rsc->setGeometryProgramNumOutputVertices(maxOutputVertices);+ }+-} +--------------------------------------------------------------------------------------+ -- Check if render to vertex buffer (transform feedback in OpenGL)+ caps14 = if (glVer 2 0 && supports "GL_NV_transform_feedback") then [RSC_HWRENDER_TO_VERTEX_BUFFER] else []++ -- Check for texture compression+ caps15 = if not (glVer 1 3 || supports "GL_ARB_texture_compression") then [] else+ [RSC_TEXTURE_COMPRESSION]+ -- Check for dxt compression+ --------------------------------------------------------------------------------+ {- FIXME: we should disable DXT on (apple && ati && ppc)+ -- if defined(__APPLE__) && defined(__PPC__)+ -- // Apple on ATI & PPC has errors in DXT+ -- if (mGLSupport->getGLVendor().find("ATI") == std::string::npos)+ -- endif+ -}+ --------------------------------------------------------------------------------+ ++ (if supports "GL_EXT_texture_compression_s3tc" then [RSC_TEXTURE_COMPRESSION_DXT] else [])+ -- Check for vtc compression+ ++ (if supports "GL_NV_texture_compression_vtc" then [RSC_TEXTURE_COMPRESSION_VTC] else [])++ -- 2-sided stencil?+ caps16 = if (glVer 2 0 || supports "GL_EXT_stencil_two_side") then [RSC_TWO_SIDED_STENCIL] else []+ caps17 = if (glVer 1 4 || supports "GL_EXT_stencil_wrap") then [RSC_STENCIL_WRAP] else []++ -- Check for hardware occlusion support+ caps18 = case glVer 1 5 || supports "GL_ARB_occlusion_query" of+ -- Some buggy driver claim that it is GL 1.5 compliant and not support ARB_occlusion_query+ { True -> [RSC_HWOCCLUSION] ++ (if not (supports "GL_ARB_occlusion_query") then [RSC_GL1_5_NOHWOCCLUSION] else [])+ -- Support NV extension too for old hardware+ ; False -> if supports "GL_NV_occlusion_query" then [RSC_HWOCCLUSION] else []+ } + -- Check for non-power-of-2 texture support+ caps19 = if (supports "GL_ARB_texture_non_power_of_two") then [RSC_NON_POWER_OF_2_TEXTURES] else []++ -- Check for Float textures+ caps20 = if (supports "GL_ATI_texture_float" || supports "GL_ARB_texture_float") then [RSC_TEXTURE_FLOAT] else []++ -- Check for framebuffer object extension+ (numMTR,caps21) <- case supports "GL_EXT_framebuffer_object" of+ { True -> do+ -- Probe number of draw buffers+ -- Only makes sense with FBO support, so probe here+ (n,c) <- case glVer 2 0 || supports "GL_ARB_draw_buffers" || supports "GL_ATI_draw_buffers" of+ { True -> do+ m <- GL.get GL.maxDrawBuffers+ -- Before GL version 2.0, we need to get one of the extensions+ let cp = case (glVer 2 0, supports "GL_ARB_draw_buffers", supports "GL_ATI_draw_buffers") of+ { (False,True,True) -> [RSC_FBO_ARB,RSC_FBO_ATI]+ ; (False,True,False) -> [RSC_FBO_ARB]+ ; (False,False,True) -> [RSC_FBO_ATI]+ ; _ -> []+ }+ -- Set FBO flag for all 3 'subtypes'+ return (m,[RSC_MRT_DIFFERENT_BIT_DEPTHS,RSC_FBO] ++ cp)+ ; False -> return (0,[])+ }+ return (n,RSC_HWRENDER_TO_TEXTURE:c)+ ; False -> do+ -- TODO+ ----------------------------------------------+ {-+ // Check GLSupport for PBuffer support+ if(mGLSupport->supportsPBuffers())+ {+ // Use PBuffers+ rsc->setCapability(RSC_HWRENDER_TO_TEXTURE);+ rsc->setCapability(RSC_PBUFFER);+ }+ -}+ ----------------------------------------------+ return (0,[])+ }+ ------------------------------------------------------+ -- FIXE: haskell gl binding does not have query for GL_POINT_SIZE_RANGE+ -- Point size+ (_,maxPointSize) <- GL.get GL.pointSizeRange+ {-+ if (GLEW_VERSION_1_4)+ {+ float ps;+ glGetFloatv(GL_POINT_SIZE_MAX, &ps);+ rsc->setMaxPointSize(ps);+ }+ else+ {+ GLint vSize[2];+ glGetIntegerv(GL_POINT_SIZE_RANGE,vSize);+ rsc->setMaxPointSize(vSize[1]);+ }+ -}+ -- Point size: Ends here+ ------------------------------------------------------++ -- Vertex texture fetching+ (numVertTexUnits,caps22,vertTexUnitsShared) <- case supports "GL_ARB_vertex_shader" of+ { True -> do+ vunits <- GL.get GL.maxVertexTextureImageUnits+ -- GL always shares vertex and fragment texture units (for now?)+ return (vunits,if vunits > 0 then [RSC_VERTEX_TEXTURE_FETCH] else [], True)+ ; False -> return (0,[],False)+ }+ + -- Mipmap LOD biasing?+ let caps23 = if (glVer 1 4 || supports "GL_EXT_texture_lod_bias") then [RSC_MIPMAP_LOD_BIAS] else []++ -- Alpha to coverage?+ -- Alpha to coverage always 'supported' when MSAA is available+ -- although card may ignore it if it doesn't specifically support A2C+ caps24 = if (supports "GL_ARB_multisample") then [RSC_ALPHA_TO_COVERAGE] else []++ -- Advanced blending operations+ caps25 = if (glVer 2 0) then [RSC_ADVANCED_BLEND_OPERATIONS] else []+ return RenderSystemCapabilities+ { rscDriverVersion = driverVersion+ , rscVendor = vendorName+ +-- , rscNumWorldMatrices :: Int -- ^ The number of world matrices available+ , rscNumTextureUnits = fromIntegral numTexUnits+ , rscStencilBufferBitDepth = fromIntegral stencilBits+-- , rscNumVertexBlendMatrices :: Int+ , rscCapabilities = Set.fromList $ caps0 ++ caps1 ++ caps2 ++ caps3 ++ caps4 ++ caps5 ++ caps6 ++ caps7 ++ caps8 ++ caps9 + ++ caps10 ++ caps11 ++ caps12 ++ caps13 ++ caps14 ++ caps15 ++ caps16 ++ caps17 ++ caps18 ++ caps19 + ++ caps20 ++ caps21 ++ caps22 ++ caps23 ++ caps24 ++ caps25+ + , rscDeviceName = deviceName+ , rscRenderSystemName = "OpenGL Rendering Subsystem"+-- TODO + , rscVertexProgramConstantFloatCount = undefined+ , rscVertexProgramConstantIntCount = undefined+ , rscVertexProgramConstantBoolCount = undefined++ , rscGeometryProgramConstantFloatCount = undefined+ , rscGeometryProgramConstantIntCount = undefined+ , rscGeometryProgramConstantBoolCount = undefined++ , rscFragmentProgramConstantFloatCount = fragConstFloat+ , rscFragmentProgramConstantIntCount = fragConstInt+ , rscFragmentProgramConstantBoolCount = fragConstBool++ , rscNumMultiRenderTargets = fromIntegral numMTR+ , rscMaxPointSize = realToFrac maxPointSize+ , rscNonPOW2TexturesLimited = False+ , rscNumVertexTextureUnits = fromIntegral numVertTexUnits+ , rscVertexTextureUnitsShared = vertTexUnitsShared+-- TODO+ , rscGeometryProgramNumOutputVertices = undefined++ , rscSupportedShaderProfiles = Set.fromList $ prof1 ++ prof2 ++ prof3+ }+
+ Graphics/LambdaCube/RenderSystem/GL/GLGpuProgram.hs view
@@ -0,0 +1,147 @@+module Graphics.LambdaCube.RenderSystem.GL.GLGpuProgram where++import Data.Either++import System.Log.Logger+import Graphics.Rendering.OpenGL (($=))+import qualified Graphics.Rendering.OpenGL as GL++import Graphics.LambdaCube.HardwareVertexBuffer+import Graphics.LambdaCube.GpuProgram+import Graphics.LambdaCube.GpuProgramParams++-- Some drivers (e.g. OS X on nvidia) incorrectly determine the attribute binding automatically+-- and end up aliasing existing built-ins. So avoid! Fixed builtins are: ++-- a builtin custom attrib name+-- ----------------------------------------------+-- 0 gl_Vertex vertex+-- 1 n/a blendWeights +-- 2 gl_Normal normal+-- 3 gl_Color colour+-- 4 gl_SecondaryColor secondary_colour+-- 5 gl_FogCoord fog_coord+-- 7 n/a blendIndices+-- 8 gl_MultiTexCoord0 uv0+-- 9 gl_MultiTexCoord1 uv1+-- 10 gl_MultiTexCoord2 uv2+-- 11 gl_MultiTexCoord3 uv3+-- 12 gl_MultiTexCoord4 uv4+-- 13 gl_MultiTexCoord5 uv5+-- 14 gl_MultiTexCoord6 uv6, tangent+-- 15 gl_MultiTexCoord7 uv7, binormal+getFixedAttributeIndex :: VertexElementSemantic -> Int -> Int+getFixedAttributeIndex semantic index = case semantic of+ { VES_POSITION -> 0+ ; VES_BLEND_WEIGHTS -> 1+ ; VES_NORMAL -> 2+ ; VES_DIFFUSE -> 3+ ; VES_SPECULAR -> 4+ ; VES_BLEND_INDICES -> 7+ ; VES_TEXTURE_COORDINATES -> 8 + index+ ; VES_TANGENT -> 14+ ; VES_BINORMAL -> 15+ --; _ -> error "Missing attribute!"+ }++isAttributeValid :: VertexElementSemantic -> Int -> Bool+isAttributeValid semantic index = case semantic of+ { VES_POSITION -> False+ ; VES_NORMAL -> False+ ; VES_DIFFUSE -> False+ ; VES_SPECULAR -> False+ ; VES_TEXTURE_COORDINATES -> False+ ; VES_BLEND_WEIGHTS -> True+ ; VES_BLEND_INDICES -> True+ ; VES_BINORMAL -> True+ ; VES_TANGENT -> True+ }+{-+data GLGpuProgram+ = GLGpuProgram+ { glgpType :: GpuProgramType -- ^ The type of the program+ , glgpFilename :: String -- ^ The name of the file to load source from (may be blank)+ , glgpSource :: String -- ^ The assembler source of the program (may be blank until file loaded)+ , glgpLoadFromFile :: Bool -- ^ Whether we need to load source from file or not+ , glgpSyntaxCode :: String -- ^ Syntax code e.g. arbvp1, vs_2_0 etc+ , glgpSkeletalAnimation :: Bool -- ^ Does this (vertex) program include skeletal animation?+ , glgpMorphAnimation :: Bool -- ^ Does this (vertex) program include morph animation?+ , glgpPoseAnimation :: Int -- ^ Does this (vertex) program include pose animation (count of number of poses supported)+ , glgpVertexTextureFetch :: Bool -- ^ Does this (vertex) program require support for vertex texture fetch?+ , glgpNeedsAdjacencyInfo :: Bool -- ^ Does this (geometry) program require adjacency information?+ , glgpDefaultParams :: GpuProgramParameters -- ^ The default parameters for use with this object+ , glgpCompileError :: Bool -- ^ Did we encounter a compilation error?++ , glgpProgramObject :: GL.Program+ }+-}+data GLGpuProgram+ = GLGpuProgram+ { glgpShaderObject :: Either GL.VertexShader GL.FragmentShader+ }+ deriving Eq++data GLLinkedGpuProgram+ = GLLinkedGpuProgram+ { gllgpProgramObject :: GL.Program+ }+ deriving Eq++instance LinkedGpuProgram GLLinkedGpuProgram --where++instance GpuProgram GLGpuProgram --where+-- gpType = undefined++compileShader src = do+ [shader] <- GL.genObjectNames 1+ GL.shaderSource shader $= [src]+ GL.compileShader shader++ -- TEMP CODE+ infoLog <- GL.get (GL.shaderInfoLog shader)+ infoM "ResourceLibrary" $ "infoLog cmp " ++ infoLog+ ok <- GL.get (GL.compileStatus shader)+ case ok of+ { False -> do+ GL.deleteObjectNames [shader]+ errl <- GL.get GL.errors+ return $ Right $ "shader compilation failed: " ++ concat [show c ++ " - " ++ m ++ "\n" | GL.Error c m <- errl]+ ; True -> return $ Left shader+ }++mkGLGpuProgram ptype src = case ptype of+ { GPT_VERTEX_PROGRAM -> do+ debugM "ResourceLibrary" $ "compiling vertex shader: "+ s <- compileShader src+ case s of+ { Right m -> return $ Right m+ ; Left sh -> return $ Left $ GLGpuProgram $ Left sh+ }+ ; GPT_FRAGMENT_PROGRAM -> do+ debugM "ResourceLibrary" $ "compiling fragment shader: "+ s <- compileShader src+ case s of+ { Right m -> return $ Right m+ ; Left sh -> return $ Left $ GLGpuProgram $ Right sh+ }+ ; GPT_GEOMETRY_PROGRAM -> undefined+ }++mkGLLinkedGpuProgram :: [GLGpuProgram] -> IO (Either GLLinkedGpuProgram String)+mkGLLinkedGpuProgram pl = do+ [p] <- GL.genObjectNames 1+ let vp = lefts $ map glgpShaderObject pl+ fp = rights $ map glgpShaderObject pl+ GL.attachedShaders p $= (vp, fp)+ GL.linkProgram p++ ok <- GL.get (GL.linkStatus p)+ infoLog <- GL.get (GL.programInfoLog p)+ infoM "ResourceLibrary" $ "infoLog link " ++ infoLog+ case ok of+ { False -> do+ GL.deleteObjectNames [p]+ errl <- GL.get GL.errors+ return $ Right $ "GpuProgram linking failed: " ++ concat [show c ++ " - " ++ m ++ "\n" | GL.Error c m <- errl]+ ; True -> return $ Left $ GLLinkedGpuProgram p+ }
+ Graphics/LambdaCube/RenderSystem/GL/GLIndexBuffer.hs view
@@ -0,0 +1,142 @@+module Graphics.LambdaCube.RenderSystem.GL.GLIndexBuffer where++import Data.Word+import Data.Maybe+import Foreign.Marshal.Alloc+import Foreign.Marshal.Utils+import Foreign.Storable+import Foreign.C.Types+import Foreign.Ptr+import Data.IORef+import Control.Monad++import Graphics.Rendering.OpenGL (($=))+import qualified Graphics.Rendering.OpenGL as GL++import Graphics.LambdaCube.RenderSystem+import Graphics.LambdaCube.HardwareBuffer+import Graphics.LambdaCube.HardwareIndexBuffer+import Graphics.LambdaCube.RenderSystem.GL.GLUtils+++-- | Specialisation of HardwareIndexBuffer for GL+data GLIndexBuffer+ = GLIndexBuffer+ { glibType :: IndexType+ , glibNumIndexes :: Int+ + , glibUsage :: Usage+ , glibLockInfo :: IORef (Maybe (Int,Int,Bool)) -- LockStart LockSize RequireUpdate++ , glibShadowBuffer :: Maybe (Ptr Word8)+ , glibBufferObject :: Maybe GL.BufferObject+ }+ deriving Eq+ +instance HardwareIndexBuffer GLIndexBuffer where+ getIndexType = glibType+ getNumIndexes = glibNumIndexes+ getIndexSize b = case getIndexType b of+ { IT_16BIT -> 2+ ; IT_32BIT -> 4+ }++instance HardwareBuffer GLIndexBuffer where+ getSizeInBytes b = getIndexSize b * glibNumIndexes b+ isSystemMemory = isNothing . glibBufferObject+ hasShadowBuffer b = (isJust $ glibShadowBuffer b) && (isJust $ glibBufferObject b)+ getUsage = glibUsage+ isLocked = glibIsLocked+ unlock = glibUnlock+ lock = glibLock++glibIsLocked b = do+ i <- readIORef $ glibLockInfo b+ return $ isJust i++glibLock a offs len opts = do+ lockinfo <- readIORef (glibLockInfo a)+ when (isJust lockinfo) $ error "Cannot lock this buffer, it is already locked!"+ writeIORef (glibLockInfo a) $ Just (offs,len,opts /= HBL_READ_ONLY)+ case glibShadowBuffer a of+ { Just b -> return $ plusPtr b offs+ ; Nothing -> do+ GL.bindBuffer GL.ElementArrayBuffer $= (glibBufferObject a)+ -- Discard if required+ when (opts == HBL_DISCARD) $ GL.bufferData GL.ElementArrayBuffer $= (fromIntegral $ getSizeInBytes a, nullPtr, getGLUsage $ getUsage a)+ let isWriteOnly = case getUsage a of+ { HBU_WRITE_ONLY -> True+ ; HBU_STATIC_WRITE_ONLY -> True+ ; HBU_DYNAMIC_WRITE_ONLY -> True+ ; HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE -> True+ ; _ -> False+ }+ access = case (isWriteOnly,opts == HBL_READ_ONLY) of+ { (False,False) -> GL.ReadWrite+ ; (False,True) -> GL.ReadOnly+ ; (True,_) -> GL.WriteOnly+ }+ mb <- GL.mapBuffer GL.ElementArrayBuffer access+ case mb of+ { Just b -> return $ plusPtr b offs+ ; Nothing -> error "Index Buffer: Out of memory"+ }+ }++glibUnlock a = do+ lockinfo <- readIORef (glibLockInfo a)+ let (lockStart,lockSize,reqUpdate) = case lockinfo of+ { Just li -> li+ ; Nothing -> error "Cannot unlock this buffer, it is not locked!"+ }+ writeIORef (glibLockInfo a) Nothing+ case glibShadowBuffer a of+ { Just b -> when reqUpdate $ do -- If we used the shadow buffer this time...+ GL.bindBuffer GL.ElementArrayBuffer $= (glibBufferObject a)+ case lockStart == 0 && lockSize == getSizeInBytes a of+ { True -> GL.bufferData GL.ElementArrayBuffer $= (fromIntegral lockSize, b, getGLUsage $ getUsage a)+ ; False -> GL.bufferSubData GL.ElementArrayBuffer GL.WriteToBuffer (fromIntegral lockStart) (fromIntegral lockSize) b+ }+ ; Nothing -> do+ GL.bindBuffer GL.ElementArrayBuffer $= (glibBufferObject a)+ ok <- GL.unmapBuffer GL.ElementArrayBuffer+ unless ok $ error "Buffer data corrupted, please reload"+ }++--mkGLIndexBuffer :: RenderSystem rs vb _ _ => rs -> IndexType -> Int -> Usage -> Bool -> IO GLIndexBuffer+mkGLIndexBuffer rs itype numIndexes usage useShadowBuffer = do+ let isize = case itype of+ { IT_16BIT -> 2+ ; IT_32BIT -> 4+ }+ lockinfo <- newIORef Nothing+ [bufferObject] <- GL.genObjectNames 1+ GL.bindBuffer GL.ElementArrayBuffer $= Just bufferObject+ GL.bufferData GL.ElementArrayBuffer $= (fromIntegral $ numIndexes * isize, nullPtr, getGLUsage usage)+ shadowBuffer <- case useShadowBuffer of+ { True -> do+ b <- mallocBytes $ numIndexes * isize+ return $ Just b+ ; False -> return Nothing+ }+ return $ GLIndexBuffer+ { glibType = itype+ , glibNumIndexes = numIndexes+ + , glibUsage = usage+ , glibLockInfo = lockinfo++ , glibShadowBuffer = shadowBuffer+ , glibBufferObject = Just bufferObject+ }++rmGLIndexBuffer :: GLIndexBuffer -> IO ()+rmGLIndexBuffer a = do+ case glibBufferObject a of+ { Just b -> GL.deleteObjectNames [b]+ ; Nothing -> return ()+ }+ case glibShadowBuffer a of+ { Just b -> free b+ ; Nothing -> return ()+ }
+ Graphics/LambdaCube/RenderSystem/GL/GLOcclusionQuery.hs view
@@ -0,0 +1,37 @@+module Graphics.LambdaCube.RenderSystem.GL.GLOcclusionQuery where++import Graphics.Rendering.OpenGL (($=))+import qualified Graphics.Rendering.OpenGL as GL++import Graphics.LambdaCube.HardwareOcclusionQuery++data GLOcclusionQuery+ = GLOcclusionQuery+ { gloqQueryObject :: GL.QueryObject+ }++instance HardwareOcclusionQuery GLOcclusionQuery where+ beginOcclusionQuery = glBeginOcclusionQuery+ endOcclusionQuery = glEndOcclusionQuery+ pullOcclusionQuery = glPullOcclusionQuery+-- getLastQuerysPixelcount :: a -> IO Int+ isStillOutstanding = glStillOutstanding++mkGLOcclusionQuery = do+ [q] <- GL.genObjectNames 1+ return $ GLOcclusionQuery q+ +rmGLOcclusionQuery o = do+ GL.deleteObjectNames [gloqQueryObject o]++glBeginOcclusionQuery o = GL.beginQuery GL.SamplesPassed $ gloqQueryObject o+ +glEndOcclusionQuery o = GL.endQuery GL.SamplesPassed+ +glPullOcclusionQuery o = do+ c <- GL.get $ GL.queryResult $ gloqQueryObject o+ return $ fromIntegral c++glStillOutstanding o = do+ b <- GL.get $ GL.queryResultAvailable $ gloqQueryObject o+ return $ not b
+ Graphics/LambdaCube/RenderSystem/GL/GLRenderSystem.hs view
@@ -0,0 +1,1402 @@+{-# LANGUAGE MultiParamTypeClasses #-}+module Graphics.LambdaCube.RenderSystem.GL.GLRenderSystem where++import Data.IntMap ((!))+import qualified Data.Map as Map+import qualified Data.IntMap as IntMap+import qualified Data.Set as Set+import Data.IORef+import Data.Word+import Data.Maybe+import Control.Monad+import Foreign.C.Types+import Foreign.Ptr++import Graphics.Rendering.OpenGL (($=))+import qualified Graphics.Rendering.OpenGL as GL++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Common+import Graphics.LambdaCube.Math+import Graphics.LambdaCube.BlendMode+import Graphics.LambdaCube.HardwareBuffer+import Graphics.LambdaCube.HardwareVertexBuffer+import Graphics.LambdaCube.HardwareIndexBuffer+import Graphics.LambdaCube.VertexIndexData+import Graphics.LambdaCube.RenderOperation+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.TextureUnitState+import Graphics.LambdaCube.GpuProgram+import Graphics.LambdaCube.RenderSystemCapabilities+import Graphics.LambdaCube.RenderSystem+import Graphics.LambdaCube.RenderSystem.GL.GLGpuProgram+import Graphics.LambdaCube.RenderSystem.GL.GLTexture+import Graphics.LambdaCube.RenderSystem.GL.GLVertexBuffer+import Graphics.LambdaCube.RenderSystem.GL.GLIndexBuffer+import Graphics.LambdaCube.RenderSystem.GL.GLOcclusionQuery+import Graphics.LambdaCube.RenderSystem.GL.GLUtils+import Graphics.LambdaCube.RenderSystem.GL.GLCapabilities++data GLRenderSystem+ = GLRenderSystem+ { glrsWorldMatrix :: IORef (GL.GLmatrix GL.GLfloat)+ , glrsViewMatrix :: IORef (GL.GLmatrix GL.GLfloat)+ , glrsCapabilities :: RenderSystemCapabilities+ }++mkGLRenderSystem = do+ mat <- toGLMatrix $ scal 1+ worldMat <- newIORef mat+ viewMat <- newIORef mat+ cap <- mkGLCapabilities++ -- Initialize OpenGL+ extSList <- GL.get GL.glExtensions+ (major,minor) <- GL.get $ GL.majorMinor GL.glVersion+ -- setup capabilities+ let ext = Set.fromList extSList+ glVer a b = major > a || (major >= a && minor >= b)+ supports s = Set.member s ext++ when (glVer 1 2) $ do+ -- Set nicer lighting model -- d3d9 has this by default+ GL.lightModelColorControl $= GL.SeparateSpecularColor+ GL.lightModelLocalViewer $= GL.Enabled++ when (glVer 1 4) $ do+ GL.colorSum $= GL.Enabled+ GL.dither $= GL.Disabled++ -- Check for FSAA+ when (supports "GL_ARB_multisample") $ do+ fsaa <- GL.get GL.sampleBuffers+ when (fsaa > 0) $ + GL.multisample $= GL.Enabled++ return $ GLRenderSystem+ { glrsWorldMatrix = worldMat+ , glrsViewMatrix = viewMat+ , glrsCapabilities = cap+ }++glDirtyHackCopyTexImage tex x y w h = do+ GL.textureBinding GL.Texture2D $= (Just $ gltxTextureObject tex)+ -- only hint code: glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 128, 128, 0);+ GL.copyTexImage2D Nothing 0 GL.RGBA' (GL.Position (fromIntegral x) (fromIntegral y)) (GL.TextureSize2D (fromIntegral w) (fromIntegral h)) 0+ ++instance RenderSystem GLRenderSystem GLVertexBuffer GLIndexBuffer GLOcclusionQuery GLTexture GLGpuProgram GLLinkedGpuProgram where+ dirtyHackCopyTexImage _ = glDirtyHackCopyTexImage+ getName _ = "OpenGL Rendering Subsystem"+ getCapabilities = glrsCapabilities+ createVertexBuffer = mkGLVertexBuffer+ createIndexBuffer = mkGLIndexBuffer+ createOcclusionQuery _ = mkGLOcclusionQuery+ createTexture rs = mkGLTexture (glrsCapabilities rs)+ createGpuProgram _ = mkGLGpuProgram+ createLinkedGpuProgram _ = mkGLLinkedGpuProgram+ bindLinkedGpuProgram _ = glBindLinkedGpuProgram+ unbindLinkedGpuProgram _ = glUnBindLinkedGpuProgram+ render _ = glRender+ bindGeometry _ = glBindGeometry+ unbindGeometry rs = glUnBindGeometry (glrsCapabilities rs)+ setViewport _ x y w h = glSetViewport x y w h+ setPolygonMode _ pm = glSetPolygonMode pm+ setWorldMatrix = glSetWorldMatrix+ setViewMatrix = glSetViewMatrix+ setProjectionMatrix _ m = glSetProjectionMatrix m+ clearFrameBuffer _ b c d s = glClearFrameBuffer b c d s+ setShadingType _ = glSetShadingType+ setCullingMode _ = glSetCullingMode+ setAlphaRejectSettings rs = glSetAlphaRejectSettings (glrsCapabilities rs)+ setDepthBias _ = glSetDepthBias+ setDepthBufferWriteEnabled _ = glSetDepthBufferWriteEnabled+ setDepthBufferFunction _ = glSetDepthBufferFunction --FIXME+ setColourBufferWriteEnabled _ = glSetColourBufferWriteEnabled+ setSurfaceParams _ = glSetSurfaceParams+ setLightingEnabled _ = glSetLightingEnabled+ setFog _ = glSetFog+ setSceneBlending _ = glSetSceneBlending+ setSeparateSceneBlending _ = glSetSeparateSceneBlending+ setPointParameters = glSetPointParameters+ setPointSpritesEnabled rs = glSetPointSpritesEnabled (glrsCapabilities rs)+ setActiveTextureUnit _ = glSetActiveTextureUnit+ setTexture _ = glSetTexture+ setTextureAddressingMode _ = glSetTextureAddressingMode+ setTextureUnitFiltering _ = glSetTextureUnitFiltering+ setTextureLayerAnisotropy _ = glSetTextureLayerAnisotropy+ setTextureMipmapBias _ = glSetTextureMipmapBias+ setTextureMatrix _ = glSetTextureMatrix+ setTextureBorderColour _ = glSetTextureBorderColour+ setTextureCoordCalculation _ = glSetTextureCoordCalculation+ setTextureBlendMode rs = glSetTextureBlendMode (glrsCapabilities rs)+ getMinimumDepthInputValue _ = -1+ getMaximumDepthInputValue _ = 1++ +glSetDepthBias constantBias slopeScaleBias = case constantBias /= 0 || slopeScaleBias /= 0 of+ { True -> do+ GL.polygonOffsetFill $= GL.Enabled+ GL.polygonOffsetPoint $= GL.Enabled+ GL.polygonOffsetLine $= GL.Enabled+ GL.polygonOffset $= (realToFrac (-slopeScaleBias), realToFrac (-constantBias))+ ; False -> do+ GL.polygonOffsetFill $= GL.Disabled+ GL.polygonOffsetPoint $= GL.Disabled+ GL.polygonOffsetLine $= GL.Disabled+ }++glSetViewport x y w h = do+ let x' = fromIntegral x+ y' = fromIntegral y+ w' = fromIntegral w+ h' = fromIntegral h+ GL.viewport $= (GL.Position x' y', GL.Size w' h')+ GL.scissor $= Just (GL.Position x' y', GL.Size w' h') -- Configure the viewport clipping++glSetPolygonMode pm = case pm of+ { PM_POINTS -> GL.polygonMode $= (GL.Point,GL.Point)+ ; PM_WIREFRAME -> GL.polygonMode $= (GL.Line,GL.Line)+ ; PM_SOLID -> GL.polygonMode $= (GL.Fill,GL.Fill)+ }++glSetWorldMatrix rs m = do+ worldMat <- toGLMatrix m+ writeIORef (glrsWorldMatrix rs) worldMat+ viewMat <- readIORef $ glrsViewMatrix rs+ GL.matrixMode $= (GL.Modelview 0)+ GL.matrix (Just (GL.Modelview 0)) $= viewMat+ GL.multMatrix worldMat++glSetViewMatrix rs m = do+ viewMat <- toGLMatrix m+ writeIORef (glrsViewMatrix rs) viewMat+ worldMat <- readIORef $ glrsWorldMatrix rs+ GL.matrixMode $= (GL.Modelview 0)+ GL.matrix (Just (GL.Modelview 0)) $= viewMat+ GL.multMatrix worldMat++glSetProjectionMatrix m = do+ mat <- toGLMatrix m+ GL.matrix (Just GL.Projection) $= mat++glClearFrameBuffer buffers colour depth stencil = do+ tmpColorMask <- GL.get GL.colorMask+ tmpDepthMask <- GL.get GL.depthMask+ tmpStencilMask <- GL.get GL.stencilMask+ tmpScissor <- GL.get GL.scissor+ + when (fbtColour buffers) $ do+ let (r',g',b',a') = colour+ (r,g,b,a) = (f r',f g',f b',f a')+ f :: FloatType -> GL.GLclampf+ f = realToFrac+ GL.colorMask $= GL.Color4 GL.Enabled GL.Enabled GL.Enabled GL.Enabled+ GL.clearColor $= GL.Color4 r g b a++ when (fbtDepth buffers) $ do+ let f :: FloatType -> GL.GLclampd+ f = realToFrac+ GL.depthMask $= GL.Enabled+ GL.clearDepth $= f depth+ + when (fbtStencil buffers) $ do+ let f :: Word16 -> GL.GLint+ f = fromIntegral+ GL.stencilMask $= (maxBound::GL.GLuint)+ GL.clearStencil $= f stencil+ + view <- GL.get GL.viewport+ GL.scissor $= Just view++ -- HINT: workaround for a mesa gma bug+ when (fbtColour buffers) $ GL.clear [GL.ColorBuffer]+ when (fbtDepth buffers) $ GL.clear [GL.DepthBuffer]+ when (fbtStencil buffers) $ GL.clear [GL.StencilBuffer]+ --GL.clear $ map fst $ filter (\(_,b) -> b) $ zip [GL.ColorBuffer, GL.DepthBuffer, GL.StencilBuffer] [fbtColour buffers, fbtDepth buffers, fbtStencil buffers]+ + GL.scissor $= tmpScissor++ GL.depthMask $= tmpDepthMask+ GL.colorMask $= tmpColorMask+ GL.stencilMask $= tmpStencilMask+ ++--glBindGeometry :: (HardwareVertexBuffer vb, HardwareIndexBuffer ib) => RenderOperation vb ib -> IO ()+--glBindGeometry :: RenderOperation GLVertexBuffer GLIndexBuffer -> IO ()+glBindGeometry ro tl = do+ let multitexturing = True -- 1 < (rscNumTextureUnits rcap)+ vertexData = roVertexData ro+ decl = vdVertexDeclaration vertexData+ checkBinding e = case vdVertexBufferBinding vertexData of+ VertexBufferBinding bm -> veSource e `IntMap.member` bm+ -- bind vertex elements+ mapM_ (bindElement ro tl) $ filter checkBinding $ vdElementList decl++ when multitexturing $ GL.clientActiveTexture $= GL.TextureUnit 0+ -- bind index data and call draw operation+ case roIndexData ro of + { Just indexData -> do+ let indexBuffer = idIndexBuffer indexData+ GL.bindBuffer GL.ElementArrayBuffer $= glibBufferObject indexBuffer+ ; Nothing -> return ()+ }++--glUnBindGeometry :: RenderOperation GLVertexBuffer GLIndexBuffer -> IO ()+glUnBindGeometry rsc ro = do+ let multitexturing = True -- 1 < (rscNumTextureUnits rcap)+ f :: Int -> GL.GLuint+ f = fromIntegral+ + GL.clientState GL.VertexArray $= GL.Disabled++ -- only valid up to GL_MAX_TEXTURE_UNITS, which is recorded in mFixedFunctionTextureUnits+ case multitexturing of+ { True -> do+ forM_ [0..(rscNumTextureUnits rsc - 1)] $ \stage -> do+ GL.clientActiveTexture $= (GL.TextureUnit $ f stage)+ GL.clientState GL.TextureCoordArray $= GL.Disabled+ GL.clientActiveTexture $= GL.TextureUnit 0+ ; False -> GL.clientState GL.TextureCoordArray $= GL.Disabled+ }+ GL.clientState GL.NormalArray $= GL.Disabled+ GL.clientState GL.ColorArray $= GL.Disabled+ GL.clientState GL.SecondaryColorArray $= GL.Disabled++ -- unbind any custom attributes+ {-+ for (vector<GLuint>::type::iterator ai = attribsBound.begin(); ai != attribsBound.end(); ++ai)+ {+ glDisableVertexAttribArrayARB(*ai); + }+ -}+ + -- unbind buffers+ GL.bindBuffer GL.ElementArrayBuffer $= Nothing+ GL.bindBuffer GL.ArrayBuffer $= Nothing++-- _render :: RenderSystemCapabilities -> RenderOperation -> IO ()+--glRender :: Int -> GLRenderState -> RenderOperation -> IO GLRenderState+--glRender :: (HardwareVertexBuffer vb, HardwareIndexBuffer ib) => Int -> RenderOperation vb ib -> IO ()+glRender :: RenderOperation GLVertexBuffer GLIndexBuffer -> IO ()+glRender ro = do+ -- TODO:+ -- calculate statistics+ {-+ -- Update stats+ size_t val;++ if (op.useIndexes)+ val = op.indexData->indexCount;+ else+ val = op.vertexData->vertexCount;++ -- account for a pass having multiple iterations+ if (mCurrentPassIterationCount > 1)+ val *= mCurrentPassIterationCount;+ mCurrentPassIterationNum = 0;++ switch(op.operationType)+ {+ case RenderOperation::OT_TRIANGLE_LIST:+ mFaceCount += val / 3;+ break;+ case RenderOperation::OT_TRIANGLE_STRIP:+ case RenderOperation::OT_TRIANGLE_FAN:+ mFaceCount += val - 2;+ break;+ case RenderOperation::OT_POINT_LIST:+ case RenderOperation::OT_LINE_LIST:+ case RenderOperation::OT_LINE_STRIP:+ break;+ }++ mVertexCount += op.vertexData->vertexCount;+ mBatchCount += mCurrentPassIterationCount;++ -- sort out clip planes+ -- have to do it here in case of matrix issues+ if (mClipPlanesDirty)+ {+ setClipPlanesImpl(mClipPlanes);+ mClipPlanesDirty = false;+ }+ -}+ -- TODO+ let vertexData = roVertexData ro+ multitexturing = True -- 1 < (rscNumTextureUnits rcap)+ --Use adjacency if there is a geometry program and it requested adjacency info+ -- TODO+ --bool useAdjacency = (mGeometryProgramBound && mCurrentGeometryProgram->isAdjacencyInfoRequired());+ primType = case roOperationType ro of -- Find the correct type to render+ { OT_POINT_LIST -> GL.Points+ ; OT_LINE_LIST -> GL.Lines+ ; OT_LINE_STRIP -> GL.LineStrip+ ; OT_TRIANGLE_LIST -> GL.Triangles+ ; OT_TRIANGLE_STRIP -> GL.TriangleStrip+ ; OT_TRIANGLE_FAN -> GL.TriangleFan+ }+ {-+ GLint primType;+ switch (op.operationType)+ {+ case RenderOperation::OT_POINT_LIST:+ primType = GL_POINTS;+ break;+ case RenderOperation::OT_LINE_LIST:+ primType = useAdjacency ? GL_LINES_ADJACENCY_EXT : GL_LINES;+ break;+ case RenderOperation::OT_LINE_STRIP:+ primType = useAdjacency ? GL_LINE_STRIP_ADJACENCY_EXT : GL_LINE_STRIP;+ break;+ default:+ case RenderOperation::OT_TRIANGLE_LIST:+ primType = useAdjacency ? GL_TRIANGLES_ADJACENCY_EXT : GL_TRIANGLES;+ break;+ case RenderOperation::OT_TRIANGLE_STRIP:+ primType = useAdjacency ? GL_TRIANGLE_STRIP_ADJACENCY_EXT : GL_TRIANGLE_STRIP;+ break;+ case RenderOperation::OT_TRIANGLE_FAN:+ primType = GL_TRIANGLE_FAN;+ break;+ }+ -}+ + -- bind index data and call draw operation+ case roIndexData ro of + { Just indexData -> do+ let indexBuffer = idIndexBuffer indexData+ dp = if isJust $ glibBufferObject indexBuffer then nullPtr else fromMaybe (error "fromJust 7") $ glibShadowBuffer indexBuffer+ pBufferData = plusPtr dp $ idIndexStart indexData * getIndexSize indexBuffer+ indexType = if getIndexType indexBuffer == IT_16BIT then GL.UnsignedShort else GL.UnsignedInt+ GL.drawElements primType (fromIntegral (idIndexCount indexData)) indexType pBufferData+ ; Nothing -> do+ GL.drawArrays primType 0 (fromIntegral (vdVertexCount vertexData))+ }+ +-- GL.color $ GL.Color4 1 1 1 (1 :: GL.GLfloat)+-- GL.secondaryColor $ GL.Color3 0 0 (0 :: GL.GLfloat)+ return ()+{-+ bool RenderSystem::updatePassIterationRenderState(void)+ {+ if (mCurrentPassIterationCount <= 1)+ return false;++ --mCurrentPassIterationCount;+ ++mCurrentPassIterationNum;+ if (!mActiveVertexGpuProgramParameters.isNull())+ {+ mActiveVertexGpuProgramParameters->incPassIterationNumber();+ bindGpuProgramPassIterationParameters(GPT_VERTEX_PROGRAM);+ }+ if (!mActiveGeometryGpuProgramParameters.isNull())+ {+ mActiveGeometryGpuProgramParameters->incPassIterationNumber();+ bindGpuProgramPassIterationParameters(GPT_GEOMETRY_PROGRAM);+ }+ if (!mActiveFragmentGpuProgramParameters.isNull())+ {+ mActiveFragmentGpuProgramParameters->incPassIterationNumber();+ bindGpuProgramPassIterationParameters(GPT_FRAGMENT_PROGRAM);+ }+ return true;+ }++-}++bindElement rop tl elem = do+ let vertexData = roVertexData $ rop++ case vdVertexBufferBinding vertexData of+ VertexBufferBinding bm -> let vertexBuffer = bm ! (veSource elem) in do+ dp <- case glvbBufferObject vertexBuffer of+ { Just b -> do+ GL.bindBuffer GL.ArrayBuffer $= Just b+ return nullPtr + ; Nothing -> return $ fromMaybe (error "fromJust 8") $ glvbShadowBuffer vertexBuffer+ }+ let pBufferData = plusPtr dp $ vdVertexStart vertexData * getVertexSize vertexBuffer + veOffset elem+ sem = veSemantic elem+ isCustomAttrib = False+ bindArray t = do+ GL.arrayPointer t $= GL.VertexArrayDescriptor (fromIntegral . getTypeCount . veType $ elem) (getGLType . veType $ elem) (fromIntegral . getVertexSize $ vertexBuffer) pBufferData+ GL.clientState t $= GL.Enabled+ {-+ if (mCurrentVertexProgram)+ isCustomAttrib = mCurrentVertexProgram->isAttributeValid(sem, elem->getIndex());+ -}+ --bind vertexBuffer+ case isCustomAttrib of+ { True -> do+ -- Custom attribute support+ -- tangents, binormals, blendweights etc always via this route+ -- builtins may be done this way too+ let attrib = GL.AttribLocation . fromIntegral . getFixedAttributeIndex sem $ veIndex elem+ GL.vertexAttribPointer attrib $= (GL.KeepIntegral,GL.VertexArrayDescriptor (fromIntegral . getTypeCount . veType $ elem) (getGLType . veType $ elem) (fromIntegral . getVertexSize $ vertexBuffer) pBufferData)+ GL.vertexAttribArray attrib $= GL.Enabled+ --attribsBound.push_back(attrib);+ ; False -> case sem of -- fixed-function & builtin attribute support+ { VES_POSITION -> bindArray GL.VertexArray+ ; VES_NORMAL -> bindArray GL.NormalArray+ ; VES_DIFFUSE -> bindArray GL.ColorArray+ ; VES_SPECULAR -> bindArray GL.SecondaryColorArray+ ; VES_TEXTURE_COORDINATES -> do+ -- TODO+ let idx = veIndex elem+ tus = map fst $ filter (\(_,a)-> idx==a) $ zip [0..] $ map tusTextureCoordSetIndex tl+ f :: Int -> GL.GLuint+ f = fromIntegral+ forM_ tus $ \tidx -> do+ --print $ "bind stage="++show tidx ++ " texcoord="++show idx+ GL.clientActiveTexture $= (GL.TextureUnit $ f tidx)+ bindArray GL.TextureCoordArray+ -- TEMP CODE+{- + if (mCurrentVertexProgram)+ {+ -- Programmable pipeline - direct UV assignment+ glClientActiveTextureARB(GL_TEXTURE0 + elem->getIndex());+ glTexCoordPointer(+ VertexElement::getTypeCount(elem->getType()), + GLBufferManager::getGLType(elem->getType()),+ static_cast<GLsizei>(vertexBuffer->getVertexSize()), + pBufferData);+ glEnableClientState( GL_TEXTURE_COORD_ARRAY );+ }+ else+ {+ -- fixed function matching to units based on tex_coord_set+ for (i = 0; i < mDisabledTexUnitsFrom; i++)+ {+ -- Only set this texture unit's texcoord pointer if it+ -- is supposed to be using this element's index+ if (mTextureCoordIndex[i] == elem->getIndex() && i < mFixedFunctionTextureUnits)+ {+ if (multitexturing)+ glClientActiveTextureARB(GL_TEXTURE0 + i);+ glTexCoordPointer(+ VertexElement::getTypeCount(elem->getType()), + GLBufferManager::getGLType(elem->getType()),+ static_cast<GLsizei>(vertexBuffer->getVertexSize()), + pBufferData);+ glEnableClientState( GL_TEXTURE_COORD_ARRAY );+ }+ }+ }+-} + }+ }+++glSetShadingType so = case so of+ { SO_FLAT -> GL.shadeModel $= GL.Flat+ ; _ -> GL.shadeModel $= GL.Smooth+ }++glSetAlphaRejectSettings rsc func value alphaToCoverage = do+ let caps = rscCapabilities rsc+ f :: Int -> GL.GLclampf+ f = fromIntegral+ case func == CMPF_ALWAYS_PASS of+ { True -> do+ GL.alphaFunc $= Nothing+ GL.sampleAlphaToCoverage $= GL.Disabled+ ; False -> do+ GL.alphaFunc $= Just (convertCompareFunction func, f value / 255)+ let f x = case x of+ { True -> GL.Enabled+ ; False -> GL.Disabled+ } + when (Set.member RSC_ALPHA_TO_COVERAGE caps) $ + GL.sampleAlphaToCoverage $= f alphaToCoverage+ }++glSetDepthBufferWriteEnabled enabled = case enabled of+ { True -> GL.depthMask $= GL.Enabled+ ; False -> GL.depthMask $= GL.Disabled+ }++glSetDepthBufferFunction enabled func = do+ GL.depthFunc $= if enabled then Just $ convertCompareFunction func else Nothing+--FIXME: gl haskell binding has unified api for depthFunc +--glSetDepthBufferCheckEnabled enabled = case enabled of ++glSetPointSpritesEnabled rsc enabled = do+ case enabled of+ { True -> GL.pointSprite $= GL.Enabled+ ; False -> GL.pointSprite $= GL.Disabled+ }+ --FIXME: Haskell GL bininding does not support these+ {-+ let maxTex = rscNumTextureUnits rsc+ a <- GL.get GL.activeTexture+ -- Set sprite texture coord generation+ -- Don't offer this as an option since D3D links it to sprite enabled+ for (ushort i = 0; i < mFixedFunctionTextureUnits; ++i)+ {+ activateGLTextureUnit(i);+ glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, + enabled ? GL_TRUE : GL_FALSE);+ }+ GL.activeTexture $= a+ -}++glSetSceneBlending sourceFactor destFactor op = do+ case sourceFactor == SBF_ONE && destFactor == SBF_ZERO of+ { True -> GL.blend $= GL.Disabled+ ; False -> do+ GL.blend $= GL.Enabled+ GL.blendFunc $= (getBlendMode sourceFactor, getBlendMode destFactor)+ }+ GL.blendEquation $= getBlendEquation op+ -- FIXME+ {-+ if(GLEW_VERSION_1_4 || GLEW_ARB_imaging)+ {+ glBlendEquation(func);+ }+ else if(GLEW_EXT_blend_minmax && (func == GL_MIN || func == GL_MAX))+ {+ glBlendEquationEXT(func);+ }+ -}++glSetSurfaceParams ambient diffuse specular emissive shininess (TrackVertexColourType a d s e) = do+ -- Track vertex colour+ -- There are actually 15 different combinations for tracking, of which+ -- GL only supports the most used 5. This means that we have to do some+ -- magic to find the best match. NOTE: + -- GL_AMBIENT_AND_DIFFUSE != GL_AMBIENT | GL__DIFFUSE+ case (a,d,s,e) of+ { (False,False,False,False) -> GL.colorMaterial $= Nothing+ ; (True,True,_,_) -> GL.colorMaterial $= Just (GL.FrontAndBack,GL.AmbientAndDiffuse)+ ; (True,False,_,_) -> GL.colorMaterial $= Just (GL.FrontAndBack,GL.Ambient)+ ; (_,True,_,_) -> GL.colorMaterial $= Just (GL.FrontAndBack,GL.Diffuse)+ ; (_,_,True,_) -> GL.colorMaterial $= Just (GL.FrontAndBack,GL.Specular)+ ; (_,_,_,True) -> GL.colorMaterial $= Just (GL.FrontAndBack,GL.Emission)+ } + let f = realToFrac+ c (r,g,b,a) = GL.Color4 (f r) (f g) (f b) (f a)+ GL.materialDiffuse GL.FrontAndBack $= c diffuse+ GL.materialAmbient GL.FrontAndBack $= c ambient+ GL.materialSpecular GL.FrontAndBack $= c specular+ GL.materialEmission GL.FrontAndBack $= c emissive+ GL.materialShininess GL.FrontAndBack $= f shininess++glSetLightingEnabled enabled = case enabled of+ { True -> GL.lighting $= GL.Enabled+ ; False -> GL.lighting $= GL.Disabled+ }++glSetFog mode colour density start end = do+ let c (r,g,b,a) = GL.Color4 (realToFrac r) (realToFrac g) (realToFrac b) (realToFrac a)+ case mode of+ { FOG_NONE -> do+ GL.fog $= GL.Disabled+ ; FOG_EXP -> do+ GL.fog $= GL.Enabled+ GL.fogMode $= (GL.Exp $ realToFrac density)+ GL.fogColor $= c colour+ ; FOG_EXP2 -> do+ GL.fog $= GL.Enabled+ GL.fogMode $= (GL.Exp2 $ realToFrac density)+ GL.fogColor $= c colour+ ; FOG_LINEAR-> do+ GL.fog $= GL.Enabled+ GL.fogMode $= (GL.Linear (realToFrac start) (realToFrac end))+ GL.fogColor $= c colour+ }++glSetSeparateSceneBlending sourceFactor destFactor sourceFactorAlpha destFactorAlpha op alphaOp = do+ case sourceFactor == SBF_ONE && destFactor == SBF_ZERO && + sourceFactorAlpha == SBF_ONE && destFactorAlpha == SBF_ZERO of+ { True -> GL.blend $= GL.Disabled+ ; False -> do+ let f = getBlendMode+ GL.blend $= GL.Enabled+ GL.blendFuncSeparate $= ((f sourceFactor, f sourceFactorAlpha), (f destFactor, f destFactorAlpha))+ }+ GL.blendEquationSeparate $= (getBlendEquation op, getBlendEquation alphaOp)+--FIXME: gl binding does not access these+{-+ if(GLEW_VERSION_2_0) {+ glBlendEquationSeparate(func, alphaFunc);+ }+ else if(GLEW_EXT_blend_equation_separate) {+ glBlendEquationSeparateEXT(func, alphaFunc);+ }+-}++glSetPointParameters rs size attenuationEnabled constant linear quadratic minSize maxSize = do+ let rsc = getCapabilities rs+ caps = rscCapabilities rsc+ (size',minSize',maxSize',constant',linear',quadratic') <- case attenuationEnabled of+ { True -> do+ -- Point size is still calculated in pixels even when attenuation is+ -- enabled, which is pretty awkward, since you typically want a viewport+ -- independent size if you're looking for attenuation.+ -- So, scale the point size up by viewport size (this is equivalent to+ -- what D3D does as standard)++ -- TODO+ {-+ size = size * mActiveViewport->getActualHeight();+ minSize = minSize * mActiveViewport->getActualHeight();+ if (maxSize == 0.0f)+ maxSize = mCurrentCapabilities->getMaxPointSize(); // pixels+ else+ maxSize = maxSize * mActiveViewport->getActualHeight();+ -}+ when (Set.member RSC_VERTEX_PROGRAM caps) $ GL.vertexProgramPointSize $= GL.Enabled+ -- XXX: why do I need this for results to be consistent with D3D?+ -- Equations are supposedly the same once you factor in vp height+ let correction = 0.005+ return (size,minSize,if maxSize == 0 then rscMaxPointSize rsc else maxSize,constant,linear * correction,quadratic * correction)+ ; False -> do+ when (Set.member RSC_VERTEX_PROGRAM caps) $ GL.vertexProgramPointSize $= GL.Disabled+ return (size,minSize,if maxSize == 0 then rscMaxPointSize rsc else maxSize,constant,linear,quadratic)+ }+ --no scaling required+ -- GL has no disabled flag for this so just set to constant+ let f = realToFrac+ GL.pointSize $= f size'+ GL.pointDistanceAttenuation $= (f constant',f linear',f quadratic')+ GL.pointSizeRange $= (f minSize',f maxSize')+ -- FIXME: gl binding handles this+ {-+ if (mCurrentCapabilities->hasCapability(RSC_POINT_EXTENDED_PARAMETERS))+ {+ glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, val);+ glPointParameterf(GL_POINT_SIZE_MIN, minSize);+ glPointParameterf(GL_POINT_SIZE_MAX, maxSize);+ } + else if (mCurrentCapabilities->hasCapability(RSC_POINT_EXTENDED_PARAMETERS_ARB))+ {+ glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION, val);+ glPointParameterfARB(GL_POINT_SIZE_MIN, minSize);+ glPointParameterfARB(GL_POINT_SIZE_MAX, maxSize);+ } + else if (mCurrentCapabilities->hasCapability(RSC_POINT_EXTENDED_PARAMETERS_EXT))+ {+ glPointParameterfvEXT(GL_POINT_DISTANCE_ATTENUATION, val);+ glPointParameterfEXT(GL_POINT_SIZE_MIN, minSize);+ glPointParameterfEXT(GL_POINT_SIZE_MAX, maxSize);+ }+ -}+ return ()++glSetActiveTextureUnit stage = do+ let f :: Int -> GL.GLuint+ f = fromIntegral+ GL.activeTexture $= GL.TextureUnit (f stage)+{-+ if (GLEW_VERSION_1_2 && unit < getCapabilities()->getNumTextureUnits())+ {+ glActiveTextureARB(GL_TEXTURE0 + unit);+ mActiveTextureUnit = unit;+ return true;+ }+ else if (!unit)+ {+ // always ok to use the first unit+ return true;+ }+ else+ {+ return false;+ }+-} ++glSetTexture tex = case tex of+ { Just t -> do+ --TEMP CODE+ GL.texture GL.Texture1D $= GL.Disabled+ GL.textureBinding GL.Texture1D $= Nothing++ GL.texture GL.Texture2D $= GL.Disabled+ GL.textureBinding GL.Texture2D $= Nothing++ GL.texture GL.Texture3D $= GL.Disabled+ GL.textureBinding GL.Texture3D $= Nothing++ GL.texture GL.TextureCubeMap $= GL.Disabled+ GL.textureBinding GL.TextureCubeMap $= Nothing++ let target = getGLTextureTarget $ txTextureType t+ GL.texture target $= GL.Enabled+ GL.textureBinding target $= (Just $ gltxTextureObject t)+ ; Nothing -> do+ --TODO+ GL.texture GL.Texture1D $= GL.Disabled+ GL.textureBinding GL.Texture1D $= Nothing++ GL.texture GL.Texture2D $= GL.Disabled+ GL.textureBinding GL.Texture2D $= Nothing++ GL.texture GL.Texture3D $= GL.Disabled+ GL.textureBinding GL.Texture3D $= Nothing++ GL.texture GL.TextureCubeMap $= GL.Disabled+ GL.textureBinding GL.TextureCubeMap $= Nothing+ }+ +{-+ void GLRenderSystem::_setTexture(size_t stage, bool enabled, const TexturePtr &texPtr)+ {+ GLTexturePtr tex = texPtr;++ GLenum lastTextureType = mTextureTypes[stage];++ if (!activateGLTextureUnit(stage))+ return;++ if (enabled)+ {+ if (!tex.isNull())+ {+ // note used+ tex->touch();+ mTextureTypes[stage] = tex->getGLTextureTarget();+ }+ else+ // assume 2D+ mTextureTypes[stage] = GL_TEXTURE_2D;++ if(lastTextureType != mTextureTypes[stage] && lastTextureType != 0)+ {+ if (stage < mFixedFunctionTextureUnits)+ {+ glDisable( lastTextureType );+ }+ }++ if (stage < mFixedFunctionTextureUnits)+ {+ glEnable( mTextureTypes[stage] );+ }++ if(!tex.isNull())+ glBindTexture( mTextureTypes[stage], tex->getGLID() );+ else+ glBindTexture( mTextureTypes[stage], static_cast<GLTextureManager*>(mTextureManager)->getWarningTextureID() );+ }+ else+ {+ if (stage < mFixedFunctionTextureUnits)+ {+ if (lastTextureType != 0)+ {+ glDisable( mTextureTypes[stage] );+ }+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);+ }+ // bind zero texture+ glBindTexture(GL_TEXTURE_2D, 0); + }++ activateGLTextureUnit(0);+ }++ void GLRenderSystem::_setTextureCoordSet(size_t stage, size_t index)+ {+ mTextureCoordIndex[stage] = index;+ }+-}+{-+ void GLRenderSystem::_useLights(const LightList& lights, unsigned short limit)+ {+ // Save previous modelview+ glMatrixMode(GL_MODELVIEW);+ glPushMatrix();+ // just load view matrix (identity world)+ GLfloat mat[16];+ makeGLMatrix(mat, mViewMatrix);+ glLoadMatrixf(mat);++ LightList::const_iterator i, iend;+ iend = lights.end();+ unsigned short num = 0;+ for (i = lights.begin(); i != iend && num < limit; ++i, ++num)+ {+ setGLLight(num, *i);+ mLights[num] = *i;+ }+ // Disable extra lights+ for (; num < mCurrentLights; ++num)+ {+ setGLLight(num, NULL);+ mLights[num] = NULL;+ }+ mCurrentLights = std::min(limit, static_cast<unsigned short>(lights.size()));++ setLights();++ // restore previous+ glPopMatrix();++ }++ void GLRenderSystem::setGLLight(size_t index, Light* lt)+ {+ GLenum gl_index = GL_LIGHT0 + index;++ if (!lt)+ {+ // Disable in the scene+ glDisable(gl_index);+ }+ else+ {+ switch (lt->getType())+ {+ case Light::LT_SPOTLIGHT:+ glLightf( gl_index, GL_SPOT_CUTOFF, 0.5f * lt->getSpotlightOuterAngle().valueDegrees() );+ glLightf(gl_index, GL_SPOT_EXPONENT, lt->getSpotlightFalloff());+ break;+ default:+ glLightf( gl_index, GL_SPOT_CUTOFF, 180.0 );+ break;+ }++ // Color+ ColourValue col;+ col = lt->getDiffuseColour();+++ GLfloat f4vals[4] = {col.r, col.g, col.b, col.a};+ glLightfv(gl_index, GL_DIFFUSE, f4vals);++ col = lt->getSpecularColour();+ f4vals[0] = col.r;+ f4vals[1] = col.g;+ f4vals[2] = col.b;+ f4vals[3] = col.a;+ glLightfv(gl_index, GL_SPECULAR, f4vals);+++ // Disable ambient light for movables;+ f4vals[0] = 0;+ f4vals[1] = 0;+ f4vals[2] = 0;+ f4vals[3] = 1;+ glLightfv(gl_index, GL_AMBIENT, f4vals);++ setGLLightPositionDirection(lt, gl_index);+++ // Attenuation+ glLightf(gl_index, GL_CONSTANT_ATTENUATION, lt->getAttenuationConstant());+ glLightf(gl_index, GL_LINEAR_ATTENUATION, lt->getAttenuationLinear());+ glLightf(gl_index, GL_QUADRATIC_ATTENUATION, lt->getAttenuationQuadric());+ // Enable in the scene+ glEnable(gl_index);++ }++ }++ void GLRenderSystem::setLights()+ {+ for (size_t i = 0; i < MAX_LIGHTS; ++i)+ {+ if (mLights[i] != NULL)+ {+ Light* lt = mLights[i];+ setGLLightPositionDirection(lt, GL_LIGHT0 + i);+ }+ }+ }++ void GLRenderSystem::setGLLightPositionDirection(Light* lt, GLenum lightindex)+ {+ // Set position / direction+ Vector4 vec;+ // Use general 4D vector which is the same as GL's approach+ vec = lt->getAs4DVector(true);++#if OGRE_DOUBLE_PRECISION+ // Must convert to float*+ float tmp[4] = {vec.x, vec.y, vec.z, vec.w};+ glLightfv(lightindex, GL_POSITION, tmp);+#else+ glLightfv(lightindex, GL_POSITION, vec.ptr());+#endif+ // Set spotlight direction+ if (lt->getType() == Light::LT_SPOTLIGHT)+ {+ vec = lt->getDerivedDirection();+ vec.w = 0.0; +#if OGRE_DOUBLE_PRECISION+ // Must convert to float*+ float tmp2[4] = {vec.x, vec.y, vec.z, vec.w};+ glLightfv(lightindex, GL_SPOT_DIRECTION, tmp2);+#else+ glLightfv(lightindex, GL_SPOT_DIRECTION, vec.ptr());+#endif+ }+ }+-}++glSetTextureAddressingMode texTarget (UVWAddressingMode u v w) = do+ let target = getGLTextureTarget texTarget+ GL.textureWrapMode target GL.S $= getTextureAddressingMode u+ GL.textureWrapMode target GL.T $= getTextureAddressingMode v+ GL.textureWrapMode target GL.R $= getTextureAddressingMode w++glSetTextureBorderColour texTarget (r,g,b,a) = do+ let target = getGLTextureTarget texTarget+ f = realToFrac+ GL.textureBorderColor target $= GL.Color4 (f r) (f g) (f b) (f a)++glSetTextureUnitFiltering texTarget minFilter magFilter mipFilter = do+ let target = getGLTextureTarget texTarget+ mag = case magFilter of+ { FO_ANISOTROPIC -> GL.Linear'+ ; FO_LINEAR -> GL.Linear'+ ; FO_POINT -> GL.Nearest+ ; FO_NONE -> GL.Nearest+ }+ min = case minFilter of+ { FO_ANISOTROPIC -> GL.Linear'+ ; FO_LINEAR -> GL.Linear'+ ; FO_POINT -> GL.Nearest+ ; FO_NONE -> GL.Nearest+ }+ mip = case mipFilter of+ { FO_ANISOTROPIC -> Just GL.Linear'+ ; FO_LINEAR -> Just GL.Linear'+ ; FO_POINT -> Just GL.Nearest+ ; FO_NONE -> Nothing+ }+ GL.textureFilter target $= ((min,mip),mag)++glSetTextureLayerAnisotropy texTarget maxAnisotropy = do+ let target = getGLTextureTarget texTarget+ maxSupportedAnisotropy <- GL.get GL.maxTextureMaxAnisotropy+ GL.textureMaxAnisotropy target $= (min (realToFrac maxAnisotropy) (realToFrac maxSupportedAnisotropy))++glSetTextureMipmapBias bias = do+ GL.textureUnitLODBias $= realToFrac bias++{-+ = LayerBlendModeEx+ { lbBlendType :: LayerBlendType -- ^ The type of blending (colour or alpha)+ , lbOperation :: LayerBlendOperationEx -- ^ The operation to be applied+ , lbSource1 :: LayerBlendSource -- ^ The first source of colour/alpha+ , lbSource2 :: LayerBlendSource -- ^ The second source of colour/alpha+ , lbColourArg1 :: ColourValue -- ^ Manual colour value for manual source1+ , lbColourArg2 :: ColourValue -- ^ Manual colour value for manual source2+ , lbAlphaArg1 :: FloatType -- ^ Manual alpha value for manual source1+ , lbAlphaArg2 :: FloatType -- ^ Manual alpha value for manual source2+ , lbFactor :: FloatType -- ^ Manual blending factor+ }++doc: http://www.informit.com/articles/article.aspx?p=770639&seqNum=6+FIXME: Test this code+-}+glSetTextureBlendMode rsc colorbm alphabm = do+ let caps = rscCapabilities rsc+ hasDot3 = Set.member RSC_DOT3 caps+ csrc1op = getLayerBlendSource $ lbSource1 colorbm+ csrc2op = getLayerBlendSource $ lbSource2 colorbm+ ccmd = getTextureCombineFunction hasDot3 $ lbOperation colorbm+ asrc1op = getLayerBlendSource $ lbSource1 alphabm+ asrc2op = getLayerBlendSource $ lbSource2 alphabm+ acmd = getTextureCombineFunction hasDot3 $ lbOperation alphabm+ f = realToFrac++ GL.textureFunction $= GL.Combine+ GL.combineRGB $= ccmd+ GL.argRGB GL.Arg0 $= GL.Arg GL.SrcColor csrc1op+ GL.argRGB GL.Arg1 $= GL.Arg GL.SrcColor csrc2op+ GL.argRGB GL.Arg2 $= GL.Arg GL.SrcColor GL.Constant+ GL.combineAlpha $= acmd+ GL.argAlpha GL.Arg0 $= GL.Arg GL.SrcAlpha asrc1op+ GL.argAlpha GL.Arg1 $= GL.Arg GL.SrcAlpha asrc2op+ GL.argAlpha GL.Arg2 $= GL.Arg GL.SrcAlpha GL.Constant++ let argf bm cv1 cv2 = do+ case lbOperation bm of+ { LBX_BLEND_DIFFUSE_COLOUR -> do+ GL.argRGB GL.Arg2 $= GL.Arg GL.SrcColor GL.PrimaryColor+ GL.argAlpha GL.Arg2 $= GL.Arg GL.SrcAlpha GL.PrimaryColor+ ; LBX_BLEND_DIFFUSE_ALPHA -> do+ GL.argRGB GL.Arg2 $= GL.Arg GL.SrcAlpha GL.PrimaryColor+ GL.argAlpha GL.Arg2 $= GL.Arg GL.SrcAlpha GL.PrimaryColor+ ; LBX_BLEND_TEXTURE_ALPHA -> do+ GL.argRGB GL.Arg2 $= GL.Arg GL.SrcAlpha GL.CurrentUnit+ GL.argAlpha GL.Arg2 $= GL.Arg GL.SrcAlpha GL.CurrentUnit+ ; LBX_BLEND_CURRENT_ALPHA -> do+ GL.argRGB GL.Arg2 $= GL.Arg GL.SrcAlpha GL.Previous+ GL.argAlpha GL.Arg2 $= GL.Arg GL.SrcAlpha GL.Previous+ ; LBX_BLEND_MANUAL -> do+ GL.constantColor $= GL.Color4 0 0 0 (f $ lbFactor bm)+ ; _ -> return ()+ }++ when (LBS_MANUAL == lbSource1 bm) $ + GL.constantColor $= cv1+ + when (LBS_MANUAL == lbSource2 bm) $+ GL.constantColor $= cv2++ (cr1,cg1,cb1,ca1) = lbColourArg1 colorbm+ (cr2,cg2,cb2,ca2) = lbColourArg2 colorbm+ cf r g b a = GL.Color4 (f r) (f g) (f b) (f a)+ aa1 = lbAlphaArg1 alphabm+ aa2 = lbAlphaArg2 alphabm+ argf colorbm (cf cr1 cg1 cb1 ca1) (cf cr2 cg2 cb2 ca2)+ argf alphabm (cf cr1 cg1 cb1 aa1) (cf cr2 cg2 cb2 aa2)++ case lbOperation colorbm of+ { LBX_MODULATE_X2 -> GL.rgbScale $= 2+ ; LBX_MODULATE_X4 -> GL.rgbScale $= 4+ ; _ -> GL.rgbScale $= 1+ }++ case lbOperation alphabm of+ { LBX_MODULATE_X2 -> GL.alphaScale $= 2+ ; LBX_MODULATE_X4 -> GL.alphaScale $= 4+ ; _ -> GL.alphaScale $= 1+ }++glSetCullingMode mode = case mode of+ { CULL_NONE -> GL.cullFace $= Nothing+ ; CULL_CLOCKWISE -> GL.cullFace $= (Just GL.Back)+ ; CULL_ANTICLOCKWISE -> GL.cullFace $= (Just GL.Front)+ }++glSetColourBufferWriteEnabled r g b a = do+ let f x = case x of+ { True -> GL.Enabled+ ; False -> GL.Disabled+ } + GL.colorMask $= GL.Color4 (f r) (f g) (f b) (f a)++glBindLinkedGpuProgram lp = do+ GL.currentProgram $= Just (gllgpProgramObject lp)+ --TEMP CODE+ let p = gllgpProgramObject lp+ loc_tex0 <- GL.get (GL.uniformLocation p "tex0") + loc_tex1 <- GL.get (GL.uniformLocation p "tex1")+ (GL.uniform loc_tex0) GL.$=! (GL.Index1 (0::GL.GLint))+ (GL.uniform loc_tex1) GL.$=! (GL.Index1 (1::GL.GLint))++glUnBindLinkedGpuProgram = do+ GL.currentProgram $= Nothing++{-+ void GLRenderSystem::unbindGpuProgram(GpuProgramType gptype)+ {++ if (gptype == GPT_VERTEX_PROGRAM && mCurrentVertexProgram)+ {+ mActiveVertexGpuProgramParameters.setNull();+ mCurrentVertexProgram->unbindProgram();+ mCurrentVertexProgram = 0;+ }+ else if (gptype == GPT_GEOMETRY_PROGRAM && mCurrentGeometryProgram)+ {+ mActiveGeometryGpuProgramParameters.setNull();+ mCurrentGeometryProgram->unbindProgram();+ mCurrentGeometryProgram = 0;+ }+ else if (gptype == GPT_FRAGMENT_PROGRAM && mCurrentFragmentProgram)+ {+ mActiveFragmentGpuProgramParameters.setNull();+ mCurrentFragmentProgram->unbindProgram();+ mCurrentFragmentProgram = 0;+ }+ RenderSystem::unbindGpuProgram(gptype);++ }++ void RenderSystem::unbindGpuProgram(GpuProgramType gptype)+ {+ switch(gptype)+ {+ case GPT_VERTEX_PROGRAM:+ // mark clip planes dirty if changed (programmable can change space)+ if (mVertexProgramBound && !mClipPlanes.empty())+ mClipPlanesDirty = true;+ mVertexProgramBound = false;+ break;+ case GPT_GEOMETRY_PROGRAM:+ mGeometryProgramBound = false;+ break;+ case GPT_FRAGMENT_PROGRAM:+ mFragmentProgramBound = false;+ break;+ }+ }+-}++--glSetTextureMatrix :: Matrix4 -> IO ()+glSetTextureMatrix xform = do+ mat <- toGLMatrix xform+ GL.matrix (Just GL.Texture) $= mat+ +{-+ void GLRenderSystem::_setTextureMatrix(size_t stage, const Matrix4& xform)+ {+ if (stage >= mFixedFunctionTextureUnits)+ {+ // Can't do this+ return;+ }++ GLfloat mat[16];+ makeGLMatrix(mat, xform);++ if (!activateGLTextureUnit(stage))+ return;+ glMatrixMode(GL_TEXTURE);++ // Load this matrix in+ glLoadMatrixf(mat);++ if (mUseAutoTextureMatrix)+ {+ // Concat auto matrix+ glMultMatrixf(mAutoTextureMatrix);+ }++ glMatrixMode(GL_MODELVIEW);+ activateGLTextureUnit(0);+ }+-}++-- glSetTextureCoordCalculation :: TexCoordCalcMethod -> IO ()+glSetTextureCoordCalculation m = case m of+ { TEXCALC_NONE -> do+ GL.textureGenMode GL.S $= Nothing+ GL.textureGenMode GL.T $= Nothing+ GL.textureGenMode GL.R $= Nothing+ GL.textureGenMode GL.Q $= Nothing+ + ; TEXCALC_ENVIRONMENT_MAP -> do+ GL.textureGenMode GL.S $= Just GL.SphereMap+ GL.textureGenMode GL.T $= Just GL.SphereMap+ GL.textureGenMode GL.R $= Nothing+ GL.textureGenMode GL.Q $= Nothing+ -- TODO+ {-+ // Need to use a texture matrix to flip the spheremap+ mUseAutoTextureMatrix = true;+ memset(mAutoTextureMatrix, 0, sizeof(GLfloat)*16);+ mAutoTextureMatrix[0] = mAutoTextureMatrix[10] = mAutoTextureMatrix[15] = 1.0f;+ mAutoTextureMatrix[5] = -1.0f;+ -}+ + ; TEXCALC_ENVIRONMENT_MAP_PLANAR -> do+ GL.textureGenMode GL.S $= Just GL.SphereMap+ GL.textureGenMode GL.T $= Just GL.SphereMap+ GL.textureGenMode GL.R $= Nothing+ GL.textureGenMode GL.Q $= Nothing+ + ; TEXCALC_ENVIRONMENT_MAP_REFLECTION -> do+ GL.textureGenMode GL.S $= Just GL.ReflectionMap+ GL.textureGenMode GL.T $= Just GL.ReflectionMap+ GL.textureGenMode GL.R $= Just GL.ReflectionMap+ GL.textureGenMode GL.Q $= Nothing+ {-+ // We need an extra texture matrix here+ // This sets the texture matrix to be the inverse of the view matrix+ mUseAutoTextureMatrix = true;+ makeGLMatrix( M, mViewMatrix);++ // Transpose 3x3 in order to invert matrix (rotation)+ // Note that we need to invert the Z _before_ the rotation+ // No idea why we have to invert the Z at all, but reflection is wrong without it+ mAutoTextureMatrix[0] = M[0]; mAutoTextureMatrix[1] = M[4]; mAutoTextureMatrix[2] = -M[8];+ mAutoTextureMatrix[4] = M[1]; mAutoTextureMatrix[5] = M[5]; mAutoTextureMatrix[6] = -M[9];+ mAutoTextureMatrix[8] = M[2]; mAutoTextureMatrix[9] = M[6]; mAutoTextureMatrix[10] = -M[10];+ mAutoTextureMatrix[3] = mAutoTextureMatrix[7] = mAutoTextureMatrix[11] = 0.0f;+ mAutoTextureMatrix[12] = mAutoTextureMatrix[13] = mAutoTextureMatrix[14] = 0.0f;+ mAutoTextureMatrix[15] = 1.0f;+ -}+ + ; TEXCALC_ENVIRONMENT_MAP_NORMAL -> do+ GL.textureGenMode GL.S $= Just GL.NormalMap+ GL.textureGenMode GL.T $= Just GL.NormalMap+ GL.textureGenMode GL.R $= Just GL.NormalMap+ GL.textureGenMode GL.Q $= Nothing++ ; TEXCALC_PROJECTIVE_TEXTURE -> do+ GL.textureGenMode GL.S $= Just (GL.EyeLinear $ GL.Plane 1 0 0 0)+ GL.textureGenMode GL.T $= Just (GL.EyeLinear $ GL.Plane 0 1 0 0)+ GL.textureGenMode GL.R $= Just (GL.EyeLinear $ GL.Plane 0 0 1 0)+ GL.textureGenMode GL.Q $= Just (GL.EyeLinear $ GL.Plane 0 0 0 1)+ {-+ mUseAutoTextureMatrix = true;++ // Set scale and translation matrix for projective textures+ projectionBias = Matrix4::CLIPSPACE2DTOIMAGESPACE;++ projectionBias = projectionBias * frustum->getProjectionMatrix();+ if(mTexProjRelative)+ {+ Matrix4 viewMatrix;+ frustum->calcViewMatrixRelative(mTexProjRelativeOrigin, viewMatrix);+ projectionBias = projectionBias * viewMatrix;+ }+ else+ {+ projectionBias = projectionBias * frustum->getViewMatrix();+ }+ projectionBias = projectionBias * mWorldMatrix;++ makeGLMatrix(mAutoTextureMatrix, projectionBias);+ -}+ }++{-+ void GLRenderSystem::_setTextureCoordCalculation(size_t stage, TexCoordCalcMethod m, + const Frustum* frustum)+ {+ if (stage >= mFixedFunctionTextureUnits)+ {+ // Can't do this+ return;+ }+++ GLfloat M[16];+ Matrix4 projectionBias;++ // Default to no extra auto texture matrix+ mUseAutoTextureMatrix = false;++ GLfloat eyePlaneS[] = {1.0, 0.0, 0.0, 0.0};+ GLfloat eyePlaneT[] = {0.0, 1.0, 0.0, 0.0};+ GLfloat eyePlaneR[] = {0.0, 0.0, 1.0, 0.0};+ GLfloat eyePlaneQ[] = {0.0, 0.0, 0.0, 1.0};++ if (!activateGLTextureUnit(stage))+ return;++ switch( m )+ {+ case TEXCALC_NONE:+ glDisable( GL_TEXTURE_GEN_S );+ glDisable( GL_TEXTURE_GEN_T );+ glDisable( GL_TEXTURE_GEN_R );+ glDisable( GL_TEXTURE_GEN_Q );+ break;++ case TEXCALC_ENVIRONMENT_MAP:+ glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );+ glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );++ glEnable( GL_TEXTURE_GEN_S );+ glEnable( GL_TEXTURE_GEN_T );+ glDisable( GL_TEXTURE_GEN_R );+ glDisable( GL_TEXTURE_GEN_Q );++ // Need to use a texture matrix to flip the spheremap+ mUseAutoTextureMatrix = true;+ memset(mAutoTextureMatrix, 0, sizeof(GLfloat)*16);+ mAutoTextureMatrix[0] = mAutoTextureMatrix[10] = mAutoTextureMatrix[15] = 1.0f;+ mAutoTextureMatrix[5] = -1.0f;++ break;++ case TEXCALC_ENVIRONMENT_MAP_PLANAR: + // XXX This doesn't seem right?!+#ifdef GL_VERSION_1_3+ glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );+ glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );+ glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );++ glEnable( GL_TEXTURE_GEN_S );+ glEnable( GL_TEXTURE_GEN_T );+ glEnable( GL_TEXTURE_GEN_R );+ glDisable( GL_TEXTURE_GEN_Q );+#else+ glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );+ glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );++ glEnable( GL_TEXTURE_GEN_S );+ glEnable( GL_TEXTURE_GEN_T );+ glDisable( GL_TEXTURE_GEN_R );+ glDisable( GL_TEXTURE_GEN_Q );+#endif+ break;+ case TEXCALC_ENVIRONMENT_MAP_REFLECTION:++ glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );+ glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );+ glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );++ glEnable( GL_TEXTURE_GEN_S );+ glEnable( GL_TEXTURE_GEN_T );+ glEnable( GL_TEXTURE_GEN_R );+ glDisable( GL_TEXTURE_GEN_Q );++ // We need an extra texture matrix here+ // This sets the texture matrix to be the inverse of the view matrix+ mUseAutoTextureMatrix = true;+ makeGLMatrix( M, mViewMatrix);++ // Transpose 3x3 in order to invert matrix (rotation)+ // Note that we need to invert the Z _before_ the rotation+ // No idea why we have to invert the Z at all, but reflection is wrong without it+ mAutoTextureMatrix[0] = M[0]; mAutoTextureMatrix[1] = M[4]; mAutoTextureMatrix[2] = -M[8];+ mAutoTextureMatrix[4] = M[1]; mAutoTextureMatrix[5] = M[5]; mAutoTextureMatrix[6] = -M[9];+ mAutoTextureMatrix[8] = M[2]; mAutoTextureMatrix[9] = M[6]; mAutoTextureMatrix[10] = -M[10];+ mAutoTextureMatrix[3] = mAutoTextureMatrix[7] = mAutoTextureMatrix[11] = 0.0f;+ mAutoTextureMatrix[12] = mAutoTextureMatrix[13] = mAutoTextureMatrix[14] = 0.0f;+ mAutoTextureMatrix[15] = 1.0f;++ break;+ case TEXCALC_ENVIRONMENT_MAP_NORMAL:+ glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP );+ glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP );+ glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP );++ glEnable( GL_TEXTURE_GEN_S );+ glEnable( GL_TEXTURE_GEN_T );+ glEnable( GL_TEXTURE_GEN_R );+ glDisable( GL_TEXTURE_GEN_Q );+ break;+ case TEXCALC_PROJECTIVE_TEXTURE:+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);+ glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);+ glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);+ glTexGenfv(GL_S, GL_EYE_PLANE, eyePlaneS);+ glTexGenfv(GL_T, GL_EYE_PLANE, eyePlaneT);+ glTexGenfv(GL_R, GL_EYE_PLANE, eyePlaneR);+ glTexGenfv(GL_Q, GL_EYE_PLANE, eyePlaneQ);+ glEnable(GL_TEXTURE_GEN_S);+ glEnable(GL_TEXTURE_GEN_T);+ glEnable(GL_TEXTURE_GEN_R);+ glEnable(GL_TEXTURE_GEN_Q);++ mUseAutoTextureMatrix = true;++ // Set scale and translation matrix for projective textures+ projectionBias = Matrix4::CLIPSPACE2DTOIMAGESPACE;++ projectionBias = projectionBias * frustum->getProjectionMatrix();+ if(mTexProjRelative)+ {+ Matrix4 viewMatrix;+ frustum->calcViewMatrixRelative(mTexProjRelativeOrigin, viewMatrix);+ projectionBias = projectionBias * viewMatrix;+ }+ else+ {+ projectionBias = projectionBias * frustum->getViewMatrix();+ }+ projectionBias = projectionBias * mWorldMatrix;++ makeGLMatrix(mAutoTextureMatrix, projectionBias);+ break;+ default:+ break;+ }+ activateGLTextureUnit(0);+ }+-}
+ Graphics/LambdaCube/RenderSystem/GL/GLTexture.hs view
@@ -0,0 +1,361 @@+module Graphics.LambdaCube.RenderSystem.GL.GLTexture where++import qualified Data.Set as Set+import Data.Maybe+import Control.Monad+import Foreign.Ptr++import Graphics.Rendering.OpenGL (($=))+import qualified Graphics.Rendering.OpenGL as GL+import System.Log.Logger++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.PixelFormat+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.Image+import Graphics.LambdaCube.HardwareBuffer+import Graphics.LambdaCube.RenderSystemCapabilities+import Graphics.LambdaCube.RenderSystem.GL.GLUtils++data GLTexture+ = GLTexture+ { gltxName :: String+ , gltxWidth :: Int+ , gltxHeight :: Int+ , gltxDepth :: Int+ , gltxNumRequestedMipmaps :: TextureMipmap+ , gltxNumMipmaps :: Int+ , gltxMipmapsHardwareGenerated :: Bool+ , gltxGamma :: FloatType+ , gltxHwGamma :: Bool+ , gltxFSAA :: Int+ , gltxFSAAHint :: String+ , gltxTextureType :: TextureType+ , gltxFormat :: PixelFormat+ , gltxUsage :: TextureUsage+ , gltxSrcFormat :: PixelFormat+ , gltxSrcWidth :: Int+ , gltxSrcHeight :: Int+ , gltxSrcDepth :: Int++ , gltxDesiredFormat :: PixelFormat+ , gltxDesiredIntegerBitDepth :: Int+ , gltxDesiredFloatBitDepth :: Int+ , gltxTreatLuminanceAsAlpha :: Bool+ + , gltxTextureObject :: GL.TextureObject+ }++instance Eq GLTexture where+ (==) a b = gltxTextureObject a == gltxTextureObject b++instance HardwareBuffer GLTexture++instance Texture GLTexture where+ txName = gltxName+ txWidth = gltxWidth+ txHeight = gltxHeight+ txDepth = gltxDepth+ txNumRequestedMipmaps = gltxNumRequestedMipmaps+ txNumMipmaps = gltxNumMipmaps+ txMipmapsHardwareGenerated = gltxMipmapsHardwareGenerated+ txGamma = gltxGamma+ txHwGamma = gltxHwGamma+ txFSAA = gltxFSAA+ txFSAAHint = gltxFSAAHint+ txTextureType = gltxTextureType+ txFormat = gltxFormat+-- txUsage = gltxUsage+ txSrcFormat = gltxSrcFormat+ txSrcWidth = gltxSrcWidth+ txSrcHeight = gltxSrcHeight+ txSrcDepth = gltxSrcDepth++ txDesiredFormat = gltxDesiredFormat+ txDesiredIntegerBitDepth = gltxDesiredIntegerBitDepth+ txDesiredFloatBitDepth = gltxDesiredFloatBitDepth+ txTreatLuminanceAsAlpha = gltxTreatLuminanceAsAlpha++{-+ virtual TexturePtr createManual(const String & name, const String& group,+ TextureType texType, uint width, uint height, uint depth, + int num_mips, PixelFormat format, int usage = TU_DEFAULT, ManualResourceLoader* loader = 0,+ bool hwGammaCorrection = false, uint fsaa = 0, const String& fsaaHint = StringUtil::BLANK);+-}+--createTexture :: a -> String -> TextureType -> Int -> Int -> Int -> Int -> PixelFormat -> TextueUsage -> Bool -> Int -> String -> IO t+{-+ virtual TexturePtr createManual(const String & name, const String& group,+ TextureType texType, uint width, uint height, uint depth, + int num_mips, PixelFormat format, int usage = TU_DEFAULT, ManualResourceLoader* loader = 0,+ bool hwGammaCorrection = false, uint fsaa = 0, const String& fsaaHint = StringUtil::BLANK);+ TextureUsage = bufferUsage::Usage, autoMipmap::Bool, isTarget::Bool+ createTexture :: a -> String -> TextureType -> Int -> Int -> Int -> Int -> PixelFormat -> Usage -> Bool -> Bool -> Bool -> Int -> String -> IO t+-}+mkGLTexture :: RenderSystemCapabilities -> String -> TextureType -> Int -> Int -> Int -> TextureMipmap -> PixelFormat -> TextureUsage -> Bool -> Int -> String -> Maybe [Image] -> IO GLTexture+--FIXME: image parameter is temporary!!!!+mkGLTexture rcaps name texType width height depth numMips format usage hwGammaCorrection fsaa fsaaHint mimage = do+ let caps = rscCapabilities rcaps+ debugM "createTexture" $ "create " ++ show texType ++ " texture: " ++ name+ + when (texType == TEX_TYPE_3D && Set.notMember RSC_TEXTURE_3D caps) $ error "3D Textures not supported before OpenGL 1.2"++ (major,minor) <- GL.get $ GL.majorMinor GL.glVersion++ let glVer a b = major > a || (major >= a && minor >= b)+ texTarget = (getGLTextureTarget texType)+ -- Convert to nearest power-of-two size if required+ mWidth = optionalPO2 rcaps width+ mHeight = optionalPO2 rcaps height+ mDepth = optionalPO2 rcaps depth++ -- Adjust format if required+ mFormat = getNativeFormat texType format False -- TODO++ -- Check requested number of mipmaps+ maxMips = getMaxMipmaps mWidth mHeight mDepth mFormat+ mNumMipmaps = maxMips -- TODO min maxMips numMips++ -- Generate texture name+ [mTextureID] <- GL.genObjectNames 1 ++ -- Set texture type+ GL.textureBinding texTarget $= Just mTextureID+ + -- This needs to be set otherwise the texture doesn't get rendered+ when (glVer 1 2) $ GL.textureLevelRange texTarget $= (0,fromIntegral mNumMipmaps)+ + -- Set some misc default parameters so NVidia won't complain, these can of course be changed later+ GL.textureFilter texTarget $= ((GL.Nearest,Nothing),GL.Nearest)++ when (glVer 1 2) $ do+ GL.textureWrapMode texTarget GL.S $= (GL.Repeated, GL.ClampToEdge)+ GL.textureWrapMode texTarget GL.T $= (GL.Repeated, GL.ClampToEdge)++ -- If we can do automip generation and the user desires this, do so+ let mMipmapsHardwareGenerated = Set.member RSC_AUTOMIPMAP caps+ -- FIXME+ {-+ // NVIDIA 175.16 drivers break hardware mip generation for non-compressed+ // textures - disable until fixed+ // Leave hardware gen on compressed textures since that's the only way we+ // can realistically do it since GLU doesn't support DXT+ // However DON'T do this on Apple, their drivers aren't subject to this+ // problem yet and in fact software generation appears to cause a crash + // in some cases which I've yet to track down+if OGRE_PLATFORM != OGRE_PLATFORM_APPLE+ if (Root::getSingleton().getRenderSystem()->getCapabilities()->getVendor() == GPU_NVIDIA+ && !PixelUtil::isCompressed(mFormat))+ {+ mMipmapsHardwareGenerated = false;+ }+endif+ -}+--TODO+ let moreMips = case numMips of+ { MIP_UNLIMITED -> True+ ; MIP_DEFAULT -> True -- TODO+ ; MIP_NUMBER n -> n > 0+ }++ when (tuAutoMipmap usage && moreMips && mMipmapsHardwareGenerated) $ GL.generateMipmap texTarget $= GL.Enabled++ -- Allocate internal buffer so that glTexSubImageXD can be used+ -- Internal format+ let format' = getClosestGLInternalFormat mFormat hwGammaCorrection+ isCompressed _ = False -- TODO+ case isCompressed mFormat of+ { True -> do+ {-+ // Compressed formats+ size_t size = PixelUtil::getMemorySize(mWidth, mHeight, mDepth, mFormat);+ // Provide temporary buffer filled with zeroes as glCompressedTexImageXD does not+ // accept a 0 pointer like normal glTexImageXD+ // Run through this process for every mipmap to pregenerate mipmap piramid+ uint8 *tmpdata = new uint8[size];+ memset(tmpdata, 0, size);+ + for(size_t mip=0; mip<=mNumMipmaps; mip++)+ {+ size = PixelUtil::getMemorySize(width, height, depth, mFormat);+ switch(mTextureType)+ {+ case TEX_TYPE_1D:+ glCompressedTexImage1DARB(GL_TEXTURE_1D, mip, format', + width, 0, + size, tmpdata);+ break;+ case TEX_TYPE_2D:+ glCompressedTexImage2DARB(GL_TEXTURE_2D, mip, format',+ width, height, 0, + size, tmpdata);+ break;+ case TEX_TYPE_3D:+ glCompressedTexImage3DARB(GL_TEXTURE_3D, mip, format',+ width, height, depth, 0, + size, tmpdata);+ break;+ case TEX_TYPE_CUBE_MAP:+ for(int face=0; face<6; face++) {+ glCompressedTexImage2DARB(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, mip, format',+ width, height, 0, + size, tmpdata);+ }+ break;+ };+ if(width>1) width = width/2;+ if(height>1) height = height/2;+ if(depth>1) depth = depth/2;+ }+ delete [] tmpdata;+ -}+ + -- Compressed formats+ -- Provide temporary buffer filled with zeroes as glCompressedTexImageXD does not+ -- accept a 0 pointer like normal glTexImageXD+ -- TODO: support compressed textures+ {-+ let setMip tmpdata (w,h,d) mip = do+ -- compressedTexImage1D :: Proxy -> Level -> TextureSize1D -> Border -> CompressedPixelData a -> IO ()+ -- CompressedPixelData !CompressedTextureFormat GLsizei (Ptr a)+ let size = getMemorySize w h d mFormat+ case texType of+ { TEX_TYPE_1D -> GL.compressedTexImage1D GL.NoProxy mip (GL.TextureSize1D w) 0 (GL.CompressedPixelData (CompressedTextureFormat ) size tmpdata)+ ; TEX_TYPE_2D -> + ; TEX_TYPE_3D -> + ; TEX_TYPE_CUBE_MAP -> do+ }+ return (max 1 (w `div` 2), max 1 (h `div` 2), max 1 (d `div` 2))+ setMips :: Ptr Word8 -> IO ()+ setMips tmpdata = do+ pokeArray tmpdata $ replicate size 0+ -- Run through this process for every mipmap to pregenerate mipmap piramid+ foldM_ (setMip tmpdata) (mWidth,mHeight,mDepth) [0..mNumMipmaps]+ allocaArray (getMemorySize mWidth mHeight mDepth mFormat) setMips+ -}+ return ()+ ; False -> do+ let setMip (w,h,d) mip = do+ -- Normal formats+ case texType of+ { TEX_TYPE_1D -> GL.texImage1D GL.NoProxy mip format' (GL.TextureSize1D w) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)+ ; TEX_TYPE_2D -> GL.texImage2D Nothing GL.NoProxy mip format' (GL.TextureSize2D w h) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)+ ; TEX_TYPE_3D -> GL.texImage3D GL.NoProxy mip format' (GL.TextureSize3D w h d) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)+ ; TEX_TYPE_CUBE_MAP -> do+ GL.texImage2D (Just GL.TextureCubeMapPositiveX) GL.NoProxy mip format' (GL.TextureSize2D w h) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)+ GL.texImage2D (Just GL.TextureCubeMapNegativeX) GL.NoProxy mip format' (GL.TextureSize2D w h) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)+ GL.texImage2D (Just GL.TextureCubeMapPositiveY) GL.NoProxy mip format' (GL.TextureSize2D w h) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)+ GL.texImage2D (Just GL.TextureCubeMapNegativeY) GL.NoProxy mip format' (GL.TextureSize2D w h) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)+ GL.texImage2D (Just GL.TextureCubeMapPositiveZ) GL.NoProxy mip format' (GL.TextureSize2D w h) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)+ GL.texImage2D (Just GL.TextureCubeMapNegativeZ) GL.NoProxy mip format' (GL.TextureSize2D w h) 0 (GL.PixelData GL.RGBA GL.UnsignedByte nullPtr)+ }+ return (max 1 (w `div` 2), max 1 (h `div` 2), max 1 (d `div` 2))+ f = fromIntegral+ -- Run through this process to pregenerate mipmap piramid+ foldM_ setMip (f mWidth,f mHeight,f mDepth) [0..(fromIntegral mNumMipmaps)]+ }++ -- TODO+ -- TEMP CODE+ when (isJust mimage) $ do+ let images = fromJust mimage+ imInfo i = (fmt,f w,f h)+ where+ f = fromIntegral+ fmt = case imFormat i of+ { PF_L8 -> GL.Luminance+ ; PF_BYTE_LA -> GL.LuminanceAlpha+ ; PF_R8G8B8 -> GL.RGB+ ; PF_R8G8B8A8 -> GL.RGBA+ }+ w = imWidth i+ h = imHeight i+ upload2D target i = do+ let (fmt,w,h) = imInfo i+ debugM "createTexture" $ "upload2d: " ++ imName i+ GL.texImage2D target GL.NoProxy 0 format' (GL.TextureSize2D w h) 0 (GL.PixelData fmt GL.UnsignedByte $ imData i)+ + errl <- GL.get GL.errors+ unless (null errl) $ debugM "createTexture" $ "glerrors: \"" ++ concat [show c ++ " - " ++ m ++ "\n" | GL.Error c m <- errl] ++ "\""+ case texType of+ { TEX_TYPE_1D -> do+ let (fmt,w,h) = imInfo image+ image = head images + GL.texImage1D GL.NoProxy 0 format' (GL.TextureSize1D w) 0 (GL.PixelData fmt GL.UnsignedByte $ imData image)+ ; TEX_TYPE_2D -> upload2D Nothing $ head images+ ; TEX_TYPE_CUBE_MAP -> mapM_ (uncurry upload2D) $ zip [ Just GL.TextureCubeMapPositiveZ -- front+ , Just GL.TextureCubeMapNegativeZ -- back+ , Just GL.TextureCubeMapPositiveY -- up+ , Just GL.TextureCubeMapNegativeY -- down+ , Just GL.TextureCubeMapNegativeX -- left+ , Just GL.TextureCubeMapPositiveX -- right+ ] images+ ; _ -> return ()+ } + --_createSurfaceList();++ -- Get final internal format+ -- TODO+ --mFormat = getBuffer(0,0)->getFormat();+ debugM "createTexture" $ "created texture: " ++ name+ return GLTexture+ { gltxName = name+ , gltxWidth = 0 --TODO+ , gltxHeight = 0 --TODO+ , gltxDepth = 0 --TODO+ , gltxNumRequestedMipmaps = MIP_DEFAULT --TODO+ , gltxNumMipmaps = 0 --TODO+ , gltxMipmapsHardwareGenerated = True --TODO+ , gltxGamma = 0 --TODO+ , gltxHwGamma = True --TODO+ , gltxFSAA = 0 --TODO+ , gltxFSAAHint = "" --TODO+ , gltxTextureType = texType+ , gltxFormat = PF_R8G8B8 -- TODO+ , gltxUsage = TextureUsage HBU_WRITE_ONLY False False-- TODO+ , gltxSrcFormat = PF_R8G8B8 -- TODO+ , gltxSrcWidth = 0 --TODO+ , gltxSrcHeight = 0 --TODO+ , gltxSrcDepth = 0 --TODO+ + , gltxDesiredFormat = PF_R8G8B8 --TODO+ , gltxDesiredIntegerBitDepth = 0 --TODO+ , gltxDesiredFloatBitDepth = 0 --TODO+ , gltxTreatLuminanceAsAlpha = True --TODO+ + , gltxTextureObject = mTextureID+ }+{-+ void GLTexture::_createSurfaceList()+ {+ mSurfaceList.clear();+ + // For all faces and mipmaps, store surfaces as HardwarePixelBufferSharedPtr+ bool wantGeneratedMips = (mUsage & TU_AUTOMIPMAP)!=0;+ + // Do mipmapping in software? (uses GLU) For some cards, this is still needed. Of course,+ // only when mipmap generation is desired.+ bool doSoftware = wantGeneratedMips && !mMipmapsHardwareGenerated && getNumMipmaps(); + + for(size_t face=0; face<getNumFaces(); face++)+ {+ for(size_t mip=0; mip<=getNumMipmaps(); mip++)+ {+ GLHardwarePixelBuffer *buf = new GLTextureBuffer(mName, getGLTextureTarget(), mTextureID, face, mip,+ static_cast<HardwareBuffer::Usage>(mUsage), doSoftware && mip==0, mHwGamma, mFSAA);+ mSurfaceList.push_back(HardwarePixelBufferSharedPtr(buf));+ + /// Check for error+ if(buf->getWidth()==0 || buf->getHeight()==0 || buf->getDepth()==0)+ {+ OGRE_EXCEPT(+ Exception::ERR_RENDERINGAPI_ERROR, + "Zero sized texture surface on texture "+getName()++ " face "+StringConverter::toString(face)++ " mipmap "+StringConverter::toString(mip)++ ". Probably, the GL driver refused to create the texture.", + "GLTexture::_createSurfaceList");+ }+ }+ }+ }+-}
+ Graphics/LambdaCube/RenderSystem/GL/GLUtils.hs view
@@ -0,0 +1,326 @@+module Graphics.LambdaCube.RenderSystem.GL.GLUtils where++import qualified Data.Set as Set+import Data.Bits+import Unsafe.Coerce++import Graphics.Rendering.OpenGL (($=))+import qualified Graphics.Rendering.OpenGL as GL++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Math+import Graphics.LambdaCube.Common+import Graphics.LambdaCube.PixelFormat+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.BlendMode+import Graphics.LambdaCube.HardwareBuffer+import Graphics.LambdaCube.HardwareVertexBuffer+import Graphics.LambdaCube.RenderSystemCapabilities+import Graphics.LambdaCube.TextureUnitState++toGLMatrix :: Matrix4 -> IO (GL.GLmatrix GL.GLfloat)+toGLMatrix m = GL.newMatrix GL.ColumnMajor $ unsafeCoerce $ toListsMatrix4 m++getGLUsage :: Usage -> GL.BufferUsage+getGLUsage usage = case usage of+ { HBU_STATIC -> GL.StaticDraw+ ; HBU_STATIC_WRITE_ONLY -> GL.StaticDraw+ ; HBU_DYNAMIC -> GL.DynamicDraw+ ; HBU_DYNAMIC_WRITE_ONLY -> GL.DynamicDraw+ ; HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE -> GL.StreamDraw+ ; _ -> GL.DynamicDraw+ }++getGLType :: VertexElementType -> GL.DataType+getGLType t = case t of+ { VET_FLOAT1 -> GL.Float+ ; VET_FLOAT2 -> GL.Float+ ; VET_FLOAT3 -> GL.Float+ ; VET_FLOAT4 -> GL.Float+ ; VET_SHORT1 -> GL.Short+ ; VET_SHORT2 -> GL.Short+ ; VET_SHORT3 -> GL.Short+ ; VET_SHORT4 -> GL.Short+ ; VET_COLOUR_ABGR -> GL.UnsignedByte+ ; VET_COLOUR_ARGB -> GL.UnsignedByte+ ; VET_UBYTE4 -> GL.UnsignedByte+ }++getGLTextureTarget :: TextureType -> GL.TextureTarget+getGLTextureTarget textureType = case textureType of+ { TEX_TYPE_1D -> GL.Texture1D+ ; TEX_TYPE_2D -> GL.Texture2D+ ; TEX_TYPE_3D -> GL.Texture3D+ ; TEX_TYPE_CUBE_MAP -> GL.TextureCubeMap+ }+++optionalPO2 :: RenderSystemCapabilities -> Int -> Int+optionalPO2 rcaps value = case Set.member RSC_NON_POWER_OF_2_TEXTURES (rscCapabilities rcaps) of+ { True -> value+ ; False -> 2 ^ ( 1 + log2 (value-1) )+ }+ where+ log2 n = case n of+ 0 -> -1+ _ -> 1 + log2 (shiftR n 1) ++getMaxMipmaps :: Int -> Int -> Int -> PixelFormat -> Int+getMaxMipmaps width height depth format = maximum [f width, f height, f depth]+ where+ f x = floor $ logBase 2 $ fromIntegral x+{-+ size_t GLPixelUtil::getMaxMipmaps(size_t width, size_t height, size_t depth, PixelFormat format)+ {+ size_t count = 0;+ do {+ if(width>1) width = width/2;+ if(height>1) height = height/2;+ if(depth>1) depth = depth/2;+ + count ++;+ } while(!(width == 1 && height == 1 && depth == 1));+ + return count;+ }+-}+-- TODO+getNativeFormat :: TextureType -> PixelFormat -> Bool -> PixelFormat+getNativeFormat ttype format isTarget = PF_R8G8B8+{-+ PixelFormat GLTextureManager::getNativeFormat(TextureType ttype, PixelFormat format, int usage)+ {+ // Adjust requested parameters to capabilities+ const RenderSystemCapabilities *caps = Root::getSingleton().getRenderSystem()->getCapabilities();++ // Check compressed texture support+ // if a compressed format not supported, revert to PF_A8R8G8B8+ if(PixelUtil::isCompressed(format) &&+ !caps->hasCapability( RSC_TEXTURE_COMPRESSION_DXT ))+ {+ return PF_A8R8G8B8;+ }+ // if floating point textures not supported, revert to PF_A8R8G8B8+ if(PixelUtil::isFloatingPoint(format) &&+ !caps->hasCapability( RSC_TEXTURE_FLOAT ))+ {+ return PF_A8R8G8B8;+ }+ + // Check if this is a valid rendertarget format+ if( usage & TU_RENDERTARGET )+ {+ /// Get closest supported alternative+ /// If mFormat is supported it's returned+ return GLRTTManager::getSingleton().getSupportedAlternative(format);+ }++ // Supported+ return format;+ }++ PixelFormat GLRTTManager::getSupportedAlternative(PixelFormat format)+ {+ if(checkFormat(format))+ return format;+ /// Find first alternative+ PixelComponentType pct = PixelUtil::getComponentType(format);+ switch(pct)+ {+ case PCT_BYTE: format = PF_A8R8G8B8; break;+ case PCT_SHORT: format = PF_SHORT_RGBA; break;+ case PCT_FLOAT16: format = PF_FLOAT16_RGBA; break;+ case PCT_FLOAT32: format = PF_FLOAT32_RGBA; break;+ case PCT_COUNT: break;+ }+ if(checkFormat(format))+ return format;+ /// If none at all, return to default+ return PF_A8R8G8B8;+ }+-}+getGLInternalFormat :: PixelFormat -> Bool -> GL.PixelInternalFormat+getGLInternalFormat mFormat hwGamma = case mFormat of+ { PF_L8 -> GL.Luminance8+ ; PF_L16 -> GL.Luminance16+ ; PF_A8 -> GL.Alpha8+ ; PF_A4L4 -> GL.Luminance4Alpha4+ ; PF_BYTE_LA -> GL.Luminance8Alpha8+ ; PF_R3G3B2 -> GL.R3G3B2+ ; PF_A1R5G5B5 -> GL.RGB5A1+ ; PF_R5G6B5 -> GL.RGB5+ ; PF_B5G6R5 -> GL.RGB5+ ; PF_A4R4G4B4 -> GL.RGBA4+ ; PF_R8G8B8 -> if hwGamma then GL.SRGB8 else GL.RGB8+ ; PF_B8G8R8 -> if hwGamma then GL.SRGB8 else GL.RGB8+ ; PF_X8B8G8R8 -> if hwGamma then GL.SRGB8 else GL.RGB8+ ; PF_X8R8G8B8 -> if hwGamma then GL.SRGB8 else GL.RGB8+ ; PF_A8R8G8B8 -> if hwGamma then GL.SRGB8Alpha8 else GL.RGBA8+ ; PF_B8G8R8A8 -> if hwGamma then GL.SRGB8Alpha8 else GL.RGBA8 + ; PF_A2R10G10B10 -> GL.RGB10A2+ ; PF_A2B10G10R10 -> GL.RGB10A2+--FIXME ; PF_FLOAT16_R -> GL_LUMINANCE16F_ARB+--FIXME ; PF_FLOAT16_RGB -> GL_RGB16F_ARB+--FIXME ; PF_FLOAT16_GR -> GL_LUMINANCE_ALPHA16F_ARB+--FIXME ; PF_FLOAT16_RGBA -> GL_RGBA16F_ARB+--FIXME ; PF_FLOAT32_R -> GL_LUMINANCE32F_ARB+--FIXME ; PF_FLOAT32_GR -> GL_LUMINANCE_ALPHA32F_ARB+--FIXME ; PF_FLOAT32_RGB -> GL_RGB32F_ARB+--FIXME ; PF_FLOAT32_RGBA -> GL_RGBA32F_ARB+ ; PF_SHORT_RGBA -> GL.RGBA16+ ; PF_SHORT_RGB -> GL.RGB16+ ; PF_SHORT_GR -> GL.Luminance16Alpha16+-- case PF_DXT1:+-- if (hwGamma)+-- return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;+-- else+-- return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;+-- case PF_DXT3:+-- if (hwGamma)+-- return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;+-- else+-- return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;+-- case PF_DXT5:+-- if (hwGamma)+-- return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;+-- else+-- return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;+ ; _ -> error "Unsupported pixel format"+ }+{- + GLenum GLPixelUtil::getGLInternalFormat(PixelFormat mFormat, bool hwGamma)+ {+ switch(mFormat) {+ default:+ return GL_NONE;+ }+ }+ GLenum GLPixelUtil::getClosestGLInternalFormat(PixelFormat mFormat, bool hwGamma)+ {+ GLenum format = getGLInternalFormat(mFormat, hwGamma);+ if(format==GL_NONE)+ {+ if (hwGamma)+ return GL_SRGB8;+ else+ return GL_RGBA8;+ }+ else+ return format;+ }+-}+getClosestGLInternalFormat :: PixelFormat -> Bool -> GL.PixelInternalFormat+getClosestGLInternalFormat mFormat hwGamma = case mFormat of+ { PF_L8 -> GL.Luminance8+ ; PF_L16 -> GL.Luminance16+ ; PF_A8 -> GL.Alpha8+ ; PF_A4L4 -> GL.Luminance4Alpha4+ ; PF_BYTE_LA -> GL.Luminance8Alpha8+ ; PF_R3G3B2 -> GL.R3G3B2+ ; PF_A1R5G5B5 -> GL.RGB5A1+ ; PF_R5G6B5 -> GL.RGB5+ ; PF_B5G6R5 -> GL.RGB5+ ; PF_A4R4G4B4 -> GL.RGBA4+ ; PF_R8G8B8 -> if hwGamma then GL.SRGB8 else GL.RGB8+ ; PF_B8G8R8 -> if hwGamma then GL.SRGB8 else GL.RGB8+ ; PF_X8B8G8R8 -> if hwGamma then GL.SRGB8 else GL.RGB8+ ; PF_X8R8G8B8 -> if hwGamma then GL.SRGB8 else GL.RGB8+ ; PF_A8R8G8B8 -> if hwGamma then GL.SRGB8Alpha8 else GL.RGBA8+ ; PF_B8G8R8A8 -> if hwGamma then GL.SRGB8Alpha8 else GL.RGBA8 + ; PF_A2R10G10B10 -> GL.RGB10A2+ ; PF_A2B10G10R10 -> GL.RGB10A2+--FIXME ; PF_FLOAT16_R -> GL_LUMINANCE16F_ARB+--FIXME ; PF_FLOAT16_RGB -> GL_RGB16F_ARB+--FIXME ; PF_FLOAT16_GR -> GL_LUMINANCE_ALPHA16F_ARB+--FIXME ; PF_FLOAT16_RGBA -> GL_RGBA16F_ARB+--FIXME ; PF_FLOAT32_R -> GL_LUMINANCE32F_ARB+--FIXME ; PF_FLOAT32_GR -> GL_LUMINANCE_ALPHA32F_ARB+--FIXME ; PF_FLOAT32_RGB -> GL_RGB32F_ARB+--FIXME ; PF_FLOAT32_RGBA -> GL_RGBA32F_ARB+ ; PF_SHORT_RGBA -> GL.RGBA16+ ; PF_SHORT_RGB -> GL.RGB16+ ; PF_SHORT_GR -> GL.Luminance16Alpha16+-- FIXME+-- case PF_DXT1:+-- if (hwGamma)+-- return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;+-- else+-- return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;+-- case PF_DXT3:+-- if (hwGamma)+-- return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;+-- else+-- return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;+-- case PF_DXT5:+-- if (hwGamma)+-- return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;+-- else+-- return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;+ ; _ -> if hwGamma then GL.SRGB8 else GL.RGBA8+ }++getBlendMode :: SceneBlendFactor -> GL.BlendingFactor+getBlendMode blend = case blend of+ { SBF_ONE -> GL.One+ ; SBF_ZERO -> GL.Zero+ ; SBF_DEST_COLOUR -> GL.DstColor+ ; SBF_SOURCE_COLOUR -> GL.SrcColor+ ; SBF_ONE_MINUS_DEST_COLOUR -> GL.OneMinusDstColor+ ; SBF_ONE_MINUS_SOURCE_COLOUR -> GL.OneMinusSrcColor+ ; SBF_DEST_ALPHA -> GL.DstAlpha+ ; SBF_SOURCE_ALPHA -> GL.SrcAlpha+ ; SBF_ONE_MINUS_DEST_ALPHA -> GL.OneMinusDstAlpha+ ; SBF_ONE_MINUS_SOURCE_ALPHA -> GL.OneMinusSrcAlpha+ }++getBlendEquation op = case op of+ { SBO_ADD -> GL.FuncAdd+ ; SBO_SUBTRACT -> GL.FuncSubtract+ ; SBO_REVERSE_SUBTRACT -> GL.FuncReverseSubtract+ ; SBO_MIN -> GL.Min+ ; SBO_MAX -> GL.Max+ }++getTextureAddressingMode tam = case tam of+ { TAM_WRAP -> (GL.Repeated, GL.Repeat)+ ; TAM_MIRROR -> (GL.Mirrored, GL.Repeat)+ ; TAM_CLAMP -> (GL.Repeated, GL.ClampToEdge)+ ; TAM_BORDER -> (GL.Repeated, GL.ClampToBorder)+ }++getLayerBlendSource src = case src of + { LBS_CURRENT -> GL.Previous+ ; LBS_TEXTURE -> GL.CurrentUnit+ ; LBS_MANUAL -> GL.Constant+ ; LBS_DIFFUSE -> GL.PrimaryColor+ ; LBS_SPECULAR -> GL.PrimaryColor+ }++getTextureCombineFunction hasDot3 op = case op of+ { LBX_SOURCE1 -> GL.Replace'+ ; LBX_SOURCE2 -> GL.Replace'+ ; LBX_MODULATE -> GL.Modulate'+ ; LBX_MODULATE_X2 -> GL.Modulate'+ ; LBX_MODULATE_X4 -> GL.Modulate'+ ; LBX_ADD -> GL.AddUnsigned'+ ; LBX_ADD_SIGNED -> GL.AddSigned+ ; LBX_ADD_SMOOTH -> GL.Interpolate+ ; LBX_SUBTRACT -> GL.Subtract+ ; LBX_BLEND_DIFFUSE_COLOUR -> GL.Interpolate+ ; LBX_BLEND_DIFFUSE_ALPHA -> GL.Interpolate+ ; LBX_BLEND_TEXTURE_ALPHA -> GL.Interpolate+ ; LBX_BLEND_CURRENT_ALPHA -> GL.Interpolate+ ; LBX_BLEND_MANUAL -> GL.Interpolate+ ; LBX_DOTPRODUCT -> if hasDot3 then GL.Dot3RGB else GL.Modulate'+ }++convertCompareFunction f = case f of+ { CMPF_ALWAYS_FAIL -> GL.Never+ ; CMPF_ALWAYS_PASS -> GL.Always+ ; CMPF_LESS -> GL.Less+ ; CMPF_LESS_EQUAL -> GL.Lequal+ ; CMPF_EQUAL -> GL.Equal+ ; CMPF_NOT_EQUAL -> GL.Notequal+ ; CMPF_GREATER_EQUAL -> GL.Gequal+ ; CMPF_GREATER -> GL.Greater+ }
+ Graphics/LambdaCube/RenderSystem/GL/GLVertexBuffer.hs view
@@ -0,0 +1,133 @@+module Graphics.LambdaCube.RenderSystem.GL.GLVertexBuffer where++import Data.Word+import Data.Maybe+import Foreign.Marshal.Alloc+import Foreign.Marshal.Utils+import Foreign.Storable+import Foreign.C.Types+import Foreign.Ptr+import Data.IORef+import Control.Monad++import Graphics.Rendering.OpenGL (($=))+import qualified Graphics.Rendering.OpenGL as GL++import Graphics.LambdaCube.RenderSystem+import Graphics.LambdaCube.HardwareBuffer+import Graphics.LambdaCube.HardwareVertexBuffer+import Graphics.LambdaCube.RenderSystem.GL.GLUtils++-- | Specialisation of HardwareVertexBuffer for GL+data GLVertexBuffer+ = GLVertexBuffer+ { glvbNumVertices :: Int+ , glvbVertexSize :: Int+ + , glvbUsage :: Usage+ , glvbLockInfo :: IORef (Maybe (Int,Int,Bool)) -- LockStart LockSize RequireUpdate+ + , glvbShadowBuffer :: Maybe (Ptr Word8)+ , glvbBufferObject :: Maybe GL.BufferObject+ }+ deriving Eq++instance HardwareVertexBuffer GLVertexBuffer where+ getVertexSize = glvbVertexSize+ getNumVertices = glvbNumVertices++instance HardwareBuffer GLVertexBuffer where+ getSizeInBytes b = glvbVertexSize b * glvbNumVertices b+ isSystemMemory = isNothing . glvbBufferObject+ hasShadowBuffer b = (isJust $ glvbShadowBuffer b) && (isJust $ glvbBufferObject b)+ getUsage = glvbUsage+ isLocked = glvbIsLocked+ unlock = glvbUnlock+ lock = glvbLock++glvbIsLocked b = do+ i <- readIORef $ glvbLockInfo b+ return $ isJust i++glvbLock a offs len opts = do+ lockinfo <- readIORef (glvbLockInfo a)+ when (isJust lockinfo) $ error "Cannot lock this buffer, it is already locked!"+ writeIORef (glvbLockInfo a) $ Just (offs,len,opts /= HBL_READ_ONLY)+ case glvbShadowBuffer a of+ { Just b -> return $ plusPtr b offs+ ; Nothing -> do+ GL.bindBuffer GL.ArrayBuffer $= (glvbBufferObject a)+ -- Discard if required+ when (opts == HBL_DISCARD) $ GL.bufferData GL.ArrayBuffer $= (fromIntegral $ getSizeInBytes a, nullPtr, getGLUsage $ getUsage a)+ let isWriteOnly = case getUsage a of+ { HBU_WRITE_ONLY -> True+ ; HBU_STATIC_WRITE_ONLY -> True+ ; HBU_DYNAMIC_WRITE_ONLY -> True+ ; HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE -> True+ ; _ -> False+ }+ access = case (isWriteOnly,opts == HBL_READ_ONLY) of+ { (False,False) -> GL.ReadWrite+ ; (False,True) -> GL.ReadOnly+ ; (True,_) -> GL.WriteOnly+ }+ mb <- GL.mapBuffer GL.ArrayBuffer access+ case mb of+ { Just b -> return $ plusPtr b offs+ ; Nothing -> error "Vertex Buffer: Out of memory"+ }+ }++glvbUnlock a = do+ lockinfo <- readIORef (glvbLockInfo a)+ let (lockStart,lockSize,reqUpdate) = case lockinfo of+ { Just li -> li+ ; Nothing -> error "Cannot unlock this buffer, it is not locked!"+ }+ writeIORef (glvbLockInfo a) Nothing+ case glvbShadowBuffer a of+ { Just b -> when reqUpdate $ do -- If we used the shadow buffer this time...+ GL.bindBuffer GL.ArrayBuffer $= (glvbBufferObject a)+ case lockStart == 0 && lockSize == getSizeInBytes a of+ { True -> GL.bufferData GL.ArrayBuffer $= (fromIntegral lockSize, b, getGLUsage $ getUsage a)+ ; False -> GL.bufferSubData GL.ArrayBuffer GL.WriteToBuffer (fromIntegral lockStart) (fromIntegral lockSize) b+ }+ ; Nothing -> do+ GL.bindBuffer GL.ArrayBuffer $= (glvbBufferObject a)+ ok <- GL.unmapBuffer GL.ArrayBuffer+ unless ok $ error "Buffer data corrupted, please reload"+ }+ +--mkGLVertexBuffer :: RenderSystem rs => rs -> Int -> Int -> Usage -> Bool -> IO GLVertexBuffer+mkGLVertexBuffer rs vertexSize numVerts usage useShadowBuffer = do+ lockinfo <- newIORef Nothing+ [bufferObject] <- GL.genObjectNames 1+ GL.bindBuffer GL.ArrayBuffer $= Just bufferObject+ GL.bufferData GL.ArrayBuffer $= (fromIntegral $ numVerts * vertexSize, nullPtr, getGLUsage usage)+ shadowBuffer <- case useShadowBuffer of+ { True -> do+ b <- mallocBytes $ numVerts * vertexSize+ return $ Just b+ ; False -> return Nothing+ }+ return $ GLVertexBuffer+ { glvbNumVertices = numVerts+ , glvbVertexSize = vertexSize+ + , glvbUsage = usage+ , glvbLockInfo = lockinfo++ , glvbShadowBuffer = shadowBuffer+ , glvbBufferObject = Just bufferObject+ }++rmGLVertexBuffer :: GLVertexBuffer -> IO ()+rmGLVertexBuffer a = do+ case glvbBufferObject a of+ { Just b -> GL.deleteObjectNames [b]+ ; Nothing -> return ()+ }+ case glvbShadowBuffer a of+ { Just b -> free b+ ; Nothing -> return ()+ }
+ Graphics/LambdaCube/RenderSystemCapabilities.hs view
@@ -0,0 +1,119 @@+module Graphics.LambdaCube.RenderSystemCapabilities where++import Data.Set++import Graphics.LambdaCube.Types++-- | Enum describing the different hardware capabilities we want to check for+data Capabilities+ = RSC_AUTOMIPMAP -- ^ Supports generating mipmaps in hardware+ | RSC_BLENDING+ | RSC_ANISOTROPY -- ^ Supports anisotropic texture filtering+ | RSC_DOT3 -- ^ Supports fixed-function DOT3 texture blend+ | RSC_CUBEMAPPING -- ^ Supports cube mapping+ | RSC_HWSTENCIL -- ^ Supports hardware stencil buffer+ | RSC_VBO -- ^ Supports hardware vertex and index buffers+ | RSC_VERTEX_PROGRAM -- ^ Supports vertex programs (vertex shaders)+ | RSC_FRAGMENT_PROGRAM -- ^ Supports fragment programs (pixel shaders)+ | RSC_SCISSOR_TEST -- ^ Supports performing a scissor test to exclude areas of the screen+ | RSC_TWO_SIDED_STENCIL -- ^ Supports separate stencil updates for both front and back faces+ | RSC_STENCIL_WRAP -- ^ Supports wrapping the stencil value at the range extremeties+ | RSC_HWOCCLUSION -- ^ Supports hardware occlusion queries+ | RSC_USER_CLIP_PLANES -- ^ Supports user clipping planes+ | RSC_VERTEX_FORMAT_UBYTE4 -- ^ Supports the VET_UBYTE4 vertex element type+ | RSC_INFINITE_FAR_PLANE -- ^ Supports infinite far plane projection+ | RSC_HWRENDER_TO_TEXTURE -- ^ Supports hardware render-to-texture (bigger than framebuffer)+ | RSC_TEXTURE_FLOAT -- ^ Supports float textures and render targets+ | RSC_NON_POWER_OF_2_TEXTURES -- ^ Supports non-power of two textures+ | RSC_TEXTURE_3D -- ^ Supports 3d (volume) textures+ | RSC_POINT_SPRITES -- ^ Supports basic point sprite rendering+ | RSC_POINT_EXTENDED_PARAMETERS -- ^ Supports extra point parameters (minsize, maxsize, attenuation)+ | RSC_VERTEX_TEXTURE_FETCH -- ^ Supports vertex texture fetch+ | RSC_MIPMAP_LOD_BIAS -- ^ Supports mipmap LOD biasing+ | RSC_GEOMETRY_PROGRAM -- ^ Supports hardware geometry programs+ | RSC_HWRENDER_TO_VERTEX_BUFFER -- ^ Supports rendering to vertex buffers++ | RSC_TEXTURE_COMPRESSION -- ^ Supports compressed textures+ | RSC_TEXTURE_COMPRESSION_DXT -- ^ Supports compressed textures in the DXT/ST3C formats+ | RSC_TEXTURE_COMPRESSION_VTC -- ^ Supports compressed textures in the VTC format+ | RSC_TEXTURE_COMPRESSION_PVRTC -- ^ Supports compressed textures in the PVRTC format+ | RSC_FIXED_FUNCTION -- ^ Supports fixed-function pipeline+ | RSC_MRT_DIFFERENT_BIT_DEPTHS -- ^ Supports MRTs with different bit depths+ | RSC_ALPHA_TO_COVERAGE -- ^ Supports Alpha to Coverage (A2C)+ | RSC_ADVANCED_BLEND_OPERATIONS -- ^ Supports Blending operations other than +++ -- * DirectX specific caps+ | RSC_PERSTAGECONSTANT -- ^ Is DirectX feature "per stage constants" supported++ -- * GL Specific Caps+ | RSC_GL1_5_NOVBO -- ^ Supports openGL GLEW version 1.5+ | RSC_FBO -- ^ Support for Frame Buffer Objects (FBOs)+ | RSC_FBO_ARB -- ^ Support for Frame Buffer Objects ARB implementation (regular FBO is higher precedence)+ | RSC_FBO_ATI -- ^ Support for Frame Buffer Objects ATI implementation (ARB FBO is higher precedence)+ | RSC_PBUFFER -- ^ Support for PBuffer+ | RSC_GL1_5_NOHWOCCLUSION -- ^ Support for GL 1.5 but without HW occlusion workaround+ | RSC_POINT_EXTENDED_PARAMETERS_ARB -- ^ Support for point parameters ARB implementation+ | RSC_POINT_EXTENDED_PARAMETERS_EXT -- ^ Support for point parameters EXT implementation+ deriving (Eq,Ord)++data DriverVersion + = DriverVersion + { dvMajor :: Int+ , dvMinor :: Int+ , dvRelease :: Int+ , dvBuild :: Int+ }+ deriving Eq++-- | Enumeration of GPU vendors.+data GPUVendor+ = GPU_UNKNOWN+ | GPU_NVIDIA+ | GPU_ATI+ | GPU_INTEL+ | GPU_S3+ | GPU_MATROX+ | GPU_3DLABS+ | GPU_SIS+ | GPU_IMAGINATION_TECHNOLOGIES+ | GPU_APPLE -- ^ Apple Software Renderer+ deriving Eq++{-| singleton class for storing the capabilities of the graphics card. +@remarks+This class stores the capabilities of the graphics card. This+information is set by the individual render systems.+-}+data RenderSystemCapabilities+ = RenderSystemCapabilities+ { rscDriverVersion :: DriverVersion+ , rscVendor :: GPUVendor -- ^ GPU Vendor++-- , rscNumWorldMatrices :: Int -- ^ The number of world matrices available+ , rscNumTextureUnits :: Int -- ^ The number of texture units available+ , rscStencilBufferBitDepth :: Int -- ^ The stencil buffer bit depth+-- , rscNumVertexBlendMatrices :: Int -- ^ The number of matrices available for hardware blending+ , rscCapabilities :: Set Capabilities -- ^ Stores the capabilities flags.++ , rscDeviceName :: String -- ^ The name of the device as reported by the render system+ , rscRenderSystemName :: String -- ^ The identifier associated with the render system for which these capabilities are valid++ , rscVertexProgramConstantFloatCount :: Int -- ^ The number of floating-point constants vertex programs support+ , rscVertexProgramConstantIntCount :: Int -- ^ The number of integer constants vertex programs support+ , rscVertexProgramConstantBoolCount :: Int -- ^ The number of boolean constants vertex programs support+ , rscGeometryProgramConstantFloatCount :: Int -- ^ The number of floating-point constants geometry programs support+ , rscGeometryProgramConstantIntCount :: Int -- ^ The number of integer constants vertex geometry support+ , rscGeometryProgramConstantBoolCount :: Int -- ^ The number of boolean constants vertex geometry support+ , rscFragmentProgramConstantFloatCount :: Int -- ^ The number of floating-point constants fragment programs support+ , rscFragmentProgramConstantIntCount :: Int -- ^ The number of integer constants fragment programs support+ , rscFragmentProgramConstantBoolCount :: Int -- ^ The number of boolean constants fragment programs support+ , rscNumMultiRenderTargets :: Int -- ^ The number of simultaneous render targets supported+ , rscMaxPointSize :: FloatType -- ^ The maximum point size+ , rscNonPOW2TexturesLimited :: Bool -- ^ Are non-POW2 textures feature-limited?+ , rscNumVertexTextureUnits :: Int -- ^ The number of vertex texture units supported+ , rscVertexTextureUnitsShared :: Bool -- ^ Are vertex texture units shared with fragment processor?+ , rscGeometryProgramNumOutputVertices :: Int -- ^ The number of vertices a geometry program can emit in a single run++ , rscSupportedShaderProfiles :: Set String -- ^ The list of supported shader profiles+ }+
+ Graphics/LambdaCube/Resource.hs view
@@ -0,0 +1,145 @@+module Graphics.LambdaCube.Resource where++import qualified Data.List as List+import Data.Map (Map)+import qualified Data.Map as Map+import Control.Monad+import System.Directory+import System.FilePath++import qualified Data.ByteString.Lazy as B+import qualified Data.ByteString as SB+import Data.ByteString.Internal as B+import Codec.Archive.Zip+import System.Log.Logger++import Graphics.LambdaCube.Loader.CompositorScript+import Graphics.LambdaCube.Loader.MaterialScript+import Graphics.LambdaCube.Loader.ResourceScript+import Graphics.LambdaCube.Compositor+import Graphics.LambdaCube.Material+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.GpuProgram+import Graphics.LambdaCube.World++-- load resources into resource library (initResources :: [ResourceGroup] -> ResourceLibrary)++{-+ Stores data about:+ - loaded meshes (name)+ - loaded and compiled materials (name)+-}++-- TODO: load all available materials+-- scan path tree searching for *.material files+data (Texture t, GpuProgram p, LinkedGpuProgram lp) => ResourceItem t p lp+ = RI_Material (String,Material t lp)+ | RI_GpuProgram (String,GpuProgramDescriptor p)+ | RI_Compositor (String,Compositor t lp)+ +addConfig cfgFile world = do+ Just rp <- loadResourcesCfg cfgFile+ addResourceLibrary rp world++addResourceLibrary resPath w@World { wrResource = res } = do+ -- fold on every group and path+ -- getDirectoryContents :: FilePath -> IO [FilePath]+ -- doesDirectoryExist :: FilePath -> IO Bool+ -- takeExtension :: FilePath -> String+ -- TODO:+ -- scan whole resource path searching for resource files and load them:+ -- .material+ -- .program+ -- add normal (uncompiled) materials to material library+ let loadResGrp s (_,l) = foldM loadRes s l+ loadRes l (PathZip,n) = return l+ loadRes l p@(PathDir,n) = do+ ok <- doesDirectoryExist n+ case ok of+ { True -> do+ c <- getDirectoryContents n+ foldM (loadItem n) l c+ ; False -> return l+ }+ loadItem dn l n = do+ --parseMaterial -> Maybe (mats,verts,frags)+ case takeExtension n of+ { ".material" -> do+ debugM "ResourceLibrary" $ "load: " ++ n+ f <- B.readFile $ dn ++ "/" ++ n -- FIXME: this is temporary solution+ mb <- parseMaterial n $ map B.w2c $ B.unpack f+ case mb of+ { Nothing -> do+ errorM "ResourceLibrary" $ "Syntax error in file " ++ n+ return l+ ; Just (ml,vpl,fpl) -> do+ let ms = [RI_Material (mtName m,m) | m <- ml]+ vs = [RI_GpuProgram (gpdName m,m) | m <- vpl]+ fs = [RI_GpuProgram (gpdName m,m) | m <- fpl]+ return $ l ++ ms ++ vs ++ fs+ }+ ; ".compositor" -> do+ debugM "ResourceLibrary" $ "load: " ++ n+ f <- B.readFile $ dn ++ "/" ++ n -- FIXME: this is temporary solution+ mb <- parseCompositor n $ map B.w2c $ B.unpack f+ case mb of+ { Nothing -> do+ errorM "ResourceLibrary" $ "Syntax error in file " ++ n+ return l+ ; Just cl -> do+ return $ l ++ [RI_Compositor (cmpName m,m) | m <- cl]+ }+ ; _ -> return l+ }+ insertList = List.foldl' (flip (uncurry Map.insert))+ l <- foldM loadResGrp [] resPath+ return w { wrResource = res + { rlResourceGroups = resPath ++ rlResourceGroups res+ , rlMaterialMap = insertList (rlMaterialMap res) [m | (RI_Material m) <- l]+ , rlGpuProgramMap = insertList (rlGpuProgramMap res) [m | (RI_GpuProgram m) <- l]+ , rlCompositorMap = insertList (rlCompositorMap res) [m | (RI_Compositor m) <- l]+ }+ }+ --ResourceLibrary (resPath++path) meshes (Map.union mats materialMap) texes (Map.union shads shaderMap) progs++{-+loadResourceGroup+dropResourceGroup+-}++{-+--compileMaterial+-- load textures from disk to opengl+-- drops unnecessary techniques (include,exlude rules)+compileMaterial :: ResourceLibrary -> String -> IO (ResourceLibrary,Material)+compileMaterial rlib m = do+ let mm = (rlMaterialMap rlib)+ if Map.notMember m mm then error ("Unknown material: " ++ m) else return ()+ let (mt,mcmt) = mm Map.! m+ (rlib',cmt) <- if isJust mcmt then return (rlib,fromMaybe (error "fromJust 0") mcmt) else compMat rlib mt -- copy original material data and load texture units+ return (rlib',cmt) where+ compMat rl mat@(Material {mtTechnique=techs}) = do+ debugM "ResourceLibrary" $ "compiling material: " ++ m+ (rl',techs') <- foldM compTechnique (rl,[]) techs+ let matmap' = insert m (mat,Just cmt') (rlMaterialMap rl) + cmt' = mat{mtTechnique=techs'}+ return (rl'{rlMaterialMap=matmap'},cmt')+ compTechnique (rl,l) t@(Technique {tcPass=p}) = do+ excl <- excludeTechnique t+ if excl then return (rl, l) else do+ (rl',p') <- foldM compPass (rl,[]) p+ return (rl',(l ++ [t{tcPass=p'}]))+ compPass (rl,l) p = do+ (rl',tu') <- foldM compTexUnit (rl,[]) $ psTextureUnit p+ let (ProgRefName prog) = psShaderProgram p+ (rl'',prog') <- compileProgram rl' prog+ return (rl'',(l ++ [p{psTextureUnit=tu', psShaderProgram=(ProgRefObj prog')}]))+ compTexUnit (rl,l) tu = do+ (rl',texid) <- loadTexture rl $ head $ tuTexture tu+ return (rl',(l ++ [tu{tuTextureObject=Just [texid]}]))+ excludeTechnique t@(Technique {tcPass=p}) = do+ -- exclude if shaders are not supported+ version <- GL.get (GL.majorMinor GL.glVersion)+ let reqShaders = not $ null $ filter (\(Pass {psShaderProgram=(ProgRefName (vp,pp))})-> isJust vp || isJust pp) p+ if reqShaders && version < (2,0) then return True else return False+-}
+ Graphics/LambdaCube/SceneGraph.hs view
@@ -0,0 +1,141 @@+module Graphics.LambdaCube.SceneGraph where++import Data.Maybe+import Data.Map as Map hiding (map)+import qualified Data.IntMap as IntMap+import Data.List as List+import Control.Monad+import System.FilePath++import Data.Graph.Inductive++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Common+import Graphics.LambdaCube.Math+import Graphics.LambdaCube.Light+import Graphics.LambdaCube.Material+import Graphics.LambdaCube.Entity+import Graphics.LambdaCube.Resource+import Graphics.LambdaCube.RenderQueue+import Graphics.LambdaCube.World+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.RenderSystem+ +--type MkSceneObjectAction = World -> IO (World, SceneObject)+--type MkNodeAction = ResourceLibrary -> IO (ResourceLibrary,(String,String),SceneNode)++--simpleCamera :: String -> MkSceneObjectAction+simpleCamera name w = return (w,cam)+ where+ cam = SO_Camera Camera+ { cmName = name+ , cmFov = 45+ , cmNear = 0.1+ , cmFar = 5000+ , cmAspectRatio = Nothing+ , cmPolygonMode = PM_SOLID+ }++--wireCamera :: String -> MkSceneObjectAction+wireCamera name w = return (w,cam)+ where+ cam = SO_Camera Camera+ { cmName = name+ , cmFov = 45+ , cmNear = 0.1+ , cmFar = 5000+ , cmAspectRatio = Nothing+ , cmPolygonMode = PM_WIREFRAME+ }++--light :: MkSceneObjectAction+light w = return (w,SO_Light $ Light {})++--camera :: Camera -> MkSceneObjectAction+camera cam w = return (w,SO_Camera cam)++--mesh :: String -> MkSceneObjectAction+mesh name w = do+ (w',e) <- createEntity w name name+ return (w', SO_Entity e)++--meshMat :: String -> [String] -> MkSceneObjectAction+meshMat name mats w0 = do+ (w1,e0) <- createEntity w0 name name+ (w2,e1) <- setEntityMaterial w1 mats e0+ return (w2, SO_Entity e1)++--mkNode :: String -> String -> Matrix4 -> [MkSceneObjectAction] -> MkNodeAction+mkNode parent name t objActs w = do+ (w',o) <- foldM mkObjs (w,[]) objActs+ return (w',(parent,name),SceneNode name o t)+ where+ mkObjs (w,l) a = do+ (w',so) <- a w+ return (w',so:l)+{-+addSkyBox :: String -> World -> IO World+addSkyBox s w@World { wrResource = rl, wrScene = scene } = do+ (rl',mat) <- compileMaterial rl s+ return w { wrResource = rl', wrScene = scene{scSky = Just $ SkyBox mat} }+-}++{-+data Scene = Scene+ { scGraph :: Gr String ()+ -- use: bytestring-trie (efficient ByteString map)+ , scMap :: Map String SceneNode+ , scSky :: Maybe Sky+ -- Fog settings+ }+-}+--addScene :: [MkNodeAction] -> World -> IO World+addScene nodes w@World { wrResource = rl, wrScene = scene } = do+ -- done: create scene nodes+ let mkNodes (w,pl,nl) a = do+ (w',p,sn) <- a w+ return (w',p:pl,sn:nl)+ (w',p,nodel) <- foldM mkNodes (w,[],[]) nodes+ -- done: register node ids and names to bimap+ -- done: create graph nodes + -- done: create graph edges+ let namel = map snName nodel+ nodeids = newNodes (length nodes) $ scGraph scene+ m' = (scMap scene) `Map.union` (Map.fromList $ zip namel $ zip nodeids nodel)+ g = insEdges (map fe p) $ insNodes (zip nodeids namel) $ scGraph scene+ fe (p,c) = (fst $ m' ! p, fst $ m' ! c,())+ scene' = scene + { scGraph = g+ , scMap = m'+ --, scSky :: Maybe Sky+ }++ return w' { wrScene = scene' }+ +--updateTransforms :: [(String,Matrix4)] -> World -> IO World+updateTransforms l = return . mapScene (\s -> foldr updateSceneNode s l)+ where+ updateSceneNode (name,mat) scene = scene { scMap = Map.insert name (n,sn') m}+ where+ m = scMap scene+ (n,sn) = m ! name+ sn' = sn {snTransform = mat}++--flattenScene :: Scene -> FlattenScene+flattenScene s = FlattenScene+ { fsCamera = [(m,c) | (m,SO_Camera c) <- fs]+ , fsRenderable = [(m,prepare m e,rq,pr) | (m,SO_Entity e) <- fs]+ , fsLight = [(m,l) | (m,SO_Light l) <- fs]+ }+ where+ rq = constRenderQueueMain+ pr = constRenderableDefaultPriority+ fs = visitNode s 0 $ transl 0 0 0++ --visitNode :: Scene -> Int -> Matrix4 -> [(Matrix4,SceneObject)]+ visitNode g n t = [(lt,e) | e <- snObject ln ] ++ (concat [ visitNode g sn lt | sn <- suc (scGraph g) n ])+ where+ Just name = lab (scGraph g) n+ ln = snd $ (scMap g) ! name+ lt = (snTransform ln) <> t+
+ Graphics/LambdaCube/Technique.hs view
@@ -0,0 +1,84 @@+module Graphics.LambdaCube.Technique where++import Graphics.LambdaCube.RenderSystemCapabilities+import Graphics.LambdaCube.Pass+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.GpuProgram++-- | illumination pass state type+data IlluminationPassesState+ = IPS_COMPILE_DISABLED+ | IPS_NOT_COMPILED+ | IPS_COMPILED+ deriving Eq++{-| Directive used to manually control technique support based on the+ inclusion or exclusion of some factor.+-}+data IncludeOrExclude+ = INCLUDE -- ^ Inclusive - only support if present+ | EXCLUDE -- ^ Exclusive - do not support if present+ deriving Eq++-- | Rule controlling whether technique is deemed supported based on GPU vendor+data GPUVendorRule+ = GPUVendorRule+ { gvrVendor :: GPUVendor+ , gvrIncludeOrExclude :: IncludeOrExclude+ }+ deriving Eq++-- | Rule controlling whether technique is deemed supported based on GPU device name+data GPUDeviceNameRule+ = GPUDeviceNameRule+ { gdrDevicePattern :: String+ , gdrIncludeOrExclude :: IncludeOrExclude+ , gdrCaseSensitive :: Bool+ }+ deriving Eq++{-| Class representing an approach to rendering this particular Material. +@remarks+ Ogre will attempt to use the best technique supported by the active hardware, + unless you specifically request a lower detail technique (say for distant+ rendering).+-}+data (Texture t, LinkedGpuProgram lp) => Technique t lp+ = Technique+ { tchPasses :: [Pass t lp] -- ^ List of primary passes+-- , tchIlluminationPasses :: [IlluminationPass] -- ^ List of derived passes, categorised into IlluminationStage (ordered)++-- , tchIsSupported :: Bool+-- IlluminationPassesState mIlluminationPassesCompilationPhase;+ , tchLodIndex :: Int -- ^ LOD level+ {-| Scheme index, derived from scheme name but the names are held on+ MaterialManager, for speed an index is used here.+ -}+ , tchSchemeIndex :: Int + , tchName :: String -- ^ optional name for the technique+ + {-| When casting shadow, if not using default Ogre shadow casting material, or + nor using fixed function casting, mShadowCasterMaterial let you customize per material+ shadow caster behavior+ -}+-- , tchShadowCasterMaterial :: Material+ {-| When casting shadow, if not using default Ogre shadow casting material, or + nor using fixed function casting, mShadowCasterMaterial let you customize per material+ shadow caster behavior.There only material name is stored so that it can be loaded once all file parsed in a resource group.+ -}+-- , tchShadowCasterMaterialName :: String+ {-| When receiving shadow, if not using default Ogre shadow receiving material, or + nor using fixed function texture projection receiving, mShadowReceiverMaterial let you customize per material+ shadow caster behavior+ -}+-- , tchShadowReceiverMaterial :: Material+ {-| When receiving shadow, if not using default Ogre shadow receiving material, or + nor using fixed function texture projection receiving, mShadowReceiverMaterial let you customize per material+ shadow caster behavior. There only material name is stored so that it can be loaded once all file parsed in a resource group.+ -}+-- , tchShadowReceiverMaterialName :: String++ , tchGPUVendorRules :: [GPUVendorRule]+ , tchGPUDeviceNameRules :: [GPUDeviceNameRule]+ }+
+ Graphics/LambdaCube/Texture.hs view
@@ -0,0 +1,81 @@+module Graphics.LambdaCube.Texture where++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.PixelFormat+import Graphics.LambdaCube.HardwareBuffer+++-- | Enum identifying the texture usage+data TextureUsage+ = TextureUsage+ { tuUsage :: Usage+ , tuAutoMipmap :: Bool -- ^ mipmaps will be automatically generated for this texture+ , tuRenderTarget :: Bool -- ^ this texture will be a render target, i.e. used as a target for render to texture+ -- setting this flag will ignore all other texture usages except TU_AUTOMIPMAP+ }+ deriving Eq+{-+enum TextureUsage+{+ /// @copydoc HardwareBuffer::Usage+ TU_STATIC = HardwareBuffer::HBU_STATIC,+ TU_DYNAMIC = HardwareBuffer::HBU_DYNAMIC,+ TU_WRITE_ONLY = HardwareBuffer::HBU_WRITE_ONLY,+ TU_STATIC_WRITE_ONLY = HardwareBuffer::HBU_STATIC_WRITE_ONLY, + TU_DYNAMIC_WRITE_ONLY = HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY,+ TU_DYNAMIC_WRITE_ONLY_DISCARDABLE = HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE,+ /// mipmaps will be automatically generated for this texture+ TU_AUTOMIPMAP = 0x100,+ /// this texture will be a render target, i.e. used as a target for render to texture+ /// setting this flag will ignore all other texture usages except TU_AUTOMIPMAP+ TU_RENDERTARGET = 0x200,+ /// default to automatic mipmap generation static textures+ TU_DEFAULT = TU_AUTOMIPMAP | TU_STATIC_WRITE_ONLY+ +};+-}++-- | Enum identifying the texture type+data TextureType+ = TEX_TYPE_1D -- ^ 1D texture, used in combination with 1D texture coordinates+ | TEX_TYPE_2D -- ^ 2D texture, used in combination with 2D texture coordinates (default)+ | TEX_TYPE_3D -- ^ 3D volume texture, used in combination with 3D texture coordinates+ | TEX_TYPE_CUBE_MAP -- ^ 3D cube map, used in combination with 3D texture coordinates+ deriving (Eq,Show)++-- | Enum identifying special mipmap numbers+data TextureMipmap+ = MIP_UNLIMITED -- ^ Generate mipmaps up to 1x1+ | MIP_DEFAULT -- ^ Use TextureManager default+ | MIP_NUMBER Int+ deriving Eq++class (Eq a, HardwareBuffer a) => Texture a where+ txName :: a -> String+ txWidth :: a -> Int+ txHeight :: a -> Int+ txDepth :: a -> Int+ txNumRequestedMipmaps :: a -> TextureMipmap+ txNumMipmaps :: a -> Int+ txMipmapsHardwareGenerated :: a -> Bool+ txGamma :: a -> FloatType+ txHwGamma :: a -> Bool+ txFSAA :: a -> Int+ txFSAAHint :: a -> String+ txTextureType :: a -> TextureType+ txFormat :: a -> PixelFormat++ --txUsage :: a -> TextureUsage+ txAutoMipmap :: a -> Bool -- ^ mipmaps will be automatically generated for this texture+ txRenderTarget :: a -> Bool -- ^ this texture will be a render target, i.e. used as a target for render to texture+ -- setting this flag will ignore all other texture usages except TU_AUTOMIPMAP++ txSrcFormat :: a -> PixelFormat+ txSrcWidth :: a -> Int+ txSrcHeight :: a -> Int+ txSrcDepth :: a -> Int++ txDesiredFormat :: a -> PixelFormat+ txDesiredIntegerBitDepth :: a -> Int+ txDesiredFloatBitDepth :: a -> Int+ txTreatLuminanceAsAlpha :: a -> Bool
+ Graphics/LambdaCube/TextureUnitState.hs view
@@ -0,0 +1,195 @@+module Graphics.LambdaCube.TextureUnitState where++import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Common+import Graphics.LambdaCube.BlendMode+import Graphics.LambdaCube.PixelFormat+import Graphics.LambdaCube.Texture+++{-| Definition of the broad types of texture effect you can apply to a texture unit.+@note+ Note that these have no effect when using the programmable pipeline, since their+ effect is overridden by the vertex / fragment programs.+-}+data TextureEffectType+ = ET_ENVIRONMENT_MAP -- ^ Generate all texture coords based on angle between camera and vertex+ | ET_PROJECTIVE_TEXTURE -- ^ Generate texture coords based on a frustum+ | ET_UVSCROLL -- ^ Constant u/v scrolling effect+ | ET_USCROLL -- ^ Constant u scrolling effect+ | ET_VSCROLL -- ^ Constant u/v scrolling effect+ | ET_ROTATE -- ^ Constant rotation+ | ET_TRANSFORM -- ^ More complex transform+ deriving Eq++{-| Enumeration to specify type of envmap.+@note+ Note that these have no effect when using the programmable pipeline, since their+ effect is overridden by the vertex / fragment programs.+-}+data EnvMapType+ = ENV_PLANAR -- ^ Envmap based on vector from camera to vertex position, good for planar geometry+ | ENV_CURVED -- ^ Envmap based on dot of vector from camera to vertex and vertex normal, good for curves+ | ENV_REFLECTION -- ^ Envmap intended to supply reflection vectors for cube mapping+ | ENV_NORMAL -- ^ Envmap intended to supply normal vectors for cube mapping+ +{-| Useful enumeration when dealing with procedural transforms.+@note+ Note that these have no effect when using the programmable pipeline, since their+ effect is overridden by the vertex / fragment programs.+-}+data TextureTransformType+ = TT_TRANSLATE_U+ | TT_TRANSLATE_V+ | TT_SCALE_U+ | TT_SCALE_V+ | TT_ROTATE++{-| Texture addressing modes - default is TAM_WRAP.+@note+ These settings are relevant in both the fixed-function and the+ programmable pipeline.+-}+data TextureAddressingMode+ = TAM_WRAP -- ^ Texture wraps at values over 1.0+ | TAM_MIRROR -- ^ Texture mirrors (flips) at joins over 1.0+ | TAM_CLAMP -- ^ Texture clamps at 1.0+ | TAM_BORDER -- ^ Texture coordinates outside the range [0.0, 1.0] are set to the border colour+ deriving Eq++-- | Texture addressing mode for each texture coordinate.+data UVWAddressingMode + = UVWAddressingMode+ { amU :: TextureAddressingMode+ , amV :: TextureAddressingMode+ , amW :: TextureAddressingMode+ }+ deriving Eq++-- | Enum identifying the frame indexes for faces of a cube map (not the composite 3D type.+data TextureCubeFace+ = CUBE_FRONT+ | CUBE_BACK+ | CUBE_LEFT+ | CUBE_RIGHT+ | CUBE_UP+ | CUBE_DOWN++{-+ = ET_ENVIRONMENT_MAP -- ^ Generate all texture coords based on angle between camera and vertex+ -- EnvMapType+ | ET_PROJECTIVE_TEXTURE -- ^ Generate texture coords based on a frustum+ | ET_UVSCROLL -- ^ Constant u/v scrolling effect+ -- speedX speedY+ | ET_ROTATE -- ^ Constant rotation+ -- speed+ | ET_TRANSFORM -- ^ More complex transform++xform info:+ - anim type (scroll,rotate,scale) + - wave type (sine,triangle,square,sawtooth,inversesawtooth)+ - base+ - frequency+ - phase+ - amplitude+-}+-- | Internal structure defining a texture effect.+data TextureEffect+ = TextureEffect+ { teType :: TextureEffectType+ , teSubType :: Int+ , teArg1 :: FloatType+ , teArg2 :: FloatType+ , teWaveType :: WaveformType+ , teBase :: FloatType+ , teFrequency :: FloatType+ , tePhase :: FloatType+ , teAmplitude :: FloatType+ }+ deriving Eq++-- | The type of unit to bind the texture settings to.+data BindingType+ = BT_FRAGMENT -- ^ Regular fragment processing unit - the default.+ | BT_VERTEX -- ^ Vertex processing unit - indicates this unit will be used for + -- a vertex texture fetch.+ deriving Eq+ +-- | Enum identifying the type of content this texture unit contains. +data ContentType+ = CONTENT_NAMED -- ^ Normal texture identified by name+ | CONTENT_SHADOW -- ^ A shadow texture, automatically bound by engine+ deriving Eq++-------------------------------------------------++{-| Class representing the state of a single texture unit during a Pass of a+ Technique, of a Material.+@remarks+ Texture units are pipelines for retrieving texture data for rendering onto+ your objects in the world. Using them is common to both the fixed-function and + the programmable (vertex and fragment program) pipeline, but some of the + settings will only have an effect in the fixed-function pipeline (for example, + setting a texture rotation will have no effect if you use the programmable+ pipeline, because this is overridden by the fragment program). The effect+ of each setting as regards the 2 pipelines is commented in each setting.+@par+ When I use the term 'fixed-function pipeline' I mean traditional rendering+ where you do not use vertex or fragment programs (shaders). Programmable + pipeline means that for this pass you are using vertex or fragment programs.+-}+data Texture t => TextureUnitState t+ = TextureUnitState+ { tusAnimDuration :: Maybe FloatType -- ^ Duration of animation in seconds+ , tusCubic :: Bool -- ^ is this a series of 6 2D textures to make up a cube?+ + , tusTextureType :: TextureType+ , tusDesiredFormat :: PixelFormat+ , tusTextureSrcMipmaps :: TextureMipmap -- ^ Request number of mipmaps++ , tusTextureCoordSetIndex :: Int+ , tusAddressMode :: UVWAddressingMode+ , tusBorderColour :: ColourValue++ , tusColourBlendMode :: LayerBlendModeEx+ , tusColourBlendFallbackSrc :: SceneBlendFactor+ , tusColourBlendFallbackDest :: SceneBlendFactor++ , tusAlphaBlendMode :: LayerBlendModeEx+-- mutable bool mTextureLoadFailed;+-- , tusTextureLoadFailed :: Bool+ , tusIsAlpha :: Bool+ , tusHwGamma :: Bool++-- mutable bool mRecalcTexMatrix;+ , tusUMod :: FloatType+ , tusVMod :: FloatType+ , tusUScale :: FloatType+ , tusVScale :: FloatType+ , tusRotate :: FloatType+-- mutable Matrix4 mTexModMatrix;++ , tusMinFilter :: FilterOptions -- ^ Texture filtering - minification+ , tusMagFilter :: FilterOptions -- ^ Texture filtering - magnification+ , tusMipFilter :: FilterOptions -- ^ Texture filtering - mipmapping++ , tusMaxAniso :: Int -- ^ Texture anisotropy+ , tusMipmapBias :: FloatType -- ^ Mipmap bias++-- bool mIsDefaultAniso;+-- bool mIsDefaultFiltering;+ , tusBindingType :: BindingType -- ^ Binding type (fragment or vertex pipeline)+ , tusContentType :: ContentType -- ^ Content type of texture (normal loaded texture, auto-texture)++ , tusFrameNames :: [String]+ , tusFrames :: Maybe [t]+ , tusName :: String -- ^ optional name for the TUS+ , tusTextureAlias :: String -- ^ optional alias for texture frames+ , tusEffects :: [TextureEffect]+--------------------------------------++ -- typedef multimap<TextureEffectType, TextureEffect>::type EffectMap;+ -- EffectMap mEffects;+ }+ deriving Eq+
+ Graphics/LambdaCube/Types.hs view
@@ -0,0 +1,26 @@+module Graphics.LambdaCube.Types where++import Foreign.C.Types++type FloatType = Float+--type FloatType = CFloat+--type FloatType = Double+--type FloatType = CDouble++data Matrix4 = Matrix4+ !FloatType !FloatType !FloatType !FloatType+ !FloatType !FloatType !FloatType !FloatType+ !FloatType !FloatType !FloatType !FloatType+ !FloatType !FloatType !FloatType !FloatType+ deriving (Read, Show, Eq)++data Vec4 = Vec4 !FloatType !FloatType !FloatType !FloatType+ deriving (Read, Show, Eq)+ ++type FloatType2 = (FloatType,FloatType)+type FloatType3 = (FloatType,FloatType,FloatType)+type FloatType4 = (FloatType,FloatType,FloatType,FloatType)++type RGB = FloatType3+type ColourValue = FloatType4
+ Graphics/LambdaCube/Utility.hs view
@@ -0,0 +1,11 @@+module Graphics.LambdaCube.Utility where++import Data.List++groupSetBy f l = foldl' g [] l+ where+ g el e = case partition ((f e) . head) el of+ { ([],el') -> [e]:el'+ ; ([gl],el') -> (e:gl):el'+ ; _ -> error "Invalid case!"+ }
+ Graphics/LambdaCube/VertexIndexData.hs view
@@ -0,0 +1,239 @@+module Graphics.LambdaCube.VertexIndexData where++import Graphics.LambdaCube.HardwareVertexBuffer+import Graphics.LambdaCube.HardwareIndexBuffer++-- | Summary class collecting together vertex source information.+data HardwareVertexBuffer vb => VertexData vb+ = VertexData+ { + {-| Declaration of the vertex to be used in this operation.+ @remarks Note that this is created for you on construction.+ -}+ vdVertexDeclaration :: VertexDeclaration+ {-| The vertex buffer bindings to be used. + @remarks Note that this is created for you on construction.+ -}+ , vdVertexBufferBinding :: VertexBufferBinding vb+ ---- | Whether this class should delete the declaration and binding+ --bool mDeleteDclBinding;+ -- | The base vertex index to start from+ , vdVertexStart :: Int+ -- | The number of vertices used in this operation+ , vdVertexCount :: Int+ }+ deriving Eq+-- | Struct used to hold hardware morph / pose vertex data information+--struct HardwareAnimationData+--{+-- const VertexElement* targetVertexElement;+-- Real parametric;+--};+--typedef vector<HardwareAnimationData>::type HardwareAnimationDataList;+-- | VertexElements used for hardware morph / pose animation+--HardwareAnimationDataList hwAnimationDataList;+-- | Number of hardware animation data items used+--size_t hwAnimDataItemsUsed;+ + {-| Clones this vertex data, potentially including replicating any vertex buffers.+ @param copyData Whether to create new vertex buffers too or just reference the existing ones+ @param mgr If supplied, the buffer manager through which copies should be made+ @remarks The caller is expected to delete the returned pointer when ready+ -}+-- VertexData* clone(bool copyData = true, HardwareBufferManagerBase* mgr = 0) const;++ {-| Modifies the vertex data to be suitable for use for rendering shadow geometry.+ @remarks+ Preparing vertex data to generate a shadow volume involves firstly ensuring that the + vertex buffer containing the positions is a standalone vertex buffer,+ with no other components in it. This method will therefore break apart any existing+ vertex buffers if position is sharing a vertex buffer. + Secondly, it will double the size of this vertex buffer so that there are 2 copies of + the position data for the mesh. The first half is used for the original, and the second + half is used for the 'extruded' version. The vertex count used to render will remain + the same though, so as not to add any overhead to regular rendering of the object.+ Both copies of the position are required in one buffer because shadow volumes stretch + from the original mesh to the extruded version. + @par+ It's important to appreciate that this method can fundamentally change the structure of your+ vertex buffers, although in reality they will be new buffers. As it happens, if other + objects are using the original buffers then they will be unaffected because the reference+ counting will keep them intact. However, if you have made any assumptions about the + structure of the vertex data in the buffers of this object, you may have to rethink them.+ -}+-- void prepareForShadowVolume(void);++ {-| Additional shadow volume vertex buffer storage. + @remarks+ This additional buffer is only used where we have prepared this VertexData for+ use in shadow volume construction, and where the current render system supports+ vertex programs. This buffer contains the 'w' vertex position component which will+ be used by that program to differentiate between extruded and non-extruded vertices.+ This 'w' component cannot be included in the original position buffer because+ DirectX does not allow 4-component positions in the fixed-function pipeline, and the original+ position buffer must still be usable for fixed-function rendering.+ @par + Note that we don't store any vertex declaration or vertex buffer binding here because this+ can be reused in the shadow algorithm.+ -}+-- HardwareVertexBufferSharedPtr hardwareShadowVolWBuffer;+++ {-| Reorganises the data in the vertex buffers according to the + new vertex declaration passed in. Note that new vertex buffers+ are created and written to, so if the buffers being referenced + by this vertex data object are also used by others, then the + original buffers will not be damaged by this operation.+ Once this operation has completed, the new declaration + passed in will overwrite the current one.+ @param newDeclaration The vertex declaration which will be used+ for the reorganised buffer state. Note that the new declaration+ must not include any elements which do not already exist in the + current declaration; you can drop elements by + excluding them from the declaration if you wish, however.+ @param bufferUsages Vector of usage flags which indicate the usage options+ for each new vertex buffer created. The indexes of the entries must correspond+ to the buffer binding values referenced in the declaration.+ @param mgr Optional pointer to the manager to use to create new declarations+ and buffers etc. If not supplied, the HardwareBufferManager singleton will be used+ -}+-- void reorganiseBuffers(VertexDeclaration* newDeclaration, const BufferUsageList& bufferUsage, +-- HardwareBufferManagerBase* mgr = 0);++ {-| Reorganises the data in the vertex buffers according to the + new vertex declaration passed in. Note that new vertex buffers+ are created and written to, so if the buffers being referenced + by this vertex data object are also used by others, then the + original buffers will not be damaged by this operation.+ Once this operation has completed, the new declaration + passed in will overwrite the current one.+ This version of the method derives the buffer usages from the existing+ buffers, by using the 'most flexible' usage from the equivalent sources.+ @param newDeclaration The vertex declaration which will be used+ for the reorganised buffer state. Note that the new delcaration+ must not include any elements which do not already exist in the + current declaration; you can drop elements by + excluding them from the declaration if you wish, however.+ @param mgr Optional pointer to the manager to use to create new declarations+ and buffers etc. If not supplied, the HardwareBufferManager singleton will be used+ -}+-- void reorganiseBuffers(VertexDeclaration* newDeclaration, HardwareBufferManagerBase* mgr = 0);++ {-| Remove any gaps in the vertex buffer bindings.+ @remarks+ This is useful if you've removed elements and buffers from this vertex+ data and want to remove any gaps in the vertex buffer bindings. This+ method is mainly useful when reorganising vertex data manually.+ @note+ This will cause binding index of the elements in the vertex declaration+ to be altered to new binding index.+ -}+-- void closeGapsInBindings(void);++ {-| Remove all vertex buffers that never used by the vertex declaration.+ @remarks+ This is useful if you've removed elements from the vertex declaration+ and want to unreference buffers that never used any more. This method+ is mainly useful when reorganising vertex data manually.+ @note+ This also remove any gaps in the vertex buffer bindings.+ -}+-- void removeUnusedBuffers(void);++ {-| Convert all packed colour values (VET_COLOUR_*) in buffers used to+ another type.+ @param srcType The source colour type to assume if the ambiguous VET_COLOUR+ is encountered.+ @param destType The destination colour type, must be VET_COLOUR_ABGR or+ VET_COLOUR_ARGB.+ -}+-- void convertPackedColour(VertexElementType srcType, VertexElementType destType);+++ {-| Allocate elements to serve a holder of morph / pose target data + for hardware morphing / pose blending.+ @remarks+ This method will allocate the given number of 3D texture coordinate + sets for use as a morph target or target pose offset (3D position).+ These elements will be saved in hwAnimationDataList.+ It will also assume that the source of these new elements will be new+ buffers which are not bound at this time, so will start the sources to + 1 higher than the current highest binding source. The caller is+ expected to bind these new buffers when appropriate. For morph animation+ the original position buffer will be the 'from' keyframe data, whilst+ for pose animation it will be the original vertex data.+ -}+-- void allocateHardwareAnimationElements(ushort count);+++++-- | Summary class collecting together index data source information.+data HardwareIndexBuffer ib => IndexData ib+ = IndexData+ { idIndexBuffer :: ib -- ^ pointer to the HardwareIndexBuffer to use, must be specified if useIndexes = true+ , idIndexStart :: Int -- ^ index in the buffer to start from for this operation+ , idIndexCount :: Int -- ^ The number of indexes to use from the buffer+ }+ deriving Eq+ + {-| Clones this index data, potentially including replicating the index buffer.+ @param copyData Whether to create new buffers too or just reference the existing ones+ @param mgr If supplied, the buffer manager through which copies should be made+ @remarks The caller is expected to delete the returned pointer when finished+ -}+-- IndexData* clone(bool copyData = true, HardwareBufferManagerBase* mgr = 0) const;++ {-| Re-order the indexes in this index data structure to be more+ vertex cache friendly; that is to re-use the same vertices as close+ together as possible. + @remarks+ Can only be used for index data which consists of triangle lists.+ It would in fact be pointless to use it on triangle strips or fans+ in any case.+ -}+-- void optimiseVertexCacheTriList(void);+++{-| Vertex cache profiler.+@remarks+ Utility class for evaluating the effectiveness of the use of the vertex+ cache by a given index buffer.+-}+{-+class _OgreExport VertexCacheProfiler : public BufferAlloc+{+ public:+ enum CacheType {+ FIFO, LRU+ };++ VertexCacheProfiler(unsigned int cachesize = 16, CacheType cachetype = FIFO )+ : size ( cachesize ), type ( cachetype ), tail (0), buffersize (0), hit (0), miss (0)+ {+ cache = OGRE_ALLOC_T(uint32, size, MEMCATEGORY_GEOMETRY);+ };++ ~VertexCacheProfiler()+ {+ OGRE_FREE(cache, MEMCATEGORY_GEOMETRY);+ }++ void profile(const HardwareIndexBufferSharedPtr& indexBuffer);+ void reset() { hit = 0; miss = 0; tail = 0; buffersize = 0; };+ void flush() { tail = 0; buffersize = 0; };++ unsigned int getHits() { return hit; };+ unsigned int getMisses() { return miss; };+ unsigned int getSize() { return size; };+ private:+ unsigned int size;+ uint32 *cache;+ CacheType type;++ unsigned int tail, buffersize;+ unsigned int hit, miss;++ bool inCache(unsigned int index);+};+-}
+ Graphics/LambdaCube/World.hs view
@@ -0,0 +1,904 @@+{-# LANGUAGE MultiParamTypeClasses #-}+module Graphics.LambdaCube.World where++import Data.Maybe+import qualified Data.List as List+import Data.Map (Map,(!))+import qualified Data.Map as Map+import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap+import Control.Applicative+import Control.Monad+import System.Directory+import System.FilePath++import System.Log.Logger+import Data.Graph.Inductive+import qualified Data.ByteString.Lazy as B+import qualified Data.ByteString as SB+import qualified Data.ByteString.Internal as SB+import Codec.Archive.Zip++import Graphics.LambdaCube.Common+import Graphics.LambdaCube.Loader.ResourceScript+import Graphics.LambdaCube.Loader.MeshXML+import Graphics.LambdaCube.Compositor+import Graphics.LambdaCube.Material+import Graphics.LambdaCube.Pass+import Graphics.LambdaCube.Technique+import Graphics.LambdaCube.TextureUnitState+import Graphics.LambdaCube.PixelFormat+import Graphics.LambdaCube.Math+import Graphics.LambdaCube.Light+import Graphics.LambdaCube.Image+import Graphics.LambdaCube.Entity+import Graphics.LambdaCube.Mesh+import Graphics.LambdaCube.Types+import Graphics.LambdaCube.Texture+import Graphics.LambdaCube.GpuProgram+import Graphics.LambdaCube.GpuProgramUsage+import Graphics.LambdaCube.RenderQueue+import Graphics.LambdaCube.RenderSystem+import Graphics.LambdaCube.HardwareBuffer+import Graphics.LambdaCube.HardwareVertexBuffer+import Graphics.LambdaCube.HardwareIndexBuffer+--import Graphics.LambdaCube.Resource+import Graphics.LambdaCube.RenderOperation+++-- * World++data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => FlattenScene vb ib t lp+ = FlattenScene+ { fsRenderable :: [(Matrix4,[RenderEntity vb ib t lp],Int,Int)] -- ^ List of Renderable information including WorldMatrix RenderQueueID and RenderPriority+ , fsCamera :: [(Matrix4,Camera)]+ , fsLight :: [(Matrix4,Light)]+ }++data RenderSystem r vb ib q t p lp => World r vb ib q t p lp+ = World+ { wrResource :: ResourceLibrary vb ib t p lp -- IO related+ , wrRenderSystem :: r -- IO related+ , wrScene :: Scene vb ib t lp+ , wrTargets :: Map String (RenderTarget t lp)+ , wrRenderOptions :: IntMap RenderGroupOptions+ , wrImageLoaders :: [ImageLoader]+ }++mapResource f w = w { wrResource = f (wrResource w) }+mapScene f w = w { wrScene = f (wrScene w) }+mapTargets f w = w { wrTargets = f (wrTargets w) }++mkWorld :: RenderSystem r vb ib q t p lp => r -> [ImageLoader] -> IO (World r vb ib q t p lp)+mkWorld rs imgLoaders = return World+ { wrResource = mkResource+ , wrRenderSystem = rs+ , wrScene = mkScene+ , wrTargets = Map.empty+ , wrRenderOptions = IntMap.empty + , wrImageLoaders = imgLoaders+ }++mkResource :: (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, GpuProgram p, LinkedGpuProgram lp) => ResourceLibrary vb ib t p lp+mkResource = ResourceLibrary [] Map.empty Map.empty Map.empty Map.empty Map.empty Map.empty++mkScene :: (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => Scene vb ib t lp+--mkScene = Scene (mkUGraph [0] []) (IntMap.fromList [(0, SceneNode "Root" [] (transl 0 0 0))]) (Map.fromList [("Root",0)]) Nothing+-- TODO: update for new scene structure+mkScene = Scene+ { scGraph = mkGraph [(0,"Root")] []+ -- use: bytestring-trie (efficient ByteString map)+ , scMap = Map.fromList [("Root", (0,SceneNode "Root" [] (transl 0 0 0)))]+ , scSky = Nothing+ }++-- * Resource++data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, GpuProgram p, LinkedGpuProgram lp) => ResourceLibrary vb ib t p lp+ = ResourceLibrary+ { rlResourceGroups :: [ResourceGroup]+ , rlMeshMap :: Map String (Mesh vb ib)+ , rlMaterialMap :: Map String (Material t lp)+ , rlTextureMap :: Map String t+ , rlGpuProgramMap :: Map String (GpuProgramDescriptor p)+ , rlLinkedGpuProgramMap :: Map (String,String,String) lp+ , rlCompositorMap :: Map String (Compositor t lp)+ }++-- * SceneGraph++data Camera+ = Camera+ { cmName :: String+ , cmFov :: FloatType+ , cmNear :: FloatType+ , cmFar :: FloatType+ , cmAspectRatio :: Maybe FloatType+ , cmPolygonMode :: PolygonMode -- ^ Rendering type+ }+{-+ name CDATA #IMPLIED+ id ID #IMPLIED+ FOVy CDATA "45"+ aspectRatio CDATA "1.3333333"+ projectionType (perspective | orthographic) "perspective"+ polygonMode (points | wireframe | solid) "solid"+ useRenderingDistance (yes | no) "yes"+ lodBiasFactor CDATA "1.0"+-}+cameraProjectionMatrix :: FloatType -> Camera -> Matrix4+cameraProjectionMatrix a cam = perpectiveMatrix fov aspect near far+ where+ Camera+ { cmFov = fov+ , cmNear = near+ , cmFar = far+ , cmAspectRatio = aspectr+ } = cam+ aspect = fromMaybe a aspectr+ +data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => SceneObject vb ib t lp+ = SO_Entity (Entity vb ib t lp)+ | SO_Camera Camera+ | SO_Light Light+-- | SO_ParticleSystem ParticleSystem++--data RenderTarget+-- = RT_MainBuffer+-- | RT_FrameBuffer + +{-+data RenderWindow = RenderWindow+ { rwWidth :: Int+ , rwHeight :: Int+ , rwViewport :: [Viewport]+ --, rtTarget -- texture or screen+ }+-}++data (Texture t, LinkedGpuProgram lp) => RenderTarget t lp+ = RenderTarget+ { rtName :: String+ , rtWidth :: Int+ , rtHeight :: Int+ , rtViewport :: [Viewport t lp]+ , rtTexture :: Maybe String+ }++data (Texture t, LinkedGpuProgram lp) => Viewport t lp+ = Viewport+ { vpLeft :: FloatType+ , vpTop :: FloatType+ , vpWidth :: FloatType+ , vpHeight :: FloatType+ , vpCamera :: String --Camera+ , vpCompositors :: [Compositor t lp]+ , vpBackColour :: ColourValue+ , vpClearEveryFrame :: Bool+ , vpClearBuffers :: FrameBufferType+ }++--getViewportSize :: RenderTarget -> Viewport -> (Int,Int,Int,Int)+getViewportSize t v = (x,y,w,h)+ where+ ww = fromIntegral $ rtWidth t+ wh = fromIntegral $ rtHeight t+ x = floor $ ww * (vpLeft v)+ y = floor $ wh * (vpTop v)+ w = floor $ ww * (vpWidth v)+ h = floor $ wh * (vpHeight v)+ +data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => SceneNode vb ib t lp+ = SceneNode+ { snName :: String+ , snObject :: [SceneObject vb ib t lp]+ , snTransform :: Matrix4+ }-- deriving (Show,Read)+ +data Sky+ = SkyBox --Material+ | SkyDome+ | SkyPlane+ +{-+data Scene = Scene+ { scGraph :: Gr () ()+-- , scMap :: Map Int SceneNode+ , scMap :: IntMap SceneNode+ , scNameMap :: Map String Int + , scSky :: Maybe Sky+ -- Fog settings+ }+-}++data (HardwareVertexBuffer vb, HardwareIndexBuffer ib, Texture t, LinkedGpuProgram lp) => Scene vb ib t lp+ = Scene+ { scGraph :: Gr String ()+ -- use: bytestring-trie (efficient ByteString map)+ , scMap :: Map String (Int,SceneNode vb ib t lp) -- ^ Contains GraphNodeID and SceneNode.+ , scSky :: Maybe Sky+ -- Fog settings+ }++getMesh name world = case Map.lookup name (rlMeshMap rl) of+ Nothing -> do+ f <- loadFile (rlResourceGroups rl) name+ when (isNothing f) $ error $ "File not found: " ++ name+ m <- case takeExtension name of+ ".xml" -> do+ debugM "ResourceLibrary" $ "parsing mesh XML file " ++ name+ parseMesh rs $ map SB.w2c $ B.unpack $ fromMaybe (error "fromJust 9") f+ _ -> error ("Unsupported format!")+ return (m,world { wrResource = rl { rlMeshMap = Map.insert name m (rlMeshMap rl) } })+ Just m -> return (m,world)+ where+ rl = wrResource world+ rs = wrRenderSystem world++--loadMaterialResources :: ResourceLibrary -> Material -> IO (ResourceLibrary,Material)+loadMaterialResources rs loaders reslib0 mat = case isJust $ mtSupportedTechniques mat of+ { True -> return (reslib0,mat) -- Material is already initialized+ ; False -> do+ let isSupportedTech _ = True -- TODO+ loadImage name = do+ d <- loadFile (rlResourceGroups reslib0) name+ case d of+ { Just imgdata -> do+ let loadImg img loader = case img of+ { Just _ -> return img+ ; Nothing -> loader name imgdata+ }+ foldM loadImg Nothing loaders+ ; Nothing -> do+ debugM "Load image" $ "File not found: " ++ name+ return Nothing+ }+ loadTextureUnit (rl0,tl) t = do+ let loadTexture (rl0',tl') texname = case Map.lookup texname $ rlTextureMap rl0' of+ { Just t -> return (rl0',t:tl') -- texture is loaded+ ; Nothing -> do -- we have to create it+ -- TODO: create and load texture via render system+ i <- loadImage texname+ case i of+ { Just img -> do+ {-+ virtual TexturePtr createManual(const String & name, const String& group,+ TextureType texType, uint width, uint height, uint depth, + int num_mips, PixelFormat format, int usage = TU_DEFAULT, ManualResourceLoader* loader = 0,+ bool hwGammaCorrection = false, uint fsaa = 0, const String& fsaaHint = StringUtil::BLANK);+ + { imName :: String+ , imHeight :: Int+ , imWidth :: Int+ , imDepth :: Int+ , imSize :: Int+ , imNumMipmaps :: Int+-- uint flags;+ , imFormat :: PixelFormat+ , imData :: (Ptr Word8) -- ^ Image can be empty+ }+ mkGLTexture :: String -> TextureType -> Int -> Int -> Int -> Int -> PixelFormat -> TextureUsage -> Bool -> Int -> String -> IO GLTexture+ mkGLTexture name texType width height depth numMips format usage hwGammaCorrection fsaa fsaaHint = do+ -}+ --createTexture :: a -> String -> TextureType -> Int -> Int -> Int -> Int -> PixelFormat -> TextueUsage -> Bool -> Int -> String -> IO t+ let usage = TextureUsage HBU_STATIC True False+ t <- createTexture rs texname (tusTextureType t) (imWidth img) (imHeight img) (imDepth img)+ (tusTextureSrcMipmaps t) (tusDesiredFormat t) usage (tusHwGamma t) 0 "" $ Just [img]+ -- TODO+ --let t = undefined+ let texmap = rlTextureMap rl0'+ return (rl0' { rlTextureMap = Map.insert texname t texmap },t:tl')+ ; Nothing -> do+ debugM "Load texture" $ "No proper image codec was found: " ++ texname+ return (rl0',tl')+ }+ }+ let loadCubicTexture rl0' texname = case Map.lookup (concat texname) $ rlTextureMap rl0' of+ { Just t -> return (rl0',[t]) -- texture is loaded+ ; Nothing -> do -- we have to create it+ -- TODO: create and load texture via render system+ i <- mapM loadImage texname+ case all isJust i of+ { True -> do+ let usage = TextureUsage HBU_STATIC True False+ img = fromJust $ head i+ t <- createTexture rs (concat texname) (tusTextureType t) (imWidth img) (imHeight img) (imDepth img)+ (tusTextureSrcMipmaps t) (tusDesiredFormat t) usage (tusHwGamma t) 0 "" $ Just $ map fromJust i+ let texmap = rlTextureMap rl0'+ return (rl0' { rlTextureMap = Map.insert (concat texname) t texmap },[t])+ ; False -> do+ debugM "Load texture" $ "No proper image codec was found: " ++ concat texname+ return (rl0',[])+ }+ }+ -- load textures+ -- TODO: load all frames+ (rl1,tex) <- case tusTextureType t of+ { TEX_TYPE_CUBE_MAP -> loadCubicTexture rl0 $ tusFrameNames t+ ; _ -> foldM loadTexture (rl0,[]) $ tusFrameNames t+ } + let frames = reverse tex -- TODO: wrong in cubemap case+ return (rl1,(t { tusFrames = Just frames }):tl)+ loadShader (rl0,sl) sn = case Map.lookup sn $ rlGpuProgramMap rl0 of+ { Nothing -> do+ errorM "loadShader" $ "Unknown GpuProgram: " ++ sn+ return (rl0,sl)+ ; Just gpd -> case gpdGpuProgram gpd of+ { Just p -> return (rl0,p:sl)+ ; Nothing -> do+ -- GpuProgram is not loaded yet+ let fname = gpdFilename gpd+ msource <- loadFile (rlResourceGroups rl0) fname+ case msource of+ { Nothing -> do+ errorM "loadShader" $ "GpuProgram source not found: " ++ sn ++ " - " ++ fname+ return (rl0,sl)+ ; Just src -> do+ eprog <- createGpuProgram rs (gpdType gpd) $ map SB.w2c $ B.unpack src+ case eprog of+ { Right err -> do+ errorM "loadShader" $ "Error compile " ++ sn ++ ": " ++ err+ return (rl0,sl)+ ; Left prog -> do+ debugM "loadShader" $ "GpuProgram loaded: " ++ sn+ let gpd' = gpd { gpdGpuProgram = Just prog }+ gpmap = Map.insert sn gpd' $ rlGpuProgramMap rl0+ return (rl0 { rlGpuProgramMap = gpmap }, prog:sl)+ }+ }+ }+ }+ loadPass (rl0,pl) p = do+ -- load GpuPrograms+ (rl1,mlgp) <- case psLinkedGpuProgram p of+ { Just lgp -> return (rl0,Just lgp)+ ; Nothing -> do+ let getName Nothing = ""+ getName (Just u) = gpuProgramName u+ progName = (getName $ psVertexProgramUsage p, getName $ psFragmentProgramUsage p, getName $ psGeometryProgramUsage p)+ (vpn,fpn,gpn) = progName+ gpuprogmap = rlGpuProgramMap rl0+ collectNames cl [] = return cl+ collectNames cl nl = do+ -- check list nl+ let a = filter (`notElem` cl) nl+ getAttach m = case Map.lookup m gpuprogmap of+ { Nothing -> do+ errorM "loadShader" $ "Unknown attached GpuProgram: " ++ m+ return []+ ; Just gp -> return $ gpdAttach gp+ }+ b <- mapM getAttach a+ collectNames (cl ++ a) $ concat b+ -- collect required shaders name list+ progNames <- collectNames [] $ filter (/="") [vpn,fpn,gpn]+ case null progNames of+ { True -> return (rl0,Nothing)+ ; False -> do+ -- load all shader+ (rl1,progs) <- foldM loadShader (rl0,[]) progNames+ case Map.lookup progName $ rlLinkedGpuProgramMap rl1 of+ { Just lp -> return (rl1,Just lp)+ ; Nothing -> do+ -- create LinkedGpuProgram+ elprog <- createLinkedGpuProgram rs progs+ case elprog of+ { Right err -> do+ errorM "loadGpuProgram" $ "Error link " ++ (show progName) ++ ": " ++ err+ return (rl1,Nothing)+ ; Left lprog -> do+ debugM "loadGpuProgram" $ "GpuProgram linked: " ++ (show progName)+ let lprogmap = rlLinkedGpuProgramMap rl1+ lprogmap' = Map.insert progName lprog lprogmap+ return (rl1 { rlLinkedGpuProgramMap = lprogmap' },Just lprog)+ }+ }+ }+ }+ -- load textureunitstates (Texture)+ (rl2,texUnits) <- foldM loadTextureUnit (rl1,[]) $ psTextureUnitStates p+ return (rl2,(p { psTextureUnitStates = reverse texUnits, psLinkedGpuProgram = mlgp }):pl)+ loadTechnique (rl0,tl) t = do+ -- load passes (GpuProgram)+ (rl1,passes) <- foldM loadPass (rl0,[]) $ tchPasses t+ return (rl1,(t { tchPasses = reverse passes }):tl)+ -- select and load supported techniques+ (reslib1,suppTech) <- foldM loadTechnique (reslib0,[]) $ filter isSupportedTech $ mtTechniques mat+ -- Insert loaded material into MaterialMap+ let matmap = rlMaterialMap reslib1+ mat' = mat { mtSupportedTechniques = Just $ reverse suppTech }+ reslib2 = reslib1 { rlMaterialMap = Map.insert (mtName mat') mat' matmap }+ return (reslib2,mat')+ }++--getLoadedMaterial :: String -> World -> IO (World,Maybe Material)+--NOTE: this should return with Nothing if there's no supported technique+getLoadedMaterial matname world0 = case Map.lookup matname $ rlMaterialMap $ wrResource world0 of+ { Nothing -> do+ errorM "loadMaterial" $ "Material not found: " ++ matname+ return (world0,Nothing)+ ; Just mat0 -> case isJust $ mtSupportedTechniques mat0 of+ { True -> return (world0,Just mat0)+ ; False -> do+ let rs = wrRenderSystem world0+ loaders = wrImageLoaders world0+ rl0 = wrResource world0+ (rl1,mat1) <- loadMaterialResources rs loaders rl0 mat0+ --TODO: this should return with Nothing if there's no supported technique+ return (world0 { wrResource = rl1 },Just mat1)+ }+ }++--setEntityMaterial :: World -> [String] -> Entity -> IO (World,Entity)+setEntityMaterial world0 mats ent = do+ let reslib1 = wrResource world0+ rs = wrRenderSystem world0+ loaders = wrImageLoaders world0+ setSubEntMat (rl1,ses) (sent,matname) = do+ let matmap = (rlMaterialMap rl1)+ (rl2,mat) <- case Map.lookup matname matmap of+ { Just m -> do+ loadMaterialResources rs loaders rl1 m+ ; Nothing -> do+ error $ "Material not found: " ++ matname+ }+ return (rl2,sent { seMaterial = mat } : ses)+ + (reslib2,subents) <- foldM setSubEntMat (reslib1,[]) $ zip (enSubEntityList ent) mats+ return (world0 { wrResource = reslib2 },ent { enSubEntityList = reverse subents })+ +--createEntity :: World -> String -> String -> IO (World,Entity)+createEntity world0 ename mname = do+ -- lookup mesh, load if not exists+ --debugM "ResourceLibrary" $ "creating entity: \"" ++ ename ++ "\" from mesh: \"" ++ mname ++ "\""+ (mesh,world1) <- getMesh mname world0+ --debugM "ResourceLibrary" " done"++ let reslib1 = wrResource world1+ rs = wrRenderSystem world1+ loaders = wrImageLoaders world1+ mkSubent (rl1,ses) smesh = do+ let matname = (smMaterialName smesh)+ matmap = (rlMaterialMap rl1)+ (rl2,mat) <- case Map.lookup matname matmap of+ { Just m -> do+ loadMaterialResources rs loaders rl1 m+ ; Nothing -> do+ --debugM "createEntity" $ "Material not found: " ++ matname+ -- TODO+ error $ "Material not found: " ++ matname+ --loadMaterialResources rs loaders rl1 (matmap ! "WarningMaterial")+ }+ return (rl2,SubEntity { seMaterial = mat, seSubMesh = smesh } : ses)++ (reslib2,subents) <- foldM mkSubent (reslib1,[]) (msSubMeshList mesh)++ let ent = Entity+ { enName = ename+ , enRenderQueue = constRenderQueueMain+ , enMesh = mesh+ , enSubEntityList = reverse subents+ }++ return (world1 { wrResource = reslib2 },ent)++--loadFile :: [ResourceGroup] -> String -> Maybe ByteString+loadFile respath fname = foldM (\s (_,l)->foldM load s l) Nothing respath+ where+ load s@(Just str) _ = return s+ load s (PathZip,n) = do+ -- TODO: this is a naive implementation with poor perfomance+ f <- B.readFile n+ let a = toArchive f+ return $ fmap fromEntry $ findEntryByPath fname a+ load Nothing (PathDir,n) = do+ let ffname = (addTrailingPathSeparator n) ++ fname+ e <- doesFileExist ffname+ ret <- if e then B.readFile ffname else return B.empty+ return $ if e then Just ret else Nothing++renderWorld time name flatScene world = do+ -- TODO+ -- collect all render textures+ -- render the world on all render textures+ -- render the world last to the given named target+ + -- forall viewports:+ -- setup viewport related matrices+ -- render scene+ case Map.lookup name targetMap of+ { Nothing -> do+ debugM "renderWold" $ "RenderTarget not found: " ++ name+ return world+ ; Just t -> do+ let targets = Map.elems targetMap+ (tg,tgs) = List.partition ((== name) . rtName) targets+ (rtl,rwl) = List.partition (isNothing . rtTexture) tgs+ mapM_ renderTarget $ rtl ++ rwl ++ tg+ return world+ }+ where+ targetMap = wrTargets world+ rs = wrRenderSystem world++ renderTarget rt = do+ -- TODO: calc render statistics+ let t = rtTexture rt+ -- call setRenderTarget rs+ mapM_ (renderViewport flatScene rt) $ rtViewport rt + --if isNothing t then return () else do+ --let tex = txObject $ (rlTextureMap $ wrResource world) ! (fromMaybe (error "fromJust 0") t)+ --GL.textureBinding GL.Texture2D $= Just tex+ -- only hint code: glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 128, 128, 0);+ --GL.copyTexImage2D Nothing 0 GL.RGBA' (GL.Position 0 0) (GL.TextureSize2D w' h') 0+ --return ()+ + renderViewport fs rtarget v = do+ let (vx,vy,vw,vh) = getViewportSize rtarget v+ setViewport rs vx vy vw vh+ + -- Clear the viewport if required+ when (vpClearEveryFrame v) $+ clearFrameBuffer rs (vpClearBuffers v) (vpBackColour v) 1 0+ + -- Begin the frame+ --mDestRenderSystem->_beginFrame();+ + -- Set rasterisation mode+ setPolygonMode rs $ cmPolygonMode cam+ + -- Set initial camera state+ setProjectionMatrix rs $ cameraProjectionMatrix (fromIntegral vw / fromIntegral vh) cam+ + --mDestRenderSystem->_setTextureProjectionRelativeTo(mCameraRelativeRendering, camera->getDerivedPosition());+ --setTextureProjectionRelativeTo+ + setViewMatrix rs cameraViewMatrix + + -- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+ -- TODO: activate compositor chain render target if necessary+ -- (re)initialize compositor resources if necessary+ -- foreach compositor+ -- select technique+ -- create render textures+ -- initialize target passes+ -- do render+ -- foreach compositor and target pass+ -- bind target pass+ -- execute each composition pass in target pass+ --HINT:+ -- ++ -- FIXME: TEMP CODE + unless (null $ vpCompositors v) $ do+ -- bind render texture+ return ()++ -- render objects+ rstat <- renderQueue time rs (wrRenderOptions world) emptyRenderStatistics $ fsRenderable fs+-- print rstat++ -- Compositor+ -- TargetPass+ -- Pass+ forM_ (vpCompositors v) $ \c -> do + let ct = head $ fromMaybe (error "fromJust 112") $ cmpSupportedTechniques c+ -- select first technique+ forM (zip [0..] $ ctTargetPasses ct ++ [ctOutputTarget ct]) $ \(ctpidx,ctp) -> do+ -- -- copy previous output to target's output when input is previous+ when (ctpInputMode ctp == IM_PREVIOUS) $ do+ -- FIXME+ dirtyHackCopyTexImage rs (fromMaybe (error "fromJust 212") $ tdTexture $ fromJust $ ctpOutput ctp) vx vy vw vh+ forM (ctpPasses ctp) $ \cp -> do+ -- do composition pass action+ case cpType cp of+ { PT_RENDERQUAD -> do+ -- TODO+ -- setup quad material+ -- render quad+ let quadM = fromMaybe (error "fromJust 312") $ Map.lookup "Quad.mesh.xml" (rlMeshMap $ wrResource world)+ quadSM = head $ msSubMeshList quadM+ quadSE = SubEntity { seMaterial = fromMaybe (error "fromJust 412") $ cpMaterial cp, seSubMesh = quadSM }+ quadE = Entity "" constRenderQueueMain quadM [quadSE]+ quadRE = head $ prepare (transl 0 0 0) quadE+ quadRP = [RenderablePass (reOperation quadRE) p (transl 0 0 0) [] | p <- rePassList quadRE]+ setProjectionMatrix rs $ transl 0 0 0+ setViewMatrix rs $ transl 0 0 0+ setPolygonMode rs PM_SOLID+ renderPassGroup time rs emptyRenderStatistics quadRP+ return ()+ ; _ -> return ()+ }+{-+ unless (null $ vpCompositors v) $ do+ -- FIXME: TEMP CODE + -- unbind render texture, and we'll have the rendered scene in a texture+ -- create a custom temp pass with temp render texture input+ -- create quad render operation+ let quadSM = head $ msSubMeshList $ fromJust $ Map.lookup "Quad.mesh.xml" (rlMeshMap $ wrResource world)+ quadRO = RenderOperation+ { roVertexData = fromJust $ smVertexData quadSM + , roOperationType = smOperationType quadSM+ , roIndexData = smIndexData quadSM+ }+ quadP = head $ tchPasses $ head $ fromJust $ mtSupportedTechniques $ fromJust $ Map.lookup "QuadMaterial" (rlMaterialMap $ wrResource world)+ quadRP = RenderablePass+ { rpOperation = quadRO+ , rpPass = quadP'+ , rpMatrix = transl 0 0 0+ , rpLights = []+ }+ rtex = fromJust $ Map.lookup "RenderTex01" $ (rlTextureMap $ wrResource world)+ tus = psTextureUnitStates quadP+ tu = head tus+ tut = tail tus+ tu' = tu { tusFrames = Just [rtex] }+ quadP' = quadP { psTextureUnitStates = (tu':tut) }+ --setProjectionMatrix rs $ cameraProjectionMatrix (fromIntegral vw / fromIntegral vh) cam+ setProjectionMatrix rs $ transl 0 0 0+ setViewMatrix rs $ transl 0 0 0+ dirtyHackCopyTexImage rs rtex vx vy vw vh+ setPolygonMode rs PM_SOLID+ renderPassGroup rs [quadRP]+ -- invert back+ --dirtyHackCopyTexImage rs rtex vx vy vw vh+-} --renderPassGroup rs [quadRP]+ return () + +{-+ = RenderOperation+ { roVertexData :: VertexData vb -- ^ Vertex source data+ , roOperationType :: OperationType -- ^ The type of operation to perform+ , roIndexData :: Maybe (IndexData ib) -- ^ Index data - only valid if useIndexes is true+ }+ = RenderablePass+ { rpOperation :: RenderOperation vb ib+ , rpPass :: Pass t lp+ , rpMatrix :: Matrix4+ , rpLights :: [(Matrix4,Light)]+ }+--renderPassGroup :: RenderSystem -> RenderablePass -> IO ()+-} + -- do a manual render for temp pass (we should reset world, view, projection and texture matrix)+ + +---------------------------------------------------------------------+ -- push flatten scene into a render queue+ -- collect lights which affect each renderable+ -- fold addRenderable+ -- call renderQueue+ --let addRend (m,rend,grpID,prior) rq = addRenderable m rend (map snd $ fsLight fs) grpID prior rq+ --renderQueue' rs $ foldr addRend emptyRenderQueue $ fsRenderable fs+ -- old code below-------------------------------------------------------------------------------------------+ --mapM_ (renderEntity (wrRenderSystem world)) $ optimize $ foldr (\(m,r) l -> (prepare m r) ++ l) [] [(a,b) | (a,b,_,_) <- fsRenderable fs]+ where+ (camMat,cam) = head $ Prelude.filter (\(_,a) -> camName == (cmName a)) cams+ camName = vpCamera v+ cams = fsCamera fs+ (Matrix4+ r11 r12 r13 _+ r21 r22 r23 _+ r31 r32 r33 _+ tx ty tz _) = camMat+ {-+ cameraViewMatrix = (Matrix4+ r11 r21 r31 0+ r12 r22 r32 0+ r13 r23 r33 0+ (-tx) (-ty) (-tz) 1)+ -}+ cameraViewMatrix = camMat++-- createTexture :: a -> String -> TextureType -> Int -> Int -> Int -> TextureMipmap -> PixelFormat -> TextureUsage -> Bool -> Int -> String -> Image -> IO t+addRenderTexture n w h world = do+ let rl = wrResource world+ tm = rlTextureMap rl+ rs = wrRenderSystem world+ t <- createTexture rs n TEX_TYPE_2D w h 1 (MIP_NUMBER 1) PF_R8G8B8A8 (TextureUsage HBU_STATIC True False) False 0 "" Nothing+ return world { wrResource = rl { rlTextureMap = Map.insert n t tm } }+ --mapResource f w = w { wrResource = f (wrResource w) }++--addRenderWindow :: String -> Int -> Int -> [Viewport] -> World -> IO World +addRenderWindow n w h l world = do+ vl <- mapM (\f -> f world) l+ let rt = RenderTarget+ { rtName = n+ , rtWidth = w+ , rtHeight = h+ , rtViewport = vl+ , rtTexture = Nothing+ }+ return $ mapTargets (Map.insert n rt) world++ {-+ = Compositor+ { cmpName :: String+ , cmpTechniques :: [CompositionTechnique t]+ , cmpSupportedTechniques :: Maybe [CompositionTechnique t]+ }++ = CompositionTechnique+ { ctTextureDefinitions :: [TextureDefinition t]+ , ctTargetPasses :: [CompositionTargetPass] -- ^ Intermediate target passes+ , ctOutputTarget :: CompositionTargetPass -- ^ Output target pass (can be only one)+ , ctSchemeName :: String -- ^ Optional scheme name+ }++ = TextureDefinition+ { tdName :: String+ , tdWidth :: Maybe Int -- Nothing means adapt to target width+ , tdHeight :: Maybe Int -- Nothing means adapt to target height+ , tdWidthFactor :: FloatType -- multiple of target width to use (if width = Nothing)+ , tdHeightFactor :: FloatType -- multiple of target height to use (if height = Nothing)+ , tdFormatList :: [PixelFormat] -- more than one means MRT+ , tdFsaa :: Bool -- FSAA enabled; true = determine from main target (if render_scene), false = disable+ , tdHwGammaWrite :: Bool -- Do sRGB gamma correction on write (only 8-bit per channel formats) + , tdShared :: Bool -- whether to use shared textures for this one+ , tdTexture :: Maybe t+ }++ = CompositionTargetPass+ { ctpInputMode :: InputMode -- ^ Input name+ , ctpOutputName :: String -- ^ (local) output texture+ , ctpOutput :: Maybe (TextureDefinition t)+ , ctpPasses :: [CompositionPass] -- ^ Passes+ , ctpOnlyInitial :: Bool -- ^ This target pass is only executed initially after the effect has been enabled.+ , ctpVisibilityMask :: Word32 -- ^ Visibility mask for this render+ , ctpLodBias :: FloatType -- ^ LOD bias of this render+ , ctpMaterialScheme :: String -- ^ Material scheme name+ , ctpShadowsEnabled :: Bool -- ^ Shadows option+ }++ = InputTex+ { itName :: String -- ^ Name (local) of the input texture+ , itMrtIndex :: Int -- ^ MRT surface index if applicable+ }++ = CompositionPass+ { cpType :: PassType -- ^ Type of composition pass+ , cpIdentifier :: Word32 -- ^ Identifier for this pass+ , cpMaterialName :: String -- ^ Material used for rendering+ , cpMaterial :: Maybe (Material t lp)+ , cpFirstRenderQueue :: Int -- ^ [first,last] render queue to render this pass (in case of PT_RENDERSCENE)+ , cpLastRenderQueue :: Int+ , cpClearBuffers :: (Bool,Bool,Bool) -- ^ Clear buffers (in case of PT_CLEAR), hint: [colour] [depth] [stencil]+ , cpClearColour :: ColourValue -- ^ Clear colour (in case of PT_CLEAR)+ , cpClearDepth :: FloatType -- ^ Clear depth (in case of PT_CLEAR)+ , cpClearStencil :: Word32 -- ^ Clear stencil value (in case of PT_CLEAR)+ , cpInputs :: IntMap InputTex -- ^ Inputs (for material used for rendering the quad)+ , cpStencilCheck :: Bool -- ^ Stencil operation parameters+ , cpStencilFunc :: CompareFunction+ , cpStencilRefValue :: Word32+ , cpStencilMask :: Word32+ , cpStencilFailOp :: StencilOperation+ , cpStencilDepthFailOp :: StencilOperation+ , cpStencilPassOp :: StencilOperation+ , cpStencilTwoSidedOperation :: Bool+ , cpQuadCornerModified :: Bool -- ^ true if quad should not cover whole screen+ , cpQuadLeft :: FloatType -- ^ quad positions in normalised coordinates [-1;1]x[-1;1] (in case of PT_RENDERQUAD)+ , cpQuadTop :: FloatType+ , cpQuadRight :: FloatType+ , cpQuadBottom :: FloatType+ , cpQuadFarCorners :: Bool+ , cpQuadFarCornersViewSpace :: Bool+ }++data PassType+ = PT_CLEAR -- ^ Clear target to one colour+ | PT_STENCIL -- ^ Set stencil operation+ | PT_RENDERSCENE -- ^ Render the scene or part of it+ | PT_RENDERQUAD -- ^ Render a full screen quad+ -}+-- | Create render textures, and setup compositor chain.+mkCompositorChain wr0 cl0 = do+ -- do we really need this ???? -- HINT: add an implicit target to first compositor which renders the scene into a viewportsized texture, + -- iterate trough compositors and select first supported technique+ let rs = wrRenderSystem wr0+ initCompositor (world0,cl) c = do -- :: (World,[Maybe Compositor]) -> Compositor -> (World,[Maybe Compositor])+ -- TODO: select first supported technique+ let ct = head $ cmpTechniques c+ tds <- forM (ctTextureDefinitions ct) $ \td -> do+ -- create render textures+ let w = fromMaybe 1 $ tdWidth td+ h = fromMaybe 1 $ tdHeight td+ txn = (cmpName c ++ "/" ++ tdName td)+ t <- createTexture rs txn TEX_TYPE_2D w h 1 (MIP_NUMBER 1) (head $ tdFormatList td) (TextureUsage HBU_STATIC True False) False 0 "" Nothing+ debugM "Initialize Compositor" $ "Created compositor texture: " ++ txn+ return td { tdTexture = Just t }+ + let texmap = Map.fromList [(tdName td,td) | td <- tds]+ onamel = map ctpOutputName $ ctTargetPasses ct+ outtexl = [Map.lookup o texmap | o <- onamel]+ checkTex b tn = case Map.member tn texmap of+ { True -> return b+ ; False -> do+ errorM "Initialize Compositor" $ "Unknown compositor texture: " ++ tn+ return False+ }+ oktex <- foldM checkTex True onamel+ case oktex of+ { False -> return (world0,Nothing:cl)+ ; True -> do+ -- setup compositor target pass output+ let tps0 = [tp { ctpOutput = o } | (o,tp) <- zip outtexl $ ctTargetPasses ct]+ initPasses (w0,tpl,okPasses) tp = do+ let initPass (w0,pl,okPass) cp = case cpType cp of+ { PT_RENDERQUAD -> do+ -- setup composition pass input+ -- load material+ (w1,mmat) <- getLoadedMaterial (cpMaterialName cp) w0+ case mmat of+ { Nothing -> return (w1,cp:pl,False)+ ; Just mat -> do+ -- check pass input texture names+ okInput <- foldM checkTex True [itName it | it <- IntMap.elems $ cpInputs cp]+ case okInput of+ { False -> return (w1,cp:pl,False)+ ; True -> do+ -- foreach material pass and for each textureunitstate+ -- setup texture when it's a RT+ let fp p = p { psTextureUnitStates = tul' }+ where+ tul' = [tu { tusFrames = fromMaybe (tusFrames tu) $ ft i } | (i,tu) <- tusl]+ ft i = case IntMap.lookup i $ cpInputs cp of+ { Nothing -> Nothing+ ; Just it -> Just $ Just [fromJust $ tdTexture $ texmap Map.! (itName it)]+ }+ tusl = zip [0..] $ psTextureUnitStates p+ mat' = mat { mtSupportedTechniques = Just [tch { tchPasses = [fp p | p <- tchPasses tch] } | tch <- fromJust $ mtSupportedTechniques mat] } + --return with modified pass attached to the list+ return (w1,(cp { cpMaterial = Just mat' }):pl,okPass)+ }+ }+ ; _ -> return (w0,cp:pl,okPass)+ }+ + (w1,pl,okPasses') <- foldM initPass (w0,[],okPasses) $ ctpPasses tp+ return (w1,(tp { ctpPasses = reverse pl }):tpl, okPasses')+ + (world1,tps1,okInit1) <- foldM initPasses (world0,[],True) tps0+ (world2,motp,okInit2) <- initPasses (world1,[],okInit1) $ ctOutputTarget ct+ case okInit2 of+ { False -> return (world2,Nothing:cl)+ ; True -> do+ let otp = head motp+ tps2 = reverse tps1 -- [tp | Just tp <- tps1]+ return (world2,(Just c { cmpSupportedTechniques = Just [ct { ctTextureDefinitions = tds, ctTargetPasses = tps2, ctOutputTarget = otp }] }):cl)+ }+ }+ -- setup compositor target pass input+ (wr1,cl1) <- foldM initCompositor (wr0,[]) cl0+ let cl2 = reverse [c | Just c <- cl1]+ -- TODO: setup compositor chain connection+ return (wr1,cl2)++-- | Create a viewport and attach given compositors.+mkViewport x y w h cam cnl world0 = do+ -- collect compositors+ let compMap = rlCompositorMap $ wrResource world0+ getCompositor l cn = case Map.lookup cn compMap of+ { Nothing -> do+ errorM "ApplyCompositor" $ "Unknown compositor: " ++ cn+ return l+ ; Just c -> return $ c:l+ }+ + -- setup compositor chain+ cl0 <- foldM getCompositor [] cnl+ (world1,cl1) <- mkCompositorChain world0 $ reverse cl0+ return Viewport+ { vpLeft = x+ , vpTop = y+ , vpWidth = w+ , vpHeight = h+ , vpCamera = cam+ , vpCompositors = cl1+ , vpBackColour = (0,0,0,0)+ , vpClearEveryFrame = True+ , vpClearBuffers = FrameBufferType True True False+ }++--updateTargetSize :: String -> Int -> Int -> World -> IO World+updateTargetSize n w h = return . mapTargets (Map.adjust f n)+ where + f t = t { rtWidth = w, rtHeight = h }
+ LICENSE view
@@ -0,0 +1,28 @@+Copyright (c) 2009, Csaba Hruska+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++1. Redistributions of source code must retain the above copyright notice,+ this list of conditions and the following disclaimer.++2. Redistributions in binary form must reproduce the above copyright+ notice, this list of conditions and the following disclaimer in the+ documentation and/or other materials provided with the distribution.++3. Neither the name of the author nor the names of its contributors may be+ used to endorse or promote products derived from this software without+ specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE+POSSIBILITY OF SUCH DAMAGE.
+ README view
@@ -0,0 +1,18 @@+This is all highly experimental. Check out the examples package and+the website for further details.++There is one important feature that none of the examples can use due+to the way cabal deals with data files. You can specify the paths to+your resources in an ini-style config file, which looks something like+this:++# Comment+[Section]+Zip=path/to/resources-1.zip+Zip=path/to/resources-2.zip+FileSystem=path/to/more/resources/1+FileSystem=path/to/more/resources/2+...++You can use the addConfig function (found in comments in all the+examples) to load this file.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ lambdacube-engine.cabal view
@@ -0,0 +1,113 @@+name: lambdacube-engine+version: 0.1.1+cabal-version: >= 1.6 && < 2+build-type: Simple+license: BSD3+license-file: LICENSE+author: Csaba Hruska+maintainer: csaba (dot) hruska (at) gmail (dot) com+stability: experimental+homepage: http://www.haskell.org/haskellwiki/LambdaCubeEngine+category: Graphics+tested-with: GHC == 6.10.1, GHC == 6.10.4+synopsis: 3D rendering engine entirely written in Haskell+description: + LambdaCube is a 3D rendering engine written entirely in Haskell.+ It targets newer graphics hardware. The engine uses Ogre3D's mesh+ and material file format. The main goal of this project is to+ provide a modern and feature rich graphical backend for various+ haskell projects (e.g. FRP libraries).+extra-source-files:+ README+ Graphics/LambdaCube/Loader/Makefile+ Graphics/LambdaCube/Loader/CompositorScriptScanner.x+ Graphics/LambdaCube/Loader/FontDefinitionScriptScanner.x+ Graphics/LambdaCube/Loader/MaterialScriptScanner.x+ Graphics/LambdaCube/Loader/OverlayScriptScanner.x+ Graphics/LambdaCube/Loader/ResourceScriptScanner.x++library+ build-depends: + base >= 4.0.0.0 && < 5,+ zip-archive >= 0.1.1.3 && < 1,+ binary >= 0.5.0.1 && < 1,+ uulib >= 0.9.10 && < 1,+ OpenGL >= 2.2.3 && < 3,+ bytestring >= 0.9.1.4 && < 1,+ xml >= 1.3 && < 2,+ stb-image >= 0.1.3 && < 1,+ filepath >= 1.1.0.1 && < 2,+ directory >= 1.0.0.2 && < 2,+ array,+ containers >= 0.2 && < 1,+ fgl,+ hslogger+ exposed-modules:+ Graphics.LambdaCube+ Graphics.LambdaCube.Compositor+-- Graphics.LambdaCube.HardwareBufferManager+ Graphics.LambdaCube.World+ Graphics.LambdaCube.Light+ Graphics.LambdaCube.GpuProgram+-- Graphics.LambdaCube.MovableObject+ Graphics.LambdaCube.TextureUnitState+ Graphics.LambdaCube.VertexIndexData+ Graphics.LambdaCube.GpuProgramParams+ Graphics.LambdaCube.Types+ Graphics.LambdaCube.Image+-- Graphics.LambdaCube.HardwarePixelBuffer+ Graphics.LambdaCube.Common+ Graphics.LambdaCube.HardwareIndexBuffer+ Graphics.LambdaCube.Texture+-- Graphics.LambdaCube.ParticleSystem+ Graphics.LambdaCube.Technique+ Graphics.LambdaCube.GpuProgramUsage+ Graphics.LambdaCube.PixelFormat+ Graphics.LambdaCube.AnimationState+ Graphics.LambdaCube.Pass+ Graphics.LambdaCube.Material+ Graphics.LambdaCube.RenderSystemCapabilities+-- Graphics.LambdaCube.Overlay+-- Graphics.LambdaCube.Loader.ParticleSystemScript+ Graphics.LambdaCube.Loader.Generated.CompositorScriptScanner+ Graphics.LambdaCube.Loader.Generated.ResourceScriptScanner+-- Graphics.LambdaCube.Loader.Generated.FontDefinitionScriptScanner+ Graphics.LambdaCube.Loader.Generated.MaterialScriptScanner+-- Graphics.LambdaCube.Loader.Generated.OverlayScriptScanner+ Graphics.LambdaCube.Loader.MeshXML+ Graphics.LambdaCube.Loader.MaterialScript+-- Graphics.LambdaCube.Loader.LMeshBinary+ Graphics.LambdaCube.Loader.ParserUtil+-- Graphics.LambdaCube.Loader.OverlayScript+ Graphics.LambdaCube.Loader.CompositorScript+ Graphics.LambdaCube.Loader.StbImage+ Graphics.LambdaCube.Loader.ResourceScript+ Graphics.LambdaCube.Math+ Graphics.LambdaCube.SceneGraph+ Graphics.LambdaCube.HardwareBuffer+ Graphics.LambdaCube.Resource+ Graphics.LambdaCube.Mesh+ Graphics.LambdaCube.RenderSystem+ Graphics.LambdaCube.RenderQueue+ Graphics.LambdaCube.Frustum+ Graphics.LambdaCube.RenderSystem.GL+ Graphics.LambdaCube.RenderSystem.GL.GLGpuProgram+ Graphics.LambdaCube.RenderSystem.GL.GLCapabilities+ Graphics.LambdaCube.RenderSystem.GL.GLTexture+ Graphics.LambdaCube.RenderSystem.GL.GLUtils+ Graphics.LambdaCube.RenderSystem.GL.GLOcclusionQuery+ Graphics.LambdaCube.RenderSystem.GL.GLRenderSystem+ Graphics.LambdaCube.RenderSystem.GL.GLVertexBuffer+ Graphics.LambdaCube.RenderSystem.GL.GLIndexBuffer+ Graphics.LambdaCube.Entity+ Graphics.LambdaCube.HardwareVertexBuffer+ Graphics.LambdaCube.BlendMode+ Graphics.LambdaCube.RenderOperation+ Graphics.LambdaCube.Utility+ Graphics.LambdaCube.HardwareOcclusionQuery++-- Graphics.LambdaCube+-- Graphics.LambdaCube.Loader.StbImage+-- Graphics.LambdaCube.RenderSystem.GL++ ghc-options: -O2 -Wall