packages feed

language-c 0.3.2.1 → 0.4.1

raw patch · 35 files changed

+4847/−2078 lines, 35 filesdep ~basePVP ok

version bump matches the API change (PVP)

Dependency ranges changed: base

API changes (from Hackage documentation)

- Language.C.Analysis.AstAnalysis: analyseExtDecls :: MonadTrav m => CDecl -> m ()
- Language.C.Analysis.Debug: instance Pretty (Either VarDecl FunDef)
- Language.C.Analysis.Debug: instance Pretty (Either VarDecl ObjDef)
- Language.C.Analysis.SemRep: TypeOfExpr :: Expr -> Type
- Language.C.Analysis.SemRep: derefTypeDef :: Type -> Type
- Language.C.Analysis.SemRep: hasTypeOfExpr :: Type -> Bool
- Language.C.Analysis.SemRep: isFunctionType :: Type -> Bool
- Language.C.Analysis.SemRep: referencedType :: Type -> Maybe Type
- Language.C.Data: Position :: String -> {-# UNPACK #-} !Int -> {-# UNPACK #-} !Int -> Position
- Language.C.Data: posColumn :: Position -> Int
- Language.C.Data: posFile :: Position -> String
- Language.C.Data: posRow :: Position -> Int
- Language.C.Data.Node: instance Read NodeInfo
- Language.C.Data.Position: Position :: String -> {-# UNPACK #-} !Int -> {-# UNPACK #-} !Int -> Position
- Language.C.Data.Position: instance Read Position
- Language.C.Data.Position: tabPos :: Position -> Position
- Language.C.Syntax.AST: data CArrSize
- Language.C.Syntax.AST: data CAsmOperand
- Language.C.Syntax.AST: data CAsmStmt
- Language.C.Syntax.AST: data CAttr
- Language.C.Syntax.AST: data CBlockItem
- Language.C.Syntax.AST: data CBuiltin
- Language.C.Syntax.AST: data CConst
- Language.C.Syntax.AST: data CDecl
- Language.C.Syntax.AST: data CDeclSpec
- Language.C.Syntax.AST: data CDeclr
- Language.C.Syntax.AST: data CDerivedDeclr
- Language.C.Syntax.AST: data CDesignator
- Language.C.Syntax.AST: data CEnum
- Language.C.Syntax.AST: data CExpr
- Language.C.Syntax.AST: data CExtDecl
- Language.C.Syntax.AST: data CFunDef
- Language.C.Syntax.AST: data CInit
- Language.C.Syntax.AST: data CStat
- Language.C.Syntax.AST: data CStorageSpec
- Language.C.Syntax.AST: data CStrLit
- Language.C.Syntax.AST: data CStructUnion
- Language.C.Syntax.AST: data CTranslUnit
- Language.C.Syntax.AST: data CTypeQual
- Language.C.Syntax.AST: data CTypeSpec
- Language.C.Syntax.AST: instance CNode CAsmOperand
- Language.C.Syntax.AST: instance CNode CAsmStmt
- Language.C.Syntax.AST: instance CNode CAttr
- Language.C.Syntax.AST: instance CNode CBlockItem
- Language.C.Syntax.AST: instance CNode CBuiltin
- Language.C.Syntax.AST: instance CNode CConst
- Language.C.Syntax.AST: instance CNode CDecl
- Language.C.Syntax.AST: instance CNode CDeclSpec
- Language.C.Syntax.AST: instance CNode CDeclr
- Language.C.Syntax.AST: instance CNode CDerivedDeclr
- Language.C.Syntax.AST: instance CNode CDesignator
- Language.C.Syntax.AST: instance CNode CEnum
- Language.C.Syntax.AST: instance CNode CExpr
- Language.C.Syntax.AST: instance CNode CExtDecl
- Language.C.Syntax.AST: instance CNode CFunDef
- Language.C.Syntax.AST: instance CNode CInit
- Language.C.Syntax.AST: instance CNode CStat
- Language.C.Syntax.AST: instance CNode CStorageSpec
- Language.C.Syntax.AST: instance CNode CStrLit
- Language.C.Syntax.AST: instance CNode CStructUnion
- Language.C.Syntax.AST: instance CNode CTranslUnit
- Language.C.Syntax.AST: instance CNode CTypeQual
- Language.C.Syntax.AST: instance CNode CTypeSpec
- Language.C.Syntax.AST: instance Data CArrSize
- Language.C.Syntax.AST: instance Data CAsmOperand
- Language.C.Syntax.AST: instance Data CAsmStmt
- Language.C.Syntax.AST: instance Data CAttr
- Language.C.Syntax.AST: instance Data CBlockItem
- Language.C.Syntax.AST: instance Data CBuiltin
- Language.C.Syntax.AST: instance Data CConst
- Language.C.Syntax.AST: instance Data CDecl
- Language.C.Syntax.AST: instance Data CDeclSpec
- Language.C.Syntax.AST: instance Data CDeclr
- Language.C.Syntax.AST: instance Data CDerivedDeclr
- Language.C.Syntax.AST: instance Data CDesignator
- Language.C.Syntax.AST: instance Data CEnum
- Language.C.Syntax.AST: instance Data CExpr
- Language.C.Syntax.AST: instance Data CExtDecl
- Language.C.Syntax.AST: instance Data CFunDef
- Language.C.Syntax.AST: instance Data CInit
- Language.C.Syntax.AST: instance Data CStat
- Language.C.Syntax.AST: instance Data CStorageSpec
- Language.C.Syntax.AST: instance Data CStrLit
- Language.C.Syntax.AST: instance Data CStructUnion
- Language.C.Syntax.AST: instance Data CTranslUnit
- Language.C.Syntax.AST: instance Data CTypeQual
- Language.C.Syntax.AST: instance Data CTypeSpec
- Language.C.Syntax.AST: instance Eq CStorageSpec
- Language.C.Syntax.AST: instance Ord CStorageSpec
- Language.C.Syntax.AST: instance Pos CAsmOperand
- Language.C.Syntax.AST: instance Pos CAsmStmt
- Language.C.Syntax.AST: instance Pos CAttr
- Language.C.Syntax.AST: instance Pos CBlockItem
- Language.C.Syntax.AST: instance Pos CBuiltin
- Language.C.Syntax.AST: instance Pos CConst
- Language.C.Syntax.AST: instance Pos CDecl
- Language.C.Syntax.AST: instance Pos CDeclSpec
- Language.C.Syntax.AST: instance Pos CDeclr
- Language.C.Syntax.AST: instance Pos CDerivedDeclr
- Language.C.Syntax.AST: instance Pos CDesignator
- Language.C.Syntax.AST: instance Pos CEnum
- Language.C.Syntax.AST: instance Pos CExpr
- Language.C.Syntax.AST: instance Pos CExtDecl
- Language.C.Syntax.AST: instance Pos CFunDef
- Language.C.Syntax.AST: instance Pos CInit
- Language.C.Syntax.AST: instance Pos CStat
- Language.C.Syntax.AST: instance Pos CStorageSpec
- Language.C.Syntax.AST: instance Pos CStrLit
- Language.C.Syntax.AST: instance Pos CStructUnion
- Language.C.Syntax.AST: instance Pos CTranslUnit
- Language.C.Syntax.AST: instance Pos CTypeQual
- Language.C.Syntax.AST: instance Pos CTypeSpec
- Language.C.Syntax.AST: instance Show CStorageSpec
- Language.C.Syntax.AST: instance Typeable CArrSize
- Language.C.Syntax.AST: instance Typeable CAsmOperand
- Language.C.Syntax.AST: instance Typeable CAsmStmt
- Language.C.Syntax.AST: instance Typeable CAttr
- Language.C.Syntax.AST: instance Typeable CBlockItem
- Language.C.Syntax.AST: instance Typeable CBuiltin
- Language.C.Syntax.AST: instance Typeable CConst
- Language.C.Syntax.AST: instance Typeable CDecl
- Language.C.Syntax.AST: instance Typeable CDeclSpec
- Language.C.Syntax.AST: instance Typeable CDeclr
- Language.C.Syntax.AST: instance Typeable CDerivedDeclr
- Language.C.Syntax.AST: instance Typeable CDesignator
- Language.C.Syntax.AST: instance Typeable CEnum
- Language.C.Syntax.AST: instance Typeable CExpr
- Language.C.Syntax.AST: instance Typeable CExtDecl
- Language.C.Syntax.AST: instance Typeable CFunDef
- Language.C.Syntax.AST: instance Typeable CInit
- Language.C.Syntax.AST: instance Typeable CStat
- Language.C.Syntax.AST: instance Typeable CStorageSpec
- Language.C.Syntax.AST: instance Typeable CStrLit
- Language.C.Syntax.AST: instance Typeable CStructUnion
- Language.C.Syntax.AST: instance Typeable CTranslUnit
- Language.C.Syntax.AST: instance Typeable CTypeQual
- Language.C.Syntax.AST: instance Typeable CTypeSpec
+ Language.C.Analysis.AstAnalysis: FunCtx :: VarDecl -> StmtCtx
+ Language.C.Analysis.AstAnalysis: LValue :: ExprSide
+ Language.C.Analysis.AstAnalysis: LoopCtx :: StmtCtx
+ Language.C.Analysis.AstAnalysis: RValue :: ExprSide
+ Language.C.Analysis.AstAnalysis: SwitchCtx :: StmtCtx
+ Language.C.Analysis.AstAnalysis: analyseDecl :: MonadTrav m => Bool -> CDecl -> m ()
+ Language.C.Analysis.AstAnalysis: analyseFunctionBody :: MonadTrav m => NodeInfo -> VarDecl -> CStat -> m Stmt
+ Language.C.Analysis.AstAnalysis: data ExprSide
+ Language.C.Analysis.AstAnalysis: data StmtCtx
+ Language.C.Analysis.AstAnalysis: defaultMD :: MachineDesc
+ Language.C.Analysis.AstAnalysis: defineParams :: MonadTrav m => NodeInfo -> VarDecl -> m ()
+ Language.C.Analysis.AstAnalysis: instance Eq ExprSide
+ Language.C.Analysis.AstAnalysis: instance Show ExprSide
+ Language.C.Analysis.AstAnalysis: tDesignator :: MonadTrav m => Type -> [CDesignator] -> m Type
+ Language.C.Analysis.AstAnalysis: tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type
+ Language.C.Analysis.AstAnalysis: tStmt :: MonadTrav m => [StmtCtx] -> CStat -> m Type
+ Language.C.Analysis.Builtins: builtins :: DefTable
+ Language.C.Analysis.ConstEval: MachineDesc :: (IntType -> Integer) -> (FloatType -> Integer) -> (BuiltinType -> Integer) -> Integer -> Integer -> (IntType -> Integer) -> (FloatType -> Integer) -> (BuiltinType -> Integer) -> Integer -> Integer -> MachineDesc
+ Language.C.Analysis.ConstEval: alignofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer
+ Language.C.Analysis.ConstEval: boolValue :: CExpr -> Maybe Bool
+ Language.C.Analysis.ConstEval: builtinAlign :: MachineDesc -> BuiltinType -> Integer
+ Language.C.Analysis.ConstEval: builtinSize :: MachineDesc -> BuiltinType -> Integer
+ Language.C.Analysis.ConstEval: compSize :: MonadTrav m => MachineDesc -> CompTypeRef -> m Integer
+ Language.C.Analysis.ConstEval: constEval :: MonadTrav m => MachineDesc -> Map Ident CExpr -> CExpr -> m CExpr
+ Language.C.Analysis.ConstEval: data MachineDesc
+ Language.C.Analysis.ConstEval: fAlign :: MachineDesc -> FloatType -> Integer
+ Language.C.Analysis.ConstEval: fSize :: MachineDesc -> FloatType -> Integer
+ Language.C.Analysis.ConstEval: iAlign :: MachineDesc -> IntType -> Integer
+ Language.C.Analysis.ConstEval: iSize :: MachineDesc -> IntType -> Integer
+ Language.C.Analysis.ConstEval: intExpr :: (Pos n, MonadName m) => n -> Integer -> m CExpr
+ Language.C.Analysis.ConstEval: intOp :: CBinaryOp -> Integer -> Integer -> Integer
+ Language.C.Analysis.ConstEval: intUnOp :: CUnaryOp -> Integer -> Maybe Integer
+ Language.C.Analysis.ConstEval: intValue :: CExpr -> Maybe Integer
+ Language.C.Analysis.ConstEval: ptrAlign :: MachineDesc -> Integer
+ Language.C.Analysis.ConstEval: ptrSize :: MachineDesc -> Integer
+ Language.C.Analysis.ConstEval: sizeofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer
+ Language.C.Analysis.ConstEval: voidAlign :: MachineDesc -> Integer
+ Language.C.Analysis.ConstEval: voidSize :: MachineDesc -> Integer
+ Language.C.Analysis.ConstEval: withWordBytes :: Int -> Integer -> Integer
+ Language.C.Analysis.Debug: instance (Pretty a, Pretty b) => Pretty (Either a b)
+ Language.C.Analysis.Debug: instance Pretty CompTyKind
+ Language.C.Analysis.Debug: instance Pretty CompTypeRef
+ Language.C.Analysis.Debug: instance Pretty DefTable
+ Language.C.Analysis.Debug: instance Pretty EnumTypeRef
+ Language.C.Analysis.Debug: instance Pretty TagFwdDecl
+ Language.C.Analysis.DeclAnalysis: TSType :: Type -> TypeSpecAnalysis
+ Language.C.Analysis.DeclAnalysis: TSTypeDef :: TypeDefRef -> TypeSpecAnalysis
+ Language.C.Analysis.DeclAnalysis: analyseVarDecl :: MonadTrav m => Bool -> [CStorageSpec] -> [CAttr] -> [CTypeQual] -> TypeSpecAnalysis -> Bool -> CDeclr -> [CDecl] -> (Maybe CInit) -> m VarDeclInfo
+ Language.C.Analysis.DeclAnalysis: analyseVarDecl' :: MonadTrav m => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> (Maybe CInit) -> m VarDeclInfo
+ Language.C.Analysis.DeclAnalysis: isTypeDef :: [CDeclSpec] -> Bool
+ Language.C.Analysis.DefTable: inFileScope :: DefTable -> Bool
+ Language.C.Analysis.DefTable: insertType :: DefTable -> Name -> Type -> DefTable
+ Language.C.Analysis.DefTable: lookupType :: DefTable -> Name -> Maybe Type
+ Language.C.Analysis.DefTable: mergeDefTable :: DefTable -> DefTable -> DefTable
+ Language.C.Analysis.DefTable: typeTable :: DefTable -> IntMap Type
+ Language.C.Analysis.Export: exportDeclr :: [CDeclSpec] -> Type -> Attributes -> VarName -> ([CDeclSpec], CDeclr)
+ Language.C.Analysis.NameSpaceMap: data NameSpaceMap k v
+ Language.C.Analysis.NameSpaceMap: defGlobal :: Ord k => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a)
+ Language.C.Analysis.NameSpaceMap: defLocal :: Ord k => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a)
+ Language.C.Analysis.NameSpaceMap: enterNewScope :: Ord k => NameSpaceMap k a -> NameSpaceMap k a
+ Language.C.Analysis.NameSpaceMap: globalNames :: Ord k => NameSpaceMap k v -> Map k v
+ Language.C.Analysis.NameSpaceMap: hasLocalNames :: NameSpaceMap k v -> Bool
+ Language.C.Analysis.NameSpaceMap: leaveScope :: Ord k => NameSpaceMap k a -> (NameSpaceMap k a, [(k, a)])
+ Language.C.Analysis.NameSpaceMap: localNames :: Ord k => NameSpaceMap k v -> [[(k, v)]]
+ Language.C.Analysis.NameSpaceMap: lookupGlobal :: Ord k => NameSpaceMap k a -> k -> Maybe a
+ Language.C.Analysis.NameSpaceMap: lookupInnermostScope :: Ord k => NameSpaceMap k a -> k -> Maybe a
+ Language.C.Analysis.NameSpaceMap: lookupName :: Ord k => NameSpaceMap k a -> k -> Maybe a
+ Language.C.Analysis.NameSpaceMap: mergeNameSpace :: Ord k => NameSpaceMap k a -> NameSpaceMap k a -> NameSpaceMap k a
+ Language.C.Analysis.NameSpaceMap: nameSpaceMap :: Ord k => NameSpaceMap k v
+ Language.C.Analysis.NameSpaceMap: nsMapToList :: Ord k => NameSpaceMap k a -> [(k, a)]
+ Language.C.Analysis.SemError: DisagreeLinkage :: RedefKind
+ Language.C.Analysis.SemError: NoLinkageOld :: RedefKind
+ Language.C.Analysis.SemRep: LocalEvent :: IdentDecl -> DeclEvent
+ Language.C.Analysis.SemRep: NoLinkage :: Linkage
+ Language.C.Analysis.SemRep: ParamEvent :: ParamDecl -> DeclEvent
+ Language.C.Analysis.SemRep: TyAny :: BuiltinType
+ Language.C.Analysis.SemRep: declLinkage :: Declaration d => d -> Linkage
+ Language.C.Analysis.SemRep: hasLinkage :: Storage -> Bool
+ Language.C.Analysis.SemRep: isNoName :: VarName -> Bool
+ Language.C.Analysis.SemRep: mergeAttributes :: Attributes -> Attributes -> Attributes
+ Language.C.Analysis.SemRep: noAttributes :: Attributes
+ Language.C.Analysis.TravMonad: C89 :: CLanguage
+ Language.C.Analysis.TravMonad: C99 :: CLanguage
+ Language.C.Analysis.TravMonad: GNU89 :: CLanguage
+ Language.C.Analysis.TravMonad: GNU99 :: CLanguage
+ Language.C.Analysis.TravMonad: TravOptions :: CLanguage -> TravOptions
+ Language.C.Analysis.TravMonad: class Monad m => MonadCError m
+ Language.C.Analysis.TravMonad: class Monad m => MonadName m
+ Language.C.Analysis.TravMonad: class Monad m => MonadSymtab m
+ Language.C.Analysis.TravMonad: data CLanguage
+ Language.C.Analysis.TravMonad: data TravOptions
+ Language.C.Analysis.TravMonad: getUserState :: Trav s s
+ Language.C.Analysis.TravMonad: instance MonadCError (Trav s)
+ Language.C.Analysis.TravMonad: instance MonadName (Trav s)
+ Language.C.Analysis.TravMonad: instance MonadSymtab (Trav s)
+ Language.C.Analysis.TravMonad: language :: TravOptions -> CLanguage
+ Language.C.Analysis.TravMonad: modifyOptions :: (TravOptions -> TravOptions) -> Trav s ()
+ Language.C.Analysis.TypeCheck: assignCompatible :: CAssignOp -> Type -> Type -> Either String ()
+ Language.C.Analysis.TypeCheck: assignCompatible' :: MonadCError m => NodeInfo -> CAssignOp -> Type -> Type -> m ()
+ Language.C.Analysis.TypeCheck: binopType :: CBinaryOp -> Type -> Type -> Either String Type
+ Language.C.Analysis.TypeCheck: binopType' :: MonadCError m => NodeInfo -> CBinaryOp -> Type -> Type -> m Type
+ Language.C.Analysis.TypeCheck: castCompatible :: Type -> Type -> Either String ()
+ Language.C.Analysis.TypeCheck: checkIntegral :: Type -> Either String ()
+ Language.C.Analysis.TypeCheck: checkIntegral' :: MonadCError m => NodeInfo -> Type -> m ()
+ Language.C.Analysis.TypeCheck: checkScalar :: Type -> Either String ()
+ Language.C.Analysis.TypeCheck: checkScalar' :: MonadCError m => NodeInfo -> Type -> m ()
+ Language.C.Analysis.TypeCheck: compatible :: Type -> Type -> Either String ()
+ Language.C.Analysis.TypeCheck: compositeDeclAttrs :: DeclAttrs -> DeclAttrs -> DeclAttrs
+ Language.C.Analysis.TypeCheck: compositeParamDecl :: ParamDecl -> ParamDecl -> Either String ParamDecl
+ Language.C.Analysis.TypeCheck: compositeParamDecl' :: (VarDecl -> NodeInfo -> ParamDecl) -> VarDecl -> VarDecl -> NodeInfo -> Either String ParamDecl
+ Language.C.Analysis.TypeCheck: compositeSize :: ArraySize -> ArraySize -> Either String ArraySize
+ Language.C.Analysis.TypeCheck: compositeType :: Type -> Type -> Either String Type
+ Language.C.Analysis.TypeCheck: compositeVarDecl :: VarDecl -> VarDecl -> Either String VarDecl
+ Language.C.Analysis.TypeCheck: conditionalType :: Type -> Type -> Either String Type
+ Language.C.Analysis.TypeCheck: conditionalType' :: MonadCError m => NodeInfo -> Type -> Type -> m Type
+ Language.C.Analysis.TypeCheck: constType :: (MonadCError m, MonadName m) => CConst -> m Type
+ Language.C.Analysis.TypeCheck: deepTypeAttrs :: (MonadCError m, MonadSymtab m) => Type -> m Attributes
+ Language.C.Analysis.TypeCheck: derefType :: Type -> Either String Type
+ Language.C.Analysis.TypeCheck: expandAnonymous :: (MonadCError m, MonadSymtab m) => NodeInfo -> (VarName, Type) -> m [(Ident, Type)]
+ Language.C.Analysis.TypeCheck: fieldType :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> Type -> m Type
+ Language.C.Analysis.TypeCheck: lookupSUE :: (MonadCError m, MonadSymtab m) => NodeInfo -> SUERef -> m TagDef
+ Language.C.Analysis.TypeCheck: mergeAttrs :: Attributes -> Attributes -> Attributes
+ Language.C.Analysis.TypeCheck: notFound :: Ident -> Either String a
+ Language.C.Analysis.TypeCheck: pType :: Type -> String
+ Language.C.Analysis.TypeCheck: sizeEqual :: CExpr -> CExpr -> Bool
+ Language.C.Analysis.TypeCheck: sueAttrs :: (MonadCError m, MonadSymtab m) => NodeInfo -> SUERef -> m Attributes
+ Language.C.Analysis.TypeCheck: tagMembers :: (MonadCError m, MonadSymtab m) => NodeInfo -> TagDef -> m [(Ident, Type)]
+ Language.C.Analysis.TypeCheck: typeDefAttrs :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> m Attributes
+ Language.C.Analysis.TypeCheck: typeError :: MonadCError m => NodeInfo -> String -> m a
+ Language.C.Analysis.TypeCheck: typeErrorOnLeft :: MonadCError m => NodeInfo -> Either String a -> m a
+ Language.C.Analysis.TypeCheck: varAddrType :: IdentDecl -> Either String Type
+ Language.C.Analysis.TypeConversions: arithmeticConversion :: TypeName -> TypeName -> Maybe TypeName
+ Language.C.Analysis.TypeConversions: floatConversion :: FloatType -> FloatType -> FloatType
+ Language.C.Analysis.TypeConversions: intConversion :: IntType -> IntType -> IntType
+ Language.C.Analysis.TypeUtils: baseType :: Type -> Type
+ Language.C.Analysis.TypeUtils: boolType :: Type
+ Language.C.Analysis.TypeUtils: canonicalType :: Type -> Type
+ Language.C.Analysis.TypeUtils: charPtr :: Type
+ Language.C.Analysis.TypeUtils: constCharPtr :: Type
+ Language.C.Analysis.TypeUtils: constVoidPtr :: Type
+ Language.C.Analysis.TypeUtils: deepDerefTypeDef :: Type -> Type
+ Language.C.Analysis.TypeUtils: derefTypeDef :: Type -> Type
+ Language.C.Analysis.TypeUtils: floating :: FloatType -> Type
+ Language.C.Analysis.TypeUtils: getFloatType :: String -> FloatType
+ Language.C.Analysis.TypeUtils: getIntType :: Flags CIntFlag -> IntType
+ Language.C.Analysis.TypeUtils: instance Eq TypeQuals
+ Language.C.Analysis.TypeUtils: instance Ord TypeQuals
+ Language.C.Analysis.TypeUtils: integral :: IntType -> Type
+ Language.C.Analysis.TypeUtils: isFloatingType :: Type -> Bool
+ Language.C.Analysis.TypeUtils: isFunctionType :: Type -> Bool
+ Language.C.Analysis.TypeUtils: isIntegralType :: Type -> Bool
+ Language.C.Analysis.TypeUtils: isPointerType :: Type -> Bool
+ Language.C.Analysis.TypeUtils: isScalarType :: Type -> Bool
+ Language.C.Analysis.TypeUtils: ptrDiffType :: Type
+ Language.C.Analysis.TypeUtils: simplePtr :: Type -> Type
+ Language.C.Analysis.TypeUtils: size_tType :: Type
+ Language.C.Analysis.TypeUtils: stringType :: Type
+ Language.C.Analysis.TypeUtils: typeAttrs :: Type -> Attributes
+ Language.C.Analysis.TypeUtils: typeAttrsUpd :: (Attributes -> Attributes) -> Type -> Type
+ Language.C.Analysis.TypeUtils: typeQuals :: Type -> TypeQuals
+ Language.C.Analysis.TypeUtils: typeQualsUpd :: (TypeQuals -> TypeQuals) -> Type -> Type
+ Language.C.Analysis.TypeUtils: valistType :: Type
+ Language.C.Analysis.TypeUtils: voidPtr :: Type
+ Language.C.Analysis.TypeUtils: voidType :: Type
+ Language.C.Data: undefNode :: NodeInfo
+ Language.C.Data.Node: getLastTokenPos :: NodeInfo -> PosLength
+ Language.C.Data.Node: isUndefNode :: NodeInfo -> Bool
+ Language.C.Data.Node: lengthOfNode :: NodeInfo -> Maybe Int
+ Language.C.Data.Node: mkNodeInfo' :: Position -> PosLength -> Name -> NodeInfo
+ Language.C.Data.Node: mkNodeInfoPosLen :: Position -> PosLength -> NodeInfo
+ Language.C.Data.Node: undefNode :: NodeInfo
+ Language.C.Data.Position: incOffset :: Position -> Int -> Position
+ Language.C.Data.Position: posOffset :: Position -> Int
+ Language.C.Data.Position: position :: Int -> String -> Int -> Int -> Position
+ Language.C.Data.Position: type PosLength = (Position, Int)
+ Language.C.Syntax.AST: data CArraySize a
+ Language.C.Syntax.AST: data CAssemblyOperand a
+ Language.C.Syntax.AST: data CAssemblyStatement a
+ Language.C.Syntax.AST: data CAttribute a
+ Language.C.Syntax.AST: data CBuiltinThing a
+ Language.C.Syntax.AST: data CCompoundBlockItem a
+ Language.C.Syntax.AST: data CConstant a
+ Language.C.Syntax.AST: data CDeclaration a
+ Language.C.Syntax.AST: data CDeclarationSpecifier a
+ Language.C.Syntax.AST: data CDeclarator a
+ Language.C.Syntax.AST: data CDerivedDeclarator a
+ Language.C.Syntax.AST: data CEnumeration a
+ Language.C.Syntax.AST: data CExpression a
+ Language.C.Syntax.AST: data CExternalDeclaration a
+ Language.C.Syntax.AST: data CFunctionDef a
+ Language.C.Syntax.AST: data CInitializer a
+ Language.C.Syntax.AST: data CPartDesignator a
+ Language.C.Syntax.AST: data CStatement a
+ Language.C.Syntax.AST: data CStorageSpecifier a
+ Language.C.Syntax.AST: data CStringLiteral a
+ Language.C.Syntax.AST: data CStructureUnion a
+ Language.C.Syntax.AST: data CTranslationUnit a
+ Language.C.Syntax.AST: data CTypeQualifier a
+ Language.C.Syntax.AST: data CTypeSpecifier a
+ Language.C.Syntax.AST: instance Annotated CAssemblyOperand
+ Language.C.Syntax.AST: instance Annotated CAssemblyStatement
+ Language.C.Syntax.AST: instance Annotated CAttribute
+ Language.C.Syntax.AST: instance Annotated CBuiltinThing
+ Language.C.Syntax.AST: instance Annotated CCompoundBlockItem
+ Language.C.Syntax.AST: instance Annotated CConstant
+ Language.C.Syntax.AST: instance Annotated CDeclaration
+ Language.C.Syntax.AST: instance Annotated CDeclarationSpecifier
+ Language.C.Syntax.AST: instance Annotated CDeclarator
+ Language.C.Syntax.AST: instance Annotated CDerivedDeclarator
+ Language.C.Syntax.AST: instance Annotated CEnumeration
+ Language.C.Syntax.AST: instance Annotated CExpression
+ Language.C.Syntax.AST: instance Annotated CExternalDeclaration
+ Language.C.Syntax.AST: instance Annotated CFunctionDef
+ Language.C.Syntax.AST: instance Annotated CInitializer
+ Language.C.Syntax.AST: instance Annotated CPartDesignator
+ Language.C.Syntax.AST: instance Annotated CStatement
+ Language.C.Syntax.AST: instance Annotated CStorageSpecifier
+ Language.C.Syntax.AST: instance Annotated CStringLiteral
+ Language.C.Syntax.AST: instance Annotated CStructureUnion
+ Language.C.Syntax.AST: instance Annotated CTranslationUnit
+ Language.C.Syntax.AST: instance Annotated CTypeQualifier
+ Language.C.Syntax.AST: instance Annotated CTypeSpecifier
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CAssemblyOperand t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CAssemblyStatement t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CAttribute t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CBuiltinThing t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CCompoundBlockItem t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CConstant t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CDeclaration t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CDeclarationSpecifier t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CDeclarator t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CDerivedDeclarator t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CEnumeration t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CExpression t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CExternalDeclaration t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CFunctionDef t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CInitializer t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CPartDesignator t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CStatement t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CStorageSpecifier t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CStringLiteral t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CStructureUnion t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CTranslationUnit t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CTypeQualifier t1)
+ Language.C.Syntax.AST: instance CNode t1 => CNode (CTypeSpecifier t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CAssemblyOperand t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CAssemblyStatement t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CAttribute t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CBuiltinThing t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CCompoundBlockItem t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CConstant t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CDeclaration t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CDeclarationSpecifier t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CDeclarator t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CDerivedDeclarator t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CEnumeration t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CExpression t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CExternalDeclaration t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CFunctionDef t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CInitializer t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CPartDesignator t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CStatement t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CStorageSpecifier t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CStringLiteral t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CStructureUnion t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CTranslationUnit t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CTypeQualifier t1)
+ Language.C.Syntax.AST: instance CNode t1 => Pos (CTypeSpecifier t1)
+ Language.C.Syntax.AST: instance Data a => Data (CArraySize a)
+ Language.C.Syntax.AST: instance Data a => Data (CAssemblyOperand a)
+ Language.C.Syntax.AST: instance Data a => Data (CAssemblyStatement a)
+ Language.C.Syntax.AST: instance Data a => Data (CAttribute a)
+ Language.C.Syntax.AST: instance Data a => Data (CBuiltinThing a)
+ Language.C.Syntax.AST: instance Data a => Data (CCompoundBlockItem a)
+ Language.C.Syntax.AST: instance Data a => Data (CConstant a)
+ Language.C.Syntax.AST: instance Data a => Data (CDeclaration a)
+ Language.C.Syntax.AST: instance Data a => Data (CDeclarationSpecifier a)
+ Language.C.Syntax.AST: instance Data a => Data (CDeclarator a)
+ Language.C.Syntax.AST: instance Data a => Data (CDerivedDeclarator a)
+ Language.C.Syntax.AST: instance Data a => Data (CEnumeration a)
+ Language.C.Syntax.AST: instance Data a => Data (CExpression a)
+ Language.C.Syntax.AST: instance Data a => Data (CExternalDeclaration a)
+ Language.C.Syntax.AST: instance Data a => Data (CFunctionDef a)
+ Language.C.Syntax.AST: instance Data a => Data (CInitializer a)
+ Language.C.Syntax.AST: instance Data a => Data (CPartDesignator a)
+ Language.C.Syntax.AST: instance Data a => Data (CStatement a)
+ Language.C.Syntax.AST: instance Data a => Data (CStorageSpecifier a)
+ Language.C.Syntax.AST: instance Data a => Data (CStringLiteral a)
+ Language.C.Syntax.AST: instance Data a => Data (CStructureUnion a)
+ Language.C.Syntax.AST: instance Data a => Data (CTranslationUnit a)
+ Language.C.Syntax.AST: instance Data a => Data (CTypeQualifier a)
+ Language.C.Syntax.AST: instance Data a => Data (CTypeSpecifier a)
+ Language.C.Syntax.AST: instance Eq a => Eq (CStorageSpecifier a)
+ Language.C.Syntax.AST: instance Functor CArraySize
+ Language.C.Syntax.AST: instance Functor CAssemblyOperand
+ Language.C.Syntax.AST: instance Functor CAssemblyStatement
+ Language.C.Syntax.AST: instance Functor CAttribute
+ Language.C.Syntax.AST: instance Functor CBuiltinThing
+ Language.C.Syntax.AST: instance Functor CCompoundBlockItem
+ Language.C.Syntax.AST: instance Functor CConstant
+ Language.C.Syntax.AST: instance Functor CDeclaration
+ Language.C.Syntax.AST: instance Functor CDeclarationSpecifier
+ Language.C.Syntax.AST: instance Functor CDeclarator
+ Language.C.Syntax.AST: instance Functor CDerivedDeclarator
+ Language.C.Syntax.AST: instance Functor CEnumeration
+ Language.C.Syntax.AST: instance Functor CExpression
+ Language.C.Syntax.AST: instance Functor CExternalDeclaration
+ Language.C.Syntax.AST: instance Functor CFunctionDef
+ Language.C.Syntax.AST: instance Functor CInitializer
+ Language.C.Syntax.AST: instance Functor CPartDesignator
+ Language.C.Syntax.AST: instance Functor CStatement
+ Language.C.Syntax.AST: instance Functor CStorageSpecifier
+ Language.C.Syntax.AST: instance Functor CStringLiteral
+ Language.C.Syntax.AST: instance Functor CStructureUnion
+ Language.C.Syntax.AST: instance Functor CTranslationUnit
+ Language.C.Syntax.AST: instance Functor CTypeQualifier
+ Language.C.Syntax.AST: instance Functor CTypeSpecifier
+ Language.C.Syntax.AST: instance Ord a => Ord (CStorageSpecifier a)
+ Language.C.Syntax.AST: instance Show CStructTag
+ Language.C.Syntax.AST: instance Show a => Show (CArraySize a)
+ Language.C.Syntax.AST: instance Show a => Show (CAssemblyOperand a)
+ Language.C.Syntax.AST: instance Show a => Show (CAssemblyStatement a)
+ Language.C.Syntax.AST: instance Show a => Show (CAttribute a)
+ Language.C.Syntax.AST: instance Show a => Show (CBuiltinThing a)
+ Language.C.Syntax.AST: instance Show a => Show (CCompoundBlockItem a)
+ Language.C.Syntax.AST: instance Show a => Show (CConstant a)
+ Language.C.Syntax.AST: instance Show a => Show (CDeclaration a)
+ Language.C.Syntax.AST: instance Show a => Show (CDeclarationSpecifier a)
+ Language.C.Syntax.AST: instance Show a => Show (CDeclarator a)
+ Language.C.Syntax.AST: instance Show a => Show (CDerivedDeclarator a)
+ Language.C.Syntax.AST: instance Show a => Show (CEnumeration a)
+ Language.C.Syntax.AST: instance Show a => Show (CExpression a)
+ Language.C.Syntax.AST: instance Show a => Show (CExternalDeclaration a)
+ Language.C.Syntax.AST: instance Show a => Show (CFunctionDef a)
+ Language.C.Syntax.AST: instance Show a => Show (CInitializer a)
+ Language.C.Syntax.AST: instance Show a => Show (CPartDesignator a)
+ Language.C.Syntax.AST: instance Show a => Show (CStatement a)
+ Language.C.Syntax.AST: instance Show a => Show (CStorageSpecifier a)
+ Language.C.Syntax.AST: instance Show a => Show (CStringLiteral a)
+ Language.C.Syntax.AST: instance Show a => Show (CStructureUnion a)
+ Language.C.Syntax.AST: instance Show a => Show (CTranslationUnit a)
+ Language.C.Syntax.AST: instance Show a => Show (CTypeQualifier a)
+ Language.C.Syntax.AST: instance Show a => Show (CTypeSpecifier a)
+ Language.C.Syntax.AST: instance Typeable1 CArraySize
+ Language.C.Syntax.AST: instance Typeable1 CAssemblyOperand
+ Language.C.Syntax.AST: instance Typeable1 CAssemblyStatement
+ Language.C.Syntax.AST: instance Typeable1 CAttribute
+ Language.C.Syntax.AST: instance Typeable1 CBuiltinThing
+ Language.C.Syntax.AST: instance Typeable1 CCompoundBlockItem
+ Language.C.Syntax.AST: instance Typeable1 CConstant
+ Language.C.Syntax.AST: instance Typeable1 CDeclaration
+ Language.C.Syntax.AST: instance Typeable1 CDeclarationSpecifier
+ Language.C.Syntax.AST: instance Typeable1 CDeclarator
+ Language.C.Syntax.AST: instance Typeable1 CDerivedDeclarator
+ Language.C.Syntax.AST: instance Typeable1 CEnumeration
+ Language.C.Syntax.AST: instance Typeable1 CExpression
+ Language.C.Syntax.AST: instance Typeable1 CExternalDeclaration
+ Language.C.Syntax.AST: instance Typeable1 CFunctionDef
+ Language.C.Syntax.AST: instance Typeable1 CInitializer
+ Language.C.Syntax.AST: instance Typeable1 CPartDesignator
+ Language.C.Syntax.AST: instance Typeable1 CStatement
+ Language.C.Syntax.AST: instance Typeable1 CStorageSpecifier
+ Language.C.Syntax.AST: instance Typeable1 CStringLiteral
+ Language.C.Syntax.AST: instance Typeable1 CStructureUnion
+ Language.C.Syntax.AST: instance Typeable1 CTranslationUnit
+ Language.C.Syntax.AST: instance Typeable1 CTypeQualifier
+ Language.C.Syntax.AST: instance Typeable1 CTypeSpecifier
+ Language.C.Syntax.AST: type CArrSize = CArraySize NodeInfo
+ Language.C.Syntax.AST: type CAsmOperand = CAssemblyOperand NodeInfo
+ Language.C.Syntax.AST: type CAsmStmt = CAssemblyStatement NodeInfo
+ Language.C.Syntax.AST: type CAttr = CAttribute NodeInfo
+ Language.C.Syntax.AST: type CBlockItem = CCompoundBlockItem NodeInfo
+ Language.C.Syntax.AST: type CBuiltin = CBuiltinThing NodeInfo
+ Language.C.Syntax.AST: type CConst = CConstant NodeInfo
+ Language.C.Syntax.AST: type CDecl = CDeclaration NodeInfo
+ Language.C.Syntax.AST: type CDeclSpec = CDeclarationSpecifier NodeInfo
+ Language.C.Syntax.AST: type CDeclr = CDeclarator NodeInfo
+ Language.C.Syntax.AST: type CDerivedDeclr = CDerivedDeclarator NodeInfo
+ Language.C.Syntax.AST: type CDesignator = CPartDesignator NodeInfo
+ Language.C.Syntax.AST: type CEnum = CEnumeration NodeInfo
+ Language.C.Syntax.AST: type CExpr = CExpression NodeInfo
+ Language.C.Syntax.AST: type CExtDecl = CExternalDeclaration NodeInfo
+ Language.C.Syntax.AST: type CFunDef = CFunctionDef NodeInfo
+ Language.C.Syntax.AST: type CInit = CInitializer NodeInfo
+ Language.C.Syntax.AST: type CInitializerList a = [([CPartDesignator a], CInitializer a)]
+ Language.C.Syntax.AST: type CStat = CStatement NodeInfo
+ Language.C.Syntax.AST: type CStorageSpec = CStorageSpecifier NodeInfo
+ Language.C.Syntax.AST: type CStrLit = CStringLiteral NodeInfo
+ Language.C.Syntax.AST: type CStructUnion = CStructureUnion NodeInfo
+ Language.C.Syntax.AST: type CTranslUnit = CTranslationUnit NodeInfo
+ Language.C.Syntax.AST: type CTypeQual = CTypeQualifier NodeInfo
+ Language.C.Syntax.AST: type CTypeSpec = CTypeSpecifier NodeInfo
+ Language.C.Syntax.Ops: assignBinop :: CAssignOp -> CBinaryOp
+ Language.C.Syntax.Ops: isBitOp :: CBinaryOp -> Bool
+ Language.C.Syntax.Ops: isCmpOp :: CBinaryOp -> Bool
+ Language.C.Syntax.Ops: isEffectfulOp :: CUnaryOp -> Bool
+ Language.C.Syntax.Ops: isLogicOp :: CBinaryOp -> Bool
+ Language.C.Syntax.Ops: isPtrOp :: CBinaryOp -> Bool
+ Language.C.Syntax.Utils: getLabels :: CStat -> [Ident]
+ Language.C.Syntax.Utils: getSubStmts :: CStat -> [CStat]
+ Language.C.Syntax.Utils: mapBlockItemStmts :: (CStat -> Bool) -> (CStat -> CStat) -> CBlockItem -> CBlockItem
+ Language.C.Syntax.Utils: mapSubStmts :: (CStat -> Bool) -> (CStat -> CStat) -> CStat -> CStat
- Language.C.Analysis.DeclAnalysis: canonicalStorageSpec :: MonadTrav m => [CStorageSpec] -> m StorageSpec
+ Language.C.Analysis.DeclAnalysis: canonicalStorageSpec :: MonadCError m => [CStorageSpec] -> m StorageSpec
- Language.C.Analysis.DeclAnalysis: getOnlyDeclr :: MonadTrav m => CDecl -> m CDeclr
+ Language.C.Analysis.DeclAnalysis: getOnlyDeclr :: MonadCError m => CDecl -> m CDeclr
- Language.C.Analysis.DeclAnalysis: mergeOldStyle :: MonadTrav m => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr]
+ Language.C.Analysis.DeclAnalysis: mergeOldStyle :: MonadCError m => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr]
- Language.C.Analysis.DeclAnalysis: mkVarName :: MonadTrav m => NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName
+ Language.C.Analysis.DeclAnalysis: mkVarName :: (MonadCError m, MonadSymtab m) => NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName
- Language.C.Analysis.DeclAnalysis: nameOfDecl :: MonadTrav m => CDecl -> m Ident
+ Language.C.Analysis.DeclAnalysis: nameOfDecl :: MonadCError m => CDecl -> m Ident
- Language.C.Analysis.DeclAnalysis: tAttr :: MonadTrav m => CAttr -> m Attr
+ Language.C.Analysis.DeclAnalysis: tAttr :: (MonadCError m, MonadSymtab m) => CAttr -> m Attr
- Language.C.Analysis.DeclAnalysis: tDirectType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> m Type
+ Language.C.Analysis.DeclAnalysis: tDirectType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> m Type
- Language.C.Analysis.DeclAnalysis: tNumType :: MonadTrav m => NumTypeSpec -> m (Either (FloatType, Bool) IntType)
+ Language.C.Analysis.DeclAnalysis: tNumType :: MonadCError m => NumTypeSpec -> m (Either (FloatType, Bool) IntType)
- Language.C.Analysis.DeclAnalysis: tType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> [CDerivedDeclr] -> [CDecl] -> m Type
+ Language.C.Analysis.DeclAnalysis: tType :: MonadTrav m => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> [CDerivedDeclr] -> [CDecl] -> m Type
- Language.C.Analysis.DefTable: DefTable :: NameSpaceMap Ident IdentEntry -> NameSpaceMap SUERef TagEntry -> NameSpaceMap Ident Ident -> NameSpaceMap Ident MemberDecl -> IntMap Name -> DefTable
+ Language.C.Analysis.DefTable: DefTable :: NameSpaceMap Ident IdentEntry -> NameSpaceMap SUERef TagEntry -> NameSpaceMap Ident Ident -> NameSpaceMap Ident MemberDecl -> IntMap Name -> IntMap Type -> DefTable
- Language.C.Analysis.SemRep: DirectType :: TypeName -> TypeQuals -> Type
+ Language.C.Analysis.SemRep: DirectType :: TypeName -> TypeQuals -> Attributes -> Type
- Language.C.Analysis.SemRep: FunType :: Type -> [ParamDecl] -> Bool -> Attributes -> FunType
+ Language.C.Analysis.SemRep: FunType :: Type -> [ParamDecl] -> Bool -> FunType
- Language.C.Analysis.SemRep: FunTypeIncomplete :: Type -> Attributes -> FunType
+ Language.C.Analysis.SemRep: FunTypeIncomplete :: Type -> FunType
- Language.C.Analysis.SemRep: FunctionType :: FunType -> Type
+ Language.C.Analysis.SemRep: FunctionType :: FunType -> Attributes -> Type
- Language.C.Analysis.SemRep: TypeDefType :: TypeDefRef -> Type
+ Language.C.Analysis.SemRep: TypeDefType :: TypeDefRef -> TypeQuals -> Attributes -> Type
- Language.C.Analysis.TravMonad: astError :: MonadTrav m => NodeInfo -> String -> m a
+ Language.C.Analysis.TravMonad: astError :: MonadCError m => NodeInfo -> String -> m a
- Language.C.Analysis.TravMonad: catchTravError :: MonadTrav m => m a -> (CError -> m a) -> m a
+ Language.C.Analysis.TravMonad: catchTravError :: MonadCError m => m a -> (CError -> m a) -> m a
- Language.C.Analysis.TravMonad: class Monad m => MonadTrav m
+ Language.C.Analysis.TravMonad: class (MonadName m, MonadSymtab m, MonadCError m) => MonadTrav m
- Language.C.Analysis.TravMonad: createSUERef :: MonadTrav m => NodeInfo -> Maybe Ident -> m SUERef
+ Language.C.Analysis.TravMonad: createSUERef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Maybe Ident -> m SUERef
- Language.C.Analysis.TravMonad: enterBlockScope :: MonadTrav m => m ()
+ Language.C.Analysis.TravMonad: enterBlockScope :: MonadSymtab m => m ()
- Language.C.Analysis.TravMonad: enterFunctionScope :: MonadTrav m => m ()
+ Language.C.Analysis.TravMonad: enterFunctionScope :: MonadSymtab m => m ()
- Language.C.Analysis.TravMonad: enterPrototypeScope :: MonadTrav m => m ()
+ Language.C.Analysis.TravMonad: enterPrototypeScope :: MonadSymtab m => m ()
- Language.C.Analysis.TravMonad: genName :: MonadTrav m => m Name
+ Language.C.Analysis.TravMonad: genName :: MonadName m => m Name
- Language.C.Analysis.TravMonad: getDefTable :: MonadTrav m => m DefTable
+ Language.C.Analysis.TravMonad: getDefTable :: MonadSymtab m => m DefTable
- Language.C.Analysis.TravMonad: getErrors :: MonadTrav m => m [CError]
+ Language.C.Analysis.TravMonad: getErrors :: MonadCError m => m [CError]
- Language.C.Analysis.TravMonad: handleEnumeratorDef :: MonadTrav m => Enumerator -> m ()
+ Language.C.Analysis.TravMonad: handleEnumeratorDef :: (MonadCError m, MonadSymtab m) => Enumerator -> m ()
- Language.C.Analysis.TravMonad: handleObjectDef :: MonadTrav m => Ident -> ObjDef -> m ()
+ Language.C.Analysis.TravMonad: handleObjectDef :: MonadTrav m => Bool -> Ident -> ObjDef -> m ()
- Language.C.Analysis.TravMonad: handleTagDecl :: MonadTrav m => TagFwdDecl -> m ()
+ Language.C.Analysis.TravMonad: handleTagDecl :: (MonadCError m, MonadSymtab m) => TagFwdDecl -> m ()
- Language.C.Analysis.TravMonad: handleTravError :: MonadTrav m => m a -> m (Maybe a)
+ Language.C.Analysis.TravMonad: handleTravError :: MonadCError m => m a -> m (Maybe a)
- Language.C.Analysis.TravMonad: handleVarDecl :: MonadTrav m => Decl -> m ()
+ Language.C.Analysis.TravMonad: handleVarDecl :: MonadTrav m => Bool -> Decl -> m ()
- Language.C.Analysis.TravMonad: leaveBlockScope :: MonadTrav m => m ()
+ Language.C.Analysis.TravMonad: leaveBlockScope :: MonadSymtab m => m ()
- Language.C.Analysis.TravMonad: leaveFunctionScope :: MonadTrav m => m ()
+ Language.C.Analysis.TravMonad: leaveFunctionScope :: MonadSymtab m => m ()
- Language.C.Analysis.TravMonad: leavePrototypeScope :: MonadTrav m => m ()
+ Language.C.Analysis.TravMonad: leavePrototypeScope :: MonadSymtab m => m ()
- Language.C.Analysis.TravMonad: lookupObject :: MonadTrav m => Ident -> m (Maybe IdentDecl)
+ Language.C.Analysis.TravMonad: lookupObject :: (MonadCError m, MonadSymtab m) => Ident -> m (Maybe IdentDecl)
- Language.C.Analysis.TravMonad: lookupTypeDef :: MonadTrav m => Ident -> m Type
+ Language.C.Analysis.TravMonad: lookupTypeDef :: (MonadCError m, MonadSymtab m) => Ident -> m Type
- Language.C.Analysis.TravMonad: recordError :: (MonadTrav m, Error e) => e -> m ()
+ Language.C.Analysis.TravMonad: recordError :: (MonadCError m, Error e) => e -> m ()
- Language.C.Analysis.TravMonad: throwOnLeft :: (MonadTrav m, Error e) => Either e a -> m a
+ Language.C.Analysis.TravMonad: throwOnLeft :: (MonadCError m, Error e) => Either e a -> m a
- Language.C.Analysis.TravMonad: throwTravError :: (MonadTrav m, Error e) => e -> m a
+ Language.C.Analysis.TravMonad: throwTravError :: (MonadCError m, Error e) => e -> m a
- Language.C.Analysis.TravMonad: warn :: (Error e, MonadTrav m) => e -> m ()
+ Language.C.Analysis.TravMonad: warn :: (Error e, MonadCError m) => e -> m ()
- Language.C.Analysis.TravMonad: withDefTable :: MonadTrav m => (DefTable -> (a, DefTable)) -> m a
+ Language.C.Analysis.TravMonad: withDefTable :: MonadSymtab m => (DefTable -> (a, DefTable)) -> m a
- Language.C.Data: NodeInfo :: Position -> Name -> NodeInfo
+ Language.C.Data: NodeInfo :: Position -> {-# UNPACK #-} !PosLength -> !Name -> NodeInfo
- Language.C.Data: OnlyPos :: Position -> NodeInfo
+ Language.C.Data: OnlyPos :: Position -> {-# UNPACK #-} !PosLength -> NodeInfo
- Language.C.Data: fileOfNode :: CNode a => a -> FilePath
+ Language.C.Data: fileOfNode :: CNode a => a -> Maybe FilePath
- Language.C.Data.Node: NodeInfo :: Position -> Name -> NodeInfo
+ Language.C.Data.Node: NodeInfo :: Position -> {-# UNPACK #-} !PosLength -> !Name -> NodeInfo
- Language.C.Data.Node: OnlyPos :: Position -> NodeInfo
+ Language.C.Data.Node: OnlyPos :: Position -> {-# UNPACK #-} !PosLength -> NodeInfo
- Language.C.Data.Node: fileOfNode :: CNode a => a -> FilePath
+ Language.C.Data.Node: fileOfNode :: CNode a => a -> Maybe FilePath
- Language.C.Syntax.AST: CAlignofExpr :: CExpr -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CAlignofExpr :: (CExpression a) -> a -> CExpression a
- Language.C.Syntax.AST: CAlignofType :: CDecl -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CAlignofType :: (CDeclaration a) -> a -> CExpression a
- Language.C.Syntax.AST: CArrDeclr :: [CTypeQual] -> (CArrSize) -> NodeInfo -> CDerivedDeclr
+ Language.C.Syntax.AST: CArrDeclr :: [CTypeQualifier a] -> (CArraySize a) -> a -> CDerivedDeclarator a
- Language.C.Syntax.AST: CArrDesig :: CExpr -> NodeInfo -> CDesignator
+ Language.C.Syntax.AST: CArrDesig :: (CExpression a) -> a -> CPartDesignator a
- Language.C.Syntax.AST: CArrSize :: Bool -> CExpr -> CArrSize
+ Language.C.Syntax.AST: CArrSize :: Bool -> (CExpression a) -> CArraySize a
- Language.C.Syntax.AST: CAsm :: CAsmStmt -> NodeInfo -> CStat
+ Language.C.Syntax.AST: CAsm :: (CAssemblyStatement a) -> a -> CStatement a
- Language.C.Syntax.AST: CAsmExt :: CStrLit -> CExtDecl
+ Language.C.Syntax.AST: CAsmExt :: (CStringLiteral a) -> a -> CExternalDeclaration a
- Language.C.Syntax.AST: CAsmOperand :: (Maybe Ident) -> CStrLit -> CExpr -> NodeInfo -> CAsmOperand
+ Language.C.Syntax.AST: CAsmOperand :: (Maybe Ident) -> (CStringLiteral a) -> (CExpression a) -> a -> CAssemblyOperand a
- Language.C.Syntax.AST: CAsmStmt :: (Maybe CTypeQual) -> CStrLit -> [CAsmOperand] -> [CAsmOperand] -> [CStrLit] -> NodeInfo -> CAsmStmt
+ Language.C.Syntax.AST: CAsmStmt :: (Maybe (CTypeQualifier a)) -> (CStringLiteral a) -> [CAssemblyOperand a] -> [CAssemblyOperand a] -> [CStringLiteral a] -> a -> CAssemblyStatement a
- Language.C.Syntax.AST: CAssign :: CAssignOp -> CExpr -> CExpr -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CAssign :: CAssignOp -> (CExpression a) -> (CExpression a) -> a -> CExpression a
- Language.C.Syntax.AST: CAttr :: Ident -> [CExpr] -> NodeInfo -> CAttr
+ Language.C.Syntax.AST: CAttr :: Ident -> [CExpression a] -> a -> CAttribute a
- Language.C.Syntax.AST: CAttrQual :: CAttr -> CTypeQual
+ Language.C.Syntax.AST: CAttrQual :: (CAttribute a) -> CTypeQualifier a
- Language.C.Syntax.AST: CAuto :: NodeInfo -> CStorageSpec
+ Language.C.Syntax.AST: CAuto :: a -> CStorageSpecifier a
- Language.C.Syntax.AST: CBinary :: CBinaryOp -> CExpr -> CExpr -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CBinary :: CBinaryOp -> (CExpression a) -> (CExpression a) -> a -> CExpression a
- Language.C.Syntax.AST: CBlockDecl :: CDecl -> CBlockItem
+ Language.C.Syntax.AST: CBlockDecl :: (CDeclaration a) -> CCompoundBlockItem a
- Language.C.Syntax.AST: CBlockStmt :: CStat -> CBlockItem
+ Language.C.Syntax.AST: CBlockStmt :: (CStatement a) -> CCompoundBlockItem a
- Language.C.Syntax.AST: CBoolType :: NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CBoolType :: a -> CTypeSpecifier a
- Language.C.Syntax.AST: CBreak :: NodeInfo -> CStat
+ Language.C.Syntax.AST: CBreak :: a -> CStatement a
- Language.C.Syntax.AST: CBuiltinExpr :: CBuiltin -> CExpr
+ Language.C.Syntax.AST: CBuiltinExpr :: (CBuiltinThing a) -> CExpression a
- Language.C.Syntax.AST: CBuiltinOffsetOf :: CDecl -> [CDesignator] -> NodeInfo -> CBuiltin
+ Language.C.Syntax.AST: CBuiltinOffsetOf :: (CDeclaration a) -> [CPartDesignator a] -> a -> CBuiltinThing a
- Language.C.Syntax.AST: CBuiltinTypesCompatible :: CDecl -> CDecl -> NodeInfo -> CBuiltin
+ Language.C.Syntax.AST: CBuiltinTypesCompatible :: (CDeclaration a) -> (CDeclaration a) -> a -> CBuiltinThing a
- Language.C.Syntax.AST: CBuiltinVaArg :: CExpr -> CDecl -> NodeInfo -> CBuiltin
+ Language.C.Syntax.AST: CBuiltinVaArg :: (CExpression a) -> (CDeclaration a) -> a -> CBuiltinThing a
- Language.C.Syntax.AST: CCall :: CExpr -> [CExpr] -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CCall :: (CExpression a) -> [CExpression a] -> a -> CExpression a
- Language.C.Syntax.AST: CCase :: CExpr -> CStat -> NodeInfo -> CStat
+ Language.C.Syntax.AST: CCase :: (CExpression a) -> (CStatement a) -> a -> CStatement a
- Language.C.Syntax.AST: CCases :: CExpr -> CExpr -> CStat -> NodeInfo -> CStat
+ Language.C.Syntax.AST: CCases :: (CExpression a) -> (CExpression a) -> (CStatement a) -> a -> CStatement a
- Language.C.Syntax.AST: CCast :: CDecl -> CExpr -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CCast :: (CDeclaration a) -> (CExpression a) -> a -> CExpression a
- Language.C.Syntax.AST: CCharConst :: CChar -> NodeInfo -> CConst
+ Language.C.Syntax.AST: CCharConst :: CChar -> a -> CConstant a
- Language.C.Syntax.AST: CCharType :: NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CCharType :: a -> CTypeSpecifier a
- Language.C.Syntax.AST: CComma :: [CExpr] -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CComma :: [CExpression a] -> a -> CExpression a
- Language.C.Syntax.AST: CComplexImag :: CExpr -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CComplexImag :: (CExpression a) -> a -> CExpression a
- Language.C.Syntax.AST: CComplexReal :: CExpr -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CComplexReal :: (CExpression a) -> a -> CExpression a
- Language.C.Syntax.AST: CComplexType :: NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CComplexType :: a -> CTypeSpecifier a
- Language.C.Syntax.AST: CCompound :: [Ident] -> [CBlockItem] -> NodeInfo -> CStat
+ Language.C.Syntax.AST: CCompound :: [Ident] -> [CCompoundBlockItem a] -> a -> CStatement a
- Language.C.Syntax.AST: CCompoundLit :: CDecl -> CInitList -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CCompoundLit :: (CDeclaration a) -> (CInitializerList a) -> a -> CExpression a
- Language.C.Syntax.AST: CCond :: CExpr -> (Maybe CExpr) -> CExpr -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CCond :: (CExpression a) -> (Maybe (CExpression a)) -> (CExpression a) -> a -> CExpression a
- Language.C.Syntax.AST: CConst :: CConst -> CExpr
+ Language.C.Syntax.AST: CConst :: (CConstant a) -> CExpression a
- Language.C.Syntax.AST: CConstQual :: NodeInfo -> CTypeQual
+ Language.C.Syntax.AST: CConstQual :: a -> CTypeQualifier a
- Language.C.Syntax.AST: CCont :: NodeInfo -> CStat
+ Language.C.Syntax.AST: CCont :: a -> CStatement a
- Language.C.Syntax.AST: CDecl :: [CDeclSpec] -> [(Maybe CDeclr, Maybe CInit, Maybe CExpr)] -> NodeInfo -> CDecl
+ Language.C.Syntax.AST: CDecl :: [CDeclarationSpecifier a] -> [(Maybe (CDeclarator a), Maybe (CInitializer a), Maybe (CExpression a))] -> a -> CDeclaration a
- Language.C.Syntax.AST: CDeclExt :: CDecl -> CExtDecl
+ Language.C.Syntax.AST: CDeclExt :: (CDeclaration a) -> CExternalDeclaration a
- Language.C.Syntax.AST: CDeclr :: (Maybe Ident) -> [CDerivedDeclr] -> (Maybe CStrLit) -> [CAttr] -> NodeInfo -> CDeclr
+ Language.C.Syntax.AST: CDeclr :: (Maybe Ident) -> [CDerivedDeclarator a] -> (Maybe (CStringLiteral a)) -> [CAttribute a] -> a -> CDeclarator a
- Language.C.Syntax.AST: CDefault :: CStat -> NodeInfo -> CStat
+ Language.C.Syntax.AST: CDefault :: (CStatement a) -> a -> CStatement a
- Language.C.Syntax.AST: CDoubleType :: NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CDoubleType :: a -> CTypeSpecifier a
- Language.C.Syntax.AST: CEnum :: (Maybe Ident) -> (Maybe [(Ident, Maybe CExpr)]) -> [CAttr] -> NodeInfo -> CEnum
+ Language.C.Syntax.AST: CEnum :: (Maybe Ident) -> (Maybe [(Ident, Maybe (CExpression a))]) -> [CAttribute a] -> a -> CEnumeration a
- Language.C.Syntax.AST: CEnumType :: CEnum -> NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CEnumType :: (CEnumeration a) -> a -> CTypeSpecifier a
- Language.C.Syntax.AST: CExpr :: (Maybe CExpr) -> NodeInfo -> CStat
+ Language.C.Syntax.AST: CExpr :: (Maybe (CExpression a)) -> a -> CStatement a
- Language.C.Syntax.AST: CExtern :: NodeInfo -> CStorageSpec
+ Language.C.Syntax.AST: CExtern :: a -> CStorageSpecifier a
- Language.C.Syntax.AST: CFDefExt :: CFunDef -> CExtDecl
+ Language.C.Syntax.AST: CFDefExt :: (CFunctionDef a) -> CExternalDeclaration a
- Language.C.Syntax.AST: CFloatConst :: CFloat -> NodeInfo -> CConst
+ Language.C.Syntax.AST: CFloatConst :: CFloat -> a -> CConstant a
- Language.C.Syntax.AST: CFloatType :: NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CFloatType :: a -> CTypeSpecifier a
- Language.C.Syntax.AST: CFor :: (Either (Maybe CExpr) CDecl) -> (Maybe CExpr) -> (Maybe CExpr) -> CStat -> NodeInfo -> CStat
+ Language.C.Syntax.AST: CFor :: (Either (Maybe (CExpression a)) (CDeclaration a)) -> (Maybe (CExpression a)) -> (Maybe (CExpression a)) -> (CStatement a) -> a -> CStatement a
- Language.C.Syntax.AST: CFunDeclr :: (Either [Ident] ([CDecl], Bool)) -> [CAttr] -> NodeInfo -> CDerivedDeclr
+ Language.C.Syntax.AST: CFunDeclr :: (Either [Ident] ([CDeclaration a], Bool)) -> [CAttribute a] -> a -> CDerivedDeclarator a
- Language.C.Syntax.AST: CFunDef :: [CDeclSpec] -> CDeclr -> [CDecl] -> CStat -> NodeInfo -> CFunDef
+ Language.C.Syntax.AST: CFunDef :: [CDeclarationSpecifier a] -> (CDeclarator a) -> [CDeclaration a] -> (CStatement a) -> a -> CFunctionDef a
- Language.C.Syntax.AST: CGoto :: Ident -> NodeInfo -> CStat
+ Language.C.Syntax.AST: CGoto :: Ident -> a -> CStatement a
- Language.C.Syntax.AST: CGotoPtr :: CExpr -> NodeInfo -> CStat
+ Language.C.Syntax.AST: CGotoPtr :: (CExpression a) -> a -> CStatement a
- Language.C.Syntax.AST: CIf :: CExpr -> CStat -> (Maybe CStat) -> NodeInfo -> CStat
+ Language.C.Syntax.AST: CIf :: (CExpression a) -> (CStatement a) -> (Maybe (CStatement a)) -> a -> CStatement a
- Language.C.Syntax.AST: CIndex :: CExpr -> CExpr -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CIndex :: (CExpression a) -> (CExpression a) -> a -> CExpression a
- Language.C.Syntax.AST: CInitExpr :: CExpr -> NodeInfo -> CInit
+ Language.C.Syntax.AST: CInitExpr :: (CExpression a) -> a -> CInitializer a
- Language.C.Syntax.AST: CInitList :: CInitList -> NodeInfo -> CInit
+ Language.C.Syntax.AST: CInitList :: (CInitializerList a) -> a -> CInitializer a
- Language.C.Syntax.AST: CInlineQual :: NodeInfo -> CTypeQual
+ Language.C.Syntax.AST: CInlineQual :: a -> CTypeQualifier a
- Language.C.Syntax.AST: CIntConst :: CInteger -> NodeInfo -> CConst
+ Language.C.Syntax.AST: CIntConst :: CInteger -> a -> CConstant a
- Language.C.Syntax.AST: CIntType :: NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CIntType :: a -> CTypeSpecifier a
- Language.C.Syntax.AST: CLabAddrExpr :: Ident -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CLabAddrExpr :: Ident -> a -> CExpression a
- Language.C.Syntax.AST: CLabel :: Ident -> CStat -> [CAttr] -> NodeInfo -> CStat
+ Language.C.Syntax.AST: CLabel :: Ident -> (CStatement a) -> [CAttribute a] -> a -> CStatement a
- Language.C.Syntax.AST: CLongType :: NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CLongType :: a -> CTypeSpecifier a
- Language.C.Syntax.AST: CMember :: CExpr -> Ident -> Bool -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CMember :: (CExpression a) -> Ident -> Bool -> a -> CExpression a
- Language.C.Syntax.AST: CMemberDesig :: Ident -> NodeInfo -> CDesignator
+ Language.C.Syntax.AST: CMemberDesig :: Ident -> a -> CPartDesignator a
- Language.C.Syntax.AST: CNestedFunDef :: CFunDef -> CBlockItem
+ Language.C.Syntax.AST: CNestedFunDef :: (CFunctionDef a) -> CCompoundBlockItem a
- Language.C.Syntax.AST: CNoArrSize :: Bool -> CArrSize
+ Language.C.Syntax.AST: CNoArrSize :: Bool -> CArraySize a
- Language.C.Syntax.AST: CPtrDeclr :: [CTypeQual] -> NodeInfo -> CDerivedDeclr
+ Language.C.Syntax.AST: CPtrDeclr :: [CTypeQualifier a] -> a -> CDerivedDeclarator a
- Language.C.Syntax.AST: CRangeDesig :: CExpr -> CExpr -> NodeInfo -> CDesignator
+ Language.C.Syntax.AST: CRangeDesig :: (CExpression a) -> (CExpression a) -> a -> CPartDesignator a
- Language.C.Syntax.AST: CRegister :: NodeInfo -> CStorageSpec
+ Language.C.Syntax.AST: CRegister :: a -> CStorageSpecifier a
- Language.C.Syntax.AST: CRestrQual :: NodeInfo -> CTypeQual
+ Language.C.Syntax.AST: CRestrQual :: a -> CTypeQualifier a
- Language.C.Syntax.AST: CReturn :: (Maybe CExpr) -> NodeInfo -> CStat
+ Language.C.Syntax.AST: CReturn :: (Maybe (CExpression a)) -> a -> CStatement a
- Language.C.Syntax.AST: CSUType :: CStructUnion -> NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CSUType :: (CStructureUnion a) -> a -> CTypeSpecifier a
- Language.C.Syntax.AST: CShortType :: NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CShortType :: a -> CTypeSpecifier a
- Language.C.Syntax.AST: CSignedType :: NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CSignedType :: a -> CTypeSpecifier a
- Language.C.Syntax.AST: CSizeofExpr :: CExpr -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CSizeofExpr :: (CExpression a) -> a -> CExpression a
- Language.C.Syntax.AST: CSizeofType :: CDecl -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CSizeofType :: (CDeclaration a) -> a -> CExpression a
- Language.C.Syntax.AST: CStatExpr :: CStat -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CStatExpr :: (CStatement a) -> a -> CExpression a
- Language.C.Syntax.AST: CStatic :: NodeInfo -> CStorageSpec
+ Language.C.Syntax.AST: CStatic :: a -> CStorageSpecifier a
- Language.C.Syntax.AST: CStorageSpec :: CStorageSpec -> CDeclSpec
+ Language.C.Syntax.AST: CStorageSpec :: (CStorageSpecifier a) -> CDeclarationSpecifier a
- Language.C.Syntax.AST: CStrConst :: CString -> NodeInfo -> CConst
+ Language.C.Syntax.AST: CStrConst :: CString -> a -> CConstant a
- Language.C.Syntax.AST: CStrLit :: CString -> NodeInfo -> CStrLit
+ Language.C.Syntax.AST: CStrLit :: CString -> a -> CStringLiteral a
- Language.C.Syntax.AST: CStruct :: CStructTag -> (Maybe Ident) -> (Maybe [CDecl]) -> [CAttr] -> NodeInfo -> CStructUnion
+ Language.C.Syntax.AST: CStruct :: CStructTag -> (Maybe Ident) -> (Maybe [CDeclaration a]) -> [CAttribute a] -> a -> CStructureUnion a
- Language.C.Syntax.AST: CSwitch :: CExpr -> CStat -> NodeInfo -> CStat
+ Language.C.Syntax.AST: CSwitch :: (CExpression a) -> (CStatement a) -> a -> CStatement a
- Language.C.Syntax.AST: CThread :: NodeInfo -> CStorageSpec
+ Language.C.Syntax.AST: CThread :: a -> CStorageSpecifier a
- Language.C.Syntax.AST: CTranslUnit :: [CExtDecl] -> NodeInfo -> CTranslUnit
+ Language.C.Syntax.AST: CTranslUnit :: [CExternalDeclaration a] -> a -> CTranslationUnit a
- Language.C.Syntax.AST: CTypeDef :: Ident -> NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CTypeDef :: Ident -> a -> CTypeSpecifier a
- Language.C.Syntax.AST: CTypeOfExpr :: CExpr -> NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CTypeOfExpr :: (CExpression a) -> a -> CTypeSpecifier a
- Language.C.Syntax.AST: CTypeOfType :: CDecl -> NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CTypeOfType :: (CDeclaration a) -> a -> CTypeSpecifier a
- Language.C.Syntax.AST: CTypeQual :: CTypeQual -> CDeclSpec
+ Language.C.Syntax.AST: CTypeQual :: (CTypeQualifier a) -> CDeclarationSpecifier a
- Language.C.Syntax.AST: CTypeSpec :: CTypeSpec -> CDeclSpec
+ Language.C.Syntax.AST: CTypeSpec :: (CTypeSpecifier a) -> CDeclarationSpecifier a
- Language.C.Syntax.AST: CTypedef :: NodeInfo -> CStorageSpec
+ Language.C.Syntax.AST: CTypedef :: a -> CStorageSpecifier a
- Language.C.Syntax.AST: CUnary :: CUnaryOp -> CExpr -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CUnary :: CUnaryOp -> (CExpression a) -> a -> CExpression a
- Language.C.Syntax.AST: CUnsigType :: NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CUnsigType :: a -> CTypeSpecifier a
- Language.C.Syntax.AST: CVar :: Ident -> NodeInfo -> CExpr
+ Language.C.Syntax.AST: CVar :: Ident -> a -> CExpression a
- Language.C.Syntax.AST: CVoidType :: NodeInfo -> CTypeSpec
+ Language.C.Syntax.AST: CVoidType :: a -> CTypeSpecifier a
- Language.C.Syntax.AST: CVolatQual :: NodeInfo -> CTypeQual
+ Language.C.Syntax.AST: CVolatQual :: a -> CTypeQualifier a
- Language.C.Syntax.AST: CWhile :: CExpr -> CStat -> Bool -> NodeInfo -> CStat
+ Language.C.Syntax.AST: CWhile :: (CExpression a) -> (CStatement a) -> Bool -> a -> CStatement a
- Language.C.Syntax.AST: cstringOfLit :: CStrLit -> CString
+ Language.C.Syntax.AST: cstringOfLit :: CStringLiteral a -> CString
- Language.C.Syntax.AST: isSUEDef :: CTypeSpec -> Bool
+ Language.C.Syntax.AST: isSUEDef :: CTypeSpecifier a -> Bool
- Language.C.Syntax.AST: liftStrLit :: CStrLit -> CConst
+ Language.C.Syntax.AST: liftStrLit :: CStringLiteral a -> CConstant a
- Language.C.Syntax.AST: partitionDeclSpecs :: [CDeclSpec] -> ([CStorageSpec], [CAttr], [CTypeQual], [CTypeSpec], Bool)
+ Language.C.Syntax.AST: partitionDeclSpecs :: [CDeclarationSpecifier a] -> ([CStorageSpecifier a], [CAttribute a], [CTypeQualifier a], [CTypeSpecifier a], Bool)
- Language.C.Syntax.AST: type CInitList = [([CDesignator], CInit)]
+ Language.C.Syntax.AST: type CInitList = CInitializerList NodeInfo

Files

ChangeLog view
@@ -1,22 +1,7 @@-Changes 0.3.1.1 - 0.3.2 (Bug fix release)-==========================================================================-  * Add UNPACK pragma for Ident-  * Allow '\r' at the end of line pragmas-  * Fix bug '0 is lexed as octal integer constant'-  * Fix pretty-printing of if-then-else--	* API Changes (hdiff)-		= Language.C.Analysis.TravMonad-			+ travErrors :: TravState s -> [CError]--Changes 0.3.1 - 0.3.1.1 (Bug fix release)+Changes since 0.3.1 ==========================================================================-  * Fix cabal file for compilation with GHC 6.10.1 (Aaron Tomb)-  * Fix bug #22: Set file permission after copying input (thanks to Kevin Charter for reporting this bug)-  * Fix bug #21: typedef can have more than one declarator (thanks to bkomuves for reporting this bug)-  * Fix bug #18: adjustPos (change to line of another file) should set column offset to one-  * Enhancement: add 'parseCFilePre' to module Language.C-  * Enhancement: Add initPos and adjustPos to Data.Position+Fr April 15 2011: Alexander Bernauer <bernauer@inf.ethz.ch>+  * Show instances (popular request) for AST types, DumpAst demo  Changes 0.3 - 0.3.1 ==========================================================================
README view
@@ -18,6 +18,11 @@  --flags="<flags-seperated-by-space>" to configure. +== Compatibility ==++Tested with ghc-6.12 (Ubuntu), ghc-7.0 (OSX 10.5, Linux) and ghc-7.2 (Linux).+It is recommended to use the most recent platform release: http://hackage.haskell.org/platform/.+ == Sources ==  see src/README
dist/build/Language/C/Parser/Lexer.hs view
@@ -1,14 +1,14 @@-{-# OPTIONS -fglasgow-exts -cpp #-}+{-# LANGUAGE CPP,MagicHash #-} {-# LINE 49 "src/Language/C/Parser/Lexer.x" #-}   module Language.C.Parser.Lexer (lexC, parseError) where  import Data.Char (isDigit)-import Control.Monad (liftM)+import Control.Monad (liftM, when)  import Language.C.Data.InputStream-import Language.C.Data.Position  (Position(..),posOf)+import Language.C.Data.Position import Language.C.Data.Ident    (mkIdent)  import Language.C.Syntax.Constants@@ -35,18 +35,18 @@ import GlaExts #endif alex_base :: AlexAddr-alex_base = AlexA# "\xf8\xff\xff\xff\x6e\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\xfc\xff\xff\xff\x78\x00\x00\x00\x82\x00\x00\x00\xb3\x00\x00\x00\xbd\x00\x00\x00\xee\x00\x00\x00\xf7\x00\x00\x00\x11\x01\x00\x00\x2b\x01\x00\x00\x45\x01\x00\x00\x5f\x01\x00\x00\x79\x01\x00\x00\x69\x01\x00\x00\x83\x01\x00\x00\xd4\x01\x00\x00\x34\x02\x00\x00\x94\x02\x00\x00\xf4\x02\x00\x00\x54\x03\x00\x00\xb4\x03\x00\x00\x12\x04\x00\x00\x5b\x04\x00\x00\x00\x00\x00\x00\xfd\xff\xff\xff\xfe\xff\xff\xff\xa8\xff\xff\xff\x9d\xff\xff\xff\xa4\xff\xff\xff\xab\xff\xff\xff\x9b\xff\xff\xff\x00\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x9c\xff\xff\xff\xa3\xff\xff\xff\xad\xff\xff\xff\xaf\xff\xff\xff\x81\x04\x00\x00\xda\x04\x00\x00\x31\x05\x00\x00\x00\x00\x00\x00\x7e\x05\x00\x00\xa9\x05\x00\x00\x71\x01\x00\x00\x75\x01\x00\x00\x7b\x01\x00\x00\xe9\x03\x00\x00\x01\x04\x00\x00\x10\x04\x00\x00\x83\x05\x00\x00\x8d\x00\x00\x00\xec\xff\xff\xff\xa9\xff\xff\xff\xc8\xff\xff\xff\x31\x00\x00\x00\x49\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\xcf\x05\x00\x00\xf5\x05\x00\x00\xe7\x05\x00\x00\xeb\x05\x00\x00\xf9\x05\x00\x00\xfd\x05\x00\x00\x03\x06\x00\x00\x1c\x06\x00\x00\x24\x06\x00\x00\xc7\x00\x00\x00\x3b\x00\x00\x00\xaa\xff\xff\xff\xcb\xff\xff\xff\x6c\x00\x00\x00\x4a\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x6a\x06\x00\x00\xb0\x06\x00\x00\x3d\x06\x00\x00\x5c\x06\x00\x00\xa2\x06\x00\x00\xb5\x06\x00\x00\xba\x06\x00\x00\xd6\x06\x00\x00\xdb\x06\x00\x00\x74\x01\x00\x00\x8e\x00\x00\x00\xe8\xff\xff\xff\x38\x00\x00\x00\xa8\x00\x00\x00\xc1\x00\x00\x00\x87\x00\x00\x00\x21\x07\x00\x00\x3a\x07\x00\x00\x76\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x07\x00\x00\x86\x07\x00\x00\x0b\x01\x00\x00\x9a\x07\x00\x00\xda\x07\x00\x00\x31\x01\x00\x00\x49\x01\x00\x00\x4a\x01\x00\x00\x1f\x08\x00\x00\x68\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x07\x00\x00\xfb\x07\x00\x00\x2d\x04\x00\x00\x7f\x08\x00\x00\xc5\x08\x00\x00\x4e\x04\x00\x00\xae\x05\x00\x00\xbe\x05\x00\x00\xdd\x08\x00\x00\x26\x09\x00\x00\x00\x00\x00\x00\x3a\x08\x00\x00\x3d\x09\x00\x00\x6b\x09\x00\x00\x73\x09\x00\x00\xc4\x05\x00\x00\xea\x05\x00\x00\x87\x09\x00\x00\xc7\x09\x00\x00\xef\x05\x00\x00\x0f\x06\x00\x00\xa7\x09\x00\x00\xe7\x09\x00\x00\x25\x06\x00\x00\x07\x0a\x00\x00\x1f\x0a\x00\x00\x3e\x0a\x00\x00\x87\x0a\x00\x00\x9e\x0a\x00\x00\xd5\x0a\x00\x00\x1e\x0b\x00\x00\x00\x00\x00\x00\xec\x0a\x00\x00\x35\x0b\x00\x00\x63\x0b\x00\x00\x6b\x0b\x00\x00\x6d\x06\x00\x00\x7d\x06\x00\x00\x7f\x0b\x00\x00\xbf\x0b\x00\x00\xab\x06\x00\x00\xb1\x06\x00\x00\x9f\x0b\x00\x00\xdf\x0b\x00\x00\xe2\x06\x00\x00\xff\x0b\x00\x00\x17\x0c\x00\x00\x36\x0c\x00\x00\x7f\x0c\x00\x00\x96\x0c\x00\x00\xcd\x0c\x00\x00\x16\x0d\x00\x00\x00\x00\x00\x00\x38\x0d\x00\x00\x5a\x0d\x00\x00\xea\x0c\x00\x00\x7b\x0d\x00\x00\x1f\x00\x00\x00\x82\x01\x00\x00\x03\x07\x00\x00\x9a\x0d\x00\x00\xbb\x0d\x00\x00\x26\x05\x00\x00\xd0\x0d\x00\x00\xf4\x0a\x00\x00\x00\x00\x00\x00\xda\x0d\x00\x00\x27\x00\x00\x00\x17\x04\x00\x00\xe6\x0d\x00\x00\x27\x0e\x00\x00\x4d\x0e\x00\x00\x69\x0e\x00\x00\x2d\x0d\x00\x00\x00\x00\x00\x00\xf1\x06\x00\x00\x39\x07\x00\x00\x5f\x04\x00\x00\x8b\x0e\x00\x00\xaa\x0e\x00\x00\xc0\x0e\x00\x00\xc8\x0e\x00\x00\xb0\x05\x00\x00\x6a\x07\x00\x00\xf6\x0e\x00\x00\x3b\x0f\x00\x00\x9c\x07\x00\x00\x53\x0f\x00\x00\x9c\x0f\x00\x00\xdc\x0e\x00\x00\xe5\x0f\x00\x00\x00\x00\x00\x00\x9e\x07\x00\x00\x81\x08\x00\x00\x6c\x07\x00\x00\xb3\x0f\x00\x00\xfe\x0f\x00\x00\x2c\x10\x00\x00\x34\x10\x00\x00\x8a\x07\x00\x00\x98\x08\x00\x00\x62\x10\x00\x00\xa7\x10\x00\x00\xc7\x08\x00\x00\xbf\x10\x00\x00\x08\x11\x00\x00\x48\x10\x00\x00\x51\x11\x00\x00\x00\x00\x00\x00\x63\x00\x00\x00\x66\x00\x00\x00\x68\x11\x00\x00\x8e\x11\x00\x00\xa5\x11\x00\x00\xcb\x11\x00\x00\xe2\x11\x00\x00\x08\x12\x00\x00\x1f\x12\x00\x00\x45\x12\x00\x00\x5c\x12\x00\x00\x82\x12\x00\x00\x99\x12\x00\x00\xbf\x12\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\xc9\x08\x00\x00\xf8\x08\x00\x00\x22\x09\x00\x00\x89\x09\x00\x00\x1f\x11\x00\x00\x04\x13\x00\x00\x8b\x09\x00\x00\x0c\x13\x00\x00\x38\x0a\x00\x00\x3a\x0a\x00\x00\xcb\x07\x00\x00\x23\x13\x00\x00\x51\x13\x00\x00\xcc\x07\x00\x00\x59\x13\x00\x00\x71\x13\x00\x00\xba\x13\x00\x00\xd1\x13\x00\x00\xf7\x13\x00\x00\x0e\x14\x00\x00\x34\x14\x00\x00\x4b\x14\x00\x00\x71\x14\x00\x00\x88\x14\x00\x00\xae\x14\x00\x00\xc5\x14\x00\x00\xeb\x14\x00\x00\x02\x15\x00\x00\x28\x15\x00\x00\x50\x15\x00\x00\x99\x15\x00\x00\xb0\x15\x00\x00\xd6\x15\x00\x00\xed\x15\x00\x00\x13\x16\x00\x00\x2a\x16\x00\x00\x50\x16\x00\x00\x67\x16\x00\x00\x8d\x16\x00\x00\xa4\x16\x00\x00\xca\x16\x00\x00\xe1\x16\x00\x00\x07\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x01\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x5a\x00\x00\x00\x5c\x00\x00\x00\x5e\x00\x00\x00\x9e\x00\x00\x00\x5f\x00\x00\x00\x64\x00\x00\x00\x86\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x00\x00\x00"#+alex_base = AlexA# "\xf8\xff\xff\xff\x6e\x00\x00\x00\x00\x00\x00\x00\xfc\xff\xff\xff\x73\x00\x00\x00\x7d\x00\x00\x00\xae\x00\x00\x00\xb8\x00\x00\x00\xe9\x00\x00\x00\xf2\x00\x00\x00\x0c\x01\x00\x00\x26\x01\x00\x00\x40\x01\x00\x00\x5a\x01\x00\x00\x74\x01\x00\x00\x64\x01\x00\x00\x7e\x01\x00\x00\xcf\x01\x00\x00\x2f\x02\x00\x00\x8f\x02\x00\x00\xef\x02\x00\x00\x4f\x03\x00\x00\xaf\x03\x00\x00\x0d\x04\x00\x00\x56\x04\x00\x00\x00\x00\x00\x00\xfd\xff\xff\xff\xfe\xff\xff\xff\xa8\xff\xff\xff\x9d\xff\xff\xff\xa4\xff\xff\xff\xab\xff\xff\xff\x9b\xff\xff\xff\x00\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x9c\xff\xff\xff\xa3\xff\xff\xff\xad\xff\xff\xff\xaf\xff\xff\xff\x7c\x04\x00\x00\xd5\x04\x00\x00\x2c\x05\x00\x00\x00\x00\x00\x00\x79\x05\x00\x00\xa4\x05\x00\x00\x6c\x01\x00\x00\x70\x01\x00\x00\x76\x01\x00\x00\xe4\x03\x00\x00\xfc\x03\x00\x00\x0b\x04\x00\x00\x7e\x05\x00\x00\x88\x00\x00\x00\xec\xff\xff\xff\xa9\xff\xff\xff\xc8\xff\xff\xff\x2c\x00\x00\x00\x44\x00\x00\x00\x29\x00\x00\x00\x00\x00\x00\x00\xca\x05\x00\x00\xf0\x05\x00\x00\xe2\x05\x00\x00\xe6\x05\x00\x00\xf4\x05\x00\x00\xf8\x05\x00\x00\xfe\x05\x00\x00\x17\x06\x00\x00\x1f\x06\x00\x00\xc2\x00\x00\x00\x36\x00\x00\x00\xaa\xff\xff\xff\xcb\xff\xff\xff\x67\x00\x00\x00\x45\x00\x00\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x65\x06\x00\x00\xab\x06\x00\x00\x38\x06\x00\x00\x57\x06\x00\x00\x9d\x06\x00\x00\xb0\x06\x00\x00\xb5\x06\x00\x00\xd1\x06\x00\x00\xd6\x06\x00\x00\x6f\x01\x00\x00\x89\x00\x00\x00\xe8\xff\xff\xff\x33\x00\x00\x00\xa3\x00\x00\x00\xbc\x00\x00\x00\x82\x00\x00\x00\x1c\x07\x00\x00\x35\x07\x00\x00\x71\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x07\x00\x00\x81\x07\x00\x00\x06\x01\x00\x00\x95\x07\x00\x00\xd5\x07\x00\x00\x2c\x01\x00\x00\x44\x01\x00\x00\x45\x01\x00\x00\x1a\x08\x00\x00\x63\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x07\x00\x00\xf6\x07\x00\x00\x28\x04\x00\x00\x7a\x08\x00\x00\xc0\x08\x00\x00\x49\x04\x00\x00\xa9\x05\x00\x00\xb9\x05\x00\x00\xd8\x08\x00\x00\x21\x09\x00\x00\x00\x00\x00\x00\x35\x08\x00\x00\x38\x09\x00\x00\x66\x09\x00\x00\x6e\x09\x00\x00\xbf\x05\x00\x00\xe5\x05\x00\x00\x82\x09\x00\x00\xc2\x09\x00\x00\xea\x05\x00\x00\x0a\x06\x00\x00\xa2\x09\x00\x00\xe2\x09\x00\x00\x20\x06\x00\x00\x02\x0a\x00\x00\x1a\x0a\x00\x00\x39\x0a\x00\x00\x82\x0a\x00\x00\x99\x0a\x00\x00\xd0\x0a\x00\x00\x19\x0b\x00\x00\x00\x00\x00\x00\xe7\x0a\x00\x00\x30\x0b\x00\x00\x5e\x0b\x00\x00\x66\x0b\x00\x00\x68\x06\x00\x00\x78\x06\x00\x00\x7a\x0b\x00\x00\xba\x0b\x00\x00\xa6\x06\x00\x00\xac\x06\x00\x00\x9a\x0b\x00\x00\xda\x0b\x00\x00\xdd\x06\x00\x00\xfa\x0b\x00\x00\x12\x0c\x00\x00\x31\x0c\x00\x00\x7a\x0c\x00\x00\x91\x0c\x00\x00\xc8\x0c\x00\x00\x11\x0d\x00\x00\x00\x00\x00\x00\x33\x0d\x00\x00\x55\x0d\x00\x00\xe5\x0c\x00\x00\x76\x0d\x00\x00\x1a\x00\x00\x00\x7d\x01\x00\x00\xfe\x06\x00\x00\x95\x0d\x00\x00\xb6\x0d\x00\x00\x21\x05\x00\x00\xcb\x0d\x00\x00\xef\x0a\x00\x00\x00\x00\x00\x00\xd5\x0d\x00\x00\x1f\x00\x00\x00\x12\x04\x00\x00\xe1\x0d\x00\x00\x22\x0e\x00\x00\x48\x0e\x00\x00\x64\x0e\x00\x00\x28\x0d\x00\x00\x00\x00\x00\x00\xec\x06\x00\x00\x34\x07\x00\x00\x5a\x04\x00\x00\x86\x0e\x00\x00\xa5\x0e\x00\x00\xbb\x0e\x00\x00\xc3\x0e\x00\x00\xab\x05\x00\x00\x65\x07\x00\x00\xf1\x0e\x00\x00\x36\x0f\x00\x00\x97\x07\x00\x00\x4e\x0f\x00\x00\x97\x0f\x00\x00\xd7\x0e\x00\x00\xe0\x0f\x00\x00\x00\x00\x00\x00\x99\x07\x00\x00\x7c\x08\x00\x00\x67\x07\x00\x00\xae\x0f\x00\x00\xf9\x0f\x00\x00\x27\x10\x00\x00\x2f\x10\x00\x00\x85\x07\x00\x00\x93\x08\x00\x00\x5d\x10\x00\x00\xa2\x10\x00\x00\xc2\x08\x00\x00\xba\x10\x00\x00\x03\x11\x00\x00\x43\x10\x00\x00\x4c\x11\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x64\x00\x00\x00\x63\x11\x00\x00\x89\x11\x00\x00\xa0\x11\x00\x00\xc6\x11\x00\x00\xdd\x11\x00\x00\x03\x12\x00\x00\x1a\x12\x00\x00\x40\x12\x00\x00\x57\x12\x00\x00\x7d\x12\x00\x00\x94\x12\x00\x00\xba\x12\x00\x00\x00\x00\x00\x00\x65\x00\x00\x00\xc4\x08\x00\x00\xf3\x08\x00\x00\x1d\x09\x00\x00\x84\x09\x00\x00\x1a\x11\x00\x00\xff\x12\x00\x00\x86\x09\x00\x00\x07\x13\x00\x00\x33\x0a\x00\x00\x35\x0a\x00\x00\xc6\x07\x00\x00\x1e\x13\x00\x00\x4c\x13\x00\x00\xc7\x07\x00\x00\x54\x13\x00\x00\x6c\x13\x00\x00\xb5\x13\x00\x00\xcc\x13\x00\x00\xf2\x13\x00\x00\x09\x14\x00\x00\x2f\x14\x00\x00\x46\x14\x00\x00\x6c\x14\x00\x00\x83\x14\x00\x00\xa9\x14\x00\x00\xc0\x14\x00\x00\xe6\x14\x00\x00\xfd\x14\x00\x00\x23\x15\x00\x00\x4b\x15\x00\x00\x94\x15\x00\x00\xab\x15\x00\x00\xd1\x15\x00\x00\xe8\x15\x00\x00\x0e\x16\x00\x00\x25\x16\x00\x00\x4b\x16\x00\x00\x62\x16\x00\x00\x88\x16\x00\x00\x9f\x16\x00\x00\xc5\x16\x00\x00\xdc\x16\x00\x00\x02\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x52\x00\x00\x00\x55\x00\x00\x00\x57\x00\x00\x00\x99\x00\x00\x00\x59\x00\x00\x00\x5f\x00\x00\x00\x5a\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x00\x00"#  alex_table :: AlexAddr-alex_table = AlexA# "\x00\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x03\x00\x1a\x00\x1a\x00\x1b\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x22\x00\x22\x00\x23\x00\x25\x00\x26\x00\x27\x00\x2c\x00\x2c\x00\x3d\x00\x3d\x00\x02\x00\x20\x01\xbe\x00\x10\x00\x29\x00\x27\x01\x28\x01\x6c\x00\x1a\x01\x1b\x01\x25\x01\x23\x01\x42\x01\x1f\x01\xad\x00\x26\x01\x2d\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x37\x01\x43\x01\x2a\x01\x30\x01\x2c\x01\x36\x01\x39\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x1c\x01\x4e\x00\x1d\x01\x32\x01\x29\x00\x38\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x44\x01\x33\x01\x45\x01\x21\x01\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x09\x00\x03\x00\x2c\x00\x4e\x00\x04\x00\x2c\x00\x4a\x00\xa6\x00\xa6\x00\xde\x00\x09\x00\x03\x00\xde\x00\x02\x00\x04\x00\xb3\x00\xb3\x00\xed\x00\x02\x00\x31\x01\x3c\x00\x4d\x00\x3a\x01\x09\x00\x3b\x01\x12\x00\x3c\x01\x40\x01\x3c\x00\x2c\x00\x3d\x00\x29\x01\x2d\x01\x09\x00\x2c\x00\x12\x00\x3d\x00\x2c\x00\x49\x00\x06\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x06\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x0a\x00\x03\x00\x2c\x00\x3d\x00\x04\x00\x3d\x00\x22\x01\x41\x01\x34\x01\x3d\x00\x0a\x00\x03\x00\x2e\x01\x2b\x01\x04\x00\x46\x01\x2f\x01\x3e\x01\x00\x00\x00\x00\x3f\x01\x00\x00\x00\x00\x0a\x00\x38\x01\x12\x00\x00\x00\x00\x00\x4d\x00\x3b\x00\x5b\x00\x3d\x01\x4e\x00\x0a\x00\x00\x00\x12\x00\x00\x00\x3d\x00\x37\x00\x08\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x08\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x09\x00\x03\x00\x3a\x00\x5a\x00\x04\x00\x4e\x00\x4e\x00\x00\x00\x00\x00\x0a\x00\x03\x00\x37\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x09\x00\x35\x01\x12\x00\x00\x00\x00\x00\x4c\x00\x5e\x00\xff\xff\x4e\x00\x0a\x00\xff\xff\x12\x00\x0c\x00\x03\x00\x48\x00\x4e\x00\x04\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0c\x00\x63\x00\x4b\x00\x0c\x00\x03\x00\x4e\x00\x00\x00\x04\x00\x00\x00\x00\x00\xff\xff\x48\x00\x00\x00\xff\xff\x00\x00\x24\x01\x00\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0c\x00\x00\x00\x00\x00\x0f\x00\x03\x00\x39\x01\x1e\x01\x04\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x62\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0f\x00\x00\x00\x8c\x00\x0f\x00\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x64\x00\xff\xff\x11\x00\x00\x00\x00\x00\x0e\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0f\x00\x00\x00\x00\x00\x0f\x00\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x11\x00\x8b\x00\x00\x00\x0e\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0f\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x11\x00\x00\x00\x8b\x00\x6d\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x31\x00\x00\x00\x00\x00\x5d\x00\x61\x00\x61\x00\x00\x00\x00\x00\x00\x00\x61\x00\x35\x00\xa6\x00\x59\x00\x61\x00\x61\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x61\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x2c\x00\x2c\x00\x00\x00\x30\x00\x2c\x00\x2c\x00\x5c\x00\x35\x00\x61\x00\x00\x00\x2c\x00\x2c\x00\x61\x00\x61\x00\xa6\x00\x59\x00\x61\x00\x61\x00\x28\x00\x00\x00\xa6\x00\x00\x00\x61\x00\x00\x00\x00\x00\x21\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x61\x00\x00\x00\xff\xff\x00\x00\x13\x00\xff\xff\x00\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x13\x00\x2c\x00\x2c\x00\x70\x00\x34\x00\x35\x00\x13\x00\xff\xff\x00\x00\x00\x00\xff\xff\x61\x00\xb3\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\xff\xff\x2c\x00\x2c\x00\xff\xff\x61\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x13\x00\x6f\x00\x35\x00\x13\x00\x13\x00\x2c\x00\x2c\x00\x00\x00\x61\x00\xb3\x00\x00\x00\x00\x00\x13\x00\xbc\x00\x00\x00\xb3\x00\x13\x00\x35\x00\x13\x00\x00\x00\x13\x00\xa1\x00\x19\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\xc9\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\xcf\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\xa7\x00\x00\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\xae\x00\xae\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x33\x00\xff\xff\x00\x00\x00\x00\xff\xff\x61\x00\x00\x00\xff\xff\xbc\x00\x2f\x00\x00\x00\x71\x00\x5f\x00\xa7\x00\x61\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\xae\x00\xae\x00\xb1\x00\x00\x00\xff\xff\x00\x00\x36\x00\x36\x00\x00\x00\x32\x00\x7c\x00\x2c\x00\x2c\x00\xb1\x00\x61\x00\x00\x00\x00\x00\x00\x00\x2f\x00\xff\xff\x33\x00\x60\x00\xff\xff\x61\x00\xff\xff\x00\x00\x00\x00\xff\xff\xa7\x00\x2f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x00\x00\xa0\x00\x00\x00\xc9\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x7c\x00\x36\x00\x36\x00\xb1\x00\x32\x00\x7c\x00\x00\x00\x00\x00\xff\xff\x7a\x00\x44\x00\xff\xff\x00\x00\x2f\x00\x00\x00\x8f\x00\x00\x00\x00\x00\xa7\x00\x40\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\xff\xff\x00\x00\x00\x00\xff\xff\x42\x00\xb1\x00\x00\x00\x7c\x00\x61\x00\x47\x00\x47\x00\xb1\x00\x43\x00\x61\x00\x00\x00\x00\x00\x00\x00\x61\x00\x44\x00\x00\x00\x00\x00\x40\x00\x46\x00\x8f\x00\x00\x00\x00\x00\x61\x00\x40\x00\x8f\x00\x7c\x00\x00\x00\x61\x00\x45\x00\x3d\x00\x3d\x00\x46\x00\x41\x00\x3d\x00\x3d\x00\x00\x00\x46\x00\x46\x00\x00\x00\xb1\x00\x00\x00\x61\x00\x00\x00\x47\x00\x47\x00\x61\x00\x43\x00\x3d\x00\x3d\x00\x00\x00\x61\x00\x3d\x00\x3d\x00\x61\x00\x45\x00\x40\x00\x8f\x00\x3d\x00\x3d\x00\x61\x00\x61\x00\x61\x00\x46\x00\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x46\x00\x61\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3d\x00\xff\xff\x61\x00\x53\x00\xff\xff\x00\x00\x00\x00\x3d\x00\x3d\x00\x00\x00\x61\x00\x46\x00\x61\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x91\x00\x00\x00\x4e\x00\x4e\x00\x61\x00\x52\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x61\x00\x61\x00\x00\x00\x00\x00\xff\xff\x55\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x00\x4e\x00\x00\x00\x57\x00\xa4\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x61\x00\x91\x00\x58\x00\x58\x00\x00\x00\x54\x00\x00\x00\x91\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x51\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x00\x00\x00\x00\xff\xff\x00\x00\x57\x00\xff\xff\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x61\x00\x00\x00\x00\x00\x00\x00\xff\xff\x55\x00\x00\x00\xff\xff\x00\x00\xba\x00\x61\x00\x00\x00\x00\x00\x00\x00\x51\x00\x56\x00\xa4\x00\x00\x00\x91\x00\x57\x00\x4e\x00\x4e\x00\xa4\x00\x61\x00\x57\x00\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x61\x00\xff\xff\x58\x00\x58\x00\x00\x00\x54\x00\x00\x00\x4e\x00\x4e\x00\xba\x00\x56\x00\x61\x00\x4e\x00\x4e\x00\x51\x00\x61\x00\x61\x00\x00\x00\x00\x00\x57\x00\x57\x00\x00\x00\x00\x00\x00\x00\x57\x00\x61\x00\x47\x01\x00\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\xa4\x00\x4e\x00\x4e\x00\x00\x00\x61\x00\xff\xff\x4e\x00\x4e\x00\xff\xff\x61\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x61\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\xb9\x00\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\xff\xff\x00\x00\x00\x00\xff\xff\xbd\x00\x00\x00\xcd\x00\x00\x00\xff\xff\xbf\x00\x00\x00\xff\xff\xff\xff\xca\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x00\x00\x00\x00\x00\x00\xff\xff\x62\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xcd\x00\x63\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\xbd\x00\x00\x00\x00\x00\x63\x00\x00\x00\xbf\x00\xff\xff\xff\xff\xca\x00\xff\xff\xda\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x8b\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x6f\x00\x8c\x00\x00\x00\xff\xff\x00\x00\xda\x00\xff\xff\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\xff\xff\xff\xff\x00\x00\x00\x00\x8c\x00\x00\x00\xca\x00\x00\x00\xfe\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x62\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\xfe\x00\xff\xff\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x6a\x00\x00\x00\x00\x00\xff\xff\x00\x00\x6a\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x6a\x00\x00\x00\x00\x00\x6b\x00\x6a\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x6a\x00\xff\xff\x00\x00\x00\x00\x6a\x00\x00\x00\x6a\x00\xe1\x00\x6a\x00\x8f\x00\x6e\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\xff\xff\xce\x00\x00\x00\xff\xff\x70\x00\x00\x00\xd0\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x00\x00\x00\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\xff\xff\x00\x00\xce\x00\x00\x00\xef\x00\x6f\x00\x00\x00\xd0\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xdb\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x77\x00\x00\x00\x00\x00\xff\xff\x00\x00\x77\x00\xff\xff\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\x77\x00\x00\x00\x00\x00\xff\xff\x00\x00\xa0\x00\x78\x00\xdb\x00\x00\x00\x0c\x01\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x77\x00\x00\x00\x00\x00\x78\x00\x77\x00\xef\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x77\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x77\x00\xe1\x00\x77\x00\x0c\x01\x7b\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x0c\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x8f\x00\x7c\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\xef\x00\x00\x00\xef\x00\x7c\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x7c\x00\x8f\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x0c\x01\x00\x00\x0c\x01\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x7c\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x7c\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x85\x00\xff\xff\x8f\x00\xff\xff\xff\xff\x85\x00\xff\xff\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x00\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\xef\x00\x00\x00\x85\x00\xff\xff\x85\x00\xff\xff\x00\x00\x8f\x00\x85\x00\x85\x00\x00\x00\x00\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x85\x00\x00\x00\x00\x00\x85\x00\x85\x00\x00\x00\x85\x00\x85\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x85\x00\x0c\x01\x85\x00\x0c\x01\x8d\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x85\x00\x00\x00\x00\x00\x85\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x85\x00\x00\x00\x85\x00\x00\x00\x8e\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x86\x00\x00\x00\xff\xff\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x86\x00\x00\x00\x00\x00\x86\x00\x86\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x86\x00\x00\x00\x00\x00\x00\x00\x86\x00\xa4\x00\x86\x00\x00\x00\x86\x00\x00\x00\x90\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x91\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x91\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x91\x00\xa4\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x91\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x91\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9a\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x00\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\x00\x00\xa4\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x9a\x00\x9a\x00\x00\x00\x9a\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\xa3\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x9b\x00\xab\x00\x00\x00\x9b\x00\x9b\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x9b\x00\x00\x00\x9b\x00\x00\x00\xa5\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\xab\x00\x00\x00\x00\x00\xac\x00\xac\x00\x00\x00\xab\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\x00\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\xaf\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\xab\x00\xaf\x00\xab\x00\xac\x00\xac\x00\x00\x00\xab\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\xab\x00\xab\x00\x00\x00\xac\x00\xac\x00\x00\x00\xab\x00\xab\x00\xa7\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xab\x00\x00\x00\x00\x00\xac\x00\xac\x00\xb0\x00\xab\x00\xb0\x00\x00\x00\x00\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\xb2\x00\x00\x00\xb1\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x00\x00\xb6\x00\xb6\x00\x00\x00\xb5\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xbb\x00\xff\xff\xbb\x00\xba\x00\xff\xff\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xbd\x00\xff\xff\x00\x00\x00\x00\x00\x00\xbf\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\xc9\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\xca\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\x00\xbf\x00\x00\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc8\x00\x00\x00\xff\xff\xbf\x00\x00\x00\xc8\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xcb\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\xc8\x00\x00\x00\x00\x00\xc8\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xc8\x00\xff\xff\x00\x00\x00\x00\xc8\x00\xda\x00\xc8\x00\x00\x01\xc8\x00\x00\x00\xcc\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\xdb\x00\xd0\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\xda\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\xdb\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x00\xd0\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\xd0\x00\x00\x00\x00\x00\xd0\x00\xd0\x00\x00\x00\x00\x00\x00\x00\xff\xff\xd9\x00\x00\x00\xff\xff\xd0\x00\x00\x00\xd9\x00\x00\x00\xd0\x00\x00\x00\xd0\x00\x00\x00\xd0\x00\x00\x00\xdc\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\x00\x00\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\xd9\x00\x00\x00\x00\x00\xd9\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x0c\x01\xd9\x00\x00\x01\xd9\x00\x00\x00\xdd\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\x00\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\x00\x00\x00\x00\x00\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\x00\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\x00\x00\x00\x00\x00\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\x00\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\x00\x00\x00\x00\x00\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\x00\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x00\x00\x00\x00\x00\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\x00\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xef\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x0c\x01\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\xff\xff\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x00\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\xf9\x00\x00\x00\x00\x00\x00\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x00\xf9\x00\x00\x00\x00\x00\xf9\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\xf9\x00\x00\x01\xf9\x00\x00\x00\xff\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x00\x00\x00\x00\x00\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\x00\x00\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x00\x00\x00\x00\x00\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x00\x00\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x00\x00\x00\x00\x00\x00\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x00\x00\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x00\x00\x00\x00\x00\x00\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\x00\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\xf2\x00\x00\x00\x00\x00\xf2\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\xf2\x00\x0e\x01\xf2\x00\x00\x00\x0d\x01\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x00\x00\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x00\x00\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x00\x00\x00\x00\x00\x00\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x00\x00\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x00\x00\x00\x00\x00\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x00\x00\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x00\x00\x00\x00\x00\x00\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x00\x00\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x00\x00\x00\x00\x00\x00\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x00\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x00\x00\x00\x00\x00\x00\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x00\x00\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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_table = AlexA# "\x00\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x02\x00\x19\x00\x19\x00\x1a\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x21\x00\x21\x00\x22\x00\x24\x00\x25\x00\x26\x00\x2b\x00\x2b\x00\x3c\x00\x3c\x00\x01\x00\x1f\x01\xbd\x00\x0f\x00\x28\x00\x26\x01\x27\x01\x6b\x00\x19\x01\x1a\x01\x24\x01\x22\x01\x41\x01\x1e\x01\xac\x00\x25\x01\x2c\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x36\x01\x42\x01\x29\x01\x2f\x01\x2b\x01\x35\x01\x38\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x29\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x1b\x01\x4d\x00\x1c\x01\x31\x01\x28\x00\x37\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x43\x01\x32\x01\x44\x01\x20\x01\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x08\x00\x02\x00\x2b\x00\x4d\x00\x03\x00\x2b\x00\x49\x00\xa5\x00\xa5\x00\xdd\x00\x08\x00\x02\x00\xb2\x00\xb2\x00\x03\x00\xdd\x00\xec\x00\x30\x01\x01\x00\x39\x01\x3b\x00\x4c\x00\x3a\x01\x08\x00\x3b\x01\x11\x00\x3f\x01\x40\x01\x3b\x00\x2b\x00\x3c\x00\x28\x01\x2c\x01\x08\x00\x2b\x00\x11\x00\x3c\x00\x2b\x00\x48\x00\x05\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x05\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x09\x00\x02\x00\x2b\x00\x3c\x00\x03\x00\x3c\x00\x21\x01\x2e\x01\x33\x01\x3c\x00\x09\x00\x02\x00\x2d\x01\x2a\x01\x03\x00\x45\x01\x3d\x01\x3e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x37\x01\x11\x00\x00\x00\x00\x00\x4c\x00\x3a\x00\x5a\x00\x3c\x01\x4d\x00\x09\x00\x00\x00\x11\x00\x00\x00\x3c\x00\x36\x00\x07\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x07\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x08\x00\x02\x00\x39\x00\x59\x00\x03\x00\x4d\x00\x4d\x00\x00\x00\x00\x00\x09\x00\x02\x00\x36\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x01\x5d\x00\x08\x00\x00\x00\x11\x00\x00\x00\x00\x00\x4b\x00\x5d\x00\xff\xff\x4d\x00\x09\x00\xff\xff\x11\x00\x0b\x00\x02\x00\x47\x00\x4d\x00\x03\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0b\x00\x62\x00\x4a\x00\x0b\x00\x02\x00\x4d\x00\x00\x00\x03\x00\x00\x00\x00\x00\xff\xff\x47\x00\x00\x00\xff\xff\x00\x00\x23\x01\x00\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0b\x00\x00\x00\x00\x00\x0e\x00\x02\x00\x38\x01\x1d\x01\x03\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x61\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0e\x00\x00\x00\x8b\x00\x0e\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x63\x00\xff\xff\x10\x00\x00\x00\x00\x00\x0d\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0e\x00\x00\x00\x00\x00\x0e\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x10\x00\x8a\x00\x00\x00\x0d\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0e\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x10\x00\x00\x00\x8a\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x30\x00\x00\x00\x00\x00\x5c\x00\x60\x00\x60\x00\x00\x00\x00\x00\x00\x00\x60\x00\x34\x00\xa5\x00\x58\x00\x60\x00\x60\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x60\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x2b\x00\x2b\x00\x00\x00\x2f\x00\x2b\x00\x2b\x00\x5b\x00\x34\x00\x60\x00\x00\x00\x2b\x00\x2b\x00\x60\x00\x60\x00\xa5\x00\x58\x00\x60\x00\x60\x00\x27\x00\x00\x00\xa5\x00\x00\x00\x60\x00\x00\x00\x00\x00\x20\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\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\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\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\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\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\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\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\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\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\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x60\x00\x00\x00\xff\xff\x00\x00\x12\x00\xff\xff\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x12\x00\x2b\x00\x2b\x00\x6f\x00\x33\x00\x34\x00\x12\x00\xff\xff\x00\x00\x00\x00\xff\xff\x60\x00\xb2\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\xff\xff\x2b\x00\x2b\x00\xff\xff\x60\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\x6e\x00\x34\x00\x12\x00\x12\x00\x2b\x00\x2b\x00\x00\x00\x60\x00\xb2\x00\x00\x00\x00\x00\x12\x00\xbb\x00\x00\x00\xb2\x00\x12\x00\x34\x00\x12\x00\x00\x00\x12\x00\xa0\x00\x18\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xc8\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xce\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xa6\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\xad\x00\xad\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x32\x00\xff\xff\x00\x00\x00\x00\xff\xff\x60\x00\x00\x00\xff\xff\xbb\x00\x2e\x00\x00\x00\x70\x00\x5e\x00\xa6\x00\x60\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\xad\x00\xad\x00\xb0\x00\x00\x00\xff\xff\x00\x00\x35\x00\x35\x00\x00\x00\x31\x00\x7b\x00\x2b\x00\x2b\x00\xb0\x00\x60\x00\x00\x00\x00\x00\x00\x00\x2e\x00\xff\xff\x32\x00\x5f\x00\xff\xff\x60\x00\xff\xff\x00\x00\x00\x00\xff\xff\xa6\x00\x2e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x00\x00\x9f\x00\x00\x00\xc8\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x7b\x00\x35\x00\x35\x00\xb0\x00\x31\x00\x7b\x00\x00\x00\x00\x00\xff\xff\x79\x00\x43\x00\xff\xff\x00\x00\x2e\x00\x00\x00\x8e\x00\x00\x00\x00\x00\xa6\x00\x3f\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\xff\xff\x00\x00\x00\x00\xff\xff\x41\x00\xb0\x00\x00\x00\x7b\x00\x60\x00\x46\x00\x46\x00\xb0\x00\x42\x00\x60\x00\x00\x00\x00\x00\x00\x00\x60\x00\x43\x00\x00\x00\x00\x00\x3f\x00\x45\x00\x8e\x00\x00\x00\x00\x00\x60\x00\x3f\x00\x8e\x00\x7b\x00\x00\x00\x60\x00\x44\x00\x3c\x00\x3c\x00\x45\x00\x40\x00\x3c\x00\x3c\x00\x00\x00\x45\x00\x45\x00\x00\x00\xb0\x00\x00\x00\x60\x00\x00\x00\x46\x00\x46\x00\x60\x00\x42\x00\x3c\x00\x3c\x00\x00\x00\x60\x00\x3c\x00\x3c\x00\x60\x00\x44\x00\x3f\x00\x8e\x00\x3c\x00\x3c\x00\x60\x00\x60\x00\x60\x00\x45\x00\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x45\x00\x60\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x3c\x00\xff\xff\x60\x00\x52\x00\xff\xff\x00\x00\x00\x00\x3c\x00\x3c\x00\x00\x00\x60\x00\x45\x00\x60\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x90\x00\x00\x00\x4d\x00\x4d\x00\x60\x00\x51\x00\x00\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x60\x00\x60\x00\x00\x00\x00\x00\xff\xff\x54\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x4d\x00\x00\x00\x56\x00\xa3\x00\x00\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x60\x00\x90\x00\x57\x00\x57\x00\x00\x00\x53\x00\x00\x00\x90\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x50\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x00\x00\x00\x00\xff\xff\x00\x00\x56\x00\xff\xff\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x60\x00\x00\x00\x00\x00\x00\x00\xff\xff\x54\x00\x00\x00\xff\xff\x00\x00\xb9\x00\x60\x00\x00\x00\x00\x00\x00\x00\x50\x00\x55\x00\xa3\x00\x00\x00\x90\x00\x56\x00\x4d\x00\x4d\x00\xa3\x00\x60\x00\x56\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x60\x00\xff\xff\x57\x00\x57\x00\x00\x00\x53\x00\x00\x00\x4d\x00\x4d\x00\xb9\x00\x55\x00\x60\x00\x4d\x00\x4d\x00\x50\x00\x60\x00\x60\x00\x00\x00\x00\x00\x56\x00\x56\x00\x00\x00\x00\x00\x00\x00\x56\x00\x60\x00\x46\x01\x00\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\x00\x00\xa3\x00\x4d\x00\x4d\x00\x00\x00\x60\x00\xff\xff\x4d\x00\x4d\x00\xff\xff\x60\x00\x00\x00\x00\x00\x00\x00\x56\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x60\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\xb8\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x00\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\xff\xff\x00\x00\x00\x00\xff\xff\xbc\x00\x00\x00\xcc\x00\x00\x00\xff\xff\xbe\x00\x00\x00\xff\xff\xff\xff\xc9\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x00\x00\x00\x00\x00\x00\xff\xff\x61\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xcc\x00\x62\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\xbc\x00\x00\x00\x00\x00\x62\x00\x00\x00\xbe\x00\xff\xff\xff\xff\xc9\x00\xff\xff\xd9\x00\x00\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x8a\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x6e\x00\x8b\x00\x00\x00\xff\xff\x00\x00\xd9\x00\xff\xff\x00\x00\x00\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\xff\xff\xff\xff\x00\x00\x00\x00\x8b\x00\x00\x00\xc9\x00\x00\x00\xfd\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x61\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x00\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\xfd\x00\xff\xff\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x69\x00\x00\x00\x00\x00\xff\xff\x00\x00\x69\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x00\x69\x00\x00\x00\x00\x00\x6a\x00\x69\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x69\x00\xff\xff\x00\x00\x00\x00\x69\x00\x00\x00\x69\x00\xe0\x00\x69\x00\x8e\x00\x6d\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\xff\xff\xcd\x00\x00\x00\xff\xff\x6f\x00\x00\x00\xcf\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\x00\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\xda\x00\x00\x00\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\xff\xff\x00\x00\xcd\x00\x00\x00\xee\x00\x6e\x00\x00\x00\xcf\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xda\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x76\x00\x00\x00\x00\x00\xff\xff\x00\x00\x76\x00\xff\xff\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\x76\x00\x00\x00\x00\x00\xff\xff\x00\x00\x9f\x00\x77\x00\xda\x00\x00\x00\x0b\x01\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x76\x00\x00\x00\x00\x00\x77\x00\x76\x00\xee\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x76\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x76\x00\xe0\x00\x76\x00\x0b\x01\x7a\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x0b\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x7b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x8e\x00\x7b\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\xee\x00\x00\x00\xee\x00\x7b\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x7b\x00\x8e\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x0b\x01\x00\x00\x0b\x01\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x7b\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x7b\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x84\x00\xff\xff\x8e\x00\xff\xff\xff\xff\x84\x00\xff\xff\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x00\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\xee\x00\x00\x00\x84\x00\xff\xff\x84\x00\xff\xff\x00\x00\x8e\x00\x84\x00\x84\x00\x00\x00\x00\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x84\x00\x00\x00\x00\x00\x84\x00\x84\x00\x00\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x84\x00\x0b\x01\x84\x00\x0b\x01\x8c\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x84\x00\x00\x00\x00\x00\x84\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x84\x00\x00\x00\x84\x00\x00\x00\x8d\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x00\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x85\x00\x00\x00\xff\xff\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x85\x00\x00\x00\x00\x00\x85\x00\x85\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x85\x00\x00\x00\x00\x00\x00\x00\x85\x00\xa3\x00\x85\x00\x00\x00\x85\x00\x00\x00\x8f\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x90\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x90\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x90\x00\xa3\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x90\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x90\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x99\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x99\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x00\x00\x91\x00\x91\x00\x91\x00\x91\x00\x91\x00\x91\x00\x91\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\x00\x00\xa3\x00\x99\x00\x99\x00\x00\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\x00\x00\x99\x00\x99\x00\x00\x00\x99\x00\x99\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\xa1\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x00\x00\x00\x00\x99\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\xa2\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x9a\x00\xaa\x00\x00\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\xa4\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\xaa\x00\x00\x00\x00\x00\xab\x00\xab\x00\x00\x00\xaa\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\xae\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\xaa\x00\xae\x00\xaa\x00\xab\x00\xab\x00\x00\x00\xaa\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\xaa\x00\xaa\x00\x00\x00\xab\x00\xab\x00\x00\x00\xaa\x00\xaa\x00\xa6\x00\x00\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\xaa\x00\x00\x00\x00\x00\xab\x00\xab\x00\xaf\x00\xaa\x00\xaf\x00\x00\x00\x00\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb1\x00\x00\x00\xb0\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\x00\x00\xb4\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xba\x00\xff\xff\xba\x00\xb9\x00\xff\xff\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xbc\x00\xff\xff\x00\x00\x00\x00\x00\x00\xbe\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\x00\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\xc8\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\x00\x00\xc9\x00\x00\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\xbe\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\xbe\x00\x00\x00\x00\x00\xbe\x00\xbe\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc7\x00\x00\x00\xff\xff\xbe\x00\x00\x00\xc7\x00\x00\x00\xbe\x00\x00\x00\xbe\x00\x00\x00\xbe\x00\x00\x00\xca\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xc7\x00\xff\xff\x00\x00\x00\x00\xc7\x00\xd9\x00\xc7\x00\xff\x00\xc7\x00\x00\x00\xcb\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\xda\x00\xcf\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xd9\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\xda\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\xcf\x00\x00\x00\x00\x00\xcf\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xff\xff\xd8\x00\x00\x00\xff\xff\xcf\x00\x00\x00\xd8\x00\x00\x00\xcf\x00\x00\x00\xcf\x00\x00\x00\xcf\x00\x00\x00\xdb\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\x00\x00\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x0b\x01\xd8\x00\xff\x00\xd8\x00\x00\x00\xdc\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\x00\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\x00\x00\x00\x00\x00\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\x00\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\x00\x00\x00\x00\x00\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\x00\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\x00\x00\x00\x00\x00\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\x00\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\x00\x00\x00\x00\x00\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x00\x00\x00\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\x00\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xee\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x0b\x01\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\xff\xff\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\xf8\x00\x00\x00\x00\x00\x00\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\xf8\x00\xff\x00\xf8\x00\x00\x00\xfe\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\x00\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00\x00\x00\x00\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x00\x00\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x00\x00\x00\x00\x00\x00\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x00\x00\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x00\x00\x00\x00\x00\x00\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x00\x00\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x00\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\xf1\x00\x00\x00\x00\x00\xf1\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\xf1\x00\x0d\x01\xf1\x00\x00\x00\x0c\x01\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x00\x00\x00\x00\x00\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x00\x00\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x00\x00\x00\x00\x00\x00\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x00\x00\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x00\x00\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x00\x00\x00\x00\x00\x00\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x00\x00\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x00\x00\x00\x00\x00\x00\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x00\x00\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x00\x00\x00\x00\x00\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x00\x00\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x0a\x00\x0a\x00\x0a\x00\x61\x00\x6d\x00\x67\x00\x61\x00\x72\x00\x0a\x00\x0a\x00\x74\x00\x6e\x00\x65\x00\x64\x00\x4c\x00\x6c\x00\x6c\x00\x4c\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\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\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x4c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x6c\x00\x5d\x00\x5e\x00\x5f\x00\x6c\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\x7c\x00\x7d\x00\x7e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x55\x00\x4c\x00\x0d\x00\x55\x00\x4c\x00\x69\x00\x6a\x00\x27\x00\x09\x00\x0a\x00\x27\x00\x20\x00\x0d\x00\x69\x00\x6a\x00\x27\x00\x20\x00\x3d\x00\x4c\x00\x4c\x00\x3d\x00\x20\x00\x3d\x00\x22\x00\x3d\x00\x3d\x00\x6c\x00\x55\x00\x55\x00\x3c\x00\x3d\x00\x20\x00\x75\x00\x22\x00\x55\x00\x75\x00\x6c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x09\x00\x0a\x00\x75\x00\x75\x00\x0d\x00\x55\x00\x2b\x00\x3d\x00\x26\x00\x75\x00\x09\x00\x0a\x00\x3d\x00\x3e\x00\x0d\x00\x2e\x00\x3d\x00\x3d\x00\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\x20\x00\x3d\x00\x22\x00\xff\xff\xff\xff\x6c\x00\x4c\x00\x4c\x00\x3d\x00\x55\x00\x20\x00\xff\xff\x22\x00\xff\xff\x75\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x09\x00\x0a\x00\x6c\x00\x6c\x00\x0d\x00\x75\x00\x55\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x75\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x20\x00\x7c\x00\x22\x00\xff\xff\xff\xff\x4c\x00\x6c\x00\x0a\x00\x55\x00\x20\x00\x0d\x00\x22\x00\x09\x00\x0a\x00\x55\x00\x75\x00\x0d\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x27\x00\x6c\x00\x09\x00\x0a\x00\x75\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x0a\x00\x75\x00\xff\xff\x0d\x00\xff\xff\x2d\x00\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x3d\x00\x3e\x00\x0d\x00\x0a\x00\x0a\x00\xff\xff\x0d\x00\x0d\x00\x27\x00\xff\xff\xff\xff\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\x5c\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x27\x00\x27\x00\x09\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x09\x00\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\x5c\x00\x5c\x00\xff\xff\xff\xff\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x4c\x00\xff\xff\xff\xff\x4c\x00\x4c\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\x46\x00\x55\x00\x55\x00\x55\x00\xff\xff\xff\xff\x4c\x00\xff\xff\x55\x00\xff\xff\x69\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\x6c\x00\x6c\x00\x6c\x00\xff\xff\x69\x00\x6a\x00\x75\x00\x6c\x00\x66\x00\x75\x00\x75\x00\x75\x00\x69\x00\xff\xff\x6c\x00\xff\xff\x75\x00\xff\xff\xff\xff\x70\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\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\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\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\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\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\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\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\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\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\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\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\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\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\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\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\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\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\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\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\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\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\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\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\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x22\x00\x4c\x00\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x3f\x00\x69\x00\x6a\x00\x27\x00\x6c\x00\x55\x00\x45\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x4c\x00\x46\x00\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x69\x00\x6a\x00\x0d\x00\x6c\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x27\x00\x75\x00\x65\x00\x66\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x66\x00\xff\xff\xff\xff\x6e\x00\x22\x00\xff\xff\x6c\x00\x72\x00\x75\x00\x74\x00\xff\xff\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x22\x00\xff\xff\x24\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x4c\x00\x0d\x00\xff\xff\xff\xff\x0a\x00\x4c\x00\xff\xff\x0d\x00\x22\x00\x55\x00\xff\xff\x27\x00\x58\x00\x2e\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x65\x00\xff\xff\x27\x00\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x27\x00\x69\x00\x6a\x00\x45\x00\x6c\x00\xff\xff\xff\xff\xff\xff\x75\x00\x0a\x00\x4c\x00\x78\x00\x0d\x00\x75\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x2e\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\x65\x00\xff\xff\xff\xff\x27\x00\x69\x00\x6a\x00\x45\x00\x6c\x00\x27\x00\xff\xff\xff\xff\x0a\x00\x5c\x00\x4c\x00\x0d\x00\xff\xff\x75\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x2e\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x4c\x00\x65\x00\xff\xff\x27\x00\x4c\x00\x69\x00\x6a\x00\x45\x00\x6c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\xff\xff\xff\xff\x75\x00\x4c\x00\x5c\x00\xff\xff\xff\xff\x4c\x00\x55\x00\x5c\x00\x27\x00\xff\xff\x55\x00\x4c\x00\x69\x00\x6a\x00\x55\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x55\x00\xff\xff\x65\x00\xff\xff\x75\x00\xff\xff\x69\x00\x6a\x00\x75\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\x4c\x00\x6c\x00\x75\x00\x5c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x4c\x00\x55\x00\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x75\x00\x55\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\x0a\x00\x6c\x00\x4c\x00\x0d\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\x55\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x27\x00\xff\xff\x69\x00\x6a\x00\x4c\x00\x6c\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\x75\x00\xff\xff\xff\xff\x0a\x00\x4c\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x5c\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x75\x00\x27\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x27\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x4c\x00\x0d\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x4c\x00\xff\xff\x0d\x00\xff\xff\x50\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\x5c\x00\xff\xff\x27\x00\x55\x00\x69\x00\x6a\x00\x5c\x00\x6c\x00\x55\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x75\x00\x27\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x69\x00\x6a\x00\x70\x00\x6c\x00\x4c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x4c\x00\xff\xff\xff\xff\x75\x00\x55\x00\xff\xff\xff\xff\xff\xff\x75\x00\x55\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x5c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x0a\x00\x69\x00\x6a\x00\x0d\x00\x6c\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\xff\xff\x0d\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x22\x00\xff\xff\x22\x00\xff\xff\x0a\x00\x27\x00\xff\xff\x0d\x00\x0a\x00\x5c\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x27\x00\x0a\x00\x0d\x00\x0a\x00\x0d\x00\xff\xff\x0d\x00\x22\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x22\x00\xff\xff\xff\xff\x27\x00\xff\xff\x27\x00\x0a\x00\x27\x00\x5c\x00\x0d\x00\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x0a\x00\x0a\x00\xff\xff\x0d\x00\x0d\x00\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\xff\xff\x5c\x00\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x27\x00\x27\x00\xff\xff\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5c\x00\x0a\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x0a\x00\x0d\x00\x6e\x00\x0d\x00\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\x22\x00\xff\xff\x0d\x00\x27\x00\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\x0a\x00\x0d\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x0a\x00\xff\xff\x22\x00\xff\xff\x22\x00\x27\x00\xff\xff\x27\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x27\x00\xff\xff\x5c\x00\x45\x00\x5c\x00\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x5c\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x27\x00\x0a\x00\x0d\x00\x0a\x00\x0d\x00\xff\xff\x0d\x00\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x22\x00\xff\xff\x22\x00\x27\x00\xff\xff\x27\x00\x0a\x00\x27\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\x0a\x00\x5c\x00\x0a\x00\x0d\x00\x27\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x22\x00\xff\xff\x3f\x00\x27\x00\x22\x00\x27\x00\xff\xff\x5c\x00\x45\x00\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\x45\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x5c\x00\x76\x00\x5c\x00\x78\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x27\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x22\x00\xff\xff\xff\xff\x5c\x00\x45\x00\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\x45\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x46\x00\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x45\x00\x46\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x46\x00\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x4c\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x2b\x00\x6c\x00\x2d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\x2d\x00\xff\xff\x65\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x2b\x00\x0a\x00\x2d\x00\x70\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x22\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x27\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\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\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\x6e\x00\xff\xff\x27\x00\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x6e\x00\x0d\x00\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\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\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\x6e\x00\xff\xff\x27\x00\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\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\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\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"#+alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x0a\x00\x61\x00\x6d\x00\x67\x00\x61\x00\x72\x00\x0a\x00\x0a\x00\x74\x00\x6e\x00\x65\x00\x64\x00\x4c\x00\x6c\x00\x6c\x00\x4c\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\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\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x4c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x6c\x00\x5d\x00\x5e\x00\x5f\x00\x6c\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\x7c\x00\x7d\x00\x7e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x55\x00\x4c\x00\x0d\x00\x55\x00\x4c\x00\x69\x00\x6a\x00\x27\x00\x09\x00\x0a\x00\x69\x00\x6a\x00\x0d\x00\x27\x00\x27\x00\x3d\x00\x20\x00\x3d\x00\x4c\x00\x4c\x00\x3d\x00\x20\x00\x3d\x00\x22\x00\x3d\x00\x3d\x00\x6c\x00\x55\x00\x55\x00\x3c\x00\x3d\x00\x20\x00\x75\x00\x22\x00\x55\x00\x75\x00\x6c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x09\x00\x0a\x00\x75\x00\x75\x00\x0d\x00\x55\x00\x2b\x00\x3d\x00\x26\x00\x75\x00\x09\x00\x0a\x00\x3d\x00\x3e\x00\x0d\x00\x2e\x00\x3d\x00\x3d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x3d\x00\x22\x00\xff\xff\xff\xff\x6c\x00\x4c\x00\x4c\x00\x3d\x00\x55\x00\x20\x00\xff\xff\x22\x00\xff\xff\x75\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x09\x00\x0a\x00\x6c\x00\x6c\x00\x0d\x00\x75\x00\x55\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x75\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\x4c\x00\x20\x00\xff\xff\x22\x00\xff\xff\xff\xff\x4c\x00\x6c\x00\x0a\x00\x55\x00\x20\x00\x0d\x00\x22\x00\x09\x00\x0a\x00\x55\x00\x75\x00\x0d\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x27\x00\x6c\x00\x09\x00\x0a\x00\x75\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x0a\x00\x75\x00\xff\xff\x0d\x00\xff\xff\x2d\x00\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x3d\x00\x3e\x00\x0d\x00\x0a\x00\x0a\x00\xff\xff\x0d\x00\x0d\x00\x27\x00\xff\xff\xff\xff\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\x5c\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x27\x00\x27\x00\x09\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x09\x00\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\x5c\x00\x5c\x00\xff\xff\xff\xff\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x4c\x00\xff\xff\xff\xff\x4c\x00\x4c\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\x46\x00\x55\x00\x55\x00\x55\x00\xff\xff\xff\xff\x4c\x00\xff\xff\x55\x00\xff\xff\x69\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\x6c\x00\x6c\x00\x6c\x00\xff\xff\x69\x00\x6a\x00\x75\x00\x6c\x00\x66\x00\x75\x00\x75\x00\x75\x00\x69\x00\xff\xff\x6c\x00\xff\xff\x75\x00\xff\xff\xff\xff\x70\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\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\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\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\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\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\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\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\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\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\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\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\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\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\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\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\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\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\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\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\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\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\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\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\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\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\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x22\x00\x4c\x00\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x3f\x00\x69\x00\x6a\x00\x27\x00\x6c\x00\x55\x00\x45\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x4c\x00\x46\x00\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x69\x00\x6a\x00\x0d\x00\x6c\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x27\x00\x75\x00\x65\x00\x66\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x66\x00\xff\xff\xff\xff\x6e\x00\x22\x00\xff\xff\x6c\x00\x72\x00\x75\x00\x74\x00\xff\xff\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x22\x00\xff\xff\x24\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x4c\x00\x0d\x00\xff\xff\xff\xff\x0a\x00\x4c\x00\xff\xff\x0d\x00\x22\x00\x55\x00\xff\xff\x27\x00\x58\x00\x2e\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x65\x00\xff\xff\x27\x00\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x27\x00\x69\x00\x6a\x00\x45\x00\x6c\x00\xff\xff\xff\xff\xff\xff\x75\x00\x0a\x00\x4c\x00\x78\x00\x0d\x00\x75\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x2e\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\x65\x00\xff\xff\xff\xff\x27\x00\x69\x00\x6a\x00\x45\x00\x6c\x00\x27\x00\xff\xff\xff\xff\x0a\x00\x5c\x00\x4c\x00\x0d\x00\xff\xff\x75\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x2e\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x4c\x00\x65\x00\xff\xff\x27\x00\x4c\x00\x69\x00\x6a\x00\x45\x00\x6c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\xff\xff\xff\xff\x75\x00\x4c\x00\x5c\x00\xff\xff\xff\xff\x4c\x00\x55\x00\x5c\x00\x27\x00\xff\xff\x55\x00\x4c\x00\x69\x00\x6a\x00\x55\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x55\x00\xff\xff\x65\x00\xff\xff\x75\x00\xff\xff\x69\x00\x6a\x00\x75\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\x4c\x00\x6c\x00\x75\x00\x5c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x4c\x00\x55\x00\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x75\x00\x55\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\x0a\x00\x6c\x00\x4c\x00\x0d\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\x55\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x27\x00\xff\xff\x69\x00\x6a\x00\x4c\x00\x6c\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\x75\x00\xff\xff\xff\xff\x0a\x00\x4c\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x5c\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x75\x00\x27\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x27\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x4c\x00\x0d\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x4c\x00\xff\xff\x0d\x00\xff\xff\x50\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\x5c\x00\xff\xff\x27\x00\x55\x00\x69\x00\x6a\x00\x5c\x00\x6c\x00\x55\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x75\x00\x27\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x69\x00\x6a\x00\x70\x00\x6c\x00\x4c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x4c\x00\xff\xff\xff\xff\x75\x00\x55\x00\xff\xff\xff\xff\xff\xff\x75\x00\x55\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x5c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x0a\x00\x69\x00\x6a\x00\x0d\x00\x6c\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\xff\xff\x0d\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x22\x00\xff\xff\x22\x00\xff\xff\x0a\x00\x27\x00\xff\xff\x0d\x00\x0a\x00\x5c\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x27\x00\x0a\x00\x0d\x00\x0a\x00\x0d\x00\xff\xff\x0d\x00\x22\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x22\x00\xff\xff\xff\xff\x27\x00\xff\xff\x27\x00\x0a\x00\x27\x00\x5c\x00\x0d\x00\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x0a\x00\x0a\x00\xff\xff\x0d\x00\x0d\x00\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\xff\xff\x5c\x00\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x27\x00\x27\x00\xff\xff\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5c\x00\x0a\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x0a\x00\x0d\x00\x6e\x00\x0d\x00\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\x22\x00\xff\xff\x0d\x00\x27\x00\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\x0a\x00\x0d\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x0a\x00\xff\xff\x22\x00\xff\xff\x22\x00\x27\x00\xff\xff\x27\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x27\x00\xff\xff\x5c\x00\x45\x00\x5c\x00\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x5c\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x27\x00\x0a\x00\x0d\x00\x0a\x00\x0d\x00\xff\xff\x0d\x00\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x22\x00\xff\xff\x22\x00\x27\x00\xff\xff\x27\x00\x0a\x00\x27\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\x0a\x00\x5c\x00\x0a\x00\x0d\x00\x27\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x22\x00\xff\xff\x3f\x00\x27\x00\x22\x00\x27\x00\xff\xff\x5c\x00\x45\x00\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\x45\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x5c\x00\x76\x00\x5c\x00\x78\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x27\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x22\x00\xff\xff\xff\xff\x5c\x00\x45\x00\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\x45\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x46\x00\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x45\x00\x46\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x46\x00\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x4c\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x2b\x00\x6c\x00\x2d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\x2d\x00\xff\xff\x65\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x2b\x00\x0a\x00\x2d\x00\x70\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x22\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x27\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\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\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\x6e\x00\xff\xff\x27\x00\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x6e\x00\x0d\x00\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\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\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\x6e\x00\xff\xff\x27\x00\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\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\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\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"#  alex_deflt :: AlexAddr-alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x24\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\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x6a\x00\xee\x00\xff\xff\xff\xff\xff\xff\xff\xff\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x77\x00\xee\x00\xff\xff\xff\xff\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\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\xf9\x00\xc8\x00\xbf\x00\xbf\x00\xc8\x00\xbf\x00\xc8\x00\xbf\x00\xc8\x00\xbf\x00\xc8\x00\xc8\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf9\x00\xd9\x00\xd0\x00\xd0\x00\xd9\x00\xd0\x00\xd9\x00\xd0\x00\xd9\x00\xd0\x00\xd9\x00\xd9\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\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\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"#+alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x23\x00\x23\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\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x69\x00\xed\x00\xff\xff\xff\xff\xff\xff\xff\xff\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x76\x00\xed\x00\xff\xff\xff\xff\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\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\xf8\x00\xc7\x00\xbe\x00\xbe\x00\xc7\x00\xbe\x00\xc7\x00\xbe\x00\xc7\x00\xbe\x00\xc7\x00\xc7\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\xd8\x00\xcf\x00\xcf\x00\xd8\x00\xcf\x00\xd8\x00\xcf\x00\xd8\x00\xcf\x00\xd8\x00\xd8\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\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\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"# -alex_accept = listArray (0::Int,327) [[],[],[(AlexAccSkip)],[(AlexAcc (alex_action_1))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAccSkip)],[],[],[],[],[],[],[],[(AlexAccSkip)],[],[],[],[],[],[],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(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_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[],[],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_9))],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_10))],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_11))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_12))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_26))],[],[],[],[],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_15))],[],[],[],[(AlexAcc (alex_action_16))],[(AlexAcc (alex_action_16))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_17))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_18))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_19))],[],[(AlexAcc (alex_action_20))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_22))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_25))],[(AlexAcc (alex_action_32))],[(AlexAcc (alex_action_27))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_29))],[(AlexAcc (alex_action_31))],[(AlexAcc (alex_action_30))],[(AlexAcc (alex_action_33))],[(AlexAcc (alex_action_34))],[(AlexAcc (alex_action_35))],[(AlexAcc (alex_action_36))],[(AlexAcc (alex_action_37))],[(AlexAcc (alex_action_39))],[(AlexAcc (alex_action_38))],[(AlexAcc (alex_action_41))],[(AlexAcc (alex_action_40))],[(AlexAcc (alex_action_42))],[(AlexAcc (alex_action_43))],[(AlexAcc (alex_action_51))],[(AlexAcc (alex_action_44))],[(AlexAcc (alex_action_45))],[(AlexAcc (alex_action_46))],[(AlexAcc (alex_action_47))],[(AlexAcc (alex_action_48))],[(AlexAcc (alex_action_49))],[(AlexAcc (alex_action_50))],[(AlexAcc (alex_action_52))],[(AlexAcc (alex_action_53))],[(AlexAcc (alex_action_54))],[(AlexAcc (alex_action_55))],[(AlexAcc (alex_action_56))],[(AlexAcc (alex_action_57))],[(AlexAcc (alex_action_58))],[(AlexAcc (alex_action_59))],[(AlexAcc (alex_action_60))],[(AlexAcc (alex_action_61))],[(AlexAcc (alex_action_62))],[(AlexAcc (alex_action_63))],[(AlexAcc (alex_action_64))],[(AlexAcc (alex_action_65))],[(AlexAcc (alex_action_66))],[]]+alex_accept = listArray (0::Int,326) [[],[(AlexAccSkip)],[(AlexAcc (alex_action_1))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAccSkip)],[],[],[],[],[],[],[],[(AlexAccSkip)],[],[],[],[],[],[],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(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_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[],[],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_9))],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_10))],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_11))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_12))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_26))],[],[],[],[],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_15))],[],[],[],[(AlexAcc (alex_action_16))],[(AlexAcc (alex_action_16))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_17))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_18))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_19))],[],[(AlexAcc (alex_action_20))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_22))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_25))],[(AlexAcc (alex_action_32))],[(AlexAcc (alex_action_27))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_29))],[(AlexAcc (alex_action_31))],[(AlexAcc (alex_action_30))],[(AlexAcc (alex_action_33))],[(AlexAcc (alex_action_34))],[(AlexAcc (alex_action_35))],[(AlexAcc (alex_action_36))],[(AlexAcc (alex_action_37))],[(AlexAcc (alex_action_39))],[(AlexAcc (alex_action_38))],[(AlexAcc (alex_action_41))],[(AlexAcc (alex_action_40))],[(AlexAcc (alex_action_42))],[(AlexAcc (alex_action_43))],[(AlexAcc (alex_action_51))],[(AlexAcc (alex_action_44))],[(AlexAcc (alex_action_45))],[(AlexAcc (alex_action_46))],[(AlexAcc (alex_action_47))],[(AlexAcc (alex_action_48))],[(AlexAcc (alex_action_49))],[(AlexAcc (alex_action_50))],[(AlexAcc (alex_action_52))],[(AlexAcc (alex_action_53))],[(AlexAcc (alex_action_54))],[(AlexAcc (alex_action_55))],[(AlexAcc (alex_action_56))],[(AlexAcc (alex_action_57))],[(AlexAcc (alex_action_58))],[(AlexAcc (alex_action_59))],[(AlexAcc (alex_action_60))],[(AlexAcc (alex_action_61))],[(AlexAcc (alex_action_62))],[(AlexAcc (alex_action_63))],[(AlexAcc (alex_action_64))],[(AlexAcc (alex_action_65))],[(AlexAcc (alex_action_66))],[]] {-# LINE 247 "src/Language/C/Parser/Lexer.x" #-}  -- Fix the 'octal' lexing of '0'@@ -60,109 +60,136 @@ -- string literals since GHC converts the latter into a sequence of string -- comparisons (ie a linear search) but it translates the former using its -- effecient pattern matching which gives us the expected radix-style search.--- This gives change makes a significant performance difference.+-- This change makes a significant performance difference [chak] ---idkwtok :: String -> Position -> P CToken-idkwtok ('a':'l':'i':'g':'n':'o':'f':[])         = tok CTokAlignof-idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':[])       = tok CTokAlignof-idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':'_':'_':[])     = tok CTokAlignof-idkwtok ('a':'s':'m':[])             = tok CTokAsm-idkwtok ('_':'_':'a':'s':'m':[])           = tok CTokAsm-idkwtok ('_':'_':'a':'s':'m':'_':'_':[])         = tok CTokAsm-idkwtok ('a':'u':'t':'o':[])             = tok CTokAuto-idkwtok ('b':'r':'e':'a':'k':[])           = tok CTokBreak-idkwtok ('_':'B':'o':'o':'l':[])           = tok CTokBool-idkwtok ('c':'a':'s':'e':[])             = tok CTokCase-idkwtok ('c':'h':'a':'r':[])             = tok CTokChar-idkwtok ('c':'o':'n':'s':'t':[])           = tok CTokConst-idkwtok ('_':'_':'c':'o':'n':'s':'t':[])         = tok CTokConst-idkwtok ('_':'_':'c':'o':'n':'s':'t':'_':'_':[])       = tok CTokConst-idkwtok ('c':'o':'n':'t':'i':'n':'u':'e':[])         = tok CTokContinue-idkwtok ('_':'C':'o':'m':'p':'l':'e':'x':[])         = tok CTokComplex-idkwtok ('_':'_':'c':'o':'m':'p':'l':'e':'x':'_':'_':[]) = tok CTokComplex-idkwtok ('d':'e':'f':'a':'u':'l':'t':[])         = tok CTokDefault-idkwtok ('d':'o':[])               = tok CTokDo-idkwtok ('d':'o':'u':'b':'l':'e':[])           = tok CTokDouble-idkwtok ('e':'l':'s':'e':[])             = tok CTokElse-idkwtok ('e':'n':'u':'m':[])             = tok CTokEnum-idkwtok ('e':'x':'t':'e':'r':'n':[])           = tok CTokExtern-idkwtok ('f':'l':'o':'a':'t':[])           = tok CTokFloat-idkwtok ('f':'o':'r':[])             = tok CTokFor-idkwtok ('g':'o':'t':'o':[])             = tok CTokGoto-idkwtok ('i':'f':[])               = tok CTokIf-idkwtok ('i':'n':'l':'i':'n':'e':[])           = tok CTokInline-idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':[])         = tok CTokInline-idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':'_':'_':[])       = tok CTokInline-idkwtok ('i':'n':'t':[])             = tok CTokInt-idkwtok ('l':'o':'n':'g':[])             = tok CTokLong-idkwtok ('r':'e':'g':'i':'s':'t':'e':'r':[])         = tok CTokRegister-idkwtok ('r':'e':'s':'t':'r':'i':'c':'t':[])         = tok CTokRestrict-idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':[])       = tok CTokRestrict-idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':'_':'_':[]) = tok CTokRestrict-idkwtok ('r':'e':'t':'u':'r':'n':[])           = tok CTokReturn-idkwtok ('s':'h':'o':'r':'t':[])           = tok CTokShort-idkwtok ('s':'i':'g':'n':'e':'d':[])           = tok CTokSigned-idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':[])         = tok CTokSigned-idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':'_':'_':[])       = tok CTokSigned-idkwtok ('s':'i':'z':'e':'o':'f':[])           = tok CTokSizeof-idkwtok ('s':'t':'a':'t':'i':'c':[])           = tok CTokStatic-idkwtok ('s':'t':'r':'u':'c':'t':[])           = tok CTokStruct-idkwtok ('s':'w':'i':'t':'c':'h':[])           = tok CTokSwitch-idkwtok ('t':'y':'p':'e':'d':'e':'f':[])         = tok CTokTypedef-idkwtok ('t':'y':'p':'e':'o':'f':[])           = tok CTokTypeof-idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':[])         = tok CTokTypeof-idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':'_':'_':[])       = tok CTokTypeof-idkwtok ('_':'_':'t':'h':'r':'e':'a':'d':[])         = tok CTokThread-idkwtok ('u':'n':'i':'o':'n':[])           = tok CTokUnion-idkwtok ('u':'n':'s':'i':'g':'n':'e':'d':[])         = tok CTokUnsigned-idkwtok ('v':'o':'i':'d':[])             = tok CTokVoid-idkwtok ('v':'o':'l':'a':'t':'i':'l':'e':[])         = tok CTokVolatile-idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':[])       = tok CTokVolatile-idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':'_':'_':[]) = tok CTokVolatile-idkwtok ('w':'h':'i':'l':'e':[])           = tok CTokWhile-idkwtok ('_':'_':'l':'a':'b':'e':'l':'_':'_':[])             = tok CTokLabel-idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':[]) = tok (CTokGnuC GnuCAttrTok)-idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':'_':'_':[]) = tok (CTokGnuC GnuCAttrTok)-idkwtok ('_':'_':'e':'x':'t':'e':'n':'s':'i':'o':'n':'_':'_':[]) = tok (CTokGnuC GnuCExtTok)-idkwtok ('_':'_':'r':'e':'a':'l':[])   = tok (CTokGnuC GnuCComplexReal)-idkwtok ('_':'_':'r':'e':'a':'l':'_':'_':[])   = tok (CTokGnuC GnuCComplexReal)-idkwtok ('_':'_':'i':'m':'a':'g':[])   = tok (CTokGnuC GnuCComplexImag)-idkwtok ('_':'_':'i':'m':'a':'g':'_':'_':[])   = tok (CTokGnuC GnuCComplexImag)-idkwtok ('_':'_':'b':'u':'i':'l':'t':'i':'n':'_':rest)-        | rest == "va_arg"             = tok (CTokGnuC GnuCVaArg)-        | rest == "offsetof"           = tok (CTokGnuC GnuCOffsetof)-        | rest == "types_compatible_p" = tok (CTokGnuC GnuCTyCompat)+-- To make this a little more maintainable, we autogenerate it from this list,+-- using the script GenerateKeywordMatch.hs (in /src)+{-+alignof @__, asm @__, auto+break, bool _Bool,+case, char, const @__, continue, complex _Complex __complex__+default, do, double,+else, enum, extern,+float, for, goto,+if, inline @__, int, long,+register, restrict @__, return+short, signed @__, sizeof, static, struct, switch,+typedef, typeof @__, thread __thread,+union, unsigned, void, volatile @__,+while,+label __label__+(CTokGnuC GnuCAttrTok) __attribute __attribute__+(CTokGnuC GnuCExtTok) __extension__+(CTokGnuC GnuCComplexReal) __real __real__+(CTokGnuC GnuCComplexImag) __imag __imag__+(CTokGnuC GnuCVaArg) __builtin_va_arg+(CTokGnuC GnuCOffsetof) __builtin_offsetof+(CTokGnuC GnuCTyCompat) __builtin_types_compatible_p+-}+-- Tokens: alignof __alignof __alignof__ asm __asm __asm__ __attribute __attribute__ auto _Bool break __builtin_offsetof __builtin_types_compatible_p __builtin_va_arg case char _Complex __complex__ const __const __const__ continue default do double else enum __extension__ extern float for goto if __imag __imag__ inline __inline __inline__ int __label__ long __real __real__ register __restrict __restrict__ return short signed __signed __signed__ sizeof static struct switch __thread typedef typeof __typeof __typeof__ union unsigned void volatile __volatile __volatile__ while+idkwtok ('_' : 'B' : 'o' : 'o' : 'l' : []) = tok 5 CTokBool+idkwtok ('_' : 'C' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : []) = tok 8 CTokComplex+idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 9 CTokAlignof+idkwtok ('a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 7 CTokAlignof+idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : '_' : '_' : []) = tok 11 CTokAlignof+idkwtok ('_' : '_' : 'a' : 's' : 'm' : []) = tok 5 CTokAsm+idkwtok ('a' : 's' : 'm' : []) = tok 3 CTokAsm+idkwtok ('_' : '_' : 'a' : 's' : 'm' : '_' : '_' : []) = tok 7 CTokAsm+idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : []) = tok 11 (CTokGnuC GnuCAttrTok)+idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCAttrTok)+idkwtok ('a' : 'u' : 't' : 'o' : []) = tok 4 CTokAuto+idkwtok ('b' : 'r' : 'e' : 'a' : 'k' : []) = tok 5 CTokBreak+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'o' : 'f' : 'f' : 's' : 'e' : 't' : 'o' : 'f' : []) = tok 18 (CTokGnuC GnuCOffsetof)+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 't' : 'y' : 'p' : 'e' : 's' : '_' : 'c' : 'o' : 'm' : 'p' : 'a' : 't' : 'i' : 'b' : 'l' : 'e' : '_' : 'p' : []) = tok 28 (CTokGnuC GnuCTyCompat)+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'v' : 'a' : '_' : 'a' : 'r' : 'g' : []) = tok 16 (CTokGnuC GnuCVaArg)+idkwtok ('c' : 'a' : 's' : 'e' : []) = tok 4 CTokCase+idkwtok ('c' : 'h' : 'a' : 'r' : []) = tok 4 CTokChar+idkwtok ('_' : '_' : 'c' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : '_' : '_' : []) = tok 11 CTokComplex+idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : []) = tok 7 CTokConst+idkwtok ('c' : 'o' : 'n' : 's' : 't' : []) = tok 5 CTokConst+idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : '_' : '_' : []) = tok 9 CTokConst+idkwtok ('c' : 'o' : 'n' : 't' : 'i' : 'n' : 'u' : 'e' : []) = tok 8 CTokContinue+idkwtok ('d' : 'e' : 'f' : 'a' : 'u' : 'l' : 't' : []) = tok 7 CTokDefault+idkwtok ('d' : 'o' : []) = tok 2 CTokDo+idkwtok ('d' : 'o' : 'u' : 'b' : 'l' : 'e' : []) = tok 6 CTokDouble+idkwtok ('e' : 'l' : 's' : 'e' : []) = tok 4 CTokElse+idkwtok ('e' : 'n' : 'u' : 'm' : []) = tok 4 CTokEnum+idkwtok ('_' : '_' : 'e' : 'x' : 't' : 'e' : 'n' : 's' : 'i' : 'o' : 'n' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCExtTok)+idkwtok ('e' : 'x' : 't' : 'e' : 'r' : 'n' : []) = tok 6 CTokExtern+idkwtok ('f' : 'l' : 'o' : 'a' : 't' : []) = tok 5 CTokFloat+idkwtok ('f' : 'o' : 'r' : []) = tok 3 CTokFor+idkwtok ('g' : 'o' : 't' : 'o' : []) = tok 4 CTokGoto+idkwtok ('i' : 'f' : []) = tok 2 CTokIf+idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : []) = tok 6 (CTokGnuC GnuCComplexImag)+idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexImag)+idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 8 CTokInline+idkwtok ('i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 6 CTokInline+idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : '_' : '_' : []) = tok 10 CTokInline+idkwtok ('i' : 'n' : 't' : []) = tok 3 CTokInt+idkwtok ('_' : '_' : 'l' : 'a' : 'b' : 'e' : 'l' : '_' : '_' : []) = tok 9 CTokLabel+idkwtok ('l' : 'o' : 'n' : 'g' : []) = tok 4 CTokLong+idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : []) = tok 6 (CTokGnuC GnuCComplexReal)+idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexReal)+idkwtok ('r' : 'e' : 'g' : 'i' : 's' : 't' : 'e' : 'r' : []) = tok 8 CTokRegister+idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 10 CTokRestrict+idkwtok ('r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 8 CTokRestrict+idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : '_' : '_' : []) = tok 12 CTokRestrict+idkwtok ('r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 6 CTokReturn+idkwtok ('s' : 'h' : 'o' : 'r' : 't' : []) = tok 5 CTokShort+idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokSigned+idkwtok ('s' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 6 CTokSigned+idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : '_' : '_' : []) = tok 10 CTokSigned+idkwtok ('s' : 'i' : 'z' : 'e' : 'o' : 'f' : []) = tok 6 CTokSizeof+idkwtok ('s' : 't' : 'a' : 't' : 'i' : 'c' : []) = tok 6 CTokStatic+idkwtok ('s' : 't' : 'r' : 'u' : 'c' : 't' : []) = tok 6 CTokStruct+idkwtok ('s' : 'w' : 'i' : 't' : 'c' : 'h' : []) = tok 6 CTokSwitch+idkwtok ('_' : '_' : 't' : 'h' : 'r' : 'e' : 'a' : 'd' : []) = tok 8 CTokThread+idkwtok ('t' : 'y' : 'p' : 'e' : 'd' : 'e' : 'f' : []) = tok 7 CTokTypedef+idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 8 CTokTypeof+idkwtok ('t' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 6 CTokTypeof+idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : '_' : '_' : []) = tok 10 CTokTypeof+idkwtok ('u' : 'n' : 'i' : 'o' : 'n' : []) = tok 5 CTokUnion+idkwtok ('u' : 'n' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokUnsigned+idkwtok ('v' : 'o' : 'i' : 'd' : []) = tok 4 CTokVoid+idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 10 CTokVolatile+idkwtok ('v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 8 CTokVolatile+idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : '_' : '_' : []) = tok 12 CTokVolatile+idkwtok ('w' : 'h' : 'i' : 'l' : 'e' : []) = tok 5 CTokWhile  idkwtok cs = \pos -> do   name <- getNewName+  let len = case length cs of l -> l   let ident = mkIdent pos cs name   tyident <- isTypeIdent ident   if tyident-    then return (CTokTyIdent pos ident)-    else return (CTokIdent   pos ident)+    then return (CTokTyIdent (pos,len) ident)+    else return (CTokIdent   (pos,len) ident)  ignoreAttribute :: P () ignoreAttribute = skipTokens (0::Int)   where skipTokens :: Int -> P ()         skipTokens n = do-          tok <- lexToken+          tok <- lexToken' False           case tok of             CTokRParen _ | n == 1    -> return ()                          | otherwise -> skipTokens (n-1)             CTokLParen _             -> skipTokens (n+1)             _                        -> skipTokens n -tok :: (Position -> CToken) -> Position -> P CToken-tok tc pos = return (tc pos)+tok :: Int -> (PosLength -> CToken) -> Position -> P CToken+tok len tc pos = return (tc (pos,len)) -linePragmaAdjust :: String -> Position -> Position-linePragmaAdjust str p@(Position fname row _) = Position fname' row' 1+adjustLineDirective :: Int -> String -> Position -> Position+adjustLineDirective pragmaLen str pos =+    offs' `seq` fname' `seq` row' `seq` (position offs' fname' row' 1)     where+    offs'           = (posOffset pos) + pragmaLen     str'            = dropWhite . drop 1 $ str     (rowStr, str'') = span isDigit str'     row'      = read rowStr     str'''      = dropWhite str''     fnameStr      = takeWhile (/= '"') . drop 1 $ str'''+    fname = posFile pos     fname'      | null str''' || head str''' /= '"' = fname      -- try and get more sharing of file name strings      | fnameStr == fname     = fname@@ -178,8 +205,8 @@  {-# INLINE token_ #-} -- token that ignores the string-token_ :: (Position -> CToken) -> Position -> Int -> InputStream -> P CToken-token_ tok pos _ _ = return (tok pos)+token_ :: Int -> (PosLength -> CToken) -> Position -> Int -> InputStream -> P CToken+token_ len tok pos _ _ = return (tok (pos,len))  {-# INLINE token_fail #-} -- error token@@ -190,17 +217,17 @@  {-# INLINE token #-} -- token that uses the string-token :: (Position -> a -> CToken) -> (String -> a)+token :: (PosLength -> a -> CToken) -> (String -> a)       -> Position -> Int -> InputStream -> P CToken-token tok read pos len str = return (tok pos (read $ takeChars len str))+token tok read pos len str = return (tok (pos,len) (read $ takeChars len str))  {-# INLINE token_plus #-} -- token that may fail-token_plus :: (Position -> a -> CToken) -> (String -> Either String a)+token_plus :: (PosLength -> a -> CToken) -> (String -> Either String a)       -> Position -> Int -> InputStream -> P CToken token_plus tok read pos len str =   case read (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]-                                   Right ok -> return $! tok pos ok+                                   Right ok -> return $! tok (pos,len) ok  -- ----------------------------------------------------------------------------- -- The input type@@ -218,11 +245,10 @@                                   Just (c, (p', s))  alexMove :: Position -> Char -> Position-alexMove (Position f l c) ' '  = Position f l (c+1)-alexMove (Position f l c) '\n' = Position f (l+1) 1-alexMove (Position f l c) '\t' = Position f l (((c+7) `div` 8)*8+1)-alexMove p                '\r' = p-alexMove (Position f l c) _    = Position f l     (c+1)+alexMove pos ' '  = incPos pos 1+alexMove pos '\n' = retPos pos+alexMove pos '\r' = incOffset pos 1+alexMove pos _    = incPos pos 1  lexicalError :: P a lexicalError = do@@ -239,22 +265,39 @@         ["Syntax error !",          "The symbol `" ++ show tok ++ "' does not fit here."] +-- there is a problem with ignored tokens here (that aren't skipped)+-- consider+-- 1 > int x;+-- 2 > LINE "ex.c" 4+-- 4 > int y;+-- when we get to LINE, we have [int (1,1),x (1,4)] in the token cache.+-- Now we run+-- > action  (pos 2,0) 14 "LINE \"ex.c\" 3\n"+-- which in turn adjusts the position and then calls lexToken again+-- we get `int (pos 4,0)', and have [x (1,4), int (4,1) ] in the token cache (fine)+-- but then, we again call setLastToken when returning and get [int (4,1),int (4,1)] in the token cache (bad)+-- to resolve this, recursive calls invoke lexToken' False. lexToken :: P CToken-lexToken = do+lexToken = lexToken' True++lexToken' :: Bool -> P CToken+lexToken' modifyCache = do   pos <- getPos   inp <- getInput   case alexScan (pos, inp) 0 of-    AlexEOF -> return CTokEof+    AlexEOF -> do+        handleEofToken+        return CTokEof     AlexError inp' -> lexicalError     AlexSkip  (pos', inp') len -> do         setPos pos'         setInput inp'-        lexToken+        lexToken' modifyCache     AlexToken (pos', inp') len action -> do         setPos pos'         setInput inp'         tok <- action pos len inp-        setLastToken tok+        when modifyCache $ setLastToken tok         return tok  lexC :: (CToken -> P a) -> P a@@ -262,7 +305,7 @@   tok <- lexToken   cont tok -alex_action_1 =  \pos len str -> setPos (linePragmaAdjust (takeChars len str) pos) >> lexToken +alex_action_1 =  \pos len str -> setPos (adjustLineDirective len (takeChars len str) pos) >> lexToken' False  alex_action_4 =  \pos len str -> idkwtok (takeChars len str) pos  alex_action_5 =  token_plus CTokILit readCOctal  alex_action_6 =  token_plus CTokILit (readCInteger DecRepr) @@ -280,52 +323,52 @@ alex_action_18 =  token_fail "Universal character names are unsupported"  alex_action_19 =  token_fail "Invalid escape sequence"  alex_action_20 =  token_fail "Universal character names in string literals are unsupported"-alex_action_21 =  token_ CTokLParen -alex_action_22 =  token_ CTokRParen  -alex_action_23 =  token_ CTokLBracket -alex_action_24 =  token_ CTokRBracket -alex_action_25 =  token_ CTokArrow -alex_action_26 =  token_ CTokDot -alex_action_27 =  token_ CTokExclam -alex_action_28 =  token_ CTokTilde -alex_action_29 =  token_ CTokInc -alex_action_30 =  token_ CTokDec -alex_action_31 =  token_ CTokPlus -alex_action_32 =  token_ CTokMinus -alex_action_33 =  token_ CTokStar -alex_action_34 =  token_ CTokSlash -alex_action_35 =  token_ CTokPercent -alex_action_36 =  token_ CTokAmper -alex_action_37 =  token_ CTokShiftL -alex_action_38 =  token_ CTokShiftR -alex_action_39 =  token_ CTokLess -alex_action_40 =  token_ CTokLessEq -alex_action_41 =  token_ CTokHigh -alex_action_42 =  token_ CTokHighEq -alex_action_43 =  token_ CTokEqual -alex_action_44 =  token_ CTokUnequal -alex_action_45 =  token_ CTokHat -alex_action_46 =  token_ CTokBar -alex_action_47 =  token_ CTokAnd -alex_action_48 =  token_ CTokOr -alex_action_49 =  token_ CTokQuest -alex_action_50 =  token_ CTokColon -alex_action_51 =  token_ CTokAssign -alex_action_52 =  token_ CTokPlusAss -alex_action_53 =  token_ CTokMinusAss -alex_action_54 =  token_ CTokStarAss -alex_action_55 =  token_ CTokSlashAss -alex_action_56 =  token_ CTokPercAss -alex_action_57 =  token_ CTokAmpAss -alex_action_58 =  token_ CTokHatAss -alex_action_59 =  token_ CTokBarAss -alex_action_60 =  token_ CTokSLAss -alex_action_61 =  token_ CTokSRAss -alex_action_62 =  token_ CTokComma -alex_action_63 =  token_ CTokSemic -alex_action_64 =  token_ CTokLBrace -alex_action_65 =  token_ CTokRBrace -alex_action_66 =  token_ CTokEllipsis +alex_action_21 =  token_ 1 CTokLParen +alex_action_22 =  token_ 1 CTokRParen  +alex_action_23 =  token_ 1 CTokLBracket +alex_action_24 =  token_ 1 CTokRBracket +alex_action_25 =  token_ 2 CTokArrow +alex_action_26 =  token_ 1 CTokDot +alex_action_27 =  token_ 1 CTokExclam +alex_action_28 =  token_ 1 CTokTilde +alex_action_29 =  token_ 2 CTokInc +alex_action_30 =  token_ 2 CTokDec +alex_action_31 =  token_ 1 CTokPlus +alex_action_32 =  token_ 1 CTokMinus +alex_action_33 =  token_ 1 CTokStar +alex_action_34 =  token_ 1 CTokSlash +alex_action_35 =  token_ 1 CTokPercent +alex_action_36 =  token_ 1 CTokAmper +alex_action_37 =  token_ 2 CTokShiftL +alex_action_38 =  token_ 2 CTokShiftR +alex_action_39 =  token_ 1 CTokLess +alex_action_40 =  token_ 2 CTokLessEq +alex_action_41 =  token_ 1 CTokHigh +alex_action_42 =  token_ 2 CTokHighEq +alex_action_43 =  token_ 2 CTokEqual +alex_action_44 =  token_ 2 CTokUnequal +alex_action_45 =  token_ 1 CTokHat +alex_action_46 =  token_ 1 CTokBar +alex_action_47 =  token_ 2 CTokAnd +alex_action_48 =  token_ 2 CTokOr +alex_action_49 =  token_ 1 CTokQuest +alex_action_50 =  token_ 1 CTokColon +alex_action_51 =  token_ 1 CTokAssign +alex_action_52 =  token_ 2 CTokPlusAss +alex_action_53 =  token_ 2 CTokMinusAss +alex_action_54 =  token_ 2 CTokStarAss +alex_action_55 =  token_ 2 CTokSlashAss +alex_action_56 =  token_ 2 CTokPercAss +alex_action_57 =  token_ 2 CTokAmpAss +alex_action_58 =  token_ 2 CTokHatAss +alex_action_59 =  token_ 2 CTokBarAss +alex_action_60 =  token_ 3 CTokSLAss +alex_action_61 =  token_ 3 CTokSRAss +alex_action_62 =  token_ 1 CTokComma +alex_action_63 =  token_ 1 CTokSemic +alex_action_64 =  token_ 1 CTokLBrace +alex_action_65 =  token_ 1 CTokRBrace +alex_action_66 =  token_ 3 CTokEllipsis  {-# LINE 1 "templates/GenericTemplate.hs" #-} {-# LINE 1 "templates/GenericTemplate.hs" #-} {-# LINE 1 "<built-in>" #-}@@ -340,9 +383,9 @@ -- ----------------------------------------------------------------------------- -- INTERNALS and main scanner engine -{-# LINE 35 "templates/GenericTemplate.hs" #-}+{-# LINE 37 "templates/GenericTemplate.hs" #-} -{-# LINE 45 "templates/GenericTemplate.hs" #-}+{-# LINE 47 "templates/GenericTemplate.hs" #-}   data AlexAddr = AlexA# Addr#@@ -356,10 +399,10 @@ #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#+        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@@ -427,17 +470,17 @@  				   AlexError input' -	(AlexLastSkip input len, _) ->+	(AlexLastSkip input'' len, _) ->   -		AlexSkip input len+		AlexSkip input'' len -	(AlexLastAcc k input len, _) ->+	(AlexLastAcc k input''' len, _) ->   -		AlexToken input len k+		AlexToken input''' len k   -- Push the input through the DFA, remembering the most recent accepting@@ -456,12 +499,12 @@   	let-		base   = alexIndexInt32OffAddr alex_base s-		(I# (ord_c)) = ord c-		offset = (base +# ord_c)-		check  = alexIndexInt16OffAddr alex_check offset+		(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)+		(new_s) = if (offset >=# 0#) && (check ==# ord_c) 			  then alexIndexInt16OffAddr alex_table offset 			  else alexIndexInt16OffAddr alex_deflt s 	in@@ -476,11 +519,11 @@ 	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+	check_accs (AlexAccPred a predx : rest)+	   | predx user orig_input (I# (len)) input 	   = AlexLastAcc a input (I# (len))-	check_accs (AlexAccSkipPred pred : rest)-	   | pred user orig_input (I# (len)) input+	check_accs (AlexAccSkipPred predx : rest)+	   | predx user orig_input (I# (len)) input 	   = AlexLastSkip input (I# (len)) 	check_accs (_ : rest) = check_accs rest 
dist/build/Language/C/Parser/Parser.hs view
@@ -1,4 +1,4 @@-{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}+{-# OPTIONS_GHC -w #-} {-# OPTIONS -fglasgow-exts -cpp #-} module Language.C.Parser.Parser (   -- * Parse a C translation unit@@ -75,12 +75,12 @@  import Prelude    hiding (reverse) import qualified Data.List as List-+import Control.Monad (mplus) import Language.C.Parser.Builtin   (builtinTypeNames) import Language.C.Parser.Lexer     (lexC, parseError)-import Language.C.Parser.Tokens    (CToken(..), GnuCTok(..))-import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef,-                                      enterScope, leaveScope, ParseError(..))+import Language.C.Parser.Tokens    (CToken(..), GnuCTok(..), posLenOfTok)+import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef, getCurrentPosition,+                                      enterScope, leaveScope, getLastToken, getSavedToken, ParseError(..))  import Language.C.Data.RList import Language.C.Data.InputStream@@ -89,18 +89,10 @@ import Language.C.Data.Node import Language.C.Data.Position import Language.C.Syntax-#if __GLASGOW_HASKELL__ >= 503 import qualified Data.Array as Happy_Data_Array-#else-import qualified Array as Happy_Data_Array-#endif-#if __GLASGOW_HASKELL__ >= 503 import qualified GHC.Exts as Happy_GHC_Exts-#else-import qualified GlaExts as Happy_GHC_Exts-#endif --- parser produced by Happy Version 1.18.4+-- parser produced by Happy Version 1.18.6  newtype HappyAbsSyn  = HappyAbsSyn HappyAny #if __GLASGOW_HASKELL__ >= 607@@ -1351,7 +1343,10 @@ happyReduction_4 (happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut8 happy_x_1 of { happy_var_1 -> -	( withNodeInfo happy_var_1 $ CTranslUnit (reverse happy_var_1))}+	( let decls = reverse happy_var_1 in+                       case decls of+                           []     -> do{ n <- getNewName; p <- getCurrentPosition; return $ CTranslUnit decls (mkNodeInfo' p (p,0) n) }+                           (d:ds) -> withNodeInfo d $ CTranslUnit decls)} 	) (\r -> happyReturn (happyIn7 r))  happyReduce_5 = happySpecReduce_0  1# happyReduction_5@@ -1398,17 +1393,17 @@ 		 (happy_var_2 	)} -happyReduce_11 = happyReduce 5# 2# happyReduction_11+happyReduce_11 = happyMonadReduce 5# 2# happyReduction_11 happyReduction_11 (happy_x_5 `HappyStk` 	happy_x_4 `HappyStk` 	happy_x_3 `HappyStk` 	happy_x_2 `HappyStk` 	happy_x_1 `HappyStk`-	happyRest)-	 = case happyOut123 happy_x_3 of { happy_var_3 -> -	happyIn9-		 (CAsmExt happy_var_3-	) `HappyStk` happyRest}+	happyRest) tk+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut123 happy_x_3 of { happy_var_3 -> +	( withNodeInfo happy_var_1 $ CAsmExt happy_var_3)}}+	) (\r -> happyReturn (happyIn9 r))  happyReduce_12 = happyMonadReduce 2# 3# happyReduction_12 happyReduction_12 (happy_x_2 `HappyStk`@@ -1427,7 +1422,7 @@ 	 = happyThen (case happyOut127 happy_x_1 of { happy_var_1 ->  	case happyOut11 happy_x_2 of { happy_var_2 ->  	case happyOut14 happy_x_3 of { happy_var_3 -> -	( leaveScope >> (withNodeInfo happy_var_2 $ CFunDef (liftCAttrs happy_var_1) happy_var_2 [] happy_var_3))}}}+	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftCAttrs happy_var_1) happy_var_2 [] happy_var_3))}}} 	) (\r -> happyReturn (happyIn10 r))  happyReduce_14 = happyMonadReduce 3# 3# happyReduction_14@@ -1642,10 +1637,9 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut125 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut126 happy_x_3 of { happy_var_3 ->  	case happyOut12 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_2 $ CLabel happy_var_1 happy_var_4 happy_var_3)}}}}+	( withNodeInfo happy_var_1 $ CLabel happy_var_1 happy_var_4 happy_var_3)}}} 	) (\r -> happyReturn (happyIn13 r))  happyReduce_35 = happyMonadReduce 4# 6# happyReduction_35@@ -2155,10 +2149,11 @@ 	happy_x_2 `HappyStk` 	happy_x_1 `HappyStk` 	happyRest) tk-	 = happyThen (case happyOutTok happy_x_2 of { (CTokIdent  _ happy_var_2) -> +	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { (CTokIdent  _ happy_var_2) ->  	case happyOut123 happy_x_4 of { happy_var_4 ->  	case happyOut117 happy_x_6 of { happy_var_6 -> -	( withNodeInfo happy_var_4 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}+	( withNodeInfo happy_var_1 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}} 	) (\r -> happyReturn (happyIn30 r))  happyReduce_82 = happyMonadReduce 7# 23# happyReduction_82@@ -2170,10 +2165,11 @@ 	happy_x_2 `HappyStk` 	happy_x_1 `HappyStk` 	happyRest) tk-	 = happyThen (case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> +	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) ->  	case happyOut123 happy_x_4 of { happy_var_4 ->  	case happyOut117 happy_x_6 of { happy_var_6 -> -	( withNodeInfo happy_var_4 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}+	( withNodeInfo happy_var_1 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}} 	) (\r -> happyReturn (happyIn30 r))  happyReduce_83 = happySpecReduce_1  24# happyReduction_83@@ -2209,25 +2205,21 @@ 	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])} 	) (\r -> happyReturn (happyIn32 r)) -happyReduce_87 = happySpecReduce_2  25# happyReduction_87-happyReduction_87 happy_x_2-	happy_x_1-	 =  case happyOut36 happy_x_1 of { happy_var_1 -> -	happyIn32-		 (case happy_var_1 of-            CDecl declspecs dies at ->-              CDecl declspecs (List.reverse dies) at-	)}+happyReduce_87 = happyMonadReduce 2# 25# happyReduction_87+happyReduction_87 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> +	( case happy_var_1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)))}+	) (\r -> happyReturn (happyIn32 r)) -happyReduce_88 = happySpecReduce_2  25# happyReduction_88-happyReduction_88 happy_x_2-	happy_x_1-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> -	happyIn32-		 (case happy_var_1 of-            CDecl declspecs dies at ->-              CDecl declspecs (List.reverse dies) at-	)}+happyReduce_88 = happyMonadReduce 2# 25# happyReduction_88+happyReduction_88 (happy_x_2 `HappyStk`+	happy_x_1 `HappyStk`+	happyRest) tk+	 = happyThen (case happyOut34 happy_x_1 of { happy_var_1 -> +	( case happy_var_1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)))}+	) (\r -> happyReturn (happyIn32 r))  happyReduce_89 = happySpecReduce_0  26# happyReduction_89 happyReduction_89  =  happyIn33@@ -2256,7 +2248,8 @@ 	( let declspecs = reverse happy_var_1 in   	   do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2            ; doDeclIdent declspecs declr-           ; withNodeInfo happy_var_1 $ CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}+           ; withNodeInfo happy_var_1 $+                CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}} 	) (\r -> happyReturn (happyIn34 r))  happyReduce_92 = happyMonadReduce 4# 27# happyReduction_92@@ -2326,7 +2319,7 @@              CDecl declspecs dies at -> do                declr <- withAsmNameAttrs (fst happy_var_5, snd happy_var_5 ++ happy_var_3) happy_var_4                doDeclIdent declspecs declr-               return (CDecl declspecs ((Just (reverseDeclr declr), happy_var_6, Nothing) : dies) at))}}}}}+               withLength at $ CDecl declspecs ((Just (reverseDeclr declr), happy_var_6, Nothing) : dies))}}}}} 	) (\r -> happyReturn (happyIn34 r))  happyReduce_96 = happySpecReduce_2  28# happyReduction_96@@ -2832,7 +2825,7 @@ 	happyRest) tk 	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 ->  	case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> -	( withNodeInfo happy_var_1 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeDef happy_var_2 at))}}+	( withNodeInfo happy_var_2 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeDef happy_var_2 at))}} 	) (\r -> happyReturn (happyIn47 r))  happyReduce_155 = happyMonadReduce 5# 40# happyReduction_155@@ -2843,8 +2836,9 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut117 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}+	( withNodeInfo happy_var_2 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}} 	) (\r -> happyReturn (happyIn47 r))  happyReduce_156 = happyMonadReduce 5# 40# happyReduction_156@@ -2855,8 +2849,9 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> +	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut83 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_1 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}+	( withNodeInfo happy_var_2 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}} 	) (\r -> happyReturn (happyIn47 r))  happyReduce_157 = happySpecReduce_2  40# happyReduction_157@@ -2958,9 +2953,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut127 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut117 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc`  (CTypeSpec (CTypeOfExpr happy_var_4 at)))}}}+	( withNodeInfo happy_var_1 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc`  (CTypeSpec (CTypeOfExpr happy_var_4 at)))}} 	) (\r -> happyReturn (happyIn48 r))  happyReduce_167 = happyMonadReduce 5# 41# happyReduction_167@@ -2984,7 +2978,7 @@ 	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 ->  	case happyOut127 happy_x_2 of { happy_var_2 ->  	case happyOutTok happy_x_3 of { (CTokTyIdent _ happy_var_3) -> -	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeDef happy_var_3 at))}}}+	( withNodeInfo happy_var_3 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeDef happy_var_3 at))}}} 	) (\r -> happyReturn (happyIn48 r))  happyReduce_169 = happyMonadReduce 6# 41# happyReduction_169@@ -2997,8 +2991,9 @@ 	happyRest) tk 	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 ->  	case happyOut127 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { happy_var_3 ->  	case happyOut117 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfExpr happy_var_5 at))}}}+	( withNodeInfo happy_var_3 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfExpr happy_var_5 at))}}}} 	) (\r -> happyReturn (happyIn48 r))  happyReduce_170 = happyMonadReduce 6# 41# happyReduction_170@@ -3011,8 +3006,9 @@ 	happyRest) tk 	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 ->  	case happyOut127 happy_x_2 of { happy_var_2 -> +	case happyOutTok happy_x_3 of { happy_var_3 ->  	case happyOut83 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfType happy_var_5 at))}}}+	( withNodeInfo happy_var_3 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfType happy_var_5 at))}}}} 	) (\r -> happyReturn (happyIn48 r))  happyReduce_171 = happySpecReduce_2  41# happyReduction_171@@ -3926,9 +3922,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut75 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut82 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ funDeclr happy_var_1 (Left $ reverse happy_var_3) [])}}}+	( withNodeInfo happy_var_1 $ funDeclr happy_var_1 (Left $ reverse happy_var_3) [])}} 	) (\r -> happyReturn (happyIn78 r))  happyReduce_265 = happySpecReduce_3  71# happyReduction_265@@ -4823,9 +4818,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut117 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CIndex happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CIndex happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn99 r))  happyReduce_358 = happyMonadReduce 3# 92# happyReduction_358@@ -4834,8 +4828,7 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_2 $ CCall happy_var_1 [])}}+	( withNodeInfo happy_var_1 $ CCall happy_var_1 [])} 	) (\r -> happyReturn (happyIn99 r))  happyReduce_359 = happyMonadReduce 4# 92# happyReduction_359@@ -4845,9 +4838,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut100 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CCall happy_var_1 (reverse happy_var_3))}}}+	( withNodeInfo happy_var_1 $ CCall happy_var_1 (reverse happy_var_3))}} 	) (\r -> happyReturn (happyIn99 r))  happyReduce_360 = happyMonadReduce 3# 92# happyReduction_360@@ -4856,9 +4848,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut125 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CMember happy_var_1 happy_var_3 False)}}}+	( withNodeInfo happy_var_1 $ CMember happy_var_1 happy_var_3 False)}} 	) (\r -> happyReturn (happyIn99 r))  happyReduce_361 = happyMonadReduce 3# 92# happyReduction_361@@ -4867,9 +4858,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut125 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CMember happy_var_1 happy_var_3 True)}}}+	( withNodeInfo happy_var_1 $ CMember happy_var_1 happy_var_3 True)}} 	) (\r -> happyReturn (happyIn99 r))  happyReduce_362 = happyMonadReduce 2# 92# happyReduction_362@@ -4877,8 +4867,7 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_2 $ CUnary CPostIncOp happy_var_1)}}+	( withNodeInfo happy_var_1 $ CUnary CPostIncOp happy_var_1)} 	) (\r -> happyReturn (happyIn99 r))  happyReduce_363 = happyMonadReduce 2# 92# happyReduction_363@@ -4886,8 +4875,7 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 -> -	( withNodeInfo happy_var_2 $ CUnary CPostDecOp happy_var_1)}}+	( withNodeInfo happy_var_1 $ CUnary CPostDecOp happy_var_1)} 	) (\r -> happyReturn (happyIn99 r))  happyReduce_364 = happyMonadReduce 6# 92# happyReduction_364@@ -4898,10 +4886,10 @@ 	happy_x_2 `HappyStk` 	happy_x_1 `HappyStk` 	happyRest) tk-	 = happyThen (case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_4 of { happy_var_4 -> +	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_2 of { happy_var_2 ->  	case happyOut92 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_4 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}}+	( withNodeInfo happy_var_1 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}} 	) (\r -> happyReturn (happyIn99 r))  happyReduce_365 = happyMonadReduce 7# 92# happyReduction_365@@ -4913,10 +4901,10 @@ 	happy_x_2 `HappyStk` 	happy_x_1 `HappyStk` 	happyRest) tk-	 = happyThen (case happyOut83 happy_x_2 of { happy_var_2 -> -	case happyOutTok happy_x_4 of { happy_var_4 -> +	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> +	case happyOut83 happy_x_2 of { happy_var_2 ->  	case happyOut92 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_4 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}}+	( withNodeInfo happy_var_1 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}} 	) (\r -> happyReturn (happyIn99 r))  happyReduce_366 = happySpecReduce_1  93# happyReduction_366@@ -5119,9 +5107,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut103 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CMulOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CMulOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn104 r))  happyReduce_390 = happyMonadReduce 3# 97# happyReduction_390@@ -5130,9 +5117,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut103 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CDivOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CDivOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn104 r))  happyReduce_391 = happyMonadReduce 3# 97# happyReduction_391@@ -5141,9 +5127,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut103 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CRmdOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CRmdOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn104 r))  happyReduce_392 = happySpecReduce_1  98# happyReduction_392@@ -5159,9 +5144,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut105 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut104 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CAddOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CAddOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn105 r))  happyReduce_394 = happyMonadReduce 3# 98# happyReduction_394@@ -5170,9 +5154,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut105 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut104 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CSubOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CSubOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn105 r))  happyReduce_395 = happySpecReduce_1  99# happyReduction_395@@ -5188,9 +5171,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut106 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut105 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CShlOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CShlOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn106 r))  happyReduce_397 = happyMonadReduce 3# 99# happyReduction_397@@ -5199,9 +5181,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut106 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut105 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CShrOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CShrOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn106 r))  happyReduce_398 = happySpecReduce_1  100# happyReduction_398@@ -5217,9 +5198,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut107 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut106 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CLeOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CLeOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn107 r))  happyReduce_400 = happyMonadReduce 3# 100# happyReduction_400@@ -5228,9 +5208,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut107 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut106 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CGrOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CGrOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn107 r))  happyReduce_401 = happyMonadReduce 3# 100# happyReduction_401@@ -5239,9 +5218,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut107 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut106 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CLeqOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CLeqOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn107 r))  happyReduce_402 = happyMonadReduce 3# 100# happyReduction_402@@ -5250,9 +5228,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut107 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut106 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CGeqOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CGeqOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn107 r))  happyReduce_403 = happySpecReduce_1  101# happyReduction_403@@ -5268,9 +5245,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut108 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut107 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CEqOp  happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CEqOp  happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn108 r))  happyReduce_405 = happyMonadReduce 3# 101# happyReduction_405@@ -5279,9 +5255,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut108 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut107 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CNeqOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CNeqOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn108 r))  happyReduce_406 = happySpecReduce_1  102# happyReduction_406@@ -5297,9 +5272,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut109 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut108 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CAndOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CAndOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn109 r))  happyReduce_408 = happySpecReduce_1  103# happyReduction_408@@ -5315,9 +5289,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut110 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut109 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CXorOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CXorOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn110 r))  happyReduce_410 = happySpecReduce_1  104# happyReduction_410@@ -5333,9 +5306,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut111 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut110 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary COrOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary COrOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn111 r))  happyReduce_412 = happySpecReduce_1  105# happyReduction_412@@ -5351,9 +5323,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut111 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CLndOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CLndOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn112 r))  happyReduce_414 = happySpecReduce_1  106# happyReduction_414@@ -5369,9 +5340,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut113 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut112 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CBinary CLorOp happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CBinary CLorOp happy_var_1 happy_var_3)}} 	) (\r -> happyReturn (happyIn113 r))  happyReduce_416 = happySpecReduce_1  107# happyReduction_416@@ -5389,10 +5359,9 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut113 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut117 happy_x_3 of { happy_var_3 ->  	case happyOut114 happy_x_5 of { happy_var_5 -> -	( withNodeInfo happy_var_2 $ CCond happy_var_1 (Just happy_var_3) happy_var_5)}}}}+	( withNodeInfo happy_var_1 $ CCond happy_var_1 (Just happy_var_3) happy_var_5)}}} 	) (\r -> happyReturn (happyIn114 r))  happyReduce_418 = happyMonadReduce 4# 107# happyReduction_418@@ -5402,9 +5371,8 @@ 	happy_x_1 `HappyStk` 	happyRest) tk 	 = happyThen (case happyOut113 happy_x_1 of { happy_var_1 -> -	case happyOutTok happy_x_2 of { happy_var_2 ->  	case happyOut114 happy_x_4 of { happy_var_4 -> -	( withNodeInfo happy_var_2 $ CCond happy_var_1 Nothing happy_var_4)}}}+	( withNodeInfo happy_var_1 $ CCond happy_var_1 Nothing happy_var_4)}} 	) (\r -> happyReturn (happyIn114 r))  happyReduce_419 = happySpecReduce_1  108# happyReduction_419@@ -5422,7 +5390,7 @@ 	 = happyThen (case happyOut101 happy_x_1 of { happy_var_1 ->  	case happyOut116 happy_x_2 of { happy_var_2 ->  	case happyOut115 happy_x_3 of { happy_var_3 -> -	( withNodeInfo happy_var_2 $ CAssign (unL happy_var_2) happy_var_1 happy_var_3)}}}+	( withNodeInfo happy_var_1 $ CAssign (unL happy_var_2) happy_var_1 happy_var_3)}}} 	) (\r -> happyReturn (happyIn115 r))  happyReduce_421 = happySpecReduce_1  109# happyReduction_421@@ -5898,17 +5866,34 @@ instance Pos (Located a) where   posOf (L _ pos) = pos +-- FIXME: the next 3 inlines here increase the object file size by  70%+-- Check whether the speed win is worth it {-# INLINE withNodeInfo #-} withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a-withNodeInfo node mkAttributedNode = do+withNodeInfo node mkAttrNode = do   name <- getNewName-  let attrs = mkNodeInfo (posOf node) name-  attrs `seq` return (mkAttributedNode attrs)+  lastTok <- getSavedToken+  let firstPos = posOf node+  let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok) name+  attrs `seq` return (mkAttrNode attrs) +{-# INLINE withLength #-}+withLength :: NodeInfo -> (NodeInfo -> a) -> P a+withLength nodeinfo mkAttrNode = do+  lastTok <- getSavedToken+  let firstPos = posOfNode nodeinfo+  let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok)+              (maybe (error "nameOfNode") id (nameOfNode nodeinfo))+  attrs `seq` return (mkAttrNode attrs)+ data CDeclrR = CDeclrR (Maybe Ident) (Reversed [CDerivedDeclr]) (Maybe CStrLit) [CAttr] NodeInfo reverseDeclr :: CDeclrR -> CDeclr reverseDeclr (CDeclrR ide reversedDDs asmname cattrs at)     = CDeclr ide (reverse reversedDDs) asmname cattrs at+instance CNode (CDeclrR) where+    nodeInfo (CDeclrR _ _ _ _ n) = n+instance Pos (CDeclrR) where+    posOf (CDeclrR _ _ _ _ n) = posOf n  {-# INLINE withAttribute #-} withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR@@ -5989,9 +5974,7 @@                  Nothing -> CNoArrSize var_sized  liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]-liftTypeQuals (Reversed tyqs) = revmap [] tyqs-  where revmap a []     = a-        revmap a (x:xs) = revmap (CTypeQual x : a) xs+liftTypeQuals = map CTypeQual . reverse  -- lift CAttrs to DeclSpecs --@@ -6018,7 +6001,9 @@ instance Pos a => Pos (Reversed a) where   posOf (Reversed x) = posOf x -emptyDeclr     = CDeclrR Nothing empty Nothing [] (mkNodeInfoOnlyPos nopos)+emptyDeclr :: CDeclrR+emptyDeclr       = CDeclrR Nothing empty Nothing [] undefNode+mkVarDeclr :: Ident -> NodeInfo -> CDeclrR mkVarDeclr ident = CDeclrR (Just ident) empty Nothing []  -- Take the identifiers and use them to update the typedef'ed identifier set@@ -6030,7 +6015,7 @@   case mIdent of     Nothing -> return ()     Just ident | any iypedef declspecs -> addTypedef ident-               | otherwise               -> shadowTypedef ident+               | otherwise             -> shadowTypedef ident    where iypedef (CStorageSpec (CTypedef _)) = True         iypedef _                           = False@@ -6078,7 +6063,7 @@ {-# LINE 1 "templates/GenericTemplate.hs" #-} -- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp  -{-# LINE 28 "templates/GenericTemplate.hs" #-}+{-# LINE 30 "templates/GenericTemplate.hs" #-}   data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList@@ -6087,11 +6072,11 @@   -{-# LINE 49 "templates/GenericTemplate.hs" #-}+{-# LINE 51 "templates/GenericTemplate.hs" #-} -{-# LINE 59 "templates/GenericTemplate.hs" #-}+{-# LINE 61 "templates/GenericTemplate.hs" #-} -{-# LINE 68 "templates/GenericTemplate.hs" #-}+{-# LINE 70 "templates/GenericTemplate.hs" #-}  infixr 9 `HappyStk` data HappyStk a = HappyStk a (HappyStk a)@@ -6134,35 +6119,26 @@   				     happyShift new_state i tk st-				     where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))-   where off    = indexShortOffAddr happyActOffsets st-	 off_i  = (off Happy_GHC_Exts.+# i)+				     where (new_state) = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))+   where (off)    = indexShortOffAddr happyActOffsets st+         (off_i)  = (off Happy_GHC_Exts.+# i) 	 check  = if (off_i Happy_GHC_Exts.>=# (0# :: Happy_GHC_Exts.Int#)) 			then (indexShortOffAddr happyCheck off_i Happy_GHC_Exts.==#  i) 			else False- 	 action | check     = indexShortOffAddr happyTable off_i-		| otherwise = indexShortOffAddr happyDefActions st+         (action)+          | check     = indexShortOffAddr happyTable off_i+          | otherwise = indexShortOffAddr happyDefActions st -{-# LINE 127 "templates/GenericTemplate.hs" #-}+{-# LINE 130 "templates/GenericTemplate.hs" #-}   indexShortOffAddr (HappyA# arr) off =-#if __GLASGOW_HASKELL__ > 500 	Happy_GHC_Exts.narrow16Int# i-#elif __GLASGOW_HASKELL__ == 500-	Happy_GHC_Exts.intToInt16# i-#else-	Happy_GHC_Exts.iShiftRA# (Happy_GHC_Exts.iShiftL# i 16#) 16#-#endif   where-#if __GLASGOW_HASKELL__ >= 503-	i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)-#else-	i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.shiftL# high 8#) low)-#endif-	high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))-	low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))-	off' = off Happy_GHC_Exts.*# 2#+        i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)+        high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))+        low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))+        off' = off Happy_GHC_Exts.*# 2#   @@ -6176,13 +6152,13 @@ ----------------------------------------------------------------------------- -- HappyState data type (not arrays) -{-# LINE 170 "templates/GenericTemplate.hs" #-}+{-# LINE 163 "templates/GenericTemplate.hs" #-}  ----------------------------------------------------------------------------- -- Shifting a token  happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =-     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+     let (i) = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in --     trace "shifting the error token" $      happyDoAction i tk new_state (HappyCons (st) (sts)) (stk) @@ -6226,19 +6202,19 @@      = happyFail 0# tk st sts stk happyMonadReduce k nt fn j tk st sts stk =         happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))-       where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts))+       where (sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))              drop_stk = happyDropStk k stk  happyMonad2Reduce k nt fn 0# tk st sts stk      = happyFail 0# tk st sts stk happyMonad2Reduce k nt fn j tk st sts stk =        happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))-       where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts))+       where (sts1@((HappyCons (st1@(action)) (_)))) = happyDrop k (HappyCons (st) (sts))              drop_stk = happyDropStk k stk -             off    = indexShortOffAddr happyGotoOffsets st1-             off_i  = (off Happy_GHC_Exts.+# nt)-             new_state = indexShortOffAddr happyTable off_i+             (off) = indexShortOffAddr happyGotoOffsets st1+             (off_i) = (off Happy_GHC_Exts.+# nt)+             (new_state) = indexShortOffAddr happyTable off_i   @@ -6256,9 +6232,9 @@ happyGoto nt j tk st =     {- nothing -}    happyDoAction j tk new_state-   where off    = indexShortOffAddr happyGotoOffsets st-	 off_i  = (off Happy_GHC_Exts.+# nt)- 	 new_state = indexShortOffAddr happyTable off_i+   where (off) = indexShortOffAddr happyGotoOffsets st+         (off_i) = (off Happy_GHC_Exts.+# nt)+         (new_state) = indexShortOffAddr happyTable off_i   @@ -6290,6 +6266,7 @@  -- Internal happy errors: +notHappyAtAll :: a notHappyAtAll = error "Internal Happy error\n"  -----------------------------------------------------------------------------
language-c.cabal view
@@ -1,6 +1,6 @@ Name:           language-c-Version:        0.3.2.1-Cabal-Version:  >= 1.2.3+Version:        0.4.1+Cabal-Version:  >= 1.6 Build-Type:     Simple License:        BSD3 License-File:   LICENSE@@ -10,6 +10,7 @@ Stability:      experimental Homepage:       http://www.sivity.net/projects/language.c/ Bug-reports:    http://www.sivity.net/projects/language.c/+ Synopsis:       Analysis and generation of C code Description:    Language C is a haskell library for the analysis and generation of C code.                 It features a complete, well tested parser and pretty printer for all of C99 and a large@@ -19,6 +20,11 @@ Extra-Source-Files: AUTHORS AUTHORS.c2hs ChangeLog README                     src/Language/C/Parser/Lexer.x                     src/Language/C/Parser/Parser.y++Source-Repository head+  type:     darcs+  location: http://code.haskell.org/language-c+ Flag splitBase     Description: Choose the new smaller, split-up base package. Flag useByteStrings@@ -67,6 +73,7 @@                       Language.C.Syntax.AST                       Language.C.Syntax.Constants                       Language.C.Syntax.Ops+                      Language.C.Syntax.Utils                       -- parser                       Language.C.Parser                       -- pretty printer@@ -76,6 +83,8 @@                       Language.C.System.GCC                       -- analysis [experimental]                       Language.C.Analysis+                      Language.C.Analysis.ConstEval+                      Language.C.Analysis.Builtins                       Language.C.Analysis.SemError                       Language.C.Analysis.SemRep                       Language.C.Analysis.DefTable@@ -83,10 +92,13 @@                       Language.C.Analysis.AstAnalysis                       Language.C.Analysis.DeclAnalysis                       Language.C.Analysis.Debug+                      Language.C.Analysis.TypeCheck+                      Language.C.Analysis.TypeConversions+                      Language.C.Analysis.TypeUtils+                      Language.C.Analysis.NameSpaceMap                       -- semrep -> code [alpha]                       Language.C.Analysis.Export     Other-Modules:-                      Language.C.Analysis.NameSpaceMap                       Language.C.Data.RList                       -- parser implementation                       Language.C.Parser.Builtin
src/Language/C.hs view
@@ -29,7 +29,7 @@ import Language.C.Parser import Language.C.System.Preprocess --- | preprocess (if neccessary) and parse a C source file+-- | preprocess (if necessary) and parse a C source file -- --   > Synopsis: parseCFile preprocesssor tmp-dir? cpp-opts file --   > Example:  parseCFile (newGCC "gcc") Nothing ["-I/usr/include/gtk-2.0"] my-gtk-exts.c
src/Language/C/Analysis/AstAnalysis.hs view
@@ -13,28 +13,48 @@ -- Traverses the AST, analyses declarations and invokes handlers. ----------------------------------------------------------------------------- module Language.C.Analysis.AstAnalysis (+    -- * Top-level analysis     analyseAST,-    analyseExt,analyseFunDef,analyseExtDecls,+    analyseExt,analyseFunDef,analyseDecl,+    -- * Building blocks for additional analyses+    analyseFunctionBody,+    defineParams,+    -- * Type checking+    tExpr, ExprSide(..),+    tStmt, StmtCtx(..),+    tDesignator,+    defaultMD ) where import Language.C.Analysis.SemError import Language.C.Analysis.SemRep import Language.C.Analysis.TravMonad-import Language.C.Analysis.DefTable+import Language.C.Analysis.ConstEval+import Language.C.Analysis.Debug+import Language.C.Analysis.DefTable (DefTable, globalDefs, defineScopedIdent,+                                     defineLabel, inFileScope, lookupTag,+                                     lookupLabel, insertType, lookupType) import Language.C.Analysis.DeclAnalysis+import Language.C.Analysis.TypeUtils+import Language.C.Analysis.TypeCheck+import Language.C.Analysis.TypeConversions  import Language.C.Data-import Language.C.Syntax+import Language.C.Pretty+import Language.C.Syntax.AST+import Language.C.Syntax.Constants+import Language.C.Syntax.Ops+import Language.C.Syntax.Utils+import Text.PrettyPrint.HughesPJ + import Control.Monad import Prelude hiding (reverse)+import Data.Either (rights) import Data.Foldable (foldrM) import Data.List hiding (reverse)-import Data.Maybe-import Data.Map (Map) import qualified Data.Map as Map-import Debug.Trace-+import Data.Maybe  -- * analysis @@ -45,54 +65,65 @@ -- callbacks in the @MonadTrav@ @m@. -- -- Returns the set of global declarations and definitions which where successfully translated.--- It is the users responsibility to check whether any hard errors occured (@runTrav@ does this for you).+-- It is the users responsibility to check whether any hard errors occurred (@runTrav@ does this for you). analyseAST :: (MonadTrav m) => CTranslUnit -> m GlobalDecls analyseAST (CTranslUnit decls _file_node) = do+    -- analyse all declarations, but recover from errors     mapRecoverM_ analyseExt decls+    -- check we are in global scope afterwards+    getDefTable >>= \dt -> when (not (inFileScope dt)) $+        error "Internal Error: Not in filescope after analysis"+    -- get the global definition table (XXX: remove ?)     liftM globalDefs getDefTable     where     mapRecoverM_ f = mapM_ (handleTravError . f)  -- | Analyse an top-level declaration analyseExt :: (MonadTrav m) => CExtDecl -> m ()-analyseExt (CAsmExt asm)+analyseExt (CAsmExt asm _)     = handleAsmBlock asm analyseExt (CFDefExt fundef)     = analyseFunDef fundef-analyseExt (CDeclExt decls)-    = analyseExtDecls decls+analyseExt (CDeclExt decl)+    = analyseDecl False decl  -- | Analyse a function definition analyseFunDef :: (MonadTrav m) => CFunDef -> m () analyseFunDef (CFunDef declspecs declr oldstyle_decls stmt node_info) = do     -- analyse the declarator-    var_decl_info <- analyseVarDecl True declspecs declr oldstyle_decls+    var_decl_info <- analyseVarDecl' True declspecs declr oldstyle_decls Nothing     let (VarDeclInfo name is_inline storage_spec attrs ty declr_node) = var_decl_info+    when (isNoName name) $ astError node_info "NoName in analyseFunDef"     let ident = identOfVarName name-    -- compute storage-    fun_storage <- computeFunDefStorage ident storage_spec-    let var_decl = VarDecl name (DeclAttrs is_inline fun_storage attrs) ty     -- improve incomplete type     ty' <- improveFunDefType ty-    -- callback-    handleVarDecl (Decl var_decl node_info)-    -- translate the body-    stmt' <- analyseFunctionBody var_decl stmt-    -- define the function+    -- compute storage+    fun_storage <- computeFunDefStorage ident storage_spec+    let var_decl = VarDecl name (DeclAttrs is_inline fun_storage attrs) ty'+    -- callback for declaration+    handleVarDecl False (Decl var_decl node_info)+    -- process body+    stmt' <- analyseFunctionBody node_info var_decl stmt+    -- callback for definition     handleFunDef ident (FunDef var_decl stmt' node_info)     where-    improveFunDefType (FunctionType (FunTypeIncomplete return_ty attrs)) =-      return . FunctionType $ FunType return_ty [] False attrs+    improveFunDefType (FunctionType (FunTypeIncomplete return_ty) attrs) =+      return $ FunctionType (FunType return_ty [] False) attrs     improveFunDefType ty = return $ ty --- | Analyse a top-level declaration other than a function definition-analyseExtDecls :: (MonadTrav m) => CDecl -> m ()-analyseExtDecls decl@(CDecl declspecs declrs node)+-- | Analyse a declaration other than a function definition+analyseDecl :: (MonadTrav m) => Bool -> CDecl -> m ()+analyseDecl is_local decl@(CDecl declspecs declrs node)     | null declrs =         case typedef_spec of Just _  -> astError node "bad typedef declaration: missing declarator"                              Nothing -> analyseTypeDecl decl >> return ()     | (Just declspecs') <- typedef_spec = mapM_ (uncurry (analyseTyDef declspecs')) declr_list-    | otherwise   = mapM_ (uncurry analyseVarDeclr) declr_list+    | otherwise   = do let (storage_specs, attrs, typequals, typespecs, inline) =+                             partitionDeclSpecs declspecs+                       canonTySpecs <- canonicalTypeSpec typespecs+                       let specs =+                             (storage_specs, attrs, typequals, canonTySpecs, inline)+                       mapM_ (uncurry (analyseVarDeclr specs)) declr_list     where     declr_list = zip (True : repeat False) declrs     typedef_spec = hasTypeDef declspecs@@ -102,27 +133,31 @@             (Just tydeclr, Nothing , Nothing) -> analyseTypeDef handle_sue_def declspecs' tydeclr node             _ -> astError node "bad typdef declaration: bitfieldsize or initializer present" -    analyseVarDeclr handle_sue_def (Just declr, init_opt, Nothing) = do+    analyseVarDeclr specs handle_sue_def (Just declr, init_opt, Nothing) = do         -- analyse the declarator-        vardeclInfo@(VarDeclInfo _ _ _ _ typ _) <- analyseVarDecl handle_sue_def declspecs declr []+        let (storage_specs, attrs, typequals, canonTySpecs, inline) = specs+        vardeclInfo@(VarDeclInfo _ _ _ _ typ _) <-+          analyseVarDecl handle_sue_def storage_specs attrs typequals canonTySpecs inline+                         declr [] Nothing         -- declare / define the object-        init_opt' <- mapMaybeM init_opt tInit-        when (isTypeOfExpr typ) $ astError node "we cannot analyse typeof(expr) yet"         if (isFunctionType typ)             then extFunProto vardeclInfo-            else extVarDecl vardeclInfo init_opt'-    analyseVarDeclr _ (Nothing,_,_)         = astError node "abstract declarator in object declaration"-    analyseVarDeclr _ (_,_,Just bitfieldSz) = astError node "bitfield size in object declaration"--    isTypeOfExpr (TypeOfExpr _) = True-    isTypeOfExpr _ = False+            else (if is_local then localVarDecl else extVarDecl)+                 -- XXX: if Initializer becomes different from CInit, this+                 -- will have to change.+                 vardeclInfo init_opt+        init_opt' <- mapMaybeM init_opt (tInit typ)+        return ()+    analyseVarDeclr _ _ (Nothing,_,_)         = astError node "abstract declarator in object declaration"+    analyseVarDeclr _ _ (_,_,Just bitfieldSz) = astError node "bitfield size in object declaration"  -- | Analyse a typedef analyseTypeDef :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> NodeInfo -> m () analyseTypeDef handle_sue_def declspecs declr node_info = do     -- analyse the declarator-    (VarDeclInfo name is_inline storage_spec attrs ty declr_node) <- analyseVarDecl handle_sue_def declspecs declr []+    (VarDeclInfo name is_inline storage_spec attrs ty declr_node) <- analyseVarDecl' handle_sue_def declspecs declr [] Nothing     checkValidTypeDef is_inline storage_spec attrs+    when (isNoName name) $ astError node_info "NoName in analyseTypeDef"     let ident = identOfVarName name     handleTypeDef (TypeDef ident ty attrs node_info)     where@@ -130,24 +165,6 @@     checkValidTypeDef _ NoStorageSpec _ = return ()     checkValidTypeDef _ bad_storage _ = astError node_info $ "storage specified for typeDef: " ++ show bad_storage --- | Analyse declarators-analyseVarDecl :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> m VarDeclInfo-analyseVarDecl handle_sue_def declspecs declr oldstyle_params = do-    let (storagespecs, decl_attrs, typequals, typespecs, inline) = partitionDeclSpecs declspecs-    -- analyse the storage specifiers-    storage_spec  <- canonicalStorageSpec storagespecs-    -- translate the type into semantic representation-    typ          <- tType handle_sue_def node typequals typespecs derived_declrs oldstyle_params-    -- translate attributes-    attrs'       <- mapM tAttr (decl_attrs ++ declr_attrs)-    -- create the variable name-    name         <- mkVarName node nameOpt asmname_opt-    return $ VarDeclInfo name inline storage_spec attrs' typ node-    where-    (CDeclr nameOpt derived_declrs asmname_opt declr_attrs node) = declr-    isInlineSpec (CInlineQual _) = True-    isInlineSpec _ = False- -- | compute storage of a function definition -- -- a function definition has static storage with internal linkage if specified `static`,@@ -166,13 +183,23 @@     bad_spec -> throwTravError $ badSpecifierError (nodeInfo ident)                   $ "unexpected function storage specifier (only static or extern is allowed)" ++ show bad_spec +-- (private) Get parameters of a function type+getParams :: Type -> Maybe [ParamDecl]+getParams (FunctionType (FunType _ params _) _) = Just params+getParams _ = Nothing+ -- | handle a function prototype extFunProto :: (MonadTrav m) => VarDeclInfo -> m () extFunProto (VarDeclInfo var_name is_inline storage_spec attrs ty node_info) =-    do  old_fun <- lookupObject (identOfVarName var_name)+    do  when (isNoName var_name) $ astError node_info "NoName in extFunProto"+        old_fun <- lookupObject (identOfVarName var_name)         checkValidSpecs         let decl = VarDecl var_name (DeclAttrs is_inline (funDeclLinkage old_fun) attrs) ty-        handleVarDecl (Decl decl node_info)+        handleVarDecl False (Decl decl node_info)+        -- XXX: structs should be handled in 'function prototype scope' too+        enterPrototypeScope+        maybe (return ()) (mapM_ handleParamDecl) (getParams ty)+        leavePrototypeScope     where     funDeclLinkage old_fun =         case storage_spec of@@ -184,56 +211,521 @@             _ -> error $ "funDeclLinkage: " ++ show storage_spec     checkValidSpecs         | hasThreadLocalSpec storage_spec = astError node_info "thread local storage specified for function"-        | RegSpec <- storage_spec        = astError node_info "invalid `register' storage specified for function"-        | otherwise                      = return ()+        | RegSpec <- storage_spec         = astError node_info "invalid `register' storage specified for function"+        | otherwise                       = return ()  -- | handle a object declaration \/ definition -- -- We have to check the storage specifiers here, as they determine wheter we're dealing with decalartions -- or definitions--- see [doc\/ExternalDefinitions.txt]+-- see [http://www.sivity.net/projects/language.c/wiki/ExternalDefinitions] extVarDecl :: (MonadTrav m) => VarDeclInfo -> (Maybe Initializer) -> m () extVarDecl (VarDeclInfo var_name is_inline storage_spec attrs typ node_info) init_opt =-    do let ident = identOfVarName var_name-       old_decl <- lookupObject ident-       checkValidVarDeclStorage-       let vardecl linkage = VarDecl var_name (DeclAttrs is_inline linkage attrs) typ-       let decl linkage = Decl (vardecl linkage) node_info-       case storage_spec of-           NoStorageSpec           -- tentative if there is no initializer, external-               -> handleObjectDef ident $ ObjDef (vardecl (Static ExternalLinkage False)) init_opt node_info-           StaticSpec thread_local -- tentative if there is no initializer, internal-               -> handleObjectDef ident $ ObjDef (vardecl (Static InternalLinkage thread_local)) init_opt node_info-           ExternSpec thread_local-             | Nothing <- init_opt  -- declaration with either external or old storage-               -> handleVarDecl $ decl $ maybe (Static ExternalLinkage thread_local) declStorage old_decl-             | otherwise            -- warning, external definition-               -> do warn $ badSpecifierError node_info-                            "Both initializer and `extern` specifier given - treating as definition"-                     handleObjectDef ident $ ObjDef (vardecl (Static ExternalLinkage thread_local)) init_opt node_info-           _ -> error$ "extVarDecl: storage_spec: "++show storage_spec+    do when (isNoName var_name) $ astError node_info "NoName in extVarDecl"+       (storage,is_def) <- globalStorage storage_spec+       let vardecl = VarDecl var_name (DeclAttrs is_inline storage attrs) typ+       if is_def+           then handleObjectDef False ident $ ObjDef vardecl init_opt node_info+           else handleVarDecl False $ Decl vardecl node_info     where-    checkValidVarDeclStorage-        | is_inline               = astError node_info "invalide `inline' specifier for non-function"-        | RegSpec <- storage_spec = astError node_info "invalid `register' storage specified for external object"-        | otherwise               = return ()+       ident = identOfVarName var_name+       globalStorage _ | is_inline = astError node_info "invalid `inline' specifier external variable"+       globalStorage RegSpec       =+         do when (isJust init_opt) $ astError node_info "initializer given for global register variable"+            case var_name of+              NoName -> astError node_info "global register variable has no name"+              VarName _ Nothing -> astError node_info "no register specified for global register variable"+              _ -> return ()+            dt <- getDefTable+            when (hasFunDef dt) $ astError node_info "global register variable appears after a function definition"+            return (Static InternalLinkage False, False)+       -- tentative if there is no initializer, external+       globalStorage NoStorageSpec = return $ (Static ExternalLinkage False, True)+       -- tentative if there is no initializer, internal+       globalStorage (StaticSpec thread_local) = return $ (Static InternalLinkage thread_local, True)+       globalStorage (ExternSpec thread_local) =+           case init_opt of+               -- declaration with either external or old storage+               Nothing -> do old_decl <- lookupObject ident+                             return $ (maybe (Static ExternalLinkage thread_local) declStorage old_decl,False)+               -- warning, external definition+               Just _  -> do warn $ badSpecifierError node_info "Both initializer and `extern` specifier given - treating as definition"+                             return $ (Static ExternalLinkage thread_local, True)+       hasFunDef dt = any (isFuncDef . snd) (Map.toList $ gObjs $ globalDefs dt)+       isFuncDef (FunctionDef fd) = not $ isInline $ declAttrs fd+       isFuncDef _ = False+       isInline (DeclAttrs inl _ _) = inl --- | /TODO/: Bogus-analyseFunctionBody :: (MonadTrav m) => VarDecl -> CStat -> m Stmt-analyseFunctionBody _ = return+-- | handle a function-scope object declaration \/ definition+-- see [http://www.sivity.net/projects/language.c/wiki/LocalDefinitions]+localVarDecl :: (MonadTrav m) => VarDeclInfo -> (Maybe Initializer) -> m ()+localVarDecl (VarDeclInfo var_name is_inline storage_spec attrs typ node_info) init_opt =+    do when (isNoName var_name) $ astError node_info "NoName in localVarDecl"+       (storage,is_def) <- localStorage storage_spec+       let vardecl = VarDecl var_name (DeclAttrs is_inline storage attrs) typ+       if is_def+           then handleObjectDef True ident (ObjDef vardecl init_opt node_info)+           else handleVarDecl True (Decl vardecl node_info)+    where+    ident = identOfVarName var_name+    localStorage _+      | is_inline = astError node_info "invalid `inline' specifier for local variable"+    localStorage NoStorageSpec = return $ (Auto False,True)+    localStorage RegSpec = return $ (Auto True,True)+    -- static no linkage+    localStorage (StaticSpec thread_local) =+      return $ (Static NoLinkage thread_local,True)+    localStorage (ExternSpec thread_local)+      | isJust init_opt = astError node_info "extern keyword and initializer for local"+      | otherwise =+          do old_decl <- lookupObject ident+             return (maybe (Static ExternalLinkage thread_local) declStorage old_decl,False)+    localStorage s = astError node_info "bad storage specifier for local" --- | /TODO/: Bogus-tStmt :: (MonadTrav m) => CStat -> m Stmt-tStmt = return+defineParams :: MonadTrav m => NodeInfo -> VarDecl -> m ()+defineParams ni decl =+  case (getParams $ declType decl) of+    Nothing -> astError ni+               "expecting complete function type in function definition"+    Just params -> mapM_ handleParamDecl params --- | /TODO/: Bogus-tExpr :: (MonadTrav m) => CExpr -> m Expr-tExpr = return+analyseFunctionBody :: (MonadTrav m) => NodeInfo -> VarDecl -> CStat -> m Stmt+analyseFunctionBody node_info decl s@(CCompound localLabels items _) =+  do enterFunctionScope+     mapM_ (withDefTable . defineLabel) (localLabels ++ getLabels s)+     defineParams node_info decl+     -- record parameters+     mapM_ (tBlockItem [FunCtx decl]) items+     leaveFunctionScope+     return s -- XXX: bogus --- | /TODO/: Bogus-tInit :: (MonadTrav m) => CInit -> m Initializer-tInit = return+analyseFunctionBody _ _ s = astError (nodeInfo s) "Function body is no compound statement" +data StmtCtx = FunCtx VarDecl+             | LoopCtx+             | SwitchCtx++-- | Given a context, determine the type declaration for the enclosing+--   function, if possible, given a context.+enclosingFunctionType :: [StmtCtx] -> Maybe Type+enclosingFunctionType [] = Nothing+enclosingFunctionType (FunCtx vd : _) = Just $ declType vd+enclosingFunctionType (_ : cs) = enclosingFunctionType cs++inLoop :: [StmtCtx] -> Bool+inLoop c = any isLoop c+  where isLoop LoopCtx = True+        isLoop _ = False++inSwitch :: [StmtCtx] -> Bool+inSwitch c = any isSwitch c+  where isSwitch SwitchCtx = True+        isSwitch _ = False++data ExprSide = LValue | RValue+                deriving (Eq, Show)++-- | Typecheck a statement, given a statement context. The type of a+--   statement is usually @void@, but expression statements and blocks+--   can sometimes have other types.+tStmt :: MonadTrav m => [StmtCtx] -> CStat -> m Type+tStmt c (CLabel _ s _ _)         = tStmt c s+tStmt c (CExpr e _)              =+  maybe (return voidType) (tExpr c RValue) e+tStmt c (CCompound ls body _)    =+  do enterBlockScope+     mapM_ (withDefTable . defineLabel) ls+     t <- foldM (const $ tBlockItem c) voidType body+     leaveBlockScope+     return t+tStmt c (CIf e sthen selse _)    =+  checkGuard c e >> tStmt c sthen+                 >> maybe (return ()) (\s -> tStmt c s >> return ()) selse+                 >> return voidType+tStmt c (CSwitch e s ni)         =+  tExpr c RValue e >>= checkIntegral' ni >>+  tStmt (SwitchCtx : c) s+tStmt c (CWhile e s _ _)         =+  checkGuard c e >> tStmt (LoopCtx : c) s+tStmt _ (CGoto l ni)             =+  do dt <- getDefTable+     case lookupLabel l dt of+       Just _ -> return voidType+       Nothing -> typeError ni $ "undefined label in goto: " ++ identToString l+tStmt c (CCont ni)               =+  do unless (inLoop c) $ astError ni "continue statement outside of loop"+     return voidType+tStmt c (CBreak ni)              =+  do unless (inLoop c || inSwitch c) $+            astError ni "break statement outside of loop or switch statement"+     return voidType+tStmt c (CReturn (Just e) ni)    =+  do t <- tExpr c RValue e+     rt <- case enclosingFunctionType c of+             Just (FunctionType (FunType rt _ _) _) -> return rt+             Just (FunctionType (FunTypeIncomplete rt) _) -> return rt+             Just ft -> astError ni $ "bad function type: " ++ pType ft+             Nothing -> astError ni "return statement outside function"+     case (rt, t) of+       -- apparently it's ok to return void from a void function?+       (DirectType TyVoid _ _, DirectType TyVoid _ _) -> return ()+       _ -> assignCompatible' ni CAssignOp rt t+     return voidType+tStmt _ (CReturn Nothing _)      = return voidType+-- XXX: anything to do for assembly?+tStmt _ (CAsm _ _)               = return voidType+tStmt c (CCase e s ni)           =+  do unless (inSwitch c) $+            astError ni "case statement outside of switch statement"+     tExpr c RValue e >>= checkIntegral' ni+     tStmt c s+tStmt c (CCases e1 e2 s ni)      =+  do unless (inSwitch c) $+            astError ni "case statement outside of switch statement"+     tExpr c RValue e1 >>= checkIntegral' ni+     tExpr c RValue e2 >>= checkIntegral' ni+     tStmt c s+tStmt c (CDefault s ni)          =+  do unless (inSwitch c) $+            astError ni "default statement outside of switch statement"+     tStmt c s+tStmt c (CFor i g inc s _)       =+  do enterBlockScope+     either (maybe (return ()) checkExpr) (analyseDecl True) i+     maybe (return ()) (checkGuard c) g+     maybe (return ()) checkExpr inc+     tStmt (LoopCtx : c) s+     leaveBlockScope+     return voidType+  where checkExpr e = tExpr c RValue e >> return ()+tStmt c (CGotoPtr e ni)          =+  do t <- tExpr c RValue e+     case t of+       (PtrType _ _ _) -> return voidType+       _               -> typeError ni "can't goto non-pointer"++-- | Typecheck a block item. When statement expressions are blocks,+--   they have the type of their last expression statement, so this+--   needs to return a type.+tBlockItem :: MonadTrav m => [StmtCtx] -> CBlockItem -> m Type+tBlockItem c (CBlockStmt s) = tStmt c s+tBlockItem _ (CBlockDecl d) = analyseDecl True d >> return voidType+-- TODO: fixup analyseFunDef to handle nested functions+tBlockItem _ (CNestedFunDef fd) = analyseFunDef fd >> return voidType++checkGuard :: MonadTrav m => [StmtCtx] -> CExpr -> m ()+checkGuard c e = tExpr c RValue e >>= checkScalar' (nodeInfo e)++-- XXX: this is bogus, correct only for IA32. We should eventually+-- have a collection of these and allow people to choose one.+defaultMD :: MachineDesc+defaultMD =+  MachineDesc+  { iSize = \it ->+            case it of+              TyBool   -> 1+              TyChar   -> 1+              TySChar  -> 1+              TyUChar  -> 1+              TyShort  -> 2+              TyUShort -> 2+              TyInt    -> 4+              TyUInt   -> 4+              TyLong   -> 4+              TyULong  -> 4+              TyLLong  -> 8+              TyULLong -> 8+  , fSize = \ft ->+            case ft of+              TyFloat   -> 4+              TyDouble  -> 8+              TyLDouble -> 16+  , builtinSize = \bt ->+                  case bt of+                    TyVaList -> 4+                    TyAny    -> 4+  , ptrSize = 4+  , voidSize = 1+  , iAlign = \it ->+             case it of+               TyBool   -> 1+               TyChar   -> 1+               TySChar  -> 1+               TyUChar  -> 1+               TyShort  -> 2+               TyUShort -> 2+               TyInt    -> 4+               TyUInt   -> 4+               TyLong   -> 4+               TyULong  -> 4+               TyLLong  -> 8+               TyULLong -> 8+  , fAlign = \ft ->+             case ft of+               TyFloat   -> 4+               TyDouble  -> 8+               TyLDouble -> 16+  , builtinAlign = \bt ->+                   case bt of+                     TyVaList -> 4+                     TyAny    -> 4+  , ptrAlign = 4+  , voidAlign = 1+  }++tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type+tExpr c side e =+  case nameOfNode (nodeInfo e) of+    Just n ->+      do dt <- getDefTable+         case lookupType dt n of+           Just t -> return t+           Nothing ->+             do t <- tExpr' c side e+                withDefTable (\dt -> (t, insertType dt n t))+    Nothing -> tExpr' c side e++-- | Typecheck an expression, with information about whether it+--   appears as an lvalue or an rvalue.+tExpr' :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type+tExpr' c side (CBinary op le re ni)    =+  do when (side == LValue) $ typeError ni "binary operator as lvalue"+     lt <- tExpr c RValue le+     rt <- tExpr c RValue re+     binopType' ni op lt rt+tExpr' c side (CUnary CAdrOp e ni)     =+  do when (side == LValue) $+          typeError ni "address-of operator as lvalue"+     case e of+       CCompoundLit _ _ _ -> simplePtr `liftM` tExpr c RValue e+       CVar i _ -> lookupObject i >>=+                   typeErrorOnLeft ni . maybe (notFound i) varAddrType+       _        -> simplePtr `liftM` tExpr c LValue e+tExpr' c _ (CUnary CIndOp e ni)     =+  tExpr c RValue e >>= (typeErrorOnLeft ni . derefType)+tExpr' c _ (CUnary CCompOp e ni)    =+  do t <- tExpr c RValue e+     checkIntegral' ni t+     return t+tExpr' c side (CUnary CNegOp e ni)      =+  do when (side == LValue) $+          typeError ni "logical negation used as lvalue"+     tExpr c RValue e >>= checkScalar' ni+     return boolType+tExpr' c side (CUnary op e _)          =+  tExpr c (if isEffectfulOp op then LValue else side) e+tExpr' c _ (CIndex b i ni)             =+  do bt <- tExpr c RValue b+     it <- tExpr c RValue i+     addrTy <- binopType' ni CAddOp bt it+     typeErrorOnLeft ni $ derefType addrTy+tExpr' c side (CCond e1 me2 e3 ni)     =+  do t1 <- tExpr c RValue e1+     checkScalar' (nodeInfo e1) t1+     t3 <- tExpr c side e3+     case me2 of+       Just e2 ->+         do t2 <- tExpr c side e2+            conditionalType' ni t2 t3+       Nothing -> conditionalType' ni t1 t3+tExpr' c side (CMember e m deref ni)   =+  do t <- tExpr c RValue e+     bt <- if deref then typeErrorOnLeft ni (derefType t) else return t+     fieldType ni m bt+tExpr' c side (CComma es _)            =+  mapM (tExpr c side) es >>= return . last+tExpr' c side (CCast d e ni)           =+  do dt <- analyseTypeDecl d+     et <- tExpr c side e+     typeErrorOnLeft ni $ castCompatible dt et+     return dt+tExpr' c side (CSizeofExpr e ni)       =+  do when (side == LValue) $ typeError ni "sizeof as lvalue"+     tExpr c RValue e+     return size_tType+tExpr' c side (CAlignofExpr e ni)      =+  do when (side == LValue) $ typeError ni "alignof as lvalue"+     tExpr c RValue e+     return size_tType+tExpr' c side (CComplexReal e ni)      = complexBaseType ni c side e+tExpr' c side (CComplexImag e ni)      = complexBaseType ni c side e+tExpr' _ side (CLabAddrExpr _ ni)      =+  do when (side == LValue) $ typeError ni "label address as lvalue"+     return $ PtrType voidType noTypeQuals []+tExpr' _ side (CCompoundLit d initList ni) =+  do when (side == LValue) $ typeError ni "compound literal as lvalue"+     lt <- analyseTypeDecl d+     tInitList ni (canonicalType lt) initList+     return lt+tExpr' _ RValue (CAlignofType _ _)     = return size_tType+tExpr' _ RValue (CSizeofType _ _)      = return size_tType+tExpr' _ LValue (CAlignofType _ ni)    =+  typeError ni "alignoftype as lvalue"+tExpr' _ LValue (CSizeofType _ ni)     =+  typeError ni "sizeoftype as lvalue"+tExpr' _ side (CVar i ni)              =+  lookupObject i >>=+  maybe (typeErrorOnLeft ni $ notFound i) (return . declType)+tExpr' _ _ (CConst c)                  = constType c+tExpr' _ _ (CBuiltinExpr b)            = builtinType b+tExpr' c side (CCall (CVar i _) args ni)+  | identToString i == "__builtin_choose_expr" =+    case args of+      [g, e1, e2] ->+        -- XXX: the MachineDesc parameter below should be configurable+        do b <- constEval defaultMD Map.empty g+           case boolValue b of+             Just True -> tExpr c side e1+             Just False -> tExpr c side e2+             Nothing ->+               astError ni "non-constant argument to __builtin_choose_expr"+      _ -> astError ni "wrong number of arguments to __builtin_choose_expr"+tExpr' c _ (CCall fe args ni)          =+  do let defType = FunctionType+                   (FunTypeIncomplete+                    (DirectType (TyIntegral TyInt) noTypeQuals noAttributes))+                   noAttributes+         fallback i = do warn $ invalidAST ni $+                                "unknown function: " ++ identToString i+                         return defType+     t <- case fe of+            CVar i _ -> lookupObject i >>=+                        maybe (fallback i) (const $ tExpr c RValue fe)+            _ -> tExpr c RValue fe+     atys <- mapM (tExpr c RValue) args+     -- XXX: we don't actually want to return the canonical return type here+     case canonicalType t of+       PtrType (FunctionType (FunType rt pdecls varargs) _) _ _ ->+         do let ptys = map declType pdecls+            mapM_ checkArg $ zip3 ptys atys args+            unless varargs $ when (length atys /= length ptys) $+                   typeError ni "incorrect number of arguments"+            return $ canonicalType rt+       PtrType (FunctionType (FunTypeIncomplete rt) _) _ _ ->+         do -- warn $ invalidAST ni "incomplete function type"+            return $ canonicalType rt+       _  -> typeError ni $ "attempt to call non-function of type " ++ pType t+  where checkArg (pty, aty, arg) =+          do attrs <- deepTypeAttrs pty+             case isTransparentUnion attrs of+               True ->+                 case canonicalType pty of+                   DirectType (TyComp ctr) _ _ ->+                     do td <- lookupSUE (nodeInfo arg) (sueRef ctr)+                        ms <- tagMembers (nodeInfo arg) td+                        {-+                        when (null $ rights $ matches ms) $+                             astError (nodeInfo arg) $+                             "argument matches none of the elements " +++                             "of transparent union"+                        -}+                        return ()+                     where matches =+                             map (\d -> assignCompatible+                                        CAssignOp+                                        (snd d)+                                        aty+                                 )+                   _ -> astError (nodeInfo arg)+                        "non-composite has __transparent_union__ attribute"+               False -> assignCompatible' (nodeInfo arg) CAssignOp pty aty+        isTransparentUnion =+          any (\(Attr n _ _) -> identToString n == "__transparent_union__")+tExpr' c _ (CAssign op le re ni)       =+  do lt <- tExpr c LValue le+     rt <- tExpr c RValue re+     when (constant $ typeQuals lt) $+          typeError ni $ "assignment to lvalue with `constant' qualifier: "+                         ++ (render . pretty) le+     case (canonicalType lt, re) of+       (lt', CConst (CIntConst i _))+         | isPointerType lt' && getCInteger i == 0 -> return ()+       (_, _) -> assignCompatible' ni op lt rt+     return lt+tExpr' c _ (CStatExpr s _)             =+  do enterBlockScope+     mapM_ (withDefTable . defineLabel) (getLabels s)+     t <- tStmt c s+     leaveBlockScope+     return t++tInitList :: MonadTrav m => NodeInfo -> Type -> CInitList -> m ()+tInitList ni t@(ArrayType (DirectType (TyIntegral TyChar) _ _) _ _ _)+             [([], CInitExpr e@(CConst (CStrConst _ _)) _)] =+  tExpr [] RValue e >> return ()+tInitList ni t@(ArrayType _ _ _ _) initList =+  do let default_ds =+           repeat (CArrDesig (CConst (CIntConst (cInteger 0) ni)) ni)+     checkInits t default_ds initList+tInitList ni t@(DirectType (TyComp ctr) _ _) initList =+  do td <- lookupSUE ni (sueRef ctr)+     ms <- tagMembers ni td+     let default_ds = map (\m -> CMemberDesig (fst m) ni) ms+     checkInits t default_ds initList+tInitList ni (PtrType (DirectType TyVoid _ _) _ _ ) _ =+          return () -- XXX: more checking+tInitList _ t [([], i)] = tInit t i >> return ()+tInitList ni t _ = typeError ni $ "initializer list for type: " ++ pType t++checkInits :: MonadTrav m => Type -> [CDesignator] -> CInitList -> m ()+checkInits _ _ [] = return ()+checkInits t dds ((ds, i) : is) =+  do (dds', ds') <- case (dds, ds) of+                      ([], []) ->+                        typeError (nodeInfo i) "excess elements in initializer"+                      (dd' : rest, []) -> return (rest, [dd'])+                      (_, d : _) -> return (advanceDesigList dds d, ds)+     t' <- tDesignator t ds'+     tInit t' i+     checkInits t dds' is++advanceDesigList :: [CDesignator] -> CDesignator -> [CDesignator]+advanceDesigList ds d = drop 1 $ dropWhile (not . matchDesignator d) ds++matchDesignator :: CDesignator -> CDesignator -> Bool+matchDesignator (CMemberDesig m1 _) (CMemberDesig m2 _) = m1 == m2+matchDesignator _ _ = True -- XXX: for now, array ranges aren't checked++tDesignator :: MonadTrav m => Type -> [CDesignator] -> m Type+-- XXX: check that initializers are within array size+tDesignator (ArrayType bt _ _ _) (CArrDesig e ni : ds) =+  do tExpr [] RValue e >>= checkIntegral' ni+     tDesignator bt ds+tDesignator (ArrayType bt _ _ _) (CRangeDesig e1 e2 ni : ds) =+  do tExpr [] RValue e1 >>= checkIntegral' ni+     tExpr [] RValue e2 >>= checkIntegral' ni+     tDesignator bt ds+tDesignator (ArrayType _ _ _ _) (d : ds) =+  typeError (nodeInfo d) "member designator in array initializer"+tDesignator t@(DirectType (TyComp _) _ _) (CMemberDesig m ni : ds) =+  do mt <- fieldType ni m t+     tDesignator (canonicalType mt) ds+tDesignator t@(DirectType (TyComp _) _ _) (d : _) =+  typeError (nodeInfo d) "array designator in compound initializer"+tDesignator t [] = return t++tInit :: MonadTrav m => Type -> CInit -> m Initializer+tInit t i@(CInitExpr e ni) =+  do it <- tExpr [] RValue e+     assignCompatible' ni CAssignOp t it+     return i+tInit t i@(CInitList initList ni) =+  tInitList ni (canonicalType t) initList >> return i++complexBaseType :: MonadTrav m => NodeInfo -> [StmtCtx] -> ExprSide -> CExpr -> m Type+complexBaseType ni c side e =+  do t <- tExpr c side e+     case canonicalType t of+       DirectType (TyComplex ft) quals attrs ->+         return $ DirectType (TyFloating ft) quals attrs+       _ -> typeError ni $ "expected complex type, got: " ++ pType t+++-- | Return the type of a builtin.+builtinType :: MonadTrav m => CBuiltin -> m Type+builtinType (CBuiltinVaArg _ d _)           = analyseTypeDecl d+builtinType (CBuiltinOffsetOf _ _ _)        = return size_tType+builtinType (CBuiltinTypesCompatible _ _ _) = return boolType  -- return @Just declspecs@ without @CTypedef@ if the declaration specifier contain @typedef@ hasTypeDef :: [CDeclSpec] -> Maybe [CDeclSpec]
+ src/Language/C/Analysis/AstAnalysis.hs-boot view
@@ -0,0 +1,13 @@+module Language.C.Analysis.AstAnalysis where++import Language.C.Analysis.SemRep+import Language.C.Analysis.TravMonad+import Language.C.Syntax.AST++data StmtCtx = FunCtx VarDecl+             | LoopCtx+             | SwitchCtx++data ExprSide = LValue | RValue++tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type
+ src/Language/C/Analysis/Builtins.hs view
@@ -0,0 +1,217 @@+module Language.C.Analysis.Builtins (builtins) where++import Language.C.Data.Ident+import Language.C.Data.Node+import Language.C.Analysis.DefTable+import Language.C.Analysis.SemRep+import Language.C.Analysis.TypeUtils++builtins :: DefTable+builtins = foldr doIdent (foldr doTypeDef emptyDefTable typedefs) idents+  where doTypeDef d = snd . defineTypeDef (identOfTypeDef d) d+        doIdent   d = snd . defineGlobalIdent (declIdent d) d+        dName     s = VarName (builtinIdent s) Nothing+        param ty    = ParamDecl (VarDecl+                                 NoName+                                 (DeclAttrs False (Auto False) [])+                                 ty) undefNode+        fnAttrs     = DeclAttrs False (FunLinkage ExternalLinkage) []+        varAttrs    = DeclAttrs False (Static InternalLinkage False) []+        fnType r as = FunctionType (FunType r (map param as) False) noAttributes+        fnType' r as = FunctionType (FunType r (map param as) True) noAttributes+        func n r as = Declaration+                      (Decl+                       (VarDecl (dName n) fnAttrs (fnType r as))+                       undefNode)+        func' n r as = Declaration+                       (Decl+                        (VarDecl (dName n) fnAttrs (fnType' r as))+                        undefNode)+        var n t     = Declaration+                      (Decl (VarDecl (dName n) varAttrs t) undefNode)+        typedef n t = TypeDef (builtinIdent n) t [] undefNode+        typedefs    = [ typedef "__builtin_va_list"+                                valistType+                      ]+        idents      = [ func "__builtin_expect"+                             (integral TyLong)+                             [integral TyLong, integral TyLong]+                      , func "__builtin_fabs"+                             (floating TyDouble)+                             [floating TyDouble]+                      , func "__builtin_fabsf"+                             (floating TyFloat)+                             [floating TyFloat]+                      , func "__builtin_fabsl"+                             (floating TyLDouble)+                             [floating TyLDouble]+                      , func "__builtin_inf" (floating TyDouble) []+                      , func "__builtin_inff" (floating TyFloat) []+                      , func "__builtin_infl" (floating TyLDouble) []+                      , func "__builtin_huge_val" (floating TyDouble) []+                      , func "__builtin_huge_valf" (floating TyFloat) []+                      , func "__builtin_huge_vall" (floating TyLDouble) []+                      , func "__builtin_copysign"+                             (floating TyDouble)+                             [ floating TyDouble, floating TyDouble ]+                      , func "__builtin_va_start"+                             voidType+                             [ valistType , voidPtr ]+                      , func "__builtin_va_end"+                             voidType+                             [valistType]+                      , func "__builtin_va_copy"+                             voidType+                             [ valistType, valistType ]+                      , func "__builtin_va_arg_pack" (integral TyInt) []+                      , func "__builtin_va_arg_pack_len" (integral TyInt) []+                      , func "__builtin_alloca"+                             voidPtr+                             [ size_tType ]+                      , func "__builtin_memcpy"+                             voidPtr+                             [ voidPtr+                             , constVoidPtr+                             , size_tType+                             ]+                      , func "__builtin_strspn"+                             size_tType+                             [ constCharPtr, constCharPtr ]+                      , func "__builtin_strcspn"+                             size_tType+                             [ constCharPtr, constCharPtr ]+                      , func "__builtin_strchr"+                             charPtr+                             [ constCharPtr, integral TyInt]+                      , func "__builtin_strncpy"+                             charPtr+                             [ constCharPtr -- XXX: restrict+                             , constCharPtr -- XXX: restrict+                             , size_tType+                             ]+                      , func "__builtin_strncat"+                             charPtr+                             [ constCharPtr -- XXX: restrict+                             , constCharPtr -- XXX: restrict+                             , size_tType+                             ]+                      , func "__builtin_strcmp"+                             (integral TyInt)+                             [ constCharPtr, constCharPtr ]+                      , func "__builtin_strpbrk"+                             charPtr+                             [ constCharPtr, constCharPtr ]+                      , func "__builtin_bzero"+                             voidType+                             [ voidPtr, size_tType ]+                      , func "__builtin_clz"+                             (integral TyInt)+                             [ integral TyUInt ]+                      , func "__builtin_constant_p"+                             (integral TyInt)+                             [DirectType (TyBuiltin TyAny) noTypeQuals noAttributes]+                      -- XXX: I don't know if the following has the+                      -- correct type. It doesn't seem to be+                      -- documented.+                      , func "__builtin_extract_return_addr"+                             voidPtr+                             [ voidPtr ]+                      , func "__builtin_return_address"+                             voidPtr+                             [ integral TyUInt ]+                      , func "__builtin_frame_address"+                             voidPtr+                             [ integral TyUInt ]+                      , func "__builtin_expect"+                             (integral TyLong)+                             [ integral TyLong, integral TyLong ]+                      , func "__builtin_prefetch"+                             voidType+                             [ constVoidPtr ]+                      , var "__func__"+                            stringType+                      , var "__PRETTY_FUNCTION__"+                            stringType+                      , var "__FUNCTION__"+                            stringType+                      -- Builtin GCC error checking functions+                      , func "__builtin_object_size"+                             size_tType+                             [ voidPtr, integral TyInt ]+                      , func "__builtin___memcpy_chk"+                             voidPtr+                             [ voidPtr, constVoidPtr, size_tType, size_tType ]+                      , func "__builtin___mempcpy_chk"+                             voidPtr+                             [ voidPtr, constVoidPtr, size_tType, size_tType ]+                      , func "__builtin___memmove_chk"+                             voidPtr+                             [ voidPtr, constVoidPtr, size_tType, size_tType ]+                      , func "__builtin___memset_chk"+                             voidPtr+                             [ voidPtr, integral TyInt, size_tType, size_tType ]+                      , func "__builtin___strcpy_chk"+                             charPtr+                             [ constCharPtr -- XXX: restrict+                             , constCharPtr -- XXX: restrict+                             , size_tType+                             ]+                      , func "__builtin___stpcpy_chk"+                             charPtr+                             [ constCharPtr -- XXX: restrict+                             , constCharPtr -- XXX: restrict+                             , size_tType+                             ]+                      , func "__builtin___strncpy_chk"+                             charPtr+                             [ constCharPtr -- XXX: restrict+                             , constCharPtr -- XXX: restrict+                             , size_tType+                             , size_tType+                             ]+                      , func "__builtin___strcat_chk"+                             charPtr+                             [ constCharPtr -- XXX: restrict+                             , constCharPtr -- XXX: restrict+                             , size_tType+                             ]+                      , func "__builtin___strncat_chk"+                             charPtr+                             [ constCharPtr -- XXX: restrict+                             , constCharPtr -- XXX: restrict+                             , size_tType+                             , size_tType+                             ]+                      , func' "__builtin___sprintf_chk"+                             (integral TyInt)+                             [ charPtr+                             , integral TyInt+                             , size_tType+                             , constCharPtr+                             ]+                      , func' "__builtin___snprintf_chk"+                             (integral TyInt)+                             [ charPtr+                             , size_tType+                             , integral TyInt+                             , size_tType+                             , constCharPtr+                             ]+                      , func "__builtin___vsprintf_chk"+                             (integral TyInt)+                             [ charPtr+                             , integral TyInt+                             , size_tType+                             , constCharPtr+                             , valistType+                             ]+                      , func "__builtin___vsnprintf_chk"+                             (integral TyInt)+                             [ charPtr+                             , size_tType+                             , integral TyInt+                             , size_tType+                             , constCharPtr+                             , valistType+                             ]+                      ]
+ src/Language/C/Analysis/ConstEval.hs view
@@ -0,0 +1,211 @@+{-# LANGUAGE RelaxedPolyRec #-}+module Language.C.Analysis.ConstEval where++import Control.Monad+import Data.Bits+import Data.Maybe+import qualified Data.Map as Map+import Language.C.Syntax.AST+import Language.C.Syntax.Constants+import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..))+import Language.C.Analysis.Debug+import Language.C.Analysis.DeclAnalysis+import Language.C.Analysis.DefTable+import Language.C.Data+import Language.C.Pretty+import Language.C.Analysis.SemRep+import Language.C.Analysis.TravMonad+import Language.C.Analysis.TypeUtils+import Text.PrettyPrint.HughesPJ++data MachineDesc =+  MachineDesc+  { iSize        :: IntType -> Integer+  , fSize        :: FloatType -> Integer+  , builtinSize  :: BuiltinType -> Integer+  , ptrSize      :: Integer+  , voidSize     :: Integer+  , iAlign       :: IntType -> Integer+  , fAlign       :: FloatType -> Integer+  , builtinAlign :: BuiltinType -> Integer+  , ptrAlign     :: Integer+  , voidAlign    :: Integer+  }++intExpr :: (Pos n, MonadName m) => n -> Integer -> m CExpr+intExpr n i =+  genName >>= \name ->+    return $ CConst $ CIntConst (cInteger i) (mkNodeInfo (posOf n) name)++sizeofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer+sizeofType md _ (DirectType TyVoid _ _) = return $ voidSize md+sizeofType md _ (DirectType (TyIntegral it) _ _) = return $ iSize md it+sizeofType md _ (DirectType (TyFloating ft) _ _) = return $ fSize md ft+sizeofType md _ (DirectType (TyComplex ft) _ _) = return $ 2 * fSize md ft+sizeofType md _ (DirectType (TyComp ctr) _ _) = compSize md ctr+sizeofType md _ (DirectType (TyEnum _) _ _) = return $ iSize md TyInt+sizeofType md _ (DirectType (TyBuiltin b) _ _) = return $ builtinSize md b+sizeofType md _ (PtrType _ _ _)  = return $ ptrSize md+sizeofType md n (ArrayType bt (UnknownArraySize _) _ _) = return $ ptrSize md+sizeofType md n (ArrayType bt (ArraySize _ sz) _ _) =+  do sz' <- constEval md Map.empty sz+     case sz' of+       CConst (CIntConst i _) ->+         do s <- sizeofType md n bt+            return $ getCInteger i * s+       _ -> return $ ptrSize md+            {-+            astError (nodeInfo sz) $+            "array size is not a constant: " ++ (render . pretty) sz+            -}+sizeofType md n (TypeDefType (TypeDefRef _ (Just t) _) _ _) = sizeofType md n t+sizeofType md _ (FunctionType _ _) = return $ ptrSize md+sizeofType _ n t = astError (nodeInfo n) $+                 "can't find size of type: " ++ (render . pretty) t++alignofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer+alignofType md _ (DirectType TyVoid _ _) = return $ voidAlign md+alignofType md _ (DirectType (TyIntegral it) _ _) = return $ iAlign md it+alignofType md _ (DirectType (TyFloating ft) _ _) = return $ fAlign md ft+alignofType md _ (DirectType (TyComplex ft) _ _) = return $ fAlign md ft+alignofType md _ (DirectType (TyEnum _) _ _) = return $ iAlign md TyInt+alignofType md _ (DirectType (TyBuiltin b) _ _) = return $ builtinAlign md b+alignofType md _ (PtrType _ _ _)  = return $ ptrAlign md+alignofType md n (ArrayType bt (UnknownArraySize _) _ _) = return $ ptrAlign md+alignofType md n (ArrayType bt (ArraySize _ sz) _ _) = alignofType md n bt+alignofType md n (TypeDefType (TypeDefRef _ (Just t) _) _ _) = alignofType md n t+alignofType _ n t = astError (nodeInfo n) $+                 "can't find alignment of type: " ++ (render . pretty) t++compSize :: MonadTrav m => MachineDesc -> CompTypeRef -> m Integer+compSize md ctr =+  do dt <- getDefTable+     case lookupTag (sueRef ctr) dt of+       Just (Left _)   -> astError (nodeInfo ctr)+                          "composite declared but not defined"+       Just (Right (CompDef (CompType _ tag ms _ ni))) ->+         do let ts = map declType ms+            sizes <- mapM (sizeofType md ni) ts+            -- XXX: handle padding+            case tag of+              StructTag -> return $ sum sizes+              UnionTag  -> return $ maximum sizes+       Just (Right (EnumDef _)) -> return $ iSize md TyInt+       Nothing         -> astError (nodeInfo ctr) "unknown composite"+++{- Expression evaluation -}++-- Use the withWordBytes function to wrap the results around to the+-- correct word size+intOp :: CBinaryOp -> Integer -> Integer -> Integer+intOp CAddOp i1 i2 = i1 + i2+intOp CSubOp i1 i2 = i1 - i2+intOp CMulOp i1 i2 = i1 * i2+intOp CDivOp i1 i2 = i1 `div` i2+intOp CRmdOp i1 i2 = i1 `mod` i2+intOp CShlOp i1 i2 = i1 `shiftL` fromInteger i2+intOp CShrOp i1 i2 = i1 `shiftR` fromInteger i2+intOp CLeOp  i1 i2 = toInteger $ fromEnum $ i1 < i2+intOp CGrOp  i1 i2 = toInteger $ fromEnum $ i1 > i2+intOp CLeqOp i1 i2 = toInteger $ fromEnum $ i1 <= i2+intOp CGeqOp i1 i2 = toInteger $ fromEnum $ i1 >= i2+intOp CEqOp  i1 i2 = toInteger $ fromEnum $ i1 == i2+intOp CNeqOp i1 i2 = toInteger $ fromEnum $ i1 /= i2+intOp CAndOp i1 i2 = i1 .&. i2+intOp CXorOp i1 i2 = i1 `xor` i2+intOp COrOp  i1 i2 = i1 .|. i2+intOp CLndOp i1 i2 = toInteger $ fromEnum $ (i1 /= 0) && (i2 /= 0)+intOp CLorOp i1 i2 = toInteger $ fromEnum $ (i1 /= 0) || (i2 /= 0)++-- Use the withWordBytes function to wrap the results around to the+-- correct word size+intUnOp :: CUnaryOp -> Integer -> Maybe Integer+intUnOp CPlusOp i = Just i+intUnOp CMinOp  i = Just $ -i+intUnOp CCompOp i = Just $ complement i+intUnOp CNegOp  i = Just $ toInteger $ fromEnum $ i == 0+intUnOp _       _ = Nothing++withWordBytes :: Int -> Integer -> Integer+withWordBytes bytes n = n `rem` (1 `shiftL` (bytes `shiftL` 3))++boolValue :: CExpr -> Maybe Bool+boolValue (CConst (CIntConst i _))  = Just $ getCInteger i /= 0+boolValue (CConst (CCharConst c _)) = Just $ getCCharAsInt c /= 0+boolValue (CConst (CStrConst _ _))  = Just True+boolValue _                         = Nothing++intValue :: CExpr -> Maybe Integer+intValue (CConst (CIntConst i _))  = Just $ getCInteger i+intValue (CConst (CCharConst c _)) = Just $ getCCharAsInt c+intValue _                         = Nothing++constEval :: (MonadTrav m) =>+             MachineDesc -> Map.Map Ident CExpr -> CExpr -> m CExpr+constEval md env (CCond e1 me2 e3 ni) =+  do e1'  <- constEval md env e1+     me2' <- maybe (return Nothing) (\e -> Just `liftM` constEval md env e) me2+     e3'  <- constEval md env e3+     case boolValue e1' of+       Just True  -> return $ fromMaybe e1' me2'+       Just False -> return e3'+       Nothing    -> return $ CCond e1' me2' e3' ni+constEval md env e@(CBinary op e1 e2 ni) =+  do e1' <- constEval md env e1+     e2' <- constEval md env e2+     t <- tExpr [] RValue e+     bytes <- fromIntegral `liftM` sizeofType md e t+     case (intValue e1', intValue e2') of+       (Just i1, Just i2) -> intExpr ni (withWordBytes bytes (intOp op i1 i2))+       (_, _)             -> return $ CBinary op e1' e2' ni+constEval md env (CUnary op e ni) =+  do e' <- constEval md env e+     t <- tExpr [] RValue e+     bytes <- fromIntegral `liftM` sizeofType md e t+     case intValue e' of+       Just i  -> case intUnOp op i of+                    Just i' -> intExpr ni (withWordBytes bytes i')+                    Nothing -> astError ni+                               "invalid unary operator applied to constant"+       Nothing -> return $ CUnary op e' ni+constEval md env (CCast d e ni) =+  do e' <- constEval md env e+     t <- analyseTypeDecl d+     bytes <- fromIntegral `liftM` sizeofType md d t+     case intValue e' of+       Just i -> intExpr ni (withWordBytes bytes i)+       Nothing -> return $ CCast d e' ni+constEval md _ (CSizeofExpr e ni) =+  do t <- tExpr [] RValue e+     sz <- sizeofType md e t+     intExpr ni sz+constEval md _ (CSizeofType d ni) =+  do t <- analyseTypeDecl d+     sz <- sizeofType md d t+     intExpr ni sz+constEval md _ (CAlignofExpr e ni) =+  do t <- tExpr [] RValue e+     sz <- alignofType md e t+     intExpr ni sz+constEval md _ (CAlignofType d ni) =+  do t <- analyseTypeDecl d+     sz <- alignofType md d t+     intExpr ni sz+constEval md env e@(CVar i _) | Map.member i env =+  return $ fromMaybe e $ Map.lookup i env+constEval md env e@(CVar i _) =+  do t <- tExpr [] RValue e+     case derefTypeDef t of+       DirectType (TyEnum etr) _ _ ->+         do dt <- getDefTable+            case lookupTag (sueRef etr) dt of+              Just (Right (EnumDef (EnumType _ es _ _))) ->+                do env' <- foldM enumConst env es+                   return $ fromMaybe e $ Map.lookup i env'+              _ -> return e+       _ -> return e+  where enumConst env' (Enumerator n e' _ _) =+          do c <- constEval md env' e'+             return $ Map.insert n c env'+constEval _ _ e = return e
src/Language/C/Analysis/Debug.hs view
@@ -20,6 +20,8 @@ where import Language.C.Analysis.SemRep import Language.C.Analysis.Export+import Language.C.Analysis.DefTable+import Language.C.Analysis.NameSpaceMap  import Language.C.Data import Language.C.Pretty@@ -36,6 +38,16 @@     where     prettyEntry (k,v) = prettyKey k <+> text " ~> " <+> prettyVal v +instance Pretty DefTable where+    pretty dt = text "DefTable" $$ (nest 4 $ vcat defMaps)+        where+        defMaps = [ prettyNSMap "idents" identDecls+                  , prettyNSMap "tags" tagDecls+                  , prettyNSMap "labels" labelDefs+                  , prettyNSMap "members" memberDecls+                  ]+        prettyNSMap label f = prettyAssocs label . nsMapToList $ f dt+ instance Pretty GlobalDecls where     pretty gd = text "Global Declarations" $$ (nest 4 $ vcat declMaps)         where@@ -62,11 +74,18 @@     filterFile :: (CNode n) => n -> Bool     filterFile = file_filter . posFile . posOfNode . nodeInfo --instance Pretty (Either VarDecl ObjDef) where-    pretty = either pretty pretty-instance Pretty (Either VarDecl FunDef) where+instance (Pretty a, Pretty b) => Pretty (Either a b) where     pretty = either pretty pretty+instance Pretty TagFwdDecl where+    pretty (CompDecl ct) = pretty ct+    pretty (EnumDecl et) = pretty et+instance Pretty CompTyKind where+    pretty StructTag = text "struct"+    pretty UnionTag = text "union"+instance Pretty CompTypeRef where+    pretty (CompTypeRef sue kind _) = pretty kind <+> pretty sue+instance Pretty EnumTypeRef where+    pretty (EnumTypeRef sue _ ) = text "enum" <+> pretty sue instance Pretty Ident where     pretty = text . identToString instance Pretty SUERef where@@ -101,6 +120,9 @@ instance Pretty ParamDecl where     pretty (ParamDecl (VarDecl name declattrs ty) _) =         pretty declattrs <+> pretty name <+> text "::" <+> pretty ty+    pretty (AbstractParamDecl (VarDecl name declattrs ty) _) =+        text "abstract" <+> pretty declattrs <+> pretty name <+>+             text "::" <+> pretty ty instance Pretty DeclAttrs where     pretty (DeclAttrs inline storage attrs) =         (if inline then (text "inline") else empty) <+>@@ -144,6 +166,7 @@ instance Pretty Linkage where     pretty InternalLinkage = text "internal"     pretty ExternalLinkage = text "external"+    pretty NoLinkage       = text "local" instance Pretty VarName where     pretty NoName = text "<anonymous>"     pretty (VarName ident asmname_opt) = pretty ident <+> (maybe empty pAsmName asmname_opt)
src/Language/C/Analysis/DeclAnalysis.hs view
@@ -18,10 +18,10 @@   mergeOldStyle,   -- * Dissecting type specs   canonicalTypeSpec, NumBaseType(..),SignSpec(..),SizeMod(..),NumTypeSpec(..),TypeSpecAnalysis(..),-  canonicalStorageSpec, StorageSpec(..),hasThreadLocalSpec,+  canonicalStorageSpec, StorageSpec(..),hasThreadLocalSpec, isTypeDef,   -- * Helpers   VarDeclInfo(..),-  tAttr,mkVarName,getOnlyDeclr,nameOfDecl,+  tAttr,mkVarName,getOnlyDeclr,nameOfDecl,analyseVarDecl,analyseVarDecl' ) where import Language.C.Data.Error@@ -29,7 +29,9 @@ import Language.C.Data.Ident import Language.C.Pretty import Language.C.Syntax-import Language.C.Analysis.DefTable (TagFwdDecl(..))+import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..))+import Language.C.Analysis.DefTable (TagFwdDecl(..), insertType, lookupType)+import Language.C.Analysis.Export import Language.C.Analysis.SemError import Language.C.Analysis.SemRep import Language.C.Analysis.TravMonad@@ -51,12 +53,12 @@ tParamDecl (CDecl declspecs declrs node) =   do declr <- getParamDeclr      -- analyse the variable declaration-     (VarDeclInfo name is_inline storage_spec attrs ty declr_node) <- analyseVarDecl True declspecs declr [] Nothing+     (VarDeclInfo name is_inline storage_spec attrs ty declr_node) <- analyseVarDecl' True declspecs declr [] Nothing      when (is_inline) $ throwTravError (badSpecifierError node "parameter declaration with inline specifier")      -- compute storage of parameter (NoStorage, but might have a register specifier)      storage <- throwOnLeft $ computeParamStorage node storage_spec      let paramDecl = mkParamDecl name storage attrs ty declr_node-     handleParamDecl paramDecl+     -- XXX: we shouldn't modify the deftable here, just analyse and build representation      return $ paramDecl   where   getParamDeclr =@@ -69,6 +71,7 @@     case name of       NoName -> AbstractParamDecl vd declr_node       _ -> ParamDecl vd declr_node+ -- | a parameter declaration has no linkage and either auto or register storage computeParamStorage :: NodeInfo -> StorageSpec -> Either BadSpecifierError Storage computeParamStorage _ NoStorageSpec = Right (Auto False)@@ -77,10 +80,26 @@  -- | analyse and translate a member declaration tMemberDecls :: (MonadTrav m) => CDecl -> m [MemberDecl]+-- Anonymous struct or union members+tMemberDecls (CDecl declspecs [] node) =+  do let (storage_specs, _attrs, typequals, typespecs, is_inline) =+           partitionDeclSpecs declspecs+     when is_inline $ astError node "member declaration with inline specifier"+     canonTySpecs <- canonicalTypeSpec typespecs+     ty <- tType True node typequals canonTySpecs [] []+     case ty of+       DirectType (TyComp _) _ _ ->+         return $ [MemberDecl+                   -- XXX: are these DeclAttrs correct?+                   (VarDecl NoName (DeclAttrs False NoStorage []) ty)+                   Nothing node]+       _ -> astError node "anonymous member has a non-composite type"+-- Named members tMemberDecls (CDecl declspecs declrs node) = mapM (uncurry tMemberDecl) (zip (True:repeat False) declrs)     where     tMemberDecl handle_sue_def (Just member_declr,Nothing,bit_field_size_opt) =-        do var_decl <- analyseVarDecl handle_sue_def declspecs member_declr [] Nothing+        -- TODO: use analyseVarDecl here, not analyseVarDecl'+        do var_decl <- analyseVarDecl' handle_sue_def declspecs member_declr [] Nothing            let (VarDeclInfo name is_inline storage_spec attrs ty declr_node) = var_decl            --            checkValidMemberSpec is_inline storage_spec@@ -88,7 +107,8 @@     tMemberDecl handle_sue_def (Nothing,Nothing,Just bit_field_size) =         do let (storage_specs, _attrs, typequals, typespecs, is_inline) = partitionDeclSpecs declspecs            storage_spec  <- canonicalStorageSpec storage_specs-           typ           <- tType handle_sue_def node typequals typespecs [] []+           canonTySpecs  <- canonicalTypeSpec typespecs+           typ           <- tType handle_sue_def node typequals canonTySpecs [] []            --            return $ AnonBitField typ bit_field_size node     tMemberDecl _ _ = astError node "Bad member declaration"@@ -108,16 +128,28 @@  data VarDeclInfo = VarDeclInfo VarName Bool {- is-inline? -} StorageSpec Attributes Type NodeInfo +analyseVarDecl' :: (MonadTrav m) =>+                  Bool -> [CDeclSpec] ->+                  CDeclr -> [CDecl] -> (Maybe CInit) -> m VarDeclInfo+analyseVarDecl' handle_sue_def declspecs declr oldstyle init_opt =+  do let (storage_specs, attrs, type_quals, type_specs, inline) =+           partitionDeclSpecs declspecs+     canonTySpecs <- canonicalTypeSpec type_specs+     analyseVarDecl handle_sue_def storage_specs attrs type_quals canonTySpecs inline+                    declr oldstyle init_opt+ -- | analyse declarators-analyseVarDecl :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> (Maybe CInit) -> m VarDeclInfo-analyseVarDecl handle_sue_def declspecs+analyseVarDecl :: (MonadTrav m) =>+                  Bool -> [CStorageSpec] -> [CAttr] -> [CTypeQual] ->+                  TypeSpecAnalysis -> Bool ->+                  CDeclr -> [CDecl] -> (Maybe CInit) -> m VarDeclInfo+analyseVarDecl handle_sue_def storage_specs decl_attrs typequals canonTySpecs inline                (CDeclr name_opt derived_declrs asmname_opt declr_attrs node)                oldstyle_params init_opt-    = do let (storage_specs, decl_attrs, typequals, typespecs, inline) = partitionDeclSpecs declspecs-         -- analyse the storage specifiers+    = do -- analyse the storage specifiers          storage_spec  <- canonicalStorageSpec storage_specs          -- translate the type into semantic representation-         typ          <- tType handle_sue_def node typequals typespecs derived_declrs oldstyle_params+         typ          <- tType handle_sue_def node typequals canonTySpecs derived_declrs oldstyle_params          -- translate attributes          attrs'       <- mapM tAttr (decl_attrs ++ declr_attrs)          -- make name@@ -132,7 +164,6 @@ isTypeDef :: [CDeclSpec] -> Bool isTypeDef declspecs = not $ null [ n | (CStorageSpec (CTypedef n)) <- declspecs ] - -- * translation  -- | get the type of a /type declaration/@@ -156,25 +187,34 @@     where     analyseTyDeclr (CDeclr Nothing derived_declrs Nothing attrs _declrnode)         | (not (null storagespec) || inline) = astError node "storage specifier for type declaration"-        | otherwise                          = tType True node (map CAttrQual (attrs++attrs_decl) ++ typequals)-                                                     typespecs derived_declrs []+        | otherwise                          =+          do canonTySpecs <- canonicalTypeSpec typespecs+             t <- tType True node (map CAttrQual (attrs++attrs_decl) ++ typequals)+                   canonTySpecs derived_declrs []+             case nameOfNode node of+               Just n -> withDefTable (\dt -> (t, insertType dt n t))+               Nothing -> return t         where         (storagespec, attrs_decl, typequals, typespecs, inline) = partitionDeclSpecs declspecs     analyseTyDeclr _ = astError node "Non-abstract declarator in type declaration"   -- | translate a type-tType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> [CDerivedDeclr] -> [CDecl] -> m Type-tType handle_sue_def top_node typequals typespecs derived_declrs oldstyle_params+tType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> [CDerivedDeclr] -> [CDecl] -> m Type+tType handle_sue_def top_node typequals canonTySpecs derived_declrs oldstyle_params     = mergeOldStyle top_node oldstyle_params derived_declrs >>= buildType     where-    buildType [] = tDirectType handle_sue_def top_node typequals typespecs+    buildType [] =+        tDirectType handle_sue_def top_node typequals canonTySpecs     buildType (CPtrDeclr ptrquals node : dds) =         buildType dds >>= buildPointerType ptrquals node     buildType (CArrDeclr arrquals size node : dds)         = buildType dds >>= buildArrayType arrquals size node-    buildType (CFunDeclr ~(Right (params, isVariadic)) attrs node : dds)-        = buildType dds >>= (liftM FunctionType . buildFunctionType params isVariadic attrs node)+    buildType (CFunDeclr (Right (params, isVariadic)) attrs node : dds)+        = buildType dds >>= (liftM  (uncurry FunctionType) . buildFunctionType params isVariadic attrs node)+    buildType (CFunDeclr (Left _) _ _ : _)+        -- /FIXME/: this is really an internal error, not an AST error.+        = astError top_node "old-style parameters remaining after mergeOldStyle"     buildPointerType ptrquals _node inner_ty         = liftM (\(quals,attrs) -> PtrType inner_ty quals attrs) (tTypeQuals ptrquals)     buildArrayType arr_quals size _node inner_ty@@ -187,19 +227,20 @@         = do enterPrototypeScope              params' <- mapM tParamDecl params              leavePrototypeScope-             attrs'   <- mapM tAttr attrs-             return $ case (map declType params',is_variadic) of-               ([],False) -> FunTypeIncomplete return_ty attrs'  -- may be improved later on-               ([DirectType TyVoid _],False) -> FunType return_ty [] False attrs'-               _ -> FunType return_ty params' is_variadic attrs'+             attrs'  <- mapM tAttr attrs+             return $ (\t -> (t,attrs')) $+                case (map declType params',is_variadic) of+                    ([],False) -> FunTypeIncomplete return_ty  -- may be improved later on+                    ([DirectType TyVoid _ _],False) -> FunType return_ty [] False+                    _ -> FunType return_ty params' is_variadic  -- | translate a type without (syntactic) indirections -- Due to the GNU @typeof@ extension and typeDefs, this can be an arbitrary type-tDirectType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> m Type-tDirectType handle_sue_def node ty_quals ty_specs = do+tDirectType :: (MonadTrav m) =>+               Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> m Type+tDirectType handle_sue_def node ty_quals canonTySpec = do     (quals,attrs) <- tTypeQuals ty_quals-    canonTySpec <- canonicalTypeSpec ty_specs-    let baseType ty_name = DirectType ty_name quals+    let baseType ty_name = DirectType ty_name quals attrs     case canonTySpec of         TSNone -> return$ baseType (TyIntegral TyInt)         TSVoid -> return$ baseType TyVoid@@ -211,12 +252,10 @@                     Left (floatType,iscomplex) | iscomplex -> TyComplex floatType                                                | otherwise -> TyFloating floatType                     Right intType  -> TyIntegral intType+        TSTypeDef tdr -> return$ TypeDefType tdr quals attrs         TSNonBasic (CSUType su _tnode)      -> liftM (baseType . TyComp) $ tCompTypeDecl handle_sue_def su         TSNonBasic (CEnumType enum _tnode)   -> liftM (baseType . TyEnum) $ tEnumTypeDecl handle_sue_def enum-        TSNonBasic (CTypeDef name t_node)    -> liftM TypeDefType $ typeDefRef t_node name-        -- TODO: analyse type of expression-        TSNonBasic (CTypeOfExpr expr _tnode) -> return $ TypeOfExpr expr-        TSNonBasic (CTypeOfType decl t_node) ->  analyseTypeDecl decl >>= mergeTypeAttributes t_node quals attrs+        TSType t                             ->  mergeTypeAttributes node quals attrs t         TSNonBasic _ -> astError node "Unexpected typespec"  -- | Merge type attributes@@ -225,21 +264,24 @@ -- -- > /* tyqual attr typeof(type) */ -- > const typeof(char volatile) x;-mergeTypeAttributes :: (MonadTrav m) => NodeInfo -> TypeQuals -> [Attr] -> Type -> m Type+mergeTypeAttributes :: (MonadCError m) => NodeInfo -> TypeQuals -> [Attr] -> Type -> m Type mergeTypeAttributes node_info quals attrs typ =     case typ of-        DirectType ty_name quals' -> merge quals' [] $ mkDirect ty_name+        DirectType ty_name quals' attrs' -> merge quals' attrs' $ mkDirect ty_name         PtrType ty quals' attrs'  -> merge quals' attrs' $ PtrType ty         ArrayType ty array_sz quals' attrs' -> merge quals' attrs' $ ArrayType ty array_sz-        FunctionType (FunType return_ty params inline attrs')-            | not (null attrs) -> astError node_info "type qualifiers for function type"-            | otherwise        -> return$ FunctionType (FunType return_ty params inline (attrs' ++ attrs))+        FunctionType (FunType return_ty params inline) attrs'+-- /FIXME/: This needs review, but checking (null attrs) seems strange here+--            | not (null attrs) -> astError node_info "type qualifiers for function type"+--           | otherwise        -> return$ FunctionType (FunType return_ty params inline (attrs' ++ attrs))+            -> return$ FunctionType (FunType return_ty params inline)  (attrs' ++ attrs)+        TypeDefType tdr quals' attrs'+            -> merge quals' attrs' $ TypeDefType tdr     where-    mkDirect ty_name quals' attrs' | null attrs' = DirectType ty_name quals'-                                   | otherwise   = error "_attribute__ s for DirectType"+    mkDirect ty_name quals' attrs' = DirectType ty_name quals' attrs'     merge quals' attrs' tyf = return $ tyf (mergeTypeQuals quals quals') (attrs' ++ attrs) -typeDefRef :: (MonadTrav m) => NodeInfo -> Ident -> m TypeDefRef+typeDefRef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> m TypeDefRef typeDefRef t_node name = lookupTypeDef name >>= \ty -> return (TypeDefRef name (Just ty) t_node)  -- extract a struct\/union@@ -293,7 +335,8 @@              return decl  -- | translate and analyse an enumeration type-tEnumType :: (MonadTrav m) => SUERef -> [(Ident, Maybe CExpr)] -> Attributes -> NodeInfo -> m EnumType+tEnumType :: (MonadCError m, MonadSymtab m) =>+             SUERef -> [(Ident, Maybe CExpr)] -> Attributes -> NodeInfo -> m EnumType tEnumType sue_ref enumerators attrs node = do     mapM_ handleEnumeratorDef enumerators'     return ty@@ -307,11 +350,11 @@     nextEnrExpr (Left i) Nothing = (Left (succ i), intExpr i)     nextEnrExpr (Right (e,offs)) Nothing = (Right (e, succ offs), offsExpr e offs)     nextEnrExpr _ (Just e) = (Right (e,1), e)-    intExpr i = CConst (CIntConst (cInteger i) internalNode)-    offsExpr e offs = CBinary CAddOp e (intExpr offs) internalNode+    intExpr i = CConst (CIntConst (cInteger i) undefNode)+    offsExpr e offs = CBinary CAddOp e (intExpr offs) undefNode  -- | Mapping from num type specs to C types (C99 6.7.2-2), ignoring the complex qualifier.-tNumType :: (MonadTrav m) => NumTypeSpec -> m (Either (FloatType,Bool) IntType)+tNumType :: (MonadCError m) => NumTypeSpec -> m (Either (FloatType,Bool) IntType) tNumType (NumTypeSpec basetype sgn sz iscomplex) =     case (basetype,sgn,sz) of         (BaseChar,_,NoSizeMod)      | Signed <- sgn   -> intType TySChar@@ -372,7 +415,9 @@ data NumTypeSpec = NumTypeSpec { base :: NumBaseType, signSpec :: SignSpec, sizeMod :: SizeMod, isComplex :: Bool  } emptyNumTypeSpec :: NumTypeSpec emptyNumTypeSpec = NumTypeSpec { base = NoBaseType, signSpec = NoSignSpec, sizeMod = NoSizeMod, isComplex = False }-data TypeSpecAnalysis = TSNone | TSVoid | TSBool | TSNum NumTypeSpec | TSNonBasic CTypeSpec+data TypeSpecAnalysis =+  TSNone | TSVoid | TSBool | TSNum NumTypeSpec |+  TSTypeDef TypeDefRef | TSType Type | TSNonBasic CTypeSpec  canonicalTypeSpec :: (MonadTrav m) => [CTypeSpec] -> m TypeSpecAnalysis canonicalTypeSpec = foldrM go TSNone where@@ -382,6 +427,10 @@     updLongMod NoSizeMod = Just LongMod     updLongMod LongMod   = Just LongLongMod     updLongMod _         = Nothing+    getTypeSpecs :: MonadTrav m => Type -> m [CTypeSpec]+    getTypeSpecs         =  return . getTS . partitionDeclSpecs . fst . exportType+    getTS (_, _, _, ts, _) = ts+    go :: (MonadTrav m) => CTypeSpec -> TypeSpecAnalysis -> m TypeSpecAnalysis     go (CVoidType _)    TSNone = return$  TSVoid     go (CBoolType _)    TSNone = return$  TSBool     go (CCharType _)    tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa@@ -403,11 +452,14 @@                             = return$  TSNum$ nts { signSpec = Unsigned }     go (CComplexType _) tsa | (Just nts@(NumTypeSpec { isComplex = False })) <- getNTS tsa                             = return$  TSNum$ nts { isComplex = True }+    go (CTypeDef i ni) TSNone = liftM TSTypeDef $ typeDefRef ni i+    go (CTypeOfType d ni) TSNone = liftM TSType $ analyseTypeDecl d+    go (CTypeOfExpr e _) TSNone = liftM TSType $ tExpr [] RValue e     go otherType  TSNone    = return$  TSNonBasic otherType     go ty _ts = astError (nodeInfo ty) "Invalid type specifier"  -- compute storage given storage specifiers-canonicalStorageSpec :: (MonadTrav m) =>[CStorageSpec] -> m StorageSpec+canonicalStorageSpec :: (MonadCError m) =>[CStorageSpec] -> m StorageSpec canonicalStorageSpec storagespecs = liftM elideAuto $ foldrM updStorage NoStorageSpec storagespecs where         updStorage (CAuto _) NoStorageSpec     = return$ AutoSpec         updStorage (CRegister _) NoStorageSpec = return$ RegSpec@@ -437,7 +489,7 @@ -- > int f(int d, int c, char a, char* b) -- -- TODO: This could be moved to syntax, as it operates on the AST only-mergeOldStyle :: (MonadTrav m) => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr]+mergeOldStyle :: (MonadCError m) => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr] mergeOldStyle _node [] declrs = return declrs mergeOldStyle node oldstyle_params (CFunDeclr params attrs fdnode : dds) =     case params of@@ -472,7 +524,7 @@ -- > [ [d| struct x { int z; } a, struct x *b |] ] -- -- /TODO/: This could be moved to syntax, as it operates on the AST only-splitCDecl :: (MonadTrav m) => CDecl -> m [CDecl]+splitCDecl :: (MonadCError m) => CDecl -> m [CDecl] splitCDecl decl@(CDecl declspecs declrs node) =     case declrs of         []      -> internalErr "splitCDecl applied to empty declaration"@@ -493,24 +545,25 @@  -- | translate @__attribute__@ annotations -- TODO: This is a unwrap and wrap stub-tAttr :: (MonadTrav m) => CAttr -> m Attr+tAttr :: (MonadCError m, MonadSymtab m) => CAttr -> m Attr tAttr (CAttr name cexpr node) = return$ Attr name cexpr node   -- | construct a name for a variable -- TODO: more or less bogus-mkVarName :: (MonadTrav m) => NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName+mkVarName :: (MonadCError m, MonadSymtab m) =>+             NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName mkVarName  node Nothing _ = return NoName-mkVarName  node (Just n) asm = return $ VarName n Nothing+mkVarName  node (Just n) asm = return $ VarName n asm  -- helpers-nameOfDecl :: (MonadTrav m) => CDecl -> m Ident+nameOfDecl :: (MonadCError m) => CDecl -> m Ident nameOfDecl d = getOnlyDeclr d >>= \declr ->     case declr of         (CDeclr (Just name) _ _ _ _) -> return name         (CDeclr Nothing _ _ _ node) -> internalErr "nameOfDecl: abstract declarator" emptyDeclr :: NodeInfo -> CDeclr emptyDeclr node = CDeclr Nothing [] Nothing [] node-getOnlyDeclr :: (MonadTrav m) => CDecl -> m CDeclr+getOnlyDeclr :: (MonadCError m) => CDecl -> m CDeclr getOnlyDeclr (CDecl _ [(Just declr,_,_)] _) = return declr getOnlyDeclr (CDecl _ _ node) = internalErr "getOnlyDeclr: declaration doesn't have a unique declarator"
src/Language/C/Analysis/DefTable.hs view
@@ -22,12 +22,15 @@     DefTable(..),     emptyDefTable,     globalDefs,+    inFileScope,     enterFunctionScope,leaveFunctionScope,enterBlockScope,leaveBlockScope,     enterMemberDecl,leaveMemberDecl,     DeclarationStatus(..),declStatusDescr,     defineTypeDef, defineGlobalIdent, defineScopedIdent, defineScopedIdentWhen,     declareTag,defineTag,defineLabel,lookupIdent,     lookupTag,lookupLabel,lookupIdentInner,lookupTagInner,+    insertType, lookupType,+    mergeDefTable ) where import Language.C.Data@@ -37,7 +40,7 @@ import Control.Applicative ((<|>)) import Data.Map (Map) import qualified Data.Map as Map-import Data.IntMap (IntMap)+import Data.IntMap (IntMap, union) import qualified Data.IntMap as IntMap import Data.Generics @@ -91,16 +94,17 @@ -- | Table holding current definitions data DefTable = DefTable     {-        identDecls   :: NameSpaceMap Ident IdentEntry,    -- ^ declared `ordinary identifiers'-        tagDecls   :: NameSpaceMap SUERef TagEntry,       -- ^ declared struct/union/enum  tags+        identDecls   :: NameSpaceMap Ident IdentEntry,     -- ^ declared `ordinary identifiers'+        tagDecls   :: NameSpaceMap SUERef TagEntry,        -- ^ declared struct/union/enum  tags         labelDefs  :: NameSpaceMap Ident Ident,            -- ^ defined labels         memberDecls :: NameSpaceMap Ident MemberDecl,      -- ^ member declarations (only local)-        refTable   :: IntMap Name                          -- ^ link names with definitions+        refTable   :: IntMap Name,                         -- ^ link names with definitions+        typeTable  :: IntMap Type     }  -- | empty definition table, with all name space maps in global scope emptyDefTable :: DefTable-emptyDefTable = DefTable nameSpaceMap nameSpaceMap nameSpaceMap nameSpaceMap IntMap.empty+emptyDefTable = DefTable nameSpaceMap nameSpaceMap nameSpaceMap nameSpaceMap IntMap.empty IntMap.empty  -- | get the globally defined entries of a definition table globalDefs :: DefTable -> GlobalDecls@@ -111,6 +115,9 @@     insertDecl ident (Left tydef) ds = ds { gTypeDefs = Map.insert ident tydef (gTypeDefs ds)}     insertDecl ident (Right obj) ds = ds { gObjs = Map.insert ident obj (gObjs ds) } +inFileScope :: DefTable -> Bool+inFileScope dt = not (hasLocalNames (identDecls dt) || hasLocalNames (labelDefs dt))+ leaveScope_ :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a leaveScope_ = fst . leaveScope @@ -125,10 +132,9 @@                         tagDecls = leaveScope_ (tagDecls deftbl)                        } --- | Enter function scope (and the corresponding block scope)+-- | Enter function scope (AND the corresponding block scope) enterFunctionScope :: DefTable -> DefTable-enterFunctionScope deftbl = enterLocalScope  $-                          deftbl { labelDefs = enterNewScope (labelDefs deftbl) }+enterFunctionScope deftbl = enterLocalScope  $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) }  -- | Leave function scope, and return the associated DefTable. --   Error if not in function scope.@@ -137,11 +143,11 @@  -- | Enter new block scope enterBlockScope :: DefTable -> DefTable-enterBlockScope = enterLocalScope+enterBlockScope deftbl = enterLocalScope $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) }  -- | Leave innermost block scope leaveBlockScope :: DefTable -> DefTable-leaveBlockScope = leaveLocalScope+leaveBlockScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) }  -- | Enter new member declaration scope enterMemberDecl :: DefTable -> DefTable@@ -202,6 +208,7 @@         Just def' | def `sameKind` def' -> Redeclared def'                   | otherwise           -> KindMismatch def'         Nothing                         -> NewDecl+ defRedeclStatusLocal :: (Ord k) =>                         (t -> t -> Bool) -> k -> t -> Maybe t -> NameSpaceMap k t -> DeclarationStatus t defRedeclStatusLocal sameKind ident def oldDecl nsm =@@ -215,7 +222,7 @@ defineTypeDef ident tydef deftbl =   (defRedeclStatus compatIdentEntry (Left tydef) oldDecl, deftbl { identDecls = decls' })   where-  (decls', oldDecl) = defGlobal (identDecls deftbl) ident (Left tydef)+  (decls', oldDecl) = defLocal (identDecls deftbl) ident (Left tydef)  -- | declare\/define a global object\/function\/typeDef --@@ -237,7 +244,7 @@ --   entry. -- --  returns @Keep old_def@ if the old definition shouldn't be overwritten, and otherwise @Redeclared def@ or---  @DifferentKindRedec def@  if there is already an object\/function\/typeDef in the same scope.+--  @DifferentKindRedecl def@  if there is already an object\/function\/typeDef in the same scope. defineScopedIdentWhen :: (IdentDecl -> Bool) -> Ident -> IdentDecl -> DefTable ->                            (DeclarationStatus IdentEntry, DefTable) defineScopedIdentWhen override_def ident def deftbl@@ -303,4 +310,24 @@ -- | lookup an identifier in the innermost scope lookupTagInner :: SUERef -> DefTable -> Maybe TagEntry lookupTagInner sue_ref deftbl = lookupInnermostScope (tagDecls deftbl) sue_ref++-- | Record the type of a node.+insertType :: DefTable -> Name -> Type -> DefTable+insertType dt n t = dt { typeTable = IntMap.insert (nameId n) t (typeTable dt) }++-- | Lookup the type of a node.+lookupType :: DefTable -> Name -> Maybe Type+lookupType dt n = IntMap.lookup (nameId n) (typeTable dt)++-- | Merge two DefTables. If both tables contain an entry for a given+--   key, they must agree on its value.+mergeDefTable :: DefTable -> DefTable -> DefTable+mergeDefTable (DefTable i1 t1 l1 m1 r1 tt1) (DefTable i2 t2 l2 m2 r2 tt2) =+  DefTable+  (mergeNameSpace i1 i2)+  (mergeNameSpace t1 t2)+  (mergeNameSpace l1 l2)+  (mergeNameSpace m1 m2)+  (union r1 r2)+  (union tt1 tt2) 
src/Language/C/Analysis/Export.hs view
@@ -12,6 +12,7 @@ -- Export 'SemRep' entities to 'AST' nodes. ----------------------------------------------------------------------------- module Language.C.Analysis.Export (+exportDeclr, exportType, exportTypeDecl, exportTypeSpec, exportTypeDef, exportCompType, exportCompTypeDecl, exportCompTypeRef,@@ -24,6 +25,9 @@ import Language.C.Analysis.SemRep import Data.Maybe +-- |Export Declarator+--+--  Synopsis: @exportDeclr other_specs type attributes variable-name@ exportDeclr :: [CDeclSpec] -> Type -> Attributes -> VarName -> ([CDeclSpec],CDeclr) exportDeclr other_specs ty attrs name =     (other_specs ++ specs, CDeclr ident derived asmname (exportAttrs attrs) ni)@@ -47,21 +51,30 @@   (declspecs,derived) = exportType ty   declr = (Just $ CDeclr (Just ident) derived Nothing (exportAttrs attrs) ni, Nothing, Nothing) +-- |Export a type to syntax exportType :: Type -> ([CDeclSpec],[CDerivedDeclr]) exportType ty = exportTy [] ty-    where-    exportTy dd (PtrType ity tyquals attrs) = exportTy (ptr_declr : dd) ity where-        ptr_declr = CPtrDeclr (exportTypeQualsAttrs tyquals attrs) ni-    exportTy dd (ArrayType ity array_sz tyquals attrs) = exportTy (arr_declr : dd) ity where-        arr_declr = CArrDeclr (exportTypeQualsAttrs tyquals attrs) (exportArraySize array_sz) ni-    exportTy dd (FunctionType (FunType ity params variadic attrs)) = exportTy (fun_declr : dd) ity where-        fun_declr = CFunDeclr (Right (map exportParamDecl params,variadic)) (exportAttrs attrs) ni-    exportTy dd (FunctionType (FunTypeIncomplete ity attrs)) = exportTy (fun_declr : dd) ity where-        fun_declr = CFunDeclr (Right ([],False)) (exportAttrs attrs) ni-    exportTy dd (TypeDefType (TypeDefRef ty_ident _ node)) = ([CTypeSpec (CTypeDef ty_ident node)], reverse dd)-    exportTy dd (DirectType ity quals) = (map CTypeQual (exportTypeQuals quals) ++-                                        map CTypeSpec (exportTypeSpec ity), reverse dd)-    exportTy _ (TypeOfExpr _) = error "export of TypeOfExpr isn't supported"+  where+    exportTy dd (PtrType ity tyquals attrs) =+        let ptr_declr = CPtrDeclr (exportTypeQualsAttrs tyquals attrs) ni+        in  exportTy (ptr_declr : dd) ity+    exportTy dd (ArrayType ity array_sz tyquals attrs) =+        let arr_declr = CArrDeclr (exportTypeQualsAttrs tyquals attrs) (exportArraySize array_sz) ni+        in  exportTy (arr_declr : dd) ity+    exportTy dd (FunctionType (FunType ity params variadic) attrs) =+        let fun_declr = CFunDeclr (Right (map exportParamDecl params,variadic)) (exportAttrs attrs) ni+        in  exportTy (fun_declr : dd) ity+    exportTy dd (FunctionType (FunTypeIncomplete ity) attrs) =+        let fun_declr = CFunDeclr (Right ([],False)) (exportAttrs attrs) ni+        in  exportTy (fun_declr : dd) ity+    exportTy dd (TypeDefType (TypeDefRef ty_ident _ node) quals attrs) =+        let declspecs =    [CTypeSpec (CTypeDef ty_ident node)]+                        ++ map CTypeQual (exportTypeQualsAttrs quals attrs)+        in (declspecs, reverse dd)+    exportTy dd (DirectType ity quals attrs) =+        let declspecs =    map CTypeQual (exportTypeQualsAttrs quals attrs)+                        ++ map CTypeSpec (exportTypeSpec ity)+        in (declspecs, reverse dd)  exportTypeQuals :: TypeQuals -> [CTypeQual] exportTypeQuals quals = mapMaybe select [(constant,CConstQual ni),(volatile,CVolatQual ni),(restrict,CRestrQual ni)]@@ -86,6 +99,7 @@         TyComp comp -> exportCompTypeDecl comp         TyEnum enum -> exportEnumTypeDecl enum         TyBuiltin TyVaList -> [CTypeDef (internalIdent "va_list") ni]+        TyBuiltin TyAny -> [CTypeDef (internalIdent "__ty_any") ni]  exportIntType :: IntType -> [CTypeSpec] exportIntType ty =@@ -184,8 +198,10 @@ exportStorage (Auto reg) = if reg then [CRegister ni] else [] exportStorage (Static InternalLinkage thread_local) = threadLocal thread_local [CStatic ni] exportStorage (Static ExternalLinkage thread_local) = threadLocal thread_local [CExtern ni]-exportStorage (FunLinkage ExternalLinkage) = []+exportStorage (Static NoLinkage _) = error "impossible storage: static without linkage" exportStorage (FunLinkage InternalLinkage) = [CStatic ni]+exportStorage (FunLinkage ExternalLinkage) = []+exportStorage (FunLinkage NoLinkage) = error "impossible storage: function without linkage"  threadLocal :: Bool -> [CStorageSpec] -> [CStorageSpec] threadLocal False = id@@ -196,9 +212,9 @@     exportAttr (Attr ident es n) = CAttr ident es n  fromDirectType :: Type -> TypeName-fromDirectType (DirectType ty _) = ty-fromDirectType (TypeDefType (TypeDefRef _ ref _)) = maybe (error "undefined typeDef") fromDirectType ref+fromDirectType (DirectType ty _ _) = ty+fromDirectType (TypeDefType (TypeDefRef _ ref _) _ _) = maybe (error "undefined typeDef") fromDirectType ref fromDirectType _ = error "fromDirectType"  ni :: NodeInfo-ni = internalNode+ni = undefNode
src/Language/C/Analysis/NameSpaceMap.hs view
@@ -26,11 +26,13 @@     enterNewScope, leaveScope,     defLocal,     lookupName,lookupGlobal,lookupInnermostScope,+    mergeNameSpace     ) where import Prelude hiding (lookup) import qualified Prelude-import qualified Data.Map as Map (empty, insert, lookup, toList)+import qualified Data.Map as Map (empty, insert, lookup, toList, union)+import qualified Data.List as List (unionBy) import Data.Map   (Map) import Language.C.Data.Ident     (Ident) @@ -142,3 +144,16 @@ --  @nameSpaceToList ns = (localDefInnermost ns ++ .. ++ localDefsOutermost ns) ++ globalDefs ns@ nsMapToList :: (Ord k) => NameSpaceMap k a -> [(k, a)] nsMapToList (NsMap gs lss)  = concat lss ++ Map.toList gs++-- | Merge two namespaces. If they disagree on the types of any+--   variables, all bets are off.+mergeNameSpace :: (Ord k) =>+                  NameSpaceMap k a+               -> NameSpaceMap k a+               -> NameSpaceMap k a+mergeNameSpace (NsMap global1 local1) (NsMap global2 local2) =+  NsMap (Map.union global1 global2) (localUnion local1 local2)+  where localUnion (l1:ls1) (l2:ls2) =+          List.unionBy (\p1 p2 -> fst p1 == fst p2) l1 l2 : localUnion ls1 ls2+        localUnion [] ls2 = ls2+        localUnion ls1 [] = ls1
src/Language/C/Analysis/SemError.hs view
@@ -37,7 +37,8 @@ data RedefError = RedefError ErrorLevel RedefInfo deriving Typeable  data RedefInfo = RedefInfo String RedefKind NodeInfo NodeInfo-data RedefKind = DuplicateDef | DiffKindRedecl | ShadowedDef+data RedefKind = DuplicateDef | DiffKindRedecl | ShadowedDef | DisagreeLinkage |+                 NoLinkageOld data TypeMismatch = TypeMismatch String (NodeInfo,Type) (NodeInfo,Type) deriving Typeable  -- Invalid AST@@ -89,6 +90,8 @@ redefErrReason (RedefInfo ident DuplicateDef _ _) = "duplicate definition of " ++ ident redefErrReason (RedefInfo ident ShadowedDef _ _)   = "this declaration of " ++ ident ++ " shadows a previous one" redefErrReason (RedefInfo ident DiffKindRedecl _ _) = ident ++ " previously declared as a different kind of symbol"+redefErrReason (RedefInfo ident DisagreeLinkage _ _) = ident ++ " previously declared with different linkage"+redefErrReason (RedefInfo ident NoLinkageOld _ _) = ident ++ " previously declared without linkage"  prevDeclMsg :: NodeInfo -> [String] prevDeclMsg old_node = ["The previous declaration was here: ", show (posOfNode old_node)]
src/Language/C/Analysis/SemRep.hs view
@@ -31,11 +31,10 @@ -- * Declaration attributes DeclAttrs(..),isExtDecl, Storage(..),declStorage,ThreadLocal,Register,-Linkage(..),+Linkage(..),hasLinkage,declLinkage, -- * Types Type(..),-FunType(..),isFunctionType,-derefTypeDef,referencedType,hasTypeOfExpr,+FunType(..), ArraySize(..), TypeDefRef(..), TypeName(..),BuiltinType(..),@@ -46,9 +45,9 @@ Enumerator(..), TypeQuals(..),noTypeQuals,mergeTypeQuals, -- * Variable names-VarName(..),identOfVarName,AsmName,+VarName(..),identOfVarName,isNoName,AsmName, -- * Attributes (STUB, not yet analyzed)-Attr(..),Attributes,+Attr(..),Attributes,noAttributes,mergeAttributes, -- * Statements and Expressions (STUB, aliases to Syntax) Stmt,Expr,Initializer,AsmBlock, )@@ -73,7 +72,7 @@ -- | Composite type definitions (tags) data TagDef =  CompDef CompType	  --definition      	       | EnumDef EnumType      -- enum definition-               deriving (Typeable, Data {-! CNode !-})+               deriving (Typeable, Data {-! ,CNode !-})  instance HasSUERef TagDef where     sueRef (CompDef ct) = sueRef ct@@ -115,7 +114,7 @@ 	             | ObjectDef ObjDef           -- ^ object definition 	             | FunctionDef FunDef         -- ^ function definition 	             | EnumeratorDef Enumerator   -- ^ definition of an enumerator-               deriving (Typeable, Data {-! CNode !-})+               deriving (Typeable, Data {-! ,CNode !-})  instance Declaration IdentDecl where   getVarDecl (Declaration decl) = getVarDecl decl@@ -190,6 +189,10 @@        -- ^ file-scope struct\/union\/enum event      | DeclEvent IdentDecl        -- ^ file-scope declaration or definition+     | ParamEvent ParamDecl+       -- ^ parameter declaration+     | LocalEvent IdentDecl+       -- ^ local variable declaration or definition      | TypeDefEvent TypeDef        -- ^ a type definition      | AsmEvent AsmBlock@@ -200,7 +203,7 @@  -- | Declarations, which aren't definitions data Decl = Decl VarDecl NodeInfo-            deriving (Typeable, Data {-! CNode !-})+            deriving (Typeable, Data {-! ,CNode !-})  instance Declaration Decl where     getVarDecl   (Decl vd _) =  vd@@ -212,7 +215,7 @@ -- If the initializer is missing, it is a tentative definition, i.e. a -- definition which might be overriden later on. data ObjDef = ObjDef VarDecl (Maybe Initializer) NodeInfo-             deriving (Typeable, Data {-! CNode !-})+             deriving (Typeable, Data {-! ,CNode !-}) instance Declaration ObjDef where     getVarDecl  (ObjDef vd _ _) =  vd @@ -225,7 +228,7 @@ -- -- A function definition is a declaration together with a statement (the function body). data FunDef = FunDef VarDecl Stmt NodeInfo-             deriving (Typeable, Data {-! CNode !-})+             deriving (Typeable, Data {-! ,CNode !-}) instance Declaration FunDef where     getVarDecl (FunDef vd _ _) = vd @@ -233,7 +236,7 @@ -- | Parameter declaration data ParamDecl = ParamDecl VarDecl NodeInfo                | AbstractParamDecl VarDecl NodeInfo-    deriving (Typeable, Data {-! CNode !-} )+    deriving (Typeable, Data {-! ,CNode !-} )  instance Declaration ParamDecl where   getVarDecl (ParamDecl vd _) = vd@@ -244,7 +247,7 @@                   -- ^ @MemberDecl vardecl bitfieldsize node@                 | AnonBitField Type Expr NodeInfo                   -- ^ @AnonBitField typ size@-    deriving (Typeable, Data {-! CNode !-} )+    deriving (Typeable, Data {-! ,CNode !-} )  instance Declaration MemberDecl where   getVarDecl (MemberDecl vd _ _) = vd@@ -254,7 +257,7 @@ -- -- The identifier is a new name for the given type. data TypeDef = TypeDef Ident Type Attributes NodeInfo-               deriving (Typeable, Data {-! CNode !-} )+               deriving (Typeable, Data {-! ,CNode !-} )  -- | return the idenitifier of a @typedef@ identOfTypeDef :: TypeDef -> Ident@@ -297,76 +300,56 @@ -- | Storage duration and linkage of a variable data Storage  =  NoStorage                  -- ^ no storage                | Auto Register              -- ^ automatic storage (optional: register)-               | Static Linkage ThreadLocal -- ^ static storage, with linkage and thread local specifier (gnu c)+               | Static Linkage ThreadLocal -- ^ static storage, linkage spec and thread local specifier (gnu c)                | FunLinkage Linkage         -- ^ function, either internal or external linkage                deriving (Typeable, Data, Show, Eq, Ord)  type ThreadLocal = Bool type Register    = Bool --- | Linkage: Either internal to the translation unit or external-data Linkage = InternalLinkage | ExternalLinkage+-- | Linkage: Either no linkage, internal to the translation unit or external+data Linkage = NoLinkage | InternalLinkage | ExternalLinkage                deriving (Typeable, Data, Show, Eq, Ord)  -- | return @True@ if the object has linkage hasLinkage :: Storage -> Bool-hasLinkage (Static _ _) = True-hasLinkage _ = False+hasLinkage (Auto _) = False+hasLinkage (Static NoLinkage _) = False+hasLinkage _ = True +-- | Get the linkage of a definition+declLinkage :: (Declaration d) => d -> Linkage+declLinkage decl =+    case declStorage decl of+        NoStorage -> undefined+        Auto _ -> NoLinkage+        Static linkage _ -> linkage+        FunLinkage linkage -> linkage++ -- * types  -- | types of C objects data Type =-       DirectType TypeName TypeQuals+       DirectType TypeName TypeQuals Attributes      -- ^ a non-derived type      | PtrType Type TypeQuals Attributes      -- ^ pointer type      | ArrayType Type ArraySize TypeQuals Attributes      -- ^ array type-     | FunctionType FunType+     | FunctionType FunType Attributes      -- ^ function type-     | TypeDefType TypeDefRef+     | TypeDefType TypeDefRef TypeQuals Attributes      -- ^ a defined type-     | TypeOfExpr Expr-     -- ^ (GNU) typeof (/broken/ and should be removed, but we do not yet have expression type analysis)      deriving (Typeable, Data) --- | Function types are of the form @FunType return-type params isVariadic attrs@.+-- | Function types are of the form @FunType return-type params isVariadic@. -- -- If the parameter types aren't yet known, the function has type @FunTypeIncomplete type attrs@.-data FunType = FunType Type [ParamDecl] Bool Attributes-            |  FunTypeIncomplete Type Attributes+data FunType = FunType Type [ParamDecl] Bool+            |  FunTypeIncomplete Type                deriving (Typeable, Data) --- | resolve typedefs, if possible-derefTypeDef :: Type -> Type-derefTypeDef (TypeDefType (TypeDefRef _ (Just actual_ty) _)) = derefTypeDef actual_ty-derefTypeDef ty = ty---- may not be called on undefined typeDefs or typeof(expr)-referencedType :: Type -> Maybe Type-referencedType (PtrType ty _ _) = Just ty-referencedType (FunctionType (FunType ty _ _ _)) = Just ty-referencedType (ArrayType ty _ _ _) = Just ty-referencedType (TypeDefType (TypeDefRef _ (Just actual_ty) _)) = Just actual_ty-referencedType (DirectType _ _) = Nothing-referencedType _ = error "referencedType: failed to resolve type"--hasTypeOfExpr :: Type -> Bool-hasTypeOfExpr (TypeOfExpr _) = True-hasTypeOfExpr ty = maybe False hasTypeOfExpr (referencedType ty)---- | return @True@ if the given type is a function type------   Result is undefined in the presence of TypeOfExpr or undefined typeDefs-isFunctionType :: Type -> Bool-isFunctionType ty =-    case ty of  TypeDefType (TypeDefRef _ (Just actual_ty) _) -> isFunctionType actual_ty-                TypeDefType _ -> error "isFunctionType: unresolved typeDef"-                TypeOfExpr _  -> error "isFunctionType: typeof(expr)"-                FunctionType _ -> True-                _ -> False- -- | An array type may either have unknown size or a specified array size, the latter either variable or constant. -- Furthermore, when used as a function parameters, the size may be qualified as /static/. -- In a function prototype, the size may be `Unspecified variable size' (@[*]@).@@ -387,14 +370,15 @@     | TyBuiltin BuiltinType     deriving (Typeable, Data) --- | Builtin type (va_list)+-- | Builtin type (va_list, anything) data BuiltinType = TyVaList+                 | TyAny                    deriving (Typeable, Data)  -- | typdef references -- If the actual type is known, it is attached for convenience data TypeDefRef = TypeDefRef Ident (Maybe Type) NodeInfo-               deriving (Typeable, Data {-! CNode !-})+               deriving (Typeable, Data {-! ,CNode !-})  -- | integral types (C99 6.7.2.2) data IntType =@@ -440,24 +424,24 @@  -- | composite type declarations data CompTypeRef = CompTypeRef SUERef CompTyKind NodeInfo-                    deriving (Typeable, Data {-! CNode !-})+                    deriving (Typeable, Data {-! ,CNode !-})  instance HasSUERef  CompTypeRef where sueRef  (CompTypeRef ref _ _) = ref instance HasCompTyKind CompTypeRef where compTag (CompTypeRef _ tag _)  = tag  data EnumTypeRef = EnumTypeRef SUERef NodeInfo-    deriving (Typeable, Data {-! CNode !-})+    deriving (Typeable, Data {-! ,CNode !-}) instance HasSUERef  EnumTypeRef where sueRef  (EnumTypeRef ref _) = ref  -- | Composite type (struct or union). data CompType =  CompType SUERef CompTyKind [MemberDecl] Attributes NodeInfo-                 deriving (Typeable, Data {-! CNode !-} )+                 deriving (Typeable, Data {-! ,CNode !-} ) instance HasSUERef  CompType where sueRef  (CompType ref _ _ _ _) = ref instance HasCompTyKind CompType where compTag (CompType _ tag _ _ _) = tag  -- | return the type of a composite type definition typeOfCompDef :: CompType -> TypeName-typeOfCompDef (CompType ref tag _ _ _) = TyComp (CompTypeRef ref tag internalNode)+typeOfCompDef (CompType ref tag _ _ _) = TyComp (CompTypeRef ref tag undefNode)  -- | a tag to determine wheter we refer to a @struct@ or @union@, see 'CompType'. data CompTyKind =  StructTag@@ -471,23 +455,23 @@ -- | Representation of C enumeration types data EnumType = EnumType SUERef [Enumerator] Attributes NodeInfo                  -- ^ @EnumType name enumeration-constants attrs node@-                 deriving (Typeable, Data {-! CNode !-} )+                 deriving (Typeable, Data {-! ,CNode !-} )  instance HasSUERef EnumType where sueRef  (EnumType ref _ _ _) = ref  -- | return the type of an enum definition typeOfEnumDef :: EnumType -> TypeName-typeOfEnumDef (EnumType ref _ _ _) = TyEnum (EnumTypeRef ref internalNode)+typeOfEnumDef (EnumType ref _ _ _) = TyEnum (EnumTypeRef ref undefNode)  -- | An Enumerator consists of an identifier, a constant expressions and the link to its type data Enumerator = Enumerator Ident Expr EnumType NodeInfo-                  deriving (Typeable, Data {-! CNode !-})+                  deriving (Typeable, Data {-! ,CNode !-}) instance Declaration Enumerator where   getVarDecl (Enumerator ide _ enumty _) =     VarDecl       (VarName ide Nothing)       (DeclAttrs False NoStorage [])-      (DirectType (typeOfEnumDef enumty) noTypeQuals)+      (DirectType (typeOfEnumDef enumty) noTypeQuals noAttributes)  -- | Type qualifiers: constant, volatile and restrict data TypeQuals = TypeQuals { constant :: Bool, volatile :: Bool, restrict :: Bool }@@ -526,6 +510,10 @@ identOfVarName NoName            = error "identOfVarName: NoName" identOfVarName (VarName ident _) = ident +isNoName :: VarName -> Bool+isNoName NoName = True+isNoName _ = False+ -- | Top level assembler block (alias for @CStrLit@) type AsmBlock = CStrLit @@ -551,109 +539,147 @@ -- -- /TODO/: ultimatively, we want to parse attributes and represent them in a typed way data Attr = Attr Ident [Expr] NodeInfo-            deriving (Typeable, Data {-! CNode !-})+            deriving (Typeable, Data {-! ,CNode !-})  type Attributes = [Attr] +-- |Empty attribute list+noAttributes :: Attributes+noAttributes = []++-- |Merge attribute lists+-- /TODO/: currently does not remove duplicates+mergeAttributes :: Attributes -> Attributes -> Attributes+mergeAttributes = (++)+ -- * statements and expressions (Type aliases)  -- | 'Stmt' is an alias for 'CStat' (Syntax) type Stmt = CStat -- | 'Expr' is currently an alias for 'CExpr' (Syntax) type Expr = CExpr+-- GENERATED START  +instance CNode TagDef where+        nodeInfo (CompDef d) = nodeInfo d+        nodeInfo (EnumDef d) = nodeInfo d ------------------------------------------------------------ DERIVES GENERATED CODE--- DO NOT MODIFY BELOW THIS LINE--- CHECKSUM: 1672142450+instance Pos TagDef where+        posOf x = posOf (nodeInfo x) -instance CNode TagDef-    where nodeInfo (CompDef d) = nodeInfo d-          nodeInfo (EnumDef d) = nodeInfo d-instance Pos TagDef-    where posOf x = posOfNode (nodeInfo x) -instance CNode IdentDecl-    where nodeInfo (Declaration d) = nodeInfo d-          nodeInfo (ObjectDef d) = nodeInfo d-          nodeInfo (FunctionDef d) = nodeInfo d-          nodeInfo (EnumeratorDef d) = nodeInfo d-instance Pos IdentDecl-    where posOf x = posOfNode (nodeInfo x)+instance CNode IdentDecl where+        nodeInfo (Declaration d) = nodeInfo d+        nodeInfo (ObjectDef d) = nodeInfo d+        nodeInfo (FunctionDef d) = nodeInfo d+        nodeInfo (EnumeratorDef d) = nodeInfo d -instance CNode DeclEvent-    where nodeInfo (TagEvent d) = nodeInfo d-          nodeInfo (DeclEvent d) = nodeInfo d-          nodeInfo (TypeDefEvent d) = nodeInfo d-          nodeInfo (AsmEvent d) = nodeInfo d-instance Pos DeclEvent-    where posOf x = posOfNode (nodeInfo x)+instance Pos IdentDecl where+        posOf x = posOf (nodeInfo x) -instance CNode Decl-    where nodeInfo (Decl _ nodeinfo) = nodeinfo-instance Pos Decl-    where posOf x = posOfNode (nodeInfo x) -instance CNode ObjDef-    where nodeInfo (ObjDef _ _ nodeinfo) = nodeinfo-instance Pos ObjDef-    where posOf x = posOfNode (nodeInfo x)+instance CNode DeclEvent where+        nodeInfo (TagEvent d) = nodeInfo d+        nodeInfo (DeclEvent d) = nodeInfo d+        nodeInfo (ParamEvent d) = nodeInfo d+        nodeInfo (LocalEvent d) = nodeInfo d+        nodeInfo (TypeDefEvent d) = nodeInfo d+        nodeInfo (AsmEvent d) = nodeInfo d -instance CNode FunDef-    where nodeInfo (FunDef _ _ nodeinfo) = nodeinfo-instance Pos FunDef-    where posOf x = posOfNode (nodeInfo x)+instance Pos DeclEvent where+        posOf x = posOf (nodeInfo x) -instance CNode ParamDecl-    where nodeInfo (ParamDecl _ nodeinfo) = nodeinfo-          nodeInfo (AbstractParamDecl _ nodeinfo) = nodeinfo-instance Pos ParamDecl-    where posOf x = posOfNode (nodeInfo x) -instance CNode MemberDecl-    where nodeInfo (MemberDecl _ _ nodeinfo) = nodeinfo-          nodeInfo (AnonBitField _ _ nodeinfo) = nodeinfo-instance Pos MemberDecl-    where posOf x = posOfNode (nodeInfo x)+instance CNode Decl where+        nodeInfo (Decl _ n) = n -instance CNode TypeDef-    where nodeInfo (TypeDef _ _ _ nodeinfo) = nodeinfo-instance Pos TypeDef-    where posOf x = posOfNode (nodeInfo x)+instance Pos Decl where+        posOf x = posOf (nodeInfo x) -instance CNode TypeDefRef-    where nodeInfo (TypeDefRef _ _ nodeinfo) = nodeinfo-instance Pos TypeDefRef-    where posOf x = posOfNode (nodeInfo x) -instance CNode CompTypeRef-    where nodeInfo (CompTypeRef _ _ nodeinfo) = nodeinfo-instance Pos CompTypeRef-    where posOf x = posOfNode (nodeInfo x)+instance CNode ObjDef where+        nodeInfo (ObjDef _ _ n) = n -instance CNode EnumTypeRef-    where nodeInfo (EnumTypeRef _ nodeinfo) = nodeinfo-instance Pos EnumTypeRef-    where posOf x = posOfNode (nodeInfo x)+instance Pos ObjDef where+        posOf x = posOf (nodeInfo x) -instance CNode CompType-    where nodeInfo (CompType _ _ _ _ nodeinfo) = nodeinfo-instance Pos CompType-    where posOf x = posOfNode (nodeInfo x) -instance CNode EnumType-    where nodeInfo (EnumType _ _ _ nodeinfo) = nodeinfo-instance Pos EnumType-    where posOf x = posOfNode (nodeInfo x)+instance CNode FunDef where+        nodeInfo (FunDef _ _ n) = n -instance CNode Enumerator-    where nodeInfo (Enumerator _ _ _ nodeinfo) = nodeinfo-instance Pos Enumerator-    where posOf x = posOfNode (nodeInfo x)+instance Pos FunDef where+        posOf x = posOf (nodeInfo x) -instance CNode Attr-    where nodeInfo (Attr _ _ nodeinfo) = nodeinfo-instance Pos Attr-    where posOf x = posOfNode (nodeInfo x)++instance CNode ParamDecl where+        nodeInfo (ParamDecl _ n) = n+        nodeInfo (AbstractParamDecl _ n) = n++instance Pos ParamDecl where+        posOf x = posOf (nodeInfo x)+++instance CNode MemberDecl where+        nodeInfo (MemberDecl _ _ n) = n+        nodeInfo (AnonBitField _ _ n) = n++instance Pos MemberDecl where+        posOf x = posOf (nodeInfo x)+++instance CNode TypeDef where+        nodeInfo (TypeDef _ _ _ n) = n++instance Pos TypeDef where+        posOf x = posOf (nodeInfo x)+++instance CNode TypeDefRef where+        nodeInfo (TypeDefRef _ _ n) = n++instance Pos TypeDefRef where+        posOf x = posOf (nodeInfo x)+++instance CNode CompTypeRef where+        nodeInfo (CompTypeRef _ _ n) = n++instance Pos CompTypeRef where+        posOf x = posOf (nodeInfo x)+++instance CNode EnumTypeRef where+        nodeInfo (EnumTypeRef _ n) = n++instance Pos EnumTypeRef where+        posOf x = posOf (nodeInfo x)+++instance CNode CompType where+        nodeInfo (CompType _ _ _ _ n) = n++instance Pos CompType where+        posOf x = posOf (nodeInfo x)+++instance CNode EnumType where+        nodeInfo (EnumType _ _ _ n) = n++instance Pos EnumType where+        posOf x = posOf (nodeInfo x)+++instance CNode Enumerator where+        nodeInfo (Enumerator _ _ _ n) = n++instance Pos Enumerator where+        posOf x = posOf (nodeInfo x)+++instance CNode Attr where+        nodeInfo (Attr _ _ n) = n++instance Pos Attr where+        posOf x = posOf (nodeInfo x)+-- GENERATED STOP
src/Language/C/Analysis/TravMonad.hs view
@@ -16,6 +16,12 @@ -- Furthermore, the user may provide callbacks to handle declarations and definitions. ----------------------------------------------------------------------------- module Language.C.Analysis.TravMonad (+    -- * Name generation monad+    MonadName(..),+    -- * Symbol table monad+    MonadSymtab(..),+    -- * Specialized C error-handling monad+    MonadCError(..),     -- * AST traversal monad     MonadTrav(..),     -- * Handling declarations@@ -37,54 +43,64 @@     Trav,     runTrav,runTrav_,     TravState,initTravState,withExtDeclHandler,modifyUserState,userState,+    getUserState,+    TravOptions(..),modifyOptions,     travErrors,+    -- * Language options+    CLanguage(..),     -- * Helpers     mapMaybeM,maybeM,mapSndM,concatMapM, ) where import Language.C.Data+import Language.C.Data.Ident import Language.C.Data.RList as RList import Language.C.Syntax +import Language.C.Analysis.Builtins import Language.C.Analysis.SemError import Language.C.Analysis.SemRep import Language.C.Analysis.DefTable hiding (enterBlockScope,leaveBlockScope,                                             enterFunctionScope,leaveFunctionScope) import qualified Language.C.Analysis.DefTable as ST +import Data.IntMap (insert, lookup) import Data.Maybe import Control.Monad(liftM)+import Prelude hiding (lookup) --- | Traversal monad-class (Monad m) => MonadTrav m where+class (Monad m) => MonadName m where+    -- | unique name generation+    genName :: m Name++class (Monad m) => MonadSymtab m where+    -- symbol table handling+    -- | return the definition table+    getDefTable :: m DefTable+    -- | perform an action modifying the definition table+    withDefTable :: (DefTable -> (a, DefTable)) -> m a++class (Monad m) => MonadCError m where     -- error handling facilities      -- | throw an 'Error'     throwTravError :: Error e => e -> m a     -- | catch an 'Error' (we could implement dynamically-typed catch here)     catchTravError :: m a -> (CError -> m a) -> m a-    -- | remember that an 'Error' occured (without throwing it)+    -- | remember that an 'Error' occurred (without throwing it)     recordError    :: Error e => e -> m ()     -- | return the list of recorded errors     getErrors      :: m [CError] -    -- symbol table handling--    -- | return the definition table-    getDefTable :: m DefTable-    -- | perform an action modifying the definition table-    withDefTable :: (DefTable -> (a, DefTable)) -> m a--    -- | unique name generation-    genName :: m Name-+-- | Traversal monad+class (MonadName m, MonadSymtab m, MonadCError m) => MonadTrav m where     -- | handling declarations and definitions     handleDecl :: DeclEvent -> m ()  -- * handling declarations  -- check wheter a redefinition is ok-checkRedef :: (MonadTrav m, CNode t, CNode t1) => String -> t -> (DeclarationStatus t1) -> m ()+checkRedef :: (MonadCError m, CNode t, CNode t1) => String -> t -> (DeclarationStatus t1) -> m () checkRedef subject new_decl redecl_status =     case redecl_status of         NewDecl -> return ()@@ -97,9 +113,9 @@             -- redefinition LevelWarn subject ShadowedDef (nodeInfo new_decl) (nodeInfo old_def)         KeepDef _old_def      -> return () --- | forward declaration of a tag. Only neccessary for name analysis, but otherwise no semantic+-- | forward declaration of a tag. Only necessary for name analysis, but otherwise no semantic -- consequences.-handleTagDecl :: (MonadTrav m) => TagFwdDecl -> m ()+handleTagDecl :: (MonadCError m, MonadSymtab m) => TagFwdDecl -> m () handleTagDecl decl = do     redecl <- withDefTable $ declareTag (sueRef decl) decl     checkRedef (show $ sueRef decl) decl redecl@@ -114,7 +130,7 @@     checkRedef (show $ sueRef def) def redecl     handleDecl (TagEvent def) -handleEnumeratorDef :: (MonadTrav m) => Enumerator ->  m ()+handleEnumeratorDef :: (MonadCError m, MonadSymtab m) => Enumerator ->  m () handleEnumeratorDef enumerator = do     let ident = declIdent enumerator     redecl <- withDefTable $ defineScopedIdent ident (EnumeratorDef enumerator)@@ -131,12 +147,13 @@ handleAsmBlock :: (MonadTrav m) => AsmBlock -> m () handleAsmBlock asm = handleDecl (AsmEvent asm) -redefErr :: (MonadTrav m, CNode old, CNode new) => Ident -> ErrorLevel -> new -> old -> RedefKind -> m ()+redefErr :: (MonadCError m, CNode old, CNode new) =>+            Ident -> ErrorLevel -> new -> old -> RedefKind -> m () redefErr name lvl new old kind =   throwTravError $ redefinition lvl (show name) kind (nodeInfo new) (nodeInfo old)  -- TODO: unused-checkIdentTyRedef :: (MonadTrav m) => IdentEntry -> (DeclarationStatus IdentEntry) -> m ()+checkIdentTyRedef :: (MonadCError m) => IdentEntry -> (DeclarationStatus IdentEntry) -> m () checkIdentTyRedef (Right decl) status = checkVarRedef decl status checkIdentTyRedef (Left tydef) (KindMismatch old_def) =   redefErr (identOfTypeDef tydef) LevelError tydef old_def DiffKindRedecl@@ -144,49 +161,67 @@   redefErr (identOfTypeDef tydef) LevelError tydef old_def DuplicateDef checkIdentTyRedef (Left _tydef) _ = return () -checkVarRedef :: (MonadTrav m) => IdentDecl -> (DeclarationStatus IdentEntry) -> m ()+-- Check whether it is ok to declare a variable already in scope+checkVarRedef :: (MonadCError m) => IdentDecl -> (DeclarationStatus IdentEntry) -> m () checkVarRedef def redecl =     case redecl of         -- always an error         KindMismatch old_def -> redefVarErr old_def DiffKindRedecl-        -- types have to match-        KeepDef (Right old_def) -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)-        -- redeclaration: old entry has to be a declaration or tentative, type have to match-        Redeclared (Right old_def) | isTentativeG old_def ->-                                      throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)-                                   | otherwise -> redefVarErr old_def DuplicateDef+        -- Declaration referencing definition:+        --   * new entry has to be a declaration+        --   * old entry and new entry have to have linkage and agree on linkage+        --   * types have to match+        KeepDef (Right old_def) | not (agreeOnLinkage def old_def) -> linkageErr def old_def+                                | otherwise -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)+        -- redefinition:+        --   * old entry has to be a declaration or tentative definition+        --   * old entry and new entry have to have linkage and agree on linkage+        --   * types have to match+        Redeclared (Right old_def) | not (agreeOnLinkage def old_def) -> linkageErr def old_def+                                   | not(canBeOverwritten old_def) -> redefVarErr old_def DuplicateDef+                                   | otherwise -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)         -- NewDecl/Shadowed is ok         _ -> return ()     where     redefVarErr old_def kind = redefErr (declIdent def) LevelError def old_def kind+    linkageErr def old_def =+        case (declLinkage def, declLinkage old_def) of+            (NoLinkage, _) -> redefErr (declIdent def) LevelError  def old_def NoLinkageOld+            otherwise      -> redefErr (declIdent def) LevelError  def old_def DisagreeLinkage+     new_ty = declType def-    isTentativeG (Declaration _) = True-    isTentativeG (ObjectDef od)  = isTentative od-    isTentativeG _               = False+    canBeOverwritten (Declaration _) = True+    canBeOverwritten (ObjectDef od)  = isTentative od+    canBeOverwritten _               = False+    agreeOnLinkage def old_def+        | declStorage old_def == FunLinkage InternalLinkage = True+        | not (hasLinkage $ declStorage def) || not (hasLinkage $ declStorage old_def) = False+        | (declLinkage def) /= (declLinkage old_def) = False+        | otherwise = True  -- | handle variable declarations (external object declarations and function prototypes) -- variable declarations are either function prototypes, or external declarations, and not very -- interesting on their own. we only put them in the symbol table and call the handle. -- declarations never override definitions-handleVarDecl :: (MonadTrav m) => Decl -> m ()-handleVarDecl decl = do+handleVarDecl :: (MonadTrav m) => Bool -> Decl -> m ()+handleVarDecl is_local decl = do     def <- enterDecl decl (const False)-    handleDecl (DeclEvent def)+    handleDecl ((if is_local then LocalEvent else DeclEvent) def)  -- | handle parameter declaration. The interesting part is that parameters can be abstract -- (if they are part of a type). If they have a name, we enter the name (usually in function prototype or function scope),--- checking if there are duplicate definitions. +-- checking if there are duplicate definitions. -- FIXME: I think it would be more transparent to handle parameter declarations in a special way handleParamDecl :: (MonadTrav m) => ParamDecl -> m ()-handleParamDecl (AbstractParamDecl _ _) = return ()-handleParamDecl (ParamDecl vardecl node) = do+handleParamDecl pd@(AbstractParamDecl _ _) = handleDecl (ParamEvent pd)+handleParamDecl pd@(ParamDecl vardecl node) = do     let def = ObjectDef (ObjDef vardecl Nothing node)     redecl <- withDefTable $ defineScopedIdent (declIdent def) def     checkVarRedef def redecl-    return ()+    handleDecl (ParamEvent pd)  -- shared impl-enterDecl :: (MonadTrav m) => Decl -> (IdentDecl -> Bool) -> m IdentDecl+enterDecl :: (MonadCError m, MonadSymtab m) => Decl -> (IdentDecl -> Bool) -> m IdentDecl enterDecl decl cond = do     let def = Declaration decl     redecl <- withDefTable $@@ -211,20 +246,20 @@ checkCompatibleTypes _ _ = Right ()  -- | handle object defintions (maybe tentative)-handleObjectDef :: (MonadTrav m) => Ident -> ObjDef -> m ()-handleObjectDef ident obj_def = do+handleObjectDef :: (MonadTrav m) => Bool -> Ident -> ObjDef -> m ()+handleObjectDef local ident obj_def = do     let def = ObjectDef obj_def     redecl <- withDefTable $-              defineScopedIdentWhen (\o -> shouldOverride def o) ident def+              defineScopedIdentWhen (\old -> shouldOverride def old) ident def     checkVarRedef def redecl-    handleDecl (DeclEvent def)+    handleDecl ((if local then LocalEvent else DeclEvent) def)     where     isTentativeDef (ObjectDef object_def) = isTentative object_def     isTentativeDef _ = False-    shouldOverride def o | isDeclaration o = True-                         | not (isTentativeDef def) = True-                         | isTentativeDef o = True-                         | otherwise = False+    shouldOverride def old | isDeclaration old = True+                           | not (isTentativeDef def) = True+                           | isTentativeDef old = True+                           | otherwise = False  -- * scope manipulation --@@ -235,25 +270,25 @@ --  * function scope: labels are visible within the entire function, and declared implicitely -- --  * block scope-updDefTable :: (MonadTrav m) => (DefTable -> DefTable) -> m ()+updDefTable :: (MonadSymtab m) => (DefTable -> DefTable) -> m () updDefTable f = withDefTable (\st -> ((),f st)) -enterPrototypeScope :: (MonadTrav m) => m ()+enterPrototypeScope :: (MonadSymtab m) => m () enterPrototypeScope = updDefTable (ST.enterBlockScope) -leavePrototypeScope :: (MonadTrav m) => m ()+leavePrototypeScope :: (MonadSymtab m) => m () leavePrototypeScope = updDefTable (ST.leaveBlockScope) -enterFunctionScope :: (MonadTrav m) => m ()+enterFunctionScope :: (MonadSymtab m) => m () enterFunctionScope = updDefTable (ST.enterFunctionScope) -leaveFunctionScope :: (MonadTrav m) => m ()+leaveFunctionScope :: (MonadSymtab m) => m () leaveFunctionScope = updDefTable (ST.leaveFunctionScope) -enterBlockScope :: (MonadTrav m) => m ()+enterBlockScope :: (MonadSymtab m) => m () enterBlockScope = updDefTable (ST.enterBlockScope) -leaveBlockScope :: (MonadTrav m) => m ()+leaveBlockScope :: (MonadSymtab m) => m () leaveBlockScope = updDefTable (ST.leaveBlockScope)  -- * Lookup@@ -262,27 +297,42 @@ -- the 'wrong kind of object' is an internal error here, -- because the parser should distinguish typeDefs and other -- objects-lookupTypeDef :: (MonadTrav m) => Ident -> m Type+lookupTypeDef :: (MonadCError m, MonadSymtab m) => Ident -> m Type lookupTypeDef ident =     getDefTable >>= \symt ->     case lookupIdent ident symt of-        Nothing                             -> astError (nodeInfo ident) "unbound typeDef"-        Just (Left (TypeDef _ident ty _ _)) -> return ty+        Nothing                             ->+          astError (nodeInfo ident) $ "unbound typeDef: " ++ identToString ident+        Just (Left (TypeDef def_ident ty _ _)) -> addRef ident def_ident >> return ty         Just (Right d)                      -> astError (nodeInfo ident) (wrongKindErrMsg d)     where-    wrongKindErrMsg d = "wrong kind of object: excepcted typeDef but found: "++(objKindDescr d)+    wrongKindErrMsg d = "wrong kind of object: expected typedef but found "++ (objKindDescr d)+                        ++ " (for identifier `" ++ identToString ident ++ "')"   -- | lookup an object, function or enumerator-lookupObject :: (MonadTrav m) => Ident -> m (Maybe IdentDecl)+lookupObject :: (MonadCError m, MonadSymtab m) => Ident -> m (Maybe IdentDecl) lookupObject ident = do     old_decl <- liftM (lookupIdent ident) getDefTable     mapMaybeM old_decl $ \obj ->         case obj of-        Right objdef -> return objdef+        Right objdef -> addRef ident objdef >> return objdef         Left _tydef  -> astError (nodeInfo ident) (mismatchErr "lookupObject" "an object" "a typeDef") +-- | add link between use and definition (private)+addRef :: (MonadCError m, MonadSymtab m, CNode u, CNode d) => u -> d -> m ()+addRef use def =+  case (nodeInfo use, nodeInfo def) of+    (NodeInfo _ _ useName, NodeInfo _ _ defName) ->+      withDefTable+      (\dt ->+         ((),+          dt { refTable = insert (nameId useName) defName (refTable dt) }+         )+      )+    (_, _) -> return () -- Don't have Names for both, so can't record. + mismatchErr :: String -> String -> String -> String mismatchErr ctx expect found = ctx ++ ": Expected " ++ expect ++ ", but found: " ++ found @@ -293,30 +343,30 @@ -- This currently depends on the fact the structs are tagged with unique names. -- We could use the name generation of TravMonad as well, which might be the better -- choice when dealing with autogenerated code.-createSUERef :: (MonadTrav m) => NodeInfo -> Maybe Ident -> m SUERef+createSUERef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Maybe Ident -> m SUERef createSUERef _node_info (Just ident) = return$ NamedRef ident createSUERef node_info Nothing | (Just name) <- nameOfNode node_info = return $ AnonymousRef name                                | otherwise = astError node_info "struct/union/enum definition without unique name"  -- * error handling facilities -handleTravError :: (MonadTrav m) => m a -> m (Maybe a)+handleTravError :: (MonadCError m) => m a -> m (Maybe a) handleTravError a = liftM Just a `catchTravError` (\e -> recordError e >> return Nothing) --- | check wheter non-recoverable errors occured+-- | check wheter non-recoverable errors occurred hadHardErrors :: [CError] -> Bool hadHardErrors = (not . null . filter isHardError)  -- | raise an error caused by a malformed AST-astError :: (MonadTrav m) => NodeInfo -> String -> m a+astError :: (MonadCError m) => NodeInfo -> String -> m a astError node msg = throwTravError $ invalidAST node msg  -- | raise an error based on an Either argument-throwOnLeft :: (MonadTrav m, Error e) => Either e a -> m a+throwOnLeft :: (MonadCError m, Error e) => Either e a -> m a throwOnLeft (Left err) = throwTravError err throwOnLeft (Right v)  = return v -warn :: (Error e, MonadTrav m) => e -> m ()+warn :: (Error e, MonadCError m) => e -> m () warn err = recordError (changeErrorLevel err LevelWarn)  -- * The Trav datatype@@ -332,6 +382,7 @@ put :: TravState s -> Trav s () put s    = Trav (\_ -> Right ((),s)) + runTrav :: forall s a. s -> Trav s a -> Either [CError] (a, TravState s) runTrav state traversal =     case unTrav action (initTravState state) of@@ -339,12 +390,8 @@         Right (v, ts) | hadHardErrors (travErrors ts) -> Left (travErrors ts)                       | otherwise                     -> Right (v,ts)     where-    action = do withDefTable $ defineTypeDef (identOfTypeDef va_list) va_list+    action = do withDefTable (const ((), builtins))                 traversal-    va_list = (TypeDef (internalIdent "__builtin_va_list")-                       (DirectType (TyBuiltin TyVaList) noTypeQuals)-                       []-                       (internalNode))  runTrav_ :: Trav () a -> Either [CError] (a,[CError]) runTrav_ t = fmap fst . runTrav () $@@ -363,14 +410,11 @@                               Right (x,s1) -> unTrav (k x) s1                               Left e       -> Left e) -instance MonadTrav (Trav s) where-    -- error handling facilities-    throwTravError e = Trav (\_ -> Left (toError e))-    catchTravError a handler = Trav (\s -> case unTrav a s of-                                             Left e  -> unTrav (handler e) s-                                             Right r -> Right r)-    recordError e = modify $ \st -> st { rerrors = (rerrors st) `snoc` toError e }-    getErrors = gets (RList.reverse . rerrors)+instance MonadName (Trav s) where+    -- unique name generation+    genName = generateName++instance MonadSymtab (Trav s) where     -- symbol table handling     getDefTable = gets symbolTable     withDefTable f = do@@ -378,18 +422,36 @@         let (r,symt') = f (symbolTable ts)         put $ ts { symbolTable = symt' }         return r-    -- unique name generation-    genName = generateName++instance MonadCError (Trav s) where+    -- error handling facilities+    throwTravError e = Trav (\_ -> Left (toError e))+    catchTravError a handler = Trav (\s -> case unTrav a s of+                                             Left e  -> unTrav (handler e) s+                                             Right r -> Right r)+    recordError e = modify $ \st -> st { rerrors = (rerrors st) `snoc` toError e }+    getErrors = gets (RList.reverse . rerrors)++instance MonadTrav (Trav s) where     -- handling declarations and definitions     handleDecl d = ($ d) =<< gets doHandleExtDecl +-- | The variety of the C language to accept. Note: this is not yet enforced.+data CLanguage = C89 | C99 | GNU89 | GNU99++data TravOptions =+    TravOptions {+        language :: CLanguage+    }+ data TravState s =     TravState {         symbolTable :: DefTable,         rerrors :: RList CError,         nameGenerator :: [Name],         doHandleExtDecl :: (DeclEvent -> Trav s ()),-        userState :: s+        userState :: s,+        options :: TravOptions       }  travErrors :: TravState s -> [CError]@@ -402,12 +464,19 @@         rerrors = RList.empty,         nameGenerator = newNameSupply,         doHandleExtDecl = const (return ()),-        userState = userst+        userState = userst,+        options = TravOptions { language = C99 }       }  -- * Trav specific operations modifyUserState :: (s -> s) -> Trav s () modifyUserState f = modify $ \ts -> ts { userState = f (userState ts) }++getUserState :: Trav s s+getUserState = userState `liftM` get++modifyOptions :: (TravOptions -> TravOptions) -> Trav s ()+modifyOptions f = modify $ \ts -> ts { options = f (options ts) }  generateName :: Trav s Name generateName =
+ src/Language/C/Analysis/TypeCheck.hs view
@@ -0,0 +1,452 @@+{-# LANGUAGE FlexibleInstances, CPP #-}+module Language.C.Analysis.TypeCheck where++import Control.Monad+import Data.Either+import Data.Maybe+import Language.C.Data.Ident+import Language.C.Data.Node+import Language.C.Data.Position+import Language.C.Pretty+import Language.C.Syntax.AST+import Language.C.Syntax.Constants+import Language.C.Syntax.Ops+import Language.C.Analysis.Debug+import Language.C.Analysis.DefTable+import Language.C.Analysis.SemRep+import Language.C.Analysis.TravMonad+import Language.C.Analysis.TypeConversions+import Language.C.Analysis.TypeUtils+import Text.PrettyPrint.HughesPJ++-- We used to re-implement and export the standard Either instance for+-- Monad, which is bad, because as of GHC 7 it is in Control.Monad.Instances+-- in base >4.2. For backwards compatibility with ghc-6.X, we use CPP here.+#if __GLASGOW_HASKELL__ < 700+instance Monad (Either String) where+    return        = Right+    Left  l >>= _ = Left l+    Right r >>= k = k r+    fail msg      = Left msg+#endif++pType :: Type -> String+pType = render . pretty++typeErrorOnLeft :: (MonadCError m) => NodeInfo -> Either String a -> m a+typeErrorOnLeft ni (Left err) = typeError ni err+typeErrorOnLeft _  (Right v)  = return v++-- XXX: this should use a custom error type, but typeMismatch isn't always right+typeError :: MonadCError m => NodeInfo -> String -> m a+typeError = astError++notFound :: Ident -> Either String a+notFound i = fail $ "not found: " ++ identToString i++checkScalar' :: MonadCError m => NodeInfo -> Type -> m ()+checkScalar' ni = typeErrorOnLeft ni . checkScalar++checkIntegral' :: MonadCError m => NodeInfo -> Type -> m ()+checkIntegral' ni = typeErrorOnLeft ni . checkIntegral++assignCompatible' :: MonadCError m =>+                     NodeInfo -> CAssignOp -> Type -> Type -> m ()+assignCompatible' ni op t1 t2 = typeErrorOnLeft ni (assignCompatible op t1 t2)++binopType' :: MonadCError m =>+              NodeInfo -> CBinaryOp -> Type -> Type -> m Type+binopType' ni op t1 t2 = typeErrorOnLeft ni (binopType op t1 t2)++conditionalType' :: MonadCError m => NodeInfo -> Type -> Type -> m Type+conditionalType' ni t1 t2 = typeErrorOnLeft ni $ conditionalType t1 t2++checkScalar :: Type -> Either String ()+checkScalar t =+  case canonicalType t of+    DirectType _ _ _  -> return ()+    PtrType _ _ _     -> return ()+    ArrayType _ _ _ _ -> return () -- because it's just a pointer+    t' -> fail $+          "expected scalar type, got: "+          ++ pType t ++ " (" ++ pType t' ++ ")"++checkIntegral :: Type -> Either String ()+checkIntegral t | isIntegralType (canonicalType t) = return ()+                | otherwise = fail $+                              "expected integral type, got: " +++                              pType t ++ " (" +++                              pType (canonicalType t) ++ ")"++-- | Determine the type of a constant.+constType :: (MonadCError m, MonadName m) => CConst -> m Type+constType (CIntConst (CInteger _ _ flags) _) =+  return $ DirectType (TyIntegral (getIntType flags)) noTypeQuals noAttributes+constType (CCharConst (CChar _ True) _) =+  return $ DirectType (TyIntegral TyInt) noTypeQuals noAttributes+constType (CCharConst (CChar _ False) _) =+  return $ DirectType (TyIntegral TyChar) noTypeQuals noAttributes+constType (CCharConst (CChars _ _) _)  =+  return $ DirectType (TyIntegral TyInt) noTypeQuals noAttributes -- XXX+constType (CFloatConst (CFloat fs) _) =+  return $ DirectType (TyFloating (getFloatType fs)) noTypeQuals noAttributes+-- XXX: should strings have any type qualifiers or attributes?+constType (CStrConst (CString chars wide) ni) =+  do n <- genName+     let charType | wide      = TyInt -- XXX: this isn't universal+                  | otherwise = TyChar+         ni' = mkNodeInfo (posOf ni) n+         arraySize = ArraySize+                     True -- XXX: is it static?+                     (CConst+                      (CIntConst+                       (cInteger (toInteger (length chars))) ni'))+     return $ ArrayType (DirectType (TyIntegral charType) noTypeQuals noAttributes)+                        arraySize noTypeQuals []++-- | Determine whether two types are compatible.+compatible :: Type -> Type -> Either String ()+compatible t1 t2 = compositeType t1 t2 >> return ()++-- | Determine the composite type of two compatible types.+compositeType :: Type -> Type -> Either String Type+compositeType t1 (DirectType (TyBuiltin TyAny) _ _) = return t1+compositeType (DirectType (TyBuiltin TyAny) _ _) t2 = return t2+compositeType t1@(DirectType tn1 q1 a1) t2@(DirectType tn2 q2 a2) =+  do tn <- case (tn1, tn2) of+             (TyVoid, TyVoid) -> return TyVoid+             (TyIntegral _, TyEnum _) -> return tn1+             (TyEnum _, TyIntegral _) -> return tn2+             (TyIntegral i1, TyIntegral i2) ->+               return $ TyIntegral (intConversion i1 i2)+             (TyFloating f1, TyFloating f2) ->+               return $ TyFloating (floatConversion f1 f2)+             (TyComplex f1, TyComplex f2) ->+               return $ TyComplex (floatConversion f1 f2)+             (TyComp c1, TyComp c2) ->+               do when (sueRef c1 /= sueRef c2) $+                       fail $ "incompatible composite types: "+                              ++ pType t1 ++ ", " ++ pType t2+                  return tn1+             (TyEnum e1, TyEnum e2) ->+               do when (sueRef e1 /= sueRef e2) $+                       fail $ "incompatible enumeration types: "+                              ++ pType t1 ++ ", " ++ pType t2+                  return $ TyEnum e1+             (TyBuiltin TyVaList, TyBuiltin TyVaList) ->+               return $ TyBuiltin TyVaList+             (TyBuiltin _, TyBuiltin _) ->+               fail $ "incompatible builtin types: "+                      ++ pType t1 ++ ", " ++ pType t2+             (_, _) -> fail $ "incompatible direct types: "+                       ++ pType t1 ++ ", " ++ pType t2+     return $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)+compositeType (PtrType t1 q1 a1) (PtrType (DirectType TyVoid _ _) q2 _) =+  return $ PtrType t1 (mergeTypeQuals q1 q2) a1+compositeType (PtrType (DirectType TyVoid _ _) q1 _) (PtrType t2 q2 a2) =+  return $ PtrType t2 (mergeTypeQuals q1 q2) a2+compositeType (PtrType t1 q1 a1) t2 | isIntegralType t2 =+  return $ PtrType t1 (mergeTypeQuals q1 (typeQuals t2)) a1+compositeType t1 (PtrType t2 q2 a2) | isIntegralType t1 =+  return $ PtrType t2 (mergeTypeQuals (typeQuals t1) q2) a2+compositeType (ArrayType t1 sz1 q1 a1) t2 | isIntegralType t2 =+  return $ PtrType t1 q1 a1+compositeType t1 (ArrayType t2 sz2 q2 a2) | isIntegralType t1 =+  return $ PtrType t2 q2 a2+compositeType (ArrayType t1 s1 q1 a1) (ArrayType t2 s2 q2 a2) =+  do t <- compositeType t1 t2+     s <- compositeSize s1 s2+     let quals = mergeTypeQuals q1 q2+         attrs = mergeAttrs a1 a2+     return (ArrayType t s quals attrs)+compositeType t1 t2 | isPointerType t1 && isPointerType t2 =+  do t <- compositeType (baseType t1) (baseType t2)+     let quals = mergeTypeQuals (typeQuals t1) (typeQuals t2)+         attrs = mergeAttrs (typeAttrs t1) (typeAttrs t2)+     return (PtrType t quals attrs)+compositeType (TypeDefType tdr1 q1 a1) (TypeDefType tdr2 q2 a2) =+  case (tdr1, tdr2) of+    (TypeDefRef i1 Nothing _, TypeDefRef i2 _ _) -> doTypeDef i1 i2 tdr1+    (TypeDefRef i1 _ _, TypeDefRef i2 Nothing _) -> doTypeDef i1 i2 tdr2+    (TypeDefRef _ (Just t1) _, TypeDefRef _ (Just t2) _) ->+      compositeType t1 t2+  where doTypeDef i1 i2 tdr =+          do when (i1 /= i2) $ fail $ "incompatible typedef types: "+                               ++ identToString i1 ++ ", " ++ identToString i2+             return (TypeDefType tdr (mergeTypeQuals q1 q2) (mergeAttributes a1 a2))+compositeType (FunctionType ft1 attrs1) (FunctionType ft2 attrs2) =+  case (ft1, ft2) of+    (FunType rt1 args1 varargs1, FunType rt2 args2 varargs2) ->+      do {- when (length args1 /= length args2) $+              fail "different numbers of arguments in function types" -}+         args <- mapM (uncurry compositeParamDecl) (zip args1 args2)+         when (varargs1 /= varargs2) $+              fail "incompatible varargs declarations"+         doFunType rt1 rt2 args varargs1+    (FunType rt1 args1 varargs1, FunTypeIncomplete rt2) ->+      doFunType rt1 rt2 args1 varargs1+    (FunTypeIncomplete rt1, FunType rt2 args2 varargs2) ->+      doFunType rt1 rt2 args2 varargs2+    (FunTypeIncomplete rt1, FunTypeIncomplete rt2) ->+      do rt <- compositeType rt1 rt2+         return (FunctionType (FunTypeIncomplete rt) (mergeAttrs attrs1 attrs2))+  where doFunType rt1 rt2 args varargs =+          do rt <- compositeType rt1 rt2+             return (FunctionType+                     (FunType rt args varargs)+                     (mergeAttrs attrs1 attrs2))+compositeType t1 t2 = fail $ "incompatible types: "+                         ++ pType t1 ++ ", " ++ pType t2++-- XXX: this may not be correct+compositeSize :: ArraySize -> ArraySize -> Either String ArraySize+compositeSize (UnknownArraySize _) s2 = return s2+compositeSize s1 (UnknownArraySize _) = return s1+compositeSize (ArraySize s1 e1) (ArraySize s2 e2)+  | s1 == s2 && sizeEqual e1 e2 = return $ ArraySize s1 e1+  | otherwise = return $ ArraySize s1 e1+{-+    fail $ "incompatible array sizes: "+           ++ (render . pretty) e1 ++ ", " ++ (render . pretty) e2+-}++sizeEqual :: CExpr -> CExpr -> Bool+sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2+sizeEqual e1 e2 = nodeInfo e1 == nodeInfo e2++mergeAttrs :: Attributes -> Attributes -> Attributes+mergeAttrs = (++) -- XXX: ultimately this should be smarter++compositeParamDecl :: ParamDecl -> ParamDecl -> Either String ParamDecl+compositeParamDecl (ParamDecl vd1 ni1) (ParamDecl vd2 _) =+  compositeParamDecl' ParamDecl vd1 vd2 ni1+compositeParamDecl (AbstractParamDecl vd1 _) (ParamDecl vd2 ni2) =+  compositeParamDecl' ParamDecl vd1 vd2 ni2+compositeParamDecl (ParamDecl vd1 ni1) (AbstractParamDecl vd2 _) =+  compositeParamDecl' ParamDecl vd1 vd2 ni1+compositeParamDecl (AbstractParamDecl vd1 ni1) (AbstractParamDecl vd2 _) =+  compositeParamDecl' AbstractParamDecl vd1 vd2 ni1++compositeParamDecl' :: (VarDecl -> NodeInfo -> ParamDecl)+                    -> VarDecl+                    -> VarDecl+                    -> NodeInfo+                    -> Either String ParamDecl+compositeParamDecl' f (VarDecl n1 attrs1 t1) (VarDecl n2 attrs2 t2) dni =+  do vd <- compositeVarDecl (VarDecl n1 attrs1 t1') (VarDecl n2 attrs2 t2')+     return $ f vd dni+  where t1' = canonicalType t1+        t2' = canonicalType t2++compositeVarDecl :: VarDecl -> VarDecl -> Either String VarDecl+compositeVarDecl (VarDecl n1 attrs1 t1) (VarDecl _ attrs2 t2) =+  do t <- compositeType t1 t2+     return (VarDecl n1 (compositeDeclAttrs attrs1 attrs2) t)++-- XXX: bad treatement of inline and storage+compositeDeclAttrs :: DeclAttrs -> DeclAttrs -> DeclAttrs+compositeDeclAttrs (DeclAttrs inl stor attrs1) (DeclAttrs _ _ attrs2) =+  DeclAttrs inl stor (mergeAttrs attrs1 attrs2)++castCompatible :: Type -> Type -> Either String ()+castCompatible t1 t2 =+  case (canonicalType t1, canonicalType t2) of+    (DirectType TyVoid _ _, _) -> return ()+    (_, _) -> checkScalar t1 >> checkScalar t2++-- | Determine whether two types are compatible in an assignment expression.+assignCompatible :: CAssignOp -> Type -> Type -> Either String ()+assignCompatible CAssignOp t1 t2 =+  case (canonicalType t1, canonicalType t2) of+    (DirectType (TyBuiltin TyAny) _ _, _) -> return ()+    (_, DirectType (TyBuiltin TyAny) _ _) -> return ()+    -- XXX: check qualifiers+    (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> return ()+    -- XXX: check qualifiers+    (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> return ()+    (PtrType _ _ _, t2') | isIntegralType t2' -> return ()+    (t1', t2') | isPointerType t1' && isPointerType t2' ->+                 do compatible (baseType t1') (baseType t2')+                --unless (typeQuals t2 <= typeQuals t1) $+                --       fail $+                --       "incompatible qualifiers in pointer assignment: "+                --       ++ pType t1 ++ ", " ++ pType t2+    (DirectType (TyComp c1) _ _, DirectType (TyComp c2) _ _)+      | sueRef c1 == sueRef c2 -> return ()+      | otherwise -> fail $+                     "incompatible compound types in assignment: "+                     ++ pType t1 ++ ", " ++ pType t2+    (DirectType (TyBuiltin TyVaList) _ _, DirectType (TyBuiltin TyVaList) _ _) ->+      return ()+    (DirectType tn1 _ _, DirectType tn2 _ _)+      | isJust (arithmeticConversion tn1 tn2) -> return ()+      | otherwise -> fail $ "incompatible direct types in assignment: "+                     ++ pType t1 ++ ", " ++ pType t2+    (t1', t2') -> compatible t1' t2'+assignCompatible op t1 t2 = binopType (assignBinop op) t1 t2 >> return ()++-- | Determine the type of a binary operation.+binopType :: CBinaryOp -> Type -> Type -> Either String Type+binopType op t1 t2 =+  case (op, canonicalType t1, canonicalType t2) of+    (_, t1', t2')+      | isLogicOp op ->+        checkScalar t1' >> checkScalar t2' >> return boolType+      | isCmpOp op ->+        case (t1', t2') of+          (DirectType tn1 _ _, DirectType tn2 _ _) ->+                case arithmeticConversion tn1 tn2 of+                  Just _ -> return boolType+                  Nothing -> fail+                             "incompatible arithmetic types in comparison"+          (PtrType (DirectType TyVoid _ _) _ _, _)+            | isPointerType t2' -> return boolType+          (_, PtrType (DirectType TyVoid _ _) _ _)+            | isPointerType t1' -> return boolType+          (_, _)+            | isPointerType t1' && isIntegralType t2' -> return boolType+            | isIntegralType t1' && isPointerType t2' -> return boolType+            | isPointerType t1' && isPointerType t2' ->+              compatible t1' t2' >> return boolType+          (_, _) -> fail "incompatible types in comparison"+    (CSubOp, ArrayType t1' _ _ _, ArrayType t2' _ _ _) ->+      compatible t1' t2' >> return ptrDiffType+    (CSubOp, ArrayType t1' _ _ _, PtrType t2' _ _) ->+      compatible t1' t2' >> return ptrDiffType+    (CSubOp, PtrType t1' _ _, ArrayType t2' _ _ _) ->+      compatible t1' t2' >> return ptrDiffType+    (CSubOp, PtrType t1' _ _, PtrType t2' _ _) ->+      compatible t1' t2' >> return ptrDiffType+    (_, PtrType _ _ _, t2')+      | isPtrOp op && isIntegralType t2' -> return t1+      | otherwise -> fail $ "invalid pointer operation: " ++ render (pretty op)+    (CAddOp, t1', PtrType _ _ _) | isIntegralType t1' -> return t2+    (_, ArrayType _ _ _ _, t2')+      | isPtrOp op && isIntegralType t2' -> return t1+      | otherwise -> fail $ "invalid pointer operation: " ++ render (pretty op)+    (CAddOp, t1', ArrayType _ _ _ _) | isIntegralType t1' -> return t2+    (_, DirectType tn1 q1 a1, DirectType tn2 q2 a2) ->+        do when (isBitOp op) (checkIntegral t1 >> checkIntegral t2)+           case arithmeticConversion tn1 tn2 of+             Just tn -> return $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)+             Nothing -> fail $ render $+                        text "invalid binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2+    (_, _, _) -> fail $ render $+                 text "unhandled binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2++-- | Determine the type of a conditional expression.+conditionalType :: Type -> Type -> Either String Type+conditionalType t1 t2 =+  case (canonicalType t1, canonicalType t2) of+    (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> return t2+    (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> return t1+    (ArrayType t1' _ q1 a1, ArrayType t2' _ q2 a2) ->+      do t <- compositeType t1' t2'+         return $ ArrayType t (UnknownArraySize False)+                  (mergeTypeQuals q1 q2) (mergeAttrs a1 a2)+    (t1'@(DirectType tn1 q1 a1), t2'@(DirectType tn2 q2 a2)) ->+      case arithmeticConversion tn1 tn2 of+        Just tn -> return $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)+        Nothing -> compositeType t1' t2'+    (t1', t2') -> compositeType t1' t2'++derefType :: Type -> Either String Type+derefType (PtrType t _ _) = return t+derefType (ArrayType t _ _ _) = return t+derefType t =+  -- XXX: is it good to use canonicalType here?+  case canonicalType t of+    PtrType t' _ _ -> return t'+    ArrayType t' _ _ _ -> return t'+    _ -> fail $ "dereferencing non-pointer: " ++ pType t++varAddrType :: IdentDecl -> Either String Type+varAddrType d =+  do case declStorage d of+       Auto True -> fail "address of register variable"+       _         -> return ()+     case t of+       ArrayType _ _ q a -> return $ PtrType t q a+       _                 -> return $ simplePtr t+  where t = declType d++-- | Get the type of field @m@ of type @t@+fieldType :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> Type -> m Type+fieldType ni m t =+  case canonicalType t of+    DirectType (TyComp ctr) _ _ ->+      do td <- lookupSUE ni (sueRef ctr)+         ms <- tagMembers ni td+         case lookup m ms of+           Just ft -> return ft+           Nothing -> typeError ni $ "field not found: " ++ identToString m+    _t' -> astError ni $+          "field of non-composite type: " ++ identToString m+          ++ ", " ++ pType t++-- | Get all members of a struct, union, or enum, with their+--   types. Collapse fields of anonymous members.+tagMembers :: (MonadCError m, MonadSymtab m) =>+              NodeInfo -> TagDef -> m [(Ident, Type)]+tagMembers ni td =+  case td of+    CompDef (CompType _ _ ms _ _) -> getMembers ms+    EnumDef (EnumType _ es _ _) -> getMembers es+  where getMembers ds =+          do let ts = map declType ds+                 ns = map declName ds+             concat `liftM` mapM (expandAnonymous ni) (zip ns ts)++-- | Expand an anonymous composite type into a list of member names+--   and their associated types.+expandAnonymous :: (MonadCError m, MonadSymtab m) =>+                   NodeInfo -> (VarName, Type)+                -> m [(Ident, Type)]+expandAnonymous ni (NoName, DirectType (TyComp ctr) _ _) =+  lookupSUE ni (sueRef ctr) >>= tagMembers ni+expandAnonymous _ (NoName, _) = return []+expandAnonymous _ (VarName n _, t) = return [(n, t)]++lookupSUE :: (MonadCError m, MonadSymtab m) =>+             NodeInfo -> SUERef -> m TagDef+lookupSUE ni sue =+  do dt <- getDefTable+     case lookupTag sue dt of+       Just (Right td) -> return td+       _               ->+         typeError ni $ "unknown composite type: " ++ (render . pretty) sue++deepTypeAttrs :: (MonadCError m, MonadSymtab m) =>+                 Type -> m Attributes+deepTypeAttrs (DirectType (TyComp (CompTypeRef sue _ ni)) _ attrs) =+  (attrs ++) `liftM` sueAttrs ni sue+deepTypeAttrs (DirectType (TyEnum (EnumTypeRef sue ni)) _ attrs) =+  (attrs ++) `liftM` sueAttrs ni sue+deepTypeAttrs (DirectType _ _ attrs) = return attrs+deepTypeAttrs (PtrType t _ attrs) = (attrs ++) `liftM` deepTypeAttrs t+deepTypeAttrs (ArrayType t _ _ attrs) = (attrs ++) `liftM` deepTypeAttrs t+deepTypeAttrs (FunctionType (FunType t _ _) attrs) =+  (attrs ++) `liftM` deepTypeAttrs t+deepTypeAttrs (FunctionType (FunTypeIncomplete t)  attrs) =+  (attrs ++) `liftM` deepTypeAttrs t+deepTypeAttrs (TypeDefType (TypeDefRef i _ ni) _ attrs) =+  (attrs ++) `liftM` typeDefAttrs ni i++typeDefAttrs :: (MonadCError m, MonadSymtab m) =>+                NodeInfo -> Ident -> m Attributes+typeDefAttrs ni i =+  do dt <- getDefTable+     case lookupIdent i dt of+       Nothing -> astError ni $ "can't find typedef name: " ++ identToString i+       Just (Left (TypeDef _ t attrs _)) -> (attrs ++) `liftM` deepTypeAttrs t+       Just (Right _) -> astError ni $ "not a typedef name: " ++ identToString i++sueAttrs :: (MonadCError m, MonadSymtab m) =>+            NodeInfo -> SUERef -> m Attributes+sueAttrs ni sue =+  do dt <- getDefTable+     case lookupTag sue dt of+       Nothing -> astError ni $ "SUE not found: " ++ render (pretty sue)+       Just (Left _) -> return []+       Just (Right (CompDef (CompType _ _ _ attrs _))) -> return attrs+       Just (Right (EnumDef (EnumType _ _ attrs _))) -> return attrs
+ src/Language/C/Analysis/TypeConversions.hs view
@@ -0,0 +1,39 @@+module Language.C.Analysis.TypeConversions (+    arithmeticConversion,+    floatConversion,+    intConversion+) where++import Language.C.Analysis.SemRep++-- | For an arithmetic operator, if the arguments are of the given+--   types, return the type of the full expression.+arithmeticConversion :: TypeName -> TypeName -> Maybe TypeName+-- XXX: I'm assuming that double `op` complex float = complex+-- double. The standard seems somewhat unclear on whether this is+-- really the case.+arithmeticConversion (TyComplex t1) (TyComplex t2) =+  Just $ TyComplex $ floatConversion t1 t2+arithmeticConversion (TyComplex t1) (TyFloating t2) =+  Just $ TyComplex $ floatConversion t1 t2+arithmeticConversion (TyFloating t1) (TyComplex t2) =+  Just $ TyComplex $ floatConversion t1 t2+arithmeticConversion t1@(TyComplex _) (TyIntegral _) = Just t1+arithmeticConversion (TyIntegral _) t2@(TyComplex _) = Just t2+arithmeticConversion (TyFloating t1) (TyFloating t2) =+  Just $ TyFloating $ floatConversion t1 t2+arithmeticConversion t1@(TyFloating _) (TyIntegral _) = Just t1+arithmeticConversion (TyIntegral _) t2@(TyFloating _) = Just t2+arithmeticConversion (TyIntegral t1) (TyIntegral t2) =+  Just $ TyIntegral $ intConversion t1 t2+arithmeticConversion (TyEnum _) (TyEnum _) = Just $ TyIntegral TyInt+arithmeticConversion (TyEnum _) t2 = Just $ t2+arithmeticConversion t1 (TyEnum _) = Just $ t1+arithmeticConversion _ _ = Nothing++floatConversion :: FloatType -> FloatType -> FloatType+floatConversion = max++intConversion :: IntType -> IntType -> IntType+intConversion t1 t2 = max TyInt (max t1 t2)+
+ src/Language/C/Analysis/TypeUtils.hs view
@@ -0,0 +1,237 @@+module Language.C.Analysis.TypeUtils (+    -- * Constructors+    integral,+    floating,+    simplePtr,+    size_tType,+    ptrDiffType,+    boolType,+    voidType,+    voidPtr,+    constVoidPtr,+    charPtr,+    constCharPtr,+    stringType,+    valistType,+    -- * Classifiers+    isIntegralType,+    isFloatingType,+    isPointerType,+    isScalarType,+    isFunctionType,+    -- Extractors+    typeQuals,+    typeQualsUpd,+    typeAttrs,+    typeAttrsUpd,+    baseType,+    derefTypeDef,+    deepDerefTypeDef,+    canonicalType,+    -- * Other utilities+    getIntType,+    getFloatType+) where++import Language.C.Analysis.SemRep+import Language.C.Syntax.Constants++instance Eq TypeQuals where+ (==) (TypeQuals c1 v1 r1) (TypeQuals c2 v2 r2) =+    c1 == c2 && v1 == v2 && r1 == r2++instance Ord TypeQuals where+  (<=) (TypeQuals c1 v1 r1) (TypeQuals c2 v2 r2) =+    c1 <= c2 && v1 <= v2 && r1 <= r2++-- | Constructor for a simple integral type.+integral :: IntType -> Type+integral ty = DirectType (TyIntegral ty) noTypeQuals noAttributes++-- | Constructor for a simple floating-point type.+floating :: FloatType -> Type+floating ty = DirectType (TyFloating ty) noTypeQuals noAttributes++-- | A simple pointer with no qualifiers+simplePtr :: Type -> Type+simplePtr t = PtrType t noTypeQuals []++-- | A pointer with the @const@ qualifier.+constPtr :: Type -> Type+constPtr t = PtrType t (TypeQuals True False False) []++-- | The type returned by sizeof (size_t). For now, this is just @int@.+size_tType :: Type+size_tType = integral TyInt++-- | The type of pointer differences (ptrdiff_t). For now, this is just @int@.+ptrDiffType :: Type+ptrDiffType = integral TyInt++-- | The type of comparisons\/guards. This is always just @int@.+boolType :: Type+boolType = integral TyInt++-- | Simple @void@ type.+voidType :: Type+voidType = DirectType TyVoid noTypeQuals noAttributes++-- | An unqualified @void@ pointer.+voidPtr :: Type+voidPtr = simplePtr voidType++-- | A @const@-qualified @void@ pointer.+constVoidPtr :: Type+constVoidPtr = constPtr voidType++-- | An unqualified @char@ pointer.+charPtr :: Type+charPtr = simplePtr (integral TyChar)++-- | A @const@-qualified @char@ pointer.+constCharPtr :: Type+constCharPtr = constPtr (integral TyChar)++-- | The type of a constant string.+stringType :: Type+stringType  = ArrayType+              (DirectType (TyIntegral TyChar) (TypeQuals True False False) noAttributes)+              (UnknownArraySize False)+              noTypeQuals+              []++-- | The builtin type of variable-length argument lists.+valistType :: Type+valistType  = DirectType (TyBuiltin TyVaList) noTypeQuals noAttributes++-- | Check whether a type is an integral type. This includes @enum@+--   types. This function does not attempt to resolve @typedef@ types.+isIntegralType :: Type -> Bool+isIntegralType (DirectType (TyIntegral _) _ _) = True+isIntegralType (DirectType (TyEnum _) _ _)     = True+isIntegralType _                             = False++-- | Check whether a type is a floating-point numeric type. This+--   function does not attempt to resolve @typedef@ types.+isFloatingType :: Type -> Bool+isFloatingType (DirectType (TyFloating _) _ _) = True+isFloatingType _                             = False++-- | Check whether a type is an pointer type. This includes array+--   types. This function does not attempt to resolve @typedef@ types.+isPointerType :: Type -> Bool+isPointerType (PtrType _ _ _) = True+isPointerType (ArrayType _ _ _ _) = True+isPointerType _ = False++-- | Check whether a type is a scalar type. Scalar types include+--   arithmetic types and pointer types.+isScalarType :: Type -> Bool+isScalarType t = isIntegralType t || isPointerType t || isFloatingType t++-- | return @True@ if the given type is a function type+--+--   Result is undefined in the presence of undefined typeDefs+isFunctionType :: Type -> Bool+isFunctionType ty =+    case ty of  TypeDefType (TypeDefRef _ (Just actual_ty) _) _ _ -> isFunctionType actual_ty+                TypeDefType _ _ _ -> error "isFunctionType: unresolved typeDef"+                FunctionType _ _ -> True+                _ -> False++-- | Return the qualifiers of a type.+typeQuals :: Type -> TypeQuals+typeQuals (DirectType _ q _) = q+typeQuals (PtrType _ q _) = q+typeQuals (ArrayType _ _ q _) = q+typeQuals (FunctionType _ _) = noTypeQuals+typeQuals (TypeDefType (TypeDefRef _ Nothing _)  q _) = q+typeQuals (TypeDefType (TypeDefRef _ (Just t) _) q _) = mergeTypeQuals q (typeQuals t)++--  |Update type qualifiers+--   For function types, it is an error to change any type qualifiers+--   For typedef types, the result is stored in the typedef attribute field+typeQualsUpd :: (TypeQuals -> TypeQuals) -> Type -> Type+typeQualsUpd f ty =+    case ty of DirectType ty_name ty_quals ty_attrs -> DirectType ty_name (f ty_quals) ty_attrs+               PtrType ty_inner ty_quals ty_attrs         -> PtrType ty_inner (f ty_quals) ty_attrs+               ArrayType ty_inner sz ty_quals ty_attrs    -> ArrayType ty_inner sz (f ty_quals) ty_attrs+               FunctionType ty_inner ty_attrs             -> FunctionType ty_inner ty_attrs+               TypeDefType ty_ref ty_quals ty_attrs -> TypeDefType ty_ref (f ty_quals) ty_attrs++-- | Return the attributes of a type.+typeAttrs :: Type -> Attributes+typeAttrs (DirectType _ _ a) = a+typeAttrs (PtrType _ _ a) = a+typeAttrs (ArrayType _ _ _ a) = a+typeAttrs (FunctionType _ a) = a+typeAttrs (TypeDefType (TypeDefRef _ Nothing _) _ a) = a+typeAttrs (TypeDefType (TypeDefRef _ (Just t) _) _ a) = mergeAttributes a (typeAttrs t)++--  |Update type attributes+typeAttrsUpd :: (Attributes -> Attributes) -> Type -> Type+typeAttrsUpd f ty =+    case ty of DirectType ty_name ty_quals ty_attrs -> DirectType ty_name ty_quals (f ty_attrs)+               PtrType ty_inner ty_quals ty_attrs         -> PtrType ty_inner ty_quals (f ty_attrs)+               ArrayType ty_inner sz ty_quals ty_attrs    -> ArrayType ty_inner sz ty_quals (f ty_attrs)+               FunctionType ty_inner ty_attrs             -> FunctionType ty_inner (f ty_attrs)+               TypeDefType ty_ref ty_quals ty_attrs -> TypeDefType ty_ref ty_quals (f ty_attrs)++-- | Return the base type of a pointer or array type. It is an error+--   to call this function with a type that is not in one of those two+--   categories.+baseType :: Type -> Type+baseType (PtrType t _ _) = t+baseType (ArrayType t _ _ _) = t+baseType _ = error "base of non-pointer type"++-- | resolve typedefs, if possible+derefTypeDef :: Type -> Type+derefTypeDef (TypeDefType (TypeDefRef _ (Just t) _) q a) =+  (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q))+  (derefTypeDef t)+derefTypeDef ty = ty++-- | Attempt to remove all references to @typedef@ types from a given type.+--   Note that this does not dereference the types of structure or union+--   fields, so there are still cases where further dereferencing is+--   needed.+deepDerefTypeDef :: Type -> Type+deepDerefTypeDef (PtrType t quals attrs) =+  PtrType (deepDerefTypeDef t) quals attrs+deepDerefTypeDef (ArrayType t size quals attrs) =+  ArrayType (deepDerefTypeDef t) size quals attrs+deepDerefTypeDef (FunctionType (FunType rt params varargs) attrs) =+  FunctionType (FunType (deepDerefTypeDef rt) params varargs) attrs+deepDerefTypeDef (FunctionType (FunTypeIncomplete rt) attrs) =+  FunctionType (FunTypeIncomplete (deepDerefTypeDef rt)) attrs+deepDerefTypeDef (TypeDefType (TypeDefRef _ (Just t) _) q a) =+  (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q))+  (deepDerefTypeDef t)+deepDerefTypeDef t = t++canonicalType :: Type -> Type+canonicalType t =+  case deepDerefTypeDef t of+    FunctionType ft attrs -> simplePtr (FunctionType ft attrs)+    t' -> t'++-- XXX: move to be with other flag functions+testFlags :: Enum f => [f] -> Flags f -> Bool+testFlags flags fi = and $ map ((flip testFlag) fi) flags++-- XXX: deal with FlagImag. No representation for it in Complex.+-- XXX: deal with invalid combinations of flags?+getIntType :: Flags CIntFlag -> IntType+getIntType flags | testFlags [FlagLongLong, FlagUnsigned] flags = TyULLong+                 | testFlag  FlagLongLong flags                 = TyLLong+                 | testFlags [FlagLong, FlagUnsigned] flags     = TyULong+                 | testFlag  FlagLong flags                     = TyLong+                 | testFlag  FlagUnsigned flags                 = TyUInt+                 | otherwise                                    = TyInt++getFloatType :: String -> FloatType+getFloatType fs | last fs `elem` ['f', 'F'] = TyFloat+                | last fs `elem` ['l', 'L'] = TyLDouble+                | otherwise                 = TyDouble+
src/Language/C/Data.hs view
@@ -19,14 +19,14 @@      -- * Unqiue names      Name(..),newNameSupply,      -- * Source code positions-     Position(..),Pos(..),initPos,-     posFile,posRow,posColumn,-     nopos,builtinPos,internalPos,+     Position(..),Pos(..),+     initPos, nopos,builtinPos,internalPos,      isSourcePos,isBuiltinPos,isInternalPos,      -- * Syntax tree nodes      NodeInfo(..),CNode(..),      fileOfNode,posOfNode,nameOfNode,-     internalNode,mkNodeInfoOnlyPos,mkNodeInfo,+     undefNode,mkNodeInfoOnlyPos,mkNodeInfo,+     internalNode, -- DEPRECATED      -- * Extensible errors      module Language.C.Data.Error )
src/Language/C/Data/Error.hs view
@@ -8,7 +8,7 @@ -- Stability   :  experimental -- Portability :  ghc ----- Base type for errors occuring in parsing, analysing and pretty-printing.+-- Base type for errors occurring in parsing, analysing and pretty-printing. -- With ideas from Simon Marlow's -- "An extensible dynamically-typed hierarchy of execeptions [2006]" -----------------------------------------------------------------------------@@ -52,7 +52,7 @@ -- | information attached to every error in Language.C data ErrorInfo = ErrorInfo ErrorLevel Position [String] deriving Typeable --- to faciliate newtype deriving+-- to facilitate newtype deriving instance Show ErrorInfo where show = showErrorInfo "error" instance Error ErrorInfo where     errorInfo = id
src/Language/C/Data/Ident.hs view
@@ -10,7 +10,7 @@ -- Portability :  ghc -- -- This module provides the notion of identifiers in C, speed up using hashing.--- Identifiers are associated optionally associated with a 'NodeInfo', i.e. with +-- Identifiers are associated optionally associated with a 'NodeInfo', i.e. with -- a unique 'Name' and a source location ('Position'). The ordering relation on -- identifiers is based on the hash and does not follow the lexical order. -----------------------------------------------------------------------------@@ -19,7 +19,7 @@     SUERef(..), isAnonymousRef,     mkIdent, builtinIdent, internalIdent, internalIdentAt, isInternalIdent, identToString, dumpIdent) where-  + -- TODO (comment from manuel): --  * Hashing is not 8bit clean. @@ -46,8 +46,8 @@  -- | C identifiers data Ident = Ident String       -- lexeme-                   {-# UNPACK #-}   !Int         -- hash to speed up equality check-                   NodeInfo        -- attributes of this ident. incl. position+                   {-# UNPACK #-}   !Int     -- hash to speed up equality check+                   NodeInfo                   -- attributes of this ident. incl. position              deriving (Data,Typeable)  -- the definition of the equality allows identifiers to be equal that are@@ -64,7 +64,7 @@  -- for displaying identifiers instance Show Ident where-  showsPrec _ ide = showString ("`" ++ identToString ide ++ "'")+  showsPrec _ ide = showString ("\"" ++ identToString ide ++ "\"")  -- identifiers are attributed instance CNode Ident where@@ -108,7 +108,7 @@ -- -- * for reasons of simplicity the complete lexeme is hashed. mkIdent            :: Position -> String -> Name -> Ident-mkIdent pos s name  = Ident s (quad s) (mkNodeInfo pos name)+mkIdent pos s name  = Ident s (quad s) (mkNodeInfo' pos (pos,length s) name)  -- | returns an /internal/ identifier (has internal position and no unique name) internalIdent   :: String -> Ident@@ -116,7 +116,7 @@  -- | return an /internal/ identifier with position info internalIdentAt :: Position -> String -> Ident-internalIdentAt pos s = Ident s (quad s) (mkNodeInfoOnlyPos pos)+internalIdentAt pos s = Ident s (quad s) (mkNodeInfoPosLen pos (pos, length s))  -- | returns a /builtin/ identifier (has builtin position and no unique name) builtinIdent   :: String -> Ident
src/Language/C/Data/Node.hs view
@@ -12,9 +12,11 @@ -- source position and unqiue name ----------------------------------------------------------------------------- module Language.C.Data.Node (-   NodeInfo(..), internalNode,mkNodeInfoOnlyPos,mkNodeInfo,+   NodeInfo(..), undefNode, isUndefNode,+   mkNodeInfoOnlyPos,mkNodeInfoPosLen, mkNodeInfo,mkNodeInfo',+   internalNode, -- deprecated, use undefNode    CNode(nodeInfo), fileOfNode,-   posOfNode, nameOfNode,+   posOfNode, nameOfNode, getLastTokenPos, lengthOfNode,    eqByName, ) where import Language.C.Data.Position@@ -22,26 +24,46 @@ import Data.Generics  -- | Parsed entity attribute-data NodeInfo = OnlyPos   Position           -- only pos (for internal stuff only)-              | NodeInfo Position Name      -- pos and unique name-           deriving (Show,Read,Data,Typeable)+data NodeInfo = OnlyPos  Position {-# UNPACK #-} !PosLength        -- only pos and last token (for internal stuff only)+              | NodeInfo Position {-# UNPACK #-} !PosLength !Name  -- pos, last token and unique name+           deriving (Data,Typeable) +instance Show NodeInfo where+    showsPrec d (OnlyPos p l) =+      (showString "(OnlyPos ") . (showsPrec d p) . (showString " ") . (showsPrec d l) . (showString ")")+    showsPrec d (NodeInfo p l n) =+      (showString "(NodeInfo ") . (showsPrec d p) . (showString " ") . (showsPrec d l) . (showString " ") . (showsPrec d n) . (showString ")")+ -- name equality of attributes, used to define (name) equality of objects instance Eq NodeInfo where-  (NodeInfo   _ id1) == (NodeInfo   _ id2) = id1 == id2+  (NodeInfo   _ _ id1) == (NodeInfo   _ _ id2) = id1 == id2   _               == _               =     error "Attributes: Attempt to compare `OnlyPos' attributes!"  -- attribute ordering instance Ord NodeInfo where-  (NodeInfo   _ id1) <= (NodeInfo   _ id2) = id1 <= id2+  (NodeInfo   _ _ id1) <= (NodeInfo   _ _ id2) = id1 <= id2   _               <= _               =     error "Attributes: Attempt to compare `OnlyPos' attributes!"  instance Pos NodeInfo where-  posOf (OnlyPos pos) = pos-  posOf (NodeInfo pos _) = pos+  posOf (OnlyPos pos _) = pos+  posOf (NodeInfo pos _ _) = pos +-- | get the number of characters an AST node spans+lengthOfNode :: NodeInfo -> Maybe Int+lengthOfNode ni = len+    where+    len = case ni of NodeInfo firstPos lastTok _ -> computeLength firstPos lastTok+                     OnlyPos firstPos lastTok -> computeLength firstPos lastTok+    computeLength pos (lastPos,len) | len < 0   = Nothing+                                    | otherwise = Just (posOffset lastPos + len - posOffset pos)++-- | get the position and length of the last token+getLastTokenPos :: NodeInfo -> PosLength+getLastTokenPos (NodeInfo _ lastTok _) = lastTok+getLastTokenPos (OnlyPos _ lastTok) = lastTok+ -- | a class for convenient access to the attributes of an attributed object class CNode a where   nodeInfo :: a -> NodeInfo@@ -51,12 +73,14 @@   nodeInfo = either nodeInfo nodeInfo  nameOfNode :: NodeInfo -> Maybe Name-nameOfNode (OnlyPos _) = Nothing-nameOfNode (NodeInfo _ name) = Just name+nameOfNode (OnlyPos _ _) = Nothing+nameOfNode (NodeInfo _ _ name) = Just name posOfNode :: NodeInfo -> Position-posOfNode ni = case ni of (OnlyPos pos  ) -> pos; (NodeInfo   pos _) -> pos-fileOfNode :: (CNode a) => a -> FilePath-fileOfNode = posFile . posOfNode . nodeInfo+posOfNode ni = case ni of (OnlyPos pos _) -> pos; (NodeInfo pos _ _) -> pos+fileOfNode :: (CNode a) => a -> Maybe FilePath+fileOfNode = fmap posFile . justIf isSourcePos . posOfNode . nodeInfo where+    justIf predicate x | predicate x = Just x+                       | otherwise   = Nothing  -- | equality by name eqByName           :: CNode a => a -> a -> Bool@@ -65,16 +89,36 @@  -- attribute identifier creation -- ------------------------------+{-# DEPRECATED internalNode "use undefNode instead" #-} internalNode :: NodeInfo-internalNode = OnlyPos nopos+internalNode = undefNode --- | Given only a source position, create a new attribute identifier+-- | create a node with neither name nor positional information+undefNode :: NodeInfo+undefNode = OnlyPos nopos (nopos,-1)++-- | return True if the node carries neither name nor positional information+isUndefNode :: NodeInfo -> Bool+isUndefNode (OnlyPos p _) | isNoPos p = True+                          | otherwise = False+isUndefNode _ = False++-- |+-- | Given only a source position, create a new node attribute mkNodeInfoOnlyPos :: Position -> NodeInfo-mkNodeInfoOnlyPos pos  = OnlyPos pos+mkNodeInfoOnlyPos pos  = OnlyPos pos (nopos,-1) +-- | Given a source position and the position and length of the last token, create a new node attribute+mkNodeInfoPosLen :: Position -> PosLength -> NodeInfo+mkNodeInfoPosLen = OnlyPos+ -- | Given a source position and a unique name, create a new attribute -- identifier mkNodeInfo :: Position -> Name -> NodeInfo-mkNodeInfo pos name  = NodeInfo pos name+mkNodeInfo pos name  = NodeInfo pos (nopos,-1) name++-- | Given a source position, the position and length of the last token and a unique name, create a new attribute+-- identifier. Strict in+mkNodeInfo' :: Position -> PosLength -> Name -> NodeInfo+mkNodeInfo' pos lasttok name = NodeInfo pos lasttok name 
src/Language/C/Data/Position.hs view
@@ -3,6 +3,7 @@ -- | -- Module      :  Language.C.Data.Position -- Copyright   :  (c) [1995..2000] Manuel M. T. Chakravarty+--                    [2008..2009] Benedikt Huber -- License     :  BSD-style -- Maintainer  :  benedikt.huber@gmail.com -- Stability   :  experimental@@ -14,54 +15,46 @@   --   -- source text positions   ---  Position(Position),initPos,-  posFile,posRow,posColumn,isSourcePos,+  Position(),+  position,+  PosLength,+  posFile,posRow,posColumn,posOffset,+  initPos, isSourcePos,   nopos, isNoPos,   builtinPos, isBuiltinPos,   internalPos, isInternalPos,-  incPos, tabPos, retPos, adjustPos,+  incPos, retPos, adjustPos,+  incOffset,   Pos(..), ) where import Data.Generics --- | uniform representation of source file positions; the order of the arguments--- is important as it leads to the desired ordering of source positions-data Position = Position String         -- file name-        {-# UNPACK #-}   !Int           -- row-        {-# UNPACK #-}   !Int           -- column-  deriving (Eq, Ord, Typeable, Data)+-- | uniform representation of source file positions+data Position = Position { posOffset :: {-# UNPACK #-} !Int  -- ^ absolute offset in the preprocessed file+                         , posFile :: String                 -- ^ source file+                         , posRow :: {-# UNPACK #-} !Int     -- ^ row (line)  in the original file. Affected by #LINE pragmas.+                         , posColumn :: {-# UNPACK #-} !Int  -- ^ column in the preprocessed file. Inaccurate w.r.t. to the original+                                                             --   file in the presence of preprocessor macros.+                         }+              | NoPosition+              | BuiltinPosition+              | InternalPosition+                deriving (Eq, Ord, Typeable, Data) -instance Show Position where-  show pos@(Position fname row col)-    | isNoPos pos = "<no file>"-    | isBuiltinPos pos = "<builtin>"-    | isInternalPos pos = "<internal>"-    | otherwise = show (fname, row, col)-instance Read Position where-    readsPrec p s = case s of-                       '<' : _  -> readInternal s-                       _        -> map (\((file,row,pos),r) -> (Position file row pos,r)) . readsPrec p $ s-readInternal :: ReadS Position-readInternal s | (Just rest) <- readString "<no file>" s = [(nopos,rest)]-               | (Just rest) <- readString "<builtin>" s = [(builtinPos,rest)]-               | (Just rest) <- readString "<internal>" s = [(internalPos,rest)]-               | otherwise                             = []-    where readString [] r = return r-          readString (c:cs) (c':cs') | c == c'    = readString cs cs'-                                     | otherwise = Nothing-          readString (_:_) [] = Nothing+-- | Position and length of a token+type PosLength = (Position,Int) --- | get the source file of the specified position. Fails unless @isSourcePos pos@.-posFile :: Position -> String-posFile (Position fname _ _) = fname+instance Show Position where+  show (Position _ fname row _) = "(" ++ show fname ++ ": line " ++ show row ++ ")"+  show NoPosition               = "<no file>"+  show BuiltinPosition          = "<builtin>"+  show InternalPosition         = "<internal>" --- | get the line number of the specified position. Fails unless @isSourcePos pos@-posRow  :: Position -> Int-posRow (Position _ row _) = row+{-# DEPRECATED posColumn "column number information is inaccurate in presence of macros - do not rely on it." #-} --- | get the column of the specified position. Fails unless @isSourcePos pos@-posColumn :: Position -> Int-posColumn (Position _ _ col) = col+-- | @position absoluteOffset fileName lineNumber columnNumber@ initializes a @Position@ using the given arguments+position :: Int -> String -> Int -> Int -> Position+position = Position  -- | class of type which aggregate a source code location class Pos a where@@ -69,57 +62,63 @@  -- | initialize a Position to the start of the translation unit starting in the given file initPos :: FilePath -> Position-initPos file = Position file 1 1+initPos file = Position 0 file 1 1  -- | returns @True@ if the given position refers to an actual source file isSourcePos :: Position -> Bool-isSourcePos (Position _ row col) = row >= 0 && col >= 0+isSourcePos (Position _ _ _ _) = True+isSourcePos _                  = False  -- | no position (for unknown position information) nopos :: Position-nopos  = Position "<no file>" (-1) 0+nopos  = NoPosition +-- | returns @True@ if the there is no position information available isNoPos :: Position -> Bool-isNoPos (Position _ (-1) 0) = True-isNoPos _                   = False+isNoPos NoPosition = True+isNoPos _          = False  -- | position attached to built-in objects -- builtinPos :: Position-builtinPos  = Position "<built into the parser>" (-1) 1+builtinPos  = BuiltinPosition  -- | returns @True@ if the given position refers to a builtin definition isBuiltinPos :: Position -> Bool-isBuiltinPos (Position _ (-1) 1) = True-isBuiltinPos _                   = False+isBuiltinPos BuiltinPosition = True+isBuiltinPos _               = False  -- | position used for internal errors internalPos :: Position-internalPos = Position "<internal error>" (-1) 2+internalPos = InternalPosition  -- | returns @True@ if the given position is internal isInternalPos :: Position -> Bool-isInternalPos (Position _ (-1) 2) = True-isInternalPos _                      = False+isInternalPos InternalPosition = True+isInternalPos _                = False  {-# INLINE incPos #-} -- | advance column incPos :: Position -> Int -> Position-incPos (Position fname row col) n = Position fname row (col + n)--{-# DEPRECATED tabPos "Use 'incPos column-adjustment' instead" #-}--- | advance column to next tab positions (tabs are considered to be at every 8th column)-tabPos :: Position -> Position-tabPos (Position fname row col) =-        Position fname row (col + 8 - (col - 1) `mod` 8)+incPos (Position offs fname row col) n = Position (offs + n) fname row (col + n)+incPos p _                             = p  {-# INLINE retPos #-} -- | advance to next line retPos :: Position -> Position-retPos (Position fname row _col) = Position fname (row + 1) 1+retPos (Position offs fname row _) = Position (offs+1) fname (row + 1) 1+retPos p                           = p  {-# INLINE adjustPos #-}--- | adjust position: change file and line number, reseting column to 1. This is usually ---   used for #LINE pragmas.+-- | adjust position: change file and line number, reseting column to 1. This is usually+--   used for #LINE pragmas. The absolute offset is not changed - this can be done+--   by @adjustPos newFile line . incPos (length pragma)@. adjustPos :: FilePath -> Int -> Position -> Position-adjustPos fname row (Position _ _ _) = Position fname row 1+adjustPos fname row (Position offs _ _ _) = Position offs fname row 1+adjustPos _ _ p                           = p++{-# INLINE incOffset #-}+-- | advance just the offset+incOffset :: Position -> Int -> Position+incOffset (Position o f r c) n = Position (o + n) f r c+incOffset p n                  = p
src/Language/C/Parser/Lexer.x view
@@ -51,10 +51,10 @@ module Language.C.Parser.Lexer (lexC, parseError) where  import Data.Char (isDigit)-import Control.Monad (liftM)+import Control.Monad (liftM, when)  import Language.C.Data.InputStream-import Language.C.Data.Position  (Position(..),posOf)+import Language.C.Data.Position import Language.C.Data.Ident    (mkIdent)  import Language.C.Syntax.Constants@@ -135,7 +135,7 @@ --   doesn't say how many ints there can be, we allow an unbound number -- \#$space*@int$space*(\"($infname|@charesc)*\"$space*)?(@int$space*)*\r?$eol-  { \pos len str -> setPos (linePragmaAdjust (takeChars len str) pos) >> lexToken }+  { \pos len str -> setPos (adjustLineDirective len (takeChars len str) pos) >> lexToken' False }  -- #pragma directive (K&R A12.8) --@@ -196,52 +196,52 @@  -- operators and separators ---"("   { token_ CTokLParen }-")"   { token_ CTokRParen  }-"["   { token_ CTokLBracket }-"]"   { token_ CTokRBracket }-"->"  { token_ CTokArrow }-"."   { token_ CTokDot }-"!"   { token_ CTokExclam }-"~"   { token_ CTokTilde }-"++"  { token_ CTokInc }-"--"  { token_ CTokDec }-"+"   { token_ CTokPlus }-"-"   { token_ CTokMinus }-"*"   { token_ CTokStar }-"/"   { token_ CTokSlash }-"%"   { token_ CTokPercent }-"&"   { token_ CTokAmper }-"<<"  { token_ CTokShiftL }-">>"  { token_ CTokShiftR }-"<"   { token_ CTokLess }-"<="  { token_ CTokLessEq }-">"   { token_ CTokHigh }-">="  { token_ CTokHighEq }-"=="  { token_ CTokEqual }-"!="  { token_ CTokUnequal }-"^"   { token_ CTokHat }-"|"   { token_ CTokBar }-"&&"  { token_ CTokAnd }-"||"  { token_ CTokOr }-"?"   { token_ CTokQuest }-":"   { token_ CTokColon }-"="   { token_ CTokAssign }-"+="  { token_ CTokPlusAss }-"-="  { token_ CTokMinusAss }-"*="  { token_ CTokStarAss }-"/="  { token_ CTokSlashAss }-"%="  { token_ CTokPercAss }-"&="  { token_ CTokAmpAss }-"^="  { token_ CTokHatAss }-"|="  { token_ CTokBarAss }-"<<=" { token_ CTokSLAss }-">>=" { token_ CTokSRAss }-","   { token_ CTokComma }-\;    { token_ CTokSemic }-"{"   { token_ CTokLBrace }-"}"   { token_ CTokRBrace }-"..." { token_ CTokEllipsis }+"("   { token_ 1 CTokLParen }+")"   { token_ 1 CTokRParen  }+"["   { token_ 1 CTokLBracket }+"]"   { token_ 1 CTokRBracket }+"->"  { token_ 2 CTokArrow }+"."   { token_ 1 CTokDot }+"!"   { token_ 1 CTokExclam }+"~"   { token_ 1 CTokTilde }+"++"  { token_ 2 CTokInc }+"--"  { token_ 2 CTokDec }+"+"   { token_ 1 CTokPlus }+"-"   { token_ 1 CTokMinus }+"*"   { token_ 1 CTokStar }+"/"   { token_ 1 CTokSlash }+"%"   { token_ 1 CTokPercent }+"&"   { token_ 1 CTokAmper }+"<<"  { token_ 2 CTokShiftL }+">>"  { token_ 2 CTokShiftR }+"<"   { token_ 1 CTokLess }+"<="  { token_ 2 CTokLessEq }+">"   { token_ 1 CTokHigh }+">="  { token_ 2 CTokHighEq }+"=="  { token_ 2 CTokEqual }+"!="  { token_ 2 CTokUnequal }+"^"   { token_ 1 CTokHat }+"|"   { token_ 1 CTokBar }+"&&"  { token_ 2 CTokAnd }+"||"  { token_ 2 CTokOr }+"?"   { token_ 1 CTokQuest }+":"   { token_ 1 CTokColon }+"="   { token_ 1 CTokAssign }+"+="  { token_ 2 CTokPlusAss }+"-="  { token_ 2 CTokMinusAss }+"*="  { token_ 2 CTokStarAss }+"/="  { token_ 2 CTokSlashAss }+"%="  { token_ 2 CTokPercAss }+"&="  { token_ 2 CTokAmpAss }+"^="  { token_ 2 CTokHatAss }+"|="  { token_ 2 CTokBarAss }+"<<=" { token_ 3 CTokSLAss }+">>=" { token_ 3 CTokSRAss }+","   { token_ 1 CTokComma }+\;    { token_ 1 CTokSemic }+"{"   { token_ 1 CTokLBrace }+"}"   { token_ 1 CTokRBrace }+"..." { token_ 3 CTokEllipsis }   {@@ -256,109 +256,136 @@ -- string literals since GHC converts the latter into a sequence of string -- comparisons (ie a linear search) but it translates the former using its -- effecient pattern matching which gives us the expected radix-style search.--- This gives change makes a significant performance difference.+-- This change makes a significant performance difference [chak] ---idkwtok :: String -> Position -> P CToken-idkwtok ('a':'l':'i':'g':'n':'o':'f':[])         = tok CTokAlignof-idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':[])       = tok CTokAlignof-idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':'_':'_':[])     = tok CTokAlignof-idkwtok ('a':'s':'m':[])             = tok CTokAsm-idkwtok ('_':'_':'a':'s':'m':[])           = tok CTokAsm-idkwtok ('_':'_':'a':'s':'m':'_':'_':[])         = tok CTokAsm-idkwtok ('a':'u':'t':'o':[])             = tok CTokAuto-idkwtok ('b':'r':'e':'a':'k':[])           = tok CTokBreak-idkwtok ('_':'B':'o':'o':'l':[])           = tok CTokBool-idkwtok ('c':'a':'s':'e':[])             = tok CTokCase-idkwtok ('c':'h':'a':'r':[])             = tok CTokChar-idkwtok ('c':'o':'n':'s':'t':[])           = tok CTokConst-idkwtok ('_':'_':'c':'o':'n':'s':'t':[])         = tok CTokConst-idkwtok ('_':'_':'c':'o':'n':'s':'t':'_':'_':[])       = tok CTokConst-idkwtok ('c':'o':'n':'t':'i':'n':'u':'e':[])         = tok CTokContinue-idkwtok ('_':'C':'o':'m':'p':'l':'e':'x':[])         = tok CTokComplex-idkwtok ('_':'_':'c':'o':'m':'p':'l':'e':'x':'_':'_':[]) = tok CTokComplex-idkwtok ('d':'e':'f':'a':'u':'l':'t':[])         = tok CTokDefault-idkwtok ('d':'o':[])               = tok CTokDo-idkwtok ('d':'o':'u':'b':'l':'e':[])           = tok CTokDouble-idkwtok ('e':'l':'s':'e':[])             = tok CTokElse-idkwtok ('e':'n':'u':'m':[])             = tok CTokEnum-idkwtok ('e':'x':'t':'e':'r':'n':[])           = tok CTokExtern-idkwtok ('f':'l':'o':'a':'t':[])           = tok CTokFloat-idkwtok ('f':'o':'r':[])             = tok CTokFor-idkwtok ('g':'o':'t':'o':[])             = tok CTokGoto-idkwtok ('i':'f':[])               = tok CTokIf-idkwtok ('i':'n':'l':'i':'n':'e':[])           = tok CTokInline-idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':[])         = tok CTokInline-idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':'_':'_':[])       = tok CTokInline-idkwtok ('i':'n':'t':[])             = tok CTokInt-idkwtok ('l':'o':'n':'g':[])             = tok CTokLong-idkwtok ('r':'e':'g':'i':'s':'t':'e':'r':[])         = tok CTokRegister-idkwtok ('r':'e':'s':'t':'r':'i':'c':'t':[])         = tok CTokRestrict-idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':[])       = tok CTokRestrict-idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':'_':'_':[]) = tok CTokRestrict-idkwtok ('r':'e':'t':'u':'r':'n':[])           = tok CTokReturn-idkwtok ('s':'h':'o':'r':'t':[])           = tok CTokShort-idkwtok ('s':'i':'g':'n':'e':'d':[])           = tok CTokSigned-idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':[])         = tok CTokSigned-idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':'_':'_':[])       = tok CTokSigned-idkwtok ('s':'i':'z':'e':'o':'f':[])           = tok CTokSizeof-idkwtok ('s':'t':'a':'t':'i':'c':[])           = tok CTokStatic-idkwtok ('s':'t':'r':'u':'c':'t':[])           = tok CTokStruct-idkwtok ('s':'w':'i':'t':'c':'h':[])           = tok CTokSwitch-idkwtok ('t':'y':'p':'e':'d':'e':'f':[])         = tok CTokTypedef-idkwtok ('t':'y':'p':'e':'o':'f':[])           = tok CTokTypeof-idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':[])         = tok CTokTypeof-idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':'_':'_':[])       = tok CTokTypeof-idkwtok ('_':'_':'t':'h':'r':'e':'a':'d':[])         = tok CTokThread-idkwtok ('u':'n':'i':'o':'n':[])           = tok CTokUnion-idkwtok ('u':'n':'s':'i':'g':'n':'e':'d':[])         = tok CTokUnsigned-idkwtok ('v':'o':'i':'d':[])             = tok CTokVoid-idkwtok ('v':'o':'l':'a':'t':'i':'l':'e':[])         = tok CTokVolatile-idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':[])       = tok CTokVolatile-idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':'_':'_':[]) = tok CTokVolatile-idkwtok ('w':'h':'i':'l':'e':[])           = tok CTokWhile-idkwtok ('_':'_':'l':'a':'b':'e':'l':'_':'_':[])             = tok CTokLabel-idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':[]) = tok (CTokGnuC GnuCAttrTok)-idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':'_':'_':[]) = tok (CTokGnuC GnuCAttrTok)-idkwtok ('_':'_':'e':'x':'t':'e':'n':'s':'i':'o':'n':'_':'_':[]) = tok (CTokGnuC GnuCExtTok)-idkwtok ('_':'_':'r':'e':'a':'l':[])   = tok (CTokGnuC GnuCComplexReal)-idkwtok ('_':'_':'r':'e':'a':'l':'_':'_':[])   = tok (CTokGnuC GnuCComplexReal)-idkwtok ('_':'_':'i':'m':'a':'g':[])   = tok (CTokGnuC GnuCComplexImag)-idkwtok ('_':'_':'i':'m':'a':'g':'_':'_':[])   = tok (CTokGnuC GnuCComplexImag)-idkwtok ('_':'_':'b':'u':'i':'l':'t':'i':'n':'_':rest)-        | rest == "va_arg"             = tok (CTokGnuC GnuCVaArg)-        | rest == "offsetof"           = tok (CTokGnuC GnuCOffsetof)-        | rest == "types_compatible_p" = tok (CTokGnuC GnuCTyCompat)+-- To make this a little more maintainable, we autogenerate it from this list,+-- using the script GenerateKeywordMatch.hs (in /src)+{-+alignof @__, asm @__, auto+break, bool _Bool,+case, char, const @__, continue, complex _Complex __complex__+default, do, double,+else, enum, extern,+float, for, goto,+if, inline @__, int, long,+register, restrict @__, return+short, signed @__, sizeof, static, struct, switch,+typedef, typeof @__, thread __thread,+union, unsigned, void, volatile @__,+while,+label __label__+(CTokGnuC GnuCAttrTok) __attribute __attribute__+(CTokGnuC GnuCExtTok) __extension__+(CTokGnuC GnuCComplexReal) __real __real__+(CTokGnuC GnuCComplexImag) __imag __imag__+(CTokGnuC GnuCVaArg) __builtin_va_arg+(CTokGnuC GnuCOffsetof) __builtin_offsetof+(CTokGnuC GnuCTyCompat) __builtin_types_compatible_p+-}+-- Tokens: alignof __alignof __alignof__ asm __asm __asm__ __attribute __attribute__ auto _Bool break __builtin_offsetof __builtin_types_compatible_p __builtin_va_arg case char _Complex __complex__ const __const __const__ continue default do double else enum __extension__ extern float for goto if __imag __imag__ inline __inline __inline__ int __label__ long __real __real__ register __restrict __restrict__ return short signed __signed __signed__ sizeof static struct switch __thread typedef typeof __typeof __typeof__ union unsigned void volatile __volatile __volatile__ while+idkwtok ('_' : 'B' : 'o' : 'o' : 'l' : []) = tok 5 CTokBool+idkwtok ('_' : 'C' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : []) = tok 8 CTokComplex+idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 9 CTokAlignof+idkwtok ('a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 7 CTokAlignof+idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : '_' : '_' : []) = tok 11 CTokAlignof+idkwtok ('_' : '_' : 'a' : 's' : 'm' : []) = tok 5 CTokAsm+idkwtok ('a' : 's' : 'm' : []) = tok 3 CTokAsm+idkwtok ('_' : '_' : 'a' : 's' : 'm' : '_' : '_' : []) = tok 7 CTokAsm+idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : []) = tok 11 (CTokGnuC GnuCAttrTok)+idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCAttrTok)+idkwtok ('a' : 'u' : 't' : 'o' : []) = tok 4 CTokAuto+idkwtok ('b' : 'r' : 'e' : 'a' : 'k' : []) = tok 5 CTokBreak+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'o' : 'f' : 'f' : 's' : 'e' : 't' : 'o' : 'f' : []) = tok 18 (CTokGnuC GnuCOffsetof)+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 't' : 'y' : 'p' : 'e' : 's' : '_' : 'c' : 'o' : 'm' : 'p' : 'a' : 't' : 'i' : 'b' : 'l' : 'e' : '_' : 'p' : []) = tok 28 (CTokGnuC GnuCTyCompat)+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'v' : 'a' : '_' : 'a' : 'r' : 'g' : []) = tok 16 (CTokGnuC GnuCVaArg)+idkwtok ('c' : 'a' : 's' : 'e' : []) = tok 4 CTokCase+idkwtok ('c' : 'h' : 'a' : 'r' : []) = tok 4 CTokChar+idkwtok ('_' : '_' : 'c' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : '_' : '_' : []) = tok 11 CTokComplex+idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : []) = tok 7 CTokConst+idkwtok ('c' : 'o' : 'n' : 's' : 't' : []) = tok 5 CTokConst+idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : '_' : '_' : []) = tok 9 CTokConst+idkwtok ('c' : 'o' : 'n' : 't' : 'i' : 'n' : 'u' : 'e' : []) = tok 8 CTokContinue+idkwtok ('d' : 'e' : 'f' : 'a' : 'u' : 'l' : 't' : []) = tok 7 CTokDefault+idkwtok ('d' : 'o' : []) = tok 2 CTokDo+idkwtok ('d' : 'o' : 'u' : 'b' : 'l' : 'e' : []) = tok 6 CTokDouble+idkwtok ('e' : 'l' : 's' : 'e' : []) = tok 4 CTokElse+idkwtok ('e' : 'n' : 'u' : 'm' : []) = tok 4 CTokEnum+idkwtok ('_' : '_' : 'e' : 'x' : 't' : 'e' : 'n' : 's' : 'i' : 'o' : 'n' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCExtTok)+idkwtok ('e' : 'x' : 't' : 'e' : 'r' : 'n' : []) = tok 6 CTokExtern+idkwtok ('f' : 'l' : 'o' : 'a' : 't' : []) = tok 5 CTokFloat+idkwtok ('f' : 'o' : 'r' : []) = tok 3 CTokFor+idkwtok ('g' : 'o' : 't' : 'o' : []) = tok 4 CTokGoto+idkwtok ('i' : 'f' : []) = tok 2 CTokIf+idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : []) = tok 6 (CTokGnuC GnuCComplexImag)+idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexImag)+idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 8 CTokInline+idkwtok ('i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 6 CTokInline+idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : '_' : '_' : []) = tok 10 CTokInline+idkwtok ('i' : 'n' : 't' : []) = tok 3 CTokInt+idkwtok ('_' : '_' : 'l' : 'a' : 'b' : 'e' : 'l' : '_' : '_' : []) = tok 9 CTokLabel+idkwtok ('l' : 'o' : 'n' : 'g' : []) = tok 4 CTokLong+idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : []) = tok 6 (CTokGnuC GnuCComplexReal)+idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexReal)+idkwtok ('r' : 'e' : 'g' : 'i' : 's' : 't' : 'e' : 'r' : []) = tok 8 CTokRegister+idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 10 CTokRestrict+idkwtok ('r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 8 CTokRestrict+idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : '_' : '_' : []) = tok 12 CTokRestrict+idkwtok ('r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 6 CTokReturn+idkwtok ('s' : 'h' : 'o' : 'r' : 't' : []) = tok 5 CTokShort+idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokSigned+idkwtok ('s' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 6 CTokSigned+idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : '_' : '_' : []) = tok 10 CTokSigned+idkwtok ('s' : 'i' : 'z' : 'e' : 'o' : 'f' : []) = tok 6 CTokSizeof+idkwtok ('s' : 't' : 'a' : 't' : 'i' : 'c' : []) = tok 6 CTokStatic+idkwtok ('s' : 't' : 'r' : 'u' : 'c' : 't' : []) = tok 6 CTokStruct+idkwtok ('s' : 'w' : 'i' : 't' : 'c' : 'h' : []) = tok 6 CTokSwitch+idkwtok ('_' : '_' : 't' : 'h' : 'r' : 'e' : 'a' : 'd' : []) = tok 8 CTokThread+idkwtok ('t' : 'y' : 'p' : 'e' : 'd' : 'e' : 'f' : []) = tok 7 CTokTypedef+idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 8 CTokTypeof+idkwtok ('t' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 6 CTokTypeof+idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : '_' : '_' : []) = tok 10 CTokTypeof+idkwtok ('u' : 'n' : 'i' : 'o' : 'n' : []) = tok 5 CTokUnion+idkwtok ('u' : 'n' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokUnsigned+idkwtok ('v' : 'o' : 'i' : 'd' : []) = tok 4 CTokVoid+idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 10 CTokVolatile+idkwtok ('v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 8 CTokVolatile+idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : '_' : '_' : []) = tok 12 CTokVolatile+idkwtok ('w' : 'h' : 'i' : 'l' : 'e' : []) = tok 5 CTokWhile  idkwtok cs = \pos -> do   name <- getNewName+  let len = case length cs of l -> l   let ident = mkIdent pos cs name   tyident <- isTypeIdent ident   if tyident-    then return (CTokTyIdent pos ident)-    else return (CTokIdent   pos ident)+    then return (CTokTyIdent (pos,len) ident)+    else return (CTokIdent   (pos,len) ident)  ignoreAttribute :: P () ignoreAttribute = skipTokens (0::Int)   where skipTokens :: Int -> P ()         skipTokens n = do-          tok <- lexToken+          tok <- lexToken' False           case tok of             CTokRParen _ | n == 1    -> return ()                          | otherwise -> skipTokens (n-1)             CTokLParen _             -> skipTokens (n+1)             _                        -> skipTokens n -tok :: (Position -> CToken) -> Position -> P CToken-tok tc pos = return (tc pos)+tok :: Int -> (PosLength -> CToken) -> Position -> P CToken+tok len tc pos = return (tc (pos,len)) -linePragmaAdjust :: String -> Position -> Position-linePragmaAdjust str p@(Position fname row _) = Position fname' row' 1+adjustLineDirective :: Int -> String -> Position -> Position+adjustLineDirective pragmaLen str pos =+    offs' `seq` fname' `seq` row' `seq` (position offs' fname' row' 1)     where+    offs'           = (posOffset pos) + pragmaLen     str'            = dropWhite . drop 1 $ str     (rowStr, str'') = span isDigit str'     row'      = read rowStr     str'''      = dropWhite str''     fnameStr      = takeWhile (/= '"') . drop 1 $ str'''+    fname = posFile pos     fname'      | null str''' || head str''' /= '"' = fname      -- try and get more sharing of file name strings      | fnameStr == fname     = fname@@ -374,8 +401,8 @@  {-# INLINE token_ #-} -- token that ignores the string-token_ :: (Position -> CToken) -> Position -> Int -> InputStream -> P CToken-token_ tok pos _ _ = return (tok pos)+token_ :: Int -> (PosLength -> CToken) -> Position -> Int -> InputStream -> P CToken+token_ len tok pos _ _ = return (tok (pos,len))  {-# INLINE token_fail #-} -- error token@@ -386,17 +413,17 @@  {-# INLINE token #-} -- token that uses the string-token :: (Position -> a -> CToken) -> (String -> a)+token :: (PosLength -> a -> CToken) -> (String -> a)       -> Position -> Int -> InputStream -> P CToken-token tok read pos len str = return (tok pos (read $ takeChars len str))+token tok read pos len str = return (tok (pos,len) (read $ takeChars len str))  {-# INLINE token_plus #-} -- token that may fail-token_plus :: (Position -> a -> CToken) -> (String -> Either String a)+token_plus :: (PosLength -> a -> CToken) -> (String -> Either String a)       -> Position -> Int -> InputStream -> P CToken token_plus tok read pos len str =   case read (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]-                                   Right ok -> return $! tok pos ok+                                   Right ok -> return $! tok (pos,len) ok  -- ----------------------------------------------------------------------------- -- The input type@@ -414,11 +441,10 @@                                   Just (c, (p', s))  alexMove :: Position -> Char -> Position-alexMove (Position f l c) ' '  = Position f l (c+1)-alexMove (Position f l c) '\n' = Position f (l+1) 1-alexMove (Position f l c) '\t' = Position f l (((c+7) `div` 8)*8+1)-alexMove p                '\r' = p-alexMove (Position f l c) _    = Position f l     (c+1)+alexMove pos ' '  = incPos pos 1+alexMove pos '\n' = retPos pos+alexMove pos '\r' = incOffset pos 1+alexMove pos _    = incPos pos 1  lexicalError :: P a lexicalError = do@@ -435,22 +461,39 @@         ["Syntax error !",          "The symbol `" ++ show tok ++ "' does not fit here."] +-- there is a problem with ignored tokens here (that aren't skipped)+-- consider+-- 1 > int x;+-- 2 > LINE "ex.c" 4+-- 4 > int y;+-- when we get to LINE, we have [int (1,1),x (1,4)] in the token cache.+-- Now we run+-- > action  (pos 2,0) 14 "LINE \"ex.c\" 3\n"+-- which in turn adjusts the position and then calls lexToken again+-- we get `int (pos 4,0)', and have [x (1,4), int (4,1) ] in the token cache (fine)+-- but then, we again call setLastToken when returning and get [int (4,1),int (4,1)] in the token cache (bad)+-- to resolve this, recursive calls invoke lexToken' False. lexToken :: P CToken-lexToken = do+lexToken = lexToken' True++lexToken' :: Bool -> P CToken+lexToken' modifyCache = do   pos <- getPos   inp <- getInput   case alexScan (pos, inp) 0 of-    AlexEOF -> return CTokEof+    AlexEOF -> do+        handleEofToken+        return CTokEof     AlexError inp' -> lexicalError     AlexSkip  (pos', inp') len -> do         setPos pos'         setInput inp'-        lexToken+        lexToken' modifyCache     AlexToken (pos', inp') len action -> do         setPos pos'         setInput inp'         tok <- action pos len inp-        setLastToken tok+        when modifyCache $ setLastToken tok         return tok  lexC :: (CToken -> P a) -> P a
src/Language/C/Parser/Parser.y view
@@ -104,12 +104,12 @@  import Prelude    hiding (reverse) import qualified Data.List as List-+import Control.Monad (mplus) import Language.C.Parser.Builtin   (builtinTypeNames) import Language.C.Parser.Lexer     (lexC, parseError)-import Language.C.Parser.Tokens    (CToken(..), GnuCTok(..))-import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef,-                                      enterScope, leaveScope, ParseError(..))+import Language.C.Parser.Tokens    (CToken(..), GnuCTok(..), posLenOfTok)+import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef, getCurrentPosition,+                                      enterScope, leaveScope, getLastToken, getSavedToken, ParseError(..))  import Language.C.Data.RList import Language.C.Data.InputStream@@ -241,10 +241,13 @@   -- parse a complete C translation unit---+-- we have to take special care of empty translation units translation_unit :: { CTranslUnit } translation_unit-  : ext_decl_list	{% withNodeInfo $1 $ CTranslUnit (reverse $1) }+  : ext_decl_list	{% let decls = reverse $1 in+                       case decls of+                           []     -> do{ n <- getNewName; p <- getCurrentPosition; return $ CTranslUnit decls (mkNodeInfo' p (p,0) n) }+                           (d:ds) -> withNodeInfo d $ CTranslUnit decls }   -- parse a list of external declarations, making up a C translation unit (C99 6.9)@@ -255,8 +258,8 @@ -- ext_decl_list :: { Reversed [CExtDecl] } ext_decl_list-  : {- empty -}					{ empty }-  | ext_decl_list ';'			{ $1 }+  : {- empty -}					        { empty }+  | ext_decl_list ';'			        { $1 }   | ext_decl_list external_declaration	{ $1 `snoc` $2 }  @@ -270,7 +273,7 @@   : function_definition		              { CFDefExt $1 }   | declaration			                  { CDeclExt $1 }   | "__extension__" external_declaration  { $2 }-  | asm '(' string_literal ')' ';'		  { CAsmExt $3 }+  | asm '(' string_literal ')' ';'		  {% withNodeInfo $1 $ CAsmExt $3 }   -- parse C function definition (C99 6.9.1)@@ -295,7 +298,7 @@   	{% leaveScope >> (withNodeInfo $1 $ CFunDef [] $1 [] $2) }    |                      attrs function_declarator compound_statement-    {% leaveScope >> (withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 [] $3) }+    {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftCAttrs $1) $2 [] $3) }    | declaration_specifier      function_declarator compound_statement 	  {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }@@ -364,7 +367,7 @@ -- labeled_statement :: { CStat } labeled_statement-  : identifier ':' attrs_opt statement		{% withNodeInfo $2 $ CLabel $1 $4 $3 }+  : identifier ':' attrs_opt statement		{% withNodeInfo $1 $ CLabel $1 $4 $3 }   | case constant_expression ':' statement	{% withNodeInfo $1 $ CCase $2 $4 }   | default ':' statement			{% withNodeInfo $1 $ CDefault $3 }   | case constant_expression "..." constant_expression ':' statement@@ -428,7 +431,7 @@  label_declarations :: { Reversed [Ident] } label_declarations-  : "__label__" identifier_list ';'			{ $2 }+  : "__label__" identifier_list ';'			{ $2  } --TODO   | label_declarations "__label__" identifier_list ';'	{ $1 `rappendr` $3 }  @@ -479,9 +482,9 @@ jump_statement   : goto identifier ';'			{% withNodeInfo $1 $ CGoto $2 }   | goto '*' expression ';'		{% withNodeInfo $1 $ CGotoPtr $3 }-  | continue ';'			{% withNodeInfo $1 $ CCont }-  | break ';'				{% withNodeInfo $1 $ CBreak }-  | return expression_opt ';'		{% withNodeInfo $1 $ CReturn $2 }+  | continue ';'			    {% withNodeInfo $1 $ CCont }+  | break ';'				    {% withNodeInfo $1 $ CBreak }+  | return expression_opt ';'	{% withNodeInfo $1 $ CReturn $2 }   -- parse GNU C __asm__ statement (compatible with C99: J.5.10)@@ -508,28 +511,28 @@ maybe_type_qualifier :: { Maybe CTypeQual } maybe_type_qualifier   : {- empty -}		  { Nothing }-  | type_qualifier	{ Just $1 }+  | type_qualifier	  { Just $1 }  asm_operands :: { [CAsmOperand] } asm_operands   : {- empty -}				{ [] }-  | nonnull_asm_operands		{ reverse $1 }+  | nonnull_asm_operands    { reverse $1 }  nonnull_asm_operands :: { Reversed [CAsmOperand] } nonnull_asm_operands-  : asm_operand					{ singleton $1 }-  | nonnull_asm_operands ',' asm_operand	{ $1 `snoc` $3 }+  : asm_operand					          { singleton $1 }+  | nonnull_asm_operands ',' asm_operand  { $1 `snoc` $3 }  asm_operand :: { CAsmOperand } asm_operand-  : string_literal '(' expression ')'			            {% withNodeInfo $1 $ CAsmOperand Nothing $1 $3 }-  | '[' ident ']' string_literal '(' expression ')'   {% withNodeInfo $4 $ CAsmOperand (Just $2) $4 $6 }-  | '[' tyident ']' string_literal '(' expression ')'	{% withNodeInfo $4 $ CAsmOperand (Just $2) $4 $6 }+  : string_literal '(' expression ')'			      {% withNodeInfo $1 $ CAsmOperand Nothing $1 $3 }+  | '[' ident ']' string_literal '(' expression ')'   {% withNodeInfo $1 $ CAsmOperand (Just $2) $4 $6 }+  | '[' tyident ']' string_literal '(' expression ')' {% withNodeInfo $1 $ CAsmOperand (Just $2) $4 $6 }   asm_clobbers :: { Reversed [CStrLit] } asm_clobbers-  : string_literal			            { singleton $1 }+  : string_literal			        { singleton $1 }   | asm_clobbers ',' string_literal	{ $1 `snoc` $3 }  {-@@ -647,27 +650,18 @@   	{% withNodeInfo $1 $ CDecl (reverse $1) [] }    | declaring_list ';'-  	{ case $1 of-            CDecl declspecs dies at ->-              CDecl declspecs (List.reverse dies) at }+  	{% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) }    | default_declaring_list ';'-  	{ case $1 of-            CDecl declspecs dies at ->-              CDecl declspecs (List.reverse dies) at }+  	{% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) }   declaration_list :: { Reversed [CDecl] } declaration_list-  : {- empty -}					{ empty }-  | declaration_list declaration		{ $1 `snoc` $2 }+  : {- empty -}					 { empty }+  | declaration_list declaration { $1 `snoc` $2 }  --- Note that if a typedef were redeclared, then a declaration--- specifier must be supplied------ Can't redeclare typedef names--- -- * SUMMARY: default_declaring_list :- qualifier* identifier_declarator asm_attrs initializer? --                                                 { ',' identifier_declarator asm_attrs initializer? } --@@ -682,7 +676,8 @@   	{% let declspecs = reverse $1 in   	   do{ declr <- withAsmNameAttrs $3 $2            ; doDeclIdent declspecs declr-           ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}+           ; withNodeInfo $1 $+                CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}    | type_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt   	{% let declspecs = liftTypeQuals $1 in@@ -708,7 +703,7 @@              CDecl declspecs dies at -> do                declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4                doDeclIdent declspecs declr-               return (CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) at) }+               withLength at $ CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies)  }  -- assembler, followed by attribute annotation asm_attrs_opt :: { (Maybe CStrLit, [CAttr]) }@@ -815,7 +810,7 @@ -- This recignises a whole list of type specifiers rather than just one -- as in the C99 grammar. ----- type_specifier :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | tyident)+-- type_specifier :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | g) -- type_specifier :: { [CDeclSpec] } type_specifier@@ -963,13 +958,13 @@   	{ $1 `snoc` CStorageSpec $2 }   	   | declaration_qualifier_list tyident-  	{% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeDef $2 at) }+  	{% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeDef $2 at) }    | declaration_qualifier_list typeof '(' expression ')'-  	{% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }+  	{% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }    | declaration_qualifier_list typeof '(' type_name ')'-  	{% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeOfType $4 at) }+  	{% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeOfType $4 at) }    | typedef_declaration_specifier declaration_qualifier   	{ $1 `snoc` $2 }@@ -1008,19 +1003,19 @@   	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeDef $2 at)) }    | attrs typeof '(' expression ')'-  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc`  (CTypeSpec (CTypeOfExpr $4 at)) }+  	{% withNodeInfo $1 $ \at -> reverseList (liftCAttrs $1) `snoc`  (CTypeSpec (CTypeOfExpr $4 at)) }    | attrs typeof '(' type_name ')'   	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc`  (CTypeSpec (CTypeOfType $4 at)) }    | type_qualifier_list attrs tyident-  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeDef $3 at) }+  	{% withNodeInfo $3 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeDef $3 at) }    | type_qualifier_list attrs typeof '(' expression ')'-  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfExpr $5 at) }+  	{% withNodeInfo $3 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfExpr $5 at) }    | type_qualifier_list attrs typeof '(' type_name ')'-  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfType $5 at) }+  	{% withNodeInfo $3 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfType $5 at) }    | typedef_type_specifier type_qualifier   	{ $1 `snoc` CTypeQual $2 }@@ -1406,7 +1401,7 @@ postfix_old_function_declarator :: { CDeclrR } postfix_old_function_declarator   : paren_identifier_declarator '(' identifier_list ')'-  	{% withNodeInfo $2 $ funDeclr $1 (Left $ reverse $3) [] }+  	{% withNodeInfo $1 $ funDeclr $1 (Left $ reverse $3) [] }    | '(' old_function_declarator ')'   	{ $2 }@@ -1707,31 +1702,31 @@   	{ $1 }    | postfix_expression '[' expression ']'-  	{% withNodeInfo $2 $ CIndex $1 $3 }+  	{% withNodeInfo $1 $ CIndex $1 $3 }    | postfix_expression '(' ')'-  	{% withNodeInfo $2 $ CCall $1 [] }+  	{% withNodeInfo $1 $ CCall $1 [] }    | postfix_expression '(' argument_expression_list ')'-  	{% withNodeInfo $2 $ CCall $1 (reverse $3) }+  	{% withNodeInfo $1 $ CCall $1 (reverse $3) }    | postfix_expression '.' identifier-  	{% withNodeInfo $2 $ CMember $1 $3 False }+  	{% withNodeInfo $1 $ CMember $1 $3 False }    | postfix_expression "->" identifier-  	{% withNodeInfo $2 $ CMember $1 $3 True }+  	{% withNodeInfo $1 $ CMember $1 $3 True }    | postfix_expression "++"-  	{% withNodeInfo $2 $ CUnary CPostIncOp $1 }+  	{% withNodeInfo $1 $ CUnary CPostIncOp $1 }    | postfix_expression "--"-  	{% withNodeInfo $2 $ CUnary CPostDecOp $1 }+  	{% withNodeInfo $1 $ CUnary CPostDecOp $1 }    | '(' type_name ')' '{' initializer_list '}'-  	{% withNodeInfo $4 $ CCompoundLit $2 (reverse $5) }+  	{% withNodeInfo $1 $ CCompoundLit $2 (reverse $5) }    | '(' type_name ')' '{' initializer_list ',' '}'-  	{% withNodeInfo $4 $ CCompoundLit $2 (reverse $5) }+  	{% withNodeInfo $1 $ CCompoundLit $2 (reverse $5) }   argument_expression_list :: { Reversed [CExpr] }@@ -1791,13 +1786,13 @@   	{ $1 }    | multiplicative_expression '*' cast_expression-  	{% withNodeInfo $2 $ CBinary CMulOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CMulOp $1 $3 }    | multiplicative_expression '/' cast_expression-  	{% withNodeInfo $2 $ CBinary CDivOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CDivOp $1 $3 }    | multiplicative_expression '%' cast_expression-  	{% withNodeInfo $2 $ CBinary CRmdOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CRmdOp $1 $3 }   -- parse C additive expression (C99 6.5.6)@@ -1808,10 +1803,10 @@   	{ $1 }    | additive_expression '+' multiplicative_expression-  	{% withNodeInfo $2 $ CBinary CAddOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CAddOp $1 $3 }    | additive_expression '-' multiplicative_expression-  	{% withNodeInfo $2 $ CBinary CSubOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CSubOp $1 $3 }   -- parse C shift expression (C99 6.5.7)@@ -1822,10 +1817,10 @@   	{ $1 }    | shift_expression "<<" additive_expression-  	{% withNodeInfo $2 $ CBinary CShlOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CShlOp $1 $3 }    | shift_expression ">>" additive_expression-  	{% withNodeInfo $2 $ CBinary CShrOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CShrOp $1 $3 }   -- parse C relational expression (C99 6.5.8)@@ -1836,16 +1831,16 @@   	{ $1 }    | relational_expression '<' shift_expression-  	{% withNodeInfo $2 $ CBinary CLeOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CLeOp $1 $3 }    | relational_expression '>' shift_expression-  	{% withNodeInfo $2 $ CBinary CGrOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CGrOp $1 $3 }    | relational_expression "<=" shift_expression-  	{% withNodeInfo $2 $ CBinary CLeqOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CLeqOp $1 $3 }    | relational_expression ">=" shift_expression-  	{% withNodeInfo $2 $ CBinary CGeqOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CGeqOp $1 $3 }   -- parse C equality expression (C99 6.5.9)@@ -1856,10 +1851,10 @@   	{ $1 }    | equality_expression "==" relational_expression-  	{% withNodeInfo $2 $ CBinary CEqOp  $1 $3 }+  	{% withNodeInfo $1 $ CBinary CEqOp  $1 $3 }    | equality_expression "!=" relational_expression-  	{% withNodeInfo $2 $ CBinary CNeqOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CNeqOp $1 $3 }   -- parse C bitwise and expression (C99 6.5.10)@@ -1870,7 +1865,7 @@   	{ $1 }    | and_expression '&' equality_expression-  	{% withNodeInfo $2 $ CBinary CAndOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CAndOp $1 $3 }   -- parse C bitwise exclusive or expression (C99 6.5.11)@@ -1881,7 +1876,7 @@   	{ $1 }    | exclusive_or_expression '^' and_expression-  	{% withNodeInfo $2 $ CBinary CXorOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CXorOp $1 $3 }   -- parse C bitwise or expression (C99 6.5.12)@@ -1892,7 +1887,7 @@   	{ $1 }    | inclusive_or_expression '|' exclusive_or_expression-  	{% withNodeInfo $2 $ CBinary COrOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary COrOp $1 $3 }   -- parse C logical and expression (C99 6.5.13)@@ -1903,7 +1898,7 @@   	{ $1 }    | logical_and_expression "&&" inclusive_or_expression-  	{% withNodeInfo $2 $ CBinary CLndOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CLndOp $1 $3 }   -- parse C logical or expression (C99 6.5.14)@@ -1914,7 +1909,7 @@   	{ $1 }    | logical_or_expression "||" logical_and_expression-  	{% withNodeInfo $2 $ CBinary CLorOp $1 $3 }+  	{% withNodeInfo $1 $ CBinary CLorOp $1 $3 }   -- parse C conditional expression (C99 6.5.15)@@ -1927,10 +1922,10 @@   	{ $1 }    | logical_or_expression '?' expression ':' conditional_expression-  	{% withNodeInfo $2 $ CCond $1 (Just $3) $5 }+  	{% withNodeInfo $1 $ CCond $1 (Just $3) $5 }    | logical_or_expression '?' ':' conditional_expression-  	{% withNodeInfo $2 $ CCond $1 Nothing $4 }+  	{% withNodeInfo $1 $ CCond $1 Nothing $4 }   -- parse C assignment expression (C99 6.5.16)@@ -1944,7 +1939,7 @@   	{ $1 }    | unary_expression assignment_operator assignment_expression-  	{% withNodeInfo $2 $ CAssign (unL $2) $1 $3 }+  	{% withNodeInfo $1 $ CAssign (unL $2) $1 $3 }   assignment_operator :: { Located CAssignOp }@@ -2081,17 +2076,34 @@ instance Pos (Located a) where   posOf (L _ pos) = pos +-- FIXME: the next 3 inlines here increase the object file size by  70%+-- Check whether the speed win is worth it {-# INLINE withNodeInfo #-} withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a-withNodeInfo node mkAttributedNode = do+withNodeInfo node mkAttrNode = do   name <- getNewName-  let attrs = mkNodeInfo (posOf node) name-  attrs `seq` return (mkAttributedNode attrs)+  lastTok <- getSavedToken+  let firstPos = posOf node+  let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok) name+  attrs `seq` return (mkAttrNode attrs) +{-# INLINE withLength #-}+withLength :: NodeInfo -> (NodeInfo -> a) -> P a+withLength nodeinfo mkAttrNode = do+  lastTok <- getSavedToken+  let firstPos = posOfNode nodeinfo+  let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok)+              (maybe (error "nameOfNode") id (nameOfNode nodeinfo))+  attrs `seq` return (mkAttrNode attrs)+ data CDeclrR = CDeclrR (Maybe Ident) (Reversed [CDerivedDeclr]) (Maybe CStrLit) [CAttr] NodeInfo reverseDeclr :: CDeclrR -> CDeclr reverseDeclr (CDeclrR ide reversedDDs asmname cattrs at)     = CDeclr ide (reverse reversedDDs) asmname cattrs at+instance CNode (CDeclrR) where+    nodeInfo (CDeclrR _ _ _ _ n) = n+instance Pos (CDeclrR) where+    posOf (CDeclrR _ _ _ _ n) = posOf n  {-# INLINE withAttribute #-} withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR@@ -2172,9 +2184,7 @@                  Nothing -> CNoArrSize var_sized  liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]-liftTypeQuals (Reversed tyqs) = revmap [] tyqs-  where revmap a []     = a-        revmap a (x:xs) = revmap (CTypeQual x : a) xs+liftTypeQuals = map CTypeQual . reverse  -- lift CAttrs to DeclSpecs --@@ -2201,7 +2211,9 @@ instance Pos a => Pos (Reversed a) where   posOf (Reversed x) = posOf x -emptyDeclr     = CDeclrR Nothing empty Nothing [] (mkNodeInfoOnlyPos nopos)+emptyDeclr :: CDeclrR+emptyDeclr       = CDeclrR Nothing empty Nothing [] undefNode+mkVarDeclr :: Ident -> NodeInfo -> CDeclrR mkVarDeclr ident = CDeclrR (Just ident) empty Nothing []  -- Take the identifiers and use them to update the typedef'ed identifier set@@ -2213,7 +2225,7 @@   case mIdent of     Nothing -> return ()     Just ident | any iypedef declspecs -> addTypedef ident-               | otherwise               -> shadowTypedef ident+               | otherwise             -> shadowTypedef ident    where iypedef (CStorageSpec (CTypedef _)) = True         iypedef _                           = False
src/Language/C/Parser/ParserMonad.hs view
@@ -33,7 +33,10 @@   getInput,          -- :: P String   setInput,          -- :: String -> P ()   getLastToken,      -- :: P CToken+  getSavedToken,     -- :: P CToken   setLastToken,      -- :: CToken -> P ()+  handleEofToken,    -- :: P ()+  getCurrentPosition,-- :: P Position   ParseError(..),   ) where import Language.C.Data.Error (internalErr, showErrorInfo,ErrorInfo(..),ErrorLevel(..))@@ -41,7 +44,7 @@ import Language.C.Data.InputStream import Language.C.Data.Name    (Name) import Language.C.Data.Ident    (Ident)-import Language.C.Parser.Tokens (CToken)+import Language.C.Parser.Tokens (CToken(CTokEof))  import Data.Set  (Set) import qualified Data.Set as Set (fromList, insert, member, delete)@@ -59,6 +62,7 @@         curPos     :: !Position,        -- position at current input location         curInput   :: !InputStream,      -- the current input         prevToken  ::  CToken,          -- the previous token+        savedToken ::  CToken,          -- and the token before that         namesupply :: ![Name],          -- the name unique supply         tyidents   :: !(Set Ident),     -- the set of typedef'ed identifiers         scopes     :: ![Set Ident]      -- the tyident sets for outer scopes@@ -87,6 +91,7 @@           curPos = pos,           curInput = input,           prevToken = internalErr "CLexer.execParser: Touched undefined token!",+          savedToken = internalErr "CLexer.execParser: Touched undefined token (safed token)!",           namesupply = names,           tyidents = Set.fromList builtins,           scopes   = []@@ -107,7 +112,7 @@ failP pos msg = P $ \_ -> PFailed msg pos  getNewName :: P Name-getNewName = P $ \s@PState{namesupply=(n:ns)} -> POk s{namesupply=ns} n+getNewName = P $ \s@PState{namesupply=(n:ns)} -> n `seq` POk s{namesupply=ns} n  setPos :: Position -> P () setPos pos = P $ \s -> POk s{curPos=pos} ()@@ -151,5 +156,17 @@ getLastToken :: P CToken getLastToken = P $ \s@PState{prevToken=tok} -> POk s tok +getSavedToken :: P CToken+getSavedToken = P $ \s@PState{savedToken=tok} -> POk s tok++-- | @setLastToken modifyCache tok@ setLastToken :: CToken -> P ()-setLastToken tok = P $ \s -> POk s{prevToken=tok} ()+setLastToken CTokEof = P $ \s -> POk s{savedToken=(prevToken s)} ()+setLastToken tok      = P $ \s -> POk s{prevToken=tok,savedToken=(prevToken s)} ()++-- | handle an End-Of-File token (changes savedToken)+handleEofToken :: P ()+handleEofToken = P $ \s -> POk s{savedToken=(prevToken s)} ()++getCurrentPosition :: P Position+getCurrentPosition = P $ \s@PState{curPos=pos} -> POk s pos
src/Language/C/Parser/Tokens.hs view
@@ -11,126 +11,126 @@ --  C Tokens for the C lexer. -- ------------------------------------------------------------------------------module Language.C.Parser.Tokens (CToken(..), GnuCTok(..)) where+module Language.C.Parser.Tokens (CToken(..), posLenOfTok, GnuCTok(..)) where -import Language.C.Data.Position  (Position, Pos(..))-import Language.C.Data.Ident    (Ident, identToString)-import Language.C.Syntax.Constants     (CChar, CInteger, CFloat, CString)+import Language.C.Data.Position    (Position, Pos(..), PosLength)+import Language.C.Data.Ident       (Ident, identToString)+import Language.C.Syntax.Constants (CChar, CInteger, CFloat, CString)  -- token definition -- ----------------  -- possible tokens (EXPORTED) ---data CToken = CTokLParen   !Position            -- `('-            | CTokRParen   !Position            -- `)'-            | CTokLBracket !Position            -- `['-            | CTokRBracket !Position            -- `]'-            | CTokArrow    !Position            -- `->'-            | CTokDot      !Position            -- `.'-            | CTokExclam   !Position            -- `!'-            | CTokTilde    !Position            -- `~'-            | CTokInc      !Position            -- `++'-            | CTokDec      !Position            -- `--'-            | CTokPlus     !Position            -- `+'-            | CTokMinus    !Position            -- `-'-            | CTokStar     !Position            -- `*'-            | CTokSlash    !Position            -- `/'-            | CTokPercent  !Position            -- `%'-            | CTokAmper    !Position            -- `&'-            | CTokShiftL   !Position            -- `<<'-            | CTokShiftR   !Position            -- `>>'-            | CTokLess     !Position            -- `<'-            | CTokLessEq   !Position            -- `<='-            | CTokHigh     !Position            -- `>'-            | CTokHighEq   !Position            -- `>='-            | CTokEqual    !Position            -- `=='-            | CTokUnequal  !Position            -- `!='-            | CTokHat      !Position            -- `^'-            | CTokBar      !Position            -- `|'-            | CTokAnd      !Position            -- `&&'-            | CTokOr       !Position            -- `||'-            | CTokQuest    !Position            -- `?'-            | CTokColon    !Position            -- `:'-            | CTokAssign   !Position            -- `='-            | CTokPlusAss  !Position            -- `+='-            | CTokMinusAss !Position            -- `-='-            | CTokStarAss  !Position            -- `*='-            | CTokSlashAss !Position            -- `/='-            | CTokPercAss  !Position            -- `%='-            | CTokAmpAss   !Position            -- `&='-            | CTokHatAss   !Position            -- `^='-            | CTokBarAss   !Position            -- `|='-            | CTokSLAss    !Position            -- `<<='-            | CTokSRAss    !Position            -- `>>='-            | CTokComma    !Position            -- `,'-            | CTokSemic    !Position            -- `;'-            | CTokLBrace   !Position            -- `{'-            | CTokRBrace   !Position            ---            | CTokEllipsis !Position            -- `...'-            | CTokAlignof  !Position            -- `alignof'+data CToken = CTokLParen   !PosLength            -- `('+            | CTokRParen   !PosLength            -- `)'+            | CTokLBracket !PosLength            -- `['+            | CTokRBracket !PosLength            -- `]'+            | CTokArrow    !PosLength            -- `->'+            | CTokDot      !PosLength            -- `.'+            | CTokExclam   !PosLength            -- `!'+            | CTokTilde    !PosLength            -- `~'+            | CTokInc      !PosLength            -- `++'+            | CTokDec      !PosLength            -- `--'+            | CTokPlus     !PosLength            -- `+'+            | CTokMinus    !PosLength            -- `-'+            | CTokStar     !PosLength            -- `*'+            | CTokSlash    !PosLength            -- `/'+            | CTokPercent  !PosLength            -- `%'+            | CTokAmper    !PosLength            -- `&'+            | CTokShiftL   !PosLength            -- `<<'+            | CTokShiftR   !PosLength            -- `>>'+            | CTokLess     !PosLength            -- `<'+            | CTokLessEq   !PosLength            -- `<='+            | CTokHigh     !PosLength            -- `>'+            | CTokHighEq   !PosLength            -- `>='+            | CTokEqual    !PosLength            -- `=='+            | CTokUnequal  !PosLength            -- `!='+            | CTokHat      !PosLength            -- `^'+            | CTokBar      !PosLength            -- `|'+            | CTokAnd      !PosLength            -- `&&'+            | CTokOr       !PosLength            -- `||'+            | CTokQuest    !PosLength            -- `?'+            | CTokColon    !PosLength            -- `:'+            | CTokAssign   !PosLength            -- `='+            | CTokPlusAss  !PosLength            -- `+='+            | CTokMinusAss !PosLength            -- `-='+            | CTokStarAss  !PosLength            -- `*='+            | CTokSlashAss !PosLength            -- `/='+            | CTokPercAss  !PosLength            -- `%='+            | CTokAmpAss   !PosLength            -- `&='+            | CTokHatAss   !PosLength            -- `^='+            | CTokBarAss   !PosLength            -- `|='+            | CTokSLAss    !PosLength            -- `<<='+            | CTokSRAss    !PosLength            -- `>>='+            | CTokComma    !PosLength            -- `,'+            | CTokSemic    !PosLength            -- `;'+            | CTokLBrace   !PosLength            -- `{'+            | CTokRBrace   !PosLength            -- `}'+            | CTokEllipsis !PosLength            -- `...'+            | CTokAlignof  !PosLength            -- `alignof'                                                 -- (or `__alignof',                                                 -- `__alignof__')-            | CTokAsm      !Position            -- `asm'+            | CTokAsm      !PosLength            -- `asm'                                                 -- (or `__asm',                                                 -- `__asm__')-            | CTokAuto     !Position            -- `auto'-            | CTokBreak    !Position            -- `break'-            | CTokBool     !Position            -- `_Bool'-            | CTokCase     !Position            -- `case'-            | CTokChar     !Position            -- `char'-            | CTokConst    !Position            -- `const'+            | CTokAuto     !PosLength            -- `auto'+            | CTokBreak    !PosLength            -- `break'+            | CTokBool     !PosLength            -- `_Bool'+            | CTokCase     !PosLength            -- `case'+            | CTokChar     !PosLength            -- `char'+            | CTokConst    !PosLength            -- `const'                                                 -- (or `__const', `__const__')-            | CTokContinue !Position            -- `continue'-            | CTokComplex  !Position            -- `_Complex'-            | CTokDefault  !Position            -- `default'-            | CTokDo       !Position            -- `do'-            | CTokDouble   !Position            -- `double'-            | CTokElse     !Position            -- `else'-            | CTokEnum     !Position            -- `enum'-            | CTokExtern   !Position            -- `extern'-            | CTokFloat    !Position            -- `float'-            | CTokFor      !Position            -- `for'-            | CTokGoto     !Position            -- `goto'-            | CTokIf       !Position            -- `if'-            | CTokInline   !Position            -- `inline'+            | CTokContinue !PosLength            -- `continue'+            | CTokComplex  !PosLength            -- `_Complex'+            | CTokDefault  !PosLength            -- `default'+            | CTokDo       !PosLength            -- `do'+            | CTokDouble   !PosLength            -- `double'+            | CTokElse     !PosLength            -- `else'+            | CTokEnum     !PosLength            -- `enum'+            | CTokExtern   !PosLength            -- `extern'+            | CTokFloat    !PosLength            -- `float'+            | CTokFor      !PosLength            -- `for'+            | CTokGoto     !PosLength            -- `goto'+            | CTokIf       !PosLength            -- `if'+            | CTokInline   !PosLength            -- `inline'                                                 -- (or `__inline',                                                 -- `__inline__')-            | CTokInt      !Position            -- `int'-            | CTokLong     !Position            -- `long'-            | CTokLabel    !Position            -- `__label__'-            | CTokRegister !Position            -- `register'-            | CTokRestrict !Position            -- `restrict'+            | CTokInt      !PosLength            -- `int'+            | CTokLong     !PosLength            -- `long'+            | CTokLabel    !PosLength            -- `__label__'+            | CTokRegister !PosLength            -- `register'+            | CTokRestrict !PosLength            -- `restrict'                                                 -- (or `__restrict',                                                 -- `__restrict__')-            | CTokReturn   !Position            -- `return'-            | CTokShort    !Position            -- `short'-            | CTokSigned   !Position            -- `signed'+            | CTokReturn   !PosLength            -- `return'+            | CTokShort    !PosLength            -- `short'+            | CTokSigned   !PosLength            -- `signed'                                                 -- (or `__signed',                                                 -- `__signed__')-            | CTokSizeof   !Position            -- `sizeof'-            | CTokStatic   !Position            -- `static'-            | CTokStruct   !Position            -- `struct'-            | CTokSwitch   !Position            -- `switch'-            | CTokTypedef  !Position            -- `typedef'-            | CTokTypeof   !Position            -- `typeof'-            | CTokThread   !Position            -- `__thread'-            | CTokUnion    !Position            -- `union'-            | CTokUnsigned !Position            -- `unsigned'-            | CTokVoid     !Position            -- `void'-            | CTokVolatile !Position            -- `volatile'+            | CTokSizeof   !PosLength            -- `sizeof'+            | CTokStatic   !PosLength            -- `static'+            | CTokStruct   !PosLength            -- `struct'+            | CTokSwitch   !PosLength            -- `switch'+            | CTokTypedef  !PosLength            -- `typedef'+            | CTokTypeof   !PosLength            -- `typeof'+            | CTokThread   !PosLength            -- `__thread'+            | CTokUnion    !PosLength            -- `union'+            | CTokUnsigned !PosLength            -- `unsigned'+            | CTokVoid     !PosLength            -- `void'+            | CTokVolatile !PosLength            -- `volatile'                                                 -- (or `__volatile',                                                 -- `__volatile__')-            | CTokWhile    !Position            -- `while'-            | CTokCLit     !Position !CChar     -- character constant-            | CTokILit     !Position !CInteger  -- integer constant-            | CTokFLit     !Position CFloat     -- float constant-            | CTokSLit     !Position CString    -- string constant-            | CTokIdent    !Position !Ident     -- identifier+            | CTokWhile    !PosLength            -- `while'+            | CTokCLit     !PosLength !CChar     -- character constant+            | CTokILit     !PosLength !CInteger  -- integer constant+            | CTokFLit     !PosLength CFloat     -- float constant+            | CTokSLit     !PosLength CString    -- string constant+            | CTokIdent    !PosLength !Ident     -- identifier                -- not generated here, but in `CParser.parseCHeader'-            | CTokTyIdent  !Position !Ident     -- `typedef-name' identifier-            | CTokGnuC !GnuCTok !Position       -- special GNU C tokens+            | CTokTyIdent  !PosLength !Ident     -- `typedef-name' identifier+            | CTokGnuC !GnuCTok !PosLength       -- special GNU C tokens             | CTokEof                           -- end of file  -- special tokens used in GNU C extensions to ANSI C@@ -144,101 +144,106 @@              | GnuCComplexImag          -- `__imag__'  instance Pos CToken where-  posOf (CTokLParen   pos  ) = pos-  posOf (CTokRParen   pos  ) = pos-  posOf (CTokLBracket pos  ) = pos-  posOf (CTokRBracket pos  ) = pos-  posOf (CTokArrow    pos  ) = pos-  posOf (CTokDot      pos  ) = pos-  posOf (CTokExclam   pos  ) = pos-  posOf (CTokTilde    pos  ) = pos-  posOf (CTokInc      pos  ) = pos-  posOf (CTokDec      pos  ) = pos-  posOf (CTokPlus     pos  ) = pos-  posOf (CTokMinus    pos  ) = pos-  posOf (CTokStar     pos  ) = pos-  posOf (CTokSlash    pos  ) = pos-  posOf (CTokPercent  pos  ) = pos-  posOf (CTokAmper    pos  ) = pos-  posOf (CTokShiftL   pos  ) = pos-  posOf (CTokShiftR   pos  ) = pos-  posOf (CTokLess     pos  ) = pos-  posOf (CTokLessEq   pos  ) = pos-  posOf (CTokHigh     pos  ) = pos-  posOf (CTokHighEq   pos  ) = pos-  posOf (CTokEqual    pos  ) = pos-  posOf (CTokUnequal  pos  ) = pos-  posOf (CTokHat      pos  ) = pos-  posOf (CTokBar      pos  ) = pos-  posOf (CTokAnd      pos  ) = pos-  posOf (CTokOr       pos  ) = pos-  posOf (CTokQuest    pos  ) = pos-  posOf (CTokColon    pos  ) = pos-  posOf (CTokAssign   pos  ) = pos-  posOf (CTokPlusAss  pos  ) = pos-  posOf (CTokMinusAss pos  ) = pos-  posOf (CTokStarAss  pos  ) = pos-  posOf (CTokSlashAss pos  ) = pos-  posOf (CTokPercAss  pos  ) = pos-  posOf (CTokAmpAss   pos  ) = pos-  posOf (CTokHatAss   pos  ) = pos-  posOf (CTokBarAss   pos  ) = pos-  posOf (CTokSLAss    pos  ) = pos-  posOf (CTokSRAss    pos  ) = pos-  posOf (CTokComma    pos  ) = pos-  posOf (CTokSemic    pos  ) = pos-  posOf (CTokLBrace   pos  ) = pos-  posOf (CTokRBrace   pos  ) = pos-  posOf (CTokEllipsis pos  ) = pos-  posOf (CTokAlignof  pos  ) = pos-  posOf (CTokAsm      pos  ) = pos-  posOf (CTokAuto     pos  ) = pos-  posOf (CTokBreak    pos  ) = pos-  posOf (CTokBool     pos  ) = pos-  posOf (CTokCase     pos  ) = pos-  posOf (CTokChar     pos  ) = pos-  posOf (CTokConst    pos  ) = pos-  posOf (CTokContinue pos  ) = pos-  posOf (CTokComplex  pos  ) = pos-  posOf (CTokDefault  pos  ) = pos-  posOf (CTokDo       pos  ) = pos-  posOf (CTokDouble   pos  ) = pos-  posOf (CTokElse     pos  ) = pos-  posOf (CTokEnum     pos  ) = pos-  posOf (CTokExtern   pos  ) = pos-  posOf (CTokFloat    pos  ) = pos-  posOf (CTokFor      pos  ) = pos-  posOf (CTokGoto     pos  ) = pos-  posOf (CTokInt      pos  ) = pos-  posOf (CTokInline   pos  ) = pos-  posOf (CTokIf       pos  ) = pos-  posOf (CTokLong     pos  ) = pos-  posOf (CTokLabel    pos  ) = pos-  posOf (CTokRegister pos  ) = pos-  posOf (CTokRestrict pos  ) = pos-  posOf (CTokReturn   pos  ) = pos-  posOf (CTokShort    pos  ) = pos-  posOf (CTokSigned   pos  ) = pos-  posOf (CTokSizeof   pos  ) = pos-  posOf (CTokStatic   pos  ) = pos-  posOf (CTokStruct   pos  ) = pos-  posOf (CTokSwitch   pos  ) = pos-  posOf (CTokTypedef  pos  ) = pos-  posOf (CTokTypeof   pos  ) = pos-  posOf (CTokThread   pos  ) = pos-  posOf (CTokUnion    pos  ) = pos-  posOf (CTokUnsigned pos  ) = pos-  posOf (CTokVoid     pos  ) = pos-  posOf (CTokVolatile pos  ) = pos-  posOf (CTokWhile    pos  ) = pos-  posOf (CTokCLit     pos _) = pos-  posOf (CTokILit     pos _) = pos-  posOf (CTokFLit     pos _) = pos-  posOf (CTokSLit     pos _) = pos-  posOf (CTokIdent    pos _) = pos-  posOf (CTokTyIdent  pos _) = pos-  posOf (CTokGnuC   _ pos  ) = pos-  posOf CTokEof = error "tokenPos: Eof"+  posOf = fst . posLenOfTok++-- token position and length+posLenOfTok :: CToken -> (Position,Int)+posLenOfTok (CTokLParen   pos  ) = pos+posLenOfTok (CTokRParen   pos  ) = pos+posLenOfTok (CTokLBracket pos  ) = pos+posLenOfTok (CTokRBracket pos  ) = pos+posLenOfTok (CTokArrow    pos  ) = pos+posLenOfTok (CTokDot      pos  ) = pos+posLenOfTok (CTokExclam   pos  ) = pos+posLenOfTok (CTokTilde    pos  ) = pos+posLenOfTok (CTokInc      pos  ) = pos+posLenOfTok (CTokDec      pos  ) = pos+posLenOfTok (CTokPlus     pos  ) = pos+posLenOfTok (CTokMinus    pos  ) = pos+posLenOfTok (CTokStar     pos  ) = pos+posLenOfTok (CTokSlash    pos  ) = pos+posLenOfTok (CTokPercent  pos  ) = pos+posLenOfTok (CTokAmper    pos  ) = pos+posLenOfTok (CTokShiftL   pos  ) = pos+posLenOfTok (CTokShiftR   pos  ) = pos+posLenOfTok (CTokLess     pos  ) = pos+posLenOfTok (CTokLessEq   pos  ) = pos+posLenOfTok (CTokHigh     pos  ) = pos+posLenOfTok (CTokHighEq   pos  ) = pos+posLenOfTok (CTokEqual    pos  ) = pos+posLenOfTok (CTokUnequal  pos  ) = pos+posLenOfTok (CTokHat      pos  ) = pos+posLenOfTok (CTokBar      pos  ) = pos+posLenOfTok (CTokAnd      pos  ) = pos+posLenOfTok (CTokOr       pos  ) = pos+posLenOfTok (CTokQuest    pos  ) = pos+posLenOfTok (CTokColon    pos  ) = pos+posLenOfTok (CTokAssign   pos  ) = pos+posLenOfTok (CTokPlusAss  pos  ) = pos+posLenOfTok (CTokMinusAss pos  ) = pos+posLenOfTok (CTokStarAss  pos  ) = pos+posLenOfTok (CTokSlashAss pos  ) = pos+posLenOfTok (CTokPercAss  pos  ) = pos+posLenOfTok (CTokAmpAss   pos  ) = pos+posLenOfTok (CTokHatAss   pos  ) = pos+posLenOfTok (CTokBarAss   pos  ) = pos+posLenOfTok (CTokSLAss    pos  ) = pos+posLenOfTok (CTokSRAss    pos  ) = pos+posLenOfTok (CTokComma    pos  ) = pos+posLenOfTok (CTokSemic    pos  ) = pos+posLenOfTok (CTokLBrace   pos  ) = pos+posLenOfTok (CTokRBrace   pos  ) = pos+posLenOfTok (CTokEllipsis pos  ) = pos+posLenOfTok (CTokAlignof  pos  ) = pos+posLenOfTok (CTokAsm      pos  ) = pos+posLenOfTok (CTokAuto     pos  ) = pos+posLenOfTok (CTokBreak    pos  ) = pos+posLenOfTok (CTokBool     pos  ) = pos+posLenOfTok (CTokCase     pos  ) = pos+posLenOfTok (CTokChar     pos  ) = pos+posLenOfTok (CTokConst    pos  ) = pos+posLenOfTok (CTokContinue pos  ) = pos+posLenOfTok (CTokComplex  pos  ) = pos+posLenOfTok (CTokDefault  pos  ) = pos+posLenOfTok (CTokDo       pos  ) = pos+posLenOfTok (CTokDouble   pos  ) = pos+posLenOfTok (CTokElse     pos  ) = pos+posLenOfTok (CTokEnum     pos  ) = pos+posLenOfTok (CTokExtern   pos  ) = pos+posLenOfTok (CTokFloat    pos  ) = pos+posLenOfTok (CTokFor      pos  ) = pos+posLenOfTok (CTokGoto     pos  ) = pos+posLenOfTok (CTokInt      pos  ) = pos+posLenOfTok (CTokInline   pos  ) = pos+posLenOfTok (CTokIf       pos  ) = pos+posLenOfTok (CTokLong     pos  ) = pos+posLenOfTok (CTokLabel    pos  ) = pos+posLenOfTok (CTokRegister pos  ) = pos+posLenOfTok (CTokRestrict pos  ) = pos+posLenOfTok (CTokReturn   pos  ) = pos+posLenOfTok (CTokShort    pos  ) = pos+posLenOfTok (CTokSigned   pos  ) = pos+posLenOfTok (CTokSizeof   pos  ) = pos+posLenOfTok (CTokStatic   pos  ) = pos+posLenOfTok (CTokStruct   pos  ) = pos+posLenOfTok (CTokSwitch   pos  ) = pos+posLenOfTok (CTokTypedef  pos  ) = pos+posLenOfTok (CTokTypeof   pos  ) = pos+posLenOfTok (CTokThread   pos  ) = pos+posLenOfTok (CTokUnion    pos  ) = pos+posLenOfTok (CTokUnsigned pos  ) = pos+posLenOfTok (CTokVoid     pos  ) = pos+posLenOfTok (CTokVolatile pos  ) = pos+posLenOfTok (CTokWhile    pos  ) = pos+posLenOfTok (CTokCLit     pos _) = pos+posLenOfTok (CTokILit     pos _) = pos+posLenOfTok (CTokFLit     pos _) = pos+posLenOfTok (CTokSLit     pos _) = pos+posLenOfTok (CTokIdent    pos _) = pos+posLenOfTok (CTokTyIdent  pos _) = pos+posLenOfTok (CTokGnuC   _ pos  ) = pos+posLenOfTok CTokEof = error "tokenPos: Eof"+ instance Show CToken where   showsPrec _ (CTokLParen   _  ) = showString "("   showsPrec _ (CTokRParen   _  ) = showString ")"@@ -341,4 +346,3 @@   showsPrec _ (CTokGnuC GnuCOffsetof _) = showString "__builtin_offsetof"   showsPrec _ (CTokGnuC GnuCTyCompat _) = showString "__builtin_types_compatible_p"   showsPrec _ CTokEof = error "show CToken : CTokEof"-
src/Language/C/Pretty.hs view
@@ -1,4 +1,4 @@-{-# OPTIONS  #-}+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances  #-} ----------------------------------------------------------------------------- -- | -- Module      :  Language.C.Pretty@@ -73,7 +73,7 @@  -- | Pretty print the given tranlation unit, but replace declarations from header files with @#include@ directives. ----- The resulting file may not compile (because of missing @#define@ directives and similar things), but is very usefull+-- The resulting file may not compile (because of missing @#define@ directives and similar things), but is very useful -- for testing, as otherwise the pretty printed file will be cluttered with declarations from system headers. prettyUsingInclude :: CTranslUnit -> Doc prettyUsingInclude (CTranslUnit edecls _) =@@ -91,13 +91,13 @@     includeHeader hFile = text "#include" <+> doubleQuotes (text hFile)     isHeaderFile = (".h" `isSuffixOf`)     includeWarning hs | Set.null hs = empty-                      | otherwise = text "/* Warning: The #include directives in this file aren't neccessarily correct. */"+                      | otherwise = text "/* Warning: The #include directives in this file aren't necessarily correct. */"  -- TODO: Check need of __extension__ instance Pretty CExtDecl where     pretty (CDeclExt decl) = pretty decl <> semi     pretty (CFDefExt fund) = pretty fund-    pretty (CAsmExt  asmStmt) = text "asm" <> parens (pretty asmStmt) <> semi+    pretty (CAsmExt  asmStmt _) = text "asm" <> parens (pretty asmStmt) <> semi  -- TODO: Check that old-style and new-style aren't mixed instance Pretty CFunDef where@@ -119,18 +119,19 @@     pretty (CExpr expr _) = ii $ maybeP pretty expr <> semi     pretty c@(CCompound _ _ _) = prettyPrec 0 c     pretty (CIf expr stat estat _) =-        ii $  text "if" <+> text "(" <> pretty expr <> text ")"-                $+$ prettyThen stat+        ii $  text "if" <+> parens (pretty expr)+                $+$ prettyBody stat                 $$  maybeP prettyElse estat       where-        prettyThen stat@(CIf _ _ _ _) = text "{" $+$ prettyPrec (-1) stat $$ text "}"-        prettyThen stat = prettyPrec (-1) stat+        prettyBody c@(CCompound _ _ _) = prettyPrec (-1) c+        prettyBody nonCompound         = prettyPrec (-1) (CCompound [] [CBlockStmt nonCompound] undefined)         prettyElse (CIf else_if_expr else_if_stat else_stat _) =-          text "else if" <+> text "(" <> pretty else_if_expr <> text ")"-            $+$ prettyPrec (-1) else_if_stat-          $$ maybeP prettyElse else_stat+          text "else if" <+> parens (pretty else_if_expr)+            $+$ prettyBody else_if_stat+            $$  maybeP prettyElse else_stat         prettyElse else_stmt =-          text "else" $+$ prettyPrec (-1) else_stmt+          text "else"+            $+$ prettyBody else_stmt      pretty (CSwitch expr stat _) =         ii $ text "switch" <+> text "(" <> pretty expr <> text ")"@@ -384,7 +385,7 @@     prettyPrec p (CUnary CPostDecOp expr _) =         parenPrec p 26 $ prettyPrec 26 expr <> text "--"     prettyPrec p (CUnary op expr@(CUnary _ _ _) _) =-        --                             parens aren't neccessary, but look nicer imho+        --                             parens aren't necessary, but look nicer imho         parenPrec p 25 $ pretty op <+> parens (prettyPrec 25 expr)     prettyPrec p (CUnary op expr _) =         parenPrec p 25 $ pretty op <> prettyPrec 25 expr@@ -439,13 +440,52 @@         (parens $ pretty ty1 <> comma <+> pretty ty2)  instance Pretty CAssignOp where-    pretty = text . show+  pretty op = text $ case op of+    CAssignOp -> "="+    CMulAssOp -> "*="+    CDivAssOp -> "/="+    CRmdAssOp -> "%="+    CAddAssOp -> "+="+    CSubAssOp -> "-="+    CShlAssOp -> "<<="+    CShrAssOp -> ">>="+    CAndAssOp -> "&="+    CXorAssOp -> "^="+    COrAssOp  -> "|="  instance Pretty CBinaryOp where-    pretty = text . show+  pretty op = text $ case op of+    CMulOp -> "*"+    CDivOp -> "/"+    CRmdOp -> "%"+    CAddOp -> "+"+    CSubOp -> "-"+    CShlOp -> "<<"+    CShrOp -> ">>"+    CLeOp  -> "<"+    CGrOp  -> ">"+    CLeqOp -> "<="+    CGeqOp -> ">="+    CEqOp  -> "=="+    CNeqOp -> "!="+    CAndOp -> "&"+    CXorOp -> "^"+    COrOp  -> "|"+    CLndOp -> "&&"+    CLorOp -> "||"  instance Pretty CUnaryOp where-    pretty = text . show+  pretty op = text $ case op of+    CPreIncOp  -> "++"+    CPreDecOp  -> "--"+    CPostIncOp -> "++"+    CPostDecOp -> "--"+    CAdrOp     -> "&"+    CIndOp     -> "*"+    CPlusOp    -> "+"+    CMinOp     -> "-"+    CCompOp    -> "~"+    CNegOp     -> "!"  instance Pretty CConst where     pretty (CIntConst   int_const _) = text (show int_const)
src/Language/C/Syntax/AST.hs view
@@ -1,738 +1,1368 @@ {-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module      :  Language.C.Syntax.AST--- Copyright   :  (c) [1999..2007] Manuel M T Chakravarty---                (c) 2008 Benedikt Huber--- License     :  BSD-style--- Maintainer  : benedikt.huber@gmail.com--- Stability   : experimental--- Portability : ghc------ Abstract syntax of C source and header files.------  The tree structure is based on the grammar in Appendix A of K&R.  The---  abstract syntax simplifies the concrete syntax by merging similar concrete---  constructs into a single type of abstract tree structure: declarations are---  merged with structure declarations, parameter declarations and type names,---  and declarators are merged with abstract declarators.------  With K&R we refer to ``The C Programming Language'', second edition, Brain---  W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988. The AST supports all---  of C99 <http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf> and several---  GNU extensions <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>.-------------------------------------------------------------------------------module Language.C.Syntax.AST (-  -- * C translation units-  CTranslUnit(..),  CExtDecl(..),-  -- * Declarations-  CFunDef(..),  CDecl(..),-  CStructUnion(..),  CStructTag(..), CEnum(..),-  -- * Declaration attributes-  CDeclSpec(..), partitionDeclSpecs,-  CStorageSpec(..), CTypeSpec(..), isSUEDef, CTypeQual(..), CAttr(..),-  -- * Declarators-  CDeclr(..),CDerivedDeclr(..),CArrSize(..),-  -- * Initialization-  CInit(..), CInitList, CDesignator(..),-  -- * Statements-  CStat(..), CBlockItem(..),-  CAsmStmt(..), CAsmOperand(..),-  -- * Expressions-  CExpr(..),-  CAssignOp(..), CBinaryOp(..), CUnaryOp(..),-  CBuiltin(..),-  -- * Constants-  CConst(..),CStrLit(..),cstringOfLit,liftStrLit,-) where-import Data.List-import Language.C.Syntax.Constants-import Language.C.Syntax.Ops-import Language.C.Data.Ident-import Language.C.Data.Node-import Language.C.Data.Position-import Data.Generics---- | Complete C tranlsation unit (C99 6.9, K&R A10)------ A complete C translation unit, for example representing a C header or source file.--- It consists of a list of external (i.e. toplevel) declarations.-data CTranslUnit = CTranslUnit [CExtDecl] NodeInfo-                   deriving (Data,Typeable {-! CNode !-})---- | External C declaration (C99 6.9, K&R A10)------ Either a toplevel declaration, function definition or external assembler.-data CExtDecl = CDeclExt CDecl-              | CFDefExt CFunDef-              | CAsmExt  CStrLit-              deriving (Data,Typeable {-! CNode !-})---- | C function definition (C99 6.9.1, K&R A10.1)------ A function definition is of the form @CFunDef specifiers declarator decllist? stmt@.------ * @specifiers@ are the type and storage-class specifiers of the function.---   The only storage-class specifiers allowed are /extern/ and /static/.------ * The @declarator@ must be such that the declared identifier has /function type/.---   The return type shall be void or an object type other than array type.------ * The optional declaration list @decllist@ is for old-style function declarations.------ * The statement @stmt@ is a compound statement.-data CFunDef = CFunDef [CDeclSpec]      -- type specifier and qualifier-                       CDeclr           -- declarator-                       [CDecl]          -- optional declaration list-                       CStat            -- compound statement-                       NodeInfo-               deriving (Data,Typeable {-! CNode !-})---- | C declarations (K&R A8, C99 6.7), including structure declarations, parameter---   declarations and type names.------ A declaration is of the form @CDecl specifiers init-declarator-list@, where the form of the declarator list's---  elements depends on the kind of declaration:------ 1) Toplevel declarations (K&R A8, C99 6.7 declaration)------   * C99 requires that there is at least one specifier, though this is merely a syntactic restriction------   * at most one storage class specifier is allowed per declaration------   * the elements of the non-empty @init-declarator-list@ are of the form @(Just declr, init?, Nothing)@.---      The declarator @declr@ has to be present and non-abstract and the initialization expression is---      optional.------ 2) Structure declarations (K&R A8.3, C99 6.7.2.1 struct-declaration)------   Those are the declarations of a structure's members.------   * do not allow storage specifiers------   * in strict C99, the list of declarators has to be non-empty------   * the elements of @init-declarator-list@ are either of the form @(Just declr, Nothing, size?)@,---     representing a member with optional bit-field size, or of the form @(Nothing, Nothing, Just size)@,---     for unnamed bitfields. @declr@ has to be non-abstract.------   * no member of a structure shall have incomplete type------ 3) Parameter declarations (K&R A8.6.3, C99 6.7.5 parameter-declaration)------   * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@,---     i.e. consist of a single declarator, which is allowed to be abstract (i.e. unnamed).------ 4) Type names (A8.8, C99 6.7.6)------   * do not allow storage specifiers------   * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@.---     where @declr@ is an abstract declarator (i.e. doesn't contain a declared identifier)----data CDecl = CDecl [CDeclSpec]          -- type specifier and qualifier, __attribute__-                   [(Maybe CDeclr,      -- declarator (may be omitted)-                     Maybe CInit,       -- optional initialize-                     Maybe CExpr)]      -- optional size (const expr)-                   NodeInfo-             deriving (Data,Typeable {-! CNode !-})---- | C declarator (K&R A8.5, C99 6.7.5) and abstract declarator (K&R A8.8, C99 6.7.6)------ A declarator declares a single object, function, or type. It is always associated with--- a declaration ('CDecl'), which specifies the declaration's type and the additional storage qualifiers and--- attributes, which apply to the declared object.------ A declarator is of the form @CDeclr name? indirections asm-name? attrs _@, where--- @name@ is the name of the declared object (missing for abstract declarators),--- @declquals@ is a set of additional declaration specifiers,--- @asm-name@ is the optional assembler name and attributes is a set of--- attrs is a set of @__attribute__@ annotations for the declared object.------ @indirections@ is a set of pointer, array and function declarators, which modify the type of the declared object as--- described below. If the /declaration/ specifies the non-derived type @T@,--- and we have @indirections = [D1, D2, ..., Dn]@ than the declared object has type--- @(D1 `indirect` (D2 `indirect` ...  (Dn `indirect` T)))@, where------  * @(CPtrDeclr attrs) `indirect` T@ is /attributed pointer to T/------  * @(CFunDeclr attrs) `indirect` T@ is /attributed function returning T/------  * @(CArrayDeclr attrs) `indirect` T@ is /attributed array of elemements of type T/------ Examples (simplified attributes):------  * /x/ is an int------ > int x;--- > CDeclr "x" []------  * /x/ is a restrict pointer to a const pointer to int------ > const int * const * restrict x;--- > CDeclr "x" [CPtrDeclr [restrict], CPtrDeclr [const]]------  * /f/ is an function return a constant pointer to int------ > int* const f();--- > CDeclr "f" [CFunDeclr [],CPtrDeclr [const]]------  * /f/ is a constant pointer to a function returning int------ > int (* const f)(); ==>--- > CDeclr "f" [CPtrDeclr [const], CFunDeclr []]-data CDeclr = CDeclr (Maybe Ident) [CDerivedDeclr] (Maybe CStrLit) [CAttr] NodeInfo-              deriving (Data,Typeable {-! CNode !-})---- | Derived declarators, see 'CDeclr'------ Indirections are qualified using type-qualifiers and generic attributes, and additionally------    * The size of an array is either a constant expression, variable length ('*') or missing; in the last case, the---      type of the array is incomplete. The qualifier static is allowed for function arguments only, indicating that---      the supplied argument is an array of at least the given size.------    * New style parameter lists have the form @Right (declarations, isVariadic)@, old style parameter lists have the---      form @Left (parameter-names)@-data CDerivedDeclr =-              CPtrDeclr [CTypeQual] NodeInfo-              -- ^ Pointer declarator @CPtrDeclr tyquals declr@-            | CArrDeclr [CTypeQual] (CArrSize) NodeInfo-              -- ^ Array declarator @CArrDeclr declr tyquals size-expr?@-            | CFunDeclr (Either [Ident] ([CDecl],Bool)) [CAttr] NodeInfo-              -- ^ Function declarator @CFunDeclr declr (old-style-params | new-style-params) c-attrs@-            deriving (Data,Typeable {-! CNode !-})---- | Size of an array-data CArrSize = CNoArrSize Bool     -- ^ @CUnknownSize isCompleteType@-              | CArrSize Bool CExpr -- ^ @CArrSize isStatic expr@-              deriving (Data,Typeable)---- | C statement (K&R A9, C99 6.8)----data CStat = CLabel  Ident CStat [CAttr] NodeInfo  -- ^ An (attributed) label followed by a statement-           | CCase CExpr CStat NodeInfo            -- ^ A statement of the form @case expr : stmt@-           | CCases CExpr CExpr CStat NodeInfo     -- ^ A case range of the form @case lower ... upper : stmt@-           | CDefault CStat NodeInfo               -- ^ The default case @default : stmt@-           | CExpr (Maybe CExpr) NodeInfo-           -- ^ A simple statement, that is in C: evaluating an expression with side-effects-           --   and discarding the result.-           | CCompound [Ident] [CBlockItem] NodeInfo    -- ^ compound statement @CCompound localLabels blockItems at@-           | CIf CExpr CStat (Maybe CStat) NodeInfo     -- ^ conditional statement @CIf ifExpr thenStmt maybeElseStmt at@-           | CSwitch CExpr CStat NodeInfo-           -- ^ switch statement @CSwitch selectorExpr switchStmt@, where @switchStmt@ usually includes-           -- /case/, /break/ and /default/ statements-           | CWhile CExpr CStat Bool NodeInfo      -- ^ while or do-while statement @CWhile guard stmt isDoWhile at@-           | CFor (Either (Maybe CExpr) CDecl)-                  (Maybe CExpr)-                  (Maybe CExpr)-                  CStat-                  NodeInfo-           -- ^ for statement @CFor init expr-2 expr-3 stmt@, where @init@ is either a declaration or-           -- initializing expression-           | CGoto Ident NodeInfo            -- ^ goto statement @CGoto label@-           | CGotoPtr CExpr NodeInfo         -- ^ computed goto @CGotoPtr labelExpr@-           | CCont NodeInfo                  -- ^ continue statement-           | CBreak    NodeInfo              -- ^ break statement-           | CReturn (Maybe CExpr)NodeInfo   -- ^ return statement @CReturn returnExpr@-           | CAsm CAsmStmt NodeInfo          -- ^ assembly statement-           deriving (Data,Typeable {-! CNode !-})---- | GNU Assembler statement------ > CAsmStatement type-qual? asm-expr out-ops in-ops clobbers _------ is an inline assembler statement.--- The only type-qualifier (if any) allowed is /volatile/.--- @asm-expr@ is the actual assembler epxression (a string), @out-ops@ and @in-ops@ are the input--- and output operands of the statement.--- @clobbers@ is a list of registers which are clobbered when executing the assembler statement-data CAsmStmt-  = CAsmStmt (Maybe CTypeQual)     -- maybe volatile-                    CStrLit        -- assembler expression (String)-                   [CAsmOperand]   -- output operands-                   [CAsmOperand]   -- input operands-                   [CStrLit]       -- Clobbers-                    NodeInfo-    deriving (Data,Typeable {-! CNode !-})--- | Assembler operand------ @CAsmOperand argName? constraintExpr arg@ specifies an operand for an assembler--- statement.-data CAsmOperand = CAsmOperand (Maybe Ident)   -- argument name-                                CStrLit        -- constraint expr-                                CExpr          -- argument-                                NodeInfo-                   deriving (Data,Typeable {-! CNode !-})--- | C99 Block items------  Things that may appear in compound statements: either statements, declarations---   or nested function definitions.-data CBlockItem = CBlockStmt    CStat           -- ^ A statement-                | CBlockDecl    CDecl           -- ^ A local declaration-                | CNestedFunDef CFunDef         -- ^ A nested function (GNU C)-                  deriving (Data,Typeable {-! CNode !-})--- | C declaration specifiers and qualifiers------ Declaration specifiers include at most one storage-class specifier (C99 6.7.1),--- type specifiers (6.7.2) and type qualifiers (6.7.3).-data CDeclSpec = CStorageSpec CStorageSpec  -- ^ storage-class specifier or typedef-               | CTypeSpec    CTypeSpec     -- ^ type name-               | CTypeQual    CTypeQual     -- ^ type qualifier-                 deriving (Data,Typeable {-! CNode !-})---- | Seperate the declaration specifiers------ Note that inline isn't actually a type qualifier, but a function specifier.--- @__attribute__@ of a declaration qualify declarations or declarators (but not types),--- and are therefore seperated as well.-partitionDeclSpecs :: [CDeclSpec] -> ([CStorageSpec], [CAttr], [CTypeQual], [CTypeSpec], Bool)-partitionDeclSpecs = foldr deals ([],[],[],[],False) where-    deals (CTypeQual (CInlineQual _)) (sts,ats,tqs,tss,_) = (sts,ats,tqs,tss,True)-    deals (CStorageSpec sp) (sts,ats,tqs,tss,inline)  = (sp:sts,ats,tqs,tss,inline)-    deals (CTypeQual (CAttrQual attr)) (sts,ats,tqs,tss,inline)  = (sts,attr:ats,tqs,tss,inline)-    deals (CTypeQual tq) (sts,ats,tqs,tss,inline)     = (sts,ats,tq:tqs,tss,inline)-    deals (CTypeSpec ts) (sts,ats,tqs,tss,inline)     = (sts,ats,tqs,ts:tss,inline)---- | C storage class specifier (and typedefs) (K&R A8.1, C99 6.7.1)-data CStorageSpec = CAuto     NodeInfo     -- ^ auto-                  | CRegister NodeInfo     -- ^ register-                  | CStatic   NodeInfo     -- ^ static-                  | CExtern   NodeInfo     -- ^ extern-                  | CTypedef  NodeInfo     -- ^ typedef-                  | CThread   NodeInfo     -- ^ GNUC thread local storage-                 deriving (Eq,Ord,Data,Typeable {-! CNode !-})---- Compatibility instance (will be removed) so we do not violate the PvP for 0.3.2-instance Show CStorageSpec where-    show (CAuto _) = "auto"-    show (CRegister _) = "register"-    show (CStatic _) = "static"-    show (CExtern _) = "extern"-    show (CTypedef _) = "typedef"-    show (CThread _) = "__thread"---- | C type specifier (K&R A8.2, C99 6.7.2)------ Type specifiers are either basic types such as @char@ or @int@,--- @struct@, @union@ or @enum@ specifiers or typedef names.------ As a GNU extension, a @typeof@ expression also is a type specifier.-data CTypeSpec = CVoidType    NodeInfo-               | CCharType    NodeInfo-               | CShortType   NodeInfo-               | CIntType     NodeInfo-               | CLongType    NodeInfo-               | CFloatType   NodeInfo-               | CDoubleType  NodeInfo-               | CSignedType  NodeInfo-               | CUnsigType   NodeInfo-               | CBoolType    NodeInfo-               | CComplexType NodeInfo-               | CSUType      CStructUnion NodeInfo  -- ^ Struct or Union specifier-               | CEnumType    CEnum        NodeInfo  -- ^ Enumeration specifier-               | CTypeDef     Ident        NodeInfo  -- ^ Typedef name-               | CTypeOfExpr  CExpr        NodeInfo  -- ^ @typeof(expr)@-               | CTypeOfType  CDecl        NodeInfo  -- ^ @typeof(type)@-               deriving (Data,Typeable {-! CNode !-})---- | returns @True@ if the given typespec is a struct, union or enum /definition/-isSUEDef :: CTypeSpec -> Bool-isSUEDef (CSUType (CStruct _ _ (Just _) _ _) _) = True-isSUEDef (CEnumType (CEnum _ (Just _) _ _) _) = True-isSUEDef _ = False---- | C type qualifiers (K&R A8.2, C99 6.7.3), function specifiers (C99 6.7.4), and attributes.------ @const@, @volatile@ and @restrict@ type qualifiers and @inline@ function specifier.--- Additionally, @__attribute__@ annotations for declarations and declarators.-data CTypeQual = CConstQual NodeInfo-               | CVolatQual NodeInfo-               | CRestrQual NodeInfo-               | CInlineQual NodeInfo-               | CAttrQual  CAttr-               deriving (Data,Typeable {-! CNode !-})---- | C structure or union specifiers (K&R A8.3, C99 6.7.2.1)------ @CStruct tag identifier struct-decls c-attrs@ represents a struct or union specifier (depending on @tag@).------   * either @identifier@ or the declaration list @struct-decls@ (or both) have to be present.------     Example: in @struct foo x;@, the identifier is present, in @struct { int y; } x@ the declaration list, and---     in @struct foo { int y; } x;@ both of them.------   * @c-attrs@ is a list of @__attribute__@ annotations associated with the struct or union specifier-data CStructUnion = CStruct CStructTag-                            (Maybe Ident)-                            (Maybe [CDecl])    -- member declarations-                            [CAttr]            -- __attribute__s-                            NodeInfo-                    deriving (Data,Typeable {-! CNode !-})---- | A tag to determine wheter we refer to a @struct@ or @union@, see 'CStructUnion'.-data CStructTag = CStructTag-                | CUnionTag-                deriving (Eq,Data,Typeable)---- | C enumeration specifier (K&R A8.4, C99 6.7.2.2)------ @CEnum identifier enumerator-list attrs@ represent as enum specifier------  * Either the identifier or the enumerator-list (or both) have to be present.------  * If @enumerator-list@ is present, it has to be non-empty.------  * The enumerator list is of the form @(enumeration-constant, enumeration-value?)@, where the latter---    is an optional constant integral expression.------  * @attrs@ is a list of @__attribute__@ annotations associated with the enumeration specifier-data CEnum = CEnum (Maybe Ident)-                   (Maybe [(Ident,             -- variant name-                            Maybe CExpr)])     -- explicit variant value-                   [CAttr]                     -- __attribute__s-                   NodeInfo-             deriving (Data,Typeable {-! CNode !-})----- | C initialization (K&R A8.7, C99 6.7.8)------ Initializers are either assignment expressions or initializer lists--- (surrounded in curly braces), whose elements are themselves--- initializers, paired with an optional list of designators.-data CInit = CInitExpr CExpr-                       NodeInfo            -- ^ assignment expression-           | CInitList CInitList-                       NodeInfo            -- ^ initialization list (see 'CInitList')-             deriving (Data,Typeable {-! CNode !-})---- | Initializer List------ The members of an initializer list are of the form @(designator-list,initializer)@.--- The @designator-list@ specifies one member of the compound type which is initialized.--- It is allowed to be empty - in this case the initializer refers to the--- ''next'' member of the compound type (see C99 6.7.8).------ Examples (simplified expressions and identifiers):------ > -- int x[3][4] = { [0][3] = 4, [2] = 5, 8 };--- > --   corresponds to the assignments--- > -- x[0][3] = 4; x[2][0] = 5; x[2][1] = 8;--- > let init1 = ([CArrDesig 0, CArrDesig 3], CInitExpr 4)--- >     init2 = ([CArrDesig 2]             , CInitExpr 5)--- >     init3 = ([]                        , CInitExpr 8)--- > in  CInitList [init1, init2, init3]------ > -- struct { struct { int a[2]; int b[2]; int c[2]; } s; } x = { .s = { {2,3} , .c[0] = 1 } };--- > --   corresponds to the assignments--- > -- x.s.a[0] = 2; x.s.a[1] = 3; x.s.c[0] = 1;--- > let init_s_0 = CInitList [ ([], CInitExpr 2), ([], CInitExpr 3)]--- >     init_s   = CInitList [--- >                            ([], init_s_0),--- >                            ([CMemberDesig "c", CArrDesig 0], CInitExpr 1)--- >                          ]--- > in  CInitList [(CMemberDesig "s", init_s)]-type CInitList = [([CDesignator], CInit)]---- | Designators------ A designator specifies a member of an object, either an element or range of an array,--- or the named member of a struct \/ union.-data CDesignator = CArrDesig     CExpr-                                 NodeInfo  -- ^ array position designator-                 | CMemberDesig  Ident-                                 NodeInfo  -- ^ member designator-                 | CRangeDesig   CExpr-                                 CExpr-                                 NodeInfo  -- ^ array range designator @CRangeDesig from to _@ (GNU C)-                   deriving (Data,Typeable {-! CNode !-})---- | @__attribute__@ annotations------ Those are of the form @CAttr attribute-name attribute-parameters@,--- and serve as generic properties of some syntax tree elements.-data CAttr = CAttr Ident [CExpr] NodeInfo-             deriving (Data,Typeable {-! CNode !-})---- | C expression (K&R A7)------ * these can be arbitrary expression, as the argument of `sizeof' can be---   arbitrary, even if appearing in a constant expression------ * GNU C extensions: @alignof@, @__real@, @__imag@, @({ stmt-expr })@, @&& label@ and built-ins----data CExpr = CComma       [CExpr]       -- comma expression list, n >= 2-                          NodeInfo-           | CAssign      CAssignOp     -- assignment operator-                          CExpr         -- l-value-                          CExpr         -- r-value-                          NodeInfo-           | CCond        CExpr         -- conditional-                   (Maybe CExpr)        -- true-expression (GNU allows omitting)-                          CExpr         -- false-expression-                          NodeInfo-           | CBinary      CBinaryOp     -- binary operator-                          CExpr         -- lhs-                          CExpr         -- rhs-                          NodeInfo-           | CCast        CDecl         -- type name-                          CExpr-                          NodeInfo-           | CUnary       CUnaryOp      -- unary operator-                          CExpr-                          NodeInfo-           | CSizeofExpr  CExpr-                          NodeInfo-           | CSizeofType  CDecl         -- type name-                          NodeInfo-           | CAlignofExpr CExpr-                          NodeInfo-           | CAlignofType CDecl         -- type name-                          NodeInfo-           | CComplexReal CExpr         -- real part of complex number-                          NodeInfo-           | CComplexImag CExpr         -- imaginary part of complex number-                          NodeInfo-           | CIndex       CExpr         -- array-                          CExpr         -- index-                          NodeInfo-           | CCall        CExpr         -- function-                          [CExpr]       -- arguments-                          NodeInfo-           | CMember      CExpr         -- structure-                          Ident         -- member name-                          Bool          -- deref structure? (True for `->')-                          NodeInfo-           | CVar         Ident         -- identifier (incl. enumeration const)-                          NodeInfo-           | CConst       CConst        -- ^ integer, character, floating point and string constants-           | CCompoundLit CDecl-                          CInitList     -- type name & initialiser list-                          NodeInfo      -- ^ C99 compound literal-           | CStatExpr    CStat NodeInfo  -- ^ GNU C compound statement as expr-           | CLabAddrExpr Ident NodeInfo  -- ^ GNU C address of label-           | CBuiltinExpr CBuiltin        -- ^ builtin expressions, see 'CBuiltin'-           deriving (Data,Typeable {-! CNode !-})----- | GNU Builtins, which cannot be typed in C99-data CBuiltin =-          CBuiltinVaArg CExpr CDecl NodeInfo            -- ^ @(expr, type)@-        | CBuiltinOffsetOf CDecl [CDesignator] NodeInfo -- ^ @(type, designator-list)@-        | CBuiltinTypesCompatible CDecl CDecl NodeInfo  -- ^ @(type,type)@-        deriving (Data,Typeable {-! CNode !-})---- | C constant (K&R A2.5 & A7.2)-data CConst = CIntConst   CInteger NodeInfo-            | CCharConst  CChar NodeInfo-            | CFloatConst CFloat NodeInfo-            | CStrConst   CString NodeInfo-            deriving (Data,Typeable {-! CNode !-})---- | Attributed string literals-data CStrLit = CStrLit CString NodeInfo-            deriving (Data,Typeable {-! CNode !-})--cstringOfLit :: CStrLit -> CString-cstringOfLit (CStrLit cstr _) = cstr---- | Lift a string literal to a C constant-liftStrLit :: CStrLit -> CConst-liftStrLit (CStrLit str at) = CStrConst str at--------------------------------------------------------------- DERIVES GENERATED CODE--- DO NOT MODIFY BELOW THIS LINE--- CHECKSUM: 1181183062--instance CNode CTranslUnit-    where nodeInfo (CTranslUnit _ nodeinfo) = nodeinfo-instance Pos CTranslUnit-    where posOf x = posOfNode (nodeInfo x)--instance CNode CExtDecl-    where nodeInfo (CDeclExt d) = nodeInfo d-          nodeInfo (CFDefExt d) = nodeInfo d-          nodeInfo (CAsmExt d) = nodeInfo d-instance Pos CExtDecl-    where posOf x = posOfNode (nodeInfo x)--instance CNode CFunDef-    where nodeInfo (CFunDef _ _ _ _ nodeinfo) = nodeinfo-instance Pos CFunDef-    where posOf x = posOfNode (nodeInfo x)--instance CNode CDecl-    where nodeInfo (CDecl _ _ nodeinfo) = nodeinfo-instance Pos CDecl-    where posOf x = posOfNode (nodeInfo x)--instance CNode CDeclr-    where nodeInfo (CDeclr _ _ _ _ nodeinfo) = nodeinfo-instance Pos CDeclr-    where posOf x = posOfNode (nodeInfo x)--instance CNode CDerivedDeclr-    where nodeInfo (CPtrDeclr _ nodeinfo) = nodeinfo-          nodeInfo (CArrDeclr _ _ nodeinfo) = nodeinfo-          nodeInfo (CFunDeclr _ _ nodeinfo) = nodeinfo-instance Pos CDerivedDeclr-    where posOf x = posOfNode (nodeInfo x)--instance CNode CStat-    where nodeInfo (CLabel _ _ _ nodeinfo) = nodeinfo-          nodeInfo (CCase _ _ nodeinfo) = nodeinfo-          nodeInfo (CCases _ _ _ nodeinfo) = nodeinfo-          nodeInfo (CDefault _ nodeinfo) = nodeinfo-          nodeInfo (CExpr _ nodeinfo) = nodeinfo-          nodeInfo (CCompound _ _ nodeinfo) = nodeinfo-          nodeInfo (CIf _ _ _ nodeinfo) = nodeinfo-          nodeInfo (CSwitch _ _ nodeinfo) = nodeinfo-          nodeInfo (CWhile _ _ _ nodeinfo) = nodeinfo-          nodeInfo (CFor _ _ _ _ nodeinfo) = nodeinfo-          nodeInfo (CGoto _ nodeinfo) = nodeinfo-          nodeInfo (CGotoPtr _ nodeinfo) = nodeinfo-          nodeInfo (CCont nodeinfo) = nodeinfo-          nodeInfo (CBreak nodeinfo) = nodeinfo-          nodeInfo (CReturn _ nodeinfo) = nodeinfo-          nodeInfo (CAsm _ nodeinfo) = nodeinfo-instance Pos CStat-    where posOf x = posOfNode (nodeInfo x)--instance CNode CAsmStmt-    where nodeInfo (CAsmStmt _ _ _ _ _ nodeinfo) = nodeinfo-instance Pos CAsmStmt-    where posOf x = posOfNode (nodeInfo x)--instance CNode CAsmOperand-    where nodeInfo (CAsmOperand _ _ _ nodeinfo) = nodeinfo-instance Pos CAsmOperand-    where posOf x = posOfNode (nodeInfo x)--instance CNode CBlockItem-    where nodeInfo (CBlockStmt d) = nodeInfo d-          nodeInfo (CBlockDecl d) = nodeInfo d-          nodeInfo (CNestedFunDef d) = nodeInfo d-instance Pos CBlockItem-    where posOf x = posOfNode (nodeInfo x)--instance CNode CDeclSpec-    where nodeInfo (CStorageSpec d) = nodeInfo d-          nodeInfo (CTypeSpec d) = nodeInfo d-          nodeInfo (CTypeQual d) = nodeInfo d-instance Pos CDeclSpec-    where posOf x = posOfNode (nodeInfo x)--instance CNode CStorageSpec-    where nodeInfo (CAuto nodeinfo) = nodeinfo-          nodeInfo (CRegister nodeinfo) = nodeinfo-          nodeInfo (CStatic nodeinfo) = nodeinfo-          nodeInfo (CExtern nodeinfo) = nodeinfo-          nodeInfo (CTypedef nodeinfo) = nodeinfo-          nodeInfo (CThread nodeinfo) = nodeinfo-instance Pos CStorageSpec-    where posOf x = posOfNode (nodeInfo x)--instance CNode CTypeSpec-    where nodeInfo (CVoidType nodeinfo) = nodeinfo-          nodeInfo (CCharType nodeinfo) = nodeinfo-          nodeInfo (CShortType nodeinfo) = nodeinfo-          nodeInfo (CIntType nodeinfo) = nodeinfo-          nodeInfo (CLongType nodeinfo) = nodeinfo-          nodeInfo (CFloatType nodeinfo) = nodeinfo-          nodeInfo (CDoubleType nodeinfo) = nodeinfo-          nodeInfo (CSignedType nodeinfo) = nodeinfo-          nodeInfo (CUnsigType nodeinfo) = nodeinfo-          nodeInfo (CBoolType nodeinfo) = nodeinfo-          nodeInfo (CComplexType nodeinfo) = nodeinfo-          nodeInfo (CSUType _ nodeinfo) = nodeinfo-          nodeInfo (CEnumType _ nodeinfo) = nodeinfo-          nodeInfo (CTypeDef _ nodeinfo) = nodeinfo-          nodeInfo (CTypeOfExpr _ nodeinfo) = nodeinfo-          nodeInfo (CTypeOfType _ nodeinfo) = nodeinfo-instance Pos CTypeSpec-    where posOf x = posOfNode (nodeInfo x)--instance CNode CTypeQual-    where nodeInfo (CConstQual nodeinfo) = nodeinfo-          nodeInfo (CVolatQual nodeinfo) = nodeinfo-          nodeInfo (CRestrQual nodeinfo) = nodeinfo-          nodeInfo (CInlineQual nodeinfo) = nodeinfo-          nodeInfo (CAttrQual d) = nodeInfo d-instance Pos CTypeQual-    where posOf x = posOfNode (nodeInfo x)--instance CNode CStructUnion-    where nodeInfo (CStruct _ _ _ _ nodeinfo) = nodeinfo-instance Pos CStructUnion-    where posOf x = posOfNode (nodeInfo x)--instance CNode CEnum-    where nodeInfo (CEnum _ _ _ nodeinfo) = nodeinfo-instance Pos CEnum-    where posOf x = posOfNode (nodeInfo x)--instance CNode CInit-    where nodeInfo (CInitExpr _ nodeinfo) = nodeinfo-          nodeInfo (CInitList _ nodeinfo) = nodeinfo-instance Pos CInit-    where posOf x = posOfNode (nodeInfo x)--instance CNode CDesignator-    where nodeInfo (CArrDesig _ nodeinfo) = nodeinfo-          nodeInfo (CMemberDesig _ nodeinfo) = nodeinfo-          nodeInfo (CRangeDesig _ _ nodeinfo) = nodeinfo-instance Pos CDesignator-    where posOf x = posOfNode (nodeInfo x)--instance CNode CAttr-    where nodeInfo (CAttr _ _ nodeinfo) = nodeinfo-instance Pos CAttr-    where posOf x = posOfNode (nodeInfo x)--instance CNode CExpr-    where nodeInfo (CComma _ nodeinfo) = nodeinfo-          nodeInfo (CAssign _ _ _ nodeinfo) = nodeinfo-          nodeInfo (CCond _ _ _ nodeinfo) = nodeinfo-          nodeInfo (CBinary _ _ _ nodeinfo) = nodeinfo-          nodeInfo (CCast _ _ nodeinfo) = nodeinfo-          nodeInfo (CUnary _ _ nodeinfo) = nodeinfo-          nodeInfo (CSizeofExpr _ nodeinfo) = nodeinfo-          nodeInfo (CSizeofType _ nodeinfo) = nodeinfo-          nodeInfo (CAlignofExpr _ nodeinfo) = nodeinfo-          nodeInfo (CAlignofType _ nodeinfo) = nodeinfo-          nodeInfo (CComplexReal _ nodeinfo) = nodeinfo-          nodeInfo (CComplexImag _ nodeinfo) = nodeinfo-          nodeInfo (CIndex _ _ nodeinfo) = nodeinfo-          nodeInfo (CCall _ _ nodeinfo) = nodeinfo-          nodeInfo (CMember _ _ _ nodeinfo) = nodeinfo-          nodeInfo (CVar _ nodeinfo) = nodeinfo-          nodeInfo (CConst d) = nodeInfo d-          nodeInfo (CCompoundLit _ _ nodeinfo) = nodeinfo-          nodeInfo (CStatExpr _ nodeinfo) = nodeinfo-          nodeInfo (CLabAddrExpr _ nodeinfo) = nodeinfo-          nodeInfo (CBuiltinExpr d) = nodeInfo d-instance Pos CExpr-    where posOf x = posOfNode (nodeInfo x)--instance CNode CBuiltin-    where nodeInfo (CBuiltinVaArg _ _ nodeinfo) = nodeinfo-          nodeInfo (CBuiltinOffsetOf _ _ nodeinfo) = nodeinfo-          nodeInfo (CBuiltinTypesCompatible _ _ nodeinfo) = nodeinfo-instance Pos CBuiltin-    where posOf x = posOfNode (nodeInfo x)--instance CNode CConst-    where nodeInfo (CIntConst _ nodeinfo) = nodeinfo-          nodeInfo (CCharConst _ nodeinfo) = nodeinfo-          nodeInfo (CFloatConst _ nodeinfo) = nodeinfo-          nodeInfo (CStrConst _ nodeinfo) = nodeinfo-instance Pos CConst-    where posOf x = posOfNode (nodeInfo x)--instance CNode CStrLit-    where nodeInfo (CStrLit _ nodeinfo) = nodeinfo-instance Pos CStrLit-    where posOf x = posOfNode (nodeInfo x)+{-# LANGUAGE TypeSynonymInstances #-}+-----------------------------------------------------------------------------+-- |+-- Module      :  Language.C.Syntax.AST+-- Copyright   :  (c) [1999..2007] Manuel M T Chakravarty+--                (c) 2008 Benedikt Huber+-- License     :  BSD-style+-- Maintainer  : benedikt.huber@gmail.com+-- Stability   : experimental+-- Portability : ghc+--+-- Abstract syntax of C source and header files.+--+--  The tree structure is based on the grammar in Appendix A of K&R.  The+--  abstract syntax simplifies the concrete syntax by merging similar concrete+--  constructs into a single type of abstract tree structure: declarations are+--  merged with structure declarations, parameter declarations and type names,+--  and declarators are merged with abstract declarators.+--+--  With K&R we refer to ``The C Programming Language'', second edition, Brain+--  W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988. The AST supports all+--  of C99 <http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf> and several+--  GNU extensions <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>.+-----------------------------------------------------------------------------+module Language.C.Syntax.AST (+  -- * C translation units+  CTranslUnit,  CExtDecl,+  CTranslationUnit(..),  CExternalDeclaration(..),+  -- * Declarations+  CFunDef,  CDecl, CStructUnion, CEnum,+  CFunctionDef(..),  CDeclaration(..),+  CStructTag(..), CStructureUnion(..),  CEnumeration(..),+  -- * Declaration attributes+  CDeclSpec, partitionDeclSpecs,+  CStorageSpec, CTypeSpec, isSUEDef, CTypeQual, CAttr,+  CDeclarationSpecifier(..), CStorageSpecifier(..), CTypeSpecifier(..),+  CTypeQualifier(..), CAttribute(..),+  -- * Declarators+  CDeclr,CDerivedDeclr,CArrSize,+  CDeclarator(..), CDerivedDeclarator(..), CArraySize(..),+  -- * Initialization+  CInit, CInitList, CDesignator,+  CInitializer(..), CInitializerList, CPartDesignator(..),+  -- * Statements+  CStat, CBlockItem, CAsmStmt, CAsmOperand,+  CStatement(..), CCompoundBlockItem(..),+  CAssemblyStatement(..), CAssemblyOperand(..),+  -- * Expressions+  CExpr, CExpression(..),+  CAssignOp(..), CBinaryOp(..), CUnaryOp(..),+  CBuiltin, CBuiltinThing(..),+  -- * Constants+  CConst, CStrLit, cstringOfLit, liftStrLit,+  CConstant(..), CStringLiteral(..)+) where+import Data.List+import Language.C.Syntax.Constants+import Language.C.Syntax.Ops+import Language.C.Data.Ident+import Language.C.Data.Node+import Language.C.Data.Position+import Data.Generics++-- | Complete C tranlsation unit (C99 6.9, K&R A10)+--+-- A complete C translation unit, for example representing a C header or source file.+-- It consists of a list of external (i.e. toplevel) declarations.+type CTranslUnit = CTranslationUnit NodeInfo+data CTranslationUnit a+  = CTranslUnit [CExternalDeclaration a] a+    deriving (Show, Data, Typeable {-! ,CNode ,Functor, Annotated !-})++-- | External C declaration (C99 6.9, K&R A10)+--+-- Either a toplevel declaration, function definition or external assembler.+type CExtDecl = CExternalDeclaration NodeInfo+data CExternalDeclaration a+  = CDeclExt (CDeclaration a)+  | CFDefExt (CFunctionDef a)+  | CAsmExt  (CStringLiteral a) a+    deriving (Show, Data,Typeable {-! ,CNode ,Functor, Annotated !-})++-- | C function definition (C99 6.9.1, K&R A10.1)+--+-- A function definition is of the form @CFunDef specifiers declarator decllist? stmt@.+--+-- * @specifiers@ are the type and storage-class specifiers of the function.+--   The only storage-class specifiers allowed are /extern/ and /static/.+--+-- * The @declarator@ must be such that the declared identifier has /function type/.+--   The return type shall be void or an object type other than array type.+--+-- * The optional declaration list @decllist@ is for old-style function declarations.+--+-- * The statement @stmt@ is a compound statement.+type CFunDef = CFunctionDef NodeInfo+data CFunctionDef a+  = CFunDef+    [CDeclarationSpecifier a] -- type specifier and qualifier+    (CDeclarator a)           -- declarator+    [CDeclaration a]          -- optional declaration list+    (CStatement a)            -- compound statement+    a+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})+++-- | C declarations (K&R A8, C99 6.7), including structure declarations, parameter+--   declarations and type names.+--+-- A declaration is of the form @CDecl specifiers init-declarator-list@, where the form of the declarator list's+--  elements depends on the kind of declaration:+--+-- 1) Toplevel declarations (K&R A8, C99 6.7 declaration)+--+--   * C99 requires that there is at least one specifier, though this is merely a syntactic restriction+--+--   * at most one storage class specifier is allowed per declaration+--+--   * the elements of the non-empty @init-declarator-list@ are of the form @(Just declr, init?, Nothing)@.+--      The declarator @declr@ has to be present and non-abstract and the initialization expression is+--      optional.+--+-- 2) Structure declarations (K&R A8.3, C99 6.7.2.1 struct-declaration)+--+--   Those are the declarations of a structure's members.+--+--   * do not allow storage specifiers+--+--   * in strict C99, the list of declarators has to be non-empty+--+--   * the elements of @init-declarator-list@ are either of the form @(Just declr, Nothing, size?)@,+--     representing a member with optional bit-field size, or of the form @(Nothing, Nothing, Just size)@,+--     for unnamed bitfields. @declr@ has to be non-abstract.+--+--   * no member of a structure shall have incomplete type+--+-- 3) Parameter declarations (K&R A8.6.3, C99 6.7.5 parameter-declaration)+--+--   * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@,+--     i.e. consist of a single declarator, which is allowed to be abstract (i.e. unnamed).+--+-- 4) Type names (A8.8, C99 6.7.6)+--+--   * do not allow storage specifiers+--+--   * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@.+--     where @declr@ is an abstract declarator (i.e. doesn't contain a declared identifier)+--+type CDecl = CDeclaration NodeInfo+data CDeclaration a+  = CDecl+    [CDeclarationSpecifier a] -- type specifier and qualifier, __attribute__+    [(Maybe (CDeclarator a),  -- declarator (may be omitted)+      Maybe (CInitializer a), -- optional initialize+      Maybe (CExpression a))] -- optional size (const expr)+    a+    deriving (Show, Data,Typeable {-! ,CNode ,Annotated !-})++-- Derive instance is a little bit ugly+instance Functor CDeclaration where+  fmap f (CDecl specs declarators annot) =+    CDecl (map (fmap f) specs) (map fmap3m declarators) (f annot)+      where fmap3m (a,b,c) = (fmap (fmap f) a, fmap (fmap f) b, fmap (fmap f) c)++-- | C declarator (K&R A8.5, C99 6.7.5) and abstract declarator (K&R A8.8, C99 6.7.6)+--+-- A declarator declares a single object, function, or type. It is always associated with+-- a declaration ('CDecl'), which specifies the declaration's type and the additional storage qualifiers and+-- attributes, which apply to the declared object.+--+-- A declarator is of the form @CDeclr name? indirections asm-name? attrs _@, where+-- @name@ is the name of the declared object (missing for abstract declarators),+-- @declquals@ is a set of additional declaration specifiers,+-- @asm-name@ is the optional assembler name and attributes is a set of+-- attrs is a set of @__attribute__@ annotations for the declared object.+--+-- @indirections@ is a set of pointer, array and function declarators, which modify the type of the declared object as+-- described below. If the /declaration/ specifies the non-derived type @T@,+-- and we have @indirections = [D1, D2, ..., Dn]@ than the declared object has type+-- @(D1 `indirect` (D2 `indirect` ...  (Dn `indirect` T)))@, where+--+--  * @(CPtrDeclr attrs) `indirect` T@ is /attributed pointer to T/+--+--  * @(CFunDeclr attrs) `indirect` T@ is /attributed function returning T/+--+--  * @(CArrayDeclr attrs) `indirect` T@ is /attributed array of elemements of type T/+--+-- Examples (simplified attributes):+--+--  * /x/ is an int+--+-- > int x;+-- > CDeclr "x" []+--+--  * /x/ is a restrict pointer to a const pointer to int+--+-- > const int * const * restrict x;+-- > CDeclr "x" [CPtrDeclr [restrict], CPtrDeclr [const]]+--+--  * /f/ is an function return a constant pointer to int+--+-- > int* const f();+-- > CDeclr "f" [CFunDeclr [],CPtrDeclr [const]]+--+--  * /f/ is a constant pointer to a function returning int+--+-- > int (* const f)(); ==>+-- > CDeclr "f" [CPtrDeclr [const], CFunDeclr []]+type CDeclr = CDeclarator NodeInfo+data CDeclarator a+  = CDeclr (Maybe Ident) [CDerivedDeclarator a] (Maybe (CStringLiteral a)) [CAttribute a] a+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})+++-- | Derived declarators, see 'CDeclr'+--+-- Indirections are qualified using type-qualifiers and generic attributes, and additionally+--+--    * The size of an array is either a constant expression, variable length ('*') or missing; in the last case, the+--      type of the array is incomplete. The qualifier static is allowed for function arguments only, indicating that+--      the supplied argument is an array of at least the given size.+--+--    * New style parameter lists have the form @Right (declarations, isVariadic)@, old style parameter lists have the+--      form @Left (parameter-names)@+type CDerivedDeclr = CDerivedDeclarator NodeInfo+data CDerivedDeclarator a+  = CPtrDeclr [CTypeQualifier a] a+  -- ^ Pointer declarator @CPtrDeclr tyquals declr@+  | CArrDeclr [CTypeQualifier a] (CArraySize a) a+  -- ^ Array declarator @CArrDeclr declr tyquals size-expr?@+  | CFunDeclr (Either [Ident] ([CDeclaration a],Bool)) [CAttribute a] a+    -- ^ Function declarator @CFunDeclr declr (old-style-params | new-style-params) c-attrs@+    deriving (Show, Data,Typeable {-! ,CNode , Annotated !-})++-- Derived instance relies on fmap2+instance Functor CDerivedDeclarator where+        fmap _f (CPtrDeclr a1 a2) = CPtrDeclr (fmap (fmap _f) a1) (_f a2)+        fmap _f (CArrDeclr a1 a2 a3)+          = CArrDeclr (fmap (fmap _f) a1) (fmap _f a2) (_f a3)+        fmap _f (CFunDeclr a1 a2 a3)+          = CFunDeclr (fmap (fmapFirst (fmap (fmap _f))) a1) (fmap (fmap _f) a2)+              (_f a3)+          where fmapFirst f (a,b) = (f a, b)++-- | Size of an array+type CArrSize = CArraySize NodeInfo+data CArraySize a+  = CNoArrSize Bool               -- ^ @CUnknownSize isCompleteType@+  | CArrSize Bool (CExpression a) -- ^ @CArrSize isStatic expr@+    deriving (Show, Data,Typeable {-! , Functor !-})+++-- | C statement (K&R A9, C99 6.8)+--+type CStat = CStatement NodeInfo+data CStatement a+  -- | An (attributed) label followed by a statement+  = CLabel  Ident (CStatement a) [CAttribute a] a+  -- | A statement of the form @case expr : stmt@+  | CCase (CExpression a) (CStatement a) a+  -- | A case range of the form @case lower ... upper : stmt@+  | CCases (CExpression a) (CExpression a) (CStatement a) a+  -- | The default case @default : stmt@+  | CDefault (CStatement a) a+  -- | A simple statement, that is in C: evaluating an expression with+  --   side-effects and discarding the result.+  | CExpr (Maybe (CExpression a)) a+  -- | compound statement @CCompound localLabels blockItems at@+  | CCompound [Ident] [CCompoundBlockItem a] a+  -- | conditional statement @CIf ifExpr thenStmt maybeElseStmt at@+  | CIf (CExpression a) (CStatement a) (Maybe (CStatement a)) a+  -- | switch statement @CSwitch selectorExpr switchStmt@, where+  -- @switchStmt@ usually includes /case/, /break/ and /default/+  -- statements+  | CSwitch (CExpression a) (CStatement a) a+  -- | while or do-while statement @CWhile guard stmt isDoWhile at@+  | CWhile (CExpression a) (CStatement a) Bool a+  -- | for statement @CFor init expr-2 expr-3 stmt@, where @init@ is+  -- either a declaration or initializing expression+  | CFor (Either (Maybe (CExpression a)) (CDeclaration a))+    (Maybe (CExpression a))+    (Maybe (CExpression a))+    (CStatement a)+    a+  -- | goto statement @CGoto label@+  | CGoto Ident a+  -- | computed goto @CGotoPtr labelExpr@+  | CGotoPtr (CExpression a) a+  -- | continue statement+  | CCont a+  -- | break statement+  | CBreak a+  -- | return statement @CReturn returnExpr@+  | CReturn (Maybe (CExpression a)) a+  -- | assembly statement+  | CAsm (CAssemblyStatement a) a+    deriving (Show, Data,Typeable {-! , CNode , Annotated !-})++-- Derived instance relies on fmap2 :(+instance Functor CStatement where+        fmap _f (CLabel a1 a2 a3 a4)+          = CLabel a1 (fmap _f a2) (fmap (fmap _f) a3) (_f a4)+        fmap _f (CCase a1 a2 a3) = CCase (fmap _f a1) (fmap _f a2) (_f a3)+        fmap _f (CCases a1 a2 a3 a4)+          = CCases (fmap _f a1) (fmap _f a2) (fmap _f a3) (_f a4)+        fmap _f (CDefault a1 a2) = CDefault (fmap _f a1) (_f a2)+        fmap _f (CExpr a1 a2) = CExpr (fmap (fmap _f) a1) (_f a2)+        fmap _f (CCompound a1 a2 a3)+          = CCompound a1 (fmap (fmap _f) a2) (_f a3)+        fmap _f (CIf a1 a2 a3 a4)+          = CIf (fmap _f a1) (fmap _f a2) (fmap (fmap _f) a3) (_f a4)+        fmap _f (CSwitch a1 a2 a3)+          = CSwitch (fmap _f a1) (fmap _f a2) (_f a3)+        fmap _f (CWhile a1 a2 a3 a4)+          = CWhile (fmap _f a1) (fmap _f a2) a3 (_f a4)+        fmap _f (CFor a1 a2 a3 a4 a5)+          = CFor (mapEither (fmap (fmap _f)) (fmap _f) a1)+                 (fmap (fmap _f) a2) (fmap (fmap _f) a3) (fmap _f a4)+                 (_f a5)+          where mapEither f1 f2 = either (Left . f1) (Right . f2)+        fmap _f (CGoto a1 a2) = CGoto a1 (_f a2)+        fmap _f (CGotoPtr a1 a2) = CGotoPtr (fmap _f a1) (_f a2)+        fmap _f (CCont a1) = CCont (_f a1)+        fmap _f (CBreak a1) = CBreak (_f a1)+        fmap _f (CReturn a1 a2) = CReturn (fmap (fmap _f) a1) (_f a2)+        fmap _f (CAsm a1 a2) = CAsm (fmap _f a1) (_f a2)++-- | GNU Assembler statement+--+-- > CAssemblyStatement type-qual? asm-expr out-ops in-ops clobbers _+--+-- is an inline assembler statement.+-- The only type-qualifier (if any) allowed is /volatile/.+-- @asm-expr@ is the actual assembler epxression (a string), @out-ops@ and @in-ops@ are the input+-- and output operands of the statement.+-- @clobbers@ is a list of registers which are clobbered when executing the assembler statement+type CAsmStmt = CAssemblyStatement NodeInfo+data CAssemblyStatement a+  = CAsmStmt+    (Maybe (CTypeQualifier a)) -- maybe volatile+    (CStringLiteral a)         -- assembler expression (String)+    [CAssemblyOperand a]       -- output operands+    [CAssemblyOperand a]       -- input operands+    [CStringLiteral a]         -- Clobbers+    a+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})++-- | Assembler operand+--+-- @CAsmOperand argName? constraintExpr arg@ specifies an operand for an assembler+-- statement.+type CAsmOperand = CAssemblyOperand NodeInfo+data CAssemblyOperand a+  = CAsmOperand+    (Maybe Ident)       -- argument name+    (CStringLiteral a)  -- constraint expr+    (CExpression a)     -- argument+    a+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})++-- | C99 Block items+--+--  Things that may appear in compound statements: either statements, declarations+--   or nested function definitions.+type CBlockItem = CCompoundBlockItem NodeInfo+data CCompoundBlockItem a+  = CBlockStmt    (CStatement a)    -- ^ A statement+  | CBlockDecl    (CDeclaration a)  -- ^ A local declaration+  | CNestedFunDef (CFunctionDef a)  -- ^ A nested function (GNU C)+    deriving (Show, Data,Typeable {-! , CNode , Functor, Annotated !-})++-- | C declaration specifiers and qualifiers+--+-- Declaration specifiers include at most one storage-class specifier (C99 6.7.1),+-- type specifiers (6.7.2) and type qualifiers (6.7.3).+type CDeclSpec = CDeclarationSpecifier NodeInfo+data CDeclarationSpecifier a+  = CStorageSpec (CStorageSpecifier a) -- ^ storage-class specifier or typedef+  | CTypeSpec    (CTypeSpecifier a)    -- ^ type name+  | CTypeQual    (CTypeQualifier a)    -- ^ type qualifier+    deriving (Show, Data,Typeable {-! ,CNode ,Functor, Annotated !-})+++-- | Separate the declaration specifiers+--+-- Note that inline isn't actually a type qualifier, but a function specifier.+-- @__attribute__@ of a declaration qualify declarations or declarators (but not types),+-- and are therefore separated as well.+partitionDeclSpecs :: [CDeclarationSpecifier a]+                   -> ( [CStorageSpecifier a], [CAttribute a]+                      , [CTypeQualifier a], [CTypeSpecifier a], Bool)+partitionDeclSpecs = foldr deals ([],[],[],[],False) where+    deals (CTypeQual (CInlineQual _)) (sts,ats,tqs,tss,_) = (sts,ats,tqs,tss,True)+    deals (CStorageSpec sp) (sts,ats,tqs,tss,inline)  = (sp:sts,ats,tqs,tss,inline)+    deals (CTypeQual (CAttrQual attr)) (sts,ats,tqs,tss,inline)  = (sts,attr:ats,tqs,tss,inline)+    deals (CTypeQual tq) (sts,ats,tqs,tss,inline)     = (sts,ats,tq:tqs,tss,inline)+    deals (CTypeSpec ts) (sts,ats,tqs,tss,inline)     = (sts,ats,tqs,ts:tss,inline)++-- | C storage class specifier (and typedefs) (K&R A8.1, C99 6.7.1)+type CStorageSpec = CStorageSpecifier NodeInfo+data CStorageSpecifier a+  = CAuto     a     -- ^ auto+  | CRegister a     -- ^ register+  | CStatic   a     -- ^ static+  | CExtern   a     -- ^ extern+  | CTypedef  a     -- ^ typedef+  | CThread   a     -- ^ GNUC thread local storage+    deriving (Show, Eq,Ord,Data,Typeable {-! ,CNode ,Functor ,Annotated !-})+++-- | C type specifier (K&R A8.2, C99 6.7.2)+--+-- Type specifiers are either basic types such as @char@ or @int@,+-- @struct@, @union@ or @enum@ specifiers or typedef names.+--+-- As a GNU extension, a @typeof@ expression also is a type specifier.+type CTypeSpec = CTypeSpecifier NodeInfo+data CTypeSpecifier a+  = CVoidType    a+  | CCharType    a+  | CShortType   a+  | CIntType     a+  | CLongType    a+  | CFloatType   a+  | CDoubleType  a+  | CSignedType  a+  | CUnsigType   a+  | CBoolType    a+  | CComplexType a+  | CSUType      (CStructureUnion a) a      -- ^ Struct or Union specifier+  | CEnumType    (CEnumeration a)    a      -- ^ Enumeration specifier+  | CTypeDef     Ident        a      -- ^ Typedef name+  | CTypeOfExpr  (CExpression a)  a  -- ^ @typeof(expr)@+  | CTypeOfType  (CDeclaration a) a  -- ^ @typeof(type)@+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})+++-- | returns @True@ if the given typespec is a struct, union or enum /definition/+isSUEDef :: CTypeSpecifier a -> Bool+isSUEDef (CSUType (CStruct _ _ (Just _) _ _) _) = True+isSUEDef (CEnumType (CEnum _ (Just _) _ _) _) = True+isSUEDef _ = False++-- | C type qualifiers (K&R A8.2, C99 6.7.3), function specifiers (C99 6.7.4), and attributes.+--+-- @const@, @volatile@ and @restrict@ type qualifiers and @inline@ function specifier.+-- Additionally, @__attribute__@ annotations for declarations and declarators.+type CTypeQual = CTypeQualifier NodeInfo+data CTypeQualifier a+  = CConstQual a+  | CVolatQual a+  | CRestrQual a+  | CInlineQual a+  | CAttrQual  (CAttribute a)+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})+++-- | C structure or union specifiers (K&R A8.3, C99 6.7.2.1)+--+-- @CStruct tag identifier struct-decls c-attrs@ represents a struct or union specifier (depending on @tag@).+--+--   * either @identifier@ or the declaration list @struct-decls@ (or both) have to be present.+--+--     Example: in @struct foo x;@, the identifier is present, in @struct { int y; } x@ the declaration list, and+--     in @struct foo { int y; } x;@ both of them.+--+--   * @c-attrs@ is a list of @__attribute__@ annotations associated with the struct or union specifier+type CStructUnion = CStructureUnion NodeInfo+data CStructureUnion a+  = CStruct+    CStructTag+    (Maybe Ident)+    (Maybe [CDeclaration a])  -- member declarations+    [CAttribute a]            -- __attribute__s+    a+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})+++-- | A tag to determine wheter we refer to a @struct@ or @union@, see 'CStructUnion'.+data CStructTag = CStructTag+                | CUnionTag+                deriving (Show, Eq,Data,Typeable)+++-- | C enumeration specifier (K&R A8.4, C99 6.7.2.2)+--+-- @CEnum identifier enumerator-list attrs@ represent as enum specifier+--+--  * Either the identifier or the enumerator-list (or both) have to be present.+--+--  * If @enumerator-list@ is present, it has to be non-empty.+--+--  * The enumerator list is of the form @(enumeration-constant, enumeration-value?)@, where the latter+--    is an optional constant integral expression.+--+--  * @attrs@ is a list of @__attribute__@ annotations associated with the enumeration specifier+type CEnum = CEnumeration NodeInfo+data CEnumeration a+  = CEnum+    (Maybe Ident)+    (Maybe [(Ident,                   -- variant name+             Maybe (CExpression a))]) -- explicit variant value+    [CAttribute a]                    -- __attribute__s+    a+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})++++-- | C initialization (K&R A8.7, C99 6.7.8)+--+-- Initializers are either assignment expressions or initializer lists+-- (surrounded in curly braces), whose elements are themselves+-- initializers, paired with an optional list of designators.+type CInit = CInitializer NodeInfo+data CInitializer a+  -- | assignment expression+  = CInitExpr (CExpression a) a+  -- | initialization list (see 'CInitList')+  | CInitList (CInitializerList a) a+    deriving (Show, Data,Typeable {-! ,CNode , Annotated !-})++-- deriving Functor does not work (type synonym)+instance Functor CInitializer where+        fmap _f (CInitExpr a1 a2) = CInitExpr (fmap _f a1) (_f a2)+        fmap _f (CInitList a1 a2) = CInitList (fmapInitList _f a1) (_f a2)+fmapInitList :: (a->b) -> (CInitializerList a) -> (CInitializerList b)+fmapInitList _f = map (\(desigs, initializer) -> (fmap (fmap _f) desigs, fmap _f initializer))++-- | Initializer List+--+-- The members of an initializer list are of the form @(designator-list,initializer)@.+-- The @designator-list@ specifies one member of the compound type which is initialized.+-- It is allowed to be empty - in this case the initializer refers to the+-- ''next'' member of the compound type (see C99 6.7.8).+--+-- Examples (simplified expressions and identifiers):+--+-- > -- int x[3][4] = { [0][3] = 4, [2] = 5, 8 };+-- > --   corresponds to the assignments+-- > -- x[0][3] = 4; x[2][0] = 5; x[2][1] = 8;+-- > let init1 = ([CArrDesig 0, CArrDesig 3], CInitExpr 4)+-- >     init2 = ([CArrDesig 2]             , CInitExpr 5)+-- >     init3 = ([]                        , CInitExpr 8)+-- > in  CInitList [init1, init2, init3]+--+-- > -- struct { struct { int a[2]; int b[2]; int c[2]; } s; } x = { .s = { {2,3} , .c[0] = 1 } };+-- > --   corresponds to the assignments+-- > -- x.s.a[0] = 2; x.s.a[1] = 3; x.s.c[0] = 1;+-- > let init_s_0 = CInitList [ ([], CInitExpr 2), ([], CInitExpr 3)]+-- >     init_s   = CInitList [+-- >                            ([], init_s_0),+-- >                            ([CMemberDesig "c", CArrDesig 0], CInitExpr 1)+-- >                          ]+-- > in  CInitList [(CMemberDesig "s", init_s)]+type CInitList = CInitializerList NodeInfo+type CInitializerList a = [([CPartDesignator a], CInitializer a)]++-- | Designators+--+-- A designator specifies a member of an object, either an element or range of an array,+-- or the named member of a struct \/ union.+type CDesignator = CPartDesignator NodeInfo+data CPartDesignator a+  -- | array position designator+  = CArrDesig     (CExpression a) a+  -- | member designator+  | CMemberDesig  Ident a+  -- | array range designator @CRangeDesig from to _@ (GNU C)+  | CRangeDesig (CExpression a) (CExpression a) a+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})+++-- | @__attribute__@ annotations+--+-- Those are of the form @CAttr attribute-name attribute-parameters@,+-- and serve as generic properties of some syntax tree elements.+type CAttr = CAttribute NodeInfo+data CAttribute a = CAttr Ident [CExpression a] a+                    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})+++-- | C expression (K&R A7)+--+-- * these can be arbitrary expression, as the argument of `sizeof' can be+--   arbitrary, even if appearing in a constant expression+--+-- * GNU C extensions: @alignof@, @__real@, @__imag@, @({ stmt-expr })@, @&& label@ and built-ins+--+type CExpr = CExpression NodeInfo+data CExpression a+  = CComma       [CExpression a]         -- comma expression list, n >= 2+                 a+  | CAssign      CAssignOp               -- assignment operator+                 (CExpression a)         -- l-value+                 (CExpression a)         -- r-value+                 a+  | CCond        (CExpression a)         -- conditional+                 (Maybe (CExpression a)) -- true-expression (GNU allows omitting)+                 (CExpression a)         -- false-expression+                 a+  | CBinary      CBinaryOp               -- binary operator+                 (CExpression a)         -- lhs+                 (CExpression a)         -- rhs+                 a+  | CCast        (CDeclaration a)        -- type name+                 (CExpression a)+                 a+  | CUnary       CUnaryOp                -- unary operator+                 (CExpression a)+                 a+  | CSizeofExpr  (CExpression a)+                 a+  | CSizeofType  (CDeclaration a)        -- type name+                 a+  | CAlignofExpr (CExpression a)+                 a+  | CAlignofType (CDeclaration a)        -- type name+                 a+  | CComplexReal (CExpression a)         -- real part of complex number+                 a+  | CComplexImag (CExpression a)         -- imaginary part of complex number+                 a+  | CIndex       (CExpression a)         -- array+                 (CExpression a)         -- index+                 a+  | CCall        (CExpression a)         -- function+                 [CExpression a]         -- arguments+                 a+  | CMember      (CExpression a)         -- structure+                 Ident                   -- member name+                 Bool                    -- deref structure? (True for `->')+                 a+  | CVar         Ident                   -- identifier (incl. enumeration const)+                 a+  | CConst       (CConstant a)           -- ^ integer, character, floating point and string constants+  | CCompoundLit (CDeclaration a)+                 (CInitializerList a)    -- type name & initialiser list+                 a                       -- ^ C99 compound literal+  | CStatExpr    (CStatement a) a        -- ^ GNU C compound statement as expr+  | CLabAddrExpr Ident a                 -- ^ GNU C address of label+  | CBuiltinExpr (CBuiltinThing a)       -- ^ builtin expressions, see 'CBuiltin'+    deriving (Data,Typeable,Show {-! ,CNode , Annotated !-})++-- deriving Functor does not work (type synonyms)+instance Functor CExpression where+        fmap _f (CComma a1 a2) = CComma (fmap (fmap _f) a1) (_f a2)+        fmap _f (CAssign a1 a2 a3 a4)+          = CAssign a1 (fmap _f a2) (fmap _f a3) (_f a4)+        fmap _f (CCond a1 a2 a3 a4)+          = CCond (fmap _f a1) (fmap (fmap _f) a2) (fmap _f a3) (_f a4)+        fmap _f (CBinary a1 a2 a3 a4)+          = CBinary a1 (fmap _f a2) (fmap _f a3) (_f a4)+        fmap _f (CCast a1 a2 a3) = CCast (fmap _f a1) (fmap _f a2) (_f a3)+        fmap _f (CUnary a1 a2 a3) = CUnary a1 (fmap _f a2) (_f a3)+        fmap _f (CSizeofExpr a1 a2) = CSizeofExpr (fmap _f a1) (_f a2)+        fmap _f (CSizeofType a1 a2) = CSizeofType (fmap _f a1) (_f a2)+        fmap _f (CAlignofExpr a1 a2) = CAlignofExpr (fmap _f a1) (_f a2)+        fmap _f (CAlignofType a1 a2) = CAlignofType (fmap _f a1) (_f a2)+        fmap _f (CComplexReal a1 a2) = CComplexReal (fmap _f a1) (_f a2)+        fmap _f (CComplexImag a1 a2) = CComplexImag (fmap _f a1) (_f a2)+        fmap _f (CIndex a1 a2 a3)+          = CIndex (fmap _f a1) (fmap _f a2) (_f a3)+        fmap _f (CCall a1 a2 a3)+          = CCall (fmap _f a1) (fmap (fmap _f) a2) (_f a3)+        fmap _f (CMember a1 a2 a3 a4) = CMember (fmap _f a1) a2 a3 (_f a4)+        fmap _f (CVar a1 a2) = CVar a1 (_f a2)+        fmap _f (CConst a1) = CConst (fmap _f a1)+        fmap _f (CCompoundLit a1 a2 a3)+          = CCompoundLit (fmap _f a1) (fmapInitList _f a2) (_f a3)+        fmap _f (CStatExpr a1 a2) = CStatExpr (fmap _f a1) (_f a2)+        fmap _f (CLabAddrExpr a1 a2) = CLabAddrExpr a1 (_f a2)+        fmap _f (CBuiltinExpr a1) = CBuiltinExpr (fmap _f a1)+++-- | GNU Builtins, which cannot be typed in C99+type CBuiltin = CBuiltinThing NodeInfo+data CBuiltinThing a+  = CBuiltinVaArg (CExpression a) (CDeclaration a) a            -- ^ @(expr, type)@+  | CBuiltinOffsetOf (CDeclaration a) [CPartDesignator a] a -- ^ @(type, designator-list)@+  | CBuiltinTypesCompatible (CDeclaration a) (CDeclaration a) a  -- ^ @(type,type)@+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})+++-- | C constant (K&R A2.5 & A7.2)+type CConst = CConstant NodeInfo+data CConstant a+  = CIntConst   CInteger a+  | CCharConst  CChar a+  | CFloatConst CFloat a+  | CStrConst   CString a+    deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})+++-- | Attributed string literals+type CStrLit = CStringLiteral NodeInfo+data CStringLiteral a = CStrLit CString a+            deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})+++cstringOfLit :: CStringLiteral a -> CString+cstringOfLit (CStrLit cstr _) = cstr++-- | Lift a string literal to a C constant+liftStrLit :: CStringLiteral a -> CConstant a+liftStrLit (CStrLit str at) = CStrConst str at++-- | All AST nodes are annotated. Inspired by the Annotated+-- class of Niklas Broberg's haskell-src-exts package.+-- In principle, we could have Copointed superclass instead+-- of @ann@, for the price of another dependency.+class (Functor ast) => Annotated ast where+  -- | get the annotation of an AST node+  annotation :: ast a -> a+  -- | change the annotation (non-recursively)+  --   of an AST node. Use fmap for recursively+  --   modifying the annotation.+  amap  :: (a->a) -> ast a -> ast a++-- fmap2 :: (a->a') -> (a,b) -> (a',b)+-- fmap2 f (a,b) = (f a, b)++-- Instances generated using derive-2.*+-- GENERATED START+++instance (CNode t1) => CNode (CTranslationUnit t1) where+        nodeInfo (CTranslUnit _ n) = nodeInfo n++instance (CNode t1) => Pos (CTranslationUnit t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CTranslationUnit where+        fmap _f (CTranslUnit a1 a2)+          = CTranslUnit (fmap (fmap _f) a1) (_f a2)+++instance Annotated CTranslationUnit where+        annotation (CTranslUnit _ n) = n+        amap f (CTranslUnit a_1 a_2) = CTranslUnit a_1 (f a_2)+++instance (CNode t1) => CNode (CExternalDeclaration t1) where+        nodeInfo (CDeclExt d) = nodeInfo d+        nodeInfo (CFDefExt d) = nodeInfo d+        nodeInfo (CAsmExt _ n) = nodeInfo n++instance (CNode t1) => Pos (CExternalDeclaration t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CExternalDeclaration where+        fmap _f (CDeclExt a1) = CDeclExt (fmap _f a1)+        fmap _f (CFDefExt a1) = CFDefExt (fmap _f a1)+        fmap _f (CAsmExt a1 a2) = CAsmExt (fmap _f a1) (_f a2)+++instance Annotated CExternalDeclaration where+        annotation (CDeclExt n) = annotation n+        annotation (CFDefExt n) = annotation n+        annotation (CAsmExt _ n) = n+        amap f (CDeclExt n) = CDeclExt (amap f n)+        amap f (CFDefExt n) = CFDefExt (amap f n)+        amap f (CAsmExt a_1 a_2) = CAsmExt a_1 (f a_2)+++instance (CNode t1) => CNode (CFunctionDef t1) where+        nodeInfo (CFunDef _ _ _ _ n) = nodeInfo n++instance (CNode t1) => Pos (CFunctionDef t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CFunctionDef where+        fmap _f (CFunDef a1 a2 a3 a4 a5)+          = CFunDef (fmap (fmap _f) a1) (fmap _f a2) (fmap (fmap _f) a3)+              (fmap _f a4)+              (_f a5)+++instance Annotated CFunctionDef where+        annotation (CFunDef _ _ _ _ n) = n+        amap f (CFunDef a_1 a_2 a_3 a_4 a_5)+          = CFunDef a_1 a_2 a_3 a_4 (f a_5)+++instance (CNode t1) => CNode (CDeclaration t1) where+        nodeInfo (CDecl _ _ n) = nodeInfo n++instance (CNode t1) => Pos (CDeclaration t1) where+        posOf x = posOf (nodeInfo x)+++instance Annotated CDeclaration where+        annotation (CDecl _ _ n) = n+        amap f (CDecl a_1 a_2 a_3) = CDecl a_1 a_2 (f a_3)+++instance (CNode t1) => CNode (CDeclarator t1) where+        nodeInfo (CDeclr _ _ _ _ n) = nodeInfo n++instance (CNode t1) => Pos (CDeclarator t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CDeclarator where+        fmap _f (CDeclr a1 a2 a3 a4 a5)+          = CDeclr a1 (fmap (fmap _f) a2) (fmap (fmap _f) a3)+              (fmap (fmap _f) a4)+              (_f a5)+++instance Annotated CDeclarator where+        annotation (CDeclr _ _ _ _ n) = n+        amap f (CDeclr a_1 a_2 a_3 a_4 a_5)+          = CDeclr a_1 a_2 a_3 a_4 (f a_5)+++instance (CNode t1) => CNode (CDerivedDeclarator t1) where+        nodeInfo (CPtrDeclr _ n) = nodeInfo n+        nodeInfo (CArrDeclr _ _ n) = nodeInfo n+        nodeInfo (CFunDeclr _ _ n) = nodeInfo n++instance (CNode t1) => Pos (CDerivedDeclarator t1) where+        posOf x = posOf (nodeInfo x)+++instance Annotated CDerivedDeclarator where+        annotation (CPtrDeclr _ n) = n+        annotation (CArrDeclr _ _ n) = n+        annotation (CFunDeclr _ _ n) = n+        amap f (CPtrDeclr a_1 a_2) = CPtrDeclr a_1 (f a_2)+        amap f (CArrDeclr a_1 a_2 a_3) = CArrDeclr a_1 a_2 (f a_3)+        amap f (CFunDeclr a_1 a_2 a_3) = CFunDeclr a_1 a_2 (f a_3)+++instance Functor CArraySize where+        fmap _ (CNoArrSize a1) = CNoArrSize a1+        fmap _f (CArrSize a1 a2) = CArrSize a1 (fmap _f a2)+++instance (CNode t1) => CNode (CStatement t1) where+        nodeInfo (CLabel _ _ _ n) = nodeInfo n+        nodeInfo (CCase _ _ n) = nodeInfo n+        nodeInfo (CCases _ _ _ n) = nodeInfo n+        nodeInfo (CDefault _ n) = nodeInfo n+        nodeInfo (CExpr _ n) = nodeInfo n+        nodeInfo (CCompound _ _ n) = nodeInfo n+        nodeInfo (CIf _ _ _ n) = nodeInfo n+        nodeInfo (CSwitch _ _ n) = nodeInfo n+        nodeInfo (CWhile _ _ _ n) = nodeInfo n+        nodeInfo (CFor _ _ _ _ n) = nodeInfo n+        nodeInfo (CGoto _ n) = nodeInfo n+        nodeInfo (CGotoPtr _ n) = nodeInfo n+        nodeInfo (CCont d) = nodeInfo d+        nodeInfo (CBreak d) = nodeInfo d+        nodeInfo (CReturn _ n) = nodeInfo n+        nodeInfo (CAsm _ n) = nodeInfo n++instance (CNode t1) => Pos (CStatement t1) where+        posOf x = posOf (nodeInfo x)+++instance Annotated CStatement where+        annotation (CLabel _ _ _ n) = n+        annotation (CCase _ _ n) = n+        annotation (CCases _ _ _ n) = n+        annotation (CDefault _ n) = n+        annotation (CExpr _ n) = n+        annotation (CCompound _ _ n) = n+        annotation (CIf _ _ _ n) = n+        annotation (CSwitch _ _ n) = n+        annotation (CWhile _ _ _ n) = n+        annotation (CFor _ _ _ _ n) = n+        annotation (CGoto _ n) = n+        annotation (CGotoPtr _ n) = n+        annotation (CCont n) = n+        annotation (CBreak n) = n+        annotation (CReturn _ n) = n+        annotation (CAsm _ n) = n+        amap f (CLabel a_1 a_2 a_3 a_4) = CLabel a_1 a_2 a_3 (f a_4)+        amap f (CCase a_1 a_2 a_3) = CCase a_1 a_2 (f a_3)+        amap f (CCases a_1 a_2 a_3 a_4) = CCases a_1 a_2 a_3 (f a_4)+        amap f (CDefault a_1 a_2) = CDefault a_1 (f a_2)+        amap f (CExpr a_1 a_2) = CExpr a_1 (f a_2)+        amap f (CCompound a_1 a_2 a_3) = CCompound a_1 a_2 (f a_3)+        amap f (CIf a_1 a_2 a_3 a_4) = CIf a_1 a_2 a_3 (f a_4)+        amap f (CSwitch a_1 a_2 a_3) = CSwitch a_1 a_2 (f a_3)+        amap f (CWhile a_1 a_2 a_3 a_4) = CWhile a_1 a_2 a_3 (f a_4)+        amap f (CFor a_1 a_2 a_3 a_4 a_5) = CFor a_1 a_2 a_3 a_4 (f a_5)+        amap f (CGoto a_1 a_2) = CGoto a_1 (f a_2)+        amap f (CGotoPtr a_1 a_2) = CGotoPtr a_1 (f a_2)+        amap f (CCont a_1) = CCont (f a_1)+        amap f (CBreak a_1) = CBreak (f a_1)+        amap f (CReturn a_1 a_2) = CReturn a_1 (f a_2)+        amap f (CAsm a_1 a_2) = CAsm a_1 (f a_2)+++instance (CNode t1) => CNode (CAssemblyStatement t1) where+        nodeInfo (CAsmStmt _ _ _ _ _ n) = nodeInfo n++instance (CNode t1) => Pos (CAssemblyStatement t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CAssemblyStatement where+        fmap _f (CAsmStmt a1 a2 a3 a4 a5 a6)+          = CAsmStmt (fmap (fmap _f) a1) (fmap _f a2) (fmap (fmap _f) a3)+              (fmap (fmap _f) a4)+              (fmap (fmap _f) a5)+              (_f a6)+++instance Annotated CAssemblyStatement where+        annotation (CAsmStmt _ _ _ _ _ n) = n+        amap f (CAsmStmt a_1 a_2 a_3 a_4 a_5 a_6)+          = CAsmStmt a_1 a_2 a_3 a_4 a_5 (f a_6)+++instance (CNode t1) => CNode (CAssemblyOperand t1) where+        nodeInfo (CAsmOperand _ _ _ n) = nodeInfo n++instance (CNode t1) => Pos (CAssemblyOperand t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CAssemblyOperand where+        fmap _f (CAsmOperand a1 a2 a3 a4)+          = CAsmOperand a1 (fmap _f a2) (fmap _f a3) (_f a4)+++instance Annotated CAssemblyOperand where+        annotation (CAsmOperand _ _ _ n) = n+        amap f (CAsmOperand a_1 a_2 a_3 a_4)+          = CAsmOperand a_1 a_2 a_3 (f a_4)+++instance (CNode t1) => CNode (CCompoundBlockItem t1) where+        nodeInfo (CBlockStmt d) = nodeInfo d+        nodeInfo (CBlockDecl d) = nodeInfo d+        nodeInfo (CNestedFunDef d) = nodeInfo d++instance (CNode t1) => Pos (CCompoundBlockItem t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CCompoundBlockItem where+        fmap _f (CBlockStmt a1) = CBlockStmt (fmap _f a1)+        fmap _f (CBlockDecl a1) = CBlockDecl (fmap _f a1)+        fmap _f (CNestedFunDef a1) = CNestedFunDef (fmap _f a1)+++instance Annotated CCompoundBlockItem where+        annotation (CBlockStmt n) = annotation n+        annotation (CBlockDecl n) = annotation n+        annotation (CNestedFunDef n) = annotation n+        amap f (CBlockStmt n) = CBlockStmt (amap f n)+        amap f (CBlockDecl n) = CBlockDecl (amap f n)+        amap f (CNestedFunDef n) = CNestedFunDef (amap f n)+++instance (CNode t1) => CNode (CDeclarationSpecifier t1) where+        nodeInfo (CStorageSpec d) = nodeInfo d+        nodeInfo (CTypeSpec d) = nodeInfo d+        nodeInfo (CTypeQual d) = nodeInfo d++instance (CNode t1) => Pos (CDeclarationSpecifier t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CDeclarationSpecifier where+        fmap _f (CStorageSpec a1) = CStorageSpec (fmap _f a1)+        fmap _f (CTypeSpec a1) = CTypeSpec (fmap _f a1)+        fmap _f (CTypeQual a1) = CTypeQual (fmap _f a1)+++instance Annotated CDeclarationSpecifier where+        annotation (CStorageSpec n) = annotation n+        annotation (CTypeSpec n) = annotation n+        annotation (CTypeQual n) = annotation n+        amap f (CStorageSpec n) = CStorageSpec (amap f n)+        amap f (CTypeSpec n) = CTypeSpec (amap f n)+        amap f (CTypeQual n) = CTypeQual (amap f n)+++instance (CNode t1) => CNode (CStorageSpecifier t1) where+        nodeInfo (CAuto d) = nodeInfo d+        nodeInfo (CRegister d) = nodeInfo d+        nodeInfo (CStatic d) = nodeInfo d+        nodeInfo (CExtern d) = nodeInfo d+        nodeInfo (CTypedef d) = nodeInfo d+        nodeInfo (CThread d) = nodeInfo d++instance (CNode t1) => Pos (CStorageSpecifier t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CStorageSpecifier where+        fmap _f (CAuto a1) = CAuto (_f a1)+        fmap _f (CRegister a1) = CRegister (_f a1)+        fmap _f (CStatic a1) = CStatic (_f a1)+        fmap _f (CExtern a1) = CExtern (_f a1)+        fmap _f (CTypedef a1) = CTypedef (_f a1)+        fmap _f (CThread a1) = CThread (_f a1)+++instance Annotated CStorageSpecifier where+        annotation (CAuto n) = n+        annotation (CRegister n) = n+        annotation (CStatic n) = n+        annotation (CExtern n) = n+        annotation (CTypedef n) = n+        annotation (CThread n) = n+        amap f (CAuto a_1) = CAuto (f a_1)+        amap f (CRegister a_1) = CRegister (f a_1)+        amap f (CStatic a_1) = CStatic (f a_1)+        amap f (CExtern a_1) = CExtern (f a_1)+        amap f (CTypedef a_1) = CTypedef (f a_1)+        amap f (CThread a_1) = CThread (f a_1)+++instance (CNode t1) => CNode (CTypeSpecifier t1) where+        nodeInfo (CVoidType d) = nodeInfo d+        nodeInfo (CCharType d) = nodeInfo d+        nodeInfo (CShortType d) = nodeInfo d+        nodeInfo (CIntType d) = nodeInfo d+        nodeInfo (CLongType d) = nodeInfo d+        nodeInfo (CFloatType d) = nodeInfo d+        nodeInfo (CDoubleType d) = nodeInfo d+        nodeInfo (CSignedType d) = nodeInfo d+        nodeInfo (CUnsigType d) = nodeInfo d+        nodeInfo (CBoolType d) = nodeInfo d+        nodeInfo (CComplexType d) = nodeInfo d+        nodeInfo (CSUType _ n) = nodeInfo n+        nodeInfo (CEnumType _ n) = nodeInfo n+        nodeInfo (CTypeDef _ n) = nodeInfo n+        nodeInfo (CTypeOfExpr _ n) = nodeInfo n+        nodeInfo (CTypeOfType _ n) = nodeInfo n++instance (CNode t1) => Pos (CTypeSpecifier t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CTypeSpecifier where+        fmap _f (CVoidType a1) = CVoidType (_f a1)+        fmap _f (CCharType a1) = CCharType (_f a1)+        fmap _f (CShortType a1) = CShortType (_f a1)+        fmap _f (CIntType a1) = CIntType (_f a1)+        fmap _f (CLongType a1) = CLongType (_f a1)+        fmap _f (CFloatType a1) = CFloatType (_f a1)+        fmap _f (CDoubleType a1) = CDoubleType (_f a1)+        fmap _f (CSignedType a1) = CSignedType (_f a1)+        fmap _f (CUnsigType a1) = CUnsigType (_f a1)+        fmap _f (CBoolType a1) = CBoolType (_f a1)+        fmap _f (CComplexType a1) = CComplexType (_f a1)+        fmap _f (CSUType a1 a2) = CSUType (fmap _f a1) (_f a2)+        fmap _f (CEnumType a1 a2) = CEnumType (fmap _f a1) (_f a2)+        fmap _f (CTypeDef a1 a2) = CTypeDef a1 (_f a2)+        fmap _f (CTypeOfExpr a1 a2) = CTypeOfExpr (fmap _f a1) (_f a2)+        fmap _f (CTypeOfType a1 a2) = CTypeOfType (fmap _f a1) (_f a2)+++instance Annotated CTypeSpecifier where+        annotation (CVoidType n) = n+        annotation (CCharType n) = n+        annotation (CShortType n) = n+        annotation (CIntType n) = n+        annotation (CLongType n) = n+        annotation (CFloatType n) = n+        annotation (CDoubleType n) = n+        annotation (CSignedType n) = n+        annotation (CUnsigType n) = n+        annotation (CBoolType n) = n+        annotation (CComplexType n) = n+        annotation (CSUType _ n) = n+        annotation (CEnumType _ n) = n+        annotation (CTypeDef _ n) = n+        annotation (CTypeOfExpr _ n) = n+        annotation (CTypeOfType _ n) = n+        amap f (CVoidType a_1) = CVoidType (f a_1)+        amap f (CCharType a_1) = CCharType (f a_1)+        amap f (CShortType a_1) = CShortType (f a_1)+        amap f (CIntType a_1) = CIntType (f a_1)+        amap f (CLongType a_1) = CLongType (f a_1)+        amap f (CFloatType a_1) = CFloatType (f a_1)+        amap f (CDoubleType a_1) = CDoubleType (f a_1)+        amap f (CSignedType a_1) = CSignedType (f a_1)+        amap f (CUnsigType a_1) = CUnsigType (f a_1)+        amap f (CBoolType a_1) = CBoolType (f a_1)+        amap f (CComplexType a_1) = CComplexType (f a_1)+        amap f (CSUType a_1 a_2) = CSUType a_1 (f a_2)+        amap f (CEnumType a_1 a_2) = CEnumType a_1 (f a_2)+        amap f (CTypeDef a_1 a_2) = CTypeDef a_1 (f a_2)+        amap f (CTypeOfExpr a_1 a_2) = CTypeOfExpr a_1 (f a_2)+        amap f (CTypeOfType a_1 a_2) = CTypeOfType a_1 (f a_2)+++instance (CNode t1) => CNode (CTypeQualifier t1) where+        nodeInfo (CConstQual d) = nodeInfo d+        nodeInfo (CVolatQual d) = nodeInfo d+        nodeInfo (CRestrQual d) = nodeInfo d+        nodeInfo (CInlineQual d) = nodeInfo d+        nodeInfo (CAttrQual d) = nodeInfo d++instance (CNode t1) => Pos (CTypeQualifier t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CTypeQualifier where+        fmap _f (CConstQual a1) = CConstQual (_f a1)+        fmap _f (CVolatQual a1) = CVolatQual (_f a1)+        fmap _f (CRestrQual a1) = CRestrQual (_f a1)+        fmap _f (CInlineQual a1) = CInlineQual (_f a1)+        fmap _f (CAttrQual a1) = CAttrQual (fmap _f a1)+++instance Annotated CTypeQualifier where+        annotation (CConstQual n) = n+        annotation (CVolatQual n) = n+        annotation (CRestrQual n) = n+        annotation (CInlineQual n) = n+        annotation (CAttrQual n) = annotation n+        amap f (CConstQual a_1) = CConstQual (f a_1)+        amap f (CVolatQual a_1) = CVolatQual (f a_1)+        amap f (CRestrQual a_1) = CRestrQual (f a_1)+        amap f (CInlineQual a_1) = CInlineQual (f a_1)+        amap f (CAttrQual n) = CAttrQual (amap f n)+++instance (CNode t1) => CNode (CStructureUnion t1) where+        nodeInfo (CStruct _ _ _ _ n) = nodeInfo n++instance (CNode t1) => Pos (CStructureUnion t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CStructureUnion where+        fmap _f (CStruct a1 a2 a3 a4 a5)+          = CStruct a1 a2 (fmap (fmap (fmap _f)) a3) (fmap (fmap _f) a4)+              (_f a5)+++instance Annotated CStructureUnion where+        annotation (CStruct _ _ _ _ n) = n+        amap f (CStruct a_1 a_2 a_3 a_4 a_5)+          = CStruct a_1 a_2 a_3 a_4 (f a_5)+++instance (CNode t1) => CNode (CEnumeration t1) where+        nodeInfo (CEnum _ _ _ n) = nodeInfo n++instance (CNode t1) => Pos (CEnumeration t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CEnumeration where+        fmap _f (CEnum a1 a2 a3 a4)+          = CEnum a1 (fmap (fmap (fmap (fmap (fmap _f)))) a2)+              (fmap (fmap _f) a3)+              (_f a4)+++instance Annotated CEnumeration where+        annotation (CEnum _ _ _ n) = n+        amap f (CEnum a_1 a_2 a_3 a_4) = CEnum a_1 a_2 a_3 (f a_4)+++instance (CNode t1) => CNode (CInitializer t1) where+        nodeInfo (CInitExpr _ n) = nodeInfo n+        nodeInfo (CInitList _ n) = nodeInfo n++instance (CNode t1) => Pos (CInitializer t1) where+        posOf x = posOf (nodeInfo x)+++instance Annotated CInitializer where+        annotation (CInitExpr _ n) = n+        annotation (CInitList _ n) = n+        amap f (CInitExpr a_1 a_2) = CInitExpr a_1 (f a_2)+        amap f (CInitList a_1 a_2) = CInitList a_1 (f a_2)+++instance (CNode t1) => CNode (CPartDesignator t1) where+        nodeInfo (CArrDesig _ n) = nodeInfo n+        nodeInfo (CMemberDesig _ n) = nodeInfo n+        nodeInfo (CRangeDesig _ _ n) = nodeInfo n++instance (CNode t1) => Pos (CPartDesignator t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CPartDesignator where+        fmap _f (CArrDesig a1 a2) = CArrDesig (fmap _f a1) (_f a2)+        fmap _f (CMemberDesig a1 a2) = CMemberDesig a1 (_f a2)+        fmap _f (CRangeDesig a1 a2 a3)+          = CRangeDesig (fmap _f a1) (fmap _f a2) (_f a3)+++instance Annotated CPartDesignator where+        annotation (CArrDesig _ n) = n+        annotation (CMemberDesig _ n) = n+        annotation (CRangeDesig _ _ n) = n+        amap f (CArrDesig a_1 a_2) = CArrDesig a_1 (f a_2)+        amap f (CMemberDesig a_1 a_2) = CMemberDesig a_1 (f a_2)+        amap f (CRangeDesig a_1 a_2 a_3) = CRangeDesig a_1 a_2 (f a_3)+++instance (CNode t1) => CNode (CAttribute t1) where+        nodeInfo (CAttr _ _ n) = nodeInfo n++instance (CNode t1) => Pos (CAttribute t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CAttribute where+        fmap _f (CAttr a1 a2 a3) = CAttr a1 (fmap (fmap _f) a2) (_f a3)+++instance Annotated CAttribute where+        annotation (CAttr _ _ n) = n+        amap f (CAttr a_1 a_2 a_3) = CAttr a_1 a_2 (f a_3)+++instance (CNode t1) => CNode (CExpression t1) where+        nodeInfo (CComma _ n) = nodeInfo n+        nodeInfo (CAssign _ _ _ n) = nodeInfo n+        nodeInfo (CCond _ _ _ n) = nodeInfo n+        nodeInfo (CBinary _ _ _ n) = nodeInfo n+        nodeInfo (CCast _ _ n) = nodeInfo n+        nodeInfo (CUnary _ _ n) = nodeInfo n+        nodeInfo (CSizeofExpr _ n) = nodeInfo n+        nodeInfo (CSizeofType _ n) = nodeInfo n+        nodeInfo (CAlignofExpr _ n) = nodeInfo n+        nodeInfo (CAlignofType _ n) = nodeInfo n+        nodeInfo (CComplexReal _ n) = nodeInfo n+        nodeInfo (CComplexImag _ n) = nodeInfo n+        nodeInfo (CIndex _ _ n) = nodeInfo n+        nodeInfo (CCall _ _ n) = nodeInfo n+        nodeInfo (CMember _ _ _ n) = nodeInfo n+        nodeInfo (CVar _ n) = nodeInfo n+        nodeInfo (CConst d) = nodeInfo d+        nodeInfo (CCompoundLit _ _ n) = nodeInfo n+        nodeInfo (CStatExpr _ n) = nodeInfo n+        nodeInfo (CLabAddrExpr _ n) = nodeInfo n+        nodeInfo (CBuiltinExpr d) = nodeInfo d++instance (CNode t1) => Pos (CExpression t1) where+        posOf x = posOf (nodeInfo x)+++instance Annotated CExpression where+        annotation (CComma _ n) = n+        annotation (CAssign _ _ _ n) = n+        annotation (CCond _ _ _ n) = n+        annotation (CBinary _ _ _ n) = n+        annotation (CCast _ _ n) = n+        annotation (CUnary _ _ n) = n+        annotation (CSizeofExpr _ n) = n+        annotation (CSizeofType _ n) = n+        annotation (CAlignofExpr _ n) = n+        annotation (CAlignofType _ n) = n+        annotation (CComplexReal _ n) = n+        annotation (CComplexImag _ n) = n+        annotation (CIndex _ _ n) = n+        annotation (CCall _ _ n) = n+        annotation (CMember _ _ _ n) = n+        annotation (CVar _ n) = n+        annotation (CConst n) = annotation n+        annotation (CCompoundLit _ _ n) = n+        annotation (CStatExpr _ n) = n+        annotation (CLabAddrExpr _ n) = n+        annotation (CBuiltinExpr n) = annotation n+        amap f (CComma a_1 a_2) = CComma a_1 (f a_2)+        amap f (CAssign a_1 a_2 a_3 a_4) = CAssign a_1 a_2 a_3 (f a_4)+        amap f (CCond a_1 a_2 a_3 a_4) = CCond a_1 a_2 a_3 (f a_4)+        amap f (CBinary a_1 a_2 a_3 a_4) = CBinary a_1 a_2 a_3 (f a_4)+        amap f (CCast a_1 a_2 a_3) = CCast a_1 a_2 (f a_3)+        amap f (CUnary a_1 a_2 a_3) = CUnary a_1 a_2 (f a_3)+        amap f (CSizeofExpr a_1 a_2) = CSizeofExpr a_1 (f a_2)+        amap f (CSizeofType a_1 a_2) = CSizeofType a_1 (f a_2)+        amap f (CAlignofExpr a_1 a_2) = CAlignofExpr a_1 (f a_2)+        amap f (CAlignofType a_1 a_2) = CAlignofType a_1 (f a_2)+        amap f (CComplexReal a_1 a_2) = CComplexReal a_1 (f a_2)+        amap f (CComplexImag a_1 a_2) = CComplexImag a_1 (f a_2)+        amap f (CIndex a_1 a_2 a_3) = CIndex a_1 a_2 (f a_3)+        amap f (CCall a_1 a_2 a_3) = CCall a_1 a_2 (f a_3)+        amap f (CMember a_1 a_2 a_3 a_4) = CMember a_1 a_2 a_3 (f a_4)+        amap f (CVar a_1 a_2) = CVar a_1 (f a_2)+        amap f (CConst n) = CConst (amap f n)+        amap f (CCompoundLit a_1 a_2 a_3) = CCompoundLit a_1 a_2 (f a_3)+        amap f (CStatExpr a_1 a_2) = CStatExpr a_1 (f a_2)+        amap f (CLabAddrExpr a_1 a_2) = CLabAddrExpr a_1 (f a_2)+        amap f (CBuiltinExpr n) = CBuiltinExpr (amap f n)+++instance (CNode t1) => CNode (CBuiltinThing t1) where+        nodeInfo (CBuiltinVaArg _ _ n) = nodeInfo n+        nodeInfo (CBuiltinOffsetOf _ _ n) = nodeInfo n+        nodeInfo (CBuiltinTypesCompatible _ _ n) = nodeInfo n++instance (CNode t1) => Pos (CBuiltinThing t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CBuiltinThing where+        fmap _f (CBuiltinVaArg a1 a2 a3)+          = CBuiltinVaArg (fmap _f a1) (fmap _f a2) (_f a3)+        fmap _f (CBuiltinOffsetOf a1 a2 a3)+          = CBuiltinOffsetOf (fmap _f a1) (fmap (fmap _f) a2) (_f a3)+        fmap _f (CBuiltinTypesCompatible a1 a2 a3)+          = CBuiltinTypesCompatible (fmap _f a1) (fmap _f a2) (_f a3)+++instance Annotated CBuiltinThing where+        annotation (CBuiltinVaArg _ _ n) = n+        annotation (CBuiltinOffsetOf _ _ n) = n+        annotation (CBuiltinTypesCompatible _ _ n) = n+        amap f (CBuiltinVaArg a_1 a_2 a_3) = CBuiltinVaArg a_1 a_2 (f a_3)+        amap f (CBuiltinOffsetOf a_1 a_2 a_3)+          = CBuiltinOffsetOf a_1 a_2 (f a_3)+        amap f (CBuiltinTypesCompatible a_1 a_2 a_3)+          = CBuiltinTypesCompatible a_1 a_2 (f a_3)+++instance (CNode t1) => CNode (CConstant t1) where+        nodeInfo (CIntConst _ n) = nodeInfo n+        nodeInfo (CCharConst _ n) = nodeInfo n+        nodeInfo (CFloatConst _ n) = nodeInfo n+        nodeInfo (CStrConst _ n) = nodeInfo n++instance (CNode t1) => Pos (CConstant t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CConstant where+        fmap _f (CIntConst a1 a2) = CIntConst a1 (_f a2)+        fmap _f (CCharConst a1 a2) = CCharConst a1 (_f a2)+        fmap _f (CFloatConst a1 a2) = CFloatConst a1 (_f a2)+        fmap _f (CStrConst a1 a2) = CStrConst a1 (_f a2)+++instance Annotated CConstant where+        annotation (CIntConst _ n) = n+        annotation (CCharConst _ n) = n+        annotation (CFloatConst _ n) = n+        annotation (CStrConst _ n) = n+        amap f (CIntConst a_1 a_2) = CIntConst a_1 (f a_2)+        amap f (CCharConst a_1 a_2) = CCharConst a_1 (f a_2)+        amap f (CFloatConst a_1 a_2) = CFloatConst a_1 (f a_2)+        amap f (CStrConst a_1 a_2) = CStrConst a_1 (f a_2)+++instance (CNode t1) => CNode (CStringLiteral t1) where+        nodeInfo (CStrLit _ n) = nodeInfo n++instance (CNode t1) => Pos (CStringLiteral t1) where+        posOf x = posOf (nodeInfo x)+++instance Functor CStringLiteral where+        fmap _f (CStrLit a1 a2) = CStrLit a1 (_f a2)+++instance Annotated CStringLiteral where+        annotation (CStrLit _ n) = n+        amap f (CStrLit a_1 a_2) = CStrLit a_1 (f a_2)+-- GENERATED STOP
src/Language/C/Syntax/Constants.hs view
@@ -46,7 +46,7 @@     showsPrec _ (CChars cs wideflag) = _showWideFlag wideflag . (sQuote $ concatMap escapeCChar cs)  -- | @showCharConst c@ prepends _a_ String representing the C char constant corresponding to @c@.--- If neccessary uses octal or hexadecimal escape sequences.+-- If necessary uses octal or hexadecimal escape sequences. showCharConst :: Char -> ShowS showCharConst c = sQuote $ escapeCChar c @@ -178,7 +178,7 @@ concatCStrings cs = CString (concatMap getCString cs) (any isWideString cs)  -- | @showStringLiteral s@ prepends a String representing the C string literal corresponding to @s@.--- If neccessary it uses octal or hexadecimal escape sequences.+-- If necessary it uses octal or hexadecimal escape sequences. showStringLit :: String -> ShowS showStringLit = dQuote . concatMap showStringChar   where@@ -264,7 +264,7 @@ head' err []  = error err head' _ (x:_) = x --- TODO: Move to seperate file ?+-- TODO: Move to separate file ? newtype Flags f = Flags Integer deriving (Eq,Ord,Data,Typeable) noFlags :: Flags f noFlags = Flags 0@@ -274,6 +274,3 @@ clearFlag flag (Flags k) = Flags$ k `clearBit` fromEnum flag testFlag :: (Enum f) => f -> Flags f -> Bool testFlag flag (Flags k)  = k `testBit` fromEnum flag---
src/Language/C/Syntax/Ops.hs view
@@ -13,10 +13,16 @@ module Language.C.Syntax.Ops ( -- * Assignment operators CAssignOp(..),--- * Unary operators-CUnaryOp(..),+assignBinop, -- * Binary operators CBinaryOp(..),+isCmpOp,+isPtrOp,+isBitOp,+isLogicOp,+-- * Unary operators+CUnaryOp(..),+isEffectfulOp ) where import Data.Generics@@ -32,20 +38,21 @@                | CAndAssOp                | CXorAssOp                | COrAssOp-               deriving (Eq, Ord,Data,Typeable)-instance Show CAssignOp where-  show CAssignOp = "="-  show CMulAssOp = "*="-  show CDivAssOp = "/="-  show CRmdAssOp = "%="-  show CAddAssOp = "+="-  show CSubAssOp = "-="-  show CShlAssOp = "<<="-  show CShrAssOp = ">>="-  show CAndAssOp = "&="-  show CXorAssOp = "^="-  show COrAssOp  = "|="+               deriving (Eq,Ord,Show,Data,Typeable) +assignBinop :: CAssignOp -> CBinaryOp+assignBinop CAssignOp = error "direct assignment has no binary operator"+assignBinop CMulAssOp = CMulOp+assignBinop CDivAssOp = CDivOp+assignBinop CRmdAssOp = CRmdOp+assignBinop CAddAssOp = CAddOp+assignBinop CSubAssOp = CSubOp+assignBinop CShlAssOp = CShlOp+assignBinop CShrAssOp = CShrOp+assignBinop CAndAssOp = CAndOp+assignBinop CXorAssOp = CXorOp+assignBinop COrAssOp  = COrOp+ -- | C binary operators (K&R A7.6-15) -- data CBinaryOp = CMulOp@@ -66,27 +73,20 @@                | COrOp                  -- ^ inclusive bitwise or                | CLndOp                 -- ^ logical and                | CLorOp                 -- ^ logical or-               deriving (Eq,Ord,Data,Typeable)-instance Show CBinaryOp where-  show CMulOp = "*"-  show CDivOp = "/"-  show CRmdOp = "%"-  show CAddOp = "+"-  show CSubOp = "-"-  show CShlOp = "<<"-  show CShrOp = ">>"-  show CLeOp  = "<"-  show CGrOp  = ">"-  show CLeqOp = "<="-  show CGeqOp = ">="-  show CEqOp  = "=="-  show CNeqOp = "!="-  show CAndOp = "&"-  show CXorOp = "^"-  show COrOp  = "|"-  show CLndOp = "&&"-  show CLorOp = "||"+               deriving (Eq,Ord,Show,Data,Typeable) +isCmpOp :: CBinaryOp -> Bool+isCmpOp op = op `elem` [ CLeqOp, CGeqOp, CLeOp, CGrOp, CEqOp, CNeqOp ]++isPtrOp :: CBinaryOp -> Bool+isPtrOp op = op `elem` [ CAddOp, CSubOp ]++isBitOp :: CBinaryOp -> Bool+isBitOp op = op `elem` [ CShlOp, CShrOp, CAndOp, COrOp, CXorOp ]++isLogicOp :: CBinaryOp -> Bool+isLogicOp op = op `elem` [ CLndOp, CLorOp ]+ -- | C unary operator (K&R A7.3-4) -- data CUnaryOp = CPreIncOp               -- ^ prefix increment operator@@ -99,15 +99,7 @@               | CMinOp                  -- ^ prefix minus               | CCompOp                 -- ^ one's complement               | CNegOp                  -- ^ logical negation-              deriving (Eq,Ord,Data,Typeable)-instance Show CUnaryOp where-  show CPreIncOp  = "++"-  show CPreDecOp  = "--"-  show CPostIncOp = "++"-  show CPostDecOp = "--"-  show CAdrOp     = "&"-  show CIndOp     = "*"-  show CPlusOp    = "+"-  show CMinOp     = "-"-  show CCompOp    = "~"-  show CNegOp     = "!"+              deriving (Eq,Ord,Show,Data,Typeable)++isEffectfulOp :: CUnaryOp -> Bool+isEffectfulOp op = op `elem` [ CPreIncOp, CPreDecOp, CPostIncOp, CPostDecOp ]
+ src/Language/C/Syntax/Utils.hs view
@@ -0,0 +1,76 @@+module Language.C.Syntax.Utils (+  -- * Generic operations+  getSubStmts,+  mapSubStmts,+  mapBlockItemStmts,+  -- * Concrete operations+  getLabels+) where++import Data.List+import Language.C.Data.Ident+import Language.C.Syntax.AST++-- XXX: This is should be generalized !!!+--      Data.Generics sounds attractive, but we really need to control the evaluation order+-- XXX: Expression statements (which are somewhat problematic anyway), aren't handled yet+getSubStmts :: CStat -> [CStat]+getSubStmts (CLabel _ s _ _)      = [s]+getSubStmts (CCase _ s _)         = [s]+getSubStmts (CCases _ _ s _)      = [s]+getSubStmts (CDefault s _)        = [s]+getSubStmts (CExpr _ _)           = []+getSubStmts (CCompound _ body _)  = concatMap compoundSubStmts body+getSubStmts (CIf _ sthen selse _) = maybe [sthen] (\s -> [sthen,s]) selse+getSubStmts (CSwitch _ s _)       = [s]+getSubStmts (CWhile _ s _ _)      = [s]+getSubStmts (CFor _ _ _ s _)      = [s]+getSubStmts (CGoto _ _)           = []+getSubStmts (CGotoPtr _ _)        = []+getSubStmts (CCont _)             = []+getSubStmts (CBreak _)            = []+getSubStmts (CReturn _ _)         = []+getSubStmts (CAsm _ _)            = []++mapSubStmts :: (CStat -> Bool) -> (CStat -> CStat) -> CStat -> CStat+mapSubStmts stop _ s | stop s = s+mapSubStmts stop f (CLabel i s attrs ni) =+  f (CLabel i (mapSubStmts stop f s) attrs ni)+mapSubStmts stop f (CCase e s ni) =+  f (CCase e (mapSubStmts stop f s) ni)+mapSubStmts stop f (CCases e1 e2 s ni) =+  f (CCases e1 e2 (mapSubStmts stop f s) ni)+mapSubStmts stop f (CDefault s ni) =+  f (CDefault (mapSubStmts stop f s) ni)+mapSubStmts stop f (CCompound ls body ni) =+  f (CCompound ls (map (mapBlockItemStmts stop f) body) ni)+mapSubStmts stop f (CIf e sthen selse ni) =+  f (CIf e+     (mapSubStmts stop f sthen)+     (maybe Nothing (Just . mapSubStmts stop f) selse)+     ni)+mapSubStmts stop f (CSwitch e s ni) =+  f (CSwitch e (mapSubStmts stop f s) ni)+mapSubStmts stop f (CWhile e s isdo ni) =+  f (CWhile e (mapSubStmts stop f s) isdo ni)+mapSubStmts stop f (CFor i t a s ni) =+  f (CFor i t a (mapSubStmts stop f s) ni)+mapSubStmts _ f s  = f s++mapBlockItemStmts :: (CStat -> Bool)+                  -> (CStat -> CStat)+                  -> CBlockItem+                  -> CBlockItem+mapBlockItemStmts stop f (CBlockStmt s) = CBlockStmt (mapSubStmts stop f s)+mapBlockItemStmts _ _ bi                = bi++compoundSubStmts :: CBlockItem -> [CStat]+compoundSubStmts (CBlockStmt s)    = [s]+compoundSubStmts (CBlockDecl _)    = []+compoundSubStmts (CNestedFunDef _) = []++getLabels :: CStat -> [Ident]+getLabels (CLabel l s _ _)      = l : getLabels s+getLabels (CCompound ls body _) =+  concatMap (concatMap getLabels . compoundSubStmts) body \\ ls+getLabels stmt                  = concatMap getLabels (getSubStmts stmt)