language-c 0.7.2 → 0.8
raw patch · 49 files changed
+21113/−12408 lines, 49 filesdep +deepseqdep +ghc-primdep ~basesetup-changedPVP ok
version bump matches the API change (PVP)
Dependencies added: deepseq, ghc-prim
Dependency ranges changed: base
API changes (from Hackage documentation)
- Language.C.Analysis.DeclAnalysis: BaseFloat128 :: NumBaseType
- Language.C.Analysis.SemRep: TyFloat128 :: FloatType
- Language.C.Syntax.AST: CFloat128Type :: a -> CTypeSpecifier a
+ Language.C.Analysis.DeclAnalysis: BaseFloatN :: Int -> Bool -> NumBaseType
+ Language.C.Analysis.Export: export :: GlobalDecls -> CTranslUnit
+ Language.C.Analysis.SemRep: TyFloatN :: Int -> Bool -> FloatType
+ Language.C.Data.Ident: instance Control.DeepSeq.NFData Language.C.Data.Ident.Ident
+ Language.C.Data.Ident: instance Control.DeepSeq.NFData Language.C.Data.Ident.SUERef
+ Language.C.Data.Ident: instance GHC.Generics.Generic Language.C.Data.Ident.Ident
+ Language.C.Data.Ident: instance GHC.Generics.Generic Language.C.Data.Ident.SUERef
+ Language.C.Data.Name: instance Control.DeepSeq.NFData Language.C.Data.Name.Name
+ Language.C.Data.Name: instance GHC.Generics.Generic Language.C.Data.Name.Name
+ Language.C.Data.Node: instance Control.DeepSeq.NFData Language.C.Data.Node.NodeInfo
+ Language.C.Data.Node: instance GHC.Generics.Generic Language.C.Data.Node.NodeInfo
+ Language.C.Data.Position: instance Control.DeepSeq.NFData Language.C.Data.Position.FilePosition
+ Language.C.Data.Position: instance Control.DeepSeq.NFData Language.C.Data.Position.Position
+ Language.C.Data.Position: instance GHC.Generics.Generic Language.C.Data.Position.FilePosition
+ Language.C.Data.Position: instance GHC.Generics.Generic Language.C.Data.Position.Position
+ Language.C.Syntax.AST: CFloatNType :: Int -> Bool -> a -> CTypeSpecifier a
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData Language.C.Syntax.AST.CStructTag
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CAlignmentSpecifier a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CArraySize a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CAssemblyOperand a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CAssemblyStatement a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CAttribute a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CBuiltinThing a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CCompoundBlockItem a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CConstant a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CDeclaration a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CDeclarationSpecifier a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CDeclarator a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CDerivedDeclarator a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CEnumeration a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CExpression a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CExternalDeclaration a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CFunctionDef a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CFunctionSpecifier a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CInitializer a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CPartDesignator a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CStatement a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CStorageSpecifier a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CStringLiteral a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CStructureUnion a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CTranslationUnit a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CTypeQualifier a)
+ Language.C.Syntax.AST: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Language.C.Syntax.AST.CTypeSpecifier a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CAlignmentSpecifier a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CArraySize a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CAssemblyOperand a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CAssemblyStatement a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CAttribute a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CBuiltinThing a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CCompoundBlockItem a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CConstant a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CDeclaration a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CDeclarationSpecifier a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CDeclarator a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CDerivedDeclarator a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CEnumeration a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CExpression a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CExternalDeclaration a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CFunctionDef a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CFunctionSpecifier a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CInitializer a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CPartDesignator a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CStatement a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CStorageSpecifier a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CStringLiteral a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CStructureUnion a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CTranslationUnit a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CTypeQualifier a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic (Language.C.Syntax.AST.CTypeSpecifier a)
+ Language.C.Syntax.AST: instance GHC.Generics.Generic Language.C.Syntax.AST.CStructTag
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CAlignmentSpecifier
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CArraySize
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CAssemblyOperand
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CAssemblyStatement
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CAttribute
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CCompoundBlockItem
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CConstant
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CDeclarationSpecifier
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CDeclarator
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CEnumeration
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CExternalDeclaration
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CFunctionDef
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CFunctionSpecifier
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CStorageSpecifier
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CStringLiteral
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CStructureUnion
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CTranslationUnit
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CTypeQualifier
+ Language.C.Syntax.AST: instance GHC.Generics.Generic1 Language.C.Syntax.AST.CTypeSpecifier
+ Language.C.Syntax.Constants: instance Control.DeepSeq.NFData (Language.C.Syntax.Constants.Flags f)
+ Language.C.Syntax.Constants: instance Control.DeepSeq.NFData Language.C.Syntax.Constants.CChar
+ Language.C.Syntax.Constants: instance Control.DeepSeq.NFData Language.C.Syntax.Constants.CFloat
+ Language.C.Syntax.Constants: instance Control.DeepSeq.NFData Language.C.Syntax.Constants.CIntFlag
+ Language.C.Syntax.Constants: instance Control.DeepSeq.NFData Language.C.Syntax.Constants.CIntRepr
+ Language.C.Syntax.Constants: instance Control.DeepSeq.NFData Language.C.Syntax.Constants.CInteger
+ Language.C.Syntax.Constants: instance Control.DeepSeq.NFData Language.C.Syntax.Constants.CString
+ Language.C.Syntax.Constants: instance GHC.Generics.Generic (Language.C.Syntax.Constants.Flags f)
+ Language.C.Syntax.Constants: instance GHC.Generics.Generic Language.C.Syntax.Constants.CChar
+ Language.C.Syntax.Constants: instance GHC.Generics.Generic Language.C.Syntax.Constants.CFloat
+ Language.C.Syntax.Constants: instance GHC.Generics.Generic Language.C.Syntax.Constants.CIntFlag
+ Language.C.Syntax.Constants: instance GHC.Generics.Generic Language.C.Syntax.Constants.CIntRepr
+ Language.C.Syntax.Constants: instance GHC.Generics.Generic Language.C.Syntax.Constants.CInteger
+ Language.C.Syntax.Constants: instance GHC.Generics.Generic Language.C.Syntax.Constants.CString
+ Language.C.Syntax.Constants: instance GHC.Generics.Generic1 Language.C.Syntax.Constants.Flags
+ Language.C.Syntax.Ops: instance Control.DeepSeq.NFData Language.C.Syntax.Ops.CAssignOp
+ Language.C.Syntax.Ops: instance Control.DeepSeq.NFData Language.C.Syntax.Ops.CBinaryOp
+ Language.C.Syntax.Ops: instance Control.DeepSeq.NFData Language.C.Syntax.Ops.CUnaryOp
+ Language.C.Syntax.Ops: instance GHC.Generics.Generic Language.C.Syntax.Ops.CAssignOp
+ Language.C.Syntax.Ops: instance GHC.Generics.Generic Language.C.Syntax.Ops.CBinaryOp
+ Language.C.Syntax.Ops: instance GHC.Generics.Generic Language.C.Syntax.Ops.CUnaryOp
Files
- AUTHORS +19/−19
- AUTHORS.c2hs +25/−25
- ChangeLog +142/−117
- LICENSE +29/−29
- README +63/−56
- Setup.hs +5/−5
- dist/build/Language/C/Parser/Lexer.hs +1179/−0
- dist/build/Language/C/Parser/Parser.hs +7320/−0
- language-c.cabal +132/−120
- src/Language/C.hs +53/−53
- src/Language/C/Analysis.hs +69/−69
- src/Language/C/Analysis/AstAnalysis.hs +777/−777
- src/Language/C/Analysis/AstAnalysis.hs-boot +13/−13
- src/Language/C/Analysis/Builtins.hs +226/−226
- src/Language/C/Analysis/ConstEval.hs +209/−209
- src/Language/C/Analysis/Debug.hs +192/−192
- src/Language/C/Analysis/DeclAnalysis.hs +590/−589
- src/Language/C/Analysis/DefTable.hs +331/−331
- src/Language/C/Analysis/Export.hs +285/−233
- src/Language/C/Analysis/NameSpaceMap.hs +159/−159
- src/Language/C/Analysis/SemError.hs +109/−109
- src/Language/C/Analysis/SemRep.hs +682/−682
- src/Language/C/Analysis/TravMonad.hs +513/−513
- src/Language/C/Analysis/TypeCheck.hs +446/−446
- src/Language/C/Analysis/TypeConversions.hs +39/−39
- src/Language/C/Analysis/TypeUtils.hs +343/−343
- src/Language/C/Data.hs +40/−40
- src/Language/C/Data/Error.hs +171/−171
- src/Language/C/Data/Ident.hs +140/−134
- src/Language/C/Data/InputStream.hs +99/−99
- src/Language/C/Data/Name.hs +36/−31
- src/Language/C/Data/Node.hs +128/−124
- src/Language/C/Data/Position.hs +135/−129
- src/Language/C/Data/RList.hs +52/−52
- src/Language/C/Parser.hs +36/−36
- src/Language/C/Parser/Builtin.hs +23/−21
- src/Language/C/Parser/Lexer.x +577/−566
- src/Language/C/Parser/Parser.y +2356/−2345
- src/Language/C/Parser/ParserMonad.hs +181/−181
- src/Language/C/Parser/Tokens.hs +383/−382
- src/Language/C/Pretty.hs +547/−546
- src/Language/C/Syntax.hs +20/−20
- src/Language/C/Syntax/AST.hs +1434/−1393
- src/Language/C/Syntax/Constants.hs +309/−296
- src/Language/C/Syntax/Ops.hs +113/−105
- src/Language/C/Syntax/Utils.hs +76/−76
- src/Language/C/System/GCC.hs +114/−114
- src/Language/C/System/Preprocess.hs +123/−123
- test/harness/run-harness.hs +70/−70
AUTHORS view
@@ -1,19 +1,19 @@-Benedikt Huber <benedikt.huber@gmail.com> -Manuel M T Chakravarty <chak@cse.unsw.edu.au> -Duncan Coutts <duncan@haskell.org> -Bertram Felgenhauer <int-e@gmx.de> - -with code contributions and patches from - -Iavor Diatchki <iavor.diatchki@gmail.com> -Kevin Charter <kcharter@gmail.com> -Aleksey Kliger - -This project originated from the C parser component of c2hs, -for many additional contributors see AUTHORS.c2hs. - -Special thanks for their great support, comments and suggestions to: - -Duncan Coutts <duncan@haskell.org> -Iavor Diatchki <iavor.diatchki@gmail.com> -Don Steward <dons@galois.com> +Benedikt Huber <benedikt.huber@gmail.com>+Manuel M T Chakravarty <chak@cse.unsw.edu.au>+Duncan Coutts <duncan@haskell.org>+Bertram Felgenhauer <int-e@gmx.de>++with code contributions and patches from++Iavor Diatchki <iavor.diatchki@gmail.com>+Kevin Charter <kcharter@gmail.com>+Aleksey Kliger++This project originated from the C parser component of c2hs,+for many additional contributors see AUTHORS.c2hs.++Special thanks for their great support, comments and suggestions to:++Duncan Coutts <duncan@haskell.org>+Iavor Diatchki <iavor.diatchki@gmail.com>+Don Steward <dons@galois.com>
AUTHORS.c2hs view
@@ -1,25 +1,25 @@-Manuel M T Chakravarty <chak@cse.unsw.edu.au> -Duncan Coutts <duncan@haskell.org> - -with contributions from (alphabetical order) - -Bertram Felgenhauer <int-e@gmx.de> -Ian Lynagh <igloo@earth.li> -André Pang <ozone@algorithm.com.au> -Jens-Ulrik Petersen <petersen@haskell.org> -Armin Sander <armin@mindwalker.org> -Sean Seefried <sseefried@cse.unsw.edu.au> -Udo Stenzel <u.stenzel@web.de> -Axel Simon <A.Simon@ukc.ac.uk> -Michael Weber <michaelw@debian.org> - -Thanks for comments and suggestions to - -Roman Leshchinskiy <rl@cs.tu-berlin.de> -Jan Kort <kort@science.uva.nl> -Seth Kurtzberg <seth@cql.com> -Simon Marlow <simonmar@microsoft.com> -Matthias Neubauer <neubauer@informatik.uni-freiburg.de> -Sven Panne <sven.panne@aedion.de> -Simon L. Peyton Jones <simonpj@microsoft.com> -Volker Wysk <post@volker-wysk.de> +Manuel M T Chakravarty <chak@cse.unsw.edu.au>+Duncan Coutts <duncan@haskell.org>++with contributions from (alphabetical order)++Bertram Felgenhauer <int-e@gmx.de>+Ian Lynagh <igloo@earth.li>+André Pang <ozone@algorithm.com.au>+Jens-Ulrik Petersen <petersen@haskell.org>+Armin Sander <armin@mindwalker.org>+Sean Seefried <sseefried@cse.unsw.edu.au>+Udo Stenzel <u.stenzel@web.de>+Axel Simon <A.Simon@ukc.ac.uk>+Michael Weber <michaelw@debian.org>++Thanks for comments and suggestions to ++Roman Leshchinskiy <rl@cs.tu-berlin.de>+Jan Kort <kort@science.uva.nl>+Seth Kurtzberg <seth@cql.com>+Simon Marlow <simonmar@microsoft.com>+Matthias Neubauer <neubauer@informatik.uni-freiburg.de>+Sven Panne <sven.panne@aedion.de>+Simon L. Peyton Jones <simonpj@microsoft.com>+Volker Wysk <post@volker-wysk.de>
ChangeLog view
@@ -1,117 +1,142 @@-Changes since 0.7.0 -========================================================================== - -Sat Nov 25 00:46:33 2017 -0600 - add support for _Float128 (#41) - -Changes since 0.6.0 -========================================================================== -Mon Jul 31 2017 - Improve TypeCheck output (#31) - -Sun Jul 30 2017 - * Add `__float128` (fixes #33) - -Mon Maz 22 2017 - * Support clang’s __builtin_convertvector (Fixes #34) - -Wed Mar 8 2017 - * Move file and parent information to new datatype FilePosition for performance reasons - -Changes since 0.5.0 -========================================================================== -Thu Feb 23 2017 - * Make gccParseCPPArgs grab the arg to -MF -MT and -MQ -Wed Feb 15 2017 - * In enums, allow multiple attribute specifiers per enumerator -Tue Feb 21 2017 - * Allow typedef redefinition if it denotes the same type -Tue Feb 21 2017 - * Change TypeDefRef to store Type, not Maybe Type -Tue Feb 14 2017 - * Parse (and ignore) Clang __attribute__((availability(id=major.minor.rev))) -Sun Sep 11 2016 - * Add __builtin_bswap32/64. -Wed Jun 22 2016 - * Add '_Alignof' to Lexer.x (fixes #7) -Mon Jun 27 2016 - * Updates for C11 (part 1) - * _Nullable and _Nonnull support as well as Warnings/lint fixes provided by Anthony Cowley (https://github.com/acowley) -Wed Mar 16 2016 - * Consider storage specifier "ThreadSpec" for global and local declarations -Tue Mar 15 2016 - * Support C11 _NoReturn, genearlize is_inline to FunSpecs (Syntax) / FunAttrs (SemRep) - -Changes since 0.4.3 -========================================================================== -Wed Mar 2 2016 - * Add direct base type BaseInt128 (complements previous __int128 patch) - ryan.gl.scott@gmail.com -Sun Feb 28 2016 - * Parse gcc-specific __int128 type -Thu Dec 4 2014 - * Scott Kovach <dskovach@gmail.com>: added derived Eq,Ord instances to NodeInfo - -Changes since 0.4.2 -========================================================================== -Sat Jan 11 2014 - * Allow unicode characters in string/char literals and filenames -Mon Oct 27 2014 - * macos-attributes -Tue Aug 13 2013 - * Do not derive Error instances for newtypes (type parameter has non-parametric role) -Mon Aug 12 2013 - * Fix bug caused by applying posFile to nopos (reported by Mikhail Sosonkin) - -Changes since 0.4.1 -========================================================================== -Tue Mar 19 2013 - * TypeCheck: Return Left str instead of fail str (do not rely on MonadError instance of Either) - * Improve printing of SUERefs and Ident -Thu Feb 28 2013 - * Fix parsing and printing of octal character escapes. -Tue Jun 12 2012 - * Export Annotated type class from AST module -Wed Aug 24 2012 - * Patch for alex-3.0 - -Changes 0.3.1 - 0.4.1 -========================================================================== -Tue Aug 16 2011: - * Port to ghc-7.2 -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 -========================================================================== -Thu Aug 21 benedikt.huber@gmail.com - * add aliases for exposed parsers, in order to document them - -Fri Aug 15 benedikt.huber@gmail.com - * Remove NameMap from Data.Name. We will do this right when neccessary. - * Parser public API: expose parsers and the Parser Monad - * ParserMonad: Return updated name supply when executing parser - * Parser: Expose expression, statement, declaration and file parsers - * Data: Add newNameSupply ~ (namesStartingFrom 0) - -Thu Aug 14 17:13:29 CEST 2008 iavor.diatchki@gmail.com - * Add a utility function to create a "blank" set of cpp arguments. - * Make that analysis traversal monad abstract. - * Export the type synonym "Register" (and bump version) - -Wed Aug 13 12:00:57 CEST 2008 benedikt.huber@gmail.com - * add Data.Position: internalIdentAt - - -Old Changes -========================================================================== - -Mon Jun 9 23:12:46 CEST 2008 benedikt.huber@gmail.com - * License switched to 3-clause BSD - $ -- In accordance with the original authors, Language.C is now licensed as BSD-3. - See: - http://haskell.org/pipermail/c2hs/2008-June/000833.html - http://haskell.org/pipermail/c2hs/2008-June/000834.html - http://haskell.org/pipermail/c2hs/2008-June/000835.html - +Changes since 0.8.0+==========================================================================++Changes since 0.7.0+==========================================================================++Wed May 23 07:08:02 2018 +0200+ Support IEC 60559 types and literals. Closes #52.++Wed May 16 07:08:15 2018 +0200+ introduce flag for optional IEC 60559 type support (see #43)++Wed May 16 06:36:04 2018 +0200+ WIP: towards a complete Export (#51)++Thu Feb 22 13:22:50 2018 -0500+ [syntax] GHC.Generics.Generic and Control.DeepSeq.NFData instances (#49)+ (.cabal) drop splitBase flag++Tue Feb 20 08:34:39 2018 +0300+ Selectively hide Prelude.<>: GHC 8.4 compat (#45)++Tue Feb 20 00:09:16 2018 -0500+ (Analysis) Minimal support for __float128 (#47)++Sat Nov 25 08:59:59 2017 +0100+ Consider builtin_convertvector from #34 for pretty printing++Sat Nov 25 00:46:33 2017 -0600+ add support for _Float128 (#41)++Changes since 0.6.0+==========================================================================+Mon Jul 31 2017+ Improve TypeCheck output (#31)++Sun Jul 30 2017+ * Add `__float128` (fixes #33)++Mon Maz 22 2017+ * Support clang’s __builtin_convertvector (Fixes #34)++Wed Mar 8 2017+ * Move file and parent information to new datatype FilePosition for performance reasons++Changes since 0.5.0+==========================================================================+Thu Feb 23 2017+ * Make gccParseCPPArgs grab the arg to -MF -MT and -MQ+Wed Feb 15 2017+ * In enums, allow multiple attribute specifiers per enumerator+Tue Feb 21 2017+ * Allow typedef redefinition if it denotes the same type+Tue Feb 21 2017+ * Change TypeDefRef to store Type, not Maybe Type+Tue Feb 14 2017+ * Parse (and ignore) Clang __attribute__((availability(id=major.minor.rev)))+Sun Sep 11 2016+ * Add __builtin_bswap32/64.+Wed Jun 22 2016+ * Add '_Alignof' to Lexer.x (fixes #7)+Mon Jun 27 2016+ * Updates for C11 (part 1)+ * _Nullable and _Nonnull support as well as Warnings/lint fixes provided by Anthony Cowley (https://github.com/acowley)+Wed Mar 16 2016+ * Consider storage specifier "ThreadSpec" for global and local declarations+Tue Mar 15 2016+ * Support C11 _NoReturn, genearlize is_inline to FunSpecs (Syntax) / FunAttrs (SemRep)++Changes since 0.4.3+==========================================================================+Wed Mar 2 2016+ * Add direct base type BaseInt128 (complements previous __int128 patch)+ ryan.gl.scott@gmail.com+Sun Feb 28 2016+ * Parse gcc-specific __int128 type+Thu Dec 4 2014+ * Scott Kovach <dskovach@gmail.com>: added derived Eq,Ord instances to NodeInfo++Changes since 0.4.2+==========================================================================+Sat Jan 11 2014+ * Allow unicode characters in string/char literals and filenames+Mon Oct 27 2014+ * macos-attributes+Tue Aug 13 2013+ * Do not derive Error instances for newtypes (type parameter has non-parametric role)+Mon Aug 12 2013+ * Fix bug caused by applying posFile to nopos (reported by Mikhail Sosonkin)++Changes since 0.4.1+==========================================================================+Tue Mar 19 2013+ * TypeCheck: Return Left str instead of fail str (do not rely on MonadError instance of Either)+ * Improve printing of SUERefs and Ident+Thu Feb 28 2013+ * Fix parsing and printing of octal character escapes.+Tue Jun 12 2012+ * Export Annotated type class from AST module+Wed Aug 24 2012+ * Patch for alex-3.0++Changes 0.3.1 - 0.4.1+==========================================================================+Tue Aug 16 2011:+ * Port to ghc-7.2+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+==========================================================================+Thu Aug 21 benedikt.huber@gmail.com+ * add aliases for exposed parsers, in order to document them++Fri Aug 15 benedikt.huber@gmail.com+ * Remove NameMap from Data.Name. We will do this right when neccessary.+ * Parser public API: expose parsers and the Parser Monad+ * ParserMonad: Return updated name supply when executing parser+ * Parser: Expose expression, statement, declaration and file parsers+ * Data: Add newNameSupply ~ (namesStartingFrom 0)++Thu Aug 14 17:13:29 CEST 2008 iavor.diatchki@gmail.com+ * Add a utility function to create a "blank" set of cpp arguments.+ * Make that analysis traversal monad abstract.+ * Export the type synonym "Register" (and bump version)++Wed Aug 13 12:00:57 CEST 2008 benedikt.huber@gmail.com+ * add Data.Position: internalIdentAt+++Old Changes+==========================================================================++Mon Jun 9 23:12:46 CEST 2008 benedikt.huber@gmail.com+ * License switched to 3-clause BSD+ $+- In accordance with the original authors, Language.C is now licensed as BSD-3.+ See:+ http://haskell.org/pipermail/c2hs/2008-June/000833.html+ http://haskell.org/pipermail/c2hs/2008-June/000834.html+ http://haskell.org/pipermail/c2hs/2008-June/000835.html+
LICENSE view
@@ -1,29 +1,29 @@-Copyright (c) 1999-2008 Manuel M T Chakravarty - Duncan Coutts - Benedikt Huber -Portions Copyright (c) 1989, 1990 James A. Roskind -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. Neither the name of the author nor the names of his contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. +Copyright (c) 1999-2008 Manuel M T Chakravarty + Duncan Coutts+ Benedikt Huber+Portions Copyright (c) 1989, 1990 James A. Roskind+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:+1. Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.+2. Redistributions in binary form must reproduce the above copyright+ notice, this list of conditions and the following disclaimer in the+ documentation and/or other materials provided with the distribution.+3. Neither the name of the author nor the names of his contributors+ may be used to endorse or promote products derived from this software+ without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF+SUCH DAMAGE.
README view
@@ -1,56 +1,63 @@-= Language.C = - -Language.C is a parser and pretty-printer framework for C11 and the extensions of gcc. - -See http://visq.github.io/language-c/ - -== Build and Install == - -cabal install - --- or -- - -runhaskell Setup.hs configure FLAGS -runhaskell Setup.hs build -runhaskell Setup.hs install - -Provide the set of flags passing - --flags="<flags-seperated-by-space>" -to configure. - -== Compatibility == - -Tested with GHC 7.8, 7.10, 8.0 and 8.2. -It is recommended to use the most recent platform release: http://hackage.haskell.org/platform/. - -== C Language Compatibility == - -Currently unsupported C11 constructs: - - static assertion 6.7.10 (_Static_assert) - - generic selection 6.5.1.1 (_Generic) - - _Atomic, _Alignas, _Thread_local - - Universal character names - -Currently unsupported GNU C extensions: - - __auto_type - - __builtin_offsetof - char a[__builtin_offsetof (struct S, sa->f) - - _Decimal32 - - Extended assembler - __asm__ __volatile__ ("" : : : ); - __asm__ goto ("" : : : : label); - -== Sources == - -see src/README - -== Examples == - -A couple of small examples are available in /examples - -== Testing == - -A couple of regression tests can be run via -> cd test/harness; make - -For more tests, see test/README. += Language.C =++Language.C is a parser and pretty-printer framework for C11 and the extensions of gcc.++See http://visq.github.io/language-c/++== Build and Install ==++cabal install++-- or --++runhaskell Setup.hs configure FLAGS+runhaskell Setup.hs build+runhaskell Setup.hs install++Provide the set of flags passing+ --flags="<flags-seperated-by-space>"+to configure.++== Compatibility ==++Tested with GHC 7.8, 7.10, 8.0 and 8.2.+It is recommended to use the most recent platform release: http://hackage.haskell.org/platform/.++== C Language Compatibility ==++Currently unsupported C11 constructs:+ - static assertion 6.7.10 (_Static_assert)+ - generic selection 6.5.1.1 (_Generic)+ - _Atomic, _Alignas, _Thread_local+ - Universal character names++Currently unsupported GNU C extensions:+ - __auto_type+ - __builtin_offsetof+ char a[__builtin_offsetof (struct S, sa->f)+ - _Decimal32+ - Extended assembler+ __asm__ __volatile__ ("" : : : );+ __asm__ goto ("" : : : : label);++IEC 60559:+ Since language-c-0.8, extended floating point types are supported (gcc 7 feature). Package maintainers may decide to disable these types (flag iecFpExtension) to work around the fact that the _Float128 type is redefined by glibc >= 2.26 if gcc < 7 is used for preprocessing:+ /* The type _Float128 exists only since GCC 7.0. */+ # if !__GNUC_PREREQ (7, 0) || defined __cplusplus+ typedef __float128 _Float128;+ # endif++== Sources ==++see src/README++== Examples ==++A couple of small examples are available in /examples++== Testing ==++A couple of regression tests can be run via+> cd test/harness; make++For more tests, see test/README.
Setup.hs view
@@ -1,5 +1,5 @@-#!/usr/bin/env runhaskell - -import Distribution.Simple - -main = defaultMain +#!/usr/bin/env runhaskell++import Distribution.Simple++main = defaultMain
+ dist/build/Language/C/Parser/Lexer.hs view
@@ -0,0 +1,1179 @@+{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-missing-signatures #-}+{-# LANGUAGE CPP,MagicHash #-}+{-# LINE 49 "src/Language/C/Parser/Lexer.x" #-}+++module Language.C.Parser.Lexer (lexC, parseError) where++import Data.Char (chr, isDigit)+import Data.Word (Word8)+import Control.Monad (liftM, when)++import Language.C.Data.InputStream+ (InputStream, inputStreamEmpty, takeByte, takeChar, takeChars)++-- ( InputStream, readInputStream,inputStreamToString,inputStreamFromString,+-- takeByte, takeChar, inputStreamEmpty, takeChars,+-- countLines,+-- )+import Language.C.Data.Position+import Language.C.Data.Ident (mkIdent)++import Language.C.Syntax.Constants++import Language.C.Parser.Tokens+import Language.C.Parser.ParserMonad++#if __GLASGOW_HASKELL__ >= 603+#include "ghcconfig.h"+#elif defined(__GLASGOW_HASKELL__)+#include "config.h"+#endif+#if __GLASGOW_HASKELL__ >= 503+import Data.Array+import Data.Array.Base (unsafeAt)+#else+import Array+#endif+#if __GLASGOW_HASKELL__ >= 503+import GHC.Exts+#else+import GlaExts+#endif+alex_tab_size :: Int+alex_tab_size = 8+alex_base :: AlexAddr+alex_base = AlexA#+ "\xf8\xff\xff\xff\x6d\x00\x00\x00\x63\x01\x00\x00\x59\x02\x00\x00\x4f\x03\x00\x00\x45\x04\x00\x00\x3b\x05\x00\x00\x31\x06\x00\x00\x27\x07\x00\x00\x1d\x08\x00\x00\x13\x09\x00\x00\xdf\xff\xff\xff\xe0\xff\xff\xff\x6f\x00\x00\x00\xa7\xff\xff\xff\x93\x09\x00\x00\x9c\xff\xff\xff\x13\x0a\x00\x00\x93\x0a\x00\x00\x13\x0b\x00\x00\x93\x0b\x00\x00\x13\x0c\x00\x00\x93\x0c\x00\x00\x13\x0d\x00\x00\x93\x0d\x00\x00\x13\x0e\x00\x00\x93\x0e\x00\x00\x13\x0f\x00\x00\x93\x0f\x00\x00\x13\x10\x00\x00\xa3\xff\xff\xff\x93\x10\x00\x00\xa6\xff\xff\xff\x13\x11\x00\x00\x93\x11\x00\x00\x13\x12\x00\x00\x93\x12\x00\x00\x13\x13\x00\x00\x93\x13\x00\x00\x13\x14\x00\x00\x93\x14\x00\x00\x13\x15\x00\x00\x93\x15\x00\x00\x13\x16\x00\x00\xab\xff\xff\xff\x4c\x01\x00\x00\x54\x16\x00\x00\x00\x00\x00\x00\xc5\x16\x00\x00\x00\x00\x00\x00\x45\x17\x00\x00\xc5\x17\x00\x00\x54\x00\x00\x00\x37\x02\x00\x00\xc5\x18\x00\x00\x6e\x02\x00\x00\x85\x18\x00\x00\x00\x00\x00\x00\x36\x03\x00\x00\x23\x04\x00\x00\x7b\x19\x00\x00\x49\x04\x00\x00\x19\x05\x00\x00\x50\x05\x00\x00\x0f\x06\x00\x00\x9b\xff\xff\xff\x46\x06\x00\x00\x0e\x07\x00\x00\xaa\xff\xff\xff\x00\x00\x00\x00\xec\x19\x00\x00\xfb\x07\x00\x00\x00\x00\x00\x00\x5d\x1a\x00\x00\x00\x00\x00\x00\xce\x1a\x00\x00\x21\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x1b\x00\x00\xb0\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x1c\x00\x00\x92\x1c\x00\x00\x00\x00\x00\x00\x03\x1d\x00\x00\x00\x00\x00\x00\x74\x1d\x00\x00\x00\x00\x00\x00\xe5\x1d\x00\x00\x00\x00\x00\x00\x56\x1e\x00\x00\x00\x00\x00\x00\xc7\x1e\x00\x00\x00\x00\x00\x00\x38\x1f\x00\x00\x00\x00\x00\x00\x79\x1f\x00\x00\xf1\x08\x00\x00\x00\x00\x00\x00\xba\x1f\x00\x00\x00\x00\x00\x00\xfb\x1f\x00\x00\x17\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x20\x00\x00\x7d\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x20\x00\x00\xff\x20\x00\x00\x00\x00\x00\x00\x40\x21\x00\x00\x00\x00\x00\x00\x81\x21\x00\x00\x00\x00\x00\x00\xc2\x21\x00\x00\x00\x00\x00\x00\x03\x22\x00\x00\xa1\xff\xff\xff\x00\x00\x00\x00\x44\x22\x00\x00\x00\x00\x00\x00\x85\x22\x00\x00\x85\x23\x00\x00\x59\x19\x00\x00\x81\x19\x00\x00\x45\x23\x00\x00\x00\x00\x00\x00\x45\x24\x00\x00\x95\x24\x00\x00\xad\x24\x00\x00\x66\x24\x00\x00\x00\x00\x00\x00\x66\x25\x00\x00\x26\x25\x00\x00\x00\x00\x00\x00\xf6\x25\x00\x00\x5d\x26\x00\x00\xdd\x26\x00\x00\x2d\x27\x00\x00\x44\x27\x00\x00\x7b\x27\x00\x00\x96\x27\x00\x00\x4f\x27\x00\x00\x8f\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x28\x00\x00\x0f\x29\x00\x00\x5f\x29\x00\x00\x76\x29\x00\x00\xad\x29\x00\x00\xc8\x29\x00\x00\x81\x29\x00\x00\xc1\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xff\xff\xff\xe1\xff\xff\xff\xe2\xff\xff\xff\xe3\xff\xff\xff\xc1\x2a\x00\x00\x11\x2b\x00\x00\x29\x2b\x00\x00\xe2\x2a\x00\x00\x00\x00\x00\x00\xe2\x2b\x00\x00\x32\x2c\x00\x00\x4a\x2c\x00\x00\x03\x2c\x00\x00\x00\x00\x00\x00\x03\x2d\x00\x00\x53\x2d\x00\x00\x98\x2d\x00\x00\x8e\x2e\x00\x00\xce\x2e\x00\x00\x00\x00\x00\x00\xce\x2f\x00\x00\x6c\x2e\x00\x00\x44\x30\x00\x00\x3a\x31\x00\x00\x7a\x31\x00\x00\x00\x00\x00\x00\x7a\x32\x00\x00\x9d\xff\xff\xff\x3a\x32\x00\x00\x00\x00\x00\x00\x3a\x33\x00\x00\xfa\x32\x00\x00\x00\x00\x00\x00\xf0\x33\x00\x00\xe4\xff\xff\xff\xe6\x34\x00\x00\xdc\x35\x00\x00\xd2\x36\x00\x00\xc8\x37\x00\x00\xbe\x38\x00\x00\x92\x2e\x00\x00\x1c\x00\x00\x00\x20\x00\x00\x00\x04\x00\x00\x00\x45\x00\x00\x00\xe5\xff\xff\xff\x49\x00\x00\x00\x9a\x00\x00\x00\x79\x00\x00\x00\x44\x00\x00\x00\x46\x00\x00\x00\x4b\x00\x00\x00\x4c\x00\x00\x00\x4f\x00\x00\x00\x50\x00\x00\x00\xb0\x00\x00\x00\x8b\x00\x00\x00\x76\x2d\x00\x00\x95\x01\x00\x00\x2b\x30\x00\x00\x18\x31\x00\x00\xb4\x39\x00\x00\xaa\x3a\x00\x00\x88\x02\x00\x00\x87\x04\x00\x00\x6a\x05\x00\x00\x60\x06\x00\x00\x0c\x00\x00\x00\x6c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x33\x00\x00\xe2\x34\x00\x00\x26\x01\x00\x00\x67\x01\x00\x00\x28\x00\x00\x00\x30\x01\x00\x00\x61\x02\x00\x00\x51\x03\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x55\x03\x00\x00\x5a\x01\x00\x00\x68\x01\x00\x00\x59\x03\x00\x00\x43\x05\x00\x00\x42\x00\x00\x00\x47\x00\x00\x00\x3b\x31\x00\x00\xba\x35\x00\x00\x39\x06\x00\x00\x29\x07\x00\x00\x5f\x00\x00\x00\x32\x01\x00\x00\x2d\x07\x00\x00\x31\x07\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x1f\x08\x00\x00\x60\x01\x00\x00\x62\x02\x00\x00\x23\x08\x00\x00\x27\x08\x00\x00\x52\x00\x00\x00\x38\x01\x00\x00\xe5\x35\x00\x00\x15\x09\x00\x00\x19\x09\x00\x00\x34\x01\x00\x00\x66\x01\x00\x00\x1d\x09\x00\x00\x58\x19\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x7f\x19\x00\x00\x64\x01\x00\x00\x41\x03\x00\x00\x87\x24\x00\x00\x4a\x27\x00\x00\x53\x00\x00\x00\x57\x01\x00\x00\xb4\x36\x00\x00\xb0\x37\x00\x00\x54\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x04\x00\x00\x40\x02\x00\x00\x32\x00\x00\x00\x0b\x02\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x88\x27\x00\x00\x9c\x38\x00\x00\xa6\x38\x00\x00\x8f\x39\x00\x00\xb7\x39\x00\x00\x2c\x04\x00\x00\x81\x00\x00\x00\x1b\x02\x00\x00\x3e\x01\x00\x00\x00\x00\x00\x00\x4e\x00\x00\x00\x9f\x29\x00\x00\x85\x3a\x00\x00\x7a\x3b\x00\x00\x00\x00\x00\x00\xaa\x3b\x00\x00\x00\x00\x00\x00\xa0\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x08\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x01\x00\x00\x4a\x02\x00\x00\x9c\x00\x00\x00\x9f\x00\x00\x00\xa1\x00\x00\x00\x7a\x01\x00\x00\xaf\x00\x00\x00\x3d\x01\x00\x00\x6e\x01\x00\x00\x00\x00\x00\x00\x99\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x49\x01\x00\x00\x65\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++alex_table :: AlexAddr+alex_table = AlexA#+ "\x00\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\x3a\x01\x3b\x01\xde\x00\x0e\x00\x10\x00\x79\x00\x1e\x00\x2c\x00\x20\x00\xbb\x00\xca\x00\xdd\x00\x6a\x01\xc9\x00\xd2\x00\xd1\x00\xe5\x00\x2f\x01\xe4\x00\x43\x01\xc6\x00\x0d\x00\xe8\x00\x4b\x01\x4c\x01\xb7\x00\x3d\x01\x3e\x01\x49\x01\x47\x01\x66\x01\x48\x01\x42\x01\x4a\x01\xfa\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x5a\x01\x67\x01\x4f\x01\x5b\x01\x51\x01\x59\x01\x2f\x01\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe9\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\x3f\x01\x2f\x01\x40\x01\x55\x01\xe8\x00\x32\x01\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\x68\x01\x56\x01\x69\x01\x44\x01\xff\xff\x0d\x00\x32\x01\xff\xff\x32\x01\x24\x01\xf0\x00\x27\x01\x24\x01\x27\x01\x24\x01\x27\x01\xf0\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\xf0\x00\x0d\x00\x01\x01\x11\x01\x26\x01\xf7\x00\x1d\x01\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x26\x01\x26\x01\xf0\x00\x01\x01\x11\x01\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\xf1\x00\x01\x01\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\xd0\x00\x31\x01\xd0\x00\x00\x00\xab\x00\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x01\x01\xa2\x00\x54\x01\xd6\x00\x44\x00\x5e\x01\xd4\x00\xd8\x00\x5f\x01\xd8\x00\x60\x01\x41\x00\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x31\x01\x31\x01\x64\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa9\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xac\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\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\x3c\x00\xa0\x00\xff\xff\xce\x00\x1c\x01\x3c\x00\xcc\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\x65\x01\xee\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x08\x01\xf0\x00\x62\x01\x01\x01\x53\x01\x11\x01\x1d\x01\x3c\x00\xe4\x00\x45\x01\x00\x00\xf0\x00\xf0\x00\x3c\x00\x1c\x01\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\xee\x00\xec\x00\x00\x00\xfd\x00\x5c\x01\x57\x01\x34\x00\x63\x01\x18\x01\x02\x01\xf0\x00\xec\x00\x01\x01\x3c\x00\x11\x01\x4d\x01\x50\x01\xfd\x00\x3c\x00\x3c\x00\xf0\x00\x0d\x01\x3c\x00\x3c\x00\x1c\x01\xf3\x00\x01\x01\x00\x00\x61\x01\x00\x00\x11\x01\x3c\x00\x11\x01\xee\x00\xf8\x00\x3c\x00\xab\x00\x3c\x00\x42\x00\x3c\x00\x12\x01\x37\x00\x21\x01\x21\x01\x21\x01\x21\x01\x21\x01\x21\x01\x21\x01\x21\x01\x21\x01\x21\x01\xf0\x00\xf0\x00\xf0\x00\x0d\x01\xea\x00\xed\x00\x01\x01\x52\x01\x4e\x01\x00\x00\x11\x01\x00\x00\x11\x01\xee\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x58\x01\x00\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\xa9\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xac\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\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\x00\x00\x00\x00\xff\xff\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\xa3\x00\x00\x00\xd5\x00\x26\x01\x26\x01\xd3\x00\x46\x01\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x1d\x01\x00\x00\x00\x00\x23\x01\x31\x01\x31\x01\x00\x00\x5d\x01\x41\x01\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\xdf\x00\xe5\x00\x2e\x01\x00\x00\xe3\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\xdf\x00\x26\x01\x26\x01\x00\x00\x00\x00\x1c\x01\x04\x01\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\xab\x00\x1c\x01\x09\x01\x00\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\x00\x00\xf0\x00\xf0\x00\x00\x00\x1c\x01\xfe\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x00\x00\x1c\x01\x09\x01\x00\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\xa9\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xac\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\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\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x01\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x00\x00\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x01\x00\x00\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x19\x01\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x1c\x01\x00\x00\x00\x00\x1c\x01\xea\x00\x00\x00\x00\x00\x00\x00\xee\x00\x1c\x01\x00\x00\x00\x00\x1c\x01\xee\x00\xab\x00\x00\x00\x0e\x01\x1c\x01\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x19\x01\x00\x00\x00\x00\x00\x00\xf0\x00\xf0\x00\x00\x00\xee\x00\xf0\x00\xf0\x00\x1c\x01\x1c\x01\xf0\x00\xf0\x00\x00\x00\x1c\x01\x1c\x01\x00\x00\x00\x00\x1c\x01\xee\x00\x00\x00\x00\x00\x00\x00\x1c\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa9\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xac\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\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\x00\x00\x00\x00\xff\xff\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\xa1\x00\x00\x00\xcd\x00\x00\x00\x00\x00\xcb\x00\x00\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x00\x00\x00\x00\x1e\x01\x21\x01\x21\x01\x21\x01\x21\x01\x21\x01\x21\x01\x21\x01\x21\x01\x21\x01\x21\x01\x00\x00\x00\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x00\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\xe0\x00\xe5\x00\x00\x00\x00\x00\xe3\x00\x31\x01\x31\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\xc1\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x00\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\xe1\x00\xe1\x00\xe1\x00\x00\x00\x00\x00\x00\x00\x00\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\xa4\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa7\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\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\x00\x00\x00\x00\xff\xff\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x00\x00\x00\x00\x1e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\xdf\x00\xe5\x00\x00\x00\x00\x00\xe3\x00\x00\x00\x00\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\xa6\x00\x1c\x01\x00\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\x00\x00\xf0\x00\xf0\x00\x00\x00\xef\x00\x00\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x00\x00\x1c\x01\x00\x00\x00\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\xa4\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa7\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\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\x00\x00\x00\x00\xff\xff\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x00\x00\x00\x00\x1e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\xe0\x00\xe5\x00\x00\x00\x00\x00\xe3\x00\x00\x00\x00\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\xe0\x00\x00\x00\xc1\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\xa6\x00\xff\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x00\x00\x1c\x01\x00\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x00\x00\xff\x00\x00\x00\x00\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\xa4\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa7\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\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\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x01\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x1c\x01\xff\x00\x00\x00\x00\x00\x00\x00\x1c\x01\xa6\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x00\x00\xfb\x00\x01\x01\x01\x01\x00\x00\x1c\x01\x01\x01\x01\x01\x00\x00\xff\x00\xff\x00\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x1c\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa4\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa7\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\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\x00\x00\x00\x00\xff\xff\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x00\x00\xc2\x00\x1f\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x00\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\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x06\x01\xff\x00\x00\x00\x00\x00\x00\x00\x1c\x01\xab\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x01\x01\x01\x01\x00\x00\x1c\x01\x01\x01\x01\x01\x00\x00\x1c\x01\x01\x01\x01\x01\x00\x00\x00\x01\xff\x00\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x1c\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa9\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xac\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\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\x00\x00\x00\x00\xff\xff\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\x20\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x1c\x01\x0f\x01\x00\x00\x00\x00\x00\x00\x0f\x01\xa6\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x11\x01\x11\x01\x00\x00\x1c\x01\x11\x01\x11\x01\x00\x00\x0b\x01\x11\x01\x11\x01\x00\x00\x1c\x01\x0f\x01\x00\x00\x00\x00\x00\x00\x0f\x01\x00\x00\x00\x00\x00\x00\x1c\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa4\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa7\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xbe\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xba\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xb4\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xae\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xa9\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xa4\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x96\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x97\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x8c\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x8d\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x88\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x83\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x7e\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x0f\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x11\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x12\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x13\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x17\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x16\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x19\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x18\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x1a\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x1b\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x1c\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x38\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\x2e\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\x33\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x36\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xc1\x00\xc1\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\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x00\x00\x00\x00\xff\xff\xc1\x00\x1c\x01\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x00\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x11\x01\x11\x01\x00\x00\x0f\x01\x00\x00\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x01\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\xc1\x00\x00\x00\x00\x00\xc1\x00\xc1\x00\x11\x01\x11\x01\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x0f\x01\xc1\x00\x00\x00\xc1\x00\x00\x00\x7f\x00\x00\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\x36\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x38\x00\x33\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2e\x00\x32\x00\x31\x00\x31\x00\x31\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x62\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\x65\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\x67\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\x6c\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\x6b\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\x70\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\x6f\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\x72\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\x74\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\x76\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\x78\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\x7b\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\x7d\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\x81\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\x86\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\x89\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\x92\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\x93\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\x9c\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\x9d\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\xa7\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\xac\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\xb2\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\xb8\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\xbc\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\xbf\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\x00\x00\x00\x00\x00\x00\x0f\x01\xc3\x00\x00\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\x1c\x01\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x00\x00\x11\x01\x11\x01\xc3\x00\x1c\x01\x00\x00\x00\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\xc3\x00\x00\x00\x00\x00\xc3\x00\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\xc3\x00\x42\x00\xc3\x00\x00\x00\x84\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00\x00\x00\x00\x00\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\x00\x00\x00\x00\x16\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x1c\x01\x00\x00\x00\x00\xc4\x00\x00\x00\x00\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\x11\x01\x11\x01\x00\x00\x10\x01\x00\x00\xc5\x00\x00\x00\xc4\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x1c\x01\xc4\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\x25\x01\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x25\x01\xc5\x00\x00\x00\xc4\x00\x00\x00\x25\x01\x00\x00\xc5\x00\xc4\x00\xc4\x00\x00\x00\x25\x01\xc4\x00\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x25\x01\xc4\x00\x42\x00\xc4\x00\xc5\x00\x8e\x00\x25\x01\x00\x00\x00\x00\xc5\x00\xc5\x00\x25\x01\x00\x00\xc5\x00\xc5\x00\x00\x00\x00\x00\x25\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\xc5\x00\x00\x00\xc5\x00\x00\x00\x8f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xc7\x00\xc7\x00\xc7\x00\xc7\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\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\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\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x30\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x30\x01\xc6\x00\x00\x00\x00\x00\xc7\x00\x30\x01\x00\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x30\x01\x00\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x30\x01\x00\x00\xc7\x00\x00\x00\xc6\x00\x00\x00\x30\x01\x00\x00\xc7\x00\xc6\x00\xc6\x00\x30\x01\x00\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\x30\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\x00\x00\x00\x00\x00\x00\xc6\x00\x00\x00\xc6\x00\x42\x00\xc6\x00\xc7\x00\x98\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\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\xc7\x00\x00\x00\xc7\x00\x00\x00\x99\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x00\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0a\x00\x00\x00\x0a\x00\x00\x00\xa5\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x00\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x09\x00\x00\x00\x00\x00\x09\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x09\x00\x00\x00\x09\x00\x00\x00\xaa\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x2a\x01\x00\x00\xd9\x00\xd9\x00\xd9\x00\xd9\x00\xd9\x00\xd9\x00\xd9\x00\xd9\x00\xd9\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x05\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x00\x00\x00\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x05\x00\x43\x00\x05\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x88\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x89\x00\x1a\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x67\x00\x29\x00\x4a\x00\x4a\x00\x4a\x00\x4b\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\x00\x00\x00\x00\xff\xff\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xae\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb2\x00\x13\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x76\x00\x22\x00\x59\x00\x59\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x00\x00\x00\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x43\x00\x01\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x88\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x89\x00\x1a\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x67\x00\x29\x00\x4a\x00\x4a\x00\x4a\x00\x4b\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\x00\x00\xc8\x00\xff\xff\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x01\x00\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xd9\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x00\x00\xd7\x00\x00\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\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\xf4\x00\xf4\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xb4\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb8\x00\x12\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x78\x00\x21\x00\x5b\x00\x5b\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00\xdf\x00\x00\x00\x00\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\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\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\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\xe8\x00\x80\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\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\x00\x00\x00\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\x7e\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x81\x00\x1c\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x62\x00\x2b\x00\x45\x00\x45\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\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\xe8\x00\x00\x00\x3c\x01\xb1\x00\x00\x00\x00\x00\x00\x00\xff\xff\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\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\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\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\xe8\x00\x85\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\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\x00\x00\x00\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\x83\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x86\x00\x1b\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x65\x00\x2a\x00\x48\x00\x48\x00\x48\x00\x49\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\x00\x00\x2a\x01\xff\xff\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xd9\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x01\xd7\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x00\x00\x00\x00\x00\xdb\x00\x2a\x01\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\xd7\x00\x00\x00\x00\x00\x00\x00\xf4\x00\xf4\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x00\x00\x00\x03\x01\xdc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x05\x01\x05\x01\x00\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x00\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\x8c\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x92\x00\x18\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6b\x00\x28\x00\x4d\x00\x4d\x00\x4d\x00\x50\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\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x1a\x01\x00\x00\x00\x00\x15\x01\x15\x01\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x8d\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x93\x00\x19\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x6c\x00\x27\x00\x4e\x00\x4e\x00\x4e\x00\x4f\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\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x01\x00\x00\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x37\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x01\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x1b\x01\x00\x00\x00\x00\x15\x01\x15\x01\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x96\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9c\x00\x16\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6f\x00\x26\x00\x51\x00\x51\x00\x51\x00\x54\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\x00\x00\x00\x00\xff\xff\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x29\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x36\x01\xd7\x00\x22\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x00\x00\x00\x00\xd7\x00\x22\x01\x22\x01\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x22\x01\x00\x00\x00\x00\x00\x00\x22\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x00\x00\x00\x00\x00\x00\xd7\x00\x22\x01\x00\x00\x00\x00\x28\x01\x28\x01\x00\x00\x22\x01\x00\x00\x00\x00\xd7\x00\x22\x01\x22\x01\x00\x00\x28\x01\x28\x01\x00\x00\x22\x01\x22\x01\x00\x00\x00\x00\x00\x00\x22\x01\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x22\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x97\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9d\x00\x17\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x70\x00\x25\x00\x52\x00\x52\x00\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe7\x00\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x2b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x00\x00\x00\x00\x00\x00\x00\x00\xda\x00\x22\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x2c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x00\x00\x00\x00\x28\x01\x28\x01\x00\x00\x22\x01\xd7\x00\x22\x01\x00\x00\x00\x00\x22\x01\x00\x00\x00\x00\x22\x01\x00\x00\x00\x00\x22\x01\x00\x00\x22\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x22\x01\x00\x00\x00\x00\x28\x01\x28\x01\x00\x00\x22\x01\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xba\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbc\x00\x11\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7b\x00\x1f\x00\x5d\x00\x5d\x00\x5d\x00\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe6\x00\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x34\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x01\x00\x00\x00\x00\x33\x01\x33\x01\x00\x00\x2d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xbe\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xbf\x00\x0f\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7d\x00\x1d\x00\x5f\x00\x5f\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\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\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\x35\x01\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x38\x00\x33\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2e\x00\x32\x00\x31\x00\x31\x00\x31\x00\x30\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\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x38\x00\x33\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2e\x00\x32\x00\x31\x00\x31\x00\x31\x00\x30\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\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x01\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x83\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x86\x00\x1b\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x65\x00\x2a\x00\x48\x00\x48\x00\x48\x00\x49\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++alex_check :: AlexAddr+alex_check = AlexA#+ "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x27\x00\x27\x00\x61\x00\x6d\x00\x67\x00\x65\x00\x61\x00\x72\x00\x64\x00\x6e\x00\x32\x00\x74\x00\x2e\x00\x32\x00\x32\x00\x32\x00\x0a\x00\x32\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\x34\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\x38\x00\x5d\x00\x5e\x00\x5f\x00\x38\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\x0a\x00\x09\x00\x34\x00\x0d\x00\x32\x00\x38\x00\x55\x00\x38\x00\x34\x00\x34\x00\x32\x00\x32\x00\x6c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x4c\x00\x20\x00\x6c\x00\x6c\x00\x78\x00\x4c\x00\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x69\x00\x6a\x00\x75\x00\x4c\x00\x4c\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\x6c\x00\x55\x00\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\x38\x00\x39\x00\x2b\x00\x78\x00\x2d\x00\xff\xff\x5c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x75\x00\x31\x00\x3d\x00\x33\x00\x69\x00\x3d\x00\x36\x00\x2b\x00\x3d\x00\x2d\x00\x3d\x00\x70\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x69\x00\x6a\x00\x3d\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x22\x00\x31\x00\x0d\x00\x33\x00\x4c\x00\x27\x00\x36\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x3d\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x4c\x00\x55\x00\x3d\x00\x55\x00\x3d\x00\x55\x00\x27\x00\x3f\x00\x20\x00\x2b\x00\xff\xff\x69\x00\x6a\x00\x45\x00\x6c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x75\x00\x6c\x00\xff\xff\x6c\x00\x3d\x00\x26\x00\x55\x00\x3d\x00\x4c\x00\x6c\x00\x75\x00\x4c\x00\x75\x00\x5c\x00\x75\x00\x3c\x00\x3d\x00\x4c\x00\x61\x00\x62\x00\x55\x00\x4c\x00\x65\x00\x66\x00\x4c\x00\x4c\x00\x55\x00\xff\xff\x3d\x00\xff\xff\x55\x00\x6e\x00\x55\x00\x55\x00\x55\x00\x72\x00\x5c\x00\x74\x00\x75\x00\x76\x00\x6c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x75\x00\x69\x00\x6a\x00\x6c\x00\x6c\x00\x6c\x00\x75\x00\x3d\x00\x3e\x00\xff\xff\x75\x00\xff\xff\x75\x00\x75\x00\x75\x00\xff\xff\xff\xff\xff\xff\x7c\x00\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x31\x00\xff\xff\x33\x00\x69\x00\x6a\x00\x36\x00\x2d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x78\x00\x69\x00\x6a\x00\xff\xff\x3d\x00\x3e\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x09\x00\x0a\x00\x78\x00\xff\xff\x0d\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\x38\x00\x39\x00\x20\x00\x69\x00\x6a\x00\xff\xff\xff\xff\x4c\x00\x4c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x5c\x00\x55\x00\x55\x00\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\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\x69\x00\x6a\x00\xff\xff\x6c\x00\x6c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x75\x00\x75\x00\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\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\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\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x4c\x00\xff\xff\xff\xff\x4c\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x55\x00\xff\xff\xff\xff\x55\x00\x55\x00\x5c\x00\xff\xff\x6c\x00\x55\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x75\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\x6c\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\xff\xff\xff\xff\x75\x00\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x31\x00\xff\xff\x33\x00\xff\xff\xff\xff\x36\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\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\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\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x69\x00\x6a\x00\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\xff\xff\x20\x00\xff\xff\x22\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\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\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\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\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\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\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\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x5c\x00\x55\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\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x75\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\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\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\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\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\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\x38\x00\x39\x00\x20\x00\xff\xff\x22\x00\xff\xff\xff\xff\x4c\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x5c\x00\x55\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\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x75\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\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\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\x38\x00\x39\x00\xff\xff\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x5c\x00\xff\xff\xff\xff\x55\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\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\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x2e\x00\x27\x00\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\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\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x5c\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\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\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\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\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\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x5c\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\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\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\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\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\x22\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x3f\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x5c\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\xff\xff\xff\xff\x65\x00\x66\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x75\x00\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\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\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\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\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\x4c\x00\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\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\x69\x00\x6a\x00\x45\x00\x6c\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x75\x00\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\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\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\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\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\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\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\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x55\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\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x22\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x27\x00\xff\xff\x75\x00\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\x46\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x3f\x00\xff\xff\x5c\x00\xff\xff\x51\x00\xff\xff\x45\x00\x61\x00\x62\x00\xff\xff\x57\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\x66\x00\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\x6c\x00\xff\xff\xff\xff\x61\x00\x62\x00\x71\x00\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x77\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\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\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\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\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\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x4c\x00\x3f\x00\xff\xff\xff\xff\x27\x00\x51\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x57\x00\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\x66\x00\xff\xff\x3f\x00\xff\xff\x5c\x00\xff\xff\x6c\x00\xff\xff\x45\x00\x61\x00\x62\x00\x71\x00\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x77\x00\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\x5c\x00\x78\x00\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\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\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\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\xff\xff\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\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\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\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\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\xff\xff\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\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\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\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\x0a\x00\xff\xff\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\x45\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x65\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\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\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\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\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\x5c\x00\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\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\x0a\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\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\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\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\x2e\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\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\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\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\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\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\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\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\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\x24\x00\xff\xff\x22\x00\xff\xff\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\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x24\x00\xff\xff\x22\x00\x27\x00\xff\xff\xff\xff\xff\xff\x27\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\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\x2e\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\x45\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x58\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\x65\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\x4c\x00\x78\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x55\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\x65\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x41\x00\x42\x00\x43\x00\x44\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\xff\xff\xff\xff\xff\xff\x55\x00\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\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\x2e\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\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\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\x70\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x75\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\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\x22\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x45\x00\x46\x00\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x57\x00\xff\xff\xff\xff\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x57\x00\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\x65\x00\x66\x00\x71\x00\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x77\x00\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\x77\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\xff\xff\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x57\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x45\x00\x46\x00\xff\xff\xff\xff\x71\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x77\x00\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x57\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\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\xff\xff\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x57\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\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\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\xff\xff\x27\x00\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\x70\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\x5c\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\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00"#++alex_deflt :: AlexAddr+alex_deflt = AlexA#+ "\xff\xff\x09\x00\x09\x00\x09\x00\x09\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x09\x00\x0a\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\x39\x00\x39\x00\x2f\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\xff\xff\x3c\x00\x3c\x00\xff\xff\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x61\x00\xff\xff\x64\x00\x64\x00\x66\x00\x66\x00\xff\xff\x6a\x00\x69\x00\x69\x00\x6a\x00\x6e\x00\x6d\x00\x6d\x00\x6e\x00\x71\x00\x71\x00\x73\x00\x73\x00\x75\x00\x75\x00\x77\x00\x77\x00\x7a\x00\x7a\x00\x7c\x00\x7c\x00\x82\x00\x82\x00\xff\xff\x87\x00\x87\x00\x8a\x00\x8a\x00\xff\xff\x95\x00\x94\x00\x94\x00\x95\x00\x9f\x00\x9e\x00\x9e\x00\x9f\x00\xa8\x00\xa8\x00\xad\x00\xad\x00\xb3\x00\xb3\x00\xb9\x00\xb9\x00\xff\xff\xbd\x00\xbd\x00\xc0\x00\xc0\x00\xc1\x00\xff\xff\xff\xff\xc1\x00\xc1\x00\xc3\x00\xff\xff\xff\xff\xc3\x00\xc3\x00\x0c\x00\x0c\x00\x0c\x00\xff\xff\xc4\x00\xc5\x00\xff\xff\xff\xff\xff\xff\xff\xff\xc4\x00\xc5\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xff\xff\xff\xff\xff\xff\xff\xff\xc6\x00\xc7\x00\xc6\x00\xc7\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0a\x00\x0a\x00\x09\x00\xff\xff\xff\xff\x09\x00\x09\x00\x05\x00\xff\xff\x0c\x00\x05\x00\x05\x00\x05\x00\x01\x00\xff\xff\x0c\x00\x01\x00\x01\x00\x01\x00\xdd\x00\xff\xff\xdd\x00\xdd\x00\xde\x00\xde\x00\xde\x00\xc1\x00\xff\xff\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\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\xdd\x00\xde\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\x3c\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xc3\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"#++alex_accept = listArray (0 :: Int, 362)+ [ AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccNone+ , AlexAccSkip+ , AlexAcc 131+ , AlexAccSkip+ , AlexAccSkip+ , AlexAcc 130+ , AlexAcc 129+ , AlexAcc 128+ , AlexAcc 127+ , AlexAcc 126+ , AlexAcc 125+ , AlexAcc 124+ , AlexAcc 123+ , AlexAcc 122+ , AlexAcc 121+ , AlexAcc 120+ , AlexAcc 119+ , AlexAcc 118+ , AlexAcc 117+ , AlexAcc 116+ , AlexAcc 115+ , AlexAcc 114+ , AlexAcc 113+ , AlexAcc 112+ , AlexAcc 111+ , AlexAcc 110+ , AlexAcc 109+ , AlexAcc 108+ , AlexAcc 107+ , AlexAcc 106+ , AlexAcc 105+ , AlexAcc 104+ , AlexAcc 103+ , AlexAcc 102+ , AlexAcc 101+ , AlexAcc 100+ , AlexAcc 99+ , AlexAcc 98+ , AlexAcc 97+ , AlexAcc 96+ , AlexAcc 95+ , AlexAcc 94+ , AlexAcc 93+ , AlexAcc 92+ , AlexAcc 91+ , AlexAcc 90+ , AlexAcc 89+ , AlexAcc 88+ , AlexAcc 87+ , AlexAcc 86+ , AlexAcc 85+ , AlexAcc 84+ , AlexAcc 83+ , AlexAcc 82+ , AlexAcc 81+ , AlexAcc 80+ , AlexAcc 79+ , AlexAcc 78+ , AlexAcc 77+ , AlexAcc 76+ , AlexAcc 75+ , AlexAcc 74+ , AlexAcc 73+ , AlexAcc 72+ , AlexAcc 71+ , AlexAcc 70+ , AlexAcc 69+ , AlexAcc 68+ , AlexAcc 67+ , AlexAcc 66+ , AlexAcc 65+ , AlexAcc 64+ , AlexAcc 63+ , AlexAcc 62+ , AlexAcc 61+ , AlexAcc 60+ , AlexAcc 59+ , AlexAcc 58+ , AlexAcc 57+ , AlexAcc 56+ , AlexAcc 55+ , AlexAcc 54+ , AlexAcc 53+ , AlexAcc 52+ , AlexAcc 51+ , AlexAcc 50+ , AlexAcc 49+ , AlexAcc 48+ , AlexAcc 47+ , AlexAcc 46+ , AlexAcc 45+ , AlexAcc 44+ , AlexAcc 43+ , AlexAcc 42+ , AlexAcc 41+ , AlexAcc 40+ , AlexAcc 39+ , AlexAcc 38+ , AlexAcc 37+ , AlexAcc 36+ , AlexAcc 35+ , AlexAcc 34+ , AlexAcc 33+ , AlexAcc 32+ , AlexAcc 31+ , AlexAcc 30+ , AlexAcc 29+ , AlexAcc 28+ , AlexAcc 27+ , AlexAcc 26+ , AlexAcc 25+ , AlexAcc 24+ , AlexAcc 23+ , AlexAcc 22+ , AlexAcc 21+ , AlexAcc 20+ , AlexAcc 19+ , AlexAcc 18+ , AlexAcc 17+ , AlexAcc 16+ , AlexAcc 15+ , AlexAcc 14+ , AlexAcc 13+ , AlexAcc 12+ , AlexAcc 11+ , AlexAcc 10+ , AlexAcc 9+ , AlexAcc 8+ , AlexAcc 7+ , AlexAcc 6+ , AlexAcc 5+ , AlexAcc 4+ , AlexAcc 3+ , AlexAcc 2+ , AlexAcc 1+ , AlexAcc 0+ ]++alex_actions = array (0 :: Int, 132)+ [ (131,alex_action_1)+ , (130,alex_action_4)+ , (129,alex_action_4)+ , (128,alex_action_5)+ , (127,alex_action_5)+ , (126,alex_action_5)+ , (125,alex_action_5)+ , (124,alex_action_5)+ , (123,alex_action_5)+ , (122,alex_action_5)+ , (121,alex_action_5)+ , (120,alex_action_5)+ , (119,alex_action_5)+ , (118,alex_action_5)+ , (117,alex_action_5)+ , (116,alex_action_5)+ , (115,alex_action_5)+ , (114,alex_action_5)+ , (113,alex_action_5)+ , (112,alex_action_5)+ , (111,alex_action_6)+ , (110,alex_action_6)+ , (109,alex_action_6)+ , (108,alex_action_6)+ , (107,alex_action_6)+ , (106,alex_action_6)+ , (105,alex_action_6)+ , (104,alex_action_6)+ , (103,alex_action_6)+ , (102,alex_action_6)+ , (101,alex_action_6)+ , (100,alex_action_6)+ , (99,alex_action_6)+ , (98,alex_action_6)+ , (97,alex_action_6)+ , (96,alex_action_6)+ , (95,alex_action_7)+ , (94,alex_action_7)+ , (93,alex_action_7)+ , (92,alex_action_7)+ , (91,alex_action_7)+ , (90,alex_action_7)+ , (89,alex_action_7)+ , (88,alex_action_7)+ , (87,alex_action_7)+ , (86,alex_action_7)+ , (85,alex_action_7)+ , (84,alex_action_7)+ , (83,alex_action_7)+ , (82,alex_action_7)+ , (81,alex_action_7)+ , (80,alex_action_7)+ , (79,alex_action_7)+ , (78,alex_action_8)+ , (77,alex_action_9)+ , (76,alex_action_10)+ , (75,alex_action_11)+ , (74,alex_action_12)+ , (73,alex_action_13)+ , (72,alex_action_14)+ , (71,alex_action_14)+ , (70,alex_action_14)+ , (69,alex_action_14)+ , (68,alex_action_14)+ , (67,alex_action_14)+ , (66,alex_action_14)+ , (65,alex_action_14)+ , (64,alex_action_14)+ , (63,alex_action_14)+ , (62,alex_action_14)+ , (61,alex_action_15)+ , (60,alex_action_15)+ , (59,alex_action_15)+ , (58,alex_action_15)+ , (57,alex_action_15)+ , (56,alex_action_15)+ , (55,alex_action_15)+ , (54,alex_action_15)+ , (53,alex_action_16)+ , (52,alex_action_17)+ , (51,alex_action_17)+ , (50,alex_action_18)+ , (49,alex_action_18)+ , (48,alex_action_19)+ , (47,alex_action_20)+ , (46,alex_action_21)+ , (45,alex_action_22)+ , (44,alex_action_23)+ , (43,alex_action_24)+ , (42,alex_action_25)+ , (41,alex_action_26)+ , (40,alex_action_27)+ , (39,alex_action_28)+ , (38,alex_action_29)+ , (37,alex_action_30)+ , (36,alex_action_31)+ , (35,alex_action_32)+ , (34,alex_action_33)+ , (33,alex_action_34)+ , (32,alex_action_35)+ , (31,alex_action_36)+ , (30,alex_action_37)+ , (29,alex_action_38)+ , (28,alex_action_39)+ , (27,alex_action_40)+ , (26,alex_action_41)+ , (25,alex_action_42)+ , (24,alex_action_43)+ , (23,alex_action_44)+ , (22,alex_action_45)+ , (21,alex_action_46)+ , (20,alex_action_47)+ , (19,alex_action_48)+ , (18,alex_action_49)+ , (17,alex_action_50)+ , (16,alex_action_51)+ , (15,alex_action_52)+ , (14,alex_action_53)+ , (13,alex_action_54)+ , (12,alex_action_55)+ , (11,alex_action_56)+ , (10,alex_action_57)+ , (9,alex_action_58)+ , (8,alex_action_59)+ , (7,alex_action_60)+ , (6,alex_action_61)+ , (5,alex_action_62)+ , (4,alex_action_63)+ , (3,alex_action_64)+ , (2,alex_action_65)+ , (1,alex_action_66)+ , (0,alex_action_67)+ ]++{-# LINE 263 "src/Language/C/Parser/Lexer.x" #-}++-- Fix the 'octal' lexing of '0'+readCOctal :: String -> Either String CInteger+readCOctal s@('0':r) =+ case r of+ (c:_) | isDigit c -> readCInteger OctalRepr r+ _ -> readCInteger DecRepr s+readCOctal _ = error "ReadOctal: string does not start with `0'"+++-- We use the odd looking list of string patterns here rather than normal+-- 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 change makes a significant performance difference [chak]+--+-- To make this a little more maintainable, we autogenerate it from this list,+-- using the script GenerateKeywords.hs (in /scripts)+{-+alignas _Alignas, alignof _Alignof __alignof alignof __alignof__, asm @__, atomic _Atomic, auto+break, bool _Bool,+case, char, const @__, continue, complex _Complex __complex__+default, do, double,+else, enum, extern,+float, for,+generic _Generic, goto,+if, inline @__, int, int128 __int128, long,+noreturn _Noreturn, _Nonnull __nonnull, _Nullable __nullable,+register, restrict @__, return+short, signed @__, sizeof, static, staticAssert _Static_assert, struct, switch,+typedef, typeof @__, thread __thread _Thread_local+union, unsigned, void, volatile @__,+while,+label __label__+(CTokFloatN 32 False) _Float32+(CTokFloatN 32 True) _Float32x+(CTokFloatN 64 False) _Float64+(CTokFloatN 64 True) _Float64x+(CTokFloatN 128 False) _Float128 __float128+(CTokFloatN 128 True) _Float128x+(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+(CTokClangC ClangBuiltinConvertVector) __builtin_convertvector+-}+-- Tokens: _Alignas _Alignof __alignof alignof __alignof__ __asm asm __asm__ _Atomic auto break _Bool case char __const const __const__ continue _Complex __complex__ default do double else enum extern float for _Generic goto if __inline inline __inline__ int __int128 long _Noreturn __nullable __nonnull register __restrict restrict __restrict__ return short __signed signed __signed__ sizeof static _Static_assert struct switch typedef __typeof typeof __typeof__ __thread _Thread_local union unsigned void __volatile volatile __volatile__ while __label__ _Float32 _Float32x _Float64 _Float64x _Float128 __float128 _Float128x __attribute __attribute__ __extension__ __real __real__ __imag __imag__ __builtin_va_arg __builtin_offsetof __builtin_types_compatible_p __builtin_convertvector+idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'a' : 's' : []) = tok 8 CTokAlignas+idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 8 CTokAlignof+idkwtok ('_' : 'A' : 't' : 'o' : 'm' : 'i' : 'c' : []) = tok 7 CTokAtomic+idkwtok ('_' : 'B' : 'o' : 'o' : 'l' : []) = tok 5 CTokBool+idkwtok ('_' : 'C' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : []) = tok 8 CTokComplex+idkwtok ('_' : 'G' : 'e' : 'n' : 'e' : 'r' : 'i' : 'c' : []) = tok 8 CTokGeneric+idkwtok ('_' : 'N' : 'o' : 'r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 9 CTokNoreturn+idkwtok ('_' : 'S' : 't' : 'a' : 't' : 'i' : 'c' : '_' : 'a' : 's' : 's' : 'e' : 'r' : 't' : []) = tok 14 CTokStaticAssert+idkwtok ('_' : 'T' : 'h' : 'r' : 'e' : 'a' : 'd' : '_' : 'l' : 'o' : 'c' : 'a' : 'l' : []) = tok 13 CTokThread+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' : '_' : 'c' : 'o' : 'n' : 'v' : 'e' : 'r' : 't' : 'v' : 'e' : 'c' : 't' : 'o' : 'r' : []) = tok 23 (flip CTokClangC ClangBuiltinConvertVector)+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' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 10 (CTokFloatN 128 False)+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 ('_' : '_' : 'i' : 'n' : 't' : '1' : '2' : '8' : []) = tok 8 CTokInt128+idkwtok ('_' : '_' : 'l' : 'a' : 'b' : 'e' : 'l' : '_' : '_' : []) = tok 9 CTokLabel+idkwtok ('l' : 'o' : 'n' : 'g' : []) = tok 4 CTokLong+idkwtok ('_' : '_' : 'n' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 9 CTokNonnull+idkwtok ('_' : '_' : 'n' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 10 CTokNullable+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+#ifdef IEC_60559_TYPES_EXT+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '3' : '2' : []) = tok 8 (CTokFloatN 32 False)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '3' : '2' : 'x' : []) = tok 9 (CTokFloatN 32 True)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '6' : '4' : []) = tok 8 (CTokFloatN 64 False)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '6' : '4' : 'x' : []) = tok 9 (CTokFloatN 64 True)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 9 (CTokFloatN 128 False)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : 'x' : []) = tok 10 (CTokFloatN 128 True)+#endif++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,len) ident)+ else return (CTokIdent (pos,len) ident)++ignoreAttribute :: P ()+ignoreAttribute = skipTokens (0::Int)+ where skipTokens :: Int -> P ()+ skipTokens n = do+ ntok <- lexToken' False+ case ntok of+ CTokRParen _ | n == 1 -> return ()+ | otherwise -> skipTokens (n-1)+ CTokLParen _ -> skipTokens (n+1)+ _ -> skipTokens n++tok :: Int -> (PosLength -> CToken) -> Position -> P CToken+tok len tc pos = return (tc (pos,len))++adjustLineDirective :: Int -> String -> Position -> Position+adjustLineDirective pragmaLen str pos =+ offs' `seq` fname' `seq` row' `seq` parent' `seq` (position offs' fname' row' 1 parent')+ where+ -- offset changes by length of #line pragma+ offs' = (posOffset pos) + pragmaLen+ str' = dropWhite . drop 1 $ str+ (rowStr, str'') = span isDigit str'+ -- row changes to the first number in the line pragma+ row' = read rowStr+ str''' = dropWhite str''+ (fnameStr,str'''') = span (/= '"') . drop 1 $ str'''+ fname = posFile pos+ no_fn = null str''' || (head str''' /= '"') || (head str'''' /= '"')+ -- filename changes to new filename, if specified+ fname' | no_fn = fname+ -- try and get more sharing of file name strings+ | fnameStr == fname = fname+ | otherwise = fnameStr+ -- analye flags+ min_flag = find_min_flag (5 :: Int) (drop 1 str'''')+ find_min_flag cur_min = select_min . span isDigit . dropWhile (not . isDigit)+ where+ select_min (numStr, fstr') | null numStr = cur_min+ | otherwise = find_min_flag (read numStr `min` cur_min) fstr'+ parent = posParent pos+ parent' = case min_flag of+ 1 -> Just pos -- push+ 2 -> case parent >>= posParent of+ Nothing -> Nothing -- pop/underflow+ Just gp -> gp `seq` Just gp -- pop+ 3 -> parent -- unchanged stack, system header info+ 4 -> parent -- unchanged stack, extern C info+ _ -> Nothing+ --+ dropWhite = dropWhile (\c -> c == ' ' || c == '\t')++-- special utility for the lexer+unescapeMultiChars :: String -> [Char]+unescapeMultiChars cs@(_ : _ : _) = case unescapeChar cs of (c,cs') -> c : unescapeMultiChars cs'+unescapeMultiChars ('\'' : []) = []+unescapeMultiChars _ = error "Unexpected end of multi-char constant"++{-# INLINE token_ #-}+-- token that ignores the string+token_ :: Int -> (PosLength -> CToken) -> Position -> Int -> InputStream -> P CToken+token_ len mkTok pos _ _ = return (mkTok (pos,len))++{-# INLINE token_fail #-}+-- error token+token_fail :: String -> Position ->+ Int -> InputStream -> P CToken+token_fail errmsg pos _ _ = failP pos [ "Lexical Error !", errmsg ]+++{-# INLINE token #-}+-- token that uses the string+token :: (PosLength -> a -> CToken) -> (String -> a)+ -> Position -> Int -> InputStream -> P CToken+token mkTok fromStr pos len str = return (mkTok (pos,len) (fromStr $ takeChars len str))++{-# INLINE token_plus #-}+-- token that may fail+token_plus :: (PosLength -> a -> CToken) -> (String -> Either String a)+ -> Position -> Int -> InputStream -> P CToken+token_plus mkTok fromStr pos len str =+ case fromStr (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]+ Right ok -> return $! mkTok (pos,len) ok++-- -----------------------------------------------------------------------------+-- The input type++type AlexInput = (Position, -- current position,+ InputStream) -- current input string++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar _ = error "alexInputPrevChar not used"++-- for alex-3.0+alexGetByte :: AlexInput -> Maybe (Word8, AlexInput)+alexGetByte (p,is) | inputStreamEmpty is = Nothing+ | otherwise = let (b,s) = takeByte is in+ -- this is safe for latin-1, but ugly+ let p' = alexMove p (chr (fromIntegral b)) in p' `seq`+ Just (b, (p', s))++alexGetChar :: AlexInput -> Maybe (Char,AlexInput)+alexGetChar (p,is) | inputStreamEmpty is = Nothing+ | otherwise = let (c,s) = takeChar is in+ let p' = alexMove p c in p' `seq`+ Just (c, (p', s))++alexMove :: Position -> Char -> Position+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+ pos <- getPos+ (c,_) <- liftM takeChar getInput+ failP pos+ ["Lexical error !",+ "The character " ++ show c ++ " does not fit here."]++parseError :: P a+parseError = do+ lastTok <- getLastToken+ failP (posOf lastTok)+ ["Syntax error !",+ "The symbol `" ++ show lastTok ++ "' 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 = lexToken' True++lexToken' :: Bool -> P CToken+lexToken' modifyCache = do+ pos <- getPos+ inp <- getInput+ case alexScan (pos, inp) 0 of+ AlexEOF -> do+ handleEofToken+ return CTokEof+ AlexError _inp -> lexicalError+ AlexSkip (pos', inp') _len -> do+ setPos pos'+ setInput inp'+ lexToken' modifyCache+ AlexToken (pos', inp') len action -> do+ setPos pos'+ setInput inp'+ nextTok <- action pos len inp+ when modifyCache $ setLastToken nextTok+ return nextTok++lexC :: (CToken -> P a) -> P a+lexC cont = do+ nextTok <- lexToken+ cont nextTok++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) +alex_action_7 = token_plus CTokILit (readCInteger HexRepr . drop 2) +alex_action_8 = token_fail "Invalid integer constant suffix" +alex_action_9 = token CTokCLit (cChar . fst . unescapeChar . tail) +alex_action_10 = token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) +alex_action_11 = token CTokCLit (flip cChars False . unescapeMultiChars .tail) +alex_action_12 = token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) +alex_action_13 = token (\pos -> CTokClangC pos . ClangCVersionTok) readClangCVersion +alex_action_14 = token CTokFLit readCFloat +alex_action_15 = token CTokFLit readCFloat +alex_action_16 = token_fail "Hexadecimal floating constant requires an exponent" +alex_action_17 = token CTokSLit (cString . unescapeString . init . tail) +alex_action_18 = token CTokSLit (cString_w . unescapeString . init . tail . tail) +alex_action_19 = token_fail "Universal character names are unsupported" +alex_action_20 = token_fail "Invalid escape sequence" +alex_action_21 = token_fail "Universal character names in string literals are unsupported"+alex_action_22 = token_ 1 CTokLParen +alex_action_23 = token_ 1 CTokRParen +alex_action_24 = token_ 1 CTokLBracket +alex_action_25 = token_ 1 CTokRBracket +alex_action_26 = token_ 2 CTokArrow +alex_action_27 = token_ 1 CTokDot +alex_action_28 = token_ 1 CTokExclam +alex_action_29 = token_ 1 CTokTilde +alex_action_30 = token_ 2 CTokInc +alex_action_31 = token_ 2 CTokDec +alex_action_32 = token_ 1 CTokPlus +alex_action_33 = token_ 1 CTokMinus +alex_action_34 = token_ 1 CTokStar +alex_action_35 = token_ 1 CTokSlash +alex_action_36 = token_ 1 CTokPercent +alex_action_37 = token_ 1 CTokAmper +alex_action_38 = token_ 2 CTokShiftL +alex_action_39 = token_ 2 CTokShiftR +alex_action_40 = token_ 1 CTokLess +alex_action_41 = token_ 2 CTokLessEq +alex_action_42 = token_ 1 CTokHigh +alex_action_43 = token_ 2 CTokHighEq +alex_action_44 = token_ 2 CTokEqual +alex_action_45 = token_ 2 CTokUnequal +alex_action_46 = token_ 1 CTokHat +alex_action_47 = token_ 1 CTokBar +alex_action_48 = token_ 2 CTokAnd +alex_action_49 = token_ 2 CTokOr +alex_action_50 = token_ 1 CTokQuest +alex_action_51 = token_ 1 CTokColon +alex_action_52 = token_ 1 CTokAssign +alex_action_53 = token_ 2 CTokPlusAss +alex_action_54 = token_ 2 CTokMinusAss +alex_action_55 = token_ 2 CTokStarAss +alex_action_56 = token_ 2 CTokSlashAss +alex_action_57 = token_ 2 CTokPercAss +alex_action_58 = token_ 2 CTokAmpAss +alex_action_59 = token_ 2 CTokHatAss +alex_action_60 = token_ 2 CTokBarAss +alex_action_61 = token_ 3 CTokSLAss +alex_action_62 = token_ 3 CTokSRAss +alex_action_63 = token_ 1 CTokComma +alex_action_64 = token_ 1 CTokSemic +alex_action_65 = token_ 1 CTokLBrace +alex_action_66 = token_ 1 CTokRBrace +alex_action_67 = token_ 3 CTokEllipsis +{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- -----------------------------------------------------------------------------+-- ALEX TEMPLATE+--+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use+-- it for any purpose whatsoever.++-- -----------------------------------------------------------------------------+-- INTERNALS and main scanner engine++++++++++++++++++-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ > 706+#define GTE(n,m) (tagToEnum# (n >=# m))+#define EQ(n,m) (tagToEnum# (n ==# m))+#else+#define GTE(n,m) (n >=# m)+#define EQ(n,m) (n ==# m)+#endif++++++++++++++++++++data AlexAddr = AlexA# Addr#+-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ < 503+uncheckedShiftL# = shiftL#+#endif++{-# INLINE alexIndexInt16OffAddr #-}+alexIndexInt16OffAddr (AlexA# arr) off =+#ifdef WORDS_BIGENDIAN+ narrow16Int# i+ where+ i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)+ high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+ low = int2Word# (ord# (indexCharOffAddr# arr off'))+ off' = off *# 2#+#else+ indexInt16OffAddr# arr off+#endif++++++{-# INLINE alexIndexInt32OffAddr #-}+alexIndexInt32OffAddr (AlexA# arr) off =+#ifdef WORDS_BIGENDIAN+ narrow32Int# i+ where+ i = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`+ (b2 `uncheckedShiftL#` 16#) `or#`+ (b1 `uncheckedShiftL#` 8#) `or#` b0)+ b3 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))+ b2 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))+ b1 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+ b0 = int2Word# (ord# (indexCharOffAddr# arr off'))+ off' = off *# 4#+#else+ indexInt32OffAddr# arr off+#endif+++++++#if __GLASGOW_HASKELL__ < 503+quickIndex arr i = arr ! i+#else+-- GHC >= 503, unsafeAt is available from Data.Array.Base.+quickIndex = unsafeAt+#endif+++++-- -----------------------------------------------------------------------------+-- Main lexing routines++data AlexReturn a+ = AlexEOF+ | AlexError !AlexInput+ | AlexSkip !AlexInput !Int+ | AlexToken !AlexInput !Int a++-- alexScan :: AlexInput -> StartCode -> AlexReturn a+alexScan input__ (I# (sc))+ = alexScanUser undefined input__ (I# (sc))++alexScanUser user__ input__ (I# (sc))+ = case alex_scan_tkn user__ input__ 0# input__ sc AlexNone of+ (AlexNone, input__') ->+ case alexGetByte input__ of+ Nothing ->++++ AlexEOF+ Just _ ->++++ AlexError input__'++ (AlexLastSkip input__'' len, _) ->++++ AlexSkip input__'' len++ (AlexLastAcc k input__''' len, _) ->++++ AlexToken input__''' len (alex_actions ! k)+++-- Push the input through the DFA, remembering the most recent accepting+-- state it encountered.++alex_scan_tkn user__ orig_input len input__ s last_acc =+ input__ `seq` -- strict in the input+ let+ new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))+ in+ new_acc `seq`+ case alexGetByte input__ of+ Nothing -> (new_acc, input__)+ Just (c, new_input) ->++++ case fromIntegral c of { (I# (ord_c)) ->+ let+ base = alexIndexInt32OffAddr alex_base s+ offset = (base +# ord_c)+ check = alexIndexInt16OffAddr alex_check offset++ new_s = if GTE(offset,0#) && EQ(check,ord_c)+ then alexIndexInt16OffAddr alex_table offset+ else alexIndexInt16OffAddr alex_deflt s+ in+ case new_s of+ -1# -> (new_acc, input__)+ -- on an error, we want to keep the input *before* the+ -- character that failed, not after.+ _ -> alex_scan_tkn user__ orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)+ -- note that the length is increased ONLY if this is the 1st byte in a char encoding)+ new_input new_s new_acc+ }+ where+ check_accs (AlexAccNone) = last_acc+ check_accs (AlexAcc a ) = AlexLastAcc a input__ (I# (len))+ check_accs (AlexAccSkip) = AlexLastSkip input__ (I# (len))++++++++++++++data AlexLastAcc+ = AlexNone+ | AlexLastAcc !Int !AlexInput !Int+ | AlexLastSkip !AlexInput !Int++data AlexAcc user+ = AlexAccNone+ | AlexAcc Int+ | AlexAccSkip+++++++++++++++++++++++++++++
+ dist/build/Language/C/Parser/Parser.hs view
@@ -0,0 +1,7320 @@+{-# OPTIONS_GHC -w #-}+{-# OPTIONS -XMagicHash -XBangPatterns -XTypeSynonymInstances -XFlexibleInstances -cpp #-}+#if __GLASGOW_HASKELL__ >= 710+{-# OPTIONS_GHC -XPartialTypeSignatures #-}+#endif+module Language.C.Parser.Parser (+ -- * Parse a C translation unit+ parseC,+ -- * Exposed Parsers+ translUnitP, extDeclP, statementP, expressionP+) where++-- Relevant C99 sections:+--+-- 6.5 Expressions .1 - .17 and 6.6 (almost literally)+-- Supported GNU extensions:+-- - Allow a compound statement as an expression+-- - Various __builtin_* forms that take type parameters+-- - `alignof' expression or type+-- - `__extension__' to suppress warnings about extensions+-- - Allow taking address of a label with: && label+-- - Omitting the `then' part of conditional expressions+-- - complex numbers+--+-- 6.7 C Declarations .1 -.8+-- Supported GNU extensions:+-- - '__thread' thread local storage (6.7.1)+--+-- 6.8 Statements .1 - .8+-- Supported GNU extensions:+-- - case ranges (C99 6.8.1)+-- - '__label__ ident;' declarations (C99 6.8.2)+-- - computed gotos (C99 6.8.6)+--+-- 6.9 Translation unit+-- Supported GNU extensions:+-- - allow empty translation_unit+-- - allow redundant ';'+-- - allow extension keyword before external declaration+-- - asm definitions+--+-- Since some of the grammar productions are quite difficult to read,+-- (especially those involved with the decleration syntax) we document them+-- with an extended syntax that allows a more consise representation:+--+-- Ordinary rules+--+-- foo named terminal or non-terminal+--+-- 'c' terminal, literal character token+--+-- A B concatenation+--+-- A | B alternation+--+-- (A) grouping+--+-- Extended rules+--+-- A? optional, short hand for (A|) or [A]{ 0==A || 1==A }+--+-- ... stands for some part of the grammar omitted for clarity+--+-- {A} represents sequences, 0 or more.+--+-- <permute> modifier which states that any permutation of the immediate subterms is valid+--+--+--- TODO ----------------------------------------------------------------------+--+-- !* We ignore C11 _Atomic type annotations+-- !* We ignore the C99 static keyword (see C99 6.7.5.3)+-- !* We do not distinguish in the AST between incomplete array types and+-- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)+-- !* The AST doesn't allow recording __attribute__ of unnamed struct field+-- (see , struct_default_declaring_list, struct_identifier_declarator)+-- !* see `We're being far to liberal here' (... struct definition within structs)+-- * Documentation isn't complete and consistent yet.++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(..), ClangCTok (..), 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+import Language.C.Data.Ident+import Language.C.Data.Name+import Language.C.Data.Node+import Language.C.Data.Position+import Language.C.Syntax+import qualified Data.Array as Happy_Data_Array+import qualified Data.Bits as Bits+import qualified GHC.Exts as Happy_GHC_Exts+import Control.Applicative(Applicative(..))+import Control.Monad (ap)++-- parser produced by Happy Version 1.19.9++newtype HappyAbsSyn = HappyAbsSyn HappyAny+#if __GLASGOW_HASKELL__ >= 607+type HappyAny = Happy_GHC_Exts.Any+#else+type HappyAny = forall a . a+#endif+happyIn7 :: (CTranslUnit) -> (HappyAbsSyn )+happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn7 #-}+happyOut7 :: (HappyAbsSyn ) -> (CTranslUnit)+happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut7 #-}+happyIn8 :: (Reversed [CExtDecl]) -> (HappyAbsSyn )+happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn8 #-}+happyOut8 :: (HappyAbsSyn ) -> (Reversed [CExtDecl])+happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut8 #-}+happyIn9 :: (CExtDecl) -> (HappyAbsSyn )+happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn9 #-}+happyOut9 :: (HappyAbsSyn ) -> (CExtDecl)+happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut9 #-}+happyIn10 :: (CFunDef) -> (HappyAbsSyn )+happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn10 #-}+happyOut10 :: (HappyAbsSyn ) -> (CFunDef)+happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut10 #-}+happyIn11 :: (CDeclr) -> (HappyAbsSyn )+happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn11 #-}+happyOut11 :: (HappyAbsSyn ) -> (CDeclr)+happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut11 #-}+happyIn12 :: (CStat) -> (HappyAbsSyn )+happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn12 #-}+happyOut12 :: (HappyAbsSyn ) -> (CStat)+happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut12 #-}+happyIn13 :: (CStat) -> (HappyAbsSyn )+happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn13 #-}+happyOut13 :: (HappyAbsSyn ) -> (CStat)+happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut13 #-}+happyIn14 :: (CStat) -> (HappyAbsSyn )+happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn14 #-}+happyOut14 :: (HappyAbsSyn ) -> (CStat)+happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut14 #-}+happyIn15 :: (()) -> (HappyAbsSyn )+happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn15 #-}+happyOut15 :: (HappyAbsSyn ) -> (())+happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut15 #-}+happyIn16 :: (()) -> (HappyAbsSyn )+happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn16 #-}+happyOut16 :: (HappyAbsSyn ) -> (())+happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut16 #-}+happyIn17 :: (Reversed [CBlockItem]) -> (HappyAbsSyn )+happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn17 #-}+happyOut17 :: (HappyAbsSyn ) -> (Reversed [CBlockItem])+happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut17 #-}+happyIn18 :: (CBlockItem) -> (HappyAbsSyn )+happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn18 #-}+happyOut18 :: (HappyAbsSyn ) -> (CBlockItem)+happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut18 #-}+happyIn19 :: (CBlockItem) -> (HappyAbsSyn )+happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn19 #-}+happyOut19 :: (HappyAbsSyn ) -> (CBlockItem)+happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut19 #-}+happyIn20 :: (CFunDef) -> (HappyAbsSyn )+happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn20 #-}+happyOut20 :: (HappyAbsSyn ) -> (CFunDef)+happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut20 #-}+happyIn21 :: (Reversed [Ident]) -> (HappyAbsSyn )+happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn21 #-}+happyOut21 :: (HappyAbsSyn ) -> (Reversed [Ident])+happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut21 #-}+happyIn22 :: (CStat) -> (HappyAbsSyn )+happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn22 #-}+happyOut22 :: (HappyAbsSyn ) -> (CStat)+happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut22 #-}+happyIn23 :: (CStat) -> (HappyAbsSyn )+happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn23 #-}+happyOut23 :: (HappyAbsSyn ) -> (CStat)+happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut23 #-}+happyIn24 :: (CStat) -> (HappyAbsSyn )+happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn24 #-}+happyOut24 :: (HappyAbsSyn ) -> (CStat)+happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut24 #-}+happyIn25 :: (CStat) -> (HappyAbsSyn )+happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn25 #-}+happyOut25 :: (HappyAbsSyn ) -> (CStat)+happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut25 #-}+happyIn26 :: (CAsmStmt) -> (HappyAbsSyn )+happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn26 #-}+happyOut26 :: (HappyAbsSyn ) -> (CAsmStmt)+happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut26 #-}+happyIn27 :: (Maybe CTypeQual) -> (HappyAbsSyn )+happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn27 #-}+happyOut27 :: (HappyAbsSyn ) -> (Maybe CTypeQual)+happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut27 #-}+happyIn28 :: ([CAsmOperand]) -> (HappyAbsSyn )+happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn28 #-}+happyOut28 :: (HappyAbsSyn ) -> ([CAsmOperand])+happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut28 #-}+happyIn29 :: (Reversed [CAsmOperand]) -> (HappyAbsSyn )+happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn29 #-}+happyOut29 :: (HappyAbsSyn ) -> (Reversed [CAsmOperand])+happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut29 #-}+happyIn30 :: (CAsmOperand) -> (HappyAbsSyn )+happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn30 #-}+happyOut30 :: (HappyAbsSyn ) -> (CAsmOperand)+happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut30 #-}+happyIn31 :: (Reversed [CStrLit]) -> (HappyAbsSyn )+happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn31 #-}+happyOut31 :: (HappyAbsSyn ) -> (Reversed [CStrLit])+happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut31 #-}+happyIn32 :: (CDecl) -> (HappyAbsSyn )+happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn32 #-}+happyOut32 :: (HappyAbsSyn ) -> (CDecl)+happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut32 #-}+happyIn33 :: (Reversed [CDecl]) -> (HappyAbsSyn )+happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn33 #-}+happyOut33 :: (HappyAbsSyn ) -> (Reversed [CDecl])+happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut33 #-}+happyIn34 :: (CDecl) -> (HappyAbsSyn )+happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn34 #-}+happyOut34 :: (HappyAbsSyn ) -> (CDecl)+happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut34 #-}+happyIn35 :: ((Maybe CStrLit, [CAttr])) -> (HappyAbsSyn )+happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn35 #-}+happyOut35 :: (HappyAbsSyn ) -> ((Maybe CStrLit, [CAttr]))+happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut35 #-}+happyIn36 :: (CDecl) -> (HappyAbsSyn )+happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn36 #-}+happyOut36 :: (HappyAbsSyn ) -> (CDecl)+happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut36 #-}+happyIn37 :: ([CDeclSpec]) -> (HappyAbsSyn )+happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn37 #-}+happyOut37 :: (HappyAbsSyn ) -> ([CDeclSpec])+happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut37 #-}+happyIn38 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )+happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn38 #-}+happyOut38 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])+happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut38 #-}+happyIn39 :: (CDeclSpec) -> (HappyAbsSyn )+happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn39 #-}+happyOut39 :: (HappyAbsSyn ) -> (CDeclSpec)+happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut39 #-}+happyIn40 :: (CDeclSpec) -> (HappyAbsSyn )+happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn40 #-}+happyOut40 :: (HappyAbsSyn ) -> (CDeclSpec)+happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut40 #-}+happyIn41 :: (CStorageSpec) -> (HappyAbsSyn )+happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn41 #-}+happyOut41 :: (HappyAbsSyn ) -> (CStorageSpec)+happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut41 #-}+happyIn42 :: (CFunSpec) -> (HappyAbsSyn )+happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn42 #-}+happyOut42 :: (HappyAbsSyn ) -> (CFunSpec)+happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut42 #-}+happyIn43 :: (CAlignSpec) -> (HappyAbsSyn )+happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn43 #-}+happyOut43 :: (HappyAbsSyn ) -> (CAlignSpec)+happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut43 #-}+happyIn44 :: ([CDeclSpec]) -> (HappyAbsSyn )+happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn44 #-}+happyOut44 :: (HappyAbsSyn ) -> ([CDeclSpec])+happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut44 #-}+happyIn45 :: (CTypeSpec) -> (HappyAbsSyn )+happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn45 #-}+happyOut45 :: (HappyAbsSyn ) -> (CTypeSpec)+happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut45 #-}+happyIn46 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )+happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn46 #-}+happyOut46 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])+happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut46 #-}+happyIn47 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )+happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn47 #-}+happyOut47 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])+happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut47 #-}+happyIn48 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )+happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn48 #-}+happyOut48 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])+happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut48 #-}+happyIn49 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )+happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn49 #-}+happyOut49 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])+happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut49 #-}+happyIn50 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )+happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn50 #-}+happyOut50 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])+happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut50 #-}+happyIn51 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )+happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn51 #-}+happyOut51 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])+happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut51 #-}+happyIn52 :: (CTypeSpec) -> (HappyAbsSyn )+happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn52 #-}+happyOut52 :: (HappyAbsSyn ) -> (CTypeSpec)+happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut52 #-}+happyIn53 :: (CStructUnion) -> (HappyAbsSyn )+happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn53 #-}+happyOut53 :: (HappyAbsSyn ) -> (CStructUnion)+happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut53 #-}+happyIn54 :: (Located CStructTag) -> (HappyAbsSyn )+happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn54 #-}+happyOut54 :: (HappyAbsSyn ) -> (Located CStructTag)+happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut54 #-}+happyIn55 :: (Reversed [CDecl]) -> (HappyAbsSyn )+happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn55 #-}+happyOut55 :: (HappyAbsSyn ) -> (Reversed [CDecl])+happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut55 #-}+happyIn56 :: (CDecl) -> (HappyAbsSyn )+happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn56 #-}+happyOut56 :: (HappyAbsSyn ) -> (CDecl)+happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut56 #-}+happyIn57 :: (CDecl) -> (HappyAbsSyn )+happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn57 #-}+happyOut57 :: (HappyAbsSyn ) -> (CDecl)+happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut57 #-}+happyIn58 :: (CDecl) -> (HappyAbsSyn )+happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn58 #-}+happyOut58 :: (HappyAbsSyn ) -> (CDecl)+happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut58 #-}+happyIn59 :: ((Maybe CDeclr, Maybe CExpr)) -> (HappyAbsSyn )+happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn59 #-}+happyOut59 :: (HappyAbsSyn ) -> ((Maybe CDeclr, Maybe CExpr))+happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut59 #-}+happyIn60 :: ((Maybe CDeclr, Maybe CExpr)) -> (HappyAbsSyn )+happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn60 #-}+happyOut60 :: (HappyAbsSyn ) -> ((Maybe CDeclr, Maybe CExpr))+happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut60 #-}+happyIn61 :: (CEnum) -> (HappyAbsSyn )+happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn61 #-}+happyOut61 :: (HappyAbsSyn ) -> (CEnum)+happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut61 #-}+happyIn62 :: (Reversed [(Ident, Maybe CExpr)]) -> (HappyAbsSyn )+happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn62 #-}+happyOut62 :: (HappyAbsSyn ) -> (Reversed [(Ident, Maybe CExpr)])+happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut62 #-}+happyIn63 :: ((Ident, Maybe CExpr)) -> (HappyAbsSyn )+happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn63 #-}+happyOut63 :: (HappyAbsSyn ) -> ((Ident, Maybe CExpr))+happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut63 #-}+happyIn64 :: (CTypeQual) -> (HappyAbsSyn )+happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn64 #-}+happyOut64 :: (HappyAbsSyn ) -> (CTypeQual)+happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut64 #-}+happyIn65 :: (Reversed [CTypeQual]) -> (HappyAbsSyn )+happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn65 #-}+happyOut65 :: (HappyAbsSyn ) -> (Reversed [CTypeQual])+happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut65 #-}+happyIn66 :: (CDeclrR) -> (HappyAbsSyn )+happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn66 #-}+happyOut66 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut66 #-}+happyIn67 :: (Maybe CStrLit) -> (HappyAbsSyn )+happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn67 #-}+happyOut67 :: (HappyAbsSyn ) -> (Maybe CStrLit)+happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut67 #-}+happyIn68 :: (CDeclrR) -> (HappyAbsSyn )+happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn68 #-}+happyOut68 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut68 #-}+happyIn69 :: (CDeclrR) -> (HappyAbsSyn )+happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn69 #-}+happyOut69 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut69 #-}+happyIn70 :: (CDeclrR) -> (HappyAbsSyn )+happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn70 #-}+happyOut70 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut70 #-}+happyIn71 :: (CDeclrR) -> (HappyAbsSyn )+happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn71 #-}+happyOut71 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut71 #-}+happyIn72 :: (CDeclrR) -> (HappyAbsSyn )+happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn72 #-}+happyOut72 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut72 #-}+happyIn73 :: (CDeclrR) -> (HappyAbsSyn )+happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn73 #-}+happyOut73 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut73 #-}+happyIn74 :: (CDeclrR) -> (HappyAbsSyn )+happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn74 #-}+happyOut74 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut74 #-}+happyIn75 :: (CDeclrR) -> (HappyAbsSyn )+happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn75 #-}+happyOut75 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut75 #-}+happyIn76 :: (CDeclrR) -> (HappyAbsSyn )+happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn76 #-}+happyOut76 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut76 #-}+happyIn77 :: (CDeclrR) -> (HappyAbsSyn )+happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn77 #-}+happyOut77 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut77 #-}+happyIn78 :: (CDeclrR) -> (HappyAbsSyn )+happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn78 #-}+happyOut78 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut78 #-}+happyIn79 :: (CDeclr) -> (HappyAbsSyn )+happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn79 #-}+happyOut79 :: (HappyAbsSyn ) -> (CDeclr)+happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut79 #-}+happyIn80 :: (CDeclrR) -> (HappyAbsSyn )+happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn80 #-}+happyOut80 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut80 #-}+happyIn81 :: (CDeclrR) -> (HappyAbsSyn )+happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn81 #-}+happyOut81 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut81 #-}+happyIn82 :: (([CDecl], Bool)) -> (HappyAbsSyn )+happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn82 #-}+happyOut82 :: (HappyAbsSyn ) -> (([CDecl], Bool))+happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut82 #-}+happyIn83 :: (Reversed [CDecl]) -> (HappyAbsSyn )+happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn83 #-}+happyOut83 :: (HappyAbsSyn ) -> (Reversed [CDecl])+happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut83 #-}+happyIn84 :: (CDecl) -> (HappyAbsSyn )+happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn84 #-}+happyOut84 :: (HappyAbsSyn ) -> (CDecl)+happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut84 #-}+happyIn85 :: (Reversed [Ident]) -> (HappyAbsSyn )+happyIn85 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn85 #-}+happyOut85 :: (HappyAbsSyn ) -> (Reversed [Ident])+happyOut85 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut85 #-}+happyIn86 :: (CDecl) -> (HappyAbsSyn )+happyIn86 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn86 #-}+happyOut86 :: (HappyAbsSyn ) -> (CDecl)+happyOut86 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut86 #-}+happyIn87 :: (CDeclrR) -> (HappyAbsSyn )+happyIn87 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn87 #-}+happyOut87 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut87 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut87 #-}+happyIn88 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )+happyIn88 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn88 #-}+happyOut88 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)+happyOut88 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut88 #-}+happyIn89 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )+happyIn89 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn89 #-}+happyOut89 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)+happyOut89 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut89 #-}+happyIn90 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )+happyIn90 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn90 #-}+happyOut90 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)+happyOut90 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut90 #-}+happyIn91 :: (CDeclrR) -> (HappyAbsSyn )+happyIn91 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn91 #-}+happyOut91 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut91 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut91 #-}+happyIn92 :: (CDeclrR) -> (HappyAbsSyn )+happyIn92 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn92 #-}+happyOut92 :: (HappyAbsSyn ) -> (CDeclrR)+happyOut92 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut92 #-}+happyIn93 :: (CInit) -> (HappyAbsSyn )+happyIn93 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn93 #-}+happyOut93 :: (HappyAbsSyn ) -> (CInit)+happyOut93 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut93 #-}+happyIn94 :: (Maybe CInit) -> (HappyAbsSyn )+happyIn94 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn94 #-}+happyOut94 :: (HappyAbsSyn ) -> (Maybe CInit)+happyOut94 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut94 #-}+happyIn95 :: (Reversed CInitList) -> (HappyAbsSyn )+happyIn95 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn95 #-}+happyOut95 :: (HappyAbsSyn ) -> (Reversed CInitList)+happyOut95 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut95 #-}+happyIn96 :: ([CDesignator]) -> (HappyAbsSyn )+happyIn96 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn96 #-}+happyOut96 :: (HappyAbsSyn ) -> ([CDesignator])+happyOut96 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut96 #-}+happyIn97 :: (Reversed [CDesignator]) -> (HappyAbsSyn )+happyIn97 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn97 #-}+happyOut97 :: (HappyAbsSyn ) -> (Reversed [CDesignator])+happyOut97 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut97 #-}+happyIn98 :: (CDesignator) -> (HappyAbsSyn )+happyIn98 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn98 #-}+happyOut98 :: (HappyAbsSyn ) -> (CDesignator)+happyOut98 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut98 #-}+happyIn99 :: (CDesignator) -> (HappyAbsSyn )+happyIn99 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn99 #-}+happyOut99 :: (HappyAbsSyn ) -> (CDesignator)+happyOut99 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut99 #-}+happyIn100 :: (CExpr) -> (HappyAbsSyn )+happyIn100 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn100 #-}+happyOut100 :: (HappyAbsSyn ) -> (CExpr)+happyOut100 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut100 #-}+happyIn101 :: (Reversed [(Maybe CDecl, CExpr)]) -> (HappyAbsSyn )+happyIn101 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn101 #-}+happyOut101 :: (HappyAbsSyn ) -> (Reversed [(Maybe CDecl, CExpr)])+happyOut101 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut101 #-}+happyIn102 :: ((Maybe CDecl, CExpr)) -> (HappyAbsSyn )+happyIn102 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn102 #-}+happyOut102 :: (HappyAbsSyn ) -> ((Maybe CDecl, CExpr))+happyOut102 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut102 #-}+happyIn103 :: (Reversed [CDesignator]) -> (HappyAbsSyn )+happyIn103 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn103 #-}+happyOut103 :: (HappyAbsSyn ) -> (Reversed [CDesignator])+happyOut103 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut103 #-}+happyIn104 :: (CExpr) -> (HappyAbsSyn )+happyIn104 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn104 #-}+happyOut104 :: (HappyAbsSyn ) -> (CExpr)+happyOut104 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut104 #-}+happyIn105 :: (Reversed [CExpr]) -> (HappyAbsSyn )+happyIn105 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn105 #-}+happyOut105 :: (HappyAbsSyn ) -> (Reversed [CExpr])+happyOut105 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut105 #-}+happyIn106 :: (CExpr) -> (HappyAbsSyn )+happyIn106 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn106 #-}+happyOut106 :: (HappyAbsSyn ) -> (CExpr)+happyOut106 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut106 #-}+happyIn107 :: (Located CUnaryOp) -> (HappyAbsSyn )+happyIn107 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn107 #-}+happyOut107 :: (HappyAbsSyn ) -> (Located CUnaryOp)+happyOut107 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut107 #-}+happyIn108 :: (CExpr) -> (HappyAbsSyn )+happyIn108 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn108 #-}+happyOut108 :: (HappyAbsSyn ) -> (CExpr)+happyOut108 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut108 #-}+happyIn109 :: (CExpr) -> (HappyAbsSyn )+happyIn109 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn109 #-}+happyOut109 :: (HappyAbsSyn ) -> (CExpr)+happyOut109 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut109 #-}+happyIn110 :: (CExpr) -> (HappyAbsSyn )+happyIn110 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn110 #-}+happyOut110 :: (HappyAbsSyn ) -> (CExpr)+happyOut110 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut110 #-}+happyIn111 :: (CExpr) -> (HappyAbsSyn )+happyIn111 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn111 #-}+happyOut111 :: (HappyAbsSyn ) -> (CExpr)+happyOut111 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut111 #-}+happyIn112 :: (CExpr) -> (HappyAbsSyn )+happyIn112 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn112 #-}+happyOut112 :: (HappyAbsSyn ) -> (CExpr)+happyOut112 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut112 #-}+happyIn113 :: (CExpr) -> (HappyAbsSyn )+happyIn113 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn113 #-}+happyOut113 :: (HappyAbsSyn ) -> (CExpr)+happyOut113 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut113 #-}+happyIn114 :: (CExpr) -> (HappyAbsSyn )+happyIn114 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn114 #-}+happyOut114 :: (HappyAbsSyn ) -> (CExpr)+happyOut114 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut114 #-}+happyIn115 :: (CExpr) -> (HappyAbsSyn )+happyIn115 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn115 #-}+happyOut115 :: (HappyAbsSyn ) -> (CExpr)+happyOut115 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut115 #-}+happyIn116 :: (CExpr) -> (HappyAbsSyn )+happyIn116 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn116 #-}+happyOut116 :: (HappyAbsSyn ) -> (CExpr)+happyOut116 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut116 #-}+happyIn117 :: (CExpr) -> (HappyAbsSyn )+happyIn117 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn117 #-}+happyOut117 :: (HappyAbsSyn ) -> (CExpr)+happyOut117 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut117 #-}+happyIn118 :: (CExpr) -> (HappyAbsSyn )+happyIn118 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn118 #-}+happyOut118 :: (HappyAbsSyn ) -> (CExpr)+happyOut118 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut118 #-}+happyIn119 :: (CExpr) -> (HappyAbsSyn )+happyIn119 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn119 #-}+happyOut119 :: (HappyAbsSyn ) -> (CExpr)+happyOut119 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut119 #-}+happyIn120 :: (CExpr) -> (HappyAbsSyn )+happyIn120 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn120 #-}+happyOut120 :: (HappyAbsSyn ) -> (CExpr)+happyOut120 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut120 #-}+happyIn121 :: (Located CAssignOp) -> (HappyAbsSyn )+happyIn121 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn121 #-}+happyOut121 :: (HappyAbsSyn ) -> (Located CAssignOp)+happyOut121 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut121 #-}+happyIn122 :: (CExpr) -> (HappyAbsSyn )+happyIn122 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn122 #-}+happyOut122 :: (HappyAbsSyn ) -> (CExpr)+happyOut122 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut122 #-}+happyIn123 :: (Reversed [CExpr]) -> (HappyAbsSyn )+happyIn123 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn123 #-}+happyOut123 :: (HappyAbsSyn ) -> (Reversed [CExpr])+happyOut123 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut123 #-}+happyIn124 :: (Maybe CExpr) -> (HappyAbsSyn )+happyIn124 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn124 #-}+happyOut124 :: (HappyAbsSyn ) -> (Maybe CExpr)+happyOut124 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut124 #-}+happyIn125 :: (Maybe CExpr) -> (HappyAbsSyn )+happyIn125 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn125 #-}+happyOut125 :: (HappyAbsSyn ) -> (Maybe CExpr)+happyOut125 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut125 #-}+happyIn126 :: (CExpr) -> (HappyAbsSyn )+happyIn126 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn126 #-}+happyOut126 :: (HappyAbsSyn ) -> (CExpr)+happyOut126 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut126 #-}+happyIn127 :: (CConst) -> (HappyAbsSyn )+happyIn127 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn127 #-}+happyOut127 :: (HappyAbsSyn ) -> (CConst)+happyOut127 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut127 #-}+happyIn128 :: (CStrLit) -> (HappyAbsSyn )+happyIn128 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn128 #-}+happyOut128 :: (HappyAbsSyn ) -> (CStrLit)+happyOut128 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut128 #-}+happyIn129 :: (Reversed [CString]) -> (HappyAbsSyn )+happyIn129 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn129 #-}+happyOut129 :: (HappyAbsSyn ) -> (Reversed [CString])+happyOut129 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut129 #-}+happyIn130 :: (ClangCVersion) -> (HappyAbsSyn )+happyIn130 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn130 #-}+happyOut130 :: (HappyAbsSyn ) -> (ClangCVersion)+happyOut130 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut130 #-}+happyIn131 :: (Ident) -> (HappyAbsSyn )+happyIn131 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn131 #-}+happyOut131 :: (HappyAbsSyn ) -> (Ident)+happyOut131 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut131 #-}+happyIn132 :: ([CAttr]) -> (HappyAbsSyn )+happyIn132 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn132 #-}+happyOut132 :: (HappyAbsSyn ) -> ([CAttr])+happyOut132 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut132 #-}+happyIn133 :: ([CAttr]) -> (HappyAbsSyn )+happyIn133 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn133 #-}+happyOut133 :: (HappyAbsSyn ) -> ([CAttr])+happyOut133 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut133 #-}+happyIn134 :: ([CAttr]) -> (HappyAbsSyn )+happyIn134 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn134 #-}+happyOut134 :: (HappyAbsSyn ) -> ([CAttr])+happyOut134 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut134 #-}+happyIn135 :: (Reversed [CAttr]) -> (HappyAbsSyn )+happyIn135 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn135 #-}+happyOut135 :: (HappyAbsSyn ) -> (Reversed [CAttr])+happyOut135 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut135 #-}+happyIn136 :: (Maybe CAttr) -> (HappyAbsSyn )+happyIn136 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn136 #-}+happyOut136 :: (HappyAbsSyn ) -> (Maybe CAttr)+happyOut136 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut136 #-}+happyIn137 :: (Reversed [CExpr]) -> (HappyAbsSyn )+happyIn137 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn137 #-}+happyOut137 :: (HappyAbsSyn ) -> (Reversed [CExpr])+happyOut137 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut137 #-}+happyInTok :: (CToken) -> (HappyAbsSyn )+happyInTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyInTok #-}+happyOutTok :: (HappyAbsSyn ) -> (CToken)+happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOutTok #-}+++happyExpList :: HappyAddr+happyExpList = HappyA# "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x00\x80\x56\xd2\xff\xf0\x92\xdd\x0f\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe0\x4f\x00\x02\x00\x26\x95\x06\x80\x07\x20\x11\xf0\xf7\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xf0\x27\x00\x01\x00\x10\x00\x00\x80\x00\x80\x00\xf0\xf9\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x01\x00\x00\x40\x68\x25\xfd\x0f\x2f\xd9\xfd\xc0\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xff\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x40\x00\x00\x00\x02\x00\x02\xc0\xe7\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe0\x4f\x00\x02\x00\x24\x28\xa9\x7f\x71\xc0\x49\xe7\xff\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xfc\x09\x40\x00\x00\x04\x00\x00\x20\x00\x20\x00\x7c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xfe\x04\x20\x00\x00\x02\x00\x00\x10\x00\x10\x00\x3e\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf8\x13\x80\x00\x00\x08\x00\x00\x40\x00\x40\x00\xf8\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xfe\x04\x20\x00\x00\x02\x00\x00\x10\x00\x10\x00\x3e\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf8\x13\x80\x00\x00\x08\x00\x00\x40\x00\x40\x00\xf8\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xfc\x09\x40\x00\x00\x04\x00\x00\x20\x00\x20\x00\x7c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xfe\x04\x20\x00\x00\x02\x00\x00\x10\x00\x10\x00\x3e\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x02\x00\x00\xb0\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x40\x00\x00\x00\x02\x00\x02\xc0\xe7\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf8\x13\x80\x00\x80\x49\xa5\x01\xe0\x01\x48\x04\xfc\xfd\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x3f\x01\x08\x00\x80\x00\x00\x00\x04\x00\x04\x80\xcf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x02\x00\x00\x00\xb0\x5a\xfa\x1f\xde\xb7\xfa\x83\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\xb5\xe4\x3f\xbc\x6f\x51\x07\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x5a\xf2\x1f\x9c\xb7\xa8\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x58\x08\x08\x00\xe1\x43\x14\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x28\x04\x04\x00\xe0\x21\x8a\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x02\x02\x40\xf8\x10\x45\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x01\x00\x78\x88\x22\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x01\x00\x00\x00\x58\x2d\xfd\x0f\xef\x5b\xfd\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x08\x00\x00\xc0\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x80\x00\x00\x00\x00\xa4\x92\xfe\x87\x97\xac\x7e\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x40\x00\x00\x00\x00\x5a\x49\xff\xc3\x4b\x76\x3f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xf0\x27\x00\x01\x00\x10\x94\xd4\xbf\x38\xe0\xa4\xf3\xff\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf8\x13\x80\x00\x00\x08\x00\x00\x40\x00\x40\x00\xf8\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x3f\x01\x08\x00\x80\xa0\xa4\xfe\xc5\x01\x27\x9d\xff\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x00\x00\x81\x00\x00\x00\x2c\x00\x10\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x54\xd2\xff\xf0\x92\xdd\x0f\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x25\xfd\x0f\x2f\x59\xfd\xc0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xfe\x04\x20\x00\x00\x02\x00\x00\x10\x00\x30\x00\xbe\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x80\x00\x00\x00\x00\xac\x96\xfe\x87\xf7\xad\xfe\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x7f\x02\x10\x00\x00\x01\x00\x00\x08\x00\x08\x00\x9f\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x3f\x01\x08\x00\x80\x00\x00\x00\x04\x00\x04\x80\xcf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xf0\x27\x00\x01\x00\x10\x00\x00\x80\x00\x80\x00\xf0\xf9\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xfc\x09\x40\x00\x00\x04\x00\x00\x20\x00\x20\x00\x7c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x7f\x02\x10\x00\x00\x01\x00\x00\x08\x00\x08\x00\x9f\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x4c\x2a\x0d\x00\x0f\x40\x22\xe0\xef\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf8\x13\x80\x00\x00\x08\x00\x00\x40\x00\x40\x00\xf8\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\xf5\x0f\x0e\x18\xe9\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x92\xfa\x07\x07\x8c\x74\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x7f\x02\x10\x00\x00\x01\x00\x00\x08\x00\x08\x00\x9f\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x48\x50\x52\xff\xe2\x80\x93\xce\xff\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x7f\x02\x10\x00\x20\x41\x49\xfd\x8b\x03\x4e\x3a\xff\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x3f\x01\x08\x00\x80\x00\x00\x00\x04\x00\x04\x80\xcf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe0\x4f\x00\x02\x00\x24\x28\xa9\x7f\x71\xc0\x49\xe7\xff\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x25\xfe\xc1\x59\x03\x38\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x2c\x00\x10\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x40\x00\x00\x00\x16\x00\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x01\x04\x00\x00\x00\x40\xb4\xd4\x3f\x38\x6b\xa4\x07\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x92\xfa\x07\x07\x8c\x74\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x7f\x02\x10\x00\x00\x01\x00\x00\x08\x00\x08\x00\x9f\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x3f\x01\x08\x00\x80\x00\x00\x00\x04\x00\x04\x80\xcf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x24\x00\x40\x00\x00\x00\x02\x00\x02\xc0\xe7\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe0\x4f\x00\x02\x00\x20\x00\x00\x00\x01\x00\x01\xe0\xf3\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xf0\x27\x00\x01\x00\x10\x00\x00\x80\x00\x80\x00\xf0\xf9\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf8\x13\x80\x00\x00\x08\x00\x00\x40\x00\x40\x00\xf8\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xfc\x09\x40\x00\x00\x04\x00\x00\x20\x00\x20\x00\x7c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xfe\x04\x20\x00\x00\x02\x00\x00\x10\x00\x10\x00\x3e\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x7f\x02\x10\x00\x00\x01\x00\x00\x08\x00\x08\x00\x9f\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x3f\x01\x08\x00\x80\x00\x00\x00\x04\x00\x04\x80\xcf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x40\x00\x00\x00\x02\x00\x02\xc0\xe7\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe0\x4f\x00\x02\x00\x20\x00\x00\x00\x01\x00\x01\xe0\xf3\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xf0\x27\x00\x01\x00\x10\x00\x00\x80\x00\x80\x00\xf0\xf9\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf8\x13\x80\x00\x00\x08\x00\x00\x40\x00\x40\x00\xf8\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xfc\x09\x40\x00\x00\x04\x00\x00\x20\x00\x20\x00\x7c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xfe\x04\x20\x00\x00\x02\x00\x00\x10\x00\x10\x00\x3e\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x7f\x02\x10\x00\x00\x01\x00\x00\x08\x00\x08\x00\x9f\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x3f\x01\x08\x00\x80\x00\x00\x00\x04\x00\x04\x80\xcf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x40\x00\x00\x00\x02\x00\x02\xc0\xe7\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe0\x4f\x00\x02\x00\x20\x00\x00\x00\x01\x00\x01\xe0\xf3\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf8\x13\x80\x00\x00\x08\x00\x00\x40\x00\x40\x00\xf8\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x3f\x01\x08\x00\x80\x00\x00\x00\x04\x00\x04\x80\xcf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x40\x00\x00\x00\x02\x00\x02\xc0\xe7\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x40\x00\x00\x00\x02\x00\x02\xc0\xe7\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xfe\x04\x20\x00\x40\x02\x00\x00\x10\x00\x10\x00\x3e\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xb4\xd4\x3f\x38\x6b\xa4\x07\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x01\x00\x00\x00\x48\x25\xfd\x0f\x2f\x59\xfd\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe0\x4f\x00\x02\x00\x26\x95\x06\x80\x07\x20\x11\xf0\xf7\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xf0\x27\x00\x01\x00\xb3\xdf\xf7\xff\xbf\xf4\xff\xfb\xff\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x7f\x02\x10\x00\x30\xa9\x34\x00\x3c\x00\x89\x80\xbf\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x3f\x01\x08\x00\x80\x00\x00\x00\x04\x00\x04\x80\xcf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x95\xf4\x3f\xbc\x64\xf7\x03\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x48\x25\xfd\x0f\x2f\xd9\xfd\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe0\x4f\x00\x02\x00\x20\x28\xa9\x7f\x71\xc0\x49\xe7\xff\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x95\xf4\x3f\xbc\x64\xf7\x03\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x49\xff\xc3\x4b\x56\x3f\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x20\x00\x00\x00\x00\x02\x01\x00\x00\x58\x00\x20\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x95\xf4\x3f\xbc\x64\xf7\x03\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x3f\x01\x08\x00\x80\xa0\xa4\xfe\xc5\x01\x27\x9d\xff\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x2a\xe9\x7f\x78\xc9\xee\x07\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xfc\x09\x40\x00\x00\x14\x08\x00\x20\xc0\x22\x00\x7d\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x3f\x01\x08\x00\x80\x00\x00\x00\x04\x00\x04\x80\xef\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x02\x00\x00\x00\xb0\x5a\xfa\x1f\xde\xb7\xfa\x83\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x04\x04\x80\xf0\x21\x8a\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x02\x02\x00\xf0\x10\x45\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x20\x00\x00\x00\x00\xab\xa5\xff\xe1\x7d\xab\x3f\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x25\xfd\x0f\x2f\x59\xfd\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x04\x00\x00\x00\x60\xb5\xf4\x3f\xbc\x6f\xf5\x07\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x01\x00\x00\x00\x58\x2d\xfd\x0f\xef\x5b\xfd\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x80\x00\x00\x00\x00\xa4\x92\xfe\x87\x97\xac\x7e\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x7f\x02\x10\x00\x00\x41\x49\xfd\x8b\x03\x4e\x3a\xff\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xa9\xa4\xff\xe1\x25\xbb\x1f\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x80\x00\x00\x00\x00\x08\x04\x00\x00\x60\x01\x80\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x00\x00\x81\x00\x00\x00\x2c\x00\x10\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xfe\x04\x20\x00\x40\x02\x00\x00\x10\x00\x10\x00\x3e\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x02\x00\x00\x00\xb0\x5a\xfa\x1f\xde\xb7\xfa\x83\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x95\xf4\x3f\xbc\x64\xf5\x03\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x4b\xff\xc3\xfb\x56\x7f\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x10\x00\x00\x00\x80\x54\xd2\xff\xf0\x92\xd5\x0f\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x80\x00\x00\x00\x00\xa4\x92\xfe\x87\x97\xac\x7e\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x08\x00\x00\xc0\x02\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xfe\x04\x20\x00\x00\x0a\x04\x00\x10\x60\x11\x80\x3e\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xfc\x09\x40\x00\x00\x14\x08\x00\x20\xc0\x22\x00\x7d\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x40\x50\x52\xff\xe2\x80\x93\xce\xff\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x2a\xe9\x7f\x78\xc9\xee\x07\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x40\x49\xfd\x83\x03\x46\x3a\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x80\x00\x00\x00\x00\x08\x04\x00\x00\x60\x01\x80\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe0\x4f\x00\x02\x00\x26\x95\x06\x80\x07\x20\x11\xf0\xf7\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xf0\x27\x00\x01\x00\x93\x4a\x03\xc0\x03\x90\x08\xf8\xfb\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf8\x13\x80\x00\x80\x49\xa5\x01\xe0\x01\x48\x04\xfc\xfd\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xfe\x04\x20\x00\x00\x02\x00\x00\x10\x00\x10\x00\x3e\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x7f\x02\x10\x00\x00\x01\x00\x00\x08\x00\x08\x00\x9f\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x3f\x01\x08\x00\x80\x00\x00\x00\x04\x00\x04\x80\xcf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xfc\x09\x40\x00\xc0\xec\xf7\xfd\xff\x2f\xfd\xff\xfe\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x80\x00\x00\x00\x00\xac\x96\xfe\x87\xf7\xad\xfe\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x20\x00\x00\x00\x00\xab\xa5\xff\xe1\x7d\xab\x3f\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe0\x4f\x00\x02\x00\x60\x2a\xe9\x7f\x79\xc9\xef\xe7\xff\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\xea\x1f\x1c\x30\xd2\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\xf5\x0f\x0e\x18\xe9\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x49\xfd\x83\x03\x46\x3a\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\xab\x7f\x70\xc0\x48\x07\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x02\x00\x00\x00\x20\x10\x00\x00\x80\x05\x00\x02\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02\x08\x00\x00\x00\x40\x2a\xe9\x7f\x78\xc9\xea\x07\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\xfe\x09\x40\x00\x80\x04\x00\x00\x20\x00\x20\x00\xfc\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xfe\x04\x20\x00\x00\x02\x00\x00\x10\x00\x10\x00\x3e\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x3f\x01\x08\x00\x80\x00\x00\x00\x04\x00\x04\x80\xcf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe0\x4f\x00\x02\x00\x20\x00\x00\x00\x01\x00\x01\xe0\xf3\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x48\x00\x00\x00\x02\x00\x02\xc0\xe7\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x7f\x02\x10\x00\x00\x01\x00\x00\x08\x00\x08\x00\x9f\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x9f\x00\x04\x00\x48\x00\x00\x00\x02\x00\x02\xc0\xef\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x20\x00\x00\x00\x0b\x00\x04\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x40\x00\x00\x00\x00\x56\x4b\xff\xc3\xfb\x56\x7f\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x4c\x2a\x0d\x00\x0f\x40\x22\xe0\xef\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x01\x00\x00\x00\x10\x08\x00\x00\xc0\x02\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\xa0\xa4\xfe\xc1\x01\x23\x1d\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x2d\xf5\x0f\xce\x1a\xe9\x81\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x80\x00\x00\x01\x00\x80\x92\xfa\x07\x07\x8c\x74\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x52\xff\xe0\x80\x91\x0e\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x40\x00\x00\x00\x02\x00\x02\xc0\xe7\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x01\x00\x00\x00\x10\x08\x00\x00\xc0\x02\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x40\x00\x00\x00\x00\x52\x49\xff\xc3\x4b\x56\x3f\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02\x08\x00\x00\x00\x80\x40\x00\x00\x00\x16\x00\x08\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x02\x00\x00\x00\x90\x4a\xfa\x1f\x5e\xb2\xfa\x81\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x00\x00\x81\x00\x00\x00\x2c\x00\x10\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf8\x13\x80\x00\x00\x08\x00\x00\x40\x00\x40\x00\xf8\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x3f\x01\x08\x00\x80\x00\x00\x00\x04\x00\x04\x80\xcf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xfc\x09\x40\x00\x00\x04\x00\x00\x20\x00\x20\x00\x7c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x00\x00\x81\x00\x00\x00\x2c\x00\x10\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x08\x00\x00\x00\x80\x40\x00\x00\x00\x16\x00\x08\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xfe\x04\x20\x00\x00\x02\x00\x00\x10\x00\x10\x00\x3e\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x7f\x02\x10\x00\x00\x01\x00\x00\x08\x00\x08\x00\x9f\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x20\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x52\xff\xe0\xac\x91\x1e\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x3f\x01\x08\x00\x80\x00\x00\x00\x04\x00\x04\x80\xcf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x04\x00\x00\x00\x40\x20\x00\x00\x00\x0b\x00\x04\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x4c\x2a\x0d\x00\x0f\x40\x22\xe0\xef\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xe0\x4f\x00\x02\x00\x20\x00\x00\x00\x01\x00\x01\xe0\xf3\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xf0\x27\x00\x01\x00\x10\x00\x00\x80\x00\x80\x00\xf0\xf9\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xfe\x04\x20\x00\x00\x02\x00\x00\x10\x00\x10\x00\x3e\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x40\x00\x00\x00\x02\x00\x02\xc0\xe7\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\xd5\x3f\x38\x60\xa4\x03\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf8\x13\x80\x00\x00\x08\x00\x00\x40\x00\x40\x00\xf8\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x9f\x00\x04\x00\x58\x00\x00\x00\x02\x00\x02\xc0\xef\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf8\x13\x80\x00\x00\x09\x00\x00\x40\x00\x40\x00\xf8\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x7f\x02\x10\x00\x00\x01\x00\x00\x08\x00\x08\x00\x9f\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\x3f\x01\x08\x00\xb0\x00\x00\x00\x04\x00\x04\x80\xdf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xf0\x27\x00\x01\x00\x10\x00\x00\x80\x00\x80\x00\xf0\xf9\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xfc\x09\x40\x00\x00\x04\x00\x00\x20\x00\x20\x00\x7c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x40\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x20\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\xf0\x27\x00\x01\x00\x10\x00\x00\x80\x00\x80\x00\xf0\xf9\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf8\x13\x80\x00\x00\x08\x00\x00\x40\x00\x40\x00\xf8\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xfc\x09\x40\x00\x00\x04\x00\x00\x20\x00\x20\x00\x7c\xfe\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xff\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x3f\x01\x08\x00\x98\x54\x1a\x00\x1e\x80\x44\xc0\xdf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x9f\x00\x04\x00\x4c\x2a\x0d\x00\x0f\x40\x22\xe0\xef\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xfc\x09\x40\x00\x00\x04\x00\x00\x20\x00\x20\x00\x7c\xfe\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xf8\x13\x80\x00\x00\x08\x00\x00\x40\x00\x40\x00\xf8\xfc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xfc\x09\x40\x00\x00\x04\x00\x00\x20\x00\x20\x00\x7c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++{-# NOINLINE happyExpListPerState #-}+happyExpListPerState st =+ token_strs_expected+ where token_strs = ["error","%dummy","%start_translation_unit","%start_external_declaration","%start_statement","%start_expression","translation_unit","ext_decl_list","external_declaration","function_definition","function_declarator","statement","labeled_statement","compound_statement","enter_scope","leave_scope","block_item_list","block_item","nested_declaration","nested_function_definition","label_declarations","expression_statement","selection_statement","iteration_statement","jump_statement","asm_statement","maybe_type_qualifier","asm_operands","nonnull_asm_operands","asm_operand","asm_clobbers","declaration","declaration_list","default_declaring_list","asm_attrs_opt","declaring_list","declaration_specifier","declaration_qualifier_list","declaration_qualifier","declaration_qualifier_without_types","storage_class","function_specifier","alignment_specifier","type_specifier","basic_type_name","basic_declaration_specifier","basic_type_specifier","sue_declaration_specifier","sue_type_specifier","typedef_declaration_specifier","typedef_type_specifier","elaborated_type_name","struct_or_union_specifier","struct_or_union","struct_declaration_list","struct_declaration","struct_default_declaring_list","struct_declaring_list","struct_declarator","struct_identifier_declarator","enum_specifier","enumerator_list","enumerator","type_qualifier","type_qualifier_list","declarator","asm_opt","typedef_declarator","parameter_typedef_declarator","clean_typedef_declarator","clean_postfix_typedef_declarator","paren_typedef_declarator","paren_postfix_typedef_declarator","simple_paren_typedef_declarator","identifier_declarator","unary_identifier_declarator","postfix_identifier_declarator","paren_identifier_declarator","function_declarator_old","old_function_declarator","postfix_old_function_declarator","parameter_type_list","parameter_list","parameter_declaration","identifier_list","type_name","abstract_declarator","postfixing_abstract_declarator","array_abstract_declarator","postfix_array_abstract_declarator","unary_abstract_declarator","postfix_abstract_declarator","initializer","initializer_opt","initializer_list","designation","designator_list","designator","array_designator","primary_expression","generic_assoc_list","generic_assoc","offsetof_member_designator","postfix_expression","argument_expression_list","unary_expression","unary_operator","cast_expression","multiplicative_expression","additive_expression","shift_expression","relational_expression","equality_expression","and_expression","exclusive_or_expression","inclusive_or_expression","logical_and_expression","logical_or_expression","conditional_expression","assignment_expression","assignment_operator","expression","comma_expression","expression_opt","assignment_expression_opt","constant_expression","constant","string_literal","string_literal_list","clang_version_literal","identifier","attrs_opt","attrs","attr","attribute_list","attribute","attribute_params","'('","')'","'['","']'","\"->\"","'.'","'!'","'~'","\"++\"","\"--\"","'+'","'-'","'*'","'/'","'%'","'&'","\"<<\"","\">>\"","'<'","\"<=\"","'>'","\">=\"","\"==\"","\"!=\"","'^'","'|'","\"&&\"","\"||\"","'?'","':'","'='","\"+=\"","\"-=\"","\"*=\"","\"/=\"","\"%=\"","\"&=\"","\"^=\"","\"|=\"","\"<<=\"","\">>=\"","','","';'","'{'","'}'","\"...\"","alignof","alignas","\"_Atomic\"","asm","auto","break","\"_Bool\"","case","char","const","continue","\"_Complex\"","default","do","double","else","enum","extern","float","\"_Float32\"","\"_Float32x\"","\"_Float64\"","\"_Float64x\"","\"_Float128\"","\"_Float128x\"","\"__float128\"","for","\"_Generic\"","goto","if","inline","int","\"__int128\"","long","\"__label__\"","\"_Noreturn\"","\"_Nullable\"","\"_Nonnull\"","register","restrict","return","short","signed","sizeof","static","\"_Static_assert\"","struct","switch","typedef","typeof","\"__thread\"","union","unsigned","void","volatile","while","cchar","cint","cfloat","cstr","ident","tyident","\"__attribute__\"","\"__extension__\"","\"__real__\"","\"__imag__\"","\"__builtin_va_arg\"","\"__builtin_offsetof\"","\"__builtin_types_compatible_p\"","\"__builtin_convertvector\"","clangcversion","%eof"]+ bit_start = st * 255+ bit_end = (st + 1) * 255+ read_bit = readArrayBit happyExpList+ bits = map read_bit [bit_start..bit_end - 1]+ bits_indexed = zip bits [0..254]+ token_strs_expected = concatMap f bits_indexed+ f (False, _) = []+ f (True, nr) = [token_strs !! nr]++happyActOffsets :: HappyAddr+happyActOffsets = HappyA# "\x00\x00\x23\x10\xf6\x09\xd0\x0e\x00\x00\xff\x06\x00\x00\x0c\x03\x36\x16\xd0\x0e\x00\x00\x06\x02\xa4\x00\xbb\x00\x29\x04\x7d\x02\x32\x00\x71\x00\x01\x00\x8e\x00\xbf\x01\x00\x00\x98\x00\x70\x00\x00\x00\x00\x00\x0e\x09\x00\x00\x00\x00\xfc\x0e\xfc\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x34\x02\x18\x0f\xfc\x00\x44\x0f\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x8c\x0f\xb8\x0f\xb8\x0f\x49\x01\x6b\x01\x75\x01\x8c\x01\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x01\xc2\x00\x00\x00\x00\x00\xf4\x04\x6a\x01\xd4\x0f\x87\x01\xa0\x01\xf6\x09\xcc\x01\x23\x00\xee\x01\xd4\x0f\xf7\x01\x00\x02\xfb\x01\x00\x00\xdf\x01\x00\x00\x17\x02\x00\x00\x07\x03\x19\x03\x2f\x01\xc1\x11\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x01\x00\x00\x4a\x1e\x21\x1f\x62\x1c\x88\x1c\xf2\x1e\x5f\x20\x00\x00\x00\x00\x05\x02\x00\x00\x0b\x12\x00\x00\x00\x00\x00\x00\x3e\x02\x00\x00\x00\x00\x00\x00\xf4\x04\x55\x15\x00\x00\x06\x01\x06\x01\x5a\x02\x77\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x02\x00\x00\x00\x00\x99\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x02\x23\x10\x39\x02\x00\x00\xb6\x02\x82\x09\xd4\x0f\x4d\x01\x61\x02\x68\x02\x82\x09\x96\x16\x00\x00\x00\x00\x07\x01\xd5\x02\xab\x03\xdc\x02\x07\x01\xb4\x02\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\xe1\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x1c\x00\x00\xe6\x02\x00\x00\x52\x1d\x96\x0a\xc2\x02\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x55\x12\xef\x02\x00\x00\xcf\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x02\xde\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x02\x00\x00\x03\x00\x07\x00\x63\x02\xdb\x02\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x2d\x03\x00\x00\xe7\x02\x0b\x03\x00\x00\xcc\x02\x00\x00\xcc\x02\x00\x00\x00\x00\xd4\x0f\xd4\x0f\x00\x00\x10\x03\xd4\x0f\x1b\x03\xd4\x0f\x00\x00\x26\x08\xf6\x02\xf6\x09\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00\x5d\x03\x00\x00\x0f\x03\x00\x03\x00\x00\xd4\x0f\xf7\x20\xf7\x20\xd4\x0f\x00\x00\x0e\x09\x00\x00\x00\x00\xf9\x02\x00\x00\x00\x00\x0e\x09\xd4\x0f\x00\x00\x0e\x09\x00\x00\x00\x00\x00\x00\x82\x03\x19\x02\x36\x20\x04\x0f\x04\x0f\x30\x16\x84\x03\x87\x03\x28\x21\xd4\x0f\xd4\x0f\x6a\x0d\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\xd4\x0f\x00\x00\xd4\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x0d\xd4\x0f\xfc\x02\xfc\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x03\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x03\xa6\x03\x9a\x03\x9a\x03\xb4\x03\xb4\x03\xb4\x03\xb4\x03\x29\x04\x29\x04\xd0\x03\x7e\x03\x7d\x03\x97\x03\x7a\x03\xd4\x0f\x8d\x03\x00\x00\x90\x03\x00\x00\xe5\x0d\x00\x00\x00\x00\x00\x00\x50\x03\x52\x1f\x8b\x1f\xae\x12\x48\x07\x00\x00\x00\x00\xed\x03\xb5\x03\xef\x03\x00\x00\xf1\x03\xba\x03\xd2\x03\xe9\x03\xeb\x03\xf6\x09\xb2\x07\x01\x04\xae\x03\xc0\x03\xf6\x09\xd4\x0f\x00\x00\x39\x04\x81\x1e\x33\x04\x38\x04\x00\x00\x63\x04\x00\x00\x67\x04\x7e\x04\x4a\x01\x55\x01\xbc\x1c\x65\x04\x15\x04\x8b\x04\x00\x00\x82\x09\xbc\x1c\x6f\x04\x00\x00\x00\x00\x90\x1d\xea\x0a\x00\x00\x00\x00\x3f\x00\x4a\x00\x90\x04\xa0\x04\x63\x02\x0a\x01\x4a\x00\x00\x00\xbc\x1c\x86\x04\x00\x00\x7f\x04\x00\x00\x82\x09\x8a\x04\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\xc9\x04\x00\x00\xbc\x1c\xad\x04\x00\x00\x0a\x0b\x00\x00\xcc\x04\xf2\x0b\x1b\x00\x7a\x04\xc7\x00\x6c\x10\xc7\x00\xf2\x1e\x5f\x20\xc5\x10\xec\x04\xcb\x04\x00\x00\x10\x00\xbc\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x55\x01\xf8\x12\x55\x01\x42\x13\x9e\x15\x82\x09\xbc\x1c\xd4\x04\x00\x00\xf7\x04\x25\x04\x29\x01\x29\x01\x63\x02\x00\x00\x63\x02\x00\x00\x63\x02\x00\x00\x00\x00\xaa\x16\x07\x05\x1d\x05\x2f\x05\x0b\x05\x8e\x03\x09\x05\x47\x05\x53\x05\xd1\xff\x11\x00\x00\x00\x00\x00\x59\x05\x00\x00\x00\x00\xf1\x04\x79\x01\x00\x00\xe8\xff\x8e\x03\x3c\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x16\x53\x04\x00\x00\x63\x02\x00\x00\x11\x0e\x00\x00\x75\x05\x7a\x05\x4e\x05\x4e\x05\x8c\x13\x00\x00\x6a\x00\x86\x00\x4e\x05\x00\x00\x14\x05\x14\x1d\x00\x00\x15\x05\x00\x00\xce\x1d\x0c\x1e\x1e\x11\x31\x09\x15\x05\x15\x05\x00\x00\x77\x11\xe1\x00\x15\x05\x00\x00\x15\x05\x15\x05\x00\x00\x04\x0f\x66\x0c\x84\x05\x8f\x05\x1b\x00\x00\x00\x96\x05\x54\x05\x7e\x0b\x1b\x00\x00\x00\x00\x00\x82\x09\xbc\x1c\x8a\x05\x00\x00\xbd\x05\xc2\x05\xe9\x1b\x00\x00\x00\x00\x00\x00\x58\x04\xc5\x05\x8a\x01\xd2\x00\xc6\x05\x63\x02\x63\x02\x79\x04\x00\x00\x00\x00\x00\x00\x5e\x0b\xfd\x00\x00\x00\x00\x00\xce\x05\xd4\x05\x7c\x05\x00\x00\x00\x00\x00\x00\xb9\x05\xb9\x05\xf6\x09\xf6\x09\xf6\x09\x00\x00\xd4\x0f\xd4\x0f\xd4\x0f\xd0\x05\x00\x00\x14\x00\x19\x04\xb2\x07\x86\x05\x00\x00\xc7\x05\x00\x00\x00\x00\x00\x00\x00\x00\x55\x01\xd6\x13\x55\x01\x20\x14\xe6\x05\x9a\x08\x00\x00\x59\x21\x59\x21\x12\x04\x59\x21\xdd\x05\xdd\x05\xc6\x20\xdd\x05\xf5\x0a\x00\x00\x69\x0b\xf0\x05\x0a\x06\x09\x00\xe7\x15\x00\x00\x00\x00\x23\x0d\xd4\x0f\x00\x00\xd4\x0f\x00\x00\xd4\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x02\x11\x0e\xdb\x00\x00\x00\xe5\x02\x00\x00\xef\x05\xd4\x0f\x12\x04\x23\x0d\x0d\x06\x16\x06\x0b\x00\x00\x00\x63\x02\x00\x00\x00\x00\x00\x00\x00\x00\x04\x0f\x00\x06\x17\x00\x00\x00\x10\x06\x31\x06\x06\x03\x00\x00\x34\x06\x37\x06\x00\x00\x13\x06\x6a\x14\x13\x06\x13\x06\x13\x06\x00\x00\x5f\x04\x18\x06\x00\x00\x15\x06\x02\x00\xf6\x09\x51\x06\x32\x06\x48\x06\x1e\x06\x00\x00\x00\x00\x44\x06\x44\x06\x76\x06\x00\x00\x00\x00\xb1\x04\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\xd2\x0b\x63\x02\x00\x00\x23\x1c\xcd\x01\x00\x00\x83\x04\x9a\x04\xc4\x1f\x6d\x16\x00\x00\x00\x00\x8c\x20\x00\x00\x00\x00\x00\x00\x00\x00\x79\x06\x7c\x06\x83\x06\x99\x06\x1b\x00\x20\x06\x00\x00\xa1\x06\x00\x00\x00\x00\xb3\x06\xd4\x0f\x00\x00\x00\x00\x00\x00\x5c\x03\x50\x04\xc3\x14\x00\x00\x00\x00\xa5\x09\xde\x0d\x0c\x15\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x0f\x03\x01\x03\x01\x8a\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x02\x19\x00\xd4\x0f\xdc\x00\x00\x00\xbd\x06\x5c\x0e\xbe\x06\xd1\xff\x00\x00\x00\x00\x36\x16\x00\x00\xb1\x00\x00\x00\x97\x06\x00\x00\x00\x00\x00\x00\xd4\x0f\x78\x01\x00\x00\x03\x01\xb5\x16\x89\x16\xce\x06\x00\x00\x00\x00\xd4\x0f\xde\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x06\xcd\x06\xd4\x0f\xcb\x01\xfd\x1f\x82\x06\x00\x00\x82\x06\x00\x00\x82\x06\xdb\x06\xd4\x0f\x00\x00\x00\x00\x89\x16\xb7\x04\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x09\xd4\x0f\xd4\x0f\xd0\x06\x00\x00\x15\x00\xda\x06\x00\x00\x08\x07\xa2\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x06\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x0f\xae\x04\x00\x00\xd4\x0f\x00\x00\xc6\x20\xd4\x0f\x00\x00\x00\x00\x63\x02\x00\x00\xbd\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x0c\x00\x00\x00\x00\x88\x0e\x00\x00\x00\x00\xd4\x0f\xf6\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x07\x00\x00\x22\x07\x25\x07\xd4\x0f\x02\x00\x00\x07\x02\x00\x00\x00\x2c\x07\x31\x07\x00\x00\x00\x00\x00\x00\xd4\x0f\x00\x00\xcb\x01\xcd\x01\xc8\x06\x00\x00\xd4\x0f\x00\x00\x00\x00\x33\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x0f\x67\x07\x00\x00\x00\x00\x00\x00\x36\x16\x00\x00\x00\x00\x00\x00\xcb\x06\xcb\x06\x00\x00\xf6\x09\xf6\x09\x2f\x00\x00\x00\x00\x00\x38\x07\xd1\x06\xd1\x06\x00\x00\x00\x00\x39\x07\x00\x00\x00\x00\x47\x07\x49\x07\x00\x00\x27\x07\xe6\x06\x00\x00\x00\x00\x00\x00\x67\x07\x00\x00\x00\x00\x00\x00\x41\x01\x00\x00\x00\x00\xd4\x0f\xd4\x0f\x54\x07\x57\x07\x32\x07\xfa\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyGotoOffsets :: HappyAddr+happyGotoOffsets = HappyA# "\xe4\x04\xff\xff\xc4\x01\xe1\x22\x64\x07\x3b\x00\x00\x00\x00\x00\xf5\x06\x53\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x02\x00\x00\x00\x00\xd7\x07\xef\x0a\x00\x00\x00\x00\x00\x00\x00\x00\xed\x06\xb9\x0c\x00\x00\x4e\x0d\x00\x00\x00\x00\x00\x00\xfc\x06\x00\x00\x7d\x0b\x86\x0d\xd2\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x07\xfd\xff\x00\x00\x3f\x24\x00\x00\x00\x00\x92\x02\x00\x00\x02\x07\x00\x00\x64\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\x07\x00\x00\x00\x00\x00\x00\x6c\x02\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x07\x00\x00\x6d\x02\x66\x01\x98\x02\x92\x00\x09\x03\xa1\x00\x00\x00\x00\x00\x64\x04\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\xbf\x04\x7a\x07\x00\x00\x00\x00\x59\x07\x37\x01\x00\x00\xda\x0a\xf1\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x00\x00\x00\x00\x42\x19\x58\x24\x1b\x07\x26\x07\x21\x07\x6c\x1a\xd9\x01\x00\x00\x00\x00\x57\x02\x00\x00\x12\x05\x00\x00\x79\x03\xa7\x07\x00\x00\x00\x00\x00\x00\x47\x01\x95\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x03\x00\x00\x5f\x07\x00\x00\xb0\x17\x9a\x1b\xb9\x07\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x01\xaf\x07\x0b\x01\x00\x00\x00\x00\x4e\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\x07\x72\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x07\x5d\x0b\x79\x0d\x3b\x05\xd8\x07\x00\x00\x00\x00\x00\x00\x73\x01\xc6\x07\x00\x00\x00\x00\x00\x00\xe9\x07\x77\x01\x11\x08\x29\x05\x00\x00\x2e\x05\x00\x00\x00\x00\xfa\x22\x13\x23\x00\x00\x00\x00\x2c\x23\x00\x00\x45\x23\x00\x00\x20\x07\x00\x00\x05\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x01\x55\x05\x00\x00\x71\x24\xed\x1a\x05\x1b\x8a\x24\x00\x00\x12\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x03\xa3\x24\x00\x00\xc8\x03\x00\x00\x00\x00\x00\x00\x00\x00\x73\x07\xeb\x01\xdc\xff\x50\x00\x1d\x0a\x00\x00\x00\x00\xca\x00\x5e\x23\x43\x20\x77\x23\x6d\x1c\xce\x11\xd2\x10\x18\x12\x05\x13\x4f\x13\x3a\x0e\xae\x0e\x6a\x0f\x99\x13\x8d\x06\x17\x0f\xa3\x0b\xe3\x13\x65\x0c\x89\x0e\x45\x0f\x00\x00\xbc\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x23\xa9\x23\x87\x07\xb0\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x26\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x14\x00\x00\x00\x00\x00\x00\xb6\x07\x09\x09\x00\x00\x78\x17\x5a\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x05\xe1\x01\x35\x08\xeb\x07\xc7\x07\x74\x05\xd5\x24\x00\x00\x00\x00\xc1\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x04\x44\x1a\xe2\x03\xf2\x07\x6b\x05\x00\x00\x00\x00\x6a\x19\x49\x04\xf3\x07\x00\x00\x00\x00\xe5\x17\x74\x0a\x00\x00\x00\x00\x0d\x08\x3d\x15\x00\x00\x00\x00\xc4\x05\x25\x03\x86\x15\x00\x00\x72\x04\xf7\x07\x00\x00\x00\x00\x28\x08\xc5\x19\x53\x08\x00\x00\x00\x00\x00\x00\x00\x00\x94\x01\x42\x08\x00\x00\x00\x00\xb0\x04\x08\x08\x00\x00\x5a\x1b\x00\x00\x00\x00\x47\x22\x9d\x05\xd4\xff\xc6\x0f\x31\x18\x0b\x19\x4e\x03\xac\x00\x8b\x18\x00\x00\x00\x00\x00\x00\x00\x00\x95\x03\x00\x00\x00\x00\x00\x00\x00\x00\x50\x1b\x5a\x18\x69\x1b\x85\x18\x1f\x19\xeb\x19\xd9\x04\x0a\x08\x00\x00\x00\x00\x08\x06\x9c\x03\x08\x04\x0e\x06\x00\x00\x33\x06\x00\x00\x38\x06\x00\x00\x00\x00\xdd\x03\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x00\x00\x9c\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x07\x00\x00\x00\x00\xac\x04\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x03\x38\x06\x00\x00\x4e\x06\x00\x00\xf4\x21\x00\x00\x00\x00\x00\x00\x95\x01\xbd\x01\xea\x18\x00\x00\x89\x06\xe6\x08\xda\x01\x00\x00\x00\x00\x18\x18\x00\x00\x67\x06\x00\x00\xd4\x06\x00\x00\x40\x17\x03\x0d\x91\x06\x95\x06\x00\x00\x05\x17\x6a\x0e\xfd\x06\x00\x00\xab\x07\xc9\x07\x00\x00\x9f\x00\xcd\x1c\x00\x00\x00\x00\x1f\x08\x00\x00\x00\x00\x00\x00\x79\x1b\x2f\x08\x00\x00\x00\x00\x46\x1a\x17\x05\x0b\x08\x00\x00\x00\x00\x00\x00\x68\x11\x34\x08\x00\x00\x00\x00\x6b\x08\x00\x00\x6a\x04\x02\x17\x00\x00\xd0\x08\x08\x09\x46\x09\x00\x00\x00\x00\x00\x00\xe2\x04\xcf\x15\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x07\x00\x00\x00\x00\x00\x00\x37\x02\x3a\x02\x92\x05\xbc\x05\x01\x06\x00\x00\x7d\x22\x96\x22\xc2\x23\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x02\x24\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x0a\x7e\x01\xf1\x0a\x63\x01\x00\x00\x5f\x0a\x00\x00\x24\x1b\x37\x1b\xe5\x00\x4f\x1b\x00\x00\x00\x00\xc7\x1a\x00\x00\x6e\x04\x00\x00\x4d\x03\x00\x00\x00\x00\x05\x08\x05\x19\x00\x00\x00\x00\x71\x21\xee\x24\x00\x00\x7e\x26\x00\x00\x07\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x22\xf0\x04\x00\x00\x00\x00\x00\x00\x00\x00\x20\x25\xfb\x07\x96\x21\x00\x00\x00\x00\x20\x08\x00\x00\x4e\x09\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x08\x99\x01\xa1\x08\xa2\x08\xa8\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x00\x2b\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x08\x79\x08\x00\x00\x00\x00\x00\x00\x51\x09\x00\x00\x00\x00\xd9\x09\x00\x00\x00\x00\x00\x00\x00\x00\x81\x08\x62\x09\x00\x00\x9f\x12\xe3\x17\x00\x00\x00\x00\x00\x00\x95\x08\xe9\x0b\x00\x00\x00\x00\xb4\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x08\x50\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x25\x00\x00\x00\x00\x00\x00\x62\x0c\x4b\x05\xc0\x18\x00\x00\x00\x00\xfd\x0b\xfd\x05\xf1\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x72\x08\xf5\x09\x69\x0a\x40\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x08\x52\x25\xce\xff\x00\x00\x00\x00\xd4\x21\x00\x00\x51\x08\x00\x00\x00\x00\x63\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x25\xce\xff\x00\x00\xe3\x0d\xdd\x03\xfe\x07\x00\x00\x00\x00\x00\x00\x84\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x08\x00\x00\x9d\x25\x02\x06\x09\x09\x56\x09\x00\x00\x96\x09\x00\x00\xc7\x09\x00\x00\xb6\x25\x00\x00\x00\x00\xfe\x07\x08\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x45\x06\xaf\x22\xc8\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x08\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x23\x67\x08\x00\x00\xcf\x25\x00\x00\xda\x1a\xe8\x25\x00\x00\x00\x00\x24\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x21\x00\x00\x00\x00\x2e\x22\x00\x00\x00\x00\x01\x26\xba\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x23\x18\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x26\x00\x00\xb8\x06\xc3\x19\x66\x08\x00\x00\x33\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x26\xab\x09\x00\x00\x00\x00\x00\x00\x74\x08\x00\x00\x00\x00\x00\x00\xca\x09\x6c\x08\x00\x00\x70\x06\xb4\x06\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x08\x97\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\xff\xe4\x08\x00\x00\x00\x00\x30\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x24\x26\x24\x00\x00\x00\x00\x00\x00\x98\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyAdjustOffset :: Happy_GHC_Exts.Int# -> Happy_GHC_Exts.Int#+happyAdjustOffset off = off++happyDefActions :: HappyAddr+happyDefActions = HappyA# "\xfa\xff\x20\xfe\x00\x00\x00\x00\x00\x00\x20\xfe\x7f\xfe\x73\xfe\x61\xfe\x00\x00\x5f\xfe\x5b\xfe\x58\xfe\x55\xfe\x50\xfe\x4d\xfe\x4b\xfe\x49\xfe\x47\xfe\x45\xfe\x43\xfe\x40\xfe\x33\xfe\x00\x00\x8f\xfe\x8e\xfe\x20\xfe\x62\xfe\x63\xfe\x00\x00\x00\x00\x65\xfe\x64\xfe\x66\xfe\x67\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x29\xfe\x2a\xfe\x28\xfe\x27\xfe\x90\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\xff\xe3\xff\xe2\xff\xe1\xff\xe0\xff\xdf\xff\xde\xff\x00\x00\x00\x00\xc7\xff\xd7\xff\xb5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xfe\x00\x00\x00\x00\x90\xfe\x21\xfe\x00\x00\xf7\xff\x00\x00\xf6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x97\xff\x8d\xff\x8c\xff\x8b\xff\x00\x00\x65\xff\x9a\xff\x80\xff\x99\xff\x7f\xff\x98\xff\x7e\xff\x5a\xff\x40\xff\x20\xfe\x3f\xff\x00\x00\xe5\xff\xf4\xfe\xf2\xfe\xf3\xfe\xa5\xff\xe5\xfe\xe4\xfe\x00\x00\x1f\xfe\x1e\xfe\x00\x00\x20\xfe\x00\x00\x00\x00\x87\xff\x74\xff\x7c\xff\x73\xff\x77\xff\x20\xfe\x89\xff\x78\xff\x71\xff\x70\xff\x6f\xff\x6e\xff\x6d\xff\x6c\xff\x6b\xff\x84\xff\x7a\xff\x72\xff\x79\xff\x83\xff\x86\xff\x7b\xff\x76\xff\x88\xff\x00\x00\x3b\xff\x8a\xff\x00\x00\x85\xff\x3a\xff\x75\xff\x7d\xff\xe8\xfe\x4e\xff\x00\x00\x20\xfe\x00\x00\xf5\xff\x00\x00\x20\xfe\x00\x00\x00\x00\x1f\xfe\x00\x00\x20\xfe\x00\x00\xf1\xfe\xe3\xfe\x1f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\xff\x64\xff\x59\xff\x10\xff\xa5\xff\x1d\xfe\x00\x00\x48\xff\x15\xff\x16\xff\x1b\xff\x18\xff\x17\xff\x19\xff\x1a\xff\x20\xfe\xed\xfe\xc1\xfe\xbf\xfe\xde\xfe\x2d\xfe\x00\x00\x95\xff\x63\xff\x58\xff\x14\xff\x10\xff\xa5\xff\x00\x00\x00\x00\x4b\xff\x00\x00\x54\xff\x42\xff\x41\xff\x50\xff\x91\xff\x8f\xff\x8e\xff\x90\xff\x4f\xff\x5d\xff\x56\xff\x55\xff\xa9\xff\x5c\xff\x5b\xff\xaa\xff\x69\xff\x60\xff\x61\xff\x5f\xff\x68\xff\x67\xff\x66\xff\x00\x00\x10\xff\x11\xff\x0d\xff\x0a\xff\x09\xff\x0e\xff\x00\xff\x12\xff\xa5\xff\x00\x00\x20\xfe\x0c\xff\x00\x00\x93\xff\x6a\xff\x5e\xff\x10\xff\xa5\xff\x92\xff\x00\x00\x53\xff\x00\x00\x10\xff\xa5\xff\x20\xfe\xa8\xff\x20\xfe\xa7\xff\xf3\xff\x00\x00\x00\x00\x2e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x22\xfe\x2f\xfe\x00\x00\x00\x00\xbc\xff\x61\xfe\x2b\xfe\x00\x00\xbb\xff\x00\x00\xb4\xff\xd5\xff\x20\xfe\xc6\xff\x00\x00\x20\xfe\x20\xfe\x00\x00\x69\xfe\x20\xfe\x6a\xfe\x70\xfe\x26\xfe\x25\xfe\x6e\xfe\x20\xfe\x00\x00\x6c\xfe\x20\xfe\x68\xfe\x71\xfe\x72\xfe\x00\x00\xc8\xfe\x80\xff\x7f\xff\x7e\xff\x00\x00\x00\x00\x00\x00\x1f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\xfe\x00\x00\x3e\xfe\x3a\xfe\x39\xfe\x3d\xfe\x3c\xfe\x3b\xfe\x36\xfe\x35\xfe\x34\xfe\x38\xfe\x37\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x79\xfe\x78\xfe\xf8\xff\xf9\xff\x7b\xfe\x7a\xfe\x00\x00\x00\x00\x75\xfe\x7d\xfe\x3f\xfe\x5c\xfe\x5d\xfe\x5e\xfe\x59\xfe\x5a\xfe\x56\xfe\x57\xfe\x51\xfe\x53\xfe\x52\xfe\x54\xfe\x4e\xfe\x4f\xfe\x4c\xfe\x4a\xfe\x48\xfe\x46\xfe\x00\x00\x00\x00\x44\xfe\x31\xfe\x32\xfe\x8d\xfe\x00\x00\xc5\xfe\xc2\xfe\xc4\xfe\xc3\xfe\x00\x00\xc6\xfe\xde\xfe\xb2\xfe\xc7\xfe\x8b\xfe\x00\x00\x00\x00\x00\x00\x24\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\xff\xd5\xff\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xff\x00\x00\x20\xfe\x00\x00\x00\x00\xbe\xff\x00\x00\xba\xff\x00\x00\x00\x00\x00\x00\x00\x00\x20\xfe\xa0\xfe\x20\xfe\x00\x00\xf1\xff\x20\xfe\x20\xfe\xa0\xfe\xef\xff\x0b\xff\xde\xfe\x00\x00\x08\xff\xfc\xfe\x1f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xfe\x20\xfe\xa0\xfe\xf0\xff\x3c\xff\x39\xff\x20\xfe\x00\x00\x94\xff\x62\xff\x57\xff\x13\xff\x10\xff\xa5\xff\x00\x00\x45\xff\x20\xfe\xa0\xfe\xee\xff\x2d\xfe\x2c\xfe\x00\x00\x2d\xfe\x66\xfe\x20\xfe\xd9\xfe\xd5\xfe\xd2\xfe\x99\xff\x7f\xff\xce\xfe\x00\x00\xdd\xfe\xdb\xfe\x00\x00\x1f\xfe\xca\xfe\xbe\xfe\xec\xff\xa4\xff\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xfe\x20\xfe\x20\xfe\xa0\xfe\xf2\xff\x00\x00\x00\x00\x00\x00\x20\xfe\xe0\xfe\xe7\xfe\xec\xfe\xf0\xfe\xf3\xfe\xef\xfe\xe2\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x22\xff\x00\x00\x00\x00\x00\x00\x00\x00\x19\xfe\x00\x00\x1b\xfe\x17\xfe\x18\xfe\x4d\xff\x4c\xff\x00\x00\x00\x00\x21\xff\x1f\xff\x00\x00\x00\x00\x81\xff\x82\xff\xee\xfe\xeb\xfe\xdf\xfe\x00\x00\x00\x00\xe6\xfe\xea\xfe\xa0\xff\x00\x00\xeb\xff\x00\x00\x00\x00\x10\xff\x10\xff\x00\x00\x12\xff\x00\x00\x20\xfe\x10\xff\xe1\xfe\x00\x00\x20\xfe\xc0\xfe\x20\xfe\xcc\xfe\x00\x00\xcd\xfe\xde\xfe\xb2\xfe\x20\xfe\x20\xfe\xd1\xfe\xde\xfe\xb2\xfe\x20\xfe\xd4\xfe\x20\xfe\x20\xfe\xd8\xfe\x20\xfe\x00\x00\x00\x00\x00\x00\x66\xfe\xbd\xfe\x00\x00\x00\x00\x2d\xfe\x66\xfe\xa2\xff\xe7\xff\x20\xfe\x20\xfe\xa0\xfe\xed\xff\x00\x00\x00\x00\x20\xfe\x39\xff\x9c\xff\xe9\xff\x00\x00\x00\x00\x00\x00\x20\xfe\x00\x00\xf9\xfe\x04\xff\x00\x00\x07\xff\x06\xff\xfb\xfe\x00\x00\x00\x00\xa3\xff\xe8\xff\x00\x00\x00\x00\x00\x00\x9e\xff\x9d\xff\xea\xff\x10\xff\x10\xff\x00\x00\x00\x00\x00\x00\xbd\xff\x2f\xfe\x2f\xfe\x00\x00\x00\x00\xdc\xff\x00\x00\x00\x00\xd6\xff\x00\x00\xd3\xff\x00\x00\xd4\xff\xd2\xff\xd0\xff\xd1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x4e\xff\x20\xfe\xdd\xff\x20\xfe\x20\xfe\x00\x00\x20\xfe\x00\x00\x6d\xfe\x20\xfe\x6b\xfe\x20\xfe\xb0\xfe\xae\xfe\x00\x00\x00\x00\x00\x00\x1f\xfe\xa4\xfe\x60\xfe\x9e\xfe\x00\x00\x41\xfe\x00\x00\x7c\xfe\x00\x00\x7e\xfe\x74\xfe\x42\xfe\x30\xfe\x9d\xfe\x00\x00\x00\x00\x00\x00\x96\xfe\x97\xfe\xa3\xfe\x00\x00\x00\x00\x00\x00\x9e\xfe\x00\x00\x00\x00\x00\x00\xab\xfe\xac\xfe\xaa\xfe\xad\xfe\xaf\xfe\xb1\xfe\x1f\xfe\x00\x00\x00\x00\x85\xfe\x00\x00\x00\x00\x00\x00\x82\xfe\x00\x00\x00\x00\xcf\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xff\x00\x00\x00\x00\xc9\xff\x00\x00\xb3\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xff\xc3\xff\xc2\xff\xa0\xfe\xa0\xfe\x00\x00\x52\xff\x51\xff\x00\x00\x05\xff\xfa\xfe\x00\x00\xff\xfe\x03\xff\xf7\xfe\xf8\xfe\x00\x00\x02\xff\xf5\xfe\x20\xfe\x2e\xff\x37\xff\x00\x00\x00\x00\x20\xfe\x1f\xfe\x38\xff\x3d\xff\x20\xfe\x4a\xff\x49\xff\xa1\xff\xe6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x66\xfe\x20\xfe\xbb\xfe\x00\x00\xbc\xfe\xb6\xfe\x00\x00\x00\x00\xd7\xfe\xd6\xfe\xd3\xfe\x20\xfe\xae\xfe\x1f\xfe\xd0\xfe\xcf\xfe\x20\xfe\xae\xfe\x1f\xfe\xcb\xfe\xda\xfe\xdc\xfe\xc9\xfe\x00\x00\x00\x00\x00\x00\x10\xff\x47\xff\x46\xff\x9f\xfe\xe9\xfe\xf4\xff\x00\x00\x1e\xff\x00\x00\x00\x00\x26\xff\x00\x00\x00\x00\x00\x00\x19\xfe\x1a\xfe\x1c\xfe\x61\xfe\x14\xfe\x00\x00\x15\xfe\x00\x00\x20\xff\x25\xff\x1c\xff\x00\x00\x00\x00\x24\xff\x00\x00\x1f\xfe\x1f\xfe\x00\x00\xb9\xfe\xb5\xfe\x00\x00\x00\x00\xba\xfe\xb4\xfe\x44\xff\x43\xff\x34\xff\x32\xff\x2a\xff\x00\x00\x00\x00\x1f\xfe\x20\xfe\x36\xff\x20\xfe\x35\xff\x20\xfe\x2d\xff\x00\x00\x3e\xff\x01\xff\x00\x00\x00\x00\xfe\xfe\x0f\xff\x9b\xff\x9f\xff\x00\x00\x2f\xfe\x2f\xfe\x00\x00\xda\xff\x00\x00\xb2\xff\xb1\xff\x00\x00\x00\x00\xb9\xff\xd8\xff\xc8\xff\xce\xff\xcc\xff\xcd\xff\x00\x00\xcb\xff\x87\xfe\x88\xfe\x89\xfe\x00\x00\x00\x00\x8a\xfe\x00\x00\x8c\xfe\x20\xfe\x00\x00\xa9\xfe\xa7\xfe\xa8\xfe\xa6\xfe\x00\x00\x93\xfe\x00\x00\x98\xfe\x95\xfe\x92\xfe\x99\xfe\x9c\xfe\x00\x00\x77\xfe\x9b\xfe\x00\x00\x76\xfe\x94\xfe\x00\x00\x00\x00\xa2\xfe\xa5\xfe\x84\xfe\x86\xfe\x83\xfe\x81\xfe\x00\x00\xca\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xff\xc1\xff\x00\x00\x00\x00\xc4\xff\xfd\xfe\x2c\xff\x00\x00\x30\xff\x00\x00\x00\x00\x33\xff\x29\xff\x00\x00\x27\xff\xb3\xfe\x00\x00\xb8\xfe\x23\xff\x1d\xff\xa6\xff\x16\xfe\x00\x00\x00\x00\x12\xfe\x13\xfe\x23\xfe\x61\xfe\x11\xfe\xb7\xfe\x28\xff\x20\xfe\x31\xff\x2b\xff\x00\x00\x00\x00\x00\x00\xb8\xff\xb0\xff\x00\x00\x00\x00\x00\x00\x80\xfe\xa1\xfe\x00\x00\x9a\xfe\x91\xfe\x00\x00\x00\x00\xaf\xff\x00\x00\x00\x00\xd6\xff\xc0\xff\x2f\xff\x00\x00\x10\xfe\x0f\xfe\xbf\xff\x00\x00\xac\xff\xb7\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\xff\xb6\xff\xad\xff\xae\xff"#++happyCheck :: HappyAddr+happyCheck = HappyA# "\xff\xff\x02\x00\x03\x00\x04\x00\x01\x00\x03\x00\x38\x00\x1f\x00\x01\x00\x38\x00\x04\x00\x02\x00\x18\x00\x02\x00\x3a\x00\x02\x00\x0d\x00\x14\x00\x02\x00\x02\x00\x0d\x00\x39\x00\x02\x00\x02\x00\x19\x00\x02\x00\x1b\x00\x1a\x00\x1d\x00\x1e\x00\x1f\x00\x04\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\x17\x00\x0d\x00\x02\x00\x1e\x00\x1e\x00\x2e\x00\x36\x00\x39\x00\x2a\x00\x1f\x00\x3a\x00\x2a\x00\x2a\x00\x6b\x00\x02\x00\x03\x00\x04\x00\x01\x00\x2a\x00\x10\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x7c\x00\x01\x00\x0d\x00\x1e\x00\x15\x00\x16\x00\x17\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x6d\x00\x1b\x00\x0d\x00\x1d\x00\x1e\x00\x1f\x00\x7f\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\x01\x00\x6a\x00\x79\x00\x6b\x00\x6c\x00\x6d\x00\x36\x00\x6b\x00\x6c\x00\x6d\x00\x3a\x00\x6d\x00\x0d\x00\x6d\x00\x02\x00\x03\x00\x04\x00\x7d\x00\x7e\x00\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x6d\x00\x01\x00\x6d\x00\x39\x00\x19\x00\x15\x00\x16\x00\x17\x00\x6b\x00\x6c\x00\x19\x00\x79\x00\x1b\x00\x0d\x00\x1d\x00\x1e\x00\x1f\x00\x39\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\x04\x00\x2c\x00\x1b\x00\x6b\x00\x6c\x00\x6d\x00\x36\x00\x32\x00\x0b\x00\x0c\x00\x3a\x00\x79\x00\x02\x00\x22\x00\x6b\x00\x6c\x00\x6d\x00\x7d\x00\x7e\x00\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x2a\x00\x22\x00\x21\x00\x22\x00\x23\x00\x24\x00\x01\x00\x26\x00\x03\x00\x39\x00\x11\x00\x12\x00\x22\x00\x7f\x00\x2d\x00\x2e\x00\x2f\x00\x01\x00\x0d\x00\x6b\x00\x6c\x00\x6d\x00\x39\x00\x36\x00\x39\x00\x2a\x00\x39\x00\x7f\x00\x03\x00\x0d\x00\x1e\x00\x06\x00\x01\x00\x04\x00\x03\x00\x39\x00\x76\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x0d\x00\x79\x00\x26\x00\x6b\x00\x6c\x00\x6d\x00\x7d\x00\x7e\x00\x7f\x00\x2d\x00\x2e\x00\x2f\x00\x1f\x00\x37\x00\x38\x00\x01\x00\x01\x00\x20\x00\x36\x00\x22\x00\x23\x00\x24\x00\x01\x00\x26\x00\x1e\x00\x01\x00\x01\x00\x2d\x00\x0d\x00\x01\x00\x2d\x00\x2e\x00\x2f\x00\x04\x00\x0d\x00\x7f\x00\x31\x00\x0d\x00\x0d\x00\x36\x00\x2e\x00\x0d\x00\x39\x00\x38\x00\x37\x00\x38\x00\x7d\x00\x7e\x00\x7f\x00\x6a\x00\x7f\x00\x7e\x00\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x01\x00\x7f\x00\x21\x00\x22\x00\x23\x00\x24\x00\x01\x00\x26\x00\x6b\x00\x6c\x00\x53\x00\x54\x00\x0d\x00\x56\x00\x2d\x00\x2e\x00\x2f\x00\x04\x00\x0d\x00\x6b\x00\x6c\x00\x6d\x00\x7c\x00\x36\x00\x76\x00\x02\x00\x39\x00\x60\x00\x65\x00\x6b\x00\x6c\x00\x7f\x00\x01\x00\x01\x00\x6b\x00\x6c\x00\x6d\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x01\x00\x0d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x0a\x00\x26\x00\x7f\x00\x7c\x00\x0e\x00\x7c\x00\x0d\x00\x1c\x00\x2d\x00\x2e\x00\x2f\x00\x04\x00\x6b\x00\x6c\x00\x6d\x00\x2a\x00\x01\x00\x36\x00\x6b\x00\x6c\x00\x6d\x00\x6b\x00\x6b\x00\x6d\x00\x6d\x00\x6b\x00\x01\x00\x6d\x00\x1c\x00\x2c\x00\x2b\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x04\x00\x3c\x00\x21\x00\x22\x00\x23\x00\x24\x00\x22\x00\x26\x00\x7f\x00\x01\x00\x26\x00\x01\x00\x1c\x00\x1c\x00\x2d\x00\x2e\x00\x2f\x00\x1c\x00\x6b\x00\x2b\x00\x6d\x00\x0d\x00\x3c\x00\x36\x00\x6b\x00\x6c\x00\x39\x00\x04\x00\x20\x00\x39\x00\x22\x00\x23\x00\x24\x00\x2a\x00\x26\x00\x2d\x00\x2d\x00\x44\x00\x45\x00\x46\x00\x47\x00\x2d\x00\x2e\x00\x2f\x00\x3c\x00\x3c\x00\x1c\x00\x1c\x00\x2b\x00\x3c\x00\x36\x00\x6b\x00\x7f\x00\x39\x00\x6b\x00\x6c\x00\x21\x00\x22\x00\x23\x00\x24\x00\x1e\x00\x26\x00\x6b\x00\x6c\x00\x44\x00\x45\x00\x46\x00\x47\x00\x2d\x00\x2e\x00\x2f\x00\x05\x00\x06\x00\x07\x00\x01\x00\x01\x00\x01\x00\x36\x00\x3c\x00\x3c\x00\x39\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x0d\x00\x1c\x00\x0d\x00\x1c\x00\x1d\x00\x44\x00\x45\x00\x46\x00\x47\x00\x7e\x00\x7f\x00\x6b\x00\x6c\x00\x7f\x00\x05\x00\x06\x00\x07\x00\x1e\x00\x09\x00\x1e\x00\x0b\x00\x0c\x00\x0d\x00\x01\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x6b\x00\x1c\x00\x6d\x00\x01\x00\x3c\x00\x19\x00\x2c\x00\x1b\x00\x7f\x00\x1d\x00\x1e\x00\x1f\x00\x01\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\x26\x00\x39\x00\x0d\x00\x0e\x00\x0f\x00\x3c\x00\x36\x00\x7f\x00\x1e\x00\x01\x00\x3a\x00\x03\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5d\x00\x49\x00\x4a\x00\x39\x00\x61\x00\x0d\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x6b\x00\x73\x00\x6b\x00\x6c\x00\x6b\x00\x6c\x00\x78\x00\x79\x00\x5d\x00\x01\x00\x7c\x00\x03\x00\x61\x00\x2c\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x1c\x00\x73\x00\x76\x00\x1c\x00\x7e\x00\x7f\x00\x78\x00\x79\x00\x01\x00\x1c\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x05\x00\x06\x00\x07\x00\x01\x00\x09\x00\x03\x00\x0b\x00\x0c\x00\x0d\x00\x7f\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x04\x00\x2a\x00\x6d\x00\x3c\x00\x2d\x00\x19\x00\x3c\x00\x1b\x00\x01\x00\x1d\x00\x1e\x00\x1f\x00\x3c\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\x6d\x00\x20\x00\x01\x00\x22\x00\x23\x00\x24\x00\x36\x00\x26\x00\x17\x00\x18\x00\x3a\x00\x05\x00\x06\x00\x07\x00\x01\x00\x44\x00\x45\x00\x46\x00\x47\x00\x6b\x00\x6c\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x39\x00\x3b\x00\x01\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x76\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x01\x00\x20\x00\x5d\x00\x22\x00\x23\x00\x24\x00\x61\x00\x07\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x6d\x00\x73\x00\x2a\x00\x39\x00\x6a\x00\x2d\x00\x78\x00\x79\x00\x7f\x00\x02\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\x02\x00\x28\x00\x2c\x00\x2a\x00\x01\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x2a\x00\x03\x00\x03\x00\x2d\x00\x06\x00\x7f\x00\x36\x00\x2c\x00\x5d\x00\x01\x00\x3a\x00\x2c\x00\x61\x00\x2c\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x1f\x00\x73\x00\x4f\x00\x2c\x00\x02\x00\x03\x00\x78\x00\x79\x00\x06\x00\x01\x00\x7c\x00\x03\x00\x32\x00\x05\x00\x06\x00\x2c\x00\x5d\x00\x09\x00\x0a\x00\x7f\x00\x61\x00\x07\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x20\x00\x73\x00\x22\x00\x23\x00\x24\x00\x01\x00\x78\x00\x79\x00\x2a\x00\x2b\x00\x07\x00\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\x6d\x00\x28\x00\x2b\x00\x2a\x00\x32\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x39\x00\x2a\x00\x2b\x00\x19\x00\x2b\x00\x1b\x00\x36\x00\x1d\x00\x1e\x00\x1f\x00\x3a\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\x66\x00\x01\x00\x01\x00\x03\x00\x51\x00\x4f\x00\x36\x00\x6a\x00\x3f\x00\x40\x00\x3a\x00\x6b\x00\x6c\x00\x0d\x00\x45\x00\x46\x00\x47\x00\x6d\x00\x20\x00\x5d\x00\x22\x00\x23\x00\x24\x00\x61\x00\x07\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x02\x00\x73\x00\x02\x00\x39\x00\x7f\x00\x02\x00\x78\x00\x79\x00\x04\x00\x31\x00\x10\x00\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\x38\x00\x28\x00\x19\x00\x2a\x00\x1e\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x36\x00\x7f\x00\x0b\x00\x0c\x00\x3a\x00\x1b\x00\x7d\x00\x7e\x00\x7f\x00\x01\x00\x02\x00\x03\x00\x53\x00\x54\x00\x1a\x00\x56\x00\x0d\x00\x0e\x00\x0f\x00\x21\x00\x22\x00\x23\x00\x24\x00\x2a\x00\x26\x00\x4f\x00\x6d\x00\x45\x00\x46\x00\x47\x00\x65\x00\x2d\x00\x2e\x00\x2f\x00\x11\x00\x12\x00\x6b\x00\x6c\x00\x6d\x00\x5d\x00\x36\x00\x7f\x00\x7f\x00\x61\x00\x07\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x2a\x00\x73\x00\x45\x00\x46\x00\x47\x00\x2a\x00\x78\x00\x79\x00\x17\x00\x18\x00\x07\x00\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\x02\x00\x28\x00\x02\x00\x2a\x00\x02\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x7f\x00\x6b\x00\x6c\x00\x19\x00\x2a\x00\x1b\x00\x36\x00\x1d\x00\x1e\x00\x1f\x00\x3a\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\x39\x00\x2a\x00\x7f\x00\x2a\x00\x39\x00\x4f\x00\x36\x00\x6b\x00\x7e\x00\x7f\x00\x3a\x00\x44\x00\x45\x00\x46\x00\x47\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5d\x00\x01\x00\x02\x00\x03\x00\x61\x00\x6a\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x01\x00\x73\x00\x13\x00\x14\x00\x15\x00\x16\x00\x78\x00\x79\x00\x3a\x00\x2a\x00\x2b\x00\x7d\x00\x7e\x00\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x44\x00\x45\x00\x46\x00\x47\x00\x07\x00\x01\x00\x51\x00\x03\x00\x01\x00\x02\x00\x03\x00\x7e\x00\x7f\x00\x01\x00\x02\x00\x03\x00\x7f\x00\x0d\x00\x2b\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x2b\x00\x1b\x00\x02\x00\x1d\x00\x1e\x00\x1f\x00\x02\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\x07\x00\x01\x00\x02\x00\x03\x00\x6b\x00\x6c\x00\x36\x00\x02\x00\x31\x00\x6d\x00\x3a\x00\x1f\x00\x7d\x00\x7e\x00\x7f\x00\x38\x00\x2a\x00\x2b\x00\x19\x00\x01\x00\x1b\x00\x1f\x00\x1d\x00\x1e\x00\x1f\x00\x02\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\x02\x00\x53\x00\x54\x00\x1f\x00\x56\x00\x39\x00\x36\x00\x3f\x00\x40\x00\x2c\x00\x3a\x00\x2a\x00\x2b\x00\x45\x00\x46\x00\x47\x00\x01\x00\x02\x00\x03\x00\x65\x00\x2c\x00\x07\x00\x01\x00\x02\x00\x03\x00\x6b\x00\x6c\x00\x6d\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x2a\x00\x2b\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x01\x00\x1b\x00\x1f\x00\x1d\x00\x1e\x00\x1f\x00\x04\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\x07\x00\x7d\x00\x7e\x00\x7f\x00\x00\x00\x01\x00\x36\x00\x6d\x00\x7e\x00\x7f\x00\x3a\x00\x7d\x00\x7e\x00\x7f\x00\x02\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x1f\x00\x1b\x00\x2a\x00\x1d\x00\x1e\x00\x1f\x00\x02\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\x02\x00\x05\x00\x06\x00\x07\x00\x6b\x00\x6c\x00\x36\x00\x51\x00\x52\x00\x53\x00\x3a\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x6b\x00\x6c\x00\x39\x00\x80\x00\x81\x00\x07\x00\x02\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x31\x00\x44\x00\x45\x00\x46\x00\x47\x00\x7e\x00\x7f\x00\x38\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x02\x00\x1b\x00\x2a\x00\x1d\x00\x1e\x00\x1f\x00\x2c\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\x53\x00\x54\x00\x02\x00\x56\x00\x5b\x00\x5c\x00\x36\x00\x7d\x00\x7e\x00\x7f\x00\x3a\x00\x05\x00\x06\x00\x07\x00\x02\x00\x7d\x00\x7e\x00\x7f\x00\x65\x00\x01\x00\x6a\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x7f\x00\x5d\x00\x51\x00\x52\x00\x53\x00\x61\x00\x2b\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x02\x00\x73\x00\x05\x00\x06\x00\x07\x00\x02\x00\x78\x00\x79\x00\x6b\x00\x32\x00\x7c\x00\x6d\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x04\x00\x3e\x00\x3f\x00\x40\x00\x51\x00\x52\x00\x53\x00\x44\x00\x45\x00\x46\x00\x47\x00\x04\x00\x7d\x00\x7e\x00\x7f\x00\x05\x00\x06\x00\x07\x00\x04\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x7d\x00\x7e\x00\x7f\x00\x1f\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x5b\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x02\x00\x73\x00\x05\x00\x06\x00\x07\x00\x02\x00\x78\x00\x79\x00\x02\x00\x02\x00\x7c\x00\x7f\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x02\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x02\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x6a\x00\x73\x00\x7d\x00\x7e\x00\x7f\x00\x32\x00\x78\x00\x79\x00\x1e\x00\x5d\x00\x7c\x00\x6b\x00\x02\x00\x61\x00\x2d\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x1e\x00\x73\x00\x05\x00\x06\x00\x07\x00\x2c\x00\x78\x00\x79\x00\x02\x00\x1e\x00\x7c\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x51\x00\x52\x00\x53\x00\x02\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x1e\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x1e\x00\x73\x00\x05\x00\x06\x00\x07\x00\x02\x00\x78\x00\x79\x00\x02\x00\x35\x00\x7c\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x2c\x00\x2b\x00\x44\x00\x45\x00\x46\x00\x47\x00\x2d\x00\x44\x00\x45\x00\x46\x00\x47\x00\x05\x00\x06\x00\x07\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x51\x00\x52\x00\x53\x00\x3e\x00\x2b\x00\x5d\x00\x51\x00\x52\x00\x53\x00\x61\x00\x1f\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x2b\x00\x73\x00\x05\x00\x06\x00\x07\x00\x02\x00\x78\x00\x79\x00\x02\x00\x7f\x00\x7c\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x51\x00\x52\x00\x53\x00\x04\x00\x5d\x00\x51\x00\x52\x00\x53\x00\x61\x00\x6d\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x04\x00\x73\x00\x51\x00\x52\x00\x53\x00\x5d\x00\x78\x00\x79\x00\x04\x00\x61\x00\x7c\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x04\x00\x73\x00\x05\x00\x06\x00\x07\x00\x32\x00\x78\x00\x79\x00\x02\x00\x02\x00\x7c\x00\x2b\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x5d\x00\x45\x00\x46\x00\x47\x00\x61\x00\x04\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x04\x00\x73\x00\x7d\x00\x7e\x00\x7f\x00\x6d\x00\x78\x00\x79\x00\x5d\x00\x1e\x00\x7c\x00\x35\x00\x61\x00\x6d\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x21\x00\x22\x00\x23\x00\x24\x00\x1e\x00\x26\x00\x2b\x00\x44\x00\x45\x00\x46\x00\x47\x00\x01\x00\x2d\x00\x2e\x00\x2f\x00\x2a\x00\x78\x00\x79\x00\x7e\x00\x7f\x00\x01\x00\x36\x00\x2c\x00\x0d\x00\x39\x00\x7d\x00\x7e\x00\x7f\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x04\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x04\x00\x73\x00\x08\x00\x04\x00\x2b\x00\x2b\x00\x78\x00\x79\x00\x02\x00\x30\x00\x7c\x00\x32\x00\x33\x00\x02\x00\x35\x00\x6d\x00\x37\x00\x04\x00\x6d\x00\x3a\x00\x02\x00\x6a\x00\x3d\x00\x04\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x01\x00\x01\x00\x01\x00\x03\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x6a\x00\x52\x00\x2b\x00\x7f\x00\x55\x00\x0d\x00\x02\x00\x58\x00\x59\x00\x02\x00\x5b\x00\x5c\x00\x5d\x00\x2b\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x6a\x00\x01\x00\x04\x00\x72\x00\x01\x00\x7c\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x76\x00\x7a\x00\x10\x00\x08\x00\x31\x00\x7d\x00\x7e\x00\x7f\x00\x5d\x00\x7c\x00\x07\x00\x38\x00\x61\x00\x1b\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x39\x00\x73\x00\x1a\x00\x75\x00\x2f\x00\x7c\x00\x78\x00\x79\x00\x79\x00\x53\x00\x54\x00\x3b\x00\x56\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x65\x00\x07\x00\x1a\x00\x5d\x00\x4a\x00\x53\x00\x01\x00\x61\x00\x6d\x00\x63\x00\x64\x00\x65\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x07\x00\x5a\x00\x10\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x1a\x00\x7c\x00\x78\x00\x79\x00\x1b\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x07\x00\x1a\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x2b\x00\x2c\x00\x07\x00\x1a\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\x07\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\x7c\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\x01\x00\x7d\x00\x7e\x00\x7f\x00\x1a\x00\x7c\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x5d\x00\x7f\x00\x10\x00\x39\x00\x61\x00\x4e\x00\x63\x00\x64\x00\x3e\x00\x3f\x00\x40\x00\x0a\x00\x79\x00\x1b\x00\x44\x00\x45\x00\x46\x00\x47\x00\x7d\x00\x7e\x00\x7f\x00\x57\x00\x57\x00\x3e\x00\x3f\x00\x40\x00\x57\x00\x78\x00\x79\x00\x44\x00\x45\x00\x46\x00\x47\x00\x2f\x00\x30\x00\x31\x00\x30\x00\x33\x00\x07\x00\x35\x00\x1a\x00\x37\x00\x38\x00\x57\x00\x3a\x00\x57\x00\x57\x00\x3d\x00\x30\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x79\x00\x4a\x00\x79\x00\x4e\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x7c\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x7f\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x7f\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x7f\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\x7d\x00\x7e\x00\x7f\x00\x7f\x00\x07\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x07\x00\x07\x00\x10\x00\x39\x00\x7d\x00\x7e\x00\x7f\x00\x07\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x1b\x00\x44\x00\x45\x00\x46\x00\x47\x00\x39\x00\x26\x00\x51\x00\x52\x00\x53\x00\x3e\x00\x3f\x00\x40\x00\x2d\x00\x2e\x00\x2f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x2f\x00\x30\x00\x36\x00\x57\x00\x33\x00\x39\x00\x35\x00\x57\x00\x37\x00\x81\x00\x7f\x00\x3a\x00\x72\x00\x7f\x00\x3d\x00\x07\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x7c\x00\x4a\x00\x7f\x00\x72\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x7f\x00\x52\x00\x09\x00\xff\xff\x55\x00\x7e\x00\x7f\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x79\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x7e\x00\x7f\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\x79\x00\x79\x00\x7d\x00\x7e\x00\x7f\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x3a\x00\x51\x00\x52\x00\x53\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x1b\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x26\x00\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\x2c\x00\xff\xff\xff\xff\x2f\x00\x0d\x00\x36\x00\xff\xff\xff\xff\x39\x00\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\x4a\x00\x51\x00\x52\x00\x53\x00\x4e\x00\x4f\x00\x50\x00\x7d\x00\x7e\x00\x7f\x00\x31\x00\x7d\x00\x7e\x00\x7f\x00\x58\x00\x59\x00\x5a\x00\x38\x00\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\x53\x00\x54\x00\xff\xff\x56\x00\x7f\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x3a\x00\xff\xff\x65\x00\x51\x00\x52\x00\x53\x00\xff\xff\xff\xff\x6b\x00\x1b\x00\x6d\x00\x51\x00\x52\x00\x53\x00\x51\x00\x52\x00\x53\x00\xff\xff\x01\x00\xff\xff\x03\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x2f\x00\x0d\x00\x51\x00\x52\x00\x53\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\x4a\x00\x7d\x00\x7e\x00\x7f\x00\x4e\x00\x4f\x00\x50\x00\x7d\x00\x7e\x00\x7f\x00\x31\x00\x7d\x00\x7e\x00\x7f\x00\x58\x00\x59\x00\x5a\x00\x38\x00\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x5d\x00\xff\xff\x65\x00\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x6b\x00\x1b\x00\x6d\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x2b\x00\x2c\x00\x78\x00\x79\x00\x2f\x00\x7b\x00\xff\xff\x32\x00\xff\xff\x34\x00\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\x3b\x00\x3c\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\x4c\x00\x26\x00\x7d\x00\x7e\x00\x7f\x00\x7d\x00\x7e\x00\x7f\x00\x2d\x00\x2e\x00\x2f\x00\x57\x00\xff\xff\xff\xff\x5a\x00\xff\xff\xff\xff\x36\x00\x5e\x00\xff\xff\x39\x00\x7e\x00\x7f\x00\x51\x00\x52\x00\x53\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x0c\x00\x0d\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x7e\x00\x7f\x00\x51\x00\x52\x00\x53\x00\x19\x00\xff\xff\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\xff\xff\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\x04\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x01\x00\xff\xff\x3a\x00\xff\xff\x7e\x00\x7f\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x39\x00\x45\x00\x46\x00\x47\x00\x1b\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x5d\x00\x49\x00\x4a\x00\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x2f\x00\x3b\x00\x31\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x38\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7e\x00\x7f\x00\x53\x00\x54\x00\x01\x00\x56\x00\xff\xff\xff\xff\xff\xff\x5a\x00\x5b\x00\x7e\x00\x7f\x00\xff\xff\x04\x00\x01\x00\x0d\x00\x03\x00\xff\xff\xff\xff\x65\x00\xff\xff\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x0d\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x31\x00\xff\xff\xff\xff\xff\xff\x45\x00\x46\x00\x47\x00\x38\x00\x49\x00\x4a\x00\x1b\x00\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x38\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x2f\x00\xff\xff\x31\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\x5d\x00\xff\xff\xff\xff\x65\x00\x61\x00\xff\xff\x63\x00\x64\x00\x4a\x00\x6b\x00\x6c\x00\x6d\x00\x7e\x00\x7f\x00\x65\x00\xff\xff\xff\xff\x53\x00\x54\x00\x01\x00\x56\x00\xff\xff\x6d\x00\xff\xff\x5a\x00\x5b\x00\xff\xff\x78\x00\x79\x00\xff\xff\x01\x00\x0d\x00\x03\x00\xff\xff\xff\xff\x65\x00\xff\xff\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x0d\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x5d\x00\x10\x00\x31\x00\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\xff\xff\x38\x00\xff\xff\xff\xff\x1b\x00\x31\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x38\x00\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\x78\x00\x79\x00\xff\xff\x7b\x00\xff\xff\x2f\x00\xff\xff\x31\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x6b\x00\x6c\x00\x6d\x00\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\x53\x00\x54\x00\x01\x00\x56\x00\xff\xff\x6d\x00\xff\xff\x5a\x00\x5b\x00\x5d\x00\x7e\x00\x7f\x00\xff\xff\x61\x00\x0d\x00\x63\x00\x64\x00\x65\x00\x65\x00\xff\xff\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x5d\x00\xff\xff\x10\x00\x31\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x38\x00\xff\xff\xff\xff\x1b\x00\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\x35\x00\x36\x00\xff\xff\x2f\x00\xff\xff\x31\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x38\x00\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x39\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x6b\x00\x6c\x00\x6d\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\x5a\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\x2f\x00\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\x39\x00\xff\xff\x1b\x00\x38\x00\xff\xff\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2c\x00\x2d\x00\x4a\x00\x2f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x65\x00\x4a\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\xff\xff\x5a\x00\x78\x00\x79\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\x21\x00\x22\x00\x23\x00\x24\x00\x5d\x00\x26\x00\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\x2c\x00\x2d\x00\x01\x00\x2f\x00\x03\x00\x36\x00\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x78\x00\x79\x00\x10\x00\xff\xff\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\x1b\x00\xff\xff\x4a\x00\xff\xff\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2c\x00\x5a\x00\xff\xff\x2f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\xff\xff\x4a\x00\xff\xff\xff\xff\x7f\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\x5a\x00\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\x1e\x00\xff\xff\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\xff\xff\x2f\x00\xff\xff\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x3a\x00\x4a\x00\x1b\x00\xff\xff\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\x5a\x00\xff\xff\x78\x00\x79\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\xff\xff\x03\x00\xff\xff\x5d\x00\x4a\x00\xff\xff\x01\x00\x61\x00\xff\xff\x63\x00\x64\x00\x0d\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x5a\x00\x10\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x1b\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x31\x00\xff\xff\x2c\x00\x01\x00\xff\xff\x2f\x00\xff\xff\x38\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x3a\x00\x1b\x00\xff\xff\xff\xff\x4a\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\xff\xff\x2c\x00\xff\xff\x5a\x00\x2f\x00\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\xff\xff\x6d\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\xff\xff\x4a\x00\xff\xff\x01\x00\x02\x00\xff\xff\xff\xff\x7e\x00\x7f\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x5a\x00\x10\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x5d\x00\x10\x00\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x1b\x00\x3a\x00\xff\xff\x4a\x00\xff\xff\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x78\x00\x79\x00\x2c\x00\xff\xff\x5a\x00\x2f\x00\xff\xff\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x5a\x00\xff\xff\xff\xff\xff\xff\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x1b\x00\x63\x00\x64\x00\x65\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\xff\xff\x2f\x00\xff\xff\x78\x00\x79\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x5d\x00\x10\x00\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x1b\x00\xff\xff\x01\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x78\x00\x79\x00\x10\x00\xff\xff\x5a\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\x31\x00\xff\xff\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x38\x00\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\x4a\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x5a\x00\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\x4a\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\x65\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x6d\x00\x5a\x00\x2f\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\x4a\x00\x78\x00\x79\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x5a\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\x1b\x00\x63\x00\x64\x00\x65\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x01\x00\xff\xff\x2f\x00\xff\xff\x78\x00\x79\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x5d\x00\x10\x00\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x1b\x00\xff\xff\x01\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x78\x00\x79\x00\x10\x00\x01\x00\x5a\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\x0d\x00\xff\xff\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\xff\xff\x4a\x00\x2f\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\xff\xff\x31\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x38\x00\xff\xff\x4a\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x01\x00\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\xff\xff\x5a\x00\x5d\x00\x0d\x00\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x53\x00\x54\x00\xff\xff\x56\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x65\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x6b\x00\x6c\x00\x6d\x00\xff\xff\x30\x00\xff\xff\x32\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\x01\x00\xff\xff\x03\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\xff\xff\xff\xff\x55\x00\x0d\x00\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\x6c\x00\x6d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x58\x00\x59\x00\x01\x00\x5b\x00\x03\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\x6c\x00\x6d\x00\x19\x00\xff\xff\x1b\x00\xff\xff\x1d\x00\x1e\x00\x1f\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x36\x00\x33\x00\xff\xff\x35\x00\x3a\x00\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x58\x00\x59\x00\x01\x00\x5b\x00\x03\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x5d\x00\x6b\x00\x6c\x00\x6d\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x58\x00\x59\x00\x01\x00\x5b\x00\x03\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\x6c\x00\x6d\x00\xff\xff\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\x31\x00\x32\x00\x33\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\x01\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x0d\x00\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\x6c\x00\x6d\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\x01\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x0d\x00\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x6b\x00\x6c\x00\x6d\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x78\x00\x79\x00\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\x01\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x0d\x00\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x6b\x00\x6c\x00\x6d\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x78\x00\x79\x00\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x58\x00\x59\x00\x01\x00\x5b\x00\x03\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\x6c\x00\x6d\x00\xff\xff\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\x31\x00\x32\x00\x33\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\x01\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x0d\x00\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\x6d\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\x01\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x0d\x00\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x6b\x00\x6c\x00\x6d\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x78\x00\x79\x00\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\x01\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x0d\x00\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x6b\x00\x6c\x00\x6d\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x78\x00\x79\x00\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\x01\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x0d\x00\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x6b\x00\x6c\x00\x6d\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x78\x00\x79\x00\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\x01\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x0d\x00\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x6b\x00\x6c\x00\x6d\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x78\x00\x79\x00\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\x01\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x0d\x00\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x6b\x00\x6c\x00\x6d\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x78\x00\x79\x00\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x58\x00\x59\x00\x01\x00\x5b\x00\x03\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\x6c\x00\x6d\x00\xff\xff\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\x31\x00\x32\x00\x33\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\x01\x00\xff\xff\x03\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\xff\xff\xff\xff\x55\x00\x0d\x00\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\x6c\x00\x6d\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\x01\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\xff\xff\xff\xff\x55\x00\x0d\x00\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\x6c\x00\x6d\x00\xff\xff\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x30\x00\x49\x00\x4a\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\x01\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\xff\xff\xff\xff\x55\x00\x0d\x00\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x6b\x00\x6c\x00\x6d\x00\xff\xff\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x30\x00\x49\x00\x4a\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\x01\x00\xff\xff\x03\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\xff\xff\xff\xff\x55\x00\x0d\x00\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x6b\x00\x6c\x00\x6d\x00\xff\xff\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x30\x00\x49\x00\x4a\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\x01\x00\xff\xff\x03\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\xff\xff\xff\xff\x55\x00\x0d\x00\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\x6d\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\xff\xff\x31\x00\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\x01\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\x59\x00\x01\x00\x1e\x00\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x0d\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\x6d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\x0d\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\x01\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x01\x00\x0d\x00\xff\xff\xff\xff\x31\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\xff\xff\x38\x00\x0d\x00\xff\xff\xff\xff\x58\x00\x59\x00\x31\x00\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\x38\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\x6c\x00\x6d\x00\x31\x00\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\x38\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\x6c\x00\x6d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\x6b\x00\xff\xff\x6d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\xff\xff\x6d\x00\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\xff\xff\x6d\x00\x1e\x00\x1f\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x3a\x00\xff\xff\xff\xff\x3a\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x3f\x00\x40\x00\x44\x00\x45\x00\x46\x00\x47\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\x4d\x00\xff\xff\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x7d\x00\x7e\x00\x7f\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\x4d\x00\xff\xff\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x1e\x00\x1f\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\x4d\x00\xff\xff\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x1e\x00\x1f\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\x4d\x00\x4e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\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\xff\xff\xff\xff\x34\x00\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x3b\x00\x3a\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x4b\x00\x4c\x00\x4d\x00\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x20\x00\x3a\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\x4d\x00\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x21\x00\x22\x00\x23\x00\x24\x00\x7f\x00\x26\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\x40\x00\xff\xff\xff\xff\x7e\x00\x7f\x00\x45\x00\x46\x00\x47\x00\xff\xff\x7e\x00\x7f\x00\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x7f\x00\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\x3e\x00\x3f\x00\x40\x00\x2d\x00\x2e\x00\x2f\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\x36\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x25\x00\x26\x00\x7f\x00\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\x26\x00\x4f\x00\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\x5d\x00\x36\x00\xff\xff\xff\xff\x61\x00\x3a\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\x34\x00\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x3b\x00\x3a\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\x26\x00\xff\xff\x28\x00\x4f\x00\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x5d\x00\xff\xff\xff\xff\x3a\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\x4f\x00\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x3b\x00\x3a\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\x26\x00\xff\xff\x28\x00\x4f\x00\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x5d\x00\xff\xff\xff\xff\x3a\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\x4f\x00\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x25\x00\x26\x00\x3a\x00\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x25\x00\x26\x00\x3a\x00\x28\x00\x4f\x00\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x5e\x00\x5f\x00\x3a\x00\xff\xff\x4f\x00\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x36\x00\x4f\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x4f\x00\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x36\x00\xff\xff\x25\x00\x26\x00\x3a\x00\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\x4f\x00\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x36\x00\x4f\x00\xff\xff\xff\xff\x3a\x00\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x39\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4f\x00\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x39\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\x76\x00\xff\xff\x78\x00\x79\x00\x3a\x00\xff\xff\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x76\x00\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x7f\x00\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x76\x00\xff\xff\x78\x00\x79\x00\x2b\x00\xff\xff\x2d\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\x6d\x00\x6e\x00\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\x6c\x00\x6d\x00\x6e\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\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\x4d\x00\xff\xff\xff\xff\xff\xff\x2b\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x31\x00\xff\xff\x33\x00\xff\xff\x5b\x00\xff\xff\xff\xff\x38\x00\x5f\x00\xff\xff\x61\x00\xff\xff\xff\xff\xff\xff\x65\x00\x40\x00\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\x6d\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\xff\xff\x78\x00\x79\x00\x5f\x00\x2c\x00\x61\x00\xff\xff\xff\xff\x30\x00\x65\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\x6d\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\x39\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\x6d\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x78\x00\x79\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\x6d\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\x6c\x00\x6d\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\x6d\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\x6d\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\x6d\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\xff\xff\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\x6d\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x6c\x00\x6d\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\xff\xff\x52\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\xff\xff\x6c\x00\x6d\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\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\x4d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\xff\xff\xff\xff\xff\xff\x5f\x00\x31\x00\x61\x00\x33\x00\xff\xff\x35\x00\x65\x00\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\x6d\x00\xff\xff\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x58\x00\x59\x00\xff\xff\x5b\x00\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x31\x00\x63\x00\x64\x00\x65\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\x6d\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\x59\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x6c\x00\x6d\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\x59\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x6c\x00\x6d\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\x59\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x6c\x00\x6d\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\x59\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x6c\x00\x6d\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\x59\x00\x31\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\xff\xff\x63\x00\x64\x00\x65\x00\xff\xff\xff\xff\xff\xff\x40\x00\x5d\x00\xff\xff\xff\xff\x6d\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5b\x00\x78\x00\x79\x00\xff\xff\x5f\x00\xff\xff\x61\x00\x35\x00\xff\xff\x37\x00\x65\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x6d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\x6d\x00\x6e\x00\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x6c\x00\x6d\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x6c\x00\x6d\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x6c\x00\x6d\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\x6d\x00\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\x56\x00\x7c\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x56\x00\xff\xff\x7c\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x78\x00\x79\x00\xff\xff\x61\x00\x7c\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x56\x00\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\x82\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x76\x00\xff\xff\x78\x00\x79\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\x7f\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\x74\x00\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\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\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\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"#++happyTable :: HappyAddr+happyTable = HappyA# "\x00\x00\x4d\x00\x4e\x00\x4f\x00\xb2\x01\x43\x03\x12\x03\x05\x03\xad\x01\xfb\x01\x67\x03\x9e\x02\xb1\x03\x57\x03\x2d\x02\x8a\x02\xed\x00\x0f\x01\x1a\x02\x0a\x03\xed\x00\xd4\x00\xb8\x02\x76\x03\x50\x00\x53\x03\x51\x00\x34\x01\x52\x00\x53\x00\x54\x00\x20\xfe\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\x9c\x03\x06\x01\xa9\x03\xb9\x02\x77\x03\x68\x03\x64\x00\x10\x01\x8b\x02\x16\x03\x65\x00\x1b\x02\x0b\x03\xfc\x01\x56\x01\x4e\x00\x4f\x00\x46\x02\x54\x03\x36\x01\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x01\x02\xb2\x01\x47\x02\xaa\x03\x3e\x03\x3f\x03\x40\x03\x2e\x02\x9e\x00\x6f\x00\x50\x00\x97\x00\x51\x00\xed\x00\x52\x00\x53\x00\x54\x00\xd5\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\xfc\x02\x2b\x00\xb2\x03\x95\x00\xb3\x01\x97\x00\x64\x00\x95\x00\xee\x00\x97\x00\x65\x00\x97\x00\x18\x02\x97\x00\x99\x00\x4e\x00\x4f\x00\x6d\x00\x6e\x00\x6f\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x97\x00\xfb\x02\x97\x00\xcb\x00\x35\x01\x9a\x03\x3f\x03\x40\x03\x07\x01\x4d\x00\x50\x00\x41\x03\x51\x00\x18\x02\x52\x00\x53\x00\x54\x00\xbd\x01\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\xbf\x00\xe5\xff\x33\x01\x95\x00\xee\x00\x97\x00\x64\x00\xa1\x01\x3f\x01\x40\x01\x65\x00\x41\x03\x8c\x03\xd3\x00\x95\x00\xb3\x01\x97\x00\x6d\x00\x6e\x00\x6f\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x30\x01\xca\x00\xc0\x00\x56\x00\x57\x00\x58\x00\x27\x02\xc1\x00\xbf\x00\xd4\x00\x3d\x01\x3e\x01\xd3\x00\xcc\x00\xc2\x00\x62\x00\x63\x00\x46\x02\x28\x02\x95\x00\xb3\x01\x97\x00\xc3\x00\x64\x00\xcb\x00\x8d\x03\xc3\x00\xaf\x00\x98\x02\x47\x02\x13\x01\x99\x02\x27\x02\xee\x00\xbf\x00\xd4\x00\xff\xff\xc4\x00\x67\x00\x68\x00\x69\x00\xc5\x00\x6b\x00\x6c\x00\x28\x02\x41\x03\xab\x00\x95\x00\xee\x00\x97\x00\x6d\x00\x6e\x00\x6f\x00\xac\x00\x62\x00\x63\x00\x60\x03\xff\x01\x00\x02\x21\x01\xb2\x01\xef\x00\x64\x00\xce\x00\xcf\x00\xd0\x00\xfc\x02\xf0\x00\x90\x01\x71\x00\xe6\x01\x14\x03\xed\x00\x46\x02\xf1\x00\x62\x00\x63\x00\xb9\x01\x18\x02\xd5\x00\x20\xfe\x72\x00\xe7\x01\x64\x00\x91\x01\x47\x02\xd1\x00\x20\xfe\x02\x03\x00\x02\xe9\x02\xa3\x02\x6f\x00\x1e\x01\xcc\x00\xc6\x00\x6f\x00\xf2\x00\x67\x00\x68\x00\x69\x00\xf3\x00\x6b\x00\x6c\x00\xe6\x01\xd5\x00\xba\x01\x56\x00\x57\x00\x58\x00\xec\x00\xbb\x01\x95\x00\xee\x00\x20\xfe\x20\xfe\xe7\x01\x20\xfe\xbc\x01\x62\x00\x63\x00\xa9\x00\xed\x00\x95\x00\xee\x00\x97\x00\x01\x02\x64\x00\xff\xff\xb9\x03\xbd\x01\xa9\x02\x20\xfe\x07\x01\x4d\x00\xaf\x00\x18\x01\xe6\x01\x95\x00\xee\x00\x97\x00\xbe\x01\x67\x00\x68\x00\x69\x00\xbf\x01\x6b\x00\x6c\x00\x17\x02\xe7\x01\xaa\x00\x56\x00\x57\x00\x58\x00\x8b\x01\xab\x00\xf4\x00\x01\x02\x8c\x01\xaa\x02\x18\x02\xe1\x01\xac\x00\x62\x00\x63\x00\xae\x02\x95\x00\xb3\x01\x97\x00\xba\x03\x17\x01\x64\x00\x95\x00\xb3\x01\x97\x00\x95\x00\x95\x00\x97\x00\x97\x00\x95\x00\x16\x01\x97\x00\xc3\x01\xf4\x01\x14\x01\xad\x00\x67\x00\x68\x00\x69\x00\xae\x00\x6b\x00\x6c\x00\xb1\x02\x9f\x01\xc0\x00\x56\x00\x57\x00\x58\x00\xda\x00\xc1\x00\xaf\x00\x46\x02\xdb\x00\x15\x01\xb4\x01\xa4\x01\xc2\x00\x62\x00\x63\x00\x9e\x01\x95\x00\x0f\x01\x97\x00\x47\x02\x9f\x01\x64\x00\x95\x00\xee\x00\xc3\x00\x49\x03\xef\x00\xdc\x00\xce\x00\xcf\x00\xd0\x00\x06\x03\xf0\x00\x89\x03\x07\x03\xc4\x00\x67\x00\x68\x00\xeb\x01\xf1\x00\x62\x00\x63\x00\x9f\x01\x9f\x01\x3b\x02\xe1\x01\x0b\x01\x9f\x01\x64\x00\x95\x00\xaf\x00\xd1\x00\x07\x01\x4d\x00\xba\x01\x56\x00\x57\x00\x58\x00\x0a\x01\xbb\x01\x95\x00\xee\x00\xf2\x00\x67\x00\x68\x00\xeb\x01\xbc\x01\x62\x00\x63\x00\x33\x00\x34\x00\x35\x00\xe6\x01\x08\x01\x17\x02\x64\x00\x9f\x01\x9f\x01\xbd\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xe7\x01\xc3\x01\x18\x02\x31\x01\x32\x01\xbe\x01\x67\x00\x68\x00\xeb\x01\xaf\x02\x6f\x00\x07\x01\x4d\x00\xdd\x00\x67\x02\x34\x00\x35\x00\x28\x03\x68\x02\x31\x03\x69\x02\x6a\x02\x6b\x02\x04\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x95\x00\xa4\x01\x97\x00\x01\x01\x9f\x01\x6c\x02\xb8\x01\x51\x00\xf4\x00\x52\x00\x6d\x02\x6e\x02\x00\x01\x55\x00\x56\x00\x57\x00\x58\x00\x6f\x02\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xdb\x00\xc3\x00\x41\x01\x42\x01\x43\x01\x9f\x01\x64\x00\xaf\x00\x22\xfe\x7e\x01\x70\x02\xbf\x00\xec\x01\x67\x00\x68\x00\x69\x00\x06\x00\xed\x01\x6c\x00\xdc\x00\x07\x00\x7f\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x95\x00\x3b\x00\x95\x00\xee\x00\x07\x01\x4d\x00\x18\x00\x19\x00\x06\x00\xbe\x00\x3c\x00\xbf\x00\x07\x00\x3f\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xc1\x02\x3b\x00\xff\xff\xc0\x02\xee\x01\x6f\x00\x18\x00\x19\x00\xa1\x00\x3b\x02\x3c\x00\x6d\x00\xde\x01\x6f\x00\x67\x02\x34\x00\x35\x00\xa8\x01\xb5\x02\xbf\x00\x69\x02\x6a\x02\x6b\x02\xdd\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xf7\x00\x62\x03\x97\x00\x9f\x01\x63\x03\x6c\x02\x9f\x01\x51\x00\xa0\x00\x52\x00\x6d\x02\x6e\x02\x9f\x01\x55\x00\x56\x00\x57\x00\x58\x00\x6f\x02\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x97\x00\xde\x00\x9d\x00\xce\x00\xcf\x00\xd0\x00\x64\x00\xdf\x00\x37\x01\x38\x01\x70\x02\x08\x01\x34\x00\x35\x00\x9c\x00\xea\x01\x67\x00\x68\x00\xeb\x01\x07\x01\x4d\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xd1\x00\xf8\x00\x9b\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xff\xff\xe9\x00\x67\x00\x68\x00\x69\x00\xf9\x00\x6b\x00\x6c\x00\xf8\x01\xd7\x00\x06\x00\xce\x00\xcf\x00\xd0\x00\x07\x00\x26\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x97\x00\x3b\x00\x17\x03\xd1\x00\x2b\x00\x18\x03\x18\x00\x19\x00\xaf\x00\xea\x01\x3c\x00\x6d\x00\xde\x01\x6f\x00\x27\x01\x5a\x00\xe8\x01\x28\x01\x3f\x00\x29\x01\xe0\x01\x2a\x01\x61\x00\x62\x00\x63\x00\x69\x03\x92\xfe\xbf\x00\x6a\x03\x92\xfe\xe0\x00\x64\x00\x3f\x00\x06\x00\xb9\x01\x2b\x01\x3f\x00\x07\x00\xe5\xff\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x92\xfe\x3b\x00\x2c\x01\x3f\x00\x4e\x03\x4f\x03\x18\x00\x19\x00\x50\x03\x51\x01\x3c\x00\x52\x01\xa1\x01\x53\x01\x54\x01\x3f\x00\x06\x00\x55\x01\x56\x01\xd8\x00\x07\x00\x26\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xcd\x00\x2d\x01\xce\x00\xcf\x00\xd0\x00\xa3\x01\x18\x00\x19\x00\xfd\x00\xfe\x00\xd8\x01\x6d\x00\x2e\x01\x6f\x00\x27\x01\x5a\x00\x97\x00\x28\x01\x99\x01\x29\x01\xa1\x01\x2a\x01\x61\x00\x62\x00\x63\x00\xd1\x00\xfb\x00\xfc\x00\xd9\x01\x97\x01\x51\x00\x64\x00\x52\x00\xda\x01\xdb\x01\x2b\x01\x55\x00\x56\x00\x57\x00\x58\x00\xdc\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x93\x01\x27\x02\x8f\x01\xbf\x00\x8e\x01\x85\x01\x64\x00\x85\x01\x44\x02\xe6\x00\xdd\x01\x07\x01\x4d\x00\x28\x02\xe3\x01\x68\x00\xe4\x01\x97\x00\xd7\x00\x06\x00\xce\x00\xcf\x00\xd0\x00\x07\x00\x26\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x81\x01\x2d\x01\x77\x01\xd1\x00\xd2\x00\x76\x01\x18\x00\x19\x00\x8c\x02\xb4\x00\x36\x01\x6d\x00\x2e\x01\x6f\x00\x27\x01\x5a\x00\xb5\x00\x28\x01\x35\x01\x29\x01\x89\x02\x2a\x01\x61\x00\x62\x00\x63\x00\xa0\x02\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\x64\x00\xaf\x00\x3f\x01\x40\x01\x2b\x01\x33\x01\x6d\x00\xde\x01\x6f\x00\xbe\x00\xe9\x01\xbf\x00\xb6\x00\xb7\x00\x34\x01\xb8\x00\x41\x01\x42\x01\x43\x01\xaa\x00\x56\x00\x57\x00\x58\x00\x87\x02\xab\x00\x83\x01\x97\x00\xe3\x01\x68\x00\xe4\x01\xb9\x00\xac\x00\x62\x00\x63\x00\x3d\x01\x3e\x01\x95\x00\xee\x00\x97\x00\x06\x00\x64\x00\xaf\x00\xd8\x00\x07\x00\x26\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x7b\x02\x2d\x01\xa5\x00\x68\x00\x0a\x02\x78\x02\x18\x00\x19\x00\x37\x01\x38\x01\x57\x02\x6d\x00\x2e\x01\x6f\x00\x27\x01\x5a\x00\x7c\x02\x28\x01\x7a\x02\x29\x01\x79\x02\x2a\x01\x61\x00\x62\x00\x63\x00\xaf\x00\x07\x01\x4d\x00\xd9\x01\x77\x02\x51\x00\x64\x00\x52\x00\xda\x01\xdb\x01\x2b\x01\x55\x00\x56\x00\x57\x00\x58\x00\xdc\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xc3\x00\x76\x02\xaf\x00\x75\x02\xbd\x01\x81\x01\x64\x00\xd7\x01\xa8\x00\x6f\x00\xdd\x01\xec\x01\x67\x00\x68\x00\xeb\x01\x06\x02\x67\x00\x68\x00\xeb\x01\x06\x00\xa8\x01\x0c\x02\xbf\x00\x07\x00\x2b\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x61\x02\x2d\x01\x39\x01\x3a\x01\x3b\x01\x3c\x01\x18\x00\x19\x00\x09\x02\x1b\x02\xb7\x02\x6d\x00\x2e\x01\x6f\x00\x59\x02\x67\x00\x68\x00\xeb\x01\xa2\x00\x67\x00\x68\x00\xeb\x01\x51\x02\x27\x02\x67\x02\xbf\x00\xa8\x01\xe9\x01\xbf\x00\xee\x01\x6f\x00\xa8\x01\xd0\x02\xbf\x00\xaf\x00\x28\x02\x5f\x02\x6d\x00\xde\x01\x6f\x00\xd9\x01\x5e\x02\x51\x00\x5d\x02\x52\x00\xda\x01\xdb\x01\x5c\x02\x55\x00\x56\x00\x57\x00\x58\x00\xdc\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x42\x02\xa8\x01\xca\x02\xbf\x00\x07\x01\x4d\x00\x64\x00\x5b\x02\x1f\xfe\x97\x00\xdd\x01\x0f\x02\x6d\x00\xa4\x00\x6f\x00\x1f\xfe\x1b\x02\x46\x03\xd9\x01\x55\x02\x51\x00\x0f\x02\x52\x00\xda\x01\xdb\x01\x4a\x02\x55\x00\x56\x00\x57\x00\x58\x00\xdc\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x49\x02\x1f\xfe\x1f\xfe\x0f\x02\x1f\xfe\xc3\x00\x64\x00\xad\x01\xe6\x00\x41\x02\xdd\x01\x2d\x03\x2e\x03\xa5\x00\x68\x00\x0a\x02\xa8\x01\x36\x03\xbf\x00\x1f\xfe\x3f\x00\x38\x02\xa8\x01\x7c\x03\xbf\x00\x95\x00\xee\x00\x97\x00\xa1\x02\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\x2b\x03\x2c\x03\x6d\x00\xde\x01\x6f\x00\xd9\x01\x3a\x02\x51\x00\x0f\x02\x52\x00\xda\x01\xdb\x01\x33\x02\x55\x00\x56\x00\x57\x00\x58\x00\xdc\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x0f\x02\xc9\x00\x9e\x00\x6f\x00\x98\x00\x05\x00\x64\x00\x97\x00\xb0\x01\x6f\x00\xdd\x01\xa2\x02\xa3\x02\x6f\x00\x1d\x02\x6d\x00\xde\x01\x6f\x00\xd9\x01\x0f\x02\x51\x00\x1c\x02\x52\x00\xda\x01\xdb\x01\x0d\x02\x55\x00\x56\x00\x57\x00\x58\x00\xdc\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x06\x02\x91\x01\x34\x00\x35\x00\x72\x03\x73\x03\x64\x00\xba\x00\xbb\x00\xbc\x00\xdd\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x07\x01\x4d\x00\xbd\x01\xf8\x01\xf9\x01\xdd\x02\x05\x02\xc6\x02\xe5\x00\xe6\x00\xc7\x02\xe8\x00\xb4\x00\x06\x02\x67\x00\x68\x00\xeb\x01\x03\x03\x6f\x00\xb5\x00\x6d\x00\xde\x01\x6f\x00\xd9\x01\x04\x02\x51\x00\xff\x01\x52\x00\xda\x01\xdb\x01\x03\x02\x55\x00\x56\x00\x57\x00\x58\x00\xdc\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xb6\x00\xb7\x00\xfe\x01\xb8\x00\x5d\x03\x5e\x03\x64\x00\x9d\x00\x9e\x00\x6f\x00\xdd\x01\x73\x02\x34\x00\x35\x00\xfd\x01\x6d\x00\xde\x01\x6f\x00\xb9\x00\x09\x03\x2b\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xaf\x00\x06\x00\xba\x00\xbb\x00\xbc\x00\x07\x00\x02\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xff\x02\x3b\x00\x62\x02\x34\x00\x35\x00\xfe\x02\x18\x00\x19\x00\xf9\x02\xa1\x01\x3c\x00\x97\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xe8\x02\x4b\x02\xe5\x00\xe6\x00\xa6\x01\xbb\x00\xbc\x00\xea\x01\x67\x00\x68\x00\xeb\x01\xe7\x02\x6d\x00\xde\x01\x6f\x00\xbf\x02\x34\x00\x35\x00\xe5\x02\xa0\x02\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x9c\x01\x9e\x00\x6f\x00\x0f\x02\x06\x00\x9b\x01\x9e\x00\x6f\x00\x07\x00\xe4\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xdc\x02\x3b\x00\xbe\x02\x34\x00\x35\x00\xdb\x02\x18\x00\x19\x00\xcf\x02\xcd\x02\x3c\x00\xaf\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xc5\x02\x06\x00\x8a\x01\x9e\x00\x6f\x00\x07\x00\xc4\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x2b\x00\x3b\x00\x55\x02\x9e\x00\x6f\x00\xa1\x01\x18\x00\x19\x00\xba\x02\x06\x00\x3c\x00\xd7\x01\xa0\x02\x07\x00\xb4\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x21\xfe\x3b\x00\xbd\x02\x34\x00\x35\x00\x86\x02\x18\x00\x19\x00\x9f\x02\x5d\x03\x3c\x00\x59\x03\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x47\x02\xbb\x00\xbc\x00\x58\x03\x06\x00\x2f\x02\x9e\x00\x6f\x00\x07\x00\x55\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x52\x03\x3b\x00\x3d\x03\x34\x00\x35\x00\x51\x03\x18\x00\x19\x00\x4d\x03\x81\x03\x3c\x00\x4c\x03\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3f\x00\x44\x03\xea\x01\x67\x00\x68\x00\xeb\x01\x45\x03\x26\x03\x67\x00\x68\x00\xeb\x01\x7a\x03\x34\x00\x35\x00\xa0\x02\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\x3d\x03\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xba\x00\xbb\x00\xbc\x00\x3a\x03\x3c\x03\x06\x00\x08\x02\xbb\x00\xbc\x00\x07\x00\x0f\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x3b\x03\x3b\x00\xab\x03\x34\x00\x35\x00\x37\x03\x18\x00\x19\x00\x24\x03\xaf\x00\x3c\x00\x23\x03\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x07\x02\xbb\x00\xbc\x00\x22\x03\x06\x00\xba\x00\xbb\x00\xbc\x00\x07\x00\x97\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x21\x03\x3b\x00\x00\x03\xbb\x00\xbc\x00\x06\x00\x18\x00\x19\x00\x1e\x03\x07\x00\x3c\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x1d\x03\x3b\x00\xaa\x03\x34\x00\x35\x00\xa1\x01\x18\x00\x19\x00\x12\x03\x0d\x03\x3c\x00\x8b\x03\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xad\x01\xe6\x00\xae\x01\xe8\x00\xaf\x01\x06\x00\xa5\x00\x68\x00\x0a\x02\x07\x00\x88\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x86\x03\x3b\x00\xf5\x02\x9e\x00\x6f\x00\x97\x00\x18\x00\x19\x00\x06\x00\x84\x03\x3c\x00\x96\x03\x07\x00\x97\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x65\x01\xba\x01\x56\x00\x57\x00\x58\x00\x7e\x03\xbb\x01\x78\x03\x26\x03\x67\x00\x68\x00\xeb\x01\x71\x00\xbc\x01\x62\x00\x63\x00\x75\x03\x18\x00\x19\x00\xb0\x01\x6f\x00\x74\x03\x64\x00\x3f\x00\x72\x00\xbd\x01\xf1\x02\x9e\x00\x6f\x00\x06\x00\xf0\x02\x9e\x00\x6f\x00\x07\x00\xa1\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xa0\x03\x3b\x00\x93\x01\x9f\x03\x58\x01\x9c\x03\x18\x00\x19\x00\x9a\x03\x73\x00\x3c\x00\x74\x00\x75\x00\x99\x03\x76\x00\x97\x00\x77\x00\x94\x03\x97\x00\x78\x00\xa8\x03\x2b\x00\x79\x00\xa5\x03\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\xb6\x03\x7e\x01\xb5\x03\xbf\x00\x84\x00\x85\x00\x86\x00\x87\x00\x2b\x00\x88\x00\xb4\x03\xaf\x00\x89\x00\x7f\x01\xbe\x03\x8a\x00\x8b\x00\xbd\x03\x8c\x00\x8d\x00\x8e\x00\xbc\x03\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x2b\x00\x05\x00\xe1\x00\x44\x01\x1a\x01\x23\x01\x95\x00\x96\x00\x97\x00\x98\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xfb\xff\x1c\x01\x23\x00\x11\x01\x20\xfe\xec\x02\x9e\x00\x6f\x00\x06\x00\x04\x01\xfe\x00\x20\xfe\x07\x00\x24\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xb2\x00\x01\x01\xb9\x00\x94\x01\x25\x00\xf2\x01\x18\x00\x19\x00\xf1\x01\x20\xfe\x20\xfe\xe2\x00\x20\xfe\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xaf\x00\xe9\x00\x67\x00\x68\x00\x69\x00\xea\x00\x6b\x00\x6c\x00\x20\xfe\xe2\x01\xe0\x01\x06\x00\x26\x00\xd7\x01\x1b\x00\x07\x00\x97\x00\x0b\x01\x09\x00\x43\x01\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xc4\x01\x27\x00\x23\x00\x7f\x01\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\xc2\x01\xb6\x01\x18\x00\x19\x00\x24\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xb5\x01\xb3\x01\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x91\x03\x3e\x00\x3f\x00\xa5\x01\xa3\x01\x25\x00\x73\x00\x20\xfe\x40\x00\x75\x00\x41\x00\x76\x00\x42\x00\x77\x00\x20\xfe\x43\x00\x78\x00\x44\x00\x45\x00\x79\x00\xa1\x01\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x46\x00\x26\x00\x47\x00\x48\x00\x84\x00\x85\x00\x86\x00\x87\x00\x59\x01\x88\x00\x20\xfe\x20\xfe\x89\x00\x20\xfe\x49\x00\x8a\x00\x8b\x00\x27\x00\x8c\x00\x8d\x00\x8e\x00\x4a\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x20\xfe\x4b\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x72\x02\x97\x00\x73\x02\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\xeb\x02\x9e\x00\x6f\x00\x9d\x01\x58\x01\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x06\x00\x83\x02\x23\x00\xbd\x01\x07\x00\x64\x02\x25\x01\x09\x00\xc6\x02\xe5\x00\xe6\x00\x65\x02\x63\x02\x24\x00\x06\x02\x67\x00\x68\x00\xeb\x01\xea\x02\x9e\x00\x6f\x00\x56\x02\x50\x02\x4b\x02\xe5\x00\xe6\x00\x41\x02\x18\x00\x19\x00\xea\x01\x67\x00\x68\x00\xeb\x01\x25\x00\xd7\xff\xd7\xff\x3f\x02\xd7\xff\x3c\x02\xd7\xff\x3a\x02\xd7\xff\xd7\xff\x37\x02\xd7\xff\x0d\x02\xdc\x02\xd7\xff\xd0\x02\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\x07\x03\x26\x00\xc2\x02\xb4\x02\xd7\xff\xd7\xff\xd7\xff\xd7\xff\x5a\x03\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xaf\x00\xd7\xff\xd7\xff\x27\x00\xd7\xff\xd7\xff\xd7\xff\x83\x02\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xaf\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xd7\xff\xd7\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\xe5\x02\x9e\x00\x6f\x00\x83\x02\x4a\x03\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x48\x03\x47\x03\x23\x00\xc3\x00\xe0\x02\x9e\x00\x6f\x00\x46\x03\x4c\x02\xe5\x00\xe6\x00\x4d\x02\xe8\x00\x24\x00\xec\x01\x67\x00\x68\x00\xeb\x01\xc3\x00\xc1\x00\x47\x02\xbb\x00\xbc\x00\x4c\x02\xe5\x00\xe6\x00\xc2\x00\x62\x00\x63\x00\xec\x01\x67\x00\x68\x00\xeb\x01\x25\x00\x73\x00\x64\x00\x38\x03\x75\x00\xc3\x00\x76\x00\x37\x03\x77\x00\x0b\x03\xaf\x00\x78\x00\x8d\x03\x84\x03\x79\x00\x70\x03\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x6e\x03\x26\x00\x84\x03\xad\x03\x84\x00\x85\x00\x86\x00\x87\x00\x84\x03\x88\x00\xb0\x03\x00\x00\x89\x00\x4e\x02\x6f\x00\x8a\x00\x8b\x00\x27\x00\x8c\x00\x8d\x00\x8e\x00\xa6\x03\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x33\x03\x6f\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x96\x00\x97\x00\x73\x02\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\xa5\x03\xba\x03\x28\x03\x29\x03\x6f\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\xf9\x02\xcb\x02\xbb\x00\xbc\x00\xa9\x01\xe5\x00\xe6\x00\xaa\x01\xe8\x00\x24\x00\xa2\x00\x67\x00\x68\x00\xeb\x01\x00\x00\xbb\x01\x00\x00\x00\x00\x22\x02\x00\x00\xbf\x00\x00\x00\xbc\x01\x62\x00\x63\x00\x00\x00\x3f\x00\x00\x00\x00\x00\x25\x00\x23\x02\x64\x00\x00\x00\x00\x00\xbd\x01\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x26\x00\xca\x02\xbb\x00\xbc\x00\x85\x00\x86\x00\x87\x00\x1f\x03\x9e\x00\x6f\x00\x20\xfe\x6d\x00\xab\x01\x6f\x00\x8a\x00\x8b\x00\x27\x00\x20\xfe\x00\x00\x8e\x00\x00\x00\x00\x00\x90\x00\x00\x00\x92\x00\x93\x00\x94\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x96\x00\x97\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x20\xfe\x20\xfe\x00\x00\x20\xfe\xaf\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x7c\x02\x00\x00\x20\xfe\x47\x02\xbb\x00\xbc\x00\x00\x00\x00\x00\x95\x00\x24\x00\x97\x00\x55\x03\xbb\x00\xbc\x00\x47\x02\xbb\x00\xbc\x00\x00\x00\x22\x02\x00\x00\xbf\x00\x00\x00\x7d\x02\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\x00\x00\x25\x00\x23\x02\x32\x03\xbb\x00\xbc\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x26\x00\x1e\x03\x9e\x00\x6f\x00\x85\x00\x86\x00\x87\x00\x80\x03\x9e\x00\x6f\x00\xb4\x00\x6d\x00\x7e\x02\x6f\x00\x8a\x00\x8b\x00\x27\x00\xb5\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x90\x00\x00\x00\x92\x00\x93\x00\x94\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x96\x00\x97\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x06\x00\x00\x00\xb9\x00\x00\x00\x07\x00\x00\x00\x8e\x03\x09\x00\x95\x00\x24\x00\x97\x00\x7f\x03\x9e\x00\x6f\x00\x00\x00\x00\x00\xad\x01\xe6\x00\xae\x01\xe8\x00\x34\x03\x00\x00\xa5\x00\x68\x00\x0a\x02\x3e\x00\x3f\x00\x18\x00\x19\x00\x25\x00\x8f\x03\x00\x00\x40\x00\x00\x00\x41\x00\x00\x00\x42\x00\x00\x00\x00\x00\x43\x00\x00\x00\x44\x00\x45\x00\x00\x00\xad\x01\xe6\x00\xae\x01\xe8\x00\x4a\x02\x00\x00\xa5\x00\x68\x00\x0a\x02\x00\x00\x00\x00\x46\x00\x26\x00\x47\x00\x48\x00\xc1\x00\x7e\x03\x9e\x00\x6f\x00\xac\x03\x9e\x00\x6f\x00\xc2\x00\x62\x00\x63\x00\x49\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x64\x00\x4a\x00\x00\x00\xc3\x00\xb0\x01\x6f\x00\x47\x02\xbb\x00\xbc\x00\x4b\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x4d\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\xad\x02\x6b\x02\x77\x01\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\xb0\x01\x6f\x00\x6a\x03\xbb\x00\xbc\x00\x6c\x02\x00\x00\x51\x00\x00\x00\x52\x00\x6d\x02\x6e\x02\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\x6f\x02\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xb2\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x1b\x00\x00\x00\x70\x02\x00\x00\x7b\x01\x7c\x01\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\xca\x01\x00\x00\x00\x00\x23\x00\x00\x00\xad\x01\xe6\x00\xae\x01\xe8\x00\x43\x02\xc3\x00\xa5\x00\x68\x00\x0a\x02\x24\x00\x4c\x02\xe5\x00\xe6\x00\x4d\x02\xe8\x00\x00\x00\xec\x01\x67\x00\x68\x00\x69\x00\x06\x00\xed\x01\x6c\x00\x00\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x1b\x01\x25\x00\xf8\x00\x20\xfe\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\x20\xfe\xe9\x00\x67\x00\x68\x00\xeb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\xde\x01\x6f\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x01\x6f\x00\x20\xfe\x20\xfe\x50\x02\x20\xfe\x00\x00\x00\x00\x00\x00\x27\x00\xcb\x01\x4e\x02\x6f\x00\x00\x00\xb0\x02\x7e\x01\xed\x00\xbf\x00\x00\x00\x00\x00\x20\xfe\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x7f\x01\x97\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x37\x02\x00\x00\x00\x00\x23\x00\xb4\x00\x00\x00\x00\x00\x00\x00\xa5\x00\x68\x00\xa6\x00\xb5\x00\xa7\x00\x6c\x00\x24\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\xb5\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\x00\x00\xe9\x00\x67\x00\x68\x00\xeb\x01\x25\x00\x00\x00\xb4\x00\x00\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x06\x00\x00\x00\x00\x00\xb9\x00\x07\x00\x00\x00\x24\x01\x09\x00\x26\x00\x95\x00\xee\x00\x97\x00\xa8\x00\x6f\x00\xb9\x00\x00\x00\x00\x00\xb6\x00\xb7\x00\xc9\x02\xb8\x00\x00\x00\x97\x00\x00\x00\x27\x00\x20\xfe\x00\x00\x18\x00\x19\x00\x00\x00\x7e\x01\x18\x02\xbf\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x7f\x01\x97\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\xe3\x02\x00\x00\x06\x00\x23\x00\xb4\x00\x00\x00\x07\x00\x00\x00\xae\x03\x09\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x24\x00\x1f\xfe\x00\x00\xad\x01\xe6\x00\xae\x01\xe8\x00\xaf\x01\x1f\xfe\xa5\x00\x68\x00\xa6\x00\x00\x00\xa7\x00\x6c\x00\x18\x00\x19\x00\x00\x00\xaf\x03\x00\x00\x25\x00\x00\x00\xb4\x00\x00\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xfe\x1f\xfe\x00\x00\x1f\xfe\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x95\x00\xee\x00\x97\x00\x00\x00\x00\x00\x1f\xfe\x00\x00\x00\x00\xb6\x00\xb7\x00\x46\x02\xb8\x00\x00\x00\x97\x00\x00\x00\x27\x00\x1f\xfe\x06\x00\xb0\x01\x6f\x00\x00\x00\x07\x00\x47\x02\x0b\x01\x09\x00\x1b\x01\xb9\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x97\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x32\x02\x06\x00\x00\x00\x23\x00\xb4\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x63\x01\xb5\x00\x00\x00\x00\x00\x24\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x62\x00\x63\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x25\x03\x64\x00\x00\x00\x25\x00\x00\x00\x1f\xfe\x00\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x00\x00\x1f\xfe\x00\x00\x00\x00\x26\x03\x67\x00\x68\x00\xeb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x95\x00\xee\x00\x97\x00\x00\x00\xec\x01\x67\x00\x68\x00\xeb\x01\x1f\xfe\x1f\xfe\x00\x00\x1f\xfe\x00\x00\x00\x00\x00\x00\x27\x00\xa1\x02\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xfe\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x97\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\xa2\x02\x19\x03\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x1b\x00\x00\x00\x98\x02\x00\x00\x00\x00\x99\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x25\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x24\x00\xb5\x00\x00\x00\x4c\x02\xe5\x00\xe6\x00\x00\x00\x00\x00\x00\x00\xec\x01\x67\x00\x68\x00\xeb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x02\x66\x03\x26\x00\x25\x00\xa1\x02\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\x00\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x61\x01\xb9\x00\x26\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x00\x00\x27\x00\x18\x00\x19\x00\xa2\x02\x1a\x03\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x4d\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x98\x02\x00\x00\x00\x00\x99\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\xaa\x00\x56\x00\x57\x00\x58\x00\x06\x00\xab\x00\x00\x00\x00\x00\x07\x00\x00\x00\x21\x01\x09\x00\xac\x00\x62\x00\x63\x00\x00\x00\x9a\x02\xa2\x03\x1b\x00\x25\x00\x98\x02\x64\x00\x00\x00\x99\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x18\x00\x19\x00\x23\x00\x00\x00\x00\x00\xe3\x01\x68\x00\xe4\x01\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x02\x24\x00\x00\x00\x26\x00\x00\x00\x9a\x02\xbb\x00\xbc\x00\x9b\x02\x9c\x02\xa2\x00\x67\x00\x68\x00\xeb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x02\x27\x00\x00\x00\x25\x00\x7d\x02\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x4d\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x26\x00\x00\x00\x00\x00\xaf\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x6d\x00\xf3\x02\x6f\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x72\x01\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x4d\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x00\x00\x25\x00\x00\x00\x1b\x00\x5e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x1e\x01\x09\x00\xa8\x01\x26\x00\x24\x00\x00\x00\xa9\x01\xe5\x00\xe6\x00\xaa\x01\xe8\x00\x00\x00\xa2\x00\x67\x00\x68\x00\x69\x00\x00\x00\xa3\x00\x6c\x00\x27\x00\x00\x00\x18\x00\x19\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x22\x02\x00\x00\xbf\x00\x00\x00\x06\x00\x26\x00\x00\x00\x1b\x00\x07\x00\x00\x00\x1a\x01\x09\x00\x23\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x27\x00\x23\x00\x6d\x00\xab\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x24\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1f\xfe\x00\x00\x86\x02\x1b\x00\x00\x00\x25\x00\x00\x00\x1f\xfe\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\xad\x01\xe6\x00\xae\x01\xe8\x00\xc5\x02\x00\x00\xa5\x00\x68\x00\x0a\x02\xa1\x00\x24\x00\x00\x00\x00\x00\x26\x00\x00\x00\x1f\xfe\x1f\xfe\x00\x00\x1f\xfe\xa2\x00\x67\x00\x68\x00\x69\x00\x00\x00\xa3\x00\x6c\x00\x00\x00\x9a\x02\x00\x00\x27\x00\x25\x00\x00\x00\x00\x00\x1f\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x97\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x00\x00\x26\x00\x00\x00\x1b\x00\x11\x03\x00\x00\x00\x00\xb0\x01\x6f\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x27\x00\x23\x00\x00\x00\x6d\x00\xa4\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x06\x00\x23\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x69\x01\x24\x00\xed\x02\x00\x00\x26\x00\x00\x00\xa9\x01\xe5\x00\xe6\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x67\x00\x68\x00\xeb\x01\x18\x00\x19\x00\x9a\x02\x00\x00\x27\x00\x25\x00\x00\x00\x00\x00\x7d\x02\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x06\x00\x6d\x00\xee\x02\x6f\x00\x07\x00\x24\x00\x0b\x01\x09\x00\x60\x01\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1a\x01\x00\x00\x25\x00\x00\x00\x18\x00\x19\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x06\x00\x23\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x68\x01\x24\x00\x00\x00\x23\x01\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x18\x00\x19\x00\x23\x00\x00\x00\x27\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\xb4\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xb5\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x20\x01\x26\x00\x25\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x27\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x26\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\xb9\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x97\x00\x27\x00\x25\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x64\x01\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x26\x00\x18\x00\x19\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x24\x00\x0b\x01\x09\x00\x5f\x01\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1a\x01\x00\x00\x25\x00\x00\x00\x18\x00\x19\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x06\x00\x23\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x67\x01\x24\x00\x00\x00\x1b\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x18\x00\x19\x00\x23\x00\x19\x03\x27\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x18\x02\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x00\x00\x26\x00\x25\x00\x2a\x02\xe5\x00\xe6\x00\x00\x00\x00\x00\x00\x00\x2b\x02\x67\x00\x68\x00\xeb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\xb4\x00\x2c\x02\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\xb5\x00\x00\x00\x26\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x71\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x00\x00\x27\x00\x06\x00\x72\x00\x00\x00\x00\x00\x07\x00\x00\x00\x18\x01\x09\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\xb9\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x95\x00\xee\x00\x97\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x22\x02\x00\x00\xbf\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x00\x00\x00\x00\x89\x00\x23\x02\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x8d\x00\x8e\x00\x00\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\x96\x00\x97\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\x00\x00\x8a\x00\x8b\x00\x22\x02\x8c\x00\xbf\x00\x8e\x00\x00\x00\x8f\x00\xf6\x00\x91\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x23\x02\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\xf7\x00\x97\x00\x5f\x02\x00\x00\x51\x00\x00\x00\x52\x00\xda\x01\xdb\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xdc\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\xb4\x00\x64\x00\x75\x00\x00\x00\x76\x00\xdd\x01\x77\x00\xb5\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\x00\x00\x8a\x00\x8b\x00\x22\x02\x8c\x00\xbf\x00\x8e\x00\x00\x00\x8f\x00\xc8\x00\x91\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x23\x02\x00\x00\x00\x00\x00\x00\x06\x00\x95\x00\xc9\x00\x97\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x6d\x01\x6d\x00\xde\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x73\x00\x20\xfe\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x20\xfe\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x20\xfe\x20\xfe\x89\x00\x20\xfe\x00\x00\x8a\x00\x8b\x00\x27\x02\x8c\x00\xbf\x00\x8e\x00\x00\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x20\xfe\x28\x02\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\x96\x00\x97\x00\x00\x00\xd1\x02\x5a\x00\x00\x00\x28\x01\x00\x00\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\xd2\x02\xd3\x02\xd4\x02\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\xd5\x02\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x20\xfe\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x20\xfe\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x71\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x20\xfe\x20\xfe\x89\x00\x20\xfe\x72\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x20\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\x96\x00\x97\x00\x6d\x00\xd6\x02\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x71\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\x72\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\xf6\x00\x91\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x95\x00\xf7\x00\x97\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x6e\x01\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x18\x00\x19\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x71\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\x72\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\xc8\x00\x91\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x95\x00\xc9\x00\x97\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x6c\x01\x00\x00\x00\x00\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x18\x00\x19\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\x00\x00\x8a\x00\x8b\x00\x7e\x01\x8c\x00\xbf\x00\x8e\x00\x00\x00\x8f\x00\xc1\x01\x91\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x7f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\xc2\x01\x97\x00\x00\x00\xd1\x02\x5a\x00\x00\x00\x28\x01\x00\x00\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\xd2\x02\xd3\x02\xd4\x02\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\xd5\x02\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x20\xfe\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x20\xfe\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\xe6\x01\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x20\xfe\x20\xfe\x89\x00\x20\xfe\xe7\x01\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x20\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x00\x97\x00\x6d\x00\xd6\x02\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\xe6\x01\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\xe7\x01\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\xf6\x00\x91\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x95\x00\xf7\x00\x97\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x6b\x01\x00\x00\x00\x00\x00\x00\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x18\x00\x19\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\xe6\x01\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\xe7\x01\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\xc8\x00\x91\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x95\x00\xc9\x00\x97\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x6a\x01\x00\x00\x00\x00\x00\x00\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x18\x00\x19\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\xe6\x01\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\xe7\x01\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\xc1\x01\x91\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x95\x00\xc2\x01\x97\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x66\x01\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x18\x00\x19\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\xe6\x01\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\xe7\x01\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\xf6\x00\x91\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x95\x00\xf7\x00\x97\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x62\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x18\x00\x19\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\xe6\x01\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\xe7\x01\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\xc8\x00\x91\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x95\x00\xc9\x00\x97\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x84\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x18\x00\x19\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\x00\x00\x8a\x00\x8b\x00\x27\x02\x8c\x00\xbf\x00\x8e\x00\x00\x00\x8f\x00\xc1\x01\x91\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x28\x02\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\xc2\x01\x97\x00\x00\x00\xd1\x02\x5a\x00\x00\x00\x28\x01\x00\x00\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\x24\x03\xd3\x02\xd4\x02\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\xd5\x02\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x22\x02\x00\x00\xbf\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x00\x00\x00\x00\x89\x00\x23\x02\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\xb1\x00\x91\x00\x92\x00\x93\x00\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\xb2\x00\x97\x00\x6d\x00\xd6\x02\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x71\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x00\x00\x00\x00\x89\x00\x72\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\xb1\x00\x91\x00\x92\x00\x93\x00\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\xb2\x00\x97\x00\x00\x00\x00\x00\xad\x01\xe6\x00\xae\x01\xe8\x00\x4a\x02\x00\x00\xa5\x00\x68\x00\xa6\x00\x73\x00\xa7\x00\x6c\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\xe6\x01\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x00\x00\x00\x00\x89\x00\xe7\x01\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\xb1\x00\x91\x00\x92\x00\x93\x00\x94\x00\x00\x00\xb0\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x95\x00\xb2\x00\x97\x00\x00\x00\x00\x00\xad\x01\xe6\x00\xae\x01\xe8\x00\x43\x02\x00\x00\xa5\x00\x68\x00\xa6\x00\x73\x00\xa7\x00\x6c\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x7e\x01\x00\x00\xbf\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x00\x00\x00\x00\x89\x00\x7f\x01\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\xb1\x00\x91\x00\x92\x00\x93\x00\x94\x00\x00\x00\xb0\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x95\x00\xb2\x00\x97\x00\x00\x00\x00\x00\xad\x01\xe6\x00\xae\x01\xe8\x00\xc5\x02\x00\x00\xa5\x00\x68\x00\xa6\x00\x73\x00\xa7\x00\x6c\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x7e\x01\x00\x00\xbf\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x00\x00\x00\x00\x89\x00\x7f\x01\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\xb1\x00\x91\x00\x92\x00\x93\x00\x94\x00\x00\x00\xb0\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x97\x00\x46\x01\x47\x01\x48\x01\x49\x01\x4a\x01\x4b\x01\x4c\x01\x4d\x01\x4e\x01\x4f\x01\x50\x01\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\xe6\x01\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\xe7\x01\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x87\x00\x00\x00\x00\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x00\x00\x8a\x00\x8b\x00\x46\x02\x28\x03\x00\x00\x8e\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x47\x02\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x72\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\xe6\x01\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\xe6\x01\xe7\x01\x00\x00\x00\x00\xb4\x00\x85\x00\x86\x00\x87\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xe7\x01\x00\x00\x00\x00\x8a\x00\x8b\x00\xb4\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\xb1\x00\xb5\x00\x92\x00\x93\x00\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\xb2\x00\x97\x00\xb4\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\xb5\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\xee\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x95\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x97\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x97\x00\xcb\x01\xcc\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xcd\x01\x5a\x00\x5b\x00\x5c\x00\xce\x01\xcf\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\xcd\x02\x00\x00\x00\x00\xd0\x01\xa9\x01\xe5\x00\xe6\x00\x00\x00\xad\x01\xe6\x00\xa2\x00\x67\x00\x68\x00\xeb\x01\xa5\x00\x68\x00\x0a\x02\x00\x00\x00\x00\x00\x00\xd1\x01\xd2\x01\xd3\x01\x00\x00\x00\x00\x00\x00\x7f\x02\xbb\x00\xbc\x00\x80\x02\x81\x02\x00\x00\x00\x00\x00\x00\xcb\x01\xcc\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xcd\x01\x5a\x00\x5b\x00\x5c\x00\xce\x01\xcf\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\xab\x01\x6f\x00\x6d\x00\xef\x02\x6f\x00\xa5\x00\x68\x00\x0a\x02\x00\x00\x00\x00\x00\x00\xd1\x01\xd2\x01\xd3\x01\x00\x00\x00\x00\x00\x00\x7f\x02\xbb\x00\xbc\x00\x80\x02\x81\x02\xcb\x01\xcc\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xcd\x01\x5a\x00\x5b\x00\x5c\x00\xce\x01\xcf\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\xf4\x02\x6f\x00\x00\x00\x00\x00\x00\x00\xd1\x01\xd2\x01\xd3\x01\x00\x00\x00\x00\x00\x00\x7f\x02\xbb\x00\xbc\x00\x80\x02\x81\x02\xcb\x01\xcc\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xcd\x01\x5a\x00\x5b\x00\x5c\x00\xce\x01\xcf\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x82\x02\x6f\x00\x00\x00\x00\x00\x00\x00\xd1\x01\xd2\x01\xd3\x01\xd4\x01\x00\x00\x00\x00\x00\x00\x00\x00\xcb\x01\xcc\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xcd\x01\x5a\x00\x5b\x00\x5c\x00\xce\x01\xcf\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x2e\x03\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x2f\x03\xd0\x01\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\x00\x00\x15\x02\x67\x00\x68\x00\xeb\x01\x00\x00\x00\x00\x6d\x00\xd5\x01\x6f\x00\xd1\x01\xd2\x01\xd3\x01\x00\x00\x00\x00\x00\x00\xcb\x01\xcc\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xcd\x01\x5a\x00\x5b\x00\x5c\x00\xce\x01\xcf\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\xef\x00\xd0\x01\xce\x00\xcf\x00\xd0\x00\x00\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x62\x00\x63\x00\x00\x00\x6d\x00\xd5\x01\x6f\x00\xf6\x02\x00\x00\x64\x00\x00\x00\x00\x00\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x02\x67\x00\x68\x00\xeb\x01\x00\x00\xef\x00\x00\x00\xce\x00\xcf\x00\xd0\x00\x00\x00\xf0\x00\x29\x02\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\xf1\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\xd1\x00\x00\x00\x6d\x00\xd5\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x02\x67\x00\x68\x00\xeb\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x56\x00\x57\x00\x58\x00\x00\x00\xc1\x00\xc0\x00\x56\x00\x57\x00\x58\x00\xf4\x00\xc1\x00\xc2\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x62\x00\x63\x00\x64\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x02\x67\x00\x68\x00\xeb\x01\x00\x00\x00\x00\x1d\x02\x67\x00\x68\x00\xeb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x00\x00\x00\x1e\x02\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\xaa\x00\x56\x00\x57\x00\x58\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x02\xe6\x00\x00\x00\x00\x00\x14\x02\x6f\x00\xe3\x01\x68\x00\xe4\x01\x00\x00\x1f\x02\x20\x02\xba\x01\x56\x00\x57\x00\x58\x00\x00\x00\xbb\x01\x9a\x02\xbb\x00\xbc\x00\x9b\x02\x9c\x02\x00\x00\xbc\x01\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\xbd\x01\x00\x00\x00\x00\xaa\x00\x56\x00\x57\x00\x58\x00\x00\x00\xab\x00\x00\x00\x00\x00\xfc\x02\x67\x00\x68\x00\xeb\x01\xac\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\xaf\x00\xaa\x00\x56\x00\x57\x00\x58\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x23\x02\xe5\x00\xe6\x00\xac\x00\x62\x00\x63\x00\x24\x02\x67\x00\x68\x00\xeb\x01\x00\x00\x00\x00\x64\x00\x9a\x02\xbb\x00\xbc\x00\x9b\x02\x9c\x02\x25\x02\x78\x01\xbb\x00\xbc\x00\x79\x01\x7a\x01\x00\x00\x00\x00\x12\x02\x67\x00\x68\x00\xeb\x01\x27\x01\x5a\x00\xaf\x00\x28\x01\x00\x00\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\x2b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x01\x5a\x00\xf5\x01\x28\x01\x00\x00\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x06\x00\x64\x00\x00\x00\x00\x00\x07\x00\x2b\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xf6\x01\x00\x00\x00\x00\x00\x00\x52\x02\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x2e\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x53\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x2e\x01\x6f\x00\x27\x01\x5a\x00\x00\x00\x28\x01\x00\x00\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x95\x03\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x2f\x03\x2b\x01\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\x00\x00\x15\x02\x67\x00\x68\x00\xeb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x01\x5a\x00\x00\x00\x28\x01\x3d\x02\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x06\x00\x00\x00\x00\x00\x2b\x01\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x3e\x02\x00\x00\x10\x02\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x2e\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x11\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x2e\x01\x6f\x00\x27\x01\x5a\x00\x00\x00\x28\x01\x00\x00\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x58\x02\x2b\x01\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\x00\x00\x15\x02\x67\x00\x68\x00\xeb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x01\x5a\x00\x00\x00\x28\x01\xde\x02\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x06\x00\x00\x00\x00\x00\x2b\x01\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xdf\x02\x00\x00\xef\x01\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x2e\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x01\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x2e\x01\x6f\x00\x27\x01\x5a\x00\x00\x00\x28\x01\x00\x00\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x27\x01\x5a\x00\x2b\x01\x28\x01\x00\x00\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x27\x01\x5a\x00\x2b\x01\x28\x01\xa4\x02\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\xa5\x02\xa6\x02\x2b\x01\x00\x00\xa4\x02\x27\x01\x5a\x00\x00\x00\x28\x01\x00\x00\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x03\x00\x00\x64\x00\x88\x01\x00\x00\x00\x00\x2b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x2e\x01\x6f\x00\x00\x00\x00\x00\x27\x01\x5a\x00\x00\x00\x28\x01\x00\x00\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x87\x01\x00\x00\x00\x00\x6d\x00\x2e\x01\x6f\x00\x64\x00\x00\x00\x27\x01\x5a\x00\x2b\x01\x28\x01\x00\x00\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x2e\x01\x6f\x00\x64\x00\x00\x00\x00\x00\x00\x00\x2b\x01\x00\x00\xac\x02\x27\x01\x5a\x00\x00\x00\x28\x01\x00\x00\x29\x01\x00\x00\x2a\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x2e\x01\x6f\x00\x64\x00\xab\x02\x00\x00\x00\x00\x2b\x01\x00\x00\xf8\x00\x00\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xc3\x00\x15\x02\x67\x00\x68\x00\xeb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x02\x00\x00\x00\x00\x6d\x00\x2e\x01\x6f\x00\xe2\x00\x00\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\x00\x00\x15\x02\x67\x00\x68\x00\xeb\x01\x00\x00\xbd\x01\x00\x00\x6d\x00\x2e\x01\x6f\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xc6\x01\x6d\x00\x2e\x01\x6f\x00\x00\x00\x33\x02\x00\x00\x18\x00\x19\x00\xc5\x01\x00\x00\x06\x00\x34\x02\x35\x02\x6f\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xc6\x01\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x02\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\xaf\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xc6\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x01\x00\x00\x18\x00\x19\x00\xd8\x02\x00\x00\xd9\x02\x6d\x00\xc8\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x90\x00\x00\x00\x92\x00\x93\x00\x94\x00\xd8\x02\x00\x00\x32\x03\x00\x00\x00\x00\x00\x00\x00\x00\x96\x00\x97\x00\xda\x02\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x90\x00\x00\x00\x92\x00\x93\x00\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\x00\x00\x00\x96\x00\x97\x00\xda\x02\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\xd7\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x8c\x00\x00\x00\x00\x00\xb5\x00\x8f\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x7b\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x97\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x6f\x01\xb6\x00\xb7\x00\x89\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\x18\x00\x19\x00\x8f\x00\x3f\x00\x91\x00\x00\x00\x00\x00\x73\x00\xb9\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x97\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x8d\x00\x8e\x00\x00\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x00\x97\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xe8\x02\x00\x00\x00\x00\x00\x00\xf8\x02\x00\x00\x73\x00\x18\x00\x19\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x00\x97\x00\x73\x00\x20\xfe\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x20\xfe\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x20\xfe\x20\xfe\x89\x00\x20\xfe\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x20\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x01\x96\x00\x97\x00\x73\x00\x20\xfe\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x20\xfe\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x20\xfe\x20\xfe\x89\x00\x20\xfe\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x20\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x00\x97\x00\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\xc1\x01\x91\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x01\x97\x00\x1e\xfe\x1e\xfe\x00\x00\x1e\xfe\x00\x00\x1e\xfe\x00\x00\x1e\xfe\x1e\xfe\x00\x00\x1e\xfe\x00\x00\x00\x00\x1e\xfe\x00\x00\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x00\x00\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x00\x00\x1e\xfe\x1e\xfe\x00\x00\x1e\xfe\x00\x00\x1e\xfe\x00\x00\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\xfe\x1e\xfe\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x91\x00\x00\x00\x93\x00\x94\x00\xb9\x00\x00\x00\x73\x00\x00\x00\x00\x00\x75\x00\x00\x00\x76\x00\x97\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x8d\x00\x8e\x00\x00\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x96\x00\x97\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x00\x00\x88\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x00\x00\x8f\x00\xb1\x00\x91\x00\x92\x00\x93\x00\x94\x00\x00\x00\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x00\x00\xb2\x00\x97\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x8f\x00\xb4\x00\x91\x00\x75\x00\x00\x00\x76\x00\xb9\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x97\x00\x00\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x87\x00\x00\x00\x00\x00\xb6\x00\xb7\x00\x89\x00\xb8\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x91\x00\xb4\x00\x93\x00\x94\x00\xb9\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x00\x00\x97\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x87\x00\x00\x00\x00\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\xc1\x01\x00\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\xfe\x00\x00\xc2\x01\x97\x00\x1e\xfe\x00\x00\x1e\xfe\x1e\xfe\x00\x00\x1e\xfe\x00\x00\x00\x00\x1e\xfe\x00\x00\x1e\xfe\x00\x00\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\xfe\x1e\xfe\x1e\xfe\x00\x00\x00\x00\x1e\xfe\x1e\xfe\x00\x00\x1e\xfe\x00\x00\x1e\xfe\x1e\xfe\x00\x00\x00\x00\x00\x00\x1e\xfe\x00\x00\x00\x00\x1e\xfe\x00\x00\x1e\xfe\x1e\xfe\x1e\xfe\x1e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x1e\xfe\x1e\xfe\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x87\x00\x00\x00\x00\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\xc9\x00\x97\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x87\x00\x00\x00\x00\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\xc1\x01\x00\x00\x92\x00\x93\x00\x94\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\xc2\x01\x97\x00\x76\x00\x00\x00\x77\x00\xb5\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x87\x00\x00\x00\x00\x00\xb6\x00\xb7\x00\x00\x00\xb8\x00\x00\x00\x8a\x00\x8b\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x93\x00\x94\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x7b\x00\x06\x00\x00\x00\x00\x00\x97\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x72\x01\xb6\x00\xb7\x00\x89\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x00\x18\x00\x19\x00\x00\x00\x8f\x00\x00\x00\x91\x00\x76\x00\x00\x00\x77\x00\xb9\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x97\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x90\x00\x00\x00\x92\x00\x93\x00\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x00\x97\x00\xda\x02\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\xa8\x02\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x90\x00\x00\x00\x92\x00\x93\x00\x94\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x96\x00\x97\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x90\x00\x00\x00\x92\x00\x93\x00\x94\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x96\x00\x97\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x92\x00\x93\x00\x94\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\xb2\x00\x97\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x90\x00\x00\x00\x92\x00\x93\x00\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x00\x97\x00\x8f\x02\x00\x00\x90\x02\x91\x02\x92\x02\x93\x02\x94\x02\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x95\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x8f\x02\x96\x02\x59\x03\x91\x02\x92\x02\x93\x02\x94\x02\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x95\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x63\x03\x00\x00\x96\x02\x64\x03\x92\x02\x93\x02\x94\x02\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x95\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x18\x00\x19\x00\x00\x00\x07\x00\x96\x02\x0d\x03\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x02\x0e\x03\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x0f\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x95\x02\x00\x00\x60\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x95\x02\x00\x00\xa3\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x95\x02\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xc6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x30\x02\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\xaf\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x01\x01\x00\x00\x02\x01\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x01\x01\x00\x00\xbc\x02\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x01\x01\x00\x00\xbb\x02\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x01\x01\x00\x00\x79\x03\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x01\x01\x00\x00\x78\x03\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x17\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x9a\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x99\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x97\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x95\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x73\x01\x00\x00\x00\x00\x74\x01\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x70\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x5b\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x5c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x5a\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xba\x02\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x6f\x03\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x9d\x03\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xb7\x03\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xb6\x03\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x0d\x01\x18\x00\x19\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\xf4\x01\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x89\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x86\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x82\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x5e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x61\x02\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x8e\x02\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x8c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x5b\x03\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x1b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x14\x03\x18\x00\x19\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x89\x03\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x86\x03\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x82\x03\x18\x00\x19\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x7c\x03\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x6d\x03\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x6b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\xa2\x03\x18\x00\x19\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x97\x03\x18\x00\x19\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x94\x03\x18\x00\x19\x00\x07\x00\x00\x00\x91\x03\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x92\x03\x18\x00\x19\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x87\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x0b\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x8d\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyReduceArr = Happy_Data_Array.array (4, 496) [+ (4 , happyReduce_4),+ (5 , happyReduce_5),+ (6 , happyReduce_6),+ (7 , happyReduce_7),+ (8 , happyReduce_8),+ (9 , happyReduce_9),+ (10 , happyReduce_10),+ (11 , happyReduce_11),+ (12 , happyReduce_12),+ (13 , happyReduce_13),+ (14 , happyReduce_14),+ (15 , happyReduce_15),+ (16 , happyReduce_16),+ (17 , happyReduce_17),+ (18 , happyReduce_18),+ (19 , happyReduce_19),+ (20 , happyReduce_20),+ (21 , happyReduce_21),+ (22 , happyReduce_22),+ (23 , happyReduce_23),+ (24 , happyReduce_24),+ (25 , happyReduce_25),+ (26 , happyReduce_26),+ (27 , happyReduce_27),+ (28 , happyReduce_28),+ (29 , happyReduce_29),+ (30 , happyReduce_30),+ (31 , happyReduce_31),+ (32 , happyReduce_32),+ (33 , happyReduce_33),+ (34 , happyReduce_34),+ (35 , happyReduce_35),+ (36 , happyReduce_36),+ (37 , happyReduce_37),+ (38 , happyReduce_38),+ (39 , happyReduce_39),+ (40 , happyReduce_40),+ (41 , happyReduce_41),+ (42 , happyReduce_42),+ (43 , happyReduce_43),+ (44 , happyReduce_44),+ (45 , happyReduce_45),+ (46 , happyReduce_46),+ (47 , happyReduce_47),+ (48 , happyReduce_48),+ (49 , happyReduce_49),+ (50 , happyReduce_50),+ (51 , happyReduce_51),+ (52 , happyReduce_52),+ (53 , happyReduce_53),+ (54 , happyReduce_54),+ (55 , happyReduce_55),+ (56 , happyReduce_56),+ (57 , happyReduce_57),+ (58 , happyReduce_58),+ (59 , happyReduce_59),+ (60 , happyReduce_60),+ (61 , happyReduce_61),+ (62 , happyReduce_62),+ (63 , happyReduce_63),+ (64 , happyReduce_64),+ (65 , happyReduce_65),+ (66 , happyReduce_66),+ (67 , happyReduce_67),+ (68 , happyReduce_68),+ (69 , happyReduce_69),+ (70 , happyReduce_70),+ (71 , happyReduce_71),+ (72 , happyReduce_72),+ (73 , happyReduce_73),+ (74 , happyReduce_74),+ (75 , happyReduce_75),+ (76 , happyReduce_76),+ (77 , happyReduce_77),+ (78 , happyReduce_78),+ (79 , happyReduce_79),+ (80 , happyReduce_80),+ (81 , happyReduce_81),+ (82 , happyReduce_82),+ (83 , happyReduce_83),+ (84 , happyReduce_84),+ (85 , happyReduce_85),+ (86 , happyReduce_86),+ (87 , happyReduce_87),+ (88 , happyReduce_88),+ (89 , happyReduce_89),+ (90 , happyReduce_90),+ (91 , happyReduce_91),+ (92 , happyReduce_92),+ (93 , happyReduce_93),+ (94 , happyReduce_94),+ (95 , happyReduce_95),+ (96 , happyReduce_96),+ (97 , happyReduce_97),+ (98 , happyReduce_98),+ (99 , happyReduce_99),+ (100 , happyReduce_100),+ (101 , happyReduce_101),+ (102 , happyReduce_102),+ (103 , happyReduce_103),+ (104 , happyReduce_104),+ (105 , happyReduce_105),+ (106 , happyReduce_106),+ (107 , happyReduce_107),+ (108 , happyReduce_108),+ (109 , happyReduce_109),+ (110 , happyReduce_110),+ (111 , happyReduce_111),+ (112 , happyReduce_112),+ (113 , happyReduce_113),+ (114 , happyReduce_114),+ (115 , happyReduce_115),+ (116 , happyReduce_116),+ (117 , happyReduce_117),+ (118 , happyReduce_118),+ (119 , happyReduce_119),+ (120 , happyReduce_120),+ (121 , happyReduce_121),+ (122 , happyReduce_122),+ (123 , happyReduce_123),+ (124 , happyReduce_124),+ (125 , happyReduce_125),+ (126 , happyReduce_126),+ (127 , happyReduce_127),+ (128 , happyReduce_128),+ (129 , happyReduce_129),+ (130 , happyReduce_130),+ (131 , happyReduce_131),+ (132 , happyReduce_132),+ (133 , happyReduce_133),+ (134 , happyReduce_134),+ (135 , happyReduce_135),+ (136 , happyReduce_136),+ (137 , happyReduce_137),+ (138 , happyReduce_138),+ (139 , happyReduce_139),+ (140 , happyReduce_140),+ (141 , happyReduce_141),+ (142 , happyReduce_142),+ (143 , happyReduce_143),+ (144 , happyReduce_144),+ (145 , happyReduce_145),+ (146 , happyReduce_146),+ (147 , happyReduce_147),+ (148 , happyReduce_148),+ (149 , happyReduce_149),+ (150 , happyReduce_150),+ (151 , happyReduce_151),+ (152 , happyReduce_152),+ (153 , happyReduce_153),+ (154 , happyReduce_154),+ (155 , happyReduce_155),+ (156 , happyReduce_156),+ (157 , happyReduce_157),+ (158 , happyReduce_158),+ (159 , happyReduce_159),+ (160 , happyReduce_160),+ (161 , happyReduce_161),+ (162 , happyReduce_162),+ (163 , happyReduce_163),+ (164 , happyReduce_164),+ (165 , happyReduce_165),+ (166 , happyReduce_166),+ (167 , happyReduce_167),+ (168 , happyReduce_168),+ (169 , happyReduce_169),+ (170 , happyReduce_170),+ (171 , happyReduce_171),+ (172 , happyReduce_172),+ (173 , happyReduce_173),+ (174 , happyReduce_174),+ (175 , happyReduce_175),+ (176 , happyReduce_176),+ (177 , happyReduce_177),+ (178 , happyReduce_178),+ (179 , happyReduce_179),+ (180 , happyReduce_180),+ (181 , happyReduce_181),+ (182 , happyReduce_182),+ (183 , happyReduce_183),+ (184 , happyReduce_184),+ (185 , happyReduce_185),+ (186 , happyReduce_186),+ (187 , happyReduce_187),+ (188 , happyReduce_188),+ (189 , happyReduce_189),+ (190 , happyReduce_190),+ (191 , happyReduce_191),+ (192 , happyReduce_192),+ (193 , happyReduce_193),+ (194 , happyReduce_194),+ (195 , happyReduce_195),+ (196 , happyReduce_196),+ (197 , happyReduce_197),+ (198 , happyReduce_198),+ (199 , happyReduce_199),+ (200 , happyReduce_200),+ (201 , happyReduce_201),+ (202 , happyReduce_202),+ (203 , happyReduce_203),+ (204 , happyReduce_204),+ (205 , happyReduce_205),+ (206 , happyReduce_206),+ (207 , happyReduce_207),+ (208 , happyReduce_208),+ (209 , happyReduce_209),+ (210 , happyReduce_210),+ (211 , happyReduce_211),+ (212 , happyReduce_212),+ (213 , happyReduce_213),+ (214 , happyReduce_214),+ (215 , happyReduce_215),+ (216 , happyReduce_216),+ (217 , happyReduce_217),+ (218 , happyReduce_218),+ (219 , happyReduce_219),+ (220 , happyReduce_220),+ (221 , happyReduce_221),+ (222 , happyReduce_222),+ (223 , happyReduce_223),+ (224 , happyReduce_224),+ (225 , happyReduce_225),+ (226 , happyReduce_226),+ (227 , happyReduce_227),+ (228 , happyReduce_228),+ (229 , happyReduce_229),+ (230 , happyReduce_230),+ (231 , happyReduce_231),+ (232 , happyReduce_232),+ (233 , happyReduce_233),+ (234 , happyReduce_234),+ (235 , happyReduce_235),+ (236 , happyReduce_236),+ (237 , happyReduce_237),+ (238 , happyReduce_238),+ (239 , happyReduce_239),+ (240 , happyReduce_240),+ (241 , happyReduce_241),+ (242 , happyReduce_242),+ (243 , happyReduce_243),+ (244 , happyReduce_244),+ (245 , happyReduce_245),+ (246 , happyReduce_246),+ (247 , happyReduce_247),+ (248 , happyReduce_248),+ (249 , happyReduce_249),+ (250 , happyReduce_250),+ (251 , happyReduce_251),+ (252 , happyReduce_252),+ (253 , happyReduce_253),+ (254 , happyReduce_254),+ (255 , happyReduce_255),+ (256 , happyReduce_256),+ (257 , happyReduce_257),+ (258 , happyReduce_258),+ (259 , happyReduce_259),+ (260 , happyReduce_260),+ (261 , happyReduce_261),+ (262 , happyReduce_262),+ (263 , happyReduce_263),+ (264 , happyReduce_264),+ (265 , happyReduce_265),+ (266 , happyReduce_266),+ (267 , happyReduce_267),+ (268 , happyReduce_268),+ (269 , happyReduce_269),+ (270 , happyReduce_270),+ (271 , happyReduce_271),+ (272 , happyReduce_272),+ (273 , happyReduce_273),+ (274 , happyReduce_274),+ (275 , happyReduce_275),+ (276 , happyReduce_276),+ (277 , happyReduce_277),+ (278 , happyReduce_278),+ (279 , happyReduce_279),+ (280 , happyReduce_280),+ (281 , happyReduce_281),+ (282 , happyReduce_282),+ (283 , happyReduce_283),+ (284 , happyReduce_284),+ (285 , happyReduce_285),+ (286 , happyReduce_286),+ (287 , happyReduce_287),+ (288 , happyReduce_288),+ (289 , happyReduce_289),+ (290 , happyReduce_290),+ (291 , happyReduce_291),+ (292 , happyReduce_292),+ (293 , happyReduce_293),+ (294 , happyReduce_294),+ (295 , happyReduce_295),+ (296 , happyReduce_296),+ (297 , happyReduce_297),+ (298 , happyReduce_298),+ (299 , happyReduce_299),+ (300 , happyReduce_300),+ (301 , happyReduce_301),+ (302 , happyReduce_302),+ (303 , happyReduce_303),+ (304 , happyReduce_304),+ (305 , happyReduce_305),+ (306 , happyReduce_306),+ (307 , happyReduce_307),+ (308 , happyReduce_308),+ (309 , happyReduce_309),+ (310 , happyReduce_310),+ (311 , happyReduce_311),+ (312 , happyReduce_312),+ (313 , happyReduce_313),+ (314 , happyReduce_314),+ (315 , happyReduce_315),+ (316 , happyReduce_316),+ (317 , happyReduce_317),+ (318 , happyReduce_318),+ (319 , happyReduce_319),+ (320 , happyReduce_320),+ (321 , happyReduce_321),+ (322 , happyReduce_322),+ (323 , happyReduce_323),+ (324 , happyReduce_324),+ (325 , happyReduce_325),+ (326 , happyReduce_326),+ (327 , happyReduce_327),+ (328 , happyReduce_328),+ (329 , happyReduce_329),+ (330 , happyReduce_330),+ (331 , happyReduce_331),+ (332 , happyReduce_332),+ (333 , happyReduce_333),+ (334 , happyReduce_334),+ (335 , happyReduce_335),+ (336 , happyReduce_336),+ (337 , happyReduce_337),+ (338 , happyReduce_338),+ (339 , happyReduce_339),+ (340 , happyReduce_340),+ (341 , happyReduce_341),+ (342 , happyReduce_342),+ (343 , happyReduce_343),+ (344 , happyReduce_344),+ (345 , happyReduce_345),+ (346 , happyReduce_346),+ (347 , happyReduce_347),+ (348 , happyReduce_348),+ (349 , happyReduce_349),+ (350 , happyReduce_350),+ (351 , happyReduce_351),+ (352 , happyReduce_352),+ (353 , happyReduce_353),+ (354 , happyReduce_354),+ (355 , happyReduce_355),+ (356 , happyReduce_356),+ (357 , happyReduce_357),+ (358 , happyReduce_358),+ (359 , happyReduce_359),+ (360 , happyReduce_360),+ (361 , happyReduce_361),+ (362 , happyReduce_362),+ (363 , happyReduce_363),+ (364 , happyReduce_364),+ (365 , happyReduce_365),+ (366 , happyReduce_366),+ (367 , happyReduce_367),+ (368 , happyReduce_368),+ (369 , happyReduce_369),+ (370 , happyReduce_370),+ (371 , happyReduce_371),+ (372 , happyReduce_372),+ (373 , happyReduce_373),+ (374 , happyReduce_374),+ (375 , happyReduce_375),+ (376 , happyReduce_376),+ (377 , happyReduce_377),+ (378 , happyReduce_378),+ (379 , happyReduce_379),+ (380 , happyReduce_380),+ (381 , happyReduce_381),+ (382 , happyReduce_382),+ (383 , happyReduce_383),+ (384 , happyReduce_384),+ (385 , happyReduce_385),+ (386 , happyReduce_386),+ (387 , happyReduce_387),+ (388 , happyReduce_388),+ (389 , happyReduce_389),+ (390 , happyReduce_390),+ (391 , happyReduce_391),+ (392 , happyReduce_392),+ (393 , happyReduce_393),+ (394 , happyReduce_394),+ (395 , happyReduce_395),+ (396 , happyReduce_396),+ (397 , happyReduce_397),+ (398 , happyReduce_398),+ (399 , happyReduce_399),+ (400 , happyReduce_400),+ (401 , happyReduce_401),+ (402 , happyReduce_402),+ (403 , happyReduce_403),+ (404 , happyReduce_404),+ (405 , happyReduce_405),+ (406 , happyReduce_406),+ (407 , happyReduce_407),+ (408 , happyReduce_408),+ (409 , happyReduce_409),+ (410 , happyReduce_410),+ (411 , happyReduce_411),+ (412 , happyReduce_412),+ (413 , happyReduce_413),+ (414 , happyReduce_414),+ (415 , happyReduce_415),+ (416 , happyReduce_416),+ (417 , happyReduce_417),+ (418 , happyReduce_418),+ (419 , happyReduce_419),+ (420 , happyReduce_420),+ (421 , happyReduce_421),+ (422 , happyReduce_422),+ (423 , happyReduce_423),+ (424 , happyReduce_424),+ (425 , happyReduce_425),+ (426 , happyReduce_426),+ (427 , happyReduce_427),+ (428 , happyReduce_428),+ (429 , happyReduce_429),+ (430 , happyReduce_430),+ (431 , happyReduce_431),+ (432 , happyReduce_432),+ (433 , happyReduce_433),+ (434 , happyReduce_434),+ (435 , happyReduce_435),+ (436 , happyReduce_436),+ (437 , happyReduce_437),+ (438 , happyReduce_438),+ (439 , happyReduce_439),+ (440 , happyReduce_440),+ (441 , happyReduce_441),+ (442 , happyReduce_442),+ (443 , happyReduce_443),+ (444 , happyReduce_444),+ (445 , happyReduce_445),+ (446 , happyReduce_446),+ (447 , happyReduce_447),+ (448 , happyReduce_448),+ (449 , happyReduce_449),+ (450 , happyReduce_450),+ (451 , happyReduce_451),+ (452 , happyReduce_452),+ (453 , happyReduce_453),+ (454 , happyReduce_454),+ (455 , happyReduce_455),+ (456 , happyReduce_456),+ (457 , happyReduce_457),+ (458 , happyReduce_458),+ (459 , happyReduce_459),+ (460 , happyReduce_460),+ (461 , happyReduce_461),+ (462 , happyReduce_462),+ (463 , happyReduce_463),+ (464 , happyReduce_464),+ (465 , happyReduce_465),+ (466 , happyReduce_466),+ (467 , happyReduce_467),+ (468 , happyReduce_468),+ (469 , happyReduce_469),+ (470 , happyReduce_470),+ (471 , happyReduce_471),+ (472 , happyReduce_472),+ (473 , happyReduce_473),+ (474 , happyReduce_474),+ (475 , happyReduce_475),+ (476 , happyReduce_476),+ (477 , happyReduce_477),+ (478 , happyReduce_478),+ (479 , happyReduce_479),+ (480 , happyReduce_480),+ (481 , happyReduce_481),+ (482 , happyReduce_482),+ (483 , happyReduce_483),+ (484 , happyReduce_484),+ (485 , happyReduce_485),+ (486 , happyReduce_486),+ (487 , happyReduce_487),+ (488 , happyReduce_488),+ (489 , happyReduce_489),+ (490 , happyReduce_490),+ (491 , happyReduce_491),+ (492 , happyReduce_492),+ (493 , happyReduce_493),+ (494 , happyReduce_494),+ (495 , happyReduce_495),+ (496 , happyReduce_496)+ ]++happy_n_terms = 119 :: Int+happy_n_nonterms = 131 :: Int++happyReduce_4 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_4 = happyMonadReduce 1# 0# happyReduction_4+happyReduction_4 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut8 happy_x_1 of { 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 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_5 = happySpecReduce_0 1# happyReduction_5+happyReduction_5 = happyIn8+ (empty+ )++happyReduce_6 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_6 = happySpecReduce_2 1# happyReduction_6+happyReduction_6 happy_x_2+ happy_x_1+ = case happyOut8 happy_x_1 of { happy_var_1 -> + happyIn8+ (happy_var_1+ )}++happyReduce_7 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_7 = happySpecReduce_2 1# happyReduction_7+happyReduction_7 happy_x_2+ happy_x_1+ = case happyOut8 happy_x_1 of { happy_var_1 -> + case happyOut9 happy_x_2 of { happy_var_2 -> + happyIn8+ (happy_var_1 `snoc` happy_var_2+ )}}++happyReduce_8 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_8 = happySpecReduce_1 2# happyReduction_8+happyReduction_8 happy_x_1+ = case happyOut10 happy_x_1 of { happy_var_1 -> + happyIn9+ (CFDefExt happy_var_1+ )}++happyReduce_9 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_9 = happySpecReduce_1 2# happyReduction_9+happyReduction_9 happy_x_1+ = case happyOut32 happy_x_1 of { happy_var_1 -> + happyIn9+ (CDeclExt happy_var_1+ )}++happyReduce_10 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_10 = happySpecReduce_2 2# happyReduction_10+happyReduction_10 happy_x_2+ happy_x_1+ = case happyOut9 happy_x_2 of { happy_var_2 -> + happyIn9+ (happy_var_2+ )}++happyReduce_11 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+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) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut128 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CAsmExt happy_var_3)}})+ ) (\r -> happyReturn (happyIn9 r))++happyReduce_12 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_12 = happyMonadReduce 2# 3# happyReduction_12+happyReduction_12 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut11 happy_x_1 of { happy_var_1 -> + case happyOut14 happy_x_2 of { happy_var_2 -> + ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef [] happy_var_1 [] happy_var_2))}})+ ) (\r -> happyReturn (happyIn10 r))++happyReduce_13 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_13 = happyMonadReduce 3# 3# happyReduction_13+happyReduction_13 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut133 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_1 $ CFunDef (liftCAttrs happy_var_1) happy_var_2 [] happy_var_3))}}})+ ) (\r -> happyReturn (happyIn10 r))++happyReduce_14 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_14 = happyMonadReduce 3# 3# happyReduction_14+happyReduction_14 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut37 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_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}})+ ) (\r -> happyReturn (happyIn10 r))++happyReduce_15 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_15 = happyMonadReduce 3# 3# happyReduction_15+happyReduction_15 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut44 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_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}})+ ) (\r -> happyReturn (happyIn10 r))++happyReduce_16 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_16 = happyMonadReduce 3# 3# happyReduction_16+happyReduction_16 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut38 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_1 $ CFunDef (reverse happy_var_1) happy_var_2 [] happy_var_3))}}})+ ) (\r -> happyReturn (happyIn10 r))++happyReduce_17 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_17 = happyMonadReduce 3# 3# happyReduction_17+happyReduction_17 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 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_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 [] happy_var_3))}}})+ ) (\r -> happyReturn (happyIn10 r))++happyReduce_18 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_18 = happyMonadReduce 4# 3# happyReduction_18+happyReduction_18 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut11 happy_x_3 of { happy_var_3 -> + case happyOut14 happy_x_4 of { happy_var_4 -> + ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 [] happy_var_4))}}}})+ ) (\r -> happyReturn (happyIn10 r))++happyReduce_19 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_19 = happyMonadReduce 3# 3# happyReduction_19+happyReduction_19 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut79 happy_x_1 of { happy_var_1 -> + case happyOut33 happy_x_2 of { happy_var_2 -> + case happyOut14 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CFunDef [] happy_var_1 (reverse happy_var_2) happy_var_3)}}})+ ) (\r -> happyReturn (happyIn10 r))++happyReduce_20 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_20 = happyMonadReduce 4# 3# happyReduction_20+happyReduction_20 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut133 happy_x_1 of { happy_var_1 -> + case happyOut79 happy_x_2 of { happy_var_2 -> + case happyOut33 happy_x_3 of { happy_var_3 -> + case happyOut14 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_2 $ CFunDef (liftCAttrs happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}})+ ) (\r -> happyReturn (happyIn10 r))++happyReduce_21 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_21 = happyMonadReduce 4# 3# happyReduction_21+happyReduction_21 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut37 happy_x_1 of { happy_var_1 -> + case happyOut79 happy_x_2 of { happy_var_2 -> + case happyOut33 happy_x_3 of { happy_var_3 -> + case happyOut14 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 (reverse happy_var_3) happy_var_4)}}}})+ ) (\r -> happyReturn (happyIn10 r))++happyReduce_22 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_22 = happyMonadReduce 4# 3# happyReduction_22+happyReduction_22 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut44 happy_x_1 of { happy_var_1 -> + case happyOut79 happy_x_2 of { happy_var_2 -> + case happyOut33 happy_x_3 of { happy_var_3 -> + case happyOut14 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 (reverse happy_var_3) happy_var_4)}}}})+ ) (\r -> happyReturn (happyIn10 r))++happyReduce_23 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_23 = happyMonadReduce 4# 3# happyReduction_23+happyReduction_23 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut38 happy_x_1 of { happy_var_1 -> + case happyOut79 happy_x_2 of { happy_var_2 -> + case happyOut33 happy_x_3 of { happy_var_3 -> + case happyOut14 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}})+ ) (\r -> happyReturn (happyIn10 r))++happyReduce_24 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_24 = happyMonadReduce 4# 3# happyReduction_24+happyReduction_24 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut79 happy_x_2 of { happy_var_2 -> + case happyOut33 happy_x_3 of { happy_var_3 -> + case happyOut14 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}})+ ) (\r -> happyReturn (happyIn10 r))++happyReduce_25 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_25 = happyMonadReduce 5# 3# happyReduction_25+happyReduction_25 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut79 happy_x_3 of { happy_var_3 -> + case happyOut33 happy_x_4 of { happy_var_4 -> + case happyOut14 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 (reverse happy_var_4) happy_var_5)}}}}})+ ) (\r -> happyReturn (happyIn10 r))++happyReduce_26 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_26 = happyMonadReduce 1# 4# happyReduction_26+happyReduction_26 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut75 happy_x_1 of { happy_var_1 -> + ( let declr = reverseDeclr happy_var_1 in+ enterScope >> doFuncParamDeclIdent declr >> return declr)})+ ) (\r -> happyReturn (happyIn11 r))++happyReduce_27 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_27 = happySpecReduce_1 5# happyReduction_27+happyReduction_27 happy_x_1+ = case happyOut13 happy_x_1 of { happy_var_1 -> + happyIn12+ (happy_var_1+ )}++happyReduce_28 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_28 = happySpecReduce_1 5# happyReduction_28+happyReduction_28 happy_x_1+ = case happyOut14 happy_x_1 of { happy_var_1 -> + happyIn12+ (happy_var_1+ )}++happyReduce_29 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_29 = happySpecReduce_1 5# happyReduction_29+happyReduction_29 happy_x_1+ = case happyOut22 happy_x_1 of { happy_var_1 -> + happyIn12+ (happy_var_1+ )}++happyReduce_30 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_30 = happySpecReduce_1 5# happyReduction_30+happyReduction_30 happy_x_1+ = case happyOut23 happy_x_1 of { happy_var_1 -> + happyIn12+ (happy_var_1+ )}++happyReduce_31 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_31 = happySpecReduce_1 5# happyReduction_31+happyReduction_31 happy_x_1+ = case happyOut24 happy_x_1 of { happy_var_1 -> + happyIn12+ (happy_var_1+ )}++happyReduce_32 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_32 = happySpecReduce_1 5# happyReduction_32+happyReduction_32 happy_x_1+ = case happyOut25 happy_x_1 of { happy_var_1 -> + happyIn12+ (happy_var_1+ )}++happyReduce_33 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_33 = happyMonadReduce 1# 5# happyReduction_33+happyReduction_33 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut26 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 (CAsm happy_var_1))})+ ) (\r -> happyReturn (happyIn12 r))++happyReduce_34 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_34 = happyMonadReduce 4# 6# happyReduction_34+happyReduction_34 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut131 happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + case happyOut12 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ CLabel happy_var_1 happy_var_4 happy_var_3)}}})+ ) (\r -> happyReturn (happyIn13 r))++happyReduce_35 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_35 = happyMonadReduce 4# 6# happyReduction_35+happyReduction_35 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut126 happy_x_2 of { happy_var_2 -> + case happyOut12 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ CCase happy_var_2 happy_var_4)}}})+ ) (\r -> happyReturn (happyIn13 r))++happyReduce_36 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_36 = happyMonadReduce 3# 6# happyReduction_36+happyReduction_36 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut12 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CDefault happy_var_3)}})+ ) (\r -> happyReturn (happyIn13 r))++happyReduce_37 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_37 = happyMonadReduce 6# 6# happyReduction_37+happyReduction_37 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut126 happy_x_2 of { happy_var_2 -> + case happyOut126 happy_x_4 of { happy_var_4 -> + case happyOut12 happy_x_6 of { happy_var_6 -> + ( withNodeInfo happy_var_1 $ CCases happy_var_2 happy_var_4 happy_var_6)}}}})+ ) (\r -> happyReturn (happyIn13 r))++happyReduce_38 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_38 = happyMonadReduce 5# 7# happyReduction_38+happyReduction_38 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut17 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CCompound [] (reverse happy_var_3))}})+ ) (\r -> happyReturn (happyIn14 r))++happyReduce_39 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_39 = happyMonadReduce 6# 7# happyReduction_39+happyReduction_39 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut21 happy_x_3 of { happy_var_3 -> + case happyOut17 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ CCompound (reverse happy_var_3) (reverse happy_var_4))}}})+ ) (\r -> happyReturn (happyIn14 r))++happyReduce_40 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_40 = happyMonadReduce 0# 8# happyReduction_40+happyReduction_40 (happyRest) tk+ = happyThen ((( enterScope))+ ) (\r -> happyReturn (happyIn15 r))++happyReduce_41 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_41 = happyMonadReduce 0# 9# happyReduction_41+happyReduction_41 (happyRest) tk+ = happyThen ((( leaveScope))+ ) (\r -> happyReturn (happyIn16 r))++happyReduce_42 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_42 = happySpecReduce_0 10# happyReduction_42+happyReduction_42 = happyIn17+ (empty+ )++happyReduce_43 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_43 = happySpecReduce_2 10# happyReduction_43+happyReduction_43 happy_x_2+ happy_x_1+ = case happyOut17 happy_x_1 of { happy_var_1 -> + case happyOut18 happy_x_2 of { happy_var_2 -> + happyIn17+ (happy_var_1 `snoc` happy_var_2+ )}}++happyReduce_44 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_44 = happySpecReduce_1 11# happyReduction_44+happyReduction_44 happy_x_1+ = case happyOut12 happy_x_1 of { happy_var_1 -> + happyIn18+ (CBlockStmt happy_var_1+ )}++happyReduce_45 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_45 = happySpecReduce_1 11# happyReduction_45+happyReduction_45 happy_x_1+ = case happyOut19 happy_x_1 of { happy_var_1 -> + happyIn18+ (happy_var_1+ )}++happyReduce_46 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_46 = happySpecReduce_1 12# happyReduction_46+happyReduction_46 happy_x_1+ = case happyOut32 happy_x_1 of { happy_var_1 -> + happyIn19+ (CBlockDecl happy_var_1+ )}++happyReduce_47 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_47 = happySpecReduce_1 12# happyReduction_47+happyReduction_47 happy_x_1+ = case happyOut20 happy_x_1 of { happy_var_1 -> + happyIn19+ (CNestedFunDef happy_var_1+ )}++happyReduce_48 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_48 = happySpecReduce_2 12# happyReduction_48+happyReduction_48 happy_x_2+ happy_x_1+ = case happyOut19 happy_x_2 of { happy_var_2 -> + happyIn19+ (happy_var_2+ )}++happyReduce_49 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_49 = happyMonadReduce 3# 13# happyReduction_49+happyReduction_49 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut37 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_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}})+ ) (\r -> happyReturn (happyIn20 r))++happyReduce_50 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_50 = happyMonadReduce 3# 13# happyReduction_50+happyReduction_50 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut44 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_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}})+ ) (\r -> happyReturn (happyIn20 r))++happyReduce_51 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_51 = happyMonadReduce 3# 13# happyReduction_51+happyReduction_51 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut38 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_1 $ CFunDef (reverse happy_var_1) happy_var_2 [] happy_var_3))}}})+ ) (\r -> happyReturn (happyIn20 r))++happyReduce_52 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_52 = happyMonadReduce 3# 13# happyReduction_52+happyReduction_52 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 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_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 [] happy_var_3))}}})+ ) (\r -> happyReturn (happyIn20 r))++happyReduce_53 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_53 = happyMonadReduce 4# 13# happyReduction_53+happyReduction_53 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut11 happy_x_3 of { happy_var_3 -> + case happyOut14 happy_x_4 of { happy_var_4 -> + ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 [] happy_var_4))}}}})+ ) (\r -> happyReturn (happyIn20 r))++happyReduce_54 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_54 = happySpecReduce_3 14# happyReduction_54+happyReduction_54 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut85 happy_x_2 of { happy_var_2 -> + happyIn21+ (happy_var_2+ )}++happyReduce_55 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_55 = happyReduce 4# 14# happyReduction_55+happyReduction_55 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut21 happy_x_1 of { happy_var_1 -> + case happyOut85 happy_x_3 of { happy_var_3 -> + happyIn21+ (happy_var_1 `rappendr` happy_var_3+ ) `HappyStk` happyRest}}++happyReduce_56 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_56 = happyMonadReduce 1# 15# happyReduction_56+happyReduction_56 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CExpr Nothing)})+ ) (\r -> happyReturn (happyIn22 r))++happyReduce_57 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_57 = happyMonadReduce 2# 15# happyReduction_57+happyReduction_57 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut122 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CExpr (Just happy_var_1))})+ ) (\r -> happyReturn (happyIn22 r))++happyReduce_58 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_58 = happyMonadReduce 5# 16# happyReduction_58+happyReduction_58 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut122 happy_x_3 of { happy_var_3 -> + case happyOut12 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CIf happy_var_3 happy_var_5 Nothing)}}})+ ) (\r -> happyReturn (happyIn23 r))++happyReduce_59 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_59 = happyMonadReduce 7# 16# happyReduction_59+happyReduction_59 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut122 happy_x_3 of { happy_var_3 -> + case happyOut12 happy_x_5 of { happy_var_5 -> + case happyOut12 happy_x_7 of { happy_var_7 -> + ( withNodeInfo happy_var_1 $ CIf happy_var_3 happy_var_5 (Just happy_var_7))}}}})+ ) (\r -> happyReturn (happyIn23 r))++happyReduce_60 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_60 = happyMonadReduce 5# 16# happyReduction_60+happyReduction_60 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut122 happy_x_3 of { happy_var_3 -> + case happyOut12 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CSwitch happy_var_3 happy_var_5)}}})+ ) (\r -> happyReturn (happyIn23 r))++happyReduce_61 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_61 = happyMonadReduce 5# 17# happyReduction_61+happyReduction_61 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut122 happy_x_3 of { happy_var_3 -> + case happyOut12 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CWhile happy_var_3 happy_var_5 False)}}})+ ) (\r -> happyReturn (happyIn24 r))++happyReduce_62 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_62 = happyMonadReduce 7# 17# happyReduction_62+happyReduction_62 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut12 happy_x_2 of { happy_var_2 -> + case happyOut122 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CWhile happy_var_5 happy_var_2 True)}}})+ ) (\r -> happyReturn (happyIn24 r))++happyReduce_63 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_63 = happyMonadReduce 9# 17# happyReduction_63+happyReduction_63 (happy_x_9 `HappyStk`+ happy_x_8 `HappyStk`+ happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut124 happy_x_3 of { happy_var_3 -> + case happyOut124 happy_x_5 of { happy_var_5 -> + case happyOut124 happy_x_7 of { happy_var_7 -> + case happyOut12 happy_x_9 of { happy_var_9 -> + ( withNodeInfo happy_var_1 $ CFor (Left happy_var_3) happy_var_5 happy_var_7 happy_var_9)}}}}})+ ) (\r -> happyReturn (happyIn24 r))++happyReduce_64 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_64 = happyMonadReduce 10# 17# happyReduction_64+happyReduction_64 (happy_x_10 `HappyStk`+ happy_x_9 `HappyStk`+ happy_x_8 `HappyStk`+ happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut32 happy_x_4 of { happy_var_4 -> + case happyOut124 happy_x_5 of { happy_var_5 -> + case happyOut124 happy_x_7 of { happy_var_7 -> + case happyOut12 happy_x_9 of { happy_var_9 -> + ( withNodeInfo happy_var_1 $ CFor (Right happy_var_4) happy_var_5 happy_var_7 happy_var_9)}}}}})+ ) (\r -> happyReturn (happyIn24 r))++happyReduce_65 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_65 = happyMonadReduce 3# 18# happyReduction_65+happyReduction_65 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut131 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CGoto happy_var_2)}})+ ) (\r -> happyReturn (happyIn25 r))++happyReduce_66 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_66 = happyMonadReduce 4# 18# happyReduction_66+happyReduction_66 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut122 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CGotoPtr happy_var_3)}})+ ) (\r -> happyReturn (happyIn25 r))++happyReduce_67 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_67 = happyMonadReduce 2# 18# happyReduction_67+happyReduction_67 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CCont)})+ ) (\r -> happyReturn (happyIn25 r))++happyReduce_68 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_68 = happyMonadReduce 2# 18# happyReduction_68+happyReduction_68 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CBreak)})+ ) (\r -> happyReturn (happyIn25 r))++happyReduce_69 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_69 = happyMonadReduce 3# 18# happyReduction_69+happyReduction_69 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut124 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CReturn happy_var_2)}})+ ) (\r -> happyReturn (happyIn25 r))++happyReduce_70 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_70 = happyMonadReduce 6# 19# happyReduction_70+happyReduction_70 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut27 happy_x_2 of { happy_var_2 -> + case happyOut128 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 [] [] [])}}})+ ) (\r -> happyReturn (happyIn26 r))++happyReduce_71 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_71 = happyMonadReduce 8# 19# happyReduction_71+happyReduction_71 (happy_x_8 `HappyStk`+ happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut27 happy_x_2 of { happy_var_2 -> + case happyOut128 happy_x_4 of { happy_var_4 -> + case happyOut28 happy_x_6 of { happy_var_6 -> + ( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 [] [])}}}})+ ) (\r -> happyReturn (happyIn26 r))++happyReduce_72 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_72 = happyMonadReduce 10# 19# happyReduction_72+happyReduction_72 (happy_x_10 `HappyStk`+ happy_x_9 `HappyStk`+ happy_x_8 `HappyStk`+ happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut27 happy_x_2 of { happy_var_2 -> + case happyOut128 happy_x_4 of { happy_var_4 -> + case happyOut28 happy_x_6 of { happy_var_6 -> + case happyOut28 happy_x_8 of { happy_var_8 -> + ( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 happy_var_8 [])}}}}})+ ) (\r -> happyReturn (happyIn26 r))++happyReduce_73 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_73 = happyMonadReduce 12# 19# happyReduction_73+happyReduction_73 (happy_x_12 `HappyStk`+ happy_x_11 `HappyStk`+ happy_x_10 `HappyStk`+ happy_x_9 `HappyStk`+ happy_x_8 `HappyStk`+ happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut27 happy_x_2 of { happy_var_2 -> + case happyOut128 happy_x_4 of { happy_var_4 -> + case happyOut28 happy_x_6 of { happy_var_6 -> + case happyOut28 happy_x_8 of { happy_var_8 -> + case happyOut31 happy_x_10 of { happy_var_10 -> + ( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 happy_var_8 (reverse happy_var_10))}}}}}})+ ) (\r -> happyReturn (happyIn26 r))++happyReduce_74 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_74 = happySpecReduce_0 20# happyReduction_74+happyReduction_74 = happyIn27+ (Nothing+ )++happyReduce_75 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_75 = happySpecReduce_1 20# happyReduction_75+happyReduction_75 happy_x_1+ = case happyOut64 happy_x_1 of { happy_var_1 -> + happyIn27+ (Just happy_var_1+ )}++happyReduce_76 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_76 = happySpecReduce_0 21# happyReduction_76+happyReduction_76 = happyIn28+ ([]+ )++happyReduce_77 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_77 = happySpecReduce_1 21# happyReduction_77+happyReduction_77 happy_x_1+ = case happyOut29 happy_x_1 of { happy_var_1 -> + happyIn28+ (reverse happy_var_1+ )}++happyReduce_78 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_78 = happySpecReduce_1 22# happyReduction_78+happyReduction_78 happy_x_1+ = case happyOut30 happy_x_1 of { happy_var_1 -> + happyIn29+ (singleton happy_var_1+ )}++happyReduce_79 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_79 = happySpecReduce_3 22# happyReduction_79+happyReduction_79 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut29 happy_x_1 of { happy_var_1 -> + case happyOut30 happy_x_3 of { happy_var_3 -> + happyIn29+ (happy_var_1 `snoc` happy_var_3+ )}}++happyReduce_80 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_80 = happyMonadReduce 4# 23# happyReduction_80+happyReduction_80 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut128 happy_x_1 of { happy_var_1 -> + case happyOut122 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CAsmOperand Nothing happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn30 r))++happyReduce_81 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_81 = happyMonadReduce 7# 23# happyReduction_81+happyReduction_81 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { (CTokIdent _ happy_var_2) -> + case happyOut128 happy_x_4 of { happy_var_4 -> + case happyOut122 happy_x_6 of { happy_var_6 -> + ( withNodeInfo happy_var_1 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}})+ ) (\r -> happyReturn (happyIn30 r))++happyReduce_82 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_82 = happyMonadReduce 7# 23# happyReduction_82+happyReduction_82 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> + case happyOut128 happy_x_4 of { happy_var_4 -> + case happyOut122 happy_x_6 of { happy_var_6 -> + ( withNodeInfo happy_var_1 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}})+ ) (\r -> happyReturn (happyIn30 r))++happyReduce_83 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_83 = happySpecReduce_1 24# happyReduction_83+happyReduction_83 happy_x_1+ = case happyOut128 happy_x_1 of { happy_var_1 -> + happyIn31+ (singleton happy_var_1+ )}++happyReduce_84 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_84 = happySpecReduce_3 24# happyReduction_84+happyReduction_84 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOut128 happy_x_3 of { happy_var_3 -> + happyIn31+ (happy_var_1 `snoc` happy_var_3+ )}}++happyReduce_85 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_85 = happyMonadReduce 2# 25# happyReduction_85+happyReduction_85 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut48 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])})+ ) (\r -> happyReturn (happyIn32 r))++happyReduce_86 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_86 = happyMonadReduce 2# 25# happyReduction_86+happyReduction_86 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut49 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])})+ ) (\r -> happyReturn (happyIn32 r))++happyReduce_87 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+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 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+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 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_89 = happyMonadReduce 7# 25# happyReduction_89+happyReduction_89 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut126 happy_x_3 of { happy_var_3 -> + case happyOut128 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CStaticAssert happy_var_3 happy_var_5)}}})+ ) (\r -> happyReturn (happyIn32 r))++happyReduce_90 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_90 = happySpecReduce_0 26# happyReduction_90+happyReduction_90 = happyIn33+ (empty+ )++happyReduce_91 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_91 = happySpecReduce_2 26# happyReduction_91+happyReduction_91 happy_x_2+ happy_x_1+ = case happyOut33 happy_x_1 of { happy_var_1 -> + case happyOut32 happy_x_2 of { happy_var_2 -> + happyIn33+ (happy_var_1 `snoc` happy_var_2+ )}}++happyReduce_92 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_92 = happyMonadReduce 4# 27# happyReduction_92+happyReduction_92 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut38 happy_x_1 of { happy_var_1 -> + case happyOut75 happy_x_2 of { happy_var_2 -> + case happyOut35 happy_x_3 of { happy_var_3 -> + case happyOut94 happy_x_4 of { happy_var_4 -> + ( 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)] })}}}})+ ) (\r -> happyReturn (happyIn34 r))++happyReduce_93 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_93 = happyMonadReduce 4# 27# happyReduction_93+happyReduction_93 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut75 happy_x_2 of { happy_var_2 -> + case happyOut35 happy_x_3 of { happy_var_3 -> + case happyOut94 happy_x_4 of { happy_var_4 -> + ( let declspecs = liftTypeQuals 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)] })}}}})+ ) (\r -> happyReturn (happyIn34 r))++happyReduce_94 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_94 = happyMonadReduce 5# 27# happyReduction_94+happyReduction_94 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut75 happy_x_3 of { happy_var_3 -> + case happyOut35 happy_x_4 of { happy_var_4 -> + case happyOut94 happy_x_5 of { happy_var_5 -> + ( let declspecs = liftTypeQuals happy_var_1 in+ do{ declr <- withAsmNameAttrs happy_var_4 happy_var_3+ ; doDeclIdent declspecs declr+ ; withNodeInfo happy_var_1 $ CDecl (declspecs ++ liftCAttrs happy_var_2) [(Just (reverseDeclr declr), happy_var_5, Nothing)] })}}}}})+ ) (\r -> happyReturn (happyIn34 r))++happyReduce_95 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_95 = happyMonadReduce 4# 27# happyReduction_95+happyReduction_95 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut133 happy_x_1 of { happy_var_1 -> + case happyOut75 happy_x_2 of { happy_var_2 -> + case happyOut35 happy_x_3 of { happy_var_3 -> + case happyOut94 happy_x_4 of { happy_var_4 -> + ( let declspecs = liftCAttrs 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)] })}}}})+ ) (\r -> happyReturn (happyIn34 r))++happyReduce_96 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_96 = happyMonadReduce 6# 27# happyReduction_96+happyReduction_96 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut34 happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + case happyOut75 happy_x_4 of { happy_var_4 -> + case happyOut35 happy_x_5 of { happy_var_5 -> + case happyOut94 happy_x_6 of { happy_var_6 -> + ( case happy_var_1 of+ CDecl declspecs dies at -> do+ declr <- withAsmNameAttrs (fst happy_var_5, snd happy_var_5 ++ happy_var_3) happy_var_4+ doDeclIdent declspecs declr+ withLength at $ CDecl declspecs ((Just (reverseDeclr declr), happy_var_6, Nothing) : dies))}}}}})+ ) (\r -> happyReturn (happyIn34 r))++happyReduce_97 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_97 = happySpecReduce_2 28# happyReduction_97+happyReduction_97 happy_x_2+ happy_x_1+ = case happyOut67 happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_2 of { happy_var_2 -> + happyIn35+ ((happy_var_1,happy_var_2)+ )}}++happyReduce_98 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_98 = happyMonadReduce 4# 29# happyReduction_98+happyReduction_98 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut37 happy_x_1 of { happy_var_1 -> + case happyOut66 happy_x_2 of { happy_var_2 -> + case happyOut35 happy_x_3 of { happy_var_3 -> + case happyOut94 happy_x_4 of { happy_var_4 -> + ( do{+ declr <- withAsmNameAttrs happy_var_3 happy_var_2;+ doDeclIdent happy_var_1 declr;+ withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}})+ ) (\r -> happyReturn (happyIn36 r))++happyReduce_99 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_99 = happyMonadReduce 4# 29# happyReduction_99+happyReduction_99 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut44 happy_x_1 of { happy_var_1 -> + case happyOut66 happy_x_2 of { happy_var_2 -> + case happyOut35 happy_x_3 of { happy_var_3 -> + case happyOut94 happy_x_4 of { happy_var_4 -> + ( do{+ declr <- withAsmNameAttrs happy_var_3 happy_var_2;+ doDeclIdent happy_var_1 declr;+ withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}})+ ) (\r -> happyReturn (happyIn36 r))++happyReduce_100 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_100 = happyMonadReduce 6# 29# happyReduction_100+happyReduction_100 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut36 happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + case happyOut66 happy_x_4 of { happy_var_4 -> + case happyOut35 happy_x_5 of { happy_var_5 -> + case happyOut94 happy_x_6 of { happy_var_6 -> + ( case happy_var_1 of+ 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))}}}}})+ ) (\r -> happyReturn (happyIn36 r))++happyReduce_101 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_101 = happySpecReduce_1 30# happyReduction_101+happyReduction_101 happy_x_1+ = case happyOut46 happy_x_1 of { happy_var_1 -> + happyIn37+ (reverse happy_var_1+ )}++happyReduce_102 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_102 = happySpecReduce_1 30# happyReduction_102+happyReduction_102 happy_x_1+ = case happyOut48 happy_x_1 of { happy_var_1 -> + happyIn37+ (reverse happy_var_1+ )}++happyReduce_103 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_103 = happySpecReduce_1 30# happyReduction_103+happyReduction_103 happy_x_1+ = case happyOut50 happy_x_1 of { happy_var_1 -> + happyIn37+ (reverse happy_var_1+ )}++happyReduce_104 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_104 = happySpecReduce_1 31# happyReduction_104+happyReduction_104 happy_x_1+ = case happyOut40 happy_x_1 of { happy_var_1 -> + happyIn38+ (singleton happy_var_1+ )}++happyReduce_105 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_105 = happySpecReduce_2 31# happyReduction_105+happyReduction_105 happy_x_2+ happy_x_1+ = case happyOut133 happy_x_1 of { happy_var_1 -> + case happyOut40 happy_x_2 of { happy_var_2 -> + happyIn38+ (reverseList (liftCAttrs happy_var_1) `snoc` happy_var_2+ )}}++happyReduce_106 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_106 = happySpecReduce_2 31# happyReduction_106+happyReduction_106 happy_x_2+ happy_x_1+ = case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut40 happy_x_2 of { happy_var_2 -> + happyIn38+ (rmap CTypeQual happy_var_1 `snoc` happy_var_2+ )}}++happyReduce_107 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_107 = happySpecReduce_3 31# happyReduction_107+happyReduction_107 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut40 happy_x_3 of { happy_var_3 -> + happyIn38+ ((rmap CTypeQual happy_var_1 `rappend` liftCAttrs happy_var_2) `snoc` happy_var_3+ )}}}++happyReduce_108 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_108 = happySpecReduce_2 31# happyReduction_108+happyReduction_108 happy_x_2+ happy_x_1+ = case happyOut38 happy_x_1 of { happy_var_1 -> + case happyOut39 happy_x_2 of { happy_var_2 -> + happyIn38+ (happy_var_1 `snoc` happy_var_2+ )}}++happyReduce_109 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_109 = happySpecReduce_2 31# happyReduction_109+happyReduction_109 happy_x_2+ happy_x_1+ = case happyOut38 happy_x_1 of { happy_var_1 -> + case happyOut134 happy_x_2 of { happy_var_2 -> + happyIn38+ (addTrailingAttrs happy_var_1 happy_var_2+ )}}++happyReduce_110 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_110 = happySpecReduce_1 32# happyReduction_110+happyReduction_110 happy_x_1+ = case happyOut41 happy_x_1 of { happy_var_1 -> + happyIn39+ (CStorageSpec happy_var_1+ )}++happyReduce_111 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_111 = happySpecReduce_1 32# happyReduction_111+happyReduction_111 happy_x_1+ = case happyOut64 happy_x_1 of { happy_var_1 -> + happyIn39+ (CTypeQual happy_var_1+ )}++happyReduce_112 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_112 = happySpecReduce_1 32# happyReduction_112+happyReduction_112 happy_x_1+ = case happyOut42 happy_x_1 of { happy_var_1 -> + happyIn39+ (CFunSpec happy_var_1+ )}++happyReduce_113 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_113 = happySpecReduce_1 32# happyReduction_113+happyReduction_113 happy_x_1+ = case happyOut43 happy_x_1 of { happy_var_1 -> + happyIn39+ (CAlignSpec happy_var_1+ )}++happyReduce_114 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_114 = happySpecReduce_1 33# happyReduction_114+happyReduction_114 happy_x_1+ = case happyOut41 happy_x_1 of { happy_var_1 -> + happyIn40+ (CStorageSpec happy_var_1+ )}++happyReduce_115 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_115 = happySpecReduce_1 33# happyReduction_115+happyReduction_115 happy_x_1+ = case happyOut42 happy_x_1 of { happy_var_1 -> + happyIn40+ (CFunSpec happy_var_1+ )}++happyReduce_116 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_116 = happySpecReduce_1 33# happyReduction_116+happyReduction_116 happy_x_1+ = case happyOut43 happy_x_1 of { happy_var_1 -> + happyIn40+ (CAlignSpec happy_var_1+ )}++happyReduce_117 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_117 = happyMonadReduce 1# 34# happyReduction_117+happyReduction_117 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CTypedef)})+ ) (\r -> happyReturn (happyIn41 r))++happyReduce_118 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_118 = happyMonadReduce 1# 34# happyReduction_118+happyReduction_118 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CExtern)})+ ) (\r -> happyReturn (happyIn41 r))++happyReduce_119 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_119 = happyMonadReduce 1# 34# happyReduction_119+happyReduction_119 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CStatic)})+ ) (\r -> happyReturn (happyIn41 r))++happyReduce_120 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_120 = happyMonadReduce 1# 34# happyReduction_120+happyReduction_120 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CAuto)})+ ) (\r -> happyReturn (happyIn41 r))++happyReduce_121 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_121 = happyMonadReduce 1# 34# happyReduction_121+happyReduction_121 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CRegister)})+ ) (\r -> happyReturn (happyIn41 r))++happyReduce_122 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_122 = happyMonadReduce 1# 34# happyReduction_122+happyReduction_122 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CThread)})+ ) (\r -> happyReturn (happyIn41 r))++happyReduce_123 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_123 = happyMonadReduce 1# 35# happyReduction_123+happyReduction_123 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CInlineQual)})+ ) (\r -> happyReturn (happyIn42 r))++happyReduce_124 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_124 = happyMonadReduce 1# 35# happyReduction_124+happyReduction_124 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CNoreturnQual)})+ ) (\r -> happyReturn (happyIn42 r))++happyReduce_125 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_125 = happyMonadReduce 4# 36# happyReduction_125+happyReduction_125 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CAlignAsType happy_var_3)}})+ ) (\r -> happyReturn (happyIn43 r))++happyReduce_126 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_126 = happyMonadReduce 4# 36# happyReduction_126+happyReduction_126 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut126 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CAlignAsExpr happy_var_3)}})+ ) (\r -> happyReturn (happyIn43 r))++happyReduce_127 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_127 = happySpecReduce_1 37# happyReduction_127+happyReduction_127 happy_x_1+ = case happyOut47 happy_x_1 of { happy_var_1 -> + happyIn44+ (reverse happy_var_1+ )}++happyReduce_128 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_128 = happySpecReduce_1 37# happyReduction_128+happyReduction_128 happy_x_1+ = case happyOut49 happy_x_1 of { happy_var_1 -> + happyIn44+ (reverse happy_var_1+ )}++happyReduce_129 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_129 = happySpecReduce_1 37# happyReduction_129+happyReduction_129 happy_x_1+ = case happyOut51 happy_x_1 of { happy_var_1 -> + happyIn44+ (reverse happy_var_1+ )}++happyReduce_130 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_130 = happyMonadReduce 1# 38# happyReduction_130+happyReduction_130 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CVoidType)})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_131 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_131 = happyMonadReduce 1# 38# happyReduction_131+happyReduction_131 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CCharType)})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_132 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_132 = happyMonadReduce 1# 38# happyReduction_132+happyReduction_132 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CShortType)})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_133 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_133 = happyMonadReduce 1# 38# happyReduction_133+happyReduction_133 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CIntType)})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_134 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_134 = happyMonadReduce 1# 38# happyReduction_134+happyReduction_134 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CLongType)})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_135 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_135 = happyMonadReduce 1# 38# happyReduction_135+happyReduction_135 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CFloatType)})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_136 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_136 = happyMonadReduce 1# 38# happyReduction_136+happyReduction_136 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CDoubleType)})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_137 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_137 = happyMonadReduce 1# 38# happyReduction_137+happyReduction_137 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CSignedType)})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_138 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_138 = happyMonadReduce 1# 38# happyReduction_138+happyReduction_138 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CUnsigType)})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_139 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_139 = happyMonadReduce 1# 38# happyReduction_139+happyReduction_139 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CBoolType)})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_140 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_140 = happyMonadReduce 1# 38# happyReduction_140+happyReduction_140 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CComplexType)})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_141 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_141 = happyMonadReduce 1# 38# happyReduction_141+happyReduction_141 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CInt128Type)})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_142 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_142 = happyMonadReduce 1# 38# happyReduction_142+happyReduction_142 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ (CFloatNType 32 False))})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_143 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_143 = happyMonadReduce 1# 38# happyReduction_143+happyReduction_143 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ (CFloatNType 32 True))})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_144 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_144 = happyMonadReduce 1# 38# happyReduction_144+happyReduction_144 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ (CFloatNType 64 False))})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_145 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_145 = happyMonadReduce 1# 38# happyReduction_145+happyReduction_145 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ (CFloatNType 64 True))})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_146 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_146 = happyMonadReduce 1# 38# happyReduction_146+happyReduction_146 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ (CFloatNType 128 False))})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_147 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_147 = happyMonadReduce 1# 38# happyReduction_147+happyReduction_147 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ (CFloatNType 128 True))})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_148 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_148 = happyMonadReduce 1# 38# happyReduction_148+happyReduction_148 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ (CFloatNType 128 False))})+ ) (\r -> happyReturn (happyIn45 r))++happyReduce_149 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_149 = happySpecReduce_2 39# happyReduction_149+happyReduction_149 happy_x_2+ happy_x_1+ = case happyOut38 happy_x_1 of { happy_var_1 -> + case happyOut45 happy_x_2 of { happy_var_2 -> + happyIn46+ (happy_var_1 `snoc` CTypeSpec happy_var_2+ )}}++happyReduce_150 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_150 = happySpecReduce_2 39# happyReduction_150+happyReduction_150 happy_x_2+ happy_x_1+ = case happyOut47 happy_x_1 of { happy_var_1 -> + case happyOut41 happy_x_2 of { happy_var_2 -> + happyIn46+ (happy_var_1 `snoc` CStorageSpec happy_var_2+ )}}++happyReduce_151 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_151 = happySpecReduce_2 39# happyReduction_151+happyReduction_151 happy_x_2+ happy_x_1+ = case happyOut46 happy_x_1 of { happy_var_1 -> + case happyOut39 happy_x_2 of { happy_var_2 -> + happyIn46+ (happy_var_1 `snoc` happy_var_2+ )}}++happyReduce_152 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_152 = happySpecReduce_2 39# happyReduction_152+happyReduction_152 happy_x_2+ happy_x_1+ = case happyOut46 happy_x_1 of { happy_var_1 -> + case happyOut45 happy_x_2 of { happy_var_2 -> + happyIn46+ (happy_var_1 `snoc` CTypeSpec happy_var_2+ )}}++happyReduce_153 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_153 = happySpecReduce_2 39# happyReduction_153+happyReduction_153 happy_x_2+ happy_x_1+ = case happyOut46 happy_x_1 of { happy_var_1 -> + case happyOut134 happy_x_2 of { happy_var_2 -> + happyIn46+ (addTrailingAttrs happy_var_1 happy_var_2+ )}}++happyReduce_154 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_154 = happySpecReduce_1 40# happyReduction_154+happyReduction_154 happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + happyIn47+ (singleton (CTypeSpec happy_var_1)+ )}++happyReduce_155 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_155 = happySpecReduce_2 40# happyReduction_155+happyReduction_155 happy_x_2+ happy_x_1+ = case happyOut133 happy_x_1 of { happy_var_1 -> + case happyOut45 happy_x_2 of { happy_var_2 -> + happyIn47+ ((reverseList $ liftCAttrs happy_var_1) `snoc` (CTypeSpec happy_var_2)+ )}}++happyReduce_156 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_156 = happySpecReduce_2 40# happyReduction_156+happyReduction_156 happy_x_2+ happy_x_1+ = case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut45 happy_x_2 of { happy_var_2 -> + happyIn47+ (rmap CTypeQual happy_var_1 `snoc` CTypeSpec happy_var_2+ )}}++happyReduce_157 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_157 = happySpecReduce_3 40# happyReduction_157+happyReduction_157 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut45 happy_x_3 of { happy_var_3 -> + happyIn47+ (rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec happy_var_3+ )}}}++happyReduce_158 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_158 = happySpecReduce_2 40# happyReduction_158+happyReduction_158 happy_x_2+ happy_x_1+ = case happyOut47 happy_x_1 of { happy_var_1 -> + case happyOut64 happy_x_2 of { happy_var_2 -> + happyIn47+ (happy_var_1 `snoc` CTypeQual happy_var_2+ )}}++happyReduce_159 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_159 = happySpecReduce_2 40# happyReduction_159+happyReduction_159 happy_x_2+ happy_x_1+ = case happyOut47 happy_x_1 of { happy_var_1 -> + case happyOut45 happy_x_2 of { happy_var_2 -> + happyIn47+ (happy_var_1 `snoc` CTypeSpec happy_var_2+ )}}++happyReduce_160 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_160 = happySpecReduce_2 40# happyReduction_160+happyReduction_160 happy_x_2+ happy_x_1+ = case happyOut47 happy_x_1 of { happy_var_1 -> + case happyOut134 happy_x_2 of { happy_var_2 -> + happyIn47+ (addTrailingAttrs happy_var_1 happy_var_2+ )}}++happyReduce_161 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_161 = happySpecReduce_2 41# happyReduction_161+happyReduction_161 happy_x_2+ happy_x_1+ = case happyOut38 happy_x_1 of { happy_var_1 -> + case happyOut52 happy_x_2 of { happy_var_2 -> + happyIn48+ (happy_var_1 `snoc` CTypeSpec happy_var_2+ )}}++happyReduce_162 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_162 = happySpecReduce_2 41# happyReduction_162+happyReduction_162 happy_x_2+ happy_x_1+ = case happyOut49 happy_x_1 of { happy_var_1 -> + case happyOut41 happy_x_2 of { happy_var_2 -> + happyIn48+ (happy_var_1 `snoc` CStorageSpec happy_var_2+ )}}++happyReduce_163 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_163 = happySpecReduce_2 41# happyReduction_163+happyReduction_163 happy_x_2+ happy_x_1+ = case happyOut48 happy_x_1 of { happy_var_1 -> + case happyOut39 happy_x_2 of { happy_var_2 -> + happyIn48+ (happy_var_1 `snoc` happy_var_2+ )}}++happyReduce_164 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_164 = happySpecReduce_2 41# happyReduction_164+happyReduction_164 happy_x_2+ happy_x_1+ = case happyOut48 happy_x_1 of { happy_var_1 -> + case happyOut134 happy_x_2 of { happy_var_2 -> + happyIn48+ (addTrailingAttrs happy_var_1 happy_var_2+ )}}++happyReduce_165 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_165 = happySpecReduce_1 42# happyReduction_165+happyReduction_165 happy_x_1+ = case happyOut52 happy_x_1 of { happy_var_1 -> + happyIn49+ (singleton (CTypeSpec happy_var_1)+ )}++happyReduce_166 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_166 = happySpecReduce_2 42# happyReduction_166+happyReduction_166 happy_x_2+ happy_x_1+ = case happyOut133 happy_x_1 of { happy_var_1 -> + case happyOut52 happy_x_2 of { happy_var_2 -> + happyIn49+ ((reverseList $ liftCAttrs happy_var_1) `snoc` (CTypeSpec happy_var_2)+ )}}++happyReduce_167 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_167 = happySpecReduce_2 42# happyReduction_167+happyReduction_167 happy_x_2+ happy_x_1+ = case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut52 happy_x_2 of { happy_var_2 -> + happyIn49+ (rmap CTypeQual happy_var_1 `snoc` CTypeSpec happy_var_2+ )}}++happyReduce_168 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_168 = happySpecReduce_3 42# happyReduction_168+happyReduction_168 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut52 happy_x_3 of { happy_var_3 -> + happyIn49+ (rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec happy_var_3+ )}}}++happyReduce_169 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_169 = happySpecReduce_2 42# happyReduction_169+happyReduction_169 happy_x_2+ happy_x_1+ = case happyOut49 happy_x_1 of { happy_var_1 -> + case happyOut64 happy_x_2 of { happy_var_2 -> + happyIn49+ (happy_var_1 `snoc` CTypeQual happy_var_2+ )}}++happyReduce_170 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_170 = happySpecReduce_2 42# happyReduction_170+happyReduction_170 happy_x_2+ happy_x_1+ = case happyOut49 happy_x_1 of { happy_var_1 -> + case happyOut134 happy_x_2 of { happy_var_2 -> + happyIn49+ (addTrailingAttrs happy_var_1 happy_var_2+ )}}++happyReduce_171 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_171 = happySpecReduce_2 43# happyReduction_171+happyReduction_171 happy_x_2+ happy_x_1+ = case happyOut51 happy_x_1 of { happy_var_1 -> + case happyOut41 happy_x_2 of { happy_var_2 -> + happyIn50+ (happy_var_1 `snoc` CStorageSpec happy_var_2+ )}}++happyReduce_172 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_172 = happyMonadReduce 2# 43# happyReduction_172+happyReduction_172 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ 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_2 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeDef happy_var_2 at))}})+ ) (\r -> happyReturn (happyIn50 r))++happyReduce_173 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_173 = happyMonadReduce 5# 43# happyReduction_173+happyReduction_173 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ 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 happyOut122 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_2 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}})+ ) (\r -> happyReturn (happyIn50 r))++happyReduce_174 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_174 = happyMonadReduce 5# 43# happyReduction_174+happyReduction_174 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ 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 happyOut86 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_2 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}})+ ) (\r -> happyReturn (happyIn50 r))++happyReduce_175 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_175 = happySpecReduce_2 43# happyReduction_175+happyReduction_175 happy_x_2+ happy_x_1+ = case happyOut50 happy_x_1 of { happy_var_1 -> + case happyOut39 happy_x_2 of { happy_var_2 -> + happyIn50+ (happy_var_1 `snoc` happy_var_2+ )}}++happyReduce_176 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_176 = happySpecReduce_2 43# happyReduction_176+happyReduction_176 happy_x_2+ happy_x_1+ = case happyOut50 happy_x_1 of { happy_var_1 -> + case happyOut134 happy_x_2 of { happy_var_2 -> + happyIn50+ (addTrailingAttrs happy_var_1 happy_var_2+ )}}++happyReduce_177 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_177 = happyMonadReduce 1# 44# happyReduction_177+happyReduction_177 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> + ( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeDef happy_var_1 at)))})+ ) (\r -> happyReturn (happyIn51 r))++happyReduce_178 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_178 = happyMonadReduce 4# 44# happyReduction_178+happyReduction_178 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut122 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeOfExpr happy_var_3 at)))}})+ ) (\r -> happyReturn (happyIn51 r))++happyReduce_179 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_179 = happyMonadReduce 4# 44# happyReduction_179+happyReduction_179 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeOfType happy_var_3 at)))}})+ ) (\r -> happyReturn (happyIn51 r))++happyReduce_180 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_180 = happyMonadReduce 2# 44# happyReduction_180+happyReduction_180 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> + ( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual happy_var_1 `snoc` CTypeSpec (CTypeDef happy_var_2 at))}})+ ) (\r -> happyReturn (happyIn51 r))++happyReduce_181 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_181 = happyMonadReduce 5# 44# happyReduction_181+happyReduction_181 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut122 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}})+ ) (\r -> happyReturn (happyIn51 r))++happyReduce_182 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_182 = happyMonadReduce 5# 44# happyReduction_182+happyReduction_182 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut86 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}})+ ) (\r -> happyReturn (happyIn51 r))++happyReduce_183 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_183 = happyMonadReduce 2# 44# happyReduction_183+happyReduction_183 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut133 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> + ( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc` (CTypeSpec (CTypeDef happy_var_2 at)))}})+ ) (\r -> happyReturn (happyIn51 r))++happyReduce_184 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_184 = happyMonadReduce 5# 44# happyReduction_184+happyReduction_184 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut133 happy_x_1 of { happy_var_1 -> + case happyOut122 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc` (CTypeSpec (CTypeOfExpr happy_var_4 at)))}})+ ) (\r -> happyReturn (happyIn51 r))++happyReduce_185 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_185 = happyMonadReduce 5# 44# happyReduction_185+happyReduction_185 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut133 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut86 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc` (CTypeSpec (CTypeOfType happy_var_4 at)))}}})+ ) (\r -> happyReturn (happyIn51 r))++happyReduce_186 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_186 = happyMonadReduce 3# 44# happyReduction_186+happyReduction_186 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { (CTokTyIdent _ happy_var_3) -> + ( withNodeInfo happy_var_3 $ \at -> rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeDef happy_var_3 at))}}})+ ) (\r -> happyReturn (happyIn51 r))++happyReduce_187 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_187 = happyMonadReduce 6# 44# happyReduction_187+happyReduction_187 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + case happyOut122 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_3 $ \at -> rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfExpr happy_var_5 at))}}}})+ ) (\r -> happyReturn (happyIn51 r))++happyReduce_188 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_188 = happyMonadReduce 6# 44# happyReduction_188+happyReduction_188 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + case happyOut86 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_3 $ \at -> rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfType happy_var_5 at))}}}})+ ) (\r -> happyReturn (happyIn51 r))++happyReduce_189 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_189 = happySpecReduce_2 44# happyReduction_189+happyReduction_189 happy_x_2+ happy_x_1+ = case happyOut51 happy_x_1 of { happy_var_1 -> + case happyOut64 happy_x_2 of { happy_var_2 -> + happyIn51+ (happy_var_1 `snoc` CTypeQual happy_var_2+ )}}++happyReduce_190 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_190 = happySpecReduce_2 44# happyReduction_190+happyReduction_190 happy_x_2+ happy_x_1+ = case happyOut51 happy_x_1 of { happy_var_1 -> + case happyOut134 happy_x_2 of { happy_var_2 -> + happyIn51+ (addTrailingAttrs happy_var_1 happy_var_2+ )}}++happyReduce_191 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_191 = happyMonadReduce 1# 45# happyReduction_191+happyReduction_191 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut53 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CSUType happy_var_1)})+ ) (\r -> happyReturn (happyIn52 r))++happyReduce_192 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_192 = happyMonadReduce 1# 45# happyReduction_192+happyReduction_192 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut61 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CEnumType happy_var_1)})+ ) (\r -> happyReturn (happyIn52 r))++happyReduce_193 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_193 = happyMonadReduce 6# 46# happyReduction_193+happyReduction_193 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut54 happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_2 of { happy_var_2 -> + case happyOut131 happy_x_3 of { happy_var_3 -> + case happyOut55 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}})+ ) (\r -> happyReturn (happyIn53 r))++happyReduce_194 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_194 = happyMonadReduce 5# 46# happyReduction_194+happyReduction_194 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut54 happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_2 of { happy_var_2 -> + case happyOut55 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) Nothing (Just$ reverse happy_var_4) happy_var_2)}}})+ ) (\r -> happyReturn (happyIn53 r))++happyReduce_195 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_195 = happyMonadReduce 3# 46# happyReduction_195+happyReduction_195 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut54 happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_2 of { happy_var_2 -> + case happyOut131 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) (Just happy_var_3) Nothing happy_var_2)}}})+ ) (\r -> happyReturn (happyIn53 r))++happyReduce_196 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_196 = happySpecReduce_1 47# happyReduction_196+happyReduction_196 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn54+ (L CStructTag (posOf happy_var_1)+ )}++happyReduce_197 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_197 = happySpecReduce_1 47# happyReduction_197+happyReduction_197 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn54+ (L CUnionTag (posOf happy_var_1)+ )}++happyReduce_198 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_198 = happySpecReduce_0 48# happyReduction_198+happyReduction_198 = happyIn55+ (empty+ )++happyReduce_199 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_199 = happySpecReduce_2 48# happyReduction_199+happyReduction_199 happy_x_2+ happy_x_1+ = case happyOut55 happy_x_1 of { happy_var_1 -> + happyIn55+ (happy_var_1+ )}++happyReduce_200 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_200 = happySpecReduce_2 48# happyReduction_200+happyReduction_200 happy_x_2+ happy_x_1+ = case happyOut55 happy_x_1 of { happy_var_1 -> + case happyOut56 happy_x_2 of { happy_var_2 -> + happyIn55+ (happy_var_1 `snoc` happy_var_2+ )}}++happyReduce_201 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_201 = happySpecReduce_2 49# happyReduction_201+happyReduction_201 happy_x_2+ happy_x_1+ = case happyOut58 happy_x_1 of { happy_var_1 -> + happyIn56+ (case happy_var_1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at+ )}++happyReduce_202 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_202 = happySpecReduce_2 49# happyReduction_202+happyReduction_202 happy_x_2+ happy_x_1+ = case happyOut57 happy_x_1 of { happy_var_1 -> + happyIn56+ (case happy_var_1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at+ )}++happyReduce_203 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_203 = happySpecReduce_2 49# happyReduction_203+happyReduction_203 happy_x_2+ happy_x_1+ = case happyOut56 happy_x_2 of { happy_var_2 -> + happyIn56+ (happy_var_2+ )}++happyReduce_204 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_204 = happyMonadReduce 3# 50# happyReduction_204+happyReduction_204 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_2 of { happy_var_2 -> + case happyOut60 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ case happy_var_3 of (d,s) -> CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [(d,Nothing,s)])}}})+ ) (\r -> happyReturn (happyIn57 r))++happyReduce_205 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_205 = happyMonadReduce 2# 50# happyReduction_205+happyReduction_205 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut133 happy_x_1 of { happy_var_1 -> + case happyOut60 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ case happy_var_2 of (d,s) -> CDecl (liftCAttrs happy_var_1) [(d,Nothing,s)])}})+ ) (\r -> happyReturn (happyIn57 r))++happyReduce_206 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_206 = happyReduce 4# 50# happyReduction_206+happyReduction_206 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut57 happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + case happyOut60 happy_x_4 of { happy_var_4 -> + happyIn57+ (case happy_var_1 of+ CDecl declspecs dies at ->+ case happy_var_4 of+ (Just d,s) -> CDecl declspecs ((Just $ appendObjAttrs happy_var_3 d,Nothing,s) : dies) at+ (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) at+ ) `HappyStk` happyRest}}}++happyReduce_207 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_207 = happyMonadReduce 3# 51# happyReduction_207+happyReduction_207 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut44 happy_x_1 of { happy_var_1 -> + case happyOut59 happy_x_2 of { happy_var_2 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ case happy_var_2 of { (Just d,s) -> CDecl happy_var_1 [(Just $! appendObjAttrs happy_var_3 d,Nothing,s)]+ ; (Nothing,s) -> CDecl happy_var_1 [(Nothing,Nothing,s)] })}}})+ ) (\r -> happyReturn (happyIn58 r))++happyReduce_208 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_208 = happyReduce 5# 51# happyReduction_208+happyReduction_208 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut58 happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + case happyOut59 happy_x_4 of { happy_var_4 -> + case happyOut132 happy_x_5 of { happy_var_5 -> + happyIn58+ (case happy_var_1 of+ CDecl declspecs dies attr ->+ case happy_var_4 of+ (Just d,s) -> CDecl declspecs ((Just$ appendObjAttrs (happy_var_3++happy_var_5) d,Nothing,s) : dies) attr+ (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) attr+ ) `HappyStk` happyRest}}}}++happyReduce_209 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_209 = happyMonadReduce 1# 51# happyReduction_209+happyReduction_209 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut44 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])})+ ) (\r -> happyReturn (happyIn58 r))++happyReduce_210 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_210 = happySpecReduce_1 52# happyReduction_210+happyReduction_210 happy_x_1+ = case happyOut66 happy_x_1 of { happy_var_1 -> + happyIn59+ ((Just (reverseDeclr happy_var_1), Nothing)+ )}++happyReduce_211 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_211 = happySpecReduce_2 52# happyReduction_211+happyReduction_211 happy_x_2+ happy_x_1+ = case happyOut126 happy_x_2 of { happy_var_2 -> + happyIn59+ ((Nothing, Just happy_var_2)+ )}++happyReduce_212 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_212 = happySpecReduce_3 52# happyReduction_212+happyReduction_212 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut66 happy_x_1 of { happy_var_1 -> + case happyOut126 happy_x_3 of { happy_var_3 -> + happyIn59+ ((Just (reverseDeclr happy_var_1), Just happy_var_3)+ )}}++happyReduce_213 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_213 = happySpecReduce_1 53# happyReduction_213+happyReduction_213 happy_x_1+ = case happyOut75 happy_x_1 of { happy_var_1 -> + happyIn60+ ((Just (reverseDeclr happy_var_1), Nothing)+ )}++happyReduce_214 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_214 = happySpecReduce_2 53# happyReduction_214+happyReduction_214 happy_x_2+ happy_x_1+ = case happyOut126 happy_x_2 of { happy_var_2 -> + happyIn60+ ((Nothing, Just happy_var_2)+ )}++happyReduce_215 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_215 = happySpecReduce_3 53# happyReduction_215+happyReduction_215 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut75 happy_x_1 of { happy_var_1 -> + case happyOut126 happy_x_3 of { happy_var_3 -> + happyIn60+ ((Just (reverseDeclr happy_var_1), Just happy_var_3)+ )}}++happyReduce_216 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_216 = happySpecReduce_2 53# happyReduction_216+happyReduction_216 happy_x_2+ happy_x_1+ = case happyOut60 happy_x_1 of { happy_var_1 -> + case happyOut134 happy_x_2 of { happy_var_2 -> + happyIn60+ (case happy_var_1 of { (Nothing,expr) -> (Nothing,expr) {- FIXME -}+ ; (Just (CDeclr name derived asmname attrs node), bsz) ->+ (Just (CDeclr name derived asmname (attrs++happy_var_2) node),bsz)+ }+ )}}++happyReduce_217 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_217 = happyMonadReduce 5# 54# happyReduction_217+happyReduction_217 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_2 of { happy_var_2 -> + case happyOut62 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ CEnum Nothing (Just$ reverse happy_var_4) happy_var_2)}}})+ ) (\r -> happyReturn (happyIn61 r))++happyReduce_218 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_218 = happyMonadReduce 6# 54# happyReduction_218+happyReduction_218 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_2 of { happy_var_2 -> + case happyOut62 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ CEnum Nothing (Just$ reverse happy_var_4) happy_var_2)}}})+ ) (\r -> happyReturn (happyIn61 r))++happyReduce_219 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_219 = happyMonadReduce 6# 54# happyReduction_219+happyReduction_219 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_2 of { happy_var_2 -> + case happyOut131 happy_x_3 of { happy_var_3 -> + case happyOut62 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}})+ ) (\r -> happyReturn (happyIn61 r))++happyReduce_220 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_220 = happyMonadReduce 7# 54# happyReduction_220+happyReduction_220 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_2 of { happy_var_2 -> + case happyOut131 happy_x_3 of { happy_var_3 -> + case happyOut62 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}})+ ) (\r -> happyReturn (happyIn61 r))++happyReduce_221 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_221 = happyMonadReduce 3# 54# happyReduction_221+happyReduction_221 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_2 of { happy_var_2 -> + case happyOut131 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) Nothing happy_var_2)}}})+ ) (\r -> happyReturn (happyIn61 r))++happyReduce_222 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_222 = happySpecReduce_1 55# happyReduction_222+happyReduction_222 happy_x_1+ = case happyOut63 happy_x_1 of { happy_var_1 -> + happyIn62+ (singleton happy_var_1+ )}++happyReduce_223 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_223 = happySpecReduce_3 55# happyReduction_223+happyReduction_223 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut62 happy_x_1 of { happy_var_1 -> + case happyOut63 happy_x_3 of { happy_var_3 -> + happyIn62+ (happy_var_1 `snoc` happy_var_3+ )}}++happyReduce_224 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_224 = happySpecReduce_1 56# happyReduction_224+happyReduction_224 happy_x_1+ = case happyOut131 happy_x_1 of { happy_var_1 -> + happyIn63+ ((happy_var_1, Nothing)+ )}++happyReduce_225 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_225 = happySpecReduce_2 56# happyReduction_225+happyReduction_225 happy_x_2+ happy_x_1+ = case happyOut131 happy_x_1 of { happy_var_1 -> + happyIn63+ ((happy_var_1, Nothing)+ )}++happyReduce_226 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_226 = happyReduce 4# 56# happyReduction_226+happyReduction_226 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut131 happy_x_1 of { happy_var_1 -> + case happyOut126 happy_x_4 of { happy_var_4 -> + happyIn63+ ((happy_var_1, Just happy_var_4)+ ) `HappyStk` happyRest}}++happyReduce_227 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_227 = happySpecReduce_3 56# happyReduction_227+happyReduction_227 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut131 happy_x_1 of { happy_var_1 -> + case happyOut126 happy_x_3 of { happy_var_3 -> + happyIn63+ ((happy_var_1, Just happy_var_3)+ )}}++happyReduce_228 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_228 = happyMonadReduce 1# 57# happyReduction_228+happyReduction_228 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CConstQual)})+ ) (\r -> happyReturn (happyIn64 r))++happyReduce_229 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_229 = happyMonadReduce 1# 57# happyReduction_229+happyReduction_229 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CVolatQual)})+ ) (\r -> happyReturn (happyIn64 r))++happyReduce_230 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_230 = happyMonadReduce 1# 57# happyReduction_230+happyReduction_230 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CRestrQual)})+ ) (\r -> happyReturn (happyIn64 r))++happyReduce_231 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_231 = happyMonadReduce 1# 57# happyReduction_231+happyReduction_231 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CNullableQual)})+ ) (\r -> happyReturn (happyIn64 r))++happyReduce_232 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_232 = happyMonadReduce 1# 57# happyReduction_232+happyReduction_232 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CNonnullQual)})+ ) (\r -> happyReturn (happyIn64 r))++happyReduce_233 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_233 = happyMonadReduce 1# 57# happyReduction_233+happyReduction_233 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CAtomicQual)})+ ) (\r -> happyReturn (happyIn64 r))++happyReduce_234 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_234 = happySpecReduce_2 58# happyReduction_234+happyReduction_234 happy_x_2+ happy_x_1+ = case happyOut132 happy_x_1 of { happy_var_1 -> + case happyOut64 happy_x_2 of { happy_var_2 -> + happyIn65+ (reverseList (map CAttrQual happy_var_1) `snoc` happy_var_2+ )}}++happyReduce_235 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_235 = happySpecReduce_2 58# happyReduction_235+happyReduction_235 happy_x_2+ happy_x_1+ = case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut64 happy_x_2 of { happy_var_2 -> + happyIn65+ (happy_var_1 `snoc` happy_var_2+ )}}++happyReduce_236 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_236 = happySpecReduce_3 58# happyReduction_236+happyReduction_236 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut64 happy_x_3 of { happy_var_3 -> + happyIn65+ ((happy_var_1 `rappend` map CAttrQual happy_var_2) `snoc` happy_var_3+ )}}}++happyReduce_237 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_237 = happySpecReduce_1 59# happyReduction_237+happyReduction_237 happy_x_1+ = case happyOut75 happy_x_1 of { happy_var_1 -> + happyIn66+ (happy_var_1+ )}++happyReduce_238 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_238 = happySpecReduce_1 59# happyReduction_238+happyReduction_238 happy_x_1+ = case happyOut68 happy_x_1 of { happy_var_1 -> + happyIn66+ (happy_var_1+ )}++happyReduce_239 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_239 = happySpecReduce_0 60# happyReduction_239+happyReduction_239 = happyIn67+ (Nothing+ )++happyReduce_240 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_240 = happyReduce 4# 60# happyReduction_240+happyReduction_240 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut128 happy_x_3 of { happy_var_3 -> + happyIn67+ (Just happy_var_3+ ) `HappyStk` happyRest}++happyReduce_241 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_241 = happySpecReduce_1 61# happyReduction_241+happyReduction_241 happy_x_1+ = case happyOut72 happy_x_1 of { happy_var_1 -> + happyIn68+ (happy_var_1+ )}++happyReduce_242 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_242 = happySpecReduce_1 61# happyReduction_242+happyReduction_242 happy_x_1+ = case happyOut69 happy_x_1 of { happy_var_1 -> + happyIn68+ (happy_var_1+ )}++happyReduce_243 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_243 = happyMonadReduce 1# 62# happyReduction_243+happyReduction_243 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> + ( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)})+ ) (\r -> happyReturn (happyIn69 r))++happyReduce_244 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_244 = happyMonadReduce 2# 62# happyReduction_244+happyReduction_244 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> + case happyOut88 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ \at -> happy_var_2 (mkVarDeclr happy_var_1 at))}})+ ) (\r -> happyReturn (happyIn69 r))++happyReduce_245 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_245 = happySpecReduce_1 62# happyReduction_245+happyReduction_245 happy_x_1+ = case happyOut70 happy_x_1 of { happy_var_1 -> + happyIn69+ (happy_var_1+ )}++happyReduce_246 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_246 = happySpecReduce_1 63# happyReduction_246+happyReduction_246 happy_x_1+ = case happyOut71 happy_x_1 of { happy_var_1 -> + happyIn70+ (happy_var_1+ )}++happyReduce_247 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_247 = happyMonadReduce 2# 63# happyReduction_247+happyReduction_247 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut69 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}})+ ) (\r -> happyReturn (happyIn70 r))++happyReduce_248 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_248 = happyMonadReduce 3# 63# happyReduction_248+happyReduction_248 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut69 happy_x_3 of { happy_var_3 -> + ( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}})+ ) (\r -> happyReturn (happyIn70 r))++happyReduce_249 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_249 = happyMonadReduce 3# 63# happyReduction_249+happyReduction_249 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut69 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}})+ ) (\r -> happyReturn (happyIn70 r))++happyReduce_250 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_250 = happyMonadReduce 4# 63# happyReduction_250+happyReduction_250 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut133 happy_x_3 of { happy_var_3 -> + case happyOut69 happy_x_4 of { happy_var_4 -> + ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}})+ ) (\r -> happyReturn (happyIn70 r))++happyReduce_251 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_251 = happySpecReduce_3 64# happyReduction_251+happyReduction_251 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut70 happy_x_2 of { happy_var_2 -> + happyIn71+ (happy_var_2+ )}++happyReduce_252 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_252 = happyReduce 4# 64# happyReduction_252+happyReduction_252 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut70 happy_x_2 of { happy_var_2 -> + case happyOut88 happy_x_4 of { happy_var_4 -> + happyIn71+ (happy_var_4 happy_var_2+ ) `HappyStk` happyRest}}++happyReduce_253 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_253 = happyReduce 4# 64# happyReduction_253+happyReduction_253 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut70 happy_x_3 of { happy_var_3 -> + happyIn71+ (appendDeclrAttrs happy_var_2 happy_var_3+ ) `HappyStk` happyRest}}++happyReduce_254 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_254 = happyReduce 5# 64# happyReduction_254+happyReduction_254 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut70 happy_x_3 of { happy_var_3 -> + case happyOut88 happy_x_5 of { happy_var_5 -> + happyIn71+ (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)+ ) `HappyStk` happyRest}}}++happyReduce_255 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_255 = happySpecReduce_1 65# happyReduction_255+happyReduction_255 happy_x_1+ = case happyOut73 happy_x_1 of { happy_var_1 -> + happyIn72+ (happy_var_1+ )}++happyReduce_256 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_256 = happyMonadReduce 4# 65# happyReduction_256+happyReduction_256 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut74 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 [])}})+ ) (\r -> happyReturn (happyIn72 r))++happyReduce_257 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_257 = happyMonadReduce 5# 65# happyReduction_257+happyReduction_257 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut74 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}})+ ) (\r -> happyReturn (happyIn72 r))++happyReduce_258 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_258 = happyMonadReduce 6# 65# happyReduction_258+happyReduction_258 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut133 happy_x_3 of { happy_var_3 -> + case happyOut74 happy_x_5 of { happy_var_5 -> + ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_5 (reverse happy_var_2))}}}})+ ) (\r -> happyReturn (happyIn72 r))++happyReduce_259 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_259 = happyMonadReduce 2# 65# happyReduction_259+happyReduction_259 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut72 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}})+ ) (\r -> happyReturn (happyIn72 r))++happyReduce_260 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_260 = happyMonadReduce 3# 65# happyReduction_260+happyReduction_260 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut72 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}})+ ) (\r -> happyReturn (happyIn72 r))++happyReduce_261 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_261 = happyMonadReduce 4# 65# happyReduction_261+happyReduction_261 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut133 happy_x_3 of { happy_var_3 -> + case happyOut72 happy_x_4 of { happy_var_4 -> + ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}})+ ) (\r -> happyReturn (happyIn72 r))++happyReduce_262 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_262 = happySpecReduce_3 66# happyReduction_262+happyReduction_262 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut72 happy_x_2 of { happy_var_2 -> + happyIn73+ (happy_var_2+ )}++happyReduce_263 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_263 = happyReduce 4# 66# happyReduction_263+happyReduction_263 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut74 happy_x_2 of { happy_var_2 -> + case happyOut88 happy_x_3 of { happy_var_3 -> + happyIn73+ (happy_var_3 happy_var_2+ ) `HappyStk` happyRest}}++happyReduce_264 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_264 = happyReduce 4# 66# happyReduction_264+happyReduction_264 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut72 happy_x_2 of { happy_var_2 -> + case happyOut88 happy_x_4 of { happy_var_4 -> + happyIn73+ (happy_var_4 happy_var_2+ ) `HappyStk` happyRest}}++happyReduce_265 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_265 = happyMonadReduce 1# 67# happyReduction_265+happyReduction_265 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> + ( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)})+ ) (\r -> happyReturn (happyIn74 r))++happyReduce_266 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_266 = happySpecReduce_3 67# happyReduction_266+happyReduction_266 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut74 happy_x_2 of { happy_var_2 -> + happyIn74+ (happy_var_2+ )}++happyReduce_267 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_267 = happySpecReduce_1 68# happyReduction_267+happyReduction_267 happy_x_1+ = case happyOut76 happy_x_1 of { happy_var_1 -> + happyIn75+ (happy_var_1+ )}++happyReduce_268 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_268 = happySpecReduce_1 68# happyReduction_268+happyReduction_268 happy_x_1+ = case happyOut78 happy_x_1 of { happy_var_1 -> + happyIn75+ (happy_var_1+ )}++happyReduce_269 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_269 = happySpecReduce_1 69# happyReduction_269+happyReduction_269 happy_x_1+ = case happyOut77 happy_x_1 of { happy_var_1 -> + happyIn76+ (happy_var_1+ )}++happyReduce_270 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_270 = happyMonadReduce 2# 69# happyReduction_270+happyReduction_270 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut75 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}})+ ) (\r -> happyReturn (happyIn76 r))++happyReduce_271 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_271 = happyMonadReduce 3# 69# happyReduction_271+happyReduction_271 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut75 happy_x_3 of { happy_var_3 -> + ( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}})+ ) (\r -> happyReturn (happyIn76 r))++happyReduce_272 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_272 = happyMonadReduce 3# 69# happyReduction_272+happyReduction_272 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut75 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}})+ ) (\r -> happyReturn (happyIn76 r))++happyReduce_273 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_273 = happyMonadReduce 4# 69# happyReduction_273+happyReduction_273 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut133 happy_x_3 of { happy_var_3 -> + case happyOut75 happy_x_4 of { happy_var_4 -> + ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}})+ ) (\r -> happyReturn (happyIn76 r))++happyReduce_274 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_274 = happySpecReduce_2 70# happyReduction_274+happyReduction_274 happy_x_2+ happy_x_1+ = case happyOut78 happy_x_1 of { happy_var_1 -> + case happyOut88 happy_x_2 of { happy_var_2 -> + happyIn77+ (happy_var_2 happy_var_1+ )}}++happyReduce_275 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_275 = happySpecReduce_3 70# happyReduction_275+happyReduction_275 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut76 happy_x_2 of { happy_var_2 -> + happyIn77+ (happy_var_2+ )}++happyReduce_276 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_276 = happyReduce 4# 70# happyReduction_276+happyReduction_276 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut76 happy_x_2 of { happy_var_2 -> + case happyOut88 happy_x_4 of { happy_var_4 -> + happyIn77+ (happy_var_4 happy_var_2+ ) `HappyStk` happyRest}}++happyReduce_277 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_277 = happyReduce 4# 70# happyReduction_277+happyReduction_277 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut76 happy_x_3 of { happy_var_3 -> + happyIn77+ (appendDeclrAttrs happy_var_2 happy_var_3+ ) `HappyStk` happyRest}}++happyReduce_278 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_278 = happyReduce 5# 70# happyReduction_278+happyReduction_278 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut76 happy_x_3 of { happy_var_3 -> + case happyOut88 happy_x_5 of { happy_var_5 -> + happyIn77+ (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)+ ) `HappyStk` happyRest}}}++happyReduce_279 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_279 = happyMonadReduce 1# 71# happyReduction_279+happyReduction_279 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> + ( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)})+ ) (\r -> happyReturn (happyIn78 r))++happyReduce_280 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_280 = happySpecReduce_3 71# happyReduction_280+happyReduction_280 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut78 happy_x_2 of { happy_var_2 -> + happyIn78+ (happy_var_2+ )}++happyReduce_281 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_281 = happyReduce 4# 71# happyReduction_281+happyReduction_281 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut78 happy_x_3 of { happy_var_3 -> + happyIn78+ (appendDeclrAttrs happy_var_2 happy_var_3+ ) `HappyStk` happyRest}}++happyReduce_282 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_282 = happySpecReduce_1 72# happyReduction_282+happyReduction_282 happy_x_1+ = case happyOut80 happy_x_1 of { happy_var_1 -> + happyIn79+ (reverseDeclr happy_var_1+ )}++happyReduce_283 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_283 = happySpecReduce_1 73# happyReduction_283+happyReduction_283 happy_x_1+ = case happyOut81 happy_x_1 of { happy_var_1 -> + happyIn80+ (happy_var_1+ )}++happyReduce_284 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_284 = happyMonadReduce 2# 73# happyReduction_284+happyReduction_284 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut80 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}})+ ) (\r -> happyReturn (happyIn80 r))++happyReduce_285 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_285 = happyMonadReduce 3# 73# happyReduction_285+happyReduction_285 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut80 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}})+ ) (\r -> happyReturn (happyIn80 r))++happyReduce_286 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_286 = happyMonadReduce 4# 74# happyReduction_286+happyReduction_286 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut78 happy_x_1 of { happy_var_1 -> + case happyOut85 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ funDeclr happy_var_1 (Left $ reverse happy_var_3) [])}})+ ) (\r -> happyReturn (happyIn81 r))++happyReduce_287 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_287 = happySpecReduce_3 74# happyReduction_287+happyReduction_287 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut80 happy_x_2 of { happy_var_2 -> + happyIn81+ (happy_var_2+ )}++happyReduce_288 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_288 = happyReduce 4# 74# happyReduction_288+happyReduction_288 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut80 happy_x_2 of { happy_var_2 -> + case happyOut88 happy_x_4 of { happy_var_4 -> + happyIn81+ (happy_var_4 happy_var_2+ ) `HappyStk` happyRest}}++happyReduce_289 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_289 = happySpecReduce_0 75# happyReduction_289+happyReduction_289 = happyIn82+ (([], False)+ )++happyReduce_290 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_290 = happySpecReduce_1 75# happyReduction_290+happyReduction_290 happy_x_1+ = case happyOut83 happy_x_1 of { happy_var_1 -> + happyIn82+ ((reverse happy_var_1, False)+ )}++happyReduce_291 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_291 = happySpecReduce_3 75# happyReduction_291+happyReduction_291 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut83 happy_x_1 of { happy_var_1 -> + happyIn82+ ((reverse happy_var_1, True)+ )}++happyReduce_292 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_292 = happySpecReduce_1 76# happyReduction_292+happyReduction_292 happy_x_1+ = case happyOut84 happy_x_1 of { happy_var_1 -> + happyIn83+ (singleton happy_var_1+ )}++happyReduce_293 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_293 = happySpecReduce_3 76# happyReduction_293+happyReduction_293 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut83 happy_x_1 of { happy_var_1 -> + case happyOut84 happy_x_3 of { happy_var_3 -> + happyIn83+ (happy_var_1 `snoc` happy_var_3+ )}}++happyReduce_294 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_294 = happyMonadReduce 1# 77# happyReduction_294+happyReduction_294 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut37 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_295 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_295 = happyMonadReduce 2# 77# happyReduction_295+happyReduction_295 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut37 happy_x_1 of { happy_var_1 -> + case happyOut87 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_296 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_296 = happyMonadReduce 3# 77# happyReduction_296+happyReduction_296 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut37 happy_x_1 of { happy_var_1 -> + case happyOut75 happy_x_2 of { happy_var_2 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_297 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_297 = happyMonadReduce 3# 77# happyReduction_297+happyReduction_297 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut37 happy_x_1 of { happy_var_1 -> + case happyOut69 happy_x_2 of { happy_var_2 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_298 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_298 = happyMonadReduce 1# 77# happyReduction_298+happyReduction_298 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut38 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_299 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_299 = happyMonadReduce 2# 77# happyReduction_299+happyReduction_299 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut38 happy_x_1 of { happy_var_1 -> + case happyOut87 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_300 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_300 = happyMonadReduce 3# 77# happyReduction_300+happyReduction_300 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut38 happy_x_1 of { happy_var_1 -> + case happyOut75 happy_x_2 of { happy_var_2 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_301 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_301 = happyMonadReduce 1# 77# happyReduction_301+happyReduction_301 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut44 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_302 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_302 = happyMonadReduce 2# 77# happyReduction_302+happyReduction_302 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut44 happy_x_1 of { happy_var_1 -> + case happyOut87 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_303 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_303 = happyMonadReduce 3# 77# happyReduction_303+happyReduction_303 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut44 happy_x_1 of { happy_var_1 -> + case happyOut75 happy_x_2 of { happy_var_2 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_304 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_304 = happyMonadReduce 3# 77# happyReduction_304+happyReduction_304 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut44 happy_x_1 of { happy_var_1 -> + case happyOut69 happy_x_2 of { happy_var_2 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_305 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_305 = happyMonadReduce 1# 77# happyReduction_305+happyReduction_305 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [])})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_306 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_306 = happyMonadReduce 2# 77# happyReduction_306+happyReduction_306 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut134 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [])}})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_307 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_307 = happyMonadReduce 2# 77# happyReduction_307+happyReduction_307 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut87 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_308 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_308 = happyMonadReduce 3# 77# happyReduction_308+happyReduction_308 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut75 happy_x_2 of { happy_var_2 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr$ appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}})+ ) (\r -> happyReturn (happyIn84 r))++happyReduce_309 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_309 = happySpecReduce_1 78# happyReduction_309+happyReduction_309 happy_x_1+ = case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> + happyIn85+ (singleton happy_var_1+ )}++happyReduce_310 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_310 = happySpecReduce_3 78# happyReduction_310+happyReduction_310 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut85 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_3 of { (CTokIdent _ happy_var_3) -> + happyIn85+ (happy_var_1 `snoc` happy_var_3+ )}}++happyReduce_311 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_311 = happyMonadReduce 1# 79# happyReduction_311+happyReduction_311 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut44 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])})+ ) (\r -> happyReturn (happyIn86 r))++happyReduce_312 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_312 = happyMonadReduce 2# 79# happyReduction_312+happyReduction_312 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut44 happy_x_1 of { happy_var_1 -> + case happyOut87 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}})+ ) (\r -> happyReturn (happyIn86 r))++happyReduce_313 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_313 = happyMonadReduce 2# 79# happyReduction_313+happyReduction_313 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut134 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [])}})+ ) (\r -> happyReturn (happyIn86 r))++happyReduce_314 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_314 = happyMonadReduce 2# 79# happyReduction_314+happyReduction_314 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut87 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}})+ ) (\r -> happyReturn (happyIn86 r))++happyReduce_315 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_315 = happySpecReduce_1 80# happyReduction_315+happyReduction_315 happy_x_1+ = case happyOut91 happy_x_1 of { happy_var_1 -> + happyIn87+ (happy_var_1+ )}++happyReduce_316 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_316 = happySpecReduce_1 80# happyReduction_316+happyReduction_316 happy_x_1+ = case happyOut92 happy_x_1 of { happy_var_1 -> + happyIn87+ (happy_var_1+ )}++happyReduce_317 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_317 = happySpecReduce_1 80# happyReduction_317+happyReduction_317 happy_x_1+ = case happyOut88 happy_x_1 of { happy_var_1 -> + happyIn87+ (happy_var_1 emptyDeclr+ )}++happyReduce_318 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_318 = happySpecReduce_1 81# happyReduction_318+happyReduction_318 happy_x_1+ = case happyOut89 happy_x_1 of { happy_var_1 -> + happyIn88+ (happy_var_1+ )}++happyReduce_319 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_319 = happyMonadReduce 3# 81# happyReduction_319+happyReduction_319 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut82 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ \at declr -> case happy_var_2 of+ (params, variadic) -> funDeclr declr (Right (params,variadic)) [] at)}})+ ) (\r -> happyReturn (happyIn88 r))++happyReduce_320 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_320 = happySpecReduce_1 82# happyReduction_320+happyReduction_320 happy_x_1+ = case happyOut90 happy_x_1 of { happy_var_1 -> + happyIn89+ (happy_var_1+ )}++happyReduce_321 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_321 = happySpecReduce_2 82# happyReduction_321+happyReduction_321 happy_x_2+ happy_x_1+ = case happyOut89 happy_x_1 of { happy_var_1 -> + case happyOut90 happy_x_2 of { happy_var_2 -> + happyIn89+ (\decl -> happy_var_2 (happy_var_1 decl)+ )}}++happyReduce_322 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_322 = happyMonadReduce 3# 83# happyReduction_322+happyReduction_322 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut125 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ \at declr -> arrDeclr declr [] False False happy_var_2 at)}})+ ) (\r -> happyReturn (happyIn90 r))++happyReduce_323 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_323 = happyMonadReduce 4# 83# happyReduction_323+happyReduction_323 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut125 happy_x_3 of { happy_var_3 -> + ( withAttributePF happy_var_1 happy_var_2 $ \at declr -> arrDeclr declr [] False False happy_var_3 at)}}})+ ) (\r -> happyReturn (happyIn90 r))++happyReduce_324 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_324 = happyMonadReduce 4# 83# happyReduction_324+happyReduction_324 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut125 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ \at declr -> arrDeclr declr (reverse happy_var_2) False False happy_var_3 at)}}})+ ) (\r -> happyReturn (happyIn90 r))++happyReduce_325 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_325 = happyMonadReduce 5# 83# happyReduction_325+happyReduction_325 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut133 happy_x_3 of { happy_var_3 -> + case happyOut125 happy_x_4 of { happy_var_4 -> + ( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr (reverse happy_var_2) False False happy_var_4 at)}}}})+ ) (\r -> happyReturn (happyIn90 r))++happyReduce_326 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_326 = happyMonadReduce 5# 83# happyReduction_326+happyReduction_326 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + case happyOut120 happy_x_4 of { happy_var_4 -> + ( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr [] False True (Just happy_var_4) at)}}})+ ) (\r -> happyReturn (happyIn90 r))++happyReduce_327 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_327 = happyMonadReduce 6# 83# happyReduction_327+happyReduction_327 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_3 of { happy_var_3 -> + case happyOut132 happy_x_4 of { happy_var_4 -> + case happyOut120 happy_x_5 of { happy_var_5 -> + ( withAttributePF happy_var_1 happy_var_4 $ \at declr -> arrDeclr declr (reverse happy_var_3) False True (Just happy_var_5) at)}}}})+ ) (\r -> happyReturn (happyIn90 r))++happyReduce_328 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_328 = happyMonadReduce 7# 83# happyReduction_328+happyReduction_328 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + case happyOut132 happy_x_5 of { happy_var_5 -> + case happyOut120 happy_x_6 of { happy_var_6 -> + ( withAttributePF happy_var_1 (happy_var_3 ++ happy_var_5) $ \at declr -> arrDeclr declr (reverse happy_var_2) False True (Just happy_var_6) at)}}}}})+ ) (\r -> happyReturn (happyIn90 r))++happyReduce_329 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_329 = happyMonadReduce 4# 83# happyReduction_329+happyReduction_329 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + ( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr [] True False Nothing at)}})+ ) (\r -> happyReturn (happyIn90 r))++happyReduce_330 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_330 = happyMonadReduce 5# 83# happyReduction_330+happyReduction_330 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut132 happy_x_4 of { happy_var_4 -> + ( withAttributePF happy_var_1 (happy_var_2 ++ happy_var_4) $ \at declr -> arrDeclr declr [] True False Nothing at)}}})+ ) (\r -> happyReturn (happyIn90 r))++happyReduce_331 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_331 = happyMonadReduce 5# 83# happyReduction_331+happyReduction_331 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut132 happy_x_4 of { happy_var_4 -> + ( withAttributePF happy_var_1 happy_var_4 $ \at declr -> arrDeclr declr (reverse happy_var_2) True False Nothing at)}}})+ ) (\r -> happyReturn (happyIn90 r))++happyReduce_332 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_332 = happyMonadReduce 6# 83# happyReduction_332+happyReduction_332 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut133 happy_x_3 of { happy_var_3 -> + case happyOut132 happy_x_5 of { happy_var_5 -> + ( withAttributePF happy_var_1 (happy_var_3 ++ happy_var_5) $ \at declr -> arrDeclr declr (reverse happy_var_2) True False Nothing at)}}}})+ ) (\r -> happyReturn (happyIn90 r))++happyReduce_333 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_333 = happyMonadReduce 1# 84# happyReduction_333+happyReduction_333 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ ptrDeclr emptyDeclr [])})+ ) (\r -> happyReturn (happyIn91 r))++happyReduce_334 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_334 = happyMonadReduce 3# 84# happyReduction_334+happyReduction_334 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut132 happy_x_3 of { happy_var_3 -> + ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr emptyDeclr (reverse happy_var_2))}}})+ ) (\r -> happyReturn (happyIn91 r))++happyReduce_335 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_335 = happyMonadReduce 2# 84# happyReduction_335+happyReduction_335 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut87 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}})+ ) (\r -> happyReturn (happyIn91 r))++happyReduce_336 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_336 = happyMonadReduce 3# 84# happyReduction_336+happyReduction_336 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut65 happy_x_2 of { happy_var_2 -> + case happyOut87 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}})+ ) (\r -> happyReturn (happyIn91 r))++happyReduce_337 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_337 = happyMonadReduce 2# 84# happyReduction_337+happyReduction_337 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + ( withAttribute happy_var_1 happy_var_2 $ ptrDeclr emptyDeclr [])}})+ ) (\r -> happyReturn (happyIn91 r))++happyReduce_338 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_338 = happyMonadReduce 3# 84# happyReduction_338+happyReduction_338 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut87 happy_x_3 of { happy_var_3 -> + ( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}})+ ) (\r -> happyReturn (happyIn91 r))++happyReduce_339 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_339 = happySpecReduce_3 85# happyReduction_339+happyReduction_339 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut91 happy_x_2 of { happy_var_2 -> + happyIn92+ (happy_var_2+ )}++happyReduce_340 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_340 = happySpecReduce_3 85# happyReduction_340+happyReduction_340 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut92 happy_x_2 of { happy_var_2 -> + happyIn92+ (happy_var_2+ )}++happyReduce_341 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_341 = happySpecReduce_3 85# happyReduction_341+happyReduction_341 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut88 happy_x_2 of { happy_var_2 -> + happyIn92+ (happy_var_2 emptyDeclr+ )}++happyReduce_342 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_342 = happyReduce 4# 85# happyReduction_342+happyReduction_342 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut91 happy_x_2 of { happy_var_2 -> + case happyOut88 happy_x_4 of { happy_var_4 -> + happyIn92+ (happy_var_4 happy_var_2+ ) `HappyStk` happyRest}}++happyReduce_343 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_343 = happyReduce 4# 85# happyReduction_343+happyReduction_343 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut91 happy_x_3 of { happy_var_3 -> + happyIn92+ (appendDeclrAttrs happy_var_2 happy_var_3+ ) `HappyStk` happyRest}}++happyReduce_344 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_344 = happyReduce 4# 85# happyReduction_344+happyReduction_344 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut92 happy_x_3 of { happy_var_3 -> + happyIn92+ (appendDeclrAttrs happy_var_2 happy_var_3+ ) `HappyStk` happyRest}}++happyReduce_345 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_345 = happyReduce 4# 85# happyReduction_345+happyReduction_345 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut88 happy_x_3 of { happy_var_3 -> + happyIn92+ (appendDeclrAttrs happy_var_2 (happy_var_3 emptyDeclr)+ ) `HappyStk` happyRest}}++happyReduce_346 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_346 = happyReduce 5# 85# happyReduction_346+happyReduction_346 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut133 happy_x_2 of { happy_var_2 -> + case happyOut91 happy_x_3 of { happy_var_3 -> + case happyOut88 happy_x_5 of { happy_var_5 -> + happyIn92+ (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)+ ) `HappyStk` happyRest}}}++happyReduce_347 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_347 = happySpecReduce_2 85# happyReduction_347+happyReduction_347 happy_x_2+ happy_x_1+ = case happyOut92 happy_x_1 of { happy_var_1 -> + case happyOut134 happy_x_2 of { happy_var_2 -> + happyIn92+ (appendDeclrAttrs happy_var_2 happy_var_1+ )}}++happyReduce_348 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_348 = happyMonadReduce 1# 86# happyReduction_348+happyReduction_348 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut120 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CInitExpr happy_var_1)})+ ) (\r -> happyReturn (happyIn93 r))++happyReduce_349 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_349 = happyMonadReduce 3# 86# happyReduction_349+happyReduction_349 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut95 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CInitList (reverse happy_var_2))}})+ ) (\r -> happyReturn (happyIn93 r))++happyReduce_350 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_350 = happyMonadReduce 4# 86# happyReduction_350+happyReduction_350 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut95 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CInitList (reverse happy_var_2))}})+ ) (\r -> happyReturn (happyIn93 r))++happyReduce_351 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_351 = happySpecReduce_0 87# happyReduction_351+happyReduction_351 = happyIn94+ (Nothing+ )++happyReduce_352 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_352 = happySpecReduce_2 87# happyReduction_352+happyReduction_352 happy_x_2+ happy_x_1+ = case happyOut93 happy_x_2 of { happy_var_2 -> + happyIn94+ (Just happy_var_2+ )}++happyReduce_353 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_353 = happySpecReduce_0 88# happyReduction_353+happyReduction_353 = happyIn95+ (empty+ )++happyReduce_354 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_354 = happySpecReduce_1 88# happyReduction_354+happyReduction_354 happy_x_1+ = case happyOut93 happy_x_1 of { happy_var_1 -> + happyIn95+ (singleton ([],happy_var_1)+ )}++happyReduce_355 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_355 = happySpecReduce_2 88# happyReduction_355+happyReduction_355 happy_x_2+ happy_x_1+ = case happyOut96 happy_x_1 of { happy_var_1 -> + case happyOut93 happy_x_2 of { happy_var_2 -> + happyIn95+ (singleton (happy_var_1,happy_var_2)+ )}}++happyReduce_356 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_356 = happySpecReduce_3 88# happyReduction_356+happyReduction_356 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut95 happy_x_1 of { happy_var_1 -> + case happyOut93 happy_x_3 of { happy_var_3 -> + happyIn95+ (happy_var_1 `snoc` ([],happy_var_3)+ )}}++happyReduce_357 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_357 = happyReduce 4# 88# happyReduction_357+happyReduction_357 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut95 happy_x_1 of { happy_var_1 -> + case happyOut96 happy_x_3 of { happy_var_3 -> + case happyOut93 happy_x_4 of { happy_var_4 -> + happyIn95+ (happy_var_1 `snoc` (happy_var_3,happy_var_4)+ ) `HappyStk` happyRest}}}++happyReduce_358 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_358 = happySpecReduce_2 89# happyReduction_358+happyReduction_358 happy_x_2+ happy_x_1+ = case happyOut97 happy_x_1 of { happy_var_1 -> + happyIn96+ (reverse happy_var_1+ )}++happyReduce_359 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_359 = happyMonadReduce 2# 89# happyReduction_359+happyReduction_359 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut131 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ \at -> [CMemberDesig happy_var_1 at])})+ ) (\r -> happyReturn (happyIn96 r))++happyReduce_360 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_360 = happySpecReduce_1 89# happyReduction_360+happyReduction_360 happy_x_1+ = case happyOut99 happy_x_1 of { happy_var_1 -> + happyIn96+ ([happy_var_1]+ )}++happyReduce_361 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_361 = happySpecReduce_1 90# happyReduction_361+happyReduction_361 happy_x_1+ = case happyOut98 happy_x_1 of { happy_var_1 -> + happyIn97+ (singleton happy_var_1+ )}++happyReduce_362 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_362 = happySpecReduce_2 90# happyReduction_362+happyReduction_362 happy_x_2+ happy_x_1+ = case happyOut97 happy_x_1 of { happy_var_1 -> + case happyOut98 happy_x_2 of { happy_var_2 -> + happyIn97+ (happy_var_1 `snoc` happy_var_2+ )}}++happyReduce_363 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_363 = happyMonadReduce 3# 91# happyReduction_363+happyReduction_363 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut126 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CArrDesig happy_var_2)}})+ ) (\r -> happyReturn (happyIn98 r))++happyReduce_364 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_364 = happyMonadReduce 2# 91# happyReduction_364+happyReduction_364 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut131 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CMemberDesig happy_var_2)}})+ ) (\r -> happyReturn (happyIn98 r))++happyReduce_365 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_365 = happySpecReduce_1 91# happyReduction_365+happyReduction_365 happy_x_1+ = case happyOut99 happy_x_1 of { happy_var_1 -> + happyIn98+ (happy_var_1+ )}++happyReduce_366 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_366 = happyMonadReduce 5# 92# happyReduction_366+happyReduction_366 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut126 happy_x_2 of { happy_var_2 -> + case happyOut126 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ CRangeDesig happy_var_2 happy_var_4)}}})+ ) (\r -> happyReturn (happyIn99 r))++happyReduce_367 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_367 = happyMonadReduce 1# 93# happyReduction_367+happyReduction_367 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> + ( withNodeInfo happy_var_1 $ CVar happy_var_1)})+ ) (\r -> happyReturn (happyIn100 r))++happyReduce_368 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_368 = happySpecReduce_1 93# happyReduction_368+happyReduction_368 happy_x_1+ = case happyOut127 happy_x_1 of { happy_var_1 -> + happyIn100+ (CConst happy_var_1+ )}++happyReduce_369 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_369 = happySpecReduce_1 93# happyReduction_369+happyReduction_369 happy_x_1+ = case happyOut128 happy_x_1 of { happy_var_1 -> + happyIn100+ (CConst (liftStrLit happy_var_1)+ )}++happyReduce_370 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_370 = happySpecReduce_3 93# happyReduction_370+happyReduction_370 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut122 happy_x_2 of { happy_var_2 -> + happyIn100+ (happy_var_2+ )}++happyReduce_371 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_371 = happyMonadReduce 6# 93# happyReduction_371+happyReduction_371 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut120 happy_x_3 of { happy_var_3 -> + case happyOut101 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CGenericSelection happy_var_3 (reverse happy_var_5))}}})+ ) (\r -> happyReturn (happyIn100 r))++happyReduce_372 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_372 = happyMonadReduce 3# 93# happyReduction_372+happyReduction_372 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut14 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CStatExpr happy_var_2)}})+ ) (\r -> happyReturn (happyIn100 r))++happyReduce_373 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_373 = happyMonadReduce 6# 93# happyReduction_373+happyReduction_373 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut120 happy_x_3 of { happy_var_3 -> + case happyOut86 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinVaArg happy_var_3 happy_var_5)}}})+ ) (\r -> happyReturn (happyIn100 r))++happyReduce_374 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_374 = happyMonadReduce 6# 93# happyReduction_374+happyReduction_374 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_3 of { happy_var_3 -> + case happyOut103 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinOffsetOf happy_var_3 (reverse happy_var_5))}}})+ ) (\r -> happyReturn (happyIn100 r))++happyReduce_375 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_375 = happyMonadReduce 6# 93# happyReduction_375+happyReduction_375 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_3 of { happy_var_3 -> + case happyOut86 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinTypesCompatible happy_var_3 happy_var_5)}}})+ ) (\r -> happyReturn (happyIn100 r))++happyReduce_376 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_376 = happyMonadReduce 6# 93# happyReduction_376+happyReduction_376 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut120 happy_x_3 of { happy_var_3 -> + case happyOut86 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinConvertVector happy_var_3 happy_var_5)}}})+ ) (\r -> happyReturn (happyIn100 r))++happyReduce_377 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_377 = happySpecReduce_3 94# happyReduction_377+happyReduction_377 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut101 happy_x_1 of { happy_var_1 -> + case happyOut102 happy_x_3 of { happy_var_3 -> + happyIn101+ (happy_var_1 `snoc` happy_var_3+ )}}++happyReduce_378 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_378 = happySpecReduce_1 94# happyReduction_378+happyReduction_378 happy_x_1+ = case happyOut102 happy_x_1 of { happy_var_1 -> + happyIn101+ (singleton happy_var_1+ )}++happyReduce_379 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_379 = happySpecReduce_3 95# happyReduction_379+happyReduction_379 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut86 happy_x_1 of { happy_var_1 -> + case happyOut120 happy_x_3 of { happy_var_3 -> + happyIn102+ ((Just happy_var_1, happy_var_3)+ )}}++happyReduce_380 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_380 = happySpecReduce_3 95# happyReduction_380+happyReduction_380 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut120 happy_x_3 of { happy_var_3 -> + happyIn102+ ((Nothing, happy_var_3)+ )}++happyReduce_381 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_381 = happyMonadReduce 1# 96# happyReduction_381+happyReduction_381 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut131 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ singleton . CMemberDesig happy_var_1)})+ ) (\r -> happyReturn (happyIn103 r))++happyReduce_382 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_382 = happyMonadReduce 3# 96# happyReduction_382+happyReduction_382 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut103 happy_x_1 of { happy_var_1 -> + case happyOut131 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_3 $ (happy_var_1 `snoc`) . CMemberDesig happy_var_3)}})+ ) (\r -> happyReturn (happyIn103 r))++happyReduce_383 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_383 = happyMonadReduce 4# 96# happyReduction_383+happyReduction_383 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut103 happy_x_1 of { happy_var_1 -> + case happyOut122 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_3 $ (happy_var_1 `snoc`) . CArrDesig happy_var_3)}})+ ) (\r -> happyReturn (happyIn103 r))++happyReduce_384 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_384 = happySpecReduce_1 97# happyReduction_384+happyReduction_384 happy_x_1+ = case happyOut100 happy_x_1 of { happy_var_1 -> + happyIn104+ (happy_var_1+ )}++happyReduce_385 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_385 = happyMonadReduce 4# 97# happyReduction_385+happyReduction_385 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut104 happy_x_1 of { happy_var_1 -> + case happyOut122 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CIndex happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn104 r))++happyReduce_386 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_386 = happyMonadReduce 3# 97# happyReduction_386+happyReduction_386 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut104 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CCall happy_var_1 [])})+ ) (\r -> happyReturn (happyIn104 r))++happyReduce_387 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_387 = happyMonadReduce 4# 97# happyReduction_387+happyReduction_387 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut104 happy_x_1 of { happy_var_1 -> + case happyOut105 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CCall happy_var_1 (reverse happy_var_3))}})+ ) (\r -> happyReturn (happyIn104 r))++happyReduce_388 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_388 = happyMonadReduce 3# 97# happyReduction_388+happyReduction_388 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut104 happy_x_1 of { happy_var_1 -> + case happyOut131 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CMember happy_var_1 happy_var_3 False)}})+ ) (\r -> happyReturn (happyIn104 r))++happyReduce_389 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_389 = happyMonadReduce 3# 97# happyReduction_389+happyReduction_389 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut104 happy_x_1 of { happy_var_1 -> + case happyOut131 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CMember happy_var_1 happy_var_3 True)}})+ ) (\r -> happyReturn (happyIn104 r))++happyReduce_390 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_390 = happyMonadReduce 2# 97# happyReduction_390+happyReduction_390 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut104 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CUnary CPostIncOp happy_var_1)})+ ) (\r -> happyReturn (happyIn104 r))++happyReduce_391 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_391 = happyMonadReduce 2# 97# happyReduction_391+happyReduction_391 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut104 happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ CUnary CPostDecOp happy_var_1)})+ ) (\r -> happyReturn (happyIn104 r))++happyReduce_392 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_392 = happyMonadReduce 6# 97# happyReduction_392+happyReduction_392 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_2 of { happy_var_2 -> + case happyOut95 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}})+ ) (\r -> happyReturn (happyIn104 r))++happyReduce_393 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_393 = happyMonadReduce 7# 97# happyReduction_393+happyReduction_393 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_2 of { happy_var_2 -> + case happyOut95 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}})+ ) (\r -> happyReturn (happyIn104 r))++happyReduce_394 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_394 = happySpecReduce_1 98# happyReduction_394+happyReduction_394 happy_x_1+ = case happyOut120 happy_x_1 of { happy_var_1 -> + happyIn105+ (singleton happy_var_1+ )}++happyReduce_395 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_395 = happySpecReduce_3 98# happyReduction_395+happyReduction_395 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut105 happy_x_1 of { happy_var_1 -> + case happyOut120 happy_x_3 of { happy_var_3 -> + happyIn105+ (happy_var_1 `snoc` happy_var_3+ )}}++happyReduce_396 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_396 = happySpecReduce_1 99# happyReduction_396+happyReduction_396 happy_x_1+ = case happyOut104 happy_x_1 of { happy_var_1 -> + happyIn106+ (happy_var_1+ )}++happyReduce_397 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_397 = happyMonadReduce 2# 99# happyReduction_397+happyReduction_397 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut106 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CUnary CPreIncOp happy_var_2)}})+ ) (\r -> happyReturn (happyIn106 r))++happyReduce_398 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_398 = happyMonadReduce 2# 99# happyReduction_398+happyReduction_398 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut106 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CUnary CPreDecOp happy_var_2)}})+ ) (\r -> happyReturn (happyIn106 r))++happyReduce_399 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_399 = happySpecReduce_2 99# happyReduction_399+happyReduction_399 happy_x_2+ happy_x_1+ = case happyOut108 happy_x_2 of { happy_var_2 -> + happyIn106+ (happy_var_2+ )}++happyReduce_400 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_400 = happyMonadReduce 2# 99# happyReduction_400+happyReduction_400 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut107 happy_x_1 of { happy_var_1 -> + case happyOut108 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CUnary (unL happy_var_1) happy_var_2)}})+ ) (\r -> happyReturn (happyIn106 r))++happyReduce_401 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_401 = happyMonadReduce 2# 99# happyReduction_401+happyReduction_401 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut106 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CSizeofExpr happy_var_2)}})+ ) (\r -> happyReturn (happyIn106 r))++happyReduce_402 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_402 = happyMonadReduce 4# 99# happyReduction_402+happyReduction_402 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CSizeofType happy_var_3)}})+ ) (\r -> happyReturn (happyIn106 r))++happyReduce_403 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_403 = happyMonadReduce 2# 99# happyReduction_403+happyReduction_403 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut106 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CAlignofExpr happy_var_2)}})+ ) (\r -> happyReturn (happyIn106 r))++happyReduce_404 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_404 = happyMonadReduce 4# 99# happyReduction_404+happyReduction_404 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CAlignofType happy_var_3)}})+ ) (\r -> happyReturn (happyIn106 r))++happyReduce_405 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_405 = happyMonadReduce 2# 99# happyReduction_405+happyReduction_405 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut106 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CComplexReal happy_var_2)}})+ ) (\r -> happyReturn (happyIn106 r))++happyReduce_406 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_406 = happyMonadReduce 2# 99# happyReduction_406+happyReduction_406 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut106 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CComplexImag happy_var_2)}})+ ) (\r -> happyReturn (happyIn106 r))++happyReduce_407 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_407 = happyMonadReduce 2# 99# happyReduction_407+happyReduction_407 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut131 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ CLabAddrExpr happy_var_2)}})+ ) (\r -> happyReturn (happyIn106 r))++happyReduce_408 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_408 = happySpecReduce_1 100# happyReduction_408+happyReduction_408 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn107+ (L CAdrOp (posOf happy_var_1)+ )}++happyReduce_409 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_409 = happySpecReduce_1 100# happyReduction_409+happyReduction_409 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn107+ (L CIndOp (posOf happy_var_1)+ )}++happyReduce_410 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_410 = happySpecReduce_1 100# happyReduction_410+happyReduction_410 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn107+ (L CPlusOp (posOf happy_var_1)+ )}++happyReduce_411 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_411 = happySpecReduce_1 100# happyReduction_411+happyReduction_411 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn107+ (L CMinOp (posOf happy_var_1)+ )}++happyReduce_412 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_412 = happySpecReduce_1 100# happyReduction_412+happyReduction_412 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn107+ (L CCompOp (posOf happy_var_1)+ )}++happyReduce_413 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_413 = happySpecReduce_1 100# happyReduction_413+happyReduction_413 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn107+ (L CNegOp (posOf happy_var_1)+ )}++happyReduce_414 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_414 = happySpecReduce_1 101# happyReduction_414+happyReduction_414 happy_x_1+ = case happyOut106 happy_x_1 of { happy_var_1 -> + happyIn108+ (happy_var_1+ )}++happyReduce_415 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_415 = happyMonadReduce 4# 101# happyReduction_415+happyReduction_415 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut86 happy_x_2 of { happy_var_2 -> + case happyOut108 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ CCast happy_var_2 happy_var_4)}}})+ ) (\r -> happyReturn (happyIn108 r))++happyReduce_416 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_416 = happySpecReduce_1 102# happyReduction_416+happyReduction_416 happy_x_1+ = case happyOut108 happy_x_1 of { happy_var_1 -> + happyIn109+ (happy_var_1+ )}++happyReduce_417 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_417 = happyMonadReduce 3# 102# happyReduction_417+happyReduction_417 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut109 happy_x_1 of { happy_var_1 -> + case happyOut108 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CMulOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn109 r))++happyReduce_418 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_418 = happyMonadReduce 3# 102# happyReduction_418+happyReduction_418 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut109 happy_x_1 of { happy_var_1 -> + case happyOut108 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CDivOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn109 r))++happyReduce_419 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_419 = happyMonadReduce 3# 102# happyReduction_419+happyReduction_419 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut109 happy_x_1 of { happy_var_1 -> + case happyOut108 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CRmdOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn109 r))++happyReduce_420 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_420 = happySpecReduce_1 103# happyReduction_420+happyReduction_420 happy_x_1+ = case happyOut109 happy_x_1 of { happy_var_1 -> + happyIn110+ (happy_var_1+ )}++happyReduce_421 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_421 = happyMonadReduce 3# 103# happyReduction_421+happyReduction_421 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut110 happy_x_1 of { happy_var_1 -> + case happyOut109 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CAddOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn110 r))++happyReduce_422 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_422 = happyMonadReduce 3# 103# happyReduction_422+happyReduction_422 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut110 happy_x_1 of { happy_var_1 -> + case happyOut109 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CSubOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn110 r))++happyReduce_423 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_423 = happySpecReduce_1 104# happyReduction_423+happyReduction_423 happy_x_1+ = case happyOut110 happy_x_1 of { happy_var_1 -> + happyIn111+ (happy_var_1+ )}++happyReduce_424 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_424 = happyMonadReduce 3# 104# happyReduction_424+happyReduction_424 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut111 happy_x_1 of { happy_var_1 -> + case happyOut110 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CShlOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn111 r))++happyReduce_425 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_425 = happyMonadReduce 3# 104# happyReduction_425+happyReduction_425 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut111 happy_x_1 of { happy_var_1 -> + case happyOut110 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CShrOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn111 r))++happyReduce_426 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_426 = happySpecReduce_1 105# happyReduction_426+happyReduction_426 happy_x_1+ = case happyOut111 happy_x_1 of { happy_var_1 -> + happyIn112+ (happy_var_1+ )}++happyReduce_427 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_427 = happyMonadReduce 3# 105# happyReduction_427+happyReduction_427 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut112 happy_x_1 of { happy_var_1 -> + case happyOut111 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CLeOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn112 r))++happyReduce_428 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_428 = happyMonadReduce 3# 105# happyReduction_428+happyReduction_428 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut112 happy_x_1 of { happy_var_1 -> + case happyOut111 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CGrOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn112 r))++happyReduce_429 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_429 = happyMonadReduce 3# 105# happyReduction_429+happyReduction_429 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut112 happy_x_1 of { happy_var_1 -> + case happyOut111 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CLeqOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn112 r))++happyReduce_430 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_430 = happyMonadReduce 3# 105# happyReduction_430+happyReduction_430 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut112 happy_x_1 of { happy_var_1 -> + case happyOut111 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CGeqOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn112 r))++happyReduce_431 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_431 = happySpecReduce_1 106# happyReduction_431+happyReduction_431 happy_x_1+ = case happyOut112 happy_x_1 of { happy_var_1 -> + happyIn113+ (happy_var_1+ )}++happyReduce_432 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_432 = happyMonadReduce 3# 106# happyReduction_432+happyReduction_432 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut113 happy_x_1 of { happy_var_1 -> + case happyOut112 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CEqOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn113 r))++happyReduce_433 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_433 = happyMonadReduce 3# 106# happyReduction_433+happyReduction_433 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut113 happy_x_1 of { happy_var_1 -> + case happyOut112 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CNeqOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn113 r))++happyReduce_434 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_434 = happySpecReduce_1 107# happyReduction_434+happyReduction_434 happy_x_1+ = case happyOut113 happy_x_1 of { happy_var_1 -> + happyIn114+ (happy_var_1+ )}++happyReduce_435 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_435 = happyMonadReduce 3# 107# happyReduction_435+happyReduction_435 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut114 happy_x_1 of { happy_var_1 -> + case happyOut113 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CAndOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn114 r))++happyReduce_436 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_436 = happySpecReduce_1 108# happyReduction_436+happyReduction_436 happy_x_1+ = case happyOut114 happy_x_1 of { happy_var_1 -> + happyIn115+ (happy_var_1+ )}++happyReduce_437 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_437 = happyMonadReduce 3# 108# happyReduction_437+happyReduction_437 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut115 happy_x_1 of { happy_var_1 -> + case happyOut114 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CXorOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn115 r))++happyReduce_438 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_438 = happySpecReduce_1 109# happyReduction_438+happyReduction_438 happy_x_1+ = case happyOut115 happy_x_1 of { happy_var_1 -> + happyIn116+ (happy_var_1+ )}++happyReduce_439 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_439 = happyMonadReduce 3# 109# happyReduction_439+happyReduction_439 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut116 happy_x_1 of { happy_var_1 -> + case happyOut115 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary COrOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn116 r))++happyReduce_440 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_440 = happySpecReduce_1 110# happyReduction_440+happyReduction_440 happy_x_1+ = case happyOut116 happy_x_1 of { happy_var_1 -> + happyIn117+ (happy_var_1+ )}++happyReduce_441 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_441 = happyMonadReduce 3# 110# happyReduction_441+happyReduction_441 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut117 happy_x_1 of { happy_var_1 -> + case happyOut116 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CLndOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn117 r))++happyReduce_442 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_442 = happySpecReduce_1 111# happyReduction_442+happyReduction_442 happy_x_1+ = case happyOut117 happy_x_1 of { happy_var_1 -> + happyIn118+ (happy_var_1+ )}++happyReduce_443 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_443 = happyMonadReduce 3# 111# happyReduction_443+happyReduction_443 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut118 happy_x_1 of { happy_var_1 -> + case happyOut117 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CBinary CLorOp happy_var_1 happy_var_3)}})+ ) (\r -> happyReturn (happyIn118 r))++happyReduce_444 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_444 = happySpecReduce_1 112# happyReduction_444+happyReduction_444 happy_x_1+ = case happyOut118 happy_x_1 of { happy_var_1 -> + happyIn119+ (happy_var_1+ )}++happyReduce_445 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_445 = happyMonadReduce 5# 112# happyReduction_445+happyReduction_445 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut118 happy_x_1 of { happy_var_1 -> + case happyOut122 happy_x_3 of { happy_var_3 -> + case happyOut119 happy_x_5 of { happy_var_5 -> + ( withNodeInfo happy_var_1 $ CCond happy_var_1 (Just happy_var_3) happy_var_5)}}})+ ) (\r -> happyReturn (happyIn119 r))++happyReduce_446 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_446 = happyMonadReduce 4# 112# happyReduction_446+happyReduction_446 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut118 happy_x_1 of { happy_var_1 -> + case happyOut119 happy_x_4 of { happy_var_4 -> + ( withNodeInfo happy_var_1 $ CCond happy_var_1 Nothing happy_var_4)}})+ ) (\r -> happyReturn (happyIn119 r))++happyReduce_447 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_447 = happySpecReduce_1 113# happyReduction_447+happyReduction_447 happy_x_1+ = case happyOut119 happy_x_1 of { happy_var_1 -> + happyIn120+ (happy_var_1+ )}++happyReduce_448 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_448 = happyMonadReduce 3# 113# happyReduction_448+happyReduction_448 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut106 happy_x_1 of { happy_var_1 -> + case happyOut121 happy_x_2 of { happy_var_2 -> + case happyOut120 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ CAssign (unL happy_var_2) happy_var_1 happy_var_3)}}})+ ) (\r -> happyReturn (happyIn120 r))++happyReduce_449 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_449 = happySpecReduce_1 114# happyReduction_449+happyReduction_449 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn121+ (L CAssignOp (posOf happy_var_1)+ )}++happyReduce_450 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_450 = happySpecReduce_1 114# happyReduction_450+happyReduction_450 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn121+ (L CMulAssOp (posOf happy_var_1)+ )}++happyReduce_451 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_451 = happySpecReduce_1 114# happyReduction_451+happyReduction_451 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn121+ (L CDivAssOp (posOf happy_var_1)+ )}++happyReduce_452 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_452 = happySpecReduce_1 114# happyReduction_452+happyReduction_452 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn121+ (L CRmdAssOp (posOf happy_var_1)+ )}++happyReduce_453 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_453 = happySpecReduce_1 114# happyReduction_453+happyReduction_453 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn121+ (L CAddAssOp (posOf happy_var_1)+ )}++happyReduce_454 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_454 = happySpecReduce_1 114# happyReduction_454+happyReduction_454 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn121+ (L CSubAssOp (posOf happy_var_1)+ )}++happyReduce_455 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_455 = happySpecReduce_1 114# happyReduction_455+happyReduction_455 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn121+ (L CShlAssOp (posOf happy_var_1)+ )}++happyReduce_456 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_456 = happySpecReduce_1 114# happyReduction_456+happyReduction_456 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn121+ (L CShrAssOp (posOf happy_var_1)+ )}++happyReduce_457 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_457 = happySpecReduce_1 114# happyReduction_457+happyReduction_457 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn121+ (L CAndAssOp (posOf happy_var_1)+ )}++happyReduce_458 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_458 = happySpecReduce_1 114# happyReduction_458+happyReduction_458 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn121+ (L CXorAssOp (posOf happy_var_1)+ )}++happyReduce_459 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_459 = happySpecReduce_1 114# happyReduction_459+happyReduction_459 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn121+ (L COrAssOp (posOf happy_var_1)+ )}++happyReduce_460 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_460 = happySpecReduce_1 115# happyReduction_460+happyReduction_460 happy_x_1+ = case happyOut120 happy_x_1 of { happy_var_1 -> + happyIn122+ (happy_var_1+ )}++happyReduce_461 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_461 = happyMonadReduce 3# 115# happyReduction_461+happyReduction_461 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOut120 happy_x_1 of { happy_var_1 -> + case happyOut123 happy_x_3 of { happy_var_3 -> + ( let es = reverse happy_var_3 in withNodeInfo es $ CComma (happy_var_1:es))}})+ ) (\r -> happyReturn (happyIn122 r))++happyReduce_462 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_462 = happySpecReduce_1 116# happyReduction_462+happyReduction_462 happy_x_1+ = case happyOut120 happy_x_1 of { happy_var_1 -> + happyIn123+ (singleton happy_var_1+ )}++happyReduce_463 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_463 = happySpecReduce_3 116# happyReduction_463+happyReduction_463 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut123 happy_x_1 of { happy_var_1 -> + case happyOut120 happy_x_3 of { happy_var_3 -> + happyIn123+ (happy_var_1 `snoc` happy_var_3+ )}}++happyReduce_464 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_464 = happySpecReduce_0 117# happyReduction_464+happyReduction_464 = happyIn124+ (Nothing+ )++happyReduce_465 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_465 = happySpecReduce_1 117# happyReduction_465+happyReduction_465 happy_x_1+ = case happyOut122 happy_x_1 of { happy_var_1 -> + happyIn124+ (Just happy_var_1+ )}++happyReduce_466 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_466 = happySpecReduce_0 118# happyReduction_466+happyReduction_466 = happyIn125+ (Nothing+ )++happyReduce_467 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_467 = happySpecReduce_1 118# happyReduction_467+happyReduction_467 happy_x_1+ = case happyOut120 happy_x_1 of { happy_var_1 -> + happyIn125+ (Just happy_var_1+ )}++happyReduce_468 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_468 = happySpecReduce_1 119# happyReduction_468+happyReduction_468 happy_x_1+ = case happyOut119 happy_x_1 of { happy_var_1 -> + happyIn126+ (happy_var_1+ )}++happyReduce_469 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_469 = happyMonadReduce 1# 120# happyReduction_469+happyReduction_469 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokILit _ i -> CIntConst i)})+ ) (\r -> happyReturn (happyIn127 r))++happyReduce_470 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_470 = happyMonadReduce 1# 120# happyReduction_470+happyReduction_470 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokCLit _ c -> CCharConst c)})+ ) (\r -> happyReturn (happyIn127 r))++happyReduce_471 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_471 = happyMonadReduce 1# 120# happyReduction_471+happyReduction_471 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokFLit _ f -> CFloatConst f)})+ ) (\r -> happyReturn (happyIn127 r))++happyReduce_472 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_472 = happyMonadReduce 1# 121# happyReduction_472+happyReduction_472 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokSLit _ s -> CStrLit s)})+ ) (\r -> happyReturn (happyIn128 r))++happyReduce_473 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_473 = happyMonadReduce 2# 121# happyReduction_473+happyReduction_473 (happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut129 happy_x_2 of { happy_var_2 -> + ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse happy_var_2)))}})+ ) (\r -> happyReturn (happyIn128 r))++happyReduce_474 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_474 = happySpecReduce_1 122# happyReduction_474+happyReduction_474 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn129+ (case happy_var_1 of CTokSLit _ s -> singleton s+ )}++happyReduce_475 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_475 = happySpecReduce_2 122# happyReduction_475+happyReduction_475 happy_x_2+ happy_x_1+ = case happyOut129 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + happyIn129+ (case happy_var_2 of CTokSLit _ s -> happy_var_1 `snoc` s+ )}}++happyReduce_476 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_476 = happySpecReduce_1 123# happyReduction_476+happyReduction_476 happy_x_1+ = case happyOutTok happy_x_1 of { (CTokClangC _ (ClangCVersionTok happy_var_1)) -> + happyIn130+ (happy_var_1+ )}++happyReduce_477 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_477 = happySpecReduce_1 124# happyReduction_477+happyReduction_477 happy_x_1+ = case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> + happyIn131+ (happy_var_1+ )}++happyReduce_478 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_478 = happySpecReduce_1 124# happyReduction_478+happyReduction_478 happy_x_1+ = case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> + happyIn131+ (happy_var_1+ )}++happyReduce_479 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_479 = happySpecReduce_0 125# happyReduction_479+happyReduction_479 = happyIn132+ ([]+ )++happyReduce_480 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_480 = happySpecReduce_1 125# happyReduction_480+happyReduction_480 happy_x_1+ = case happyOut133 happy_x_1 of { happy_var_1 -> + happyIn132+ (happy_var_1+ )}++happyReduce_481 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_481 = happySpecReduce_1 126# happyReduction_481+happyReduction_481 happy_x_1+ = case happyOut134 happy_x_1 of { happy_var_1 -> + happyIn133+ (happy_var_1+ )}++happyReduce_482 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_482 = happySpecReduce_2 126# happyReduction_482+happyReduction_482 happy_x_2+ happy_x_1+ = case happyOut133 happy_x_1 of { happy_var_1 -> + case happyOut134 happy_x_2 of { happy_var_2 -> + happyIn133+ (happy_var_1 ++ happy_var_2+ )}}++happyReduce_483 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_483 = happyReduce 6# 127# happyReduction_483+happyReduction_483 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut135 happy_x_4 of { happy_var_4 -> + happyIn134+ (reverse happy_var_4+ ) `HappyStk` happyRest}++happyReduce_484 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_484 = happySpecReduce_1 128# happyReduction_484+happyReduction_484 happy_x_1+ = case happyOut136 happy_x_1 of { happy_var_1 -> + happyIn135+ (case happy_var_1 of Nothing -> empty; Just attr -> singleton attr+ )}++happyReduce_485 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_485 = happySpecReduce_3 128# happyReduction_485+happyReduction_485 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut135 happy_x_1 of { happy_var_1 -> + case happyOut136 happy_x_3 of { happy_var_3 -> + happyIn135+ ((maybe id (flip snoc) happy_var_3) happy_var_1+ )}}++happyReduce_486 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_486 = happySpecReduce_0 129# happyReduction_486+happyReduction_486 = happyIn136+ (Nothing+ )++happyReduce_487 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_487 = happyMonadReduce 1# 129# happyReduction_487+happyReduction_487 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> + ( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 [])})+ ) (\r -> happyReturn (happyIn136 r))++happyReduce_488 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_488 = happyMonadReduce 1# 129# happyReduction_488+happyReduction_488 (happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { happy_var_1 -> + ( withNodeInfo happy_var_1 $ Just . CAttr (internalIdent "const") [])})+ ) (\r -> happyReturn (happyIn136 r))++happyReduce_489 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_489 = happyMonadReduce 4# 129# happyReduction_489+happyReduction_489 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> + case happyOut137 happy_x_3 of { happy_var_3 -> + ( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 (reverse happy_var_3))}})+ ) (\r -> happyReturn (happyIn136 r))++happyReduce_490 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_490 = happyMonadReduce 3# 129# happyReduction_490+happyReduction_490 (happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest) tk+ = happyThen ((case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> + ( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 [])})+ ) (\r -> happyReturn (happyIn136 r))++happyReduce_491 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_491 = happySpecReduce_1 130# happyReduction_491+happyReduction_491 happy_x_1+ = case happyOut126 happy_x_1 of { happy_var_1 -> + happyIn137+ (singleton happy_var_1+ )}++happyReduce_492 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_492 = happySpecReduce_3 130# happyReduction_492+happyReduction_492 happy_x_3+ happy_x_2+ happy_x_1+ = happyIn137+ (Reversed []+ )++happyReduce_493 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_493 = happySpecReduce_3 130# happyReduction_493+happyReduction_493 happy_x_3+ happy_x_2+ happy_x_1+ = happyIn137+ (Reversed []+ )++happyReduce_494 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_494 = happySpecReduce_3 130# happyReduction_494+happyReduction_494 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut137 happy_x_1 of { happy_var_1 -> + case happyOut126 happy_x_3 of { happy_var_3 -> + happyIn137+ (happy_var_1 `snoc` happy_var_3+ )}}++happyReduce_495 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_495 = happyReduce 5# 130# happyReduction_495+happyReduction_495 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut137 happy_x_1 of { happy_var_1 -> + happyIn137+ (happy_var_1+ ) `HappyStk` happyRest}++happyReduce_496 :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )+happyReduce_496 = happyReduce 5# 130# happyReduction_496+happyReduction_496 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut137 happy_x_1 of { happy_var_1 -> + happyIn137+ (happy_var_1+ ) `HappyStk` happyRest}++happyNewToken action sts stk+ = lexC(\tk -> + let cont i = happyDoAction i tk action sts stk in+ case tk of {+ CTokEof -> happyDoAction 118# tk action sts stk;+ CTokLParen _ -> cont 1#;+ CTokRParen _ -> cont 2#;+ CTokLBracket _ -> cont 3#;+ CTokRBracket _ -> cont 4#;+ CTokArrow _ -> cont 5#;+ CTokDot _ -> cont 6#;+ CTokExclam _ -> cont 7#;+ CTokTilde _ -> cont 8#;+ CTokInc _ -> cont 9#;+ CTokDec _ -> cont 10#;+ CTokPlus _ -> cont 11#;+ CTokMinus _ -> cont 12#;+ CTokStar _ -> cont 13#;+ CTokSlash _ -> cont 14#;+ CTokPercent _ -> cont 15#;+ CTokAmper _ -> cont 16#;+ CTokShiftL _ -> cont 17#;+ CTokShiftR _ -> cont 18#;+ CTokLess _ -> cont 19#;+ CTokLessEq _ -> cont 20#;+ CTokHigh _ -> cont 21#;+ CTokHighEq _ -> cont 22#;+ CTokEqual _ -> cont 23#;+ CTokUnequal _ -> cont 24#;+ CTokHat _ -> cont 25#;+ CTokBar _ -> cont 26#;+ CTokAnd _ -> cont 27#;+ CTokOr _ -> cont 28#;+ CTokQuest _ -> cont 29#;+ CTokColon _ -> cont 30#;+ CTokAssign _ -> cont 31#;+ CTokPlusAss _ -> cont 32#;+ CTokMinusAss _ -> cont 33#;+ CTokStarAss _ -> cont 34#;+ CTokSlashAss _ -> cont 35#;+ CTokPercAss _ -> cont 36#;+ CTokAmpAss _ -> cont 37#;+ CTokHatAss _ -> cont 38#;+ CTokBarAss _ -> cont 39#;+ CTokSLAss _ -> cont 40#;+ CTokSRAss _ -> cont 41#;+ CTokComma _ -> cont 42#;+ CTokSemic _ -> cont 43#;+ CTokLBrace _ -> cont 44#;+ CTokRBrace _ -> cont 45#;+ CTokEllipsis _ -> cont 46#;+ CTokAlignof _ -> cont 47#;+ CTokAlignas _ -> cont 48#;+ CTokAtomic _ -> cont 49#;+ CTokAsm _ -> cont 50#;+ CTokAuto _ -> cont 51#;+ CTokBreak _ -> cont 52#;+ CTokBool _ -> cont 53#;+ CTokCase _ -> cont 54#;+ CTokChar _ -> cont 55#;+ CTokConst _ -> cont 56#;+ CTokContinue _ -> cont 57#;+ CTokComplex _ -> cont 58#;+ CTokDefault _ -> cont 59#;+ CTokDo _ -> cont 60#;+ CTokDouble _ -> cont 61#;+ CTokElse _ -> cont 62#;+ CTokEnum _ -> cont 63#;+ CTokExtern _ -> cont 64#;+ CTokFloat _ -> cont 65#;+ CTokFloatN 32 False _ -> cont 66#;+ CTokFloatN 32 True _ -> cont 67#;+ CTokFloatN 64 False _ -> cont 68#;+ CTokFloatN 64 True _ -> cont 69#;+ CTokFloatN 128 False _ -> cont 70#;+ CTokFloatN 128 True _ -> cont 71#;+ CTokFloatN 128 False _ -> cont 72#;+ CTokFor _ -> cont 73#;+ CTokGeneric _ -> cont 74#;+ CTokGoto _ -> cont 75#;+ CTokIf _ -> cont 76#;+ CTokInline _ -> cont 77#;+ CTokInt _ -> cont 78#;+ CTokInt128 _ -> cont 79#;+ CTokLong _ -> cont 80#;+ CTokLabel _ -> cont 81#;+ CTokNoreturn _ -> cont 82#;+ CTokNullable _ -> cont 83#;+ CTokNonnull _ -> cont 84#;+ CTokRegister _ -> cont 85#;+ CTokRestrict _ -> cont 86#;+ CTokReturn _ -> cont 87#;+ CTokShort _ -> cont 88#;+ CTokSigned _ -> cont 89#;+ CTokSizeof _ -> cont 90#;+ CTokStatic _ -> cont 91#;+ CTokStaticAssert _ -> cont 92#;+ CTokStruct _ -> cont 93#;+ CTokSwitch _ -> cont 94#;+ CTokTypedef _ -> cont 95#;+ CTokTypeof _ -> cont 96#;+ CTokThread _ -> cont 97#;+ CTokUnion _ -> cont 98#;+ CTokUnsigned _ -> cont 99#;+ CTokVoid _ -> cont 100#;+ CTokVolatile _ -> cont 101#;+ CTokWhile _ -> cont 102#;+ CTokCLit _ _ -> cont 103#;+ CTokILit _ _ -> cont 104#;+ CTokFLit _ _ -> cont 105#;+ CTokSLit _ _ -> cont 106#;+ CTokIdent _ happy_dollar_dollar -> cont 107#;+ CTokTyIdent _ happy_dollar_dollar -> cont 108#;+ CTokGnuC GnuCAttrTok _ -> cont 109#;+ CTokGnuC GnuCExtTok _ -> cont 110#;+ CTokGnuC GnuCComplexReal _ -> cont 111#;+ CTokGnuC GnuCComplexImag _ -> cont 112#;+ CTokGnuC GnuCVaArg _ -> cont 113#;+ CTokGnuC GnuCOffsetof _ -> cont 114#;+ CTokGnuC GnuCTyCompat _ -> cont 115#;+ CTokClangC _ ClangBuiltinConvertVector -> cont 116#;+ CTokClangC _ (ClangCVersionTok happy_dollar_dollar) -> cont 117#;+ _ -> happyError' (tk, [])+ })++happyError_ explist 118# tk = happyError' (tk, explist)+happyError_ explist _ tk = happyError' (tk, explist)++happyThen :: () => P a -> (a -> P b) -> P b+happyThen = (>>=)+happyReturn :: () => a -> P a+happyReturn = (return)+happyParse :: () => Happy_GHC_Exts.Int# -> P (HappyAbsSyn )++happyNewToken :: () => Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )++happyDoAction :: () => Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn )++happyReduceArr :: () => Happy_Data_Array.Array Int (Happy_GHC_Exts.Int# -> CToken -> Happy_GHC_Exts.Int# -> Happy_IntList -> HappyStk (HappyAbsSyn ) -> P (HappyAbsSyn ))++happyThen1 :: () => P a -> (a -> P b) -> P b+happyThen1 = happyThen+happyReturn1 :: () => a -> P a+happyReturn1 = happyReturn+happyError' :: () => ((CToken), [String]) -> P a+happyError' tk = (\(tokens, explist) -> happyError) tk+translation_unit = happySomeParser where+ happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut7 x))++external_declaration = happySomeParser where+ happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut9 x))++statement = happySomeParser where+ happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut12 x))++expression = happySomeParser where+ happySomeParser = happyThen (happyParse 3#) (\x -> happyReturn (happyOut122 x))++happySeq = happyDontSeq+++-- sometimes it is neccessary to reverse an unreversed list+reverseList :: [a] -> Reversed [a]+reverseList = Reversed . List.reverse++-- We occasionally need things to have a location when they don't naturally+-- have one built in as tokens and most AST elements do.+--+data Located a = L !a !Position++unL :: Located a -> a+unL (L a pos) = a++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 mkAttrNode = do+ name <- getNewName+ 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+withAttribute node cattrs mkDeclrNode = do+ name <- getNewName+ let attrs = mkNodeInfo (posOf node) name+ let newDeclr = appendDeclrAttrs cattrs $ mkDeclrNode attrs+ attrs `seq` newDeclr `seq` return newDeclr++-- postfixing variant+{-# INLINE withAttributePF #-}+withAttributePF :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR -> CDeclrR) -> P (CDeclrR -> CDeclrR)+withAttributePF node cattrs mkDeclrCtor = do+ name <- getNewName+ let attrs = mkNodeInfo (posOf node) name+ let newDeclr = appendDeclrAttrs cattrs . mkDeclrCtor attrs+ attrs `seq` newDeclr `seq` return newDeclr++-- add top level attributes for a declarator.+--+-- In the following example+--+-- > int declr1, __attribute__((a1)) * __attribute__((a2)) y() __asm__("$" "y") __attribute__((a3));+--+-- the attributes `a1' and `a3' are top-level attributes for y.+-- The (pseudo)-AST for the second declarator is+--+-- > CDeclr "y"+-- > [CFunDeclr ..., CPtrDeclr __attribute__((a2)) ... ]+-- > (asm "$y")+-- > [__attribute__((a1)), __attribute__((a3)) ]+--+-- So assembler names and preceeding and trailing attributes are recorded in object declarator.+--+appendObjAttrs :: [CAttr] -> CDeclr -> CDeclr+appendObjAttrs newAttrs (CDeclr ident indirections asmname cAttrs at)+ = CDeclr ident indirections asmname (cAttrs ++ newAttrs) at+appendObjAttrsR :: [CAttr] -> CDeclrR -> CDeclrR+appendObjAttrsR newAttrs (CDeclrR ident indirections asmname cAttrs at)+ = CDeclrR ident indirections asmname (cAttrs ++ newAttrs) at++setAsmName :: Maybe CStrLit -> CDeclrR -> P CDeclrR+setAsmName mAsmName (CDeclrR ident indirections oldName cattrs at) =+ case combineName mAsmName oldName of+ Left (n1,n2) -> failP (posOf n2) ["Duplicate assembler name: ",showName n1,showName n2]+ Right newName -> return $ CDeclrR ident indirections newName cattrs at+ where+ combineName Nothing Nothing = Right Nothing+ combineName Nothing oldname@(Just _) = Right oldname+ combineName newname@(Just _) Nothing = Right newname+ combineName (Just n1) (Just n2) = Left (n1,n2)+ showName (CStrLit cstr _) = show cstr++withAsmNameAttrs :: (Maybe CStrLit, [CAttr]) -> CDeclrR -> P CDeclrR+withAsmNameAttrs (mAsmName, newAttrs) declr = setAsmName mAsmName (appendObjAttrsR newAttrs declr)++appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR+appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at)+ = CDeclrR ident empty asmname (cattrs ++ newAttrs) at+appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at)+ = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where+ appendAttrs (CPtrDeclr typeQuals at) = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at+ appendAttrs (CArrDeclr typeQuals arraySize at) = CArrDeclr (typeQuals ++ map CAttrQual newAttrs) arraySize at+ appendAttrs (CFunDeclr parameters cattrs at) = CFunDeclr parameters (cattrs ++ newAttrs) at++ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR+ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at+ = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat+funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR+funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at+ = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat+arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR+arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at+ = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat )+ where+ arr_sz = case size_expr_opt of+ Just e -> CArrSize static_size e+ Nothing -> CNoArrSize var_sized++liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]+liftTypeQuals = map CTypeQual . reverse++-- lift CAttrs to DeclSpecs+--+liftCAttrs :: [CAttr] -> [CDeclSpec]+liftCAttrs = map (CTypeQual . CAttrQual)++-- when we parsed (decl_spec_1,...,decl_spec_n,attrs), add the __attributes__s to the declspec list+-- needs special care when @decl_spec_n@ is a SUE definition+addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec]+addTrailingAttrs declspecs new_attrs =+ case viewr declspecs of+ (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node))+ -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node))+ (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node))+ -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))+ _ -> declspecs `rappend` (liftCAttrs new_attrs)++-- convenient instance, the position of a list of things is the position of+-- the first thing in the list+--+instance Pos a => Pos [a] where+ posOf (x:_) = posOf x++instance Pos a => Pos (Reversed a) where+ posOf (Reversed x) = posOf x++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+-- if the decl is defining a typedef then we add it to the set,+-- if it's a var decl then that shadows typedefed identifiers+--+doDeclIdent :: [CDeclSpec] -> CDeclrR -> P ()+doDeclIdent declspecs (CDeclrR mIdent _ _ _ _) =+ case mIdent of+ Nothing -> return ()+ Just ident | any iypedef declspecs -> addTypedef ident+ | otherwise -> shadowTypedef ident++ where iypedef (CStorageSpec (CTypedef _)) = True+ iypedef _ = False++doFuncParamDeclIdent :: CDeclr -> P ()+doFuncParamDeclIdent (CDeclr _ (CFunDeclr params _ _ : _) _ _ _) =+ sequence_+ [ case getCDeclrIdent declr of+ Nothing -> return ()+ Just ident -> shadowTypedef ident+ | CDecl _ dle _ <- either (const []) fst params+ , (Just declr, _, _) <- dle ]+doFuncParamDeclIdent _ = return ()++-- extract all identifiers+getCDeclrIdent :: CDeclr -> Maybe Ident+getCDeclrIdent (CDeclr mIdent _ _ _ _) = mIdent++happyError :: P a+happyError = parseError++-- * public interface++-- | @parseC input initialPos@ parses the given preprocessed C-source input and returns the AST or a list of parse errors.+parseC :: InputStream -> Position -> Either ParseError CTranslUnit+parseC input initialPosition =+ fmap fst $ execParser translUnitP input initialPosition builtinTypeNames (namesStartingFrom 0)++-- | @translUnitP@ provides a parser for a complete C translation unit, i.e. a list of external declarations.+translUnitP :: P CTranslUnit+translUnitP = translation_unit+-- | @extDeclP@ provides a parser for an external (file-scope) declaration+extDeclP :: P CExtDecl+extDeclP = external_declaration+-- | @statementP@ provides a parser for C statements+statementP :: P CStat+statementP = statement+-- | @expressionP@ provides a parser for C expressions+expressionP :: P CExpr+expressionP = expression+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 1 "<command-line>" #-}+{-# LINE 11 "<command-line>" #-}+# 1 "/usr/include/stdc-predef.h" 1 3 4++# 17 "/usr/include/stdc-predef.h" 3 4++++++++++++++++++++++++++++++++++++++++++++{-# LINE 11 "<command-line>" #-}+{-# LINE 1 "/usr/lib/ghc/include/ghcversion.h" #-}++++++++++++++++++{-# LINE 11 "<command-line>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp ++++++++++++++-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ > 706+#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)+#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)+#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)+#else+#define LT(n,m) (n Happy_GHC_Exts.<# m)+#define GTE(n,m) (n Happy_GHC_Exts.>=# m)+#define EQ(n,m) (n Happy_GHC_Exts.==# m)+#endif+{-# LINE 43 "templates/GenericTemplate.hs" #-}++data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList++++++++{-# LINE 65 "templates/GenericTemplate.hs" #-}++{-# LINE 75 "templates/GenericTemplate.hs" #-}++{-# LINE 84 "templates/GenericTemplate.hs" #-}++infixr 9 `HappyStk`+data HappyStk a = HappyStk a (HappyStk a)++-----------------------------------------------------------------------------+-- starting the parse++happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll++-----------------------------------------------------------------------------+-- Accepting the parse++-- If the current token is 0#, it means we've just accepted a partial+-- parse (a %partial parser). We must ignore the saved token on the top of+-- the stack in this case.+happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =+ happyReturn1 ans+happyAccept j tk st sts (HappyStk ans _) = + (happyTcHack j (happyTcHack st)) (happyReturn1 ans)++-----------------------------------------------------------------------------+-- Arrays only: do the next action++++happyDoAction i tk st+ = {- nothing -}+++ case action of+ 0# -> {- nothing -}+ happyFail (happyExpListPerState ((Happy_GHC_Exts.I# (st)) :: Int)) i tk st+ -1# -> {- nothing -}+ happyAccept i tk st+ n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}++ (happyReduceArr Happy_Data_Array.! rule) i tk st+ where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))+ n -> {- nothing -}+++ happyShift new_state i tk st+ where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))+ where off = happyAdjustOffset (indexShortOffAddr happyActOffsets st)+ off_i = (off Happy_GHC_Exts.+# i)+ check = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))+ then EQ(indexShortOffAddr happyCheck off_i, i)+ else False+ action+ | check = indexShortOffAddr happyTable off_i+ | otherwise = indexShortOffAddr happyDefActions st+++++indexShortOffAddr (HappyA# arr) off =+ Happy_GHC_Exts.narrow16Int# i+ where+ 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#+++++{-# INLINE happyLt #-}+happyLt x y = LT(x,y)+++readArrayBit arr bit =+ Bits.testBit (Happy_GHC_Exts.I# (indexShortOffAddr arr ((unbox_int bit) `Happy_GHC_Exts.iShiftRA#` 4#))) (bit `mod` 16)+ where unbox_int (Happy_GHC_Exts.I# x) = x+++++++data HappyAddr = HappyA# Happy_GHC_Exts.Addr#+++-----------------------------------------------------------------------------+-- HappyState data type (not arrays)++{-# LINE 180 "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+-- trace "shifting the error token" $+ happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)++happyShift new_state i tk st sts stk =+ happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)++-- happyReduce is specialised for the common cases.++happySpecReduce_0 i fn 0# tk st sts stk+ = happyFail [] 0# tk st sts stk+happySpecReduce_0 nt fn j tk st@((action)) sts stk+ = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)++happySpecReduce_1 i fn 0# tk st sts stk+ = happyFail [] 0# tk st sts stk+happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')+ = let r = fn v1 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_2 i fn 0# tk st sts stk+ = happyFail [] 0# tk st sts stk+happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')+ = let r = fn v1 v2 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_3 i fn 0# tk st sts stk+ = happyFail [] 0# tk st sts stk+happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')+ = let r = fn v1 v2 v3 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happyReduce k i fn 0# tk st sts stk+ = happyFail [] 0# tk st sts stk+happyReduce k nt fn j tk st sts stk+ = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let r = fn stk in -- it doesn't hurt to always seq here...+ happyDoSeq r (happyGoto nt j tk st1 sts1 r)++happyMonadReduce k nt fn 0# tk st sts stk+ = happyFail [] 0# tk st sts stk+happyMonadReduce k nt fn j tk st sts stk =+ case happyDrop k (HappyCons (st) (sts)) of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let drop_stk = happyDropStk k stk in+ happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_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 =+ case happyDrop k (HappyCons (st) (sts)) of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let drop_stk = happyDropStk k stk++ off = happyAdjustOffset (indexShortOffAddr happyGotoOffsets st1)+ off_i = (off Happy_GHC_Exts.+# nt)+ new_state = indexShortOffAddr happyTable off_i+++++ in+ happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))++happyDrop 0# l = l+happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t++happyDropStk 0# l = l+happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs++-----------------------------------------------------------------------------+-- Moving to a new state after a reduction+++happyGoto nt j tk st = + {- nothing -}+ happyDoAction j tk new_state+ where off = happyAdjustOffset (indexShortOffAddr happyGotoOffsets st)+ off_i = (off Happy_GHC_Exts.+# nt)+ new_state = indexShortOffAddr happyTable off_i+++++-----------------------------------------------------------------------------+-- Error recovery (0# is the error token)++-- parse error if we are in recovery and we fail again+happyFail explist 0# tk old_st _ stk@(x `HappyStk` _) =+ let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+-- trace "failing" $ + happyError_ explist i tk++{- We don't need state discarding for our restricted implementation of+ "error". In fact, it can cause some bogus parses, so I've disabled it+ for now --SDM++-- discard a state+happyFail 0# tk old_st (HappyCons ((action)) (sts)) + (saved_tok `HappyStk` _ `HappyStk` stk) =+-- trace ("discarding state, depth " ++ show (length stk)) $+ happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))+-}++-- Enter error recovery: generate an error token,+-- save the old token and carry on.+happyFail explist i tk (action) sts stk =+-- trace "entering error recovery" $+ happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)++-- Internal happy errors:++notHappyAtAll :: a+notHappyAtAll = error "Internal Happy error\n"++-----------------------------------------------------------------------------+-- Hack to get the typechecker to accept our action functions+++happyTcHack :: Happy_GHC_Exts.Int# -> a -> a+happyTcHack x y = y+{-# INLINE happyTcHack #-}+++-----------------------------------------------------------------------------+-- Seq-ing. If the --strict flag is given, then Happy emits +-- happySeq = happyDoSeq+-- otherwise it emits+-- happySeq = happyDontSeq++happyDoSeq, happyDontSeq :: a -> b -> b+happyDoSeq a b = a `seq` b+happyDontSeq a b = b++-----------------------------------------------------------------------------+-- Don't inline any functions from the template. GHC has a nasty habit+-- of deciding to inline happyGoto everywhere, which increases the size of+-- the generated parser quite a bit.+++{-# NOINLINE happyDoAction #-}+{-# NOINLINE happyTable #-}+{-# NOINLINE happyCheck #-}+{-# NOINLINE happyActOffsets #-}+{-# NOINLINE happyGotoOffsets #-}+{-# NOINLINE happyDefActions #-}++{-# NOINLINE happyShift #-}+{-# NOINLINE happySpecReduce_0 #-}+{-# NOINLINE happySpecReduce_1 #-}+{-# NOINLINE happySpecReduce_2 #-}+{-# NOINLINE happySpecReduce_3 #-}+{-# NOINLINE happyReduce #-}+{-# NOINLINE happyMonadReduce #-}+{-# NOINLINE happyGoto #-}+{-# NOINLINE happyFail #-}++-- end of Happy Template.
language-c.cabal view
@@ -1,121 +1,133 @@-Name: language-c -Version: 0.7.2 -Cabal-Version: >= 1.8 -Build-Type: Simple -License: BSD3 -License-File: LICENSE -Copyright: LICENSE -Author: AUTHORS -Maintainer: benedikt.huber@gmail.com -Stability: experimental -Homepage: http://visq.github.io/language-c/ -Bug-reports: https://github.com/visq/language-c/issues/ - -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 - set of C11 and clang/GNU extensions. -Category: Language -Tested-With: GHC == 7.8.*, GHC == 7.10.*, GHC == 8.0.*, GHC == 8.2.1 - -Extra-Source-Files: AUTHORS AUTHORS.c2hs ChangeLog README - src/Language/C/Parser/Lexer.x - src/Language/C/Parser/Parser.y - -Source-Repository head - type: git - location: https://github.com/visq/language-c.git - -Flag splitBase - Description: Choose the new smaller, split-up base package. -Flag useByteStrings - Description: Use ByteString as InputStream datatype - Default: True -Flag separateSYB - description: Data.Generics available in separate package. -Flag allWarnings - Description: Turn on all warnings for building (development) - Default: False -Library - Extensions: CPP, DeriveDataTypeable, PatternGuards, BangPatterns, ExistentialQuantification, GeneralizedNewtypeDeriving, ScopedTypeVariables - Build-Depends: filepath - if flag(allWarnings) - if impl(ghc >= 8.0) - ghc-options: -Wall -Wno-redundant-constraints - else - ghc-options: -Wall - if flag(splitBase) - Build-Depends: base >= 3 && < 5, process, directory, array, containers, pretty < 1.2.0 - - If flag(separateSYB) - Build-Depends: - base >=4 && <5, - syb - Else - Build-Depends: - base <4 - else - Build-Depends: base < 3 - - if flag(useByteStrings) - Build-Depends: bytestring >= 0.9.0 - else - cpp-options: -DNO_BYTESTRING - Build-Tools: happy, alex - - Hs-Source-Dirs: src - Exposed-Modules: - -- top-level - Language.C - -- data - Language.C.Data - Language.C.Data.Position - Language.C.Data.Ident - Language.C.Data.Error - Language.C.Data.Name - Language.C.Data.Node - Language.C.Data.InputStream - -- syntax - Language.C.Syntax - Language.C.Syntax.AST - Language.C.Syntax.Constants - Language.C.Syntax.Ops - Language.C.Syntax.Utils - -- parser - Language.C.Parser - -- pretty printer - Language.C.Pretty - -- system - Language.C.System.Preprocess - 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 - Language.C.Analysis.TravMonad - 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.Data.RList - -- parser implementation - Language.C.Parser.Builtin - Language.C.Parser.Lexer - Language.C.Parser.ParserMonad - Language.C.Parser.Tokens - Language.C.Parser.Parser - --- test description -Test-Suite language-c-harness - type: exitcode-stdio-1.0 - main-is: test/harness/run-harness.hs +Name: language-c+Version: 0.8+Cabal-Version: >= 1.8+Build-Type: Simple+License: BSD3+License-File: LICENSE+Copyright: LICENSE+Author: AUTHORS+Maintainer: benedikt.huber@gmail.com+Stability: experimental+Homepage: http://visq.github.io/language-c/+Bug-reports: https://github.com/visq/language-c/issues/++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+ set of C11 and clang/GNU extensions.+Category: Language+Tested-With: GHC == 7.8.*, GHC == 7.10.*, GHC == 8.0.*, GHC == 8.2.1++Extra-Source-Files: AUTHORS AUTHORS.c2hs ChangeLog README+ src/Language/C/Parser/Lexer.x+ src/Language/C/Parser/Parser.y++Source-Repository head+ type: git+ location: https://github.com/visq/language-c.git++Flag useByteStrings+ Description: Use ByteString as InputStream datatype+ Default: True+Flag separateSYB+ description: Data.Generics available in separate package.+Flag allWarnings+ Description: Turn on all warnings for building (development)+ Default: False+Flag iecFpExtension+ Description: Support IEC 60559 floating point extension (defines _Float128)+ Default: True+Library+ Extensions: CPP, DeriveDataTypeable, DeriveGeneric, PatternGuards, BangPatterns, ExistentialQuantification, GeneralizedNewtypeDeriving, ScopedTypeVariables+ Build-Depends: base >= 3 && < 5,+ array,+ containers,+ deepseq >= 1.4.0.0 && < 1.5,+ directory,+ filepath,+ pretty < 1.2.0,+ process+ if flag(allWarnings)+ if impl(ghc >= 8.0)+ ghc-options: -Wall -Wno-redundant-constraints+ else+ ghc-options: -Wall++ If flag(separateSYB)+ Build-Depends:+ base >=4 && <5,+ syb+ Else+ Build-Depends:+ base <4++ if flag(useByteStrings)+ Build-Depends: bytestring >= 0.9.0+ else+ cpp-options: -DNO_BYTESTRING++ if flag(iecFpExtension)+ cpp-options: -DIEC_60559_TYPES_EXT++ -- GHC.Generics lived in `ghc-prim` for GHC 7.2 & GHC 7.4+ if impl(ghc == 7.4.*)+ build-depends: ghc-prim == 0.2.*++ Build-Tools: happy, alex++ Hs-Source-Dirs: src+ Exposed-Modules:+ -- top-level+ Language.C+ -- data+ Language.C.Data+ Language.C.Data.Position+ Language.C.Data.Ident+ Language.C.Data.Error+ Language.C.Data.Name+ Language.C.Data.Node+ Language.C.Data.InputStream+ -- syntax+ Language.C.Syntax+ Language.C.Syntax.AST+ Language.C.Syntax.Constants+ Language.C.Syntax.Ops+ Language.C.Syntax.Utils+ -- parser+ Language.C.Parser+ -- pretty printer+ Language.C.Pretty+ -- system+ Language.C.System.Preprocess+ 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+ Language.C.Analysis.TravMonad+ 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.Data.RList+ -- parser implementation+ Language.C.Parser.Builtin+ Language.C.Parser.Lexer+ Language.C.Parser.ParserMonad+ Language.C.Parser.Tokens+ Language.C.Parser.Parser++-- test description+Test-Suite language-c-harness+ type: exitcode-stdio-1.0+ main-is: test/harness/run-harness.hs build-depends: base, language-c, directory, process, filepath
src/Language/C.hs view
@@ -1,53 +1,53 @@------------------------------------------------------------------------------ --- | --- Module : Language.C --- Copyright : (c) 2008 Benedikt Huber --- [1995..2007] --- Manuel M. T. Chakravarty --- Duncan Coutts --- Betram Felgenhauer --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- Portability : ghc --- --- Library for analysing and generating C code. --- --- See <http://www.sivity.net/projects/language.c> ------------------------------------------------------------------------------ -module Language.C ( - parseCFile, parseCFilePre, -- maybe change ? - module Language.C.Data, - module Language.C.Syntax, - module Language.C.Pretty, - module Language.C.Parser, -) -where -import Language.C.Data -import Language.C.Syntax -import Language.C.Pretty -import Language.C.Parser -import Language.C.System.Preprocess - --- | 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 -parseCFile :: (Preprocessor cpp) => cpp -> Maybe FilePath -> [String] -> FilePath -> IO (Either ParseError CTranslUnit) -parseCFile cpp tmp_dir_opt args input_file = do - input_stream <- if not (isPreprocessed input_file) - then let cpp_args = (rawCppArgs args input_file) { cppTmpDir = tmp_dir_opt } - in runPreprocessor cpp cpp_args >>= handleCppError - else readInputStream input_file - return$ parseC input_stream (initPos input_file) - where - handleCppError (Left exitCode) = fail $ "Preprocessor failed with " ++ show exitCode - handleCppError (Right ok) = return ok - --- | parse an already preprocessed C file --- --- > Synopsis: parseCFilePre file.i -parseCFilePre :: FilePath -> IO (Either ParseError CTranslUnit) -parseCFilePre file = do - input_stream <- readInputStream file - return $ parseC input_stream (initPos file) +-----------------------------------------------------------------------------+-- |+-- Module : Language.C+-- Copyright : (c) 2008 Benedikt Huber+-- [1995..2007]+-- Manuel M. T. Chakravarty+-- Duncan Coutts+-- Betram Felgenhauer+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : ghc+--+-- Library for analysing and generating C code.+--+-- See <http://www.sivity.net/projects/language.c>+-----------------------------------------------------------------------------+module Language.C (+ parseCFile, parseCFilePre, -- maybe change ?+ module Language.C.Data,+ module Language.C.Syntax,+ module Language.C.Pretty,+ module Language.C.Parser,+)+where+import Language.C.Data+import Language.C.Syntax+import Language.C.Pretty+import Language.C.Parser+import Language.C.System.Preprocess++-- | 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+parseCFile :: (Preprocessor cpp) => cpp -> Maybe FilePath -> [String] -> FilePath -> IO (Either ParseError CTranslUnit)+parseCFile cpp tmp_dir_opt args input_file = do+ input_stream <- if not (isPreprocessed input_file)+ then let cpp_args = (rawCppArgs args input_file) { cppTmpDir = tmp_dir_opt }+ in runPreprocessor cpp cpp_args >>= handleCppError+ else readInputStream input_file+ return$ parseC input_stream (initPos input_file)+ where+ handleCppError (Left exitCode) = fail $ "Preprocessor failed with " ++ show exitCode+ handleCppError (Right ok) = return ok++-- | parse an already preprocessed C file+--+-- > Synopsis: parseCFilePre file.i+parseCFilePre :: FilePath -> IO (Either ParseError CTranslUnit)+parseCFilePre file = do+ input_stream <- readInputStream file+ return $ parseC input_stream (initPos file)
src/Language/C/Analysis.hs view
@@ -1,69 +1,69 @@------------------------------------------------------------------------------ --- | --- Module : Language.C.Analysis --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : alpha --- Portability : ghc --- --- Analysis of the AST. --- --- Currently, we provide a monad for analysis and analyze declarations and types. --- Especially note that there is no direct support for analyzing function bodies and --- constant expressions. --- --- /NOTE/ This is an experimental interface, and therefore the API will change in the --- future. --- --- DONE: --- --- * Name analysis framework --- --- * File-scope analysis --- --- * Declaration analysis --- --- TODO: --- --- * Type checking expressions --- --- * Constant expression evaluation (CEE) --- --- * Typed representation of attributes (depends on CEE) --- --- * Normalized representation of initializers --- --- * Support for analyzing function bodies (depends on CEE) --- --- * Normalizing expressions and statements --- --- * Formal rules how to link back to the AST using NodeInfo fields --- --- * Typed assembler representation - ------------------------------------------------------------------------------ -module Language.C.Analysis ( - -- * Semantic representation - module Language.C.Analysis.SemRep, - -- * Error datatypes for the analysis - module Language.C.Analysis.SemError, - -- * Traversal monad - module Language.C.Analysis.TravMonad, - -- * Top level analysis - module Language.C.Analysis.AstAnalysis, - -- * Analyzing declarations - module Language.C.Analysis.DeclAnalysis, - -- * Debug print - module Language.C.Analysis.Debug, -) -where -import Language.C.Analysis.SemError -import Language.C.Analysis.SemRep - -import Language.C.Analysis.TravMonad - -import Language.C.Analysis.AstAnalysis -import Language.C.Analysis.DeclAnalysis - -import Language.C.Analysis.Debug +-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Analysis+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : alpha+-- Portability : ghc+--+-- Analysis of the AST.+--+-- Currently, we provide a monad for analysis and analyze declarations and types.+-- Especially note that there is no direct support for analyzing function bodies and+-- constant expressions.+--+-- /NOTE/ This is an experimental interface, and therefore the API will change in the+-- future.+--+-- DONE:+--+-- * Name analysis framework+--+-- * File-scope analysis+--+-- * Declaration analysis+--+-- TODO:+--+-- * Type checking expressions+--+-- * Constant expression evaluation (CEE)+--+-- * Typed representation of attributes (depends on CEE)+--+-- * Normalized representation of initializers+--+-- * Support for analyzing function bodies (depends on CEE)+--+-- * Normalizing expressions and statements+--+-- * Formal rules how to link back to the AST using NodeInfo fields+--+-- * Typed assembler representation++-----------------------------------------------------------------------------+module Language.C.Analysis (+ -- * Semantic representation+ module Language.C.Analysis.SemRep,+ -- * Error datatypes for the analysis+ module Language.C.Analysis.SemError,+ -- * Traversal monad+ module Language.C.Analysis.TravMonad,+ -- * Top level analysis+ module Language.C.Analysis.AstAnalysis,+ -- * Analyzing declarations+ module Language.C.Analysis.DeclAnalysis,+ -- * Debug print+ module Language.C.Analysis.Debug,+)+where+import Language.C.Analysis.SemError+import Language.C.Analysis.SemRep++import Language.C.Analysis.TravMonad++import Language.C.Analysis.AstAnalysis+import Language.C.Analysis.DeclAnalysis++import Language.C.Analysis.Debug
src/Language/C/Analysis/AstAnalysis.hs view
@@ -1,777 +1,777 @@-{-# LANGUAGE ScopedTypeVariables, PatternGuards #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Parser.Translation --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : alpha --- Portability : ghc --- --- Analyse the parse tree --- --- Traverses the AST, analyses declarations and invokes handlers. ------------------------------------------------------------------------------ -module Language.C.Analysis.AstAnalysis ( - -- * Top-level analysis - analyseAST, - 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.ConstEval -import Language.C.Analysis.DefTable (globalDefs, defineLabel, inFileScope, - lookupLabel, insertType, lookupType) -import Language.C.Analysis.DeclAnalysis -import Language.C.Analysis.TypeUtils -import Language.C.Analysis.TypeCheck - -import Language.C.Data -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 Prelude hiding (mapM, mapM_, reverse) -import Control.Monad hiding (mapM, mapM_) -import qualified Data.Map as Map -import Data.Maybe -import Data.Traversable (mapM) -import Data.Foldable (mapM_) - --- * analysis - --- | Analyse the given AST --- --- @analyseAST ast@ results in global declaration dictionaries. --- If you want to perform specific actions on declarations or definitions, you may provide --- 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 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 -> unless (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 _) - = handleAsmBlock asm -analyseExt (CFDefExt fundef) - = analyseFunDef fundef -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 Nothing - let (VarDeclInfo name fun_spec storage_spec attrs ty _declr_node) = var_decl_info - when (isNoName name) $ astError node_info "NoName in analyseFunDef" - let ident = identOfVarName name - -- improve incomplete type - ty' <- improveFunDefType ty - -- compute storage - fun_storage <- computeFunDefStorage ident storage_spec - let var_decl = VarDecl name (DeclAttrs fun_spec 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 ty = return ty - -voidM :: Monad m => m a -> m () -voidM m = m >> return () - --- | Analyse a declaration other than a function definition --- --- Note: static assertions are not analysed -analyseDecl :: (MonadTrav m) => Bool -> CDecl -> m () -analyseDecl _is_local (CStaticAssert _expr _strlit _annot) = return () -- TODO -analyseDecl is_local decl@(CDecl declspecs declrs node) - | null declrs = - case typedef_spec of Just _ -> astError node "bad typedef declaration: missing declarator" - Nothing -> voidM$ analyseTypeDecl decl - | (Just declspecs') <- typedef_spec = mapM_ (uncurry (analyseTyDef declspecs')) declr_list - | otherwise = do let (storage_specs, attrs, typequals, typespecs, funspecs, _alignspecs) = - partitionDeclSpecs declspecs - canonTySpecs <- canonicalTypeSpec typespecs - -- TODO: alignspecs not yet processed - let specs = - (storage_specs, attrs, typequals, canonTySpecs, funspecs) - mapM_ (uncurry (analyseVarDeclr specs)) declr_list - where - declr_list = zip (True : repeat False) declrs - typedef_spec = hasTypeDef declspecs - - analyseTyDef declspecs' handle_sue_def declr = - case declr of - (Just tydeclr, Nothing , Nothing) -> analyseTypeDef handle_sue_def declspecs' tydeclr node - _ -> astError node "bad typdef declaration: bitfieldsize or initializer present" - - analyseVarDeclr specs handle_sue_def (Just declr, init_opt, Nothing) = do - -- analyse the declarator - 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 - if isFunctionType typ - then extFunProto vardeclInfo - 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 fun_attrs storage_spec attrs ty _node) <- analyseVarDecl' handle_sue_def declspecs declr [] Nothing - checkValidTypeDef fun_attrs storage_spec attrs - when (isNoName name) $ astError node_info "NoName in analyseTypeDef" - let ident = identOfVarName name - handleTypeDef (TypeDef ident ty attrs node_info) - where - checkValidTypeDef fun_attrs _ _ | fun_attrs /= noFunctionAttrs = - astError node_info "inline specifier for typeDef" - checkValidTypeDef _ NoStorageSpec _ = return () - checkValidTypeDef _ bad_storage _ = astError node_info $ "storage specified for typeDef: " ++ show bad_storage - --- | compute storage of a function definition --- --- a function definition has static storage with internal linkage if specified `static`, --- the previously declared linkage if any if 'extern' or no specifier are present. (See C99 6.2.2, clause 5) --- --- This function won't raise an Trav error if the declaration is incompatible with the existing one, --- this case is handled in 'handleFunDef'. -computeFunDefStorage :: (MonadTrav m) => Ident -> StorageSpec -> m Storage -computeFunDefStorage _ (StaticSpec _) = return$ FunLinkage InternalLinkage -computeFunDefStorage ident other_spec = do - obj_opt <- lookupObject ident - let defaultSpec = FunLinkage ExternalLinkage - case other_spec of - NoStorageSpec -> return$ maybe defaultSpec declStorage obj_opt - (ExternSpec False) -> return$ maybe defaultSpec declStorage obj_opt - 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 fun_spec storage_spec attrs ty node_info) = - do when (isNoName var_name) $ astError node_info "NoName in extFunProto" - old_fun <- lookupObject (identOfVarName var_name) - checkValidSpecs - let decl = VarDecl var_name (DeclAttrs fun_spec (funDeclLinkage old_fun) attrs) ty - 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 - NoStorageSpec -> FunLinkage ExternalLinkage -- prototype declaration / external linkage - StaticSpec False -> FunLinkage InternalLinkage -- prototype declaration / internal linkage - ExternSpec False -> case old_fun of - Nothing -> FunLinkage ExternalLinkage - Just f -> declStorage f - _ -> 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 () - --- | 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 [http://www.sivity.net/projects/language.c/wiki/ExternalDefinitions] -extVarDecl :: (MonadTrav m) => VarDeclInfo -> Maybe Initializer -> m () -extVarDecl (VarDeclInfo var_name fun_spec storage_spec attrs typ node_info) init_opt = - do when (isNoName var_name) $ astError node_info "NoName in extVarDecl" - (storage,is_def) <- globalStorage storage_spec - let vardecl = VarDecl var_name (DeclAttrs fun_spec storage attrs) typ - if is_def - then handleObjectDef False ident $ ObjDef vardecl init_opt node_info - else handleVarDecl False $ Decl vardecl node_info - where - ident = identOfVarName var_name - globalStorage _ | fun_spec /= noFunctionAttrs = - astError node_info "invalid function specifier for external variable" - globalStorage AutoSpec = astError node_info "file-scope declaration specifies storage `auto'" - 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) - globalStorage ThreadSpec = return (Static ExternalLinkage True, 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 . functionAttrs) fd - isFuncDef _ = False - --- | 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 fun_attrs 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 fun_attrs 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 NoStorageSpec = return (Auto False,True) - localStorage ThreadSpec = return (Auto True,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 _ = astError node_info "bad storage specifier for local" - -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 - -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 - -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 ()) (voidM . tStmt c) 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 = voidM$ tExpr c RValue e -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 - TyInt128 -> 16 - TyUInt128 -> 16 - , 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 - TyInt128 -> 16 - TyUInt128 -> 16 - , 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 _ (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' ctx side (CGenericSelection expr list ni) = do - ty_sel <- tExpr ctx side expr - ty_list <- mapM analyseAssoc list - def_expr_ty <- - case dropWhile (isJust . fst) ty_list of - [(Nothing,tExpr'')] -> return (Just tExpr'') - [] -> return Nothing - _ -> astError ni "more than one default clause in generic selection" - case dropWhile (maybe True (not . typesMatch ty_sel) . fst) ty_list of - ((_,expr_ty) : _ ) -> return expr_ty - [] -> case def_expr_ty of - (Just expr_ty) -> return expr_ty - Nothing -> astError ni ("no clause matches for generic selection (not fully supported) - selector type is " ++ show (pretty ty_sel) ++ - ", available types are " ++ show (map (pretty.fromJust.fst) (filter (isJust.fst) ty_list))) - where - analyseAssoc (mdecl,expr') = do - tDecl <- mapM analyseTypeDecl mdecl - tExpr'' <- tExpr ctx side expr' - return (tDecl, tExpr'') - typesMatch (DirectType tn1 _ _) (DirectType tn2 _ _) = directTypesMatch tn1 tn2 - typesMatch _ _ = False -- not fully supported - directTypesMatch TyVoid TyVoid = True - directTypesMatch (TyIntegral t1) (TyIntegral t2) = t1 == t2 - directTypesMatch (TyFloating t1) (TyFloating t2) = t1 == t2 - directTypesMatch (TyComplex t1) (TyComplex t2) = t1 == t2 - directTypesMatch _ _ = False -- TODO: not fully supported -tExpr' _ _ (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 - if isTransparentUnion attrs - then - 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" - else - 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 _ (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 _ (PtrType (DirectType TyVoid _ _) _ _ ) _ = - return () -- XXX: more checking -tInitList _ t [([], i)] = voidM$ tInit t i -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 : _) = - 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 (DirectType (TyComp _) _ _) (d : _) = - typeError (nodeInfo d) "array designator in compound initializer" -tDesignator t [] = return t -tDesignator _t _ = - error "unepxected type with designator" - -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 -builtinType (CBuiltinConvertVector _expr ty _) = analyseTypeDecl ty - --- return @Just declspecs@ without @CTypedef@ if the declaration specifier contain @typedef@ -hasTypeDef :: [CDeclSpec] -> Maybe [CDeclSpec] -hasTypeDef declspecs = - case foldr hasTypeDefSpec (False,[]) declspecs of - (True,specs') -> Just specs' - (False,_) -> Nothing - where - hasTypeDefSpec (CStorageSpec (CTypedef _)) (_,specs) = (True, specs) - hasTypeDefSpec spec (b,specs) = (b,spec:specs) +{-# LANGUAGE ScopedTypeVariables, PatternGuards #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Parser.Translation+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : alpha+-- Portability : ghc+--+-- Analyse the parse tree+--+-- Traverses the AST, analyses declarations and invokes handlers.+-----------------------------------------------------------------------------+module Language.C.Analysis.AstAnalysis (+ -- * Top-level analysis+ analyseAST,+ 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.ConstEval+import Language.C.Analysis.DefTable (globalDefs, defineLabel, inFileScope,+ lookupLabel, insertType, lookupType)+import Language.C.Analysis.DeclAnalysis+import Language.C.Analysis.TypeUtils+import Language.C.Analysis.TypeCheck++import Language.C.Data+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 Prelude hiding (mapM, mapM_, reverse)+import Control.Monad hiding (mapM, mapM_)+import qualified Data.Map as Map+import Data.Maybe+import Data.Traversable (mapM)+import Data.Foldable (mapM_)++-- * analysis++-- | Analyse the given AST+--+-- @analyseAST ast@ results in global declaration dictionaries.+-- If you want to perform specific actions on declarations or definitions, you may provide+-- 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 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 -> unless (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 _)+ = handleAsmBlock asm+analyseExt (CFDefExt fundef)+ = analyseFunDef fundef+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 Nothing+ let (VarDeclInfo name fun_spec storage_spec attrs ty _declr_node) = var_decl_info+ when (isNoName name) $ astError node_info "NoName in analyseFunDef"+ let ident = identOfVarName name+ -- improve incomplete type+ ty' <- improveFunDefType ty+ -- compute storage+ fun_storage <- computeFunDefStorage ident storage_spec+ let var_decl = VarDecl name (DeclAttrs fun_spec 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 ty = return ty++voidM :: Monad m => m a -> m ()+voidM m = m >> return ()++-- | Analyse a declaration other than a function definition+--+-- Note: static assertions are not analysed+analyseDecl :: (MonadTrav m) => Bool -> CDecl -> m ()+analyseDecl _is_local (CStaticAssert _expr _strlit _annot) = return () -- TODO+analyseDecl is_local decl@(CDecl declspecs declrs node)+ | null declrs =+ case typedef_spec of Just _ -> astError node "bad typedef declaration: missing declarator"+ Nothing -> voidM$ analyseTypeDecl decl+ | (Just declspecs') <- typedef_spec = mapM_ (uncurry (analyseTyDef declspecs')) declr_list+ | otherwise = do let (storage_specs, attrs, typequals, typespecs, funspecs, _alignspecs) =+ partitionDeclSpecs declspecs+ canonTySpecs <- canonicalTypeSpec typespecs+ -- TODO: alignspecs not yet processed+ let specs =+ (storage_specs, attrs, typequals, canonTySpecs, funspecs)+ mapM_ (uncurry (analyseVarDeclr specs)) declr_list+ where+ declr_list = zip (True : repeat False) declrs+ typedef_spec = hasTypeDef declspecs++ analyseTyDef declspecs' handle_sue_def declr =+ case declr of+ (Just tydeclr, Nothing , Nothing) -> analyseTypeDef handle_sue_def declspecs' tydeclr node+ _ -> astError node "bad typdef declaration: bitfieldsize or initializer present"++ analyseVarDeclr specs handle_sue_def (Just declr, init_opt, Nothing) = do+ -- analyse the declarator+ 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+ if isFunctionType typ+ then extFunProto vardeclInfo+ 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 fun_attrs storage_spec attrs ty _node) <- analyseVarDecl' handle_sue_def declspecs declr [] Nothing+ checkValidTypeDef fun_attrs storage_spec attrs+ when (isNoName name) $ astError node_info "NoName in analyseTypeDef"+ let ident = identOfVarName name+ handleTypeDef (TypeDef ident ty attrs node_info)+ where+ checkValidTypeDef fun_attrs _ _ | fun_attrs /= noFunctionAttrs =+ astError node_info "inline specifier for typeDef"+ checkValidTypeDef _ NoStorageSpec _ = return ()+ checkValidTypeDef _ bad_storage _ = astError node_info $ "storage specified for typeDef: " ++ show bad_storage++-- | compute storage of a function definition+--+-- a function definition has static storage with internal linkage if specified `static`,+-- the previously declared linkage if any if 'extern' or no specifier are present. (See C99 6.2.2, clause 5)+--+-- This function won't raise an Trav error if the declaration is incompatible with the existing one,+-- this case is handled in 'handleFunDef'.+computeFunDefStorage :: (MonadTrav m) => Ident -> StorageSpec -> m Storage+computeFunDefStorage _ (StaticSpec _) = return$ FunLinkage InternalLinkage+computeFunDefStorage ident other_spec = do+ obj_opt <- lookupObject ident+ let defaultSpec = FunLinkage ExternalLinkage+ case other_spec of+ NoStorageSpec -> return$ maybe defaultSpec declStorage obj_opt+ (ExternSpec False) -> return$ maybe defaultSpec declStorage obj_opt+ 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 fun_spec storage_spec attrs ty node_info) =+ do when (isNoName var_name) $ astError node_info "NoName in extFunProto"+ old_fun <- lookupObject (identOfVarName var_name)+ checkValidSpecs+ let decl = VarDecl var_name (DeclAttrs fun_spec (funDeclLinkage old_fun) attrs) ty+ 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+ NoStorageSpec -> FunLinkage ExternalLinkage -- prototype declaration / external linkage+ StaticSpec False -> FunLinkage InternalLinkage -- prototype declaration / internal linkage+ ExternSpec False -> case old_fun of+ Nothing -> FunLinkage ExternalLinkage+ Just f -> declStorage f+ _ -> 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 ()++-- | 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 [http://www.sivity.net/projects/language.c/wiki/ExternalDefinitions]+extVarDecl :: (MonadTrav m) => VarDeclInfo -> Maybe Initializer -> m ()+extVarDecl (VarDeclInfo var_name fun_spec storage_spec attrs typ node_info) init_opt =+ do when (isNoName var_name) $ astError node_info "NoName in extVarDecl"+ (storage,is_def) <- globalStorage storage_spec+ let vardecl = VarDecl var_name (DeclAttrs fun_spec storage attrs) typ+ if is_def+ then handleObjectDef False ident $ ObjDef vardecl init_opt node_info+ else handleVarDecl False $ Decl vardecl node_info+ where+ ident = identOfVarName var_name+ globalStorage _ | fun_spec /= noFunctionAttrs =+ astError node_info "invalid function specifier for external variable"+ globalStorage AutoSpec = astError node_info "file-scope declaration specifies storage `auto'"+ 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)+ globalStorage ThreadSpec = return (Static ExternalLinkage True, 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 . functionAttrs) fd+ isFuncDef _ = False++-- | 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 fun_attrs 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 fun_attrs 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 NoStorageSpec = return (Auto False,True)+ localStorage ThreadSpec = return (Auto True,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 _ = astError node_info "bad storage specifier for local"++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++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++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 ()) (voidM . tStmt c) 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 = voidM$ tExpr c RValue e+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+ TyInt128 -> 16+ TyUInt128 -> 16+ , 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+ TyInt128 -> 16+ TyUInt128 -> 16+ , 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 _ (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' ctx side (CGenericSelection expr list ni) = do+ ty_sel <- tExpr ctx side expr+ ty_list <- mapM analyseAssoc list+ def_expr_ty <-+ case dropWhile (isJust . fst) ty_list of+ [(Nothing,tExpr'')] -> return (Just tExpr'')+ [] -> return Nothing+ _ -> astError ni "more than one default clause in generic selection"+ case dropWhile (maybe True (not . typesMatch ty_sel) . fst) ty_list of+ ((_,expr_ty) : _ ) -> return expr_ty+ [] -> case def_expr_ty of+ (Just expr_ty) -> return expr_ty+ Nothing -> astError ni ("no clause matches for generic selection (not fully supported) - selector type is " ++ show (pretty ty_sel) +++ ", available types are " ++ show (map (pretty.fromJust.fst) (filter (isJust.fst) ty_list)))+ where+ analyseAssoc (mdecl,expr') = do+ tDecl <- mapM analyseTypeDecl mdecl+ tExpr'' <- tExpr ctx side expr'+ return (tDecl, tExpr'')+ typesMatch (DirectType tn1 _ _) (DirectType tn2 _ _) = directTypesMatch tn1 tn2+ typesMatch _ _ = False -- not fully supported+ directTypesMatch TyVoid TyVoid = True+ directTypesMatch (TyIntegral t1) (TyIntegral t2) = t1 == t2+ directTypesMatch (TyFloating t1) (TyFloating t2) = t1 == t2+ directTypesMatch (TyComplex t1) (TyComplex t2) = t1 == t2+ directTypesMatch _ _ = False -- TODO: not fully supported+tExpr' _ _ (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+ if isTransparentUnion attrs+ then+ 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"+ else+ 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 _ (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 _ (PtrType (DirectType TyVoid _ _) _ _ ) _ =+ return () -- XXX: more checking+tInitList _ t [([], i)] = voidM$ tInit t i+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 : _) =+ 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 (DirectType (TyComp _) _ _) (d : _) =+ typeError (nodeInfo d) "array designator in compound initializer"+tDesignator t [] = return t+tDesignator _t _ =+ error "unepxected type with designator"++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+builtinType (CBuiltinConvertVector _expr ty _) = analyseTypeDecl ty++-- return @Just declspecs@ without @CTypedef@ if the declaration specifier contain @typedef@+hasTypeDef :: [CDeclSpec] -> Maybe [CDeclSpec]+hasTypeDef declspecs =+ case foldr hasTypeDefSpec (False,[]) declspecs of+ (True,specs') -> Just specs'+ (False,_) -> Nothing+ where+ hasTypeDefSpec (CStorageSpec (CTypedef _)) (_,specs) = (True, specs)+ hasTypeDefSpec spec (b,specs) = (b,spec:specs)
src/Language/C/Analysis/AstAnalysis.hs-boot view
@@ -1,13 +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 +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
@@ -1,226 +1,226 @@-module Language.C.Analysis.Builtins (builtins) where - -import Language.C.Analysis.DefTable -import Language.C.Analysis.SemRep -import Language.C.Analysis.TypeUtils -import Language.C.Data.Ident -import Language.C.Data.Node - -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 noFunctionAttrs (Auto False) []) - ty) undefNode - fnAttrs = DeclAttrs noFunctionAttrs (FunLinkage ExternalLinkage) [] - varAttrs = DeclAttrs noFunctionAttrs (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_bswap16" - uint16_tType - [uint16_tType] - , func "__builtin_bswap32" - uint32_tType - [uint32_tType] - , func "__builtin_bswap64" - uint64_tType - [uint64_tType] - , 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 - ] - ] +module Language.C.Analysis.Builtins (builtins) where++import Language.C.Analysis.DefTable+import Language.C.Analysis.SemRep+import Language.C.Analysis.TypeUtils+import Language.C.Data.Ident+import Language.C.Data.Node++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 noFunctionAttrs (Auto False) [])+ ty) undefNode+ fnAttrs = DeclAttrs noFunctionAttrs (FunLinkage ExternalLinkage) []+ varAttrs = DeclAttrs noFunctionAttrs (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_bswap16"+ uint16_tType+ [uint16_tType]+ , func "__builtin_bswap32"+ uint32_tType+ [uint32_tType]+ , func "__builtin_bswap64"+ uint64_tType+ [uint64_tType]+ , 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
@@ -1,209 +1,209 @@-{-# 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 _ (ArrayType _ (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 _ t _) _ _) = sizeofType md n t -sizeofType md _ (FunctionType _ _) = return $ ptrSize md - -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 _ (ArrayType _ (UnknownArraySize _) _ _) = return $ ptrAlign md -alignofType md n (ArrayType bt (ArraySize _ _) _ _) = alignofType md n bt -alignofType md n (TypeDefType (TypeDefRef _ 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 _ 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 +{-# 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 _ (ArrayType _ (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 _ t _) _ _) = sizeofType md n t+sizeofType md _ (FunctionType _ _) = return $ ptrSize md++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 _ (ArrayType _ (UnknownArraySize _) _ _) = return $ ptrAlign md+alignofType md n (ArrayType bt (ArraySize _ _) _ _) = alignofType md n bt+alignofType md n (TypeDefType (TypeDefRef _ 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 _ 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
@@ -1,192 +1,192 @@-{-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-} -{-# OPTIONS -fno-warn-orphans #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Analysis.Debug --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : prototype --- Portability : ghc --- --- Pretty printing the semantic analysis representation. --- This is currently only intended for debugging purposes. ------------------------------------------------------------------------------ -module Language.C.Analysis.Debug ( -globalDeclStats, -prettyAssocs, prettyAssocsWith, --- and many pretty instances -) -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 - -import Prelude hiding ((<>)) -import Text.PrettyPrint.HughesPJ -import Data.Map (Map) ; import qualified Data.Map as Map - -prettyAssocs :: (Pretty k, Pretty v) => String -> [(k,v)] -> Doc -prettyAssocs label = prettyAssocsWith label pretty pretty -prettyAssocsWith :: String -> (k -> Doc) -> (v -> Doc) -> [(k,v)] -> Doc -prettyAssocsWith label prettyKey prettyVal theMap = - text label $$ nest 8 (vcat $ map prettyEntry theMap) - 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 - declMaps = [ prettyMap "enumerators" theEnums, prettyMap "declarations" theDecls, - prettyMap "objects" theObjs, prettyMap "functions" theFuns, - prettyMap "tags" $ gTags gd, prettyMap "typeDefs" $ gTypeDefs gd ] - prettyMap :: (Pretty t, Pretty k) => String -> Map k t -> Doc - prettyMap label = prettyAssocs label . Map.assocs - (theDecls, (theEnums, theObjs, theFuns)) = splitIdentDecls False (gObjs gd) - -globalDeclStats :: (FilePath -> Bool) -> GlobalDecls -> [(String,Int)] -globalDeclStats file_filter gmap = - [ ("Enumeration Constants",Map.size enumerators), - ("Total Object/Function Declarations",Map.size all_decls), - ("Object definitions", Map.size objDefs), - ("Function Definitions", Map.size funDefs), - ("Tag definitions", Map.size tagDefs), - ("TypeDefs", Map.size typeDefs) - ] - where - gmap' = filterGlobalDecls filterFile gmap - (all_decls,(enumerators,objDefs,funDefs)) = splitIdentDecls True (gObjs gmap') - (tagDefs,typeDefs) = (gTags gmap', gTypeDefs gmap') - filterFile :: (CNode n) => n -> Bool - filterFile = maybe True file_filter . fileOfNode . nodeInfo - -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 - pretty (AnonymousRef name) = text $ "$" ++ show (nameId name) - pretty (NamedRef ident) = pretty ident -instance Pretty TagDef where - pretty (CompDef compty) = pretty compty - pretty (EnumDef enumty) = pretty enumty -instance Pretty IdentDecl where - pretty (Declaration decl) = pretty decl - pretty (ObjectDef odef) = pretty odef - pretty (FunctionDef fdef) = pretty fdef - pretty (EnumeratorDef enumerator) = pretty enumerator -instance Pretty Decl where - pretty (Decl vardecl _) = - text "declaration" <+> - pretty vardecl -instance Pretty TypeDef where - pretty (TypeDef ident ty attrs _) = - text "typedef" <+> pretty ident <+> text "as" <+> - pretty attrs <+> pretty ty -instance Pretty ObjDef where - pretty (ObjDef vardecl init_opt _) = - text "object" <+> - pretty vardecl <+> maybe empty (((text "=") <+>) . pretty) init_opt -instance Pretty FunDef where - pretty (FunDef vardecl _stmt _) = - text "function" <+> - pretty vardecl -instance Pretty VarDecl where - pretty (VarDecl name attrs ty) = - ((hsep . punctuate (text " |")) [pretty name, pretty attrs, pretty ty]) -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 fun_attrs storage attrs) = - hsep [ pretty fun_attrs, pretty storage, pretty attrs] - -instance Pretty Type where - pretty ty = pretty (exportTypeDecl ty) -instance Pretty TypeQuals where - pretty tyQuals = hsep $ map showAttr [ ("const",constant),("volatile",volatile),("restrict",restrict) ] - where showAttr (str,select) | select tyQuals = text str - | otherwise = empty - -instance Pretty CompType where - pretty (CompType sue_ref tag members attrs _node) = - (text.show) tag <+> pretty sue_ref <+> - braces (terminateSemi members) <+> - pretty attrs - -instance Pretty MemberDecl where - pretty (MemberDecl (VarDecl name declattrs ty) bitfield _) = - pretty declattrs <+> pretty name <+> text "::" <+> pretty ty <+> - (maybe empty (\bf -> text ":" <+> pretty bf) bitfield) - pretty (AnonBitField ty bitfield_sz _) = - pretty ty <+> text ":" <+> pretty bitfield_sz - -instance Pretty EnumType where - pretty (EnumType sue_ref enumerators attrs _) = - text "enum" <+> pretty sue_ref <+> braces (terminateSemi_ $ map prettyEnr enumerators) <+> pretty attrs - where - prettyEnr (Enumerator ident expr _enumty _) = pretty ident <+> text " = " <+> pretty expr - -instance Pretty Enumerator where - pretty (Enumerator ident expr enumty _) = text "<" <> text "econst" <+> pretty (sueRef enumty) <> text ">" <+> - pretty ident <+> text " = " <+> pretty expr - -instance Pretty FunctionAttrs where - pretty fattrs = hsep [pIf isInline "inline", pIf isNoreturn "_Noreturn"] - where - pIf isMatch txt = if isMatch fattrs then text txt else empty - -instance Pretty Storage where - pretty NoStorage = empty - pretty (Auto reg) = text$ if reg then "auto/register" else "auto" - pretty (Static linkage thread_local) = - (hcat . punctuate (text "/") $ [ text "static",pretty linkage ]) - <+> (if thread_local then text ", __thread" else empty) - pretty (FunLinkage linkage) = text "function/" <> pretty linkage -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) - where pAsmName asmname = text "" <+> parens (text "asmname" <+> pretty asmname) -instance Pretty Attributes where - pretty = joinComma -instance Pretty Attr where - pretty (Attr ident es _) = pretty ident <+> (if null es then empty else text "(...)") - -joinComma :: (Pretty a) => [a] -> Doc -joinComma = hsep . punctuate comma . map pretty -terminateSemi :: (Pretty a) => [a] -> Doc -terminateSemi = terminateSemi_ . map pretty -terminateSemi_ :: [Doc] -> Doc -terminateSemi_ = hsep . map (<> semi) - +{-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-}+{-# OPTIONS -fno-warn-orphans #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Analysis.Debug+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : prototype+-- Portability : ghc+--+-- Pretty printing the semantic analysis representation.+-- This is currently only intended for debugging purposes.+-----------------------------------------------------------------------------+module Language.C.Analysis.Debug (+globalDeclStats,+prettyAssocs, prettyAssocsWith,+-- and many pretty instances+)+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++import Prelude hiding ((<>))+import Text.PrettyPrint.HughesPJ+import Data.Map (Map) ; import qualified Data.Map as Map++prettyAssocs :: (Pretty k, Pretty v) => String -> [(k,v)] -> Doc+prettyAssocs label = prettyAssocsWith label pretty pretty+prettyAssocsWith :: String -> (k -> Doc) -> (v -> Doc) -> [(k,v)] -> Doc+prettyAssocsWith label prettyKey prettyVal theMap =+ text label $$ nest 8 (vcat $ map prettyEntry theMap)+ 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+ declMaps = [ prettyMap "enumerators" theEnums, prettyMap "declarations" theDecls,+ prettyMap "objects" theObjs, prettyMap "functions" theFuns,+ prettyMap "tags" $ gTags gd, prettyMap "typeDefs" $ gTypeDefs gd ]+ prettyMap :: (Pretty t, Pretty k) => String -> Map k t -> Doc+ prettyMap label = prettyAssocs label . Map.assocs+ (theDecls, (theEnums, theObjs, theFuns)) = splitIdentDecls False (gObjs gd)++globalDeclStats :: (FilePath -> Bool) -> GlobalDecls -> [(String,Int)]+globalDeclStats file_filter gmap =+ [ ("Enumeration Constants",Map.size enumerators),+ ("Total Object/Function Declarations",Map.size all_decls),+ ("Object definitions", Map.size objDefs),+ ("Function Definitions", Map.size funDefs),+ ("Tag definitions", Map.size tagDefs),+ ("TypeDefs", Map.size typeDefs)+ ]+ where+ gmap' = filterGlobalDecls filterFile gmap+ (all_decls,(enumerators,objDefs,funDefs)) = splitIdentDecls True (gObjs gmap')+ (tagDefs,typeDefs) = (gTags gmap', gTypeDefs gmap')+ filterFile :: (CNode n) => n -> Bool+ filterFile = maybe True file_filter . fileOfNode . nodeInfo++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+ pretty (AnonymousRef name) = text $ "$" ++ show (nameId name)+ pretty (NamedRef ident) = pretty ident+instance Pretty TagDef where+ pretty (CompDef compty) = pretty compty+ pretty (EnumDef enumty) = pretty enumty+instance Pretty IdentDecl where+ pretty (Declaration decl) = pretty decl+ pretty (ObjectDef odef) = pretty odef+ pretty (FunctionDef fdef) = pretty fdef+ pretty (EnumeratorDef enumerator) = pretty enumerator+instance Pretty Decl where+ pretty (Decl vardecl _) =+ text "declaration" <+>+ pretty vardecl+instance Pretty TypeDef where+ pretty (TypeDef ident ty attrs _) =+ text "typedef" <+> pretty ident <+> text "as" <+>+ pretty attrs <+> pretty ty+instance Pretty ObjDef where+ pretty (ObjDef vardecl init_opt _) =+ text "object" <+>+ pretty vardecl <+> maybe empty (((text "=") <+>) . pretty) init_opt+instance Pretty FunDef where+ pretty (FunDef vardecl _stmt _) =+ text "function" <+>+ pretty vardecl+instance Pretty VarDecl where+ pretty (VarDecl name attrs ty) =+ ((hsep . punctuate (text " |")) [pretty name, pretty attrs, pretty ty])+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 fun_attrs storage attrs) =+ hsep [ pretty fun_attrs, pretty storage, pretty attrs]++instance Pretty Type where+ pretty ty = pretty (exportTypeDecl ty)+instance Pretty TypeQuals where+ pretty tyQuals = hsep $ map showAttr [ ("const",constant),("volatile",volatile),("restrict",restrict) ]+ where showAttr (str,select) | select tyQuals = text str+ | otherwise = empty++instance Pretty CompType where+ pretty (CompType sue_ref tag members attrs _node) =+ (text.show) tag <+> pretty sue_ref <+>+ braces (terminateSemi members) <+>+ pretty attrs++instance Pretty MemberDecl where+ pretty (MemberDecl (VarDecl name declattrs ty) bitfield _) =+ pretty declattrs <+> pretty name <+> text "::" <+> pretty ty <+>+ (maybe empty (\bf -> text ":" <+> pretty bf) bitfield)+ pretty (AnonBitField ty bitfield_sz _) =+ pretty ty <+> text ":" <+> pretty bitfield_sz++instance Pretty EnumType where+ pretty (EnumType sue_ref enumerators attrs _) =+ text "enum" <+> pretty sue_ref <+> braces (terminateSemi_ $ map prettyEnr enumerators) <+> pretty attrs+ where+ prettyEnr (Enumerator ident expr _enumty _) = pretty ident <+> text " = " <+> pretty expr++instance Pretty Enumerator where+ pretty (Enumerator ident expr enumty _) = text "<" <> text "econst" <+> pretty (sueRef enumty) <> text ">" <+>+ pretty ident <+> text " = " <+> pretty expr++instance Pretty FunctionAttrs where+ pretty fattrs = hsep [pIf isInline "inline", pIf isNoreturn "_Noreturn"]+ where+ pIf isMatch txt = if isMatch fattrs then text txt else empty++instance Pretty Storage where+ pretty NoStorage = empty+ pretty (Auto reg) = text$ if reg then "auto/register" else "auto"+ pretty (Static linkage thread_local) =+ (hcat . punctuate (text "/") $ [ text "static",pretty linkage ])+ <+> (if thread_local then text ", __thread" else empty)+ pretty (FunLinkage linkage) = text "function/" <> pretty linkage+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)+ where pAsmName asmname = text "" <+> parens (text "asmname" <+> pretty asmname)+instance Pretty Attributes where+ pretty = joinComma+instance Pretty Attr where+ pretty (Attr ident es _) = pretty ident <+> (if null es then empty else text "(...)")++joinComma :: (Pretty a) => [a] -> Doc+joinComma = hsep . punctuate comma . map pretty+terminateSemi :: (Pretty a) => [a] -> Doc+terminateSemi = terminateSemi_ . map pretty+terminateSemi_ :: [Doc] -> Doc+terminateSemi_ = hsep . map (<> semi)+
src/Language/C/Analysis/DeclAnalysis.hs view
@@ -1,589 +1,590 @@-{-# LANGUAGE PatternGuards, FlexibleContexts #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Analysis.DeclAnalysis --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : alpha --- Portability : ghc --- --- This module performs the analysis of declarations and the translation of --- type specifications in the AST. ------------------------------------------------------------------------------ -module Language.C.Analysis.DeclAnalysis ( - -- * Translating types - analyseTypeDecl, - tType,tDirectType,tNumType,tArraySize,tTypeQuals, - mergeOldStyle, - -- * Dissecting type specs - canonicalTypeSpec, NumBaseType(..),SignSpec(..),SizeMod(..),NumTypeSpec(..),TypeSpecAnalysis(..), - canonicalStorageSpec, StorageSpec(..), hasThreadLocalSpec, isTypeDef, - -- * Helpers - VarDeclInfo(..), - tAttr,mkVarName,getOnlyDeclr,nameOfDecl,analyseVarDecl,analyseVarDecl' -) -where -import Language.C.Data.Error -import Language.C.Data.Node -import Language.C.Data.Ident -import Language.C.Pretty -import Language.C.Syntax -import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..)) -import Language.C.Analysis.DefTable (TagFwdDecl(..), insertType) -import Language.C.Analysis.SemError -import Language.C.Analysis.SemRep -import Language.C.Analysis.TravMonad - -import Data.Foldable as F (foldrM) -import Control.Monad (liftM,when,ap,unless,zipWithM) -import Data.List (intercalate, mapAccumL) -import qualified Data.Map as Map -import Text.PrettyPrint.HughesPJ - - --- * handling declarations - --- | analyse and translate a parameter declaration --- Should be called in either prototype or block scope -tParamDecl :: (MonadTrav m) => CDecl -> m ParamDecl -tParamDecl (CStaticAssert _ _ node) = - astError node "expected parameter, not static assertion" -tParamDecl (CDecl declspecs declrs node) = - do declr <- getParamDeclr - -- analyse the variable declaration - (VarDeclInfo name fun_spec storage_spec attrs ty declr_node) <- analyseVarDecl' True declspecs declr [] Nothing - when (isInline fun_spec || isNoreturn fun_spec) $ - throwTravError (badSpecifierError node "parameter declaration with function 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 - -- XXX: we shouldn't modify the deftable here, just analyse and build representation - return paramDecl - where - getParamDeclr = - case declrs of - [] -> return (emptyDeclr node) - [(Just declr,Nothing,Nothing)] -> return declr - _ -> astError node "bad parameter declaration: multiple decls / bitfield or initializer present" - mkParamDecl name storage attrs ty declr_node = - let vd = VarDecl name (DeclAttrs noFunctionAttrs storage attrs) ty in - 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) -computeParamStorage _ RegSpec = Right (Auto True) -computeParamStorage node spec = Left . badSpecifierError node $ "Bad storage specified for parameter: " ++ show spec - --- | analyse and translate a member declaration -tMemberDecls :: (MonadTrav m) => CDecl -> m [MemberDecl] --- Anonymous struct or union members --- TODO storage specs, align specs and attributes are ignored -tMemberDecls (CStaticAssert _ _ node) = - astError node "expected struct or union member, found static assertion" -tMemberDecls (CDecl declspecs [] node) = - do let (_storage_specs, _attrs, typequals, typespecs, funspecs, _alignspecs) = - partitionDeclSpecs declspecs - unless (null funspecs) $ astError node "member declaration with function 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 noFunctionAttrs NoStorage []) ty) - Nothing node] - _ -> astError node "anonymous member has a non-composite type" --- Named members -tMemberDecls (CDecl declspecs declrs node) = zipWithM tMemberDecl (True:repeat False) declrs - where - tMemberDecl handle_sue_def (Just member_declr,Nothing,bit_field_size_opt) = - -- TODO: use analyseVarDecl here, not analyseVarDecl' - do var_decl <- analyseVarDecl' handle_sue_def declspecs member_declr [] Nothing - let (VarDeclInfo name fun_spec storage_spec attrs ty _node_info) = var_decl - -- - checkValidMemberSpec fun_spec storage_spec - return $ MemberDecl (VarDecl name (DeclAttrs noFunctionAttrs NoStorage attrs) ty) - bit_field_size_opt node - tMemberDecl handle_sue_def (Nothing,Nothing,Just bit_field_size) = - do let (storage_specs, _attrs, typequals, typespecs, _funspecs, _alignspecs) = partitionDeclSpecs declspecs - -- TODO: funspecs/alignspecs not yet processed - _storage_spec <- canonicalStorageSpec storage_specs - -- TODO: storage_spec not used - canonTySpecs <- canonicalTypeSpec typespecs - typ <- tType handle_sue_def node typequals canonTySpecs [] [] - -- - return $ AnonBitField typ bit_field_size node - tMemberDecl _ _ = astError node "Bad member declaration" - checkValidMemberSpec fun_spec storage_spec = - do when (fun_spec /= noFunctionAttrs) $ astError node "member declaration with inline specifier" - when (storage_spec /= NoStorageSpec) $ astError node "storage specifier for member" - return () - -data StorageSpec = NoStorageSpec | AutoSpec | RegSpec | ThreadSpec | StaticSpec Bool | ExternSpec Bool - deriving (Eq,Ord,Show,Read) - -hasThreadLocalSpec :: StorageSpec -> Bool -hasThreadLocalSpec ThreadSpec = True -hasThreadLocalSpec (StaticSpec b) = b -hasThreadLocalSpec (ExternSpec b) = b -hasThreadLocalSpec _ = False - -data VarDeclInfo = VarDeclInfo VarName FunctionAttrs 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, funspecs, _alignspecs) = - partitionDeclSpecs declspecs - canonTySpecs <- canonicalTypeSpec type_specs - -- TODO: alignspecs not yet processed - analyseVarDecl handle_sue_def storage_specs attrs type_quals canonTySpecs funspecs - declr oldstyle init_opt - --- | analyse declarators -analyseVarDecl :: (MonadTrav m) => - Bool -> [CStorageSpec] -> [CAttr] -> [CTypeQual] -> - TypeSpecAnalysis -> [CFunSpec] -> - CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo -analyseVarDecl handle_sue_def storage_specs decl_attrs typequals canonTySpecs fun_specs - (CDeclr name_opt derived_declrs asmname_opt declr_attrs node) - oldstyle_params _init_opt - = do -- analyse the storage specifiers - storage_spec <- canonicalStorageSpec storage_specs - -- translate the type into semantic representation - typ <- tType handle_sue_def node typequals canonTySpecs derived_declrs oldstyle_params - -- translate attributes - attrs' <- mapM tAttr (decl_attrs ++ declr_attrs) - -- make name - name <- mkVarName node name_opt asmname_opt - return $ VarDeclInfo name function_spec storage_spec attrs' typ node - where - updateFunSpec (CInlineQual _) f = f { isInline = True } - updateFunSpec (CNoreturnQual _) f = f { isNoreturn = True } - function_spec = foldr updateFunSpec noFunctionAttrs fun_specs - --- return @True@ if the declarations is a type def -isTypeDef :: [CDeclSpec] -> Bool -isTypeDef declspecs = not $ null [ n | (CStorageSpec (CTypedef n)) <- declspecs ] - --- * translation - --- | get the type of a /type declaration/ --- --- A type declaration @T@ may appear in thre forms: --- --- * @typeof(T)@ --- --- * as abstract declarator in a function prototype, as in @f(int)@ --- --- * in a declaration without declarators, as in @struct x { int a } ;@ --- --- Currently, @analyseTypeDecl@ is exlusively used for analysing types for GNU's @typeof(T)@. --- --- We move attributes to the type, as they have no meaning for the abstract declarator -analyseTypeDecl :: (MonadTrav m) => CDecl -> m Type -analyseTypeDecl (CStaticAssert _ _ node) = - astError node "Expected type declaration, found static assert" -analyseTypeDecl (CDecl declspecs declrs node) - | [] <- declrs = analyseTyDeclr (emptyDeclr node) - | [(Just declr,Nothing,Nothing)] <- declrs = analyseTyDeclr declr - | otherwise = astError node "Bad declarator for type declaration" - where - analyseTyDeclr (CDeclr Nothing derived_declrs Nothing attrs _declrnode) - | (not (null storagespec) || not (null funspecs) || not (null alignspecs)) = - astError node "storage, function or alignment specifier for type declaration" - | 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, funspecs, alignspecs) = partitionDeclSpecs declspecs - analyseTyDeclr _ = astError node "Non-abstract declarator in type declaration" - - --- | translate a type -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 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 (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 - = do (quals,attrs) <- tTypeQuals arr_quals - arr_sz <- tArraySize size - return$ ArrayType inner_ty arr_sz quals attrs - -- We build functions in function prototype scope. - -- When analyzing the the function body, we push parameters in function body scope. - buildFunctionType params is_variadic attrs _node return_ty - = do enterPrototypeScope - params' <- mapM tParamDecl params - leavePrototypeScope - 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] -> TypeSpecAnalysis -> m Type -tDirectType handle_sue_def node ty_quals canonTySpec = do - (quals,attrs) <- tTypeQuals ty_quals - let baseType ty_name = DirectType ty_name quals attrs - case canonTySpec of - TSNone -> return$ baseType (TyIntegral TyInt) - TSVoid -> return$ baseType TyVoid - TSBool -> return$ baseType (TyIntegral TyBool) - TSNum tsnum -> do - numType <- tNumType tsnum - return . baseType $ - case numType of - 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 - TSType t -> mergeTypeAttributes node quals attrs t - TSNonBasic t -> astError node ("Unexpected typespec: " ++ show t) - --- | Merge type attributes --- --- This handles for example the form --- --- > /* tyqual attr typeof(type) */ --- > const typeof(char volatile) x; -mergeTypeAttributes :: (MonadCError m) => NodeInfo -> TypeQuals -> [Attr] -> Type -> m Type -mergeTypeAttributes node_info quals attrs typ = - case typ of - DirectType ty_name quals' attrs' -> merge quals' attrs' $ DirectType 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 fty attrs' - | quals /= noTypeQuals -> astError node_info "type qualifiers for function type" - | otherwise -> return$ FunctionType fty (attrs' ++ attrs) - TypeDefType tdr quals' attrs' - -> merge quals' attrs' $ TypeDefType tdr - where - merge quals' attrs' tyf = return $ tyf (mergeTypeQuals quals quals') (attrs' ++ attrs) - -typeDefRef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> m TypeDefRef -typeDefRef t_node name = lookupTypeDef name >>= \ty -> return (TypeDefRef name ty t_node) - --- extract a struct\/union --- we emit @declStructUnion@ and @defStructUnion@ actions --- --- TODO: should attributes be part of declarartions too ? -tCompTypeDecl :: (MonadTrav m) => Bool -> CStructUnion -> m CompTypeRef -tCompTypeDecl handle_def (CStruct tag ident_opt member_decls_opt attrs node_info) = do - -- create reference - sue_ref <- createSUERef node_info ident_opt - let tag' = tTag tag - attrs' <- mapM tAttr attrs - -- record tag name - let decl = CompTypeRef sue_ref tag' node_info - handleTagDecl (CompDecl decl) - -- when handle_def is true, enter the definition - when handle_def $ - maybeM member_decls_opt $ \decls -> - tCompType sue_ref tag' decls attrs' node_info - >>= (handleTagDef.CompDef) - return decl - -tTag :: CStructTag -> CompTyKind -tTag CStructTag = StructTag -tTag CUnionTag = UnionTag - -tCompType :: (MonadTrav m) => SUERef -> CompTyKind -> [CDecl] -> Attributes -> NodeInfo -> m CompType -tCompType tag sue_ref member_decls attrs node - = return (CompType tag sue_ref) `ap` - (concatMapM tMemberDecls member_decls) `ap` - (return attrs) `ap` - (return node) - --- | translate a enum type decl --- --- > enum my_enum --- > enum your_enum { x, y=3 } --- -tEnumTypeDecl :: (MonadTrav m) => Bool -> CEnum -> m EnumTypeRef -tEnumTypeDecl handle_def (CEnum ident_opt enumerators_opt attrs node_info) - | (Nothing, Nothing) <- (ident_opt, enumerators_opt) = astError node_info "both definition and name of enum missing" - | Just [] <- enumerators_opt = astError node_info "empty enumerator list" - | otherwise - = do sue_ref <- createSUERef node_info ident_opt - attrs' <- mapM tAttr attrs - let decl = EnumTypeRef sue_ref node_info - when handle_def $ - maybeM enumerators_opt $ \enumerators -> - tEnumType sue_ref enumerators attrs' node_info - >>= (handleTagDef . EnumDef) - return decl - --- | translate and analyse an enumeration type -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 - where - ty = EnumType sue_ref enumerators' attrs node - (_,enumerators') = mapAccumL nextEnumerator (Left 0) enumerators - nextEnumerator memo (ident,e) = - let (memo',expr) = nextEnrExpr memo e in - (memo', Enumerator ident expr ty (nodeInfo ident)) - nextEnrExpr :: Either Integer (Expr,Integer) -> Maybe CExpr -> (Either Integer (Expr,Integer), CExpr) - 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) 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 :: (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 - | Unsigned <- sgn -> intType TyUChar - | otherwise -> intType TyChar - (intbase, _, NoSizeMod) | optBase BaseInt intbase -> - intType$ case sgn of - Unsigned -> TyUInt - _ -> TyInt - (intbase, _, NoSizeMod) | optBase BaseInt128 intbase -> - intType$ case sgn of - Unsigned -> TyUInt128 - _ -> TyInt128 - (intbase, signed, sizemod) | optBase BaseInt intbase, optSign Signed signed -> - intType$ case sizemod of ShortMod -> TyShort - LongMod -> TyLong - LongLongMod -> TyLLong - _ -> internalErr "numTypeMapping: unexpected pattern matching error" - (intbase, Unsigned, sizemod) | optBase BaseInt intbase -> - intType$ case sizemod of ShortMod -> TyUShort - LongMod -> TyULong - LongLongMod -> TyULLong - _ -> internalErr "numTypeMapping: unexpected pattern matching error" - (BaseFloat, NoSignSpec, NoSizeMod) -> floatType TyFloat - (BaseDouble, NoSignSpec, NoSizeMod) -> floatType TyDouble - (BaseDouble, NoSignSpec, LongMod) -> floatType TyLDouble - (BaseFloat128, NoSignSpec, NoSizeMod) -> floatType TyFloat128 - -- TODO: error analysis - (_,_,_) -> error "Bad AST analysis" - where - optBase _ NoBaseType = True - optBase expect baseTy = expect == baseTy - optSign _ NoSignSpec = True - optSign expect sign = expect == sign - intType = return . Right - floatType ft = return (Left (ft,iscomplex)) - --- TODO: currently bogus -tArraySize :: (MonadTrav m) => CArrSize -> m ArraySize -tArraySize (CNoArrSize False) = return (UnknownArraySize False) -tArraySize (CNoArrSize True) = return (UnknownArraySize True) -tArraySize (CArrSize static szexpr) = liftM (ArraySize static) (return szexpr) - -tTypeQuals :: (MonadTrav m) => [CTypeQual] -> m (TypeQuals,Attributes) -tTypeQuals = foldrM go (noTypeQuals,[]) where - go (CConstQual _) (tq,attrs) = return (tq { constant = True },attrs) - go (CVolatQual _) (tq,attrs) = return (tq { volatile = True },attrs) - go (CRestrQual _) (tq,attrs) = return (tq { restrict = True },attrs) - go (CAtomicQual _) (tq,attrs) = return (tq { atomic = True },attrs) - go (CAttrQual attr) (tq,attrs) = liftM (\attr' -> (tq,attr':attrs)) (tAttr attr) - go (CNullableQual _) (tq,attrs) = return (tq { nullable = True }, attrs) - go (CNonnullQual _) (tq,attrs) = return (tq { nonnull = True }, attrs) - --- * analysis - - -{- -To canoicalize type specifiers, we define a canonical form: -void | bool | (char|int|int128|float|double|float128)? (signed|unsigned)? (long long?)? complex? | othertype --} -data NumBaseType = NoBaseType | BaseChar | BaseInt | BaseInt128 | BaseFloat | BaseFloat128 | BaseDouble deriving (Eq,Ord) -data SignSpec = NoSignSpec | Signed | Unsigned deriving (Eq,Ord) -data SizeMod = NoSizeMod | ShortMod | LongMod | LongLongMod deriving (Eq,Ord) -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 | - TSTypeDef TypeDefRef | TSType Type | TSNonBasic CTypeSpec - -canonicalTypeSpec :: (MonadTrav m) => [CTypeSpec] -> m TypeSpecAnalysis -canonicalTypeSpec = foldrM go TSNone where - getNTS TSNone = Just emptyNumTypeSpec - getNTS (TSNum nts) = Just nts - getNTS _ = Nothing - updLongMod NoSizeMod = Just LongMod - updLongMod LongMod = Just LongLongMod - updLongMod _ = Nothing - 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 - = return$ TSNum$ nts { base = BaseChar } - go (CIntType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa - = return$ TSNum$ nts { base = BaseInt } - go (CInt128Type _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa - = return$ TSNum$ nts { base = BaseInt128 } - go (CFloatType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa - = return$ TSNum$ nts { base = BaseFloat } - go (CFloat128Type _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa - = return$ TSNum$ nts { base = BaseFloat128 } - go (CDoubleType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa - = return$ TSNum$ nts { base = BaseDouble } - go (CShortType _) tsa | (Just nts@(NumTypeSpec { sizeMod = NoSizeMod })) <- getNTS tsa - = return$ TSNum$nts { sizeMod = ShortMod } - go (CLongType _) tsa | (Just nts@(NumTypeSpec { sizeMod = szMod })) <- getNTS tsa, - (Just szMod') <- updLongMod szMod - = return$ TSNum$ nts { sizeMod = szMod' } - go (CSignedType _) tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa - = return$ TSNum$ nts { signSpec = Signed } - go (CUnsigType _) tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa - = 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 - -- todo: atomic qualifier discarded - go (CAtomicType d _ni) TSNone = liftM TSType $ analyseTypeDecl d - go otherType TSNone = return$ TSNonBasic otherType - go ty _ts = astError (nodeInfo ty) "Invalid type specifier" - --- compute storage given storage specifiers -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 - updStorage (CThread _) NoStorageSpec = return ThreadSpec - updStorage (CThread _) (StaticSpec _) = return$ StaticSpec True - updStorage (CThread _) (ExternSpec _) = return$ ExternSpec True - updStorage (CStatic _) NoStorageSpec = return$ StaticSpec False - updStorage (CExtern _) NoStorageSpec = return$ ExternSpec False - updStorage (CStatic _) ThreadSpec = return$ StaticSpec True - updStorage (CExtern _) ThreadSpec = return$ ExternSpec True - updStorage badSpec old - = astError (nodeInfo badSpec) $ "Invalid storage specifier "++render (pretty badSpec)++" in combination with "++show old - elideAuto AutoSpec = NoStorageSpec - elideAuto spec = spec - --- | convert old style parameters --- --- This requires matching parameter names and declarations, as in the following example: --- --- > int f(d,c,a,b) --- > char a,*b; --- > int c; --- > { } --- --- is converted to --- --- > 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 :: (MonadCError m) => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr] -mergeOldStyle _node [] declrs = return declrs -mergeOldStyle node oldstyle_params (CFunDeclr params attrs fdnode : dds) = - case params of - Left list -> do - -- FIXME: This translation doesn't work in the following example - -- [| int f(b,a) struct x { }; int b,a; { struct x local; return local.x } |] - oldstyle_params' <- liftM concat $ mapM splitCDecl oldstyle_params - param_map <- liftM Map.fromList $ mapM attachNameOfDecl oldstyle_params' - (newstyle_params,param_map') <- foldrM insertParamDecl ([],param_map) list - unless (Map.null param_map') $ - astError node $ "declarations for parameter(s) "++ showParamMap param_map' ++" but no such parameter" - return (CFunDeclr (Right (newstyle_params, False)) attrs fdnode : dds) - Right _newstyle -> astError node "oldstyle parameter list, but newstyle function declaration" - where - attachNameOfDecl decl = nameOfDecl decl >>= \n -> return (n,decl) - insertParamDecl param_name (ps, param_map) - = case Map.lookup param_name param_map of - Just p -> return (p:ps, Map.delete param_name param_map) - Nothing -> return (implicitIntParam param_name : ps, param_map) - implicitIntParam param_name = - let nInfo = nodeInfo param_name in - CDecl [CTypeSpec (CIntType nInfo)] [(Just (CDeclr (Just param_name) [] Nothing [] nInfo),Nothing,Nothing)] nInfo - showParamMap = intercalate ", " . map identToString . Map.keys -mergeOldStyle node _ _ = astError node "oldstyle parameter list, but not function type" - --- | split a CDecl into declarators, hereby eliding SUE defs from the second declarator on. --- --- There are several reasons why this isn't the preferred way for handling multiple-declarator declarations, --- but it can be convinient some times. --- --- > splitCDecl [d| struct x { int z; } a,*b; |] --- > [ [d| struct x { int z; } a, struct x *b; |] ] --- --- /TODO/: This could be moved to syntax, as it operates on the AST only -splitCDecl :: (MonadCError m) => CDecl -> m [CDecl] -splitCDecl decl@(CStaticAssert _ _ _) = return [decl] -splitCDecl decl@(CDecl declspecs declrs node) = - case declrs of - [] -> internalErr "splitCDecl applied to empty declaration" - -- single declarator, not need to split - [_declr] -> return [decl] - -- more than one declarator - (d1:ds) -> - let declspecs' = map elideSUEDef declspecs in - return$ (CDecl declspecs [d1] node) : [ CDecl declspecs' [declr] node | declr <- ds ] - where - elideSUEDef declspec@(CTypeSpec tyspec) = - case tyspec of - (CEnumType (CEnum name _def _attrs enum_node) node_info) -> - CTypeSpec (CEnumType (CEnum name Nothing [] enum_node) node_info) - (CSUType (CStruct tag name _def _attrs su_node) node_info) -> - CTypeSpec (CSUType (CStruct tag name Nothing [] su_node) node_info) - _ -> declspec - elideSUEDef declspec = declspec - - --- | translate @__attribute__@ annotations --- TODO: This is a unwrap and wrap stub -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 :: (MonadCError m, MonadSymtab m) => - NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName -mkVarName _node Nothing _ = return NoName -mkVarName _node (Just n) asm = return $ VarName n asm - --- helpers -nameOfDecl :: (MonadCError m) => CDecl -> m Ident -nameOfDecl d = getOnlyDeclr d >>= \declr -> - case declr of - (CDeclr (Just name) _ _ _ _node) -> return name - (CDeclr Nothing _ _ _ _node) -> internalErr "nameOfDecl: abstract declarator" -emptyDeclr :: NodeInfo -> CDeclr -emptyDeclr node = CDeclr Nothing [] Nothing [] node -getOnlyDeclr :: (MonadCError m) => CDecl -> m CDeclr -getOnlyDeclr (CDecl _ [(Just declr,_,_)] _) = return declr -getOnlyDeclr (CDecl _ _ _node) = internalErr "getOnlyDeclr: declaration doesn't have a unique declarator" -getOnlyDeclr (CStaticAssert _ _ _) = internalErr "getOnlyDeclr: static assertion doesn't have a unique declarator" +{-# LANGUAGE PatternGuards, FlexibleContexts #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Analysis.DeclAnalysis+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : alpha+-- Portability : ghc+--+-- This module performs the analysis of declarations and the translation of+-- type specifications in the AST.+-----------------------------------------------------------------------------+module Language.C.Analysis.DeclAnalysis (+ -- * Translating types+ analyseTypeDecl,+ tType,tDirectType,tNumType,tArraySize,tTypeQuals,+ mergeOldStyle,+ -- * Dissecting type specs+ canonicalTypeSpec, NumBaseType(..),SignSpec(..),SizeMod(..),NumTypeSpec(..),TypeSpecAnalysis(..),+ canonicalStorageSpec, StorageSpec(..), hasThreadLocalSpec, isTypeDef,+ -- * Helpers+ VarDeclInfo(..),+ tAttr,mkVarName,getOnlyDeclr,nameOfDecl,analyseVarDecl,analyseVarDecl'+)+where+import Language.C.Data.Error+import Language.C.Data.Node+import Language.C.Data.Ident+import Language.C.Pretty+import Language.C.Syntax+import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..))+import Language.C.Analysis.DefTable (TagFwdDecl(..), insertType)+import Language.C.Analysis.SemError+import Language.C.Analysis.SemRep+import Language.C.Analysis.TravMonad++import Data.Foldable as F (foldrM)+import Control.Monad (liftM,when,ap,unless,zipWithM)+import Data.List (intercalate, mapAccumL)+import qualified Data.Map as Map+import Text.PrettyPrint.HughesPJ+++-- * handling declarations++-- | analyse and translate a parameter declaration+-- Should be called in either prototype or block scope+tParamDecl :: (MonadTrav m) => CDecl -> m ParamDecl+tParamDecl (CStaticAssert _ _ node) =+ astError node "expected parameter, not static assertion"+tParamDecl (CDecl declspecs declrs node) =+ do declr <- getParamDeclr+ -- analyse the variable declaration+ (VarDeclInfo name fun_spec storage_spec attrs ty declr_node) <- analyseVarDecl' True declspecs declr [] Nothing+ when (isInline fun_spec || isNoreturn fun_spec) $+ throwTravError (badSpecifierError node "parameter declaration with function 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+ -- XXX: we shouldn't modify the deftable here, just analyse and build representation+ return paramDecl+ where+ getParamDeclr =+ case declrs of+ [] -> return (emptyDeclr node)+ [(Just declr,Nothing,Nothing)] -> return declr+ _ -> astError node "bad parameter declaration: multiple decls / bitfield or initializer present"+ mkParamDecl name storage attrs ty declr_node =+ let vd = VarDecl name (DeclAttrs noFunctionAttrs storage attrs) ty in+ 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)+computeParamStorage _ RegSpec = Right (Auto True)+computeParamStorage node spec = Left . badSpecifierError node $ "Bad storage specified for parameter: " ++ show spec++-- | analyse and translate a member declaration+tMemberDecls :: (MonadTrav m) => CDecl -> m [MemberDecl]+-- Anonymous struct or union members+-- TODO storage specs, align specs and attributes are ignored+tMemberDecls (CStaticAssert _ _ node) =+ astError node "expected struct or union member, found static assertion"+tMemberDecls (CDecl declspecs [] node) =+ do let (_storage_specs, _attrs, typequals, typespecs, funspecs, _alignspecs) =+ partitionDeclSpecs declspecs+ unless (null funspecs) $ astError node "member declaration with function 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 noFunctionAttrs NoStorage []) ty)+ Nothing node]+ _ -> astError node "anonymous member has a non-composite type"+-- Named members+tMemberDecls (CDecl declspecs declrs node) = zipWithM tMemberDecl (True:repeat False) declrs+ where+ tMemberDecl handle_sue_def (Just member_declr,Nothing,bit_field_size_opt) =+ -- TODO: use analyseVarDecl here, not analyseVarDecl'+ do var_decl <- analyseVarDecl' handle_sue_def declspecs member_declr [] Nothing+ let (VarDeclInfo name fun_spec storage_spec attrs ty _node_info) = var_decl+ --+ checkValidMemberSpec fun_spec storage_spec+ return $ MemberDecl (VarDecl name (DeclAttrs noFunctionAttrs NoStorage attrs) ty)+ bit_field_size_opt node+ tMemberDecl handle_sue_def (Nothing,Nothing,Just bit_field_size) =+ do let (storage_specs, _attrs, typequals, typespecs, _funspecs, _alignspecs) = partitionDeclSpecs declspecs+ -- TODO: funspecs/alignspecs not yet processed+ _storage_spec <- canonicalStorageSpec storage_specs+ -- TODO: storage_spec not used+ canonTySpecs <- canonicalTypeSpec typespecs+ typ <- tType handle_sue_def node typequals canonTySpecs [] []+ --+ return $ AnonBitField typ bit_field_size node+ tMemberDecl _ _ = astError node "Bad member declaration"+ checkValidMemberSpec fun_spec storage_spec =+ do when (fun_spec /= noFunctionAttrs) $ astError node "member declaration with inline specifier"+ when (storage_spec /= NoStorageSpec) $ astError node "storage specifier for member"+ return ()++data StorageSpec = NoStorageSpec | AutoSpec | RegSpec | ThreadSpec | StaticSpec Bool | ExternSpec Bool+ deriving (Eq,Ord,Show,Read)++hasThreadLocalSpec :: StorageSpec -> Bool+hasThreadLocalSpec ThreadSpec = True+hasThreadLocalSpec (StaticSpec b) = b+hasThreadLocalSpec (ExternSpec b) = b+hasThreadLocalSpec _ = False++data VarDeclInfo = VarDeclInfo VarName FunctionAttrs 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, funspecs, _alignspecs) =+ partitionDeclSpecs declspecs+ canonTySpecs <- canonicalTypeSpec type_specs+ -- TODO: alignspecs not yet processed+ analyseVarDecl handle_sue_def storage_specs attrs type_quals canonTySpecs funspecs+ declr oldstyle init_opt++-- | analyse declarators+analyseVarDecl :: (MonadTrav m) =>+ Bool -> [CStorageSpec] -> [CAttr] -> [CTypeQual] ->+ TypeSpecAnalysis -> [CFunSpec] ->+ CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo+analyseVarDecl handle_sue_def storage_specs decl_attrs typequals canonTySpecs fun_specs+ (CDeclr name_opt derived_declrs asmname_opt declr_attrs node)+ oldstyle_params _init_opt+ = do -- analyse the storage specifiers+ storage_spec <- canonicalStorageSpec storage_specs+ -- translate the type into semantic representation+ typ <- tType handle_sue_def node typequals canonTySpecs derived_declrs oldstyle_params+ -- translate attributes+ attrs' <- mapM tAttr (decl_attrs ++ declr_attrs)+ -- make name+ name <- mkVarName node name_opt asmname_opt+ return $ VarDeclInfo name function_spec storage_spec attrs' typ node+ where+ updateFunSpec (CInlineQual _) f = f { isInline = True }+ updateFunSpec (CNoreturnQual _) f = f { isNoreturn = True }+ function_spec = foldr updateFunSpec noFunctionAttrs fun_specs++-- return @True@ if the declarations is a type def+isTypeDef :: [CDeclSpec] -> Bool+isTypeDef declspecs = not $ null [ n | (CStorageSpec (CTypedef n)) <- declspecs ]++-- * translation++-- | get the type of a /type declaration/+--+-- A type declaration @T@ may appear in thre forms:+--+-- * @typeof(T)@+--+-- * as abstract declarator in a function prototype, as in @f(int)@+--+-- * in a declaration without declarators, as in @struct x { int a } ;@+--+-- Currently, @analyseTypeDecl@ is exlusively used for analysing types for GNU's @typeof(T)@.+--+-- We move attributes to the type, as they have no meaning for the abstract declarator+analyseTypeDecl :: (MonadTrav m) => CDecl -> m Type+analyseTypeDecl (CStaticAssert _ _ node) =+ astError node "Expected type declaration, found static assert"+analyseTypeDecl (CDecl declspecs declrs node)+ | [] <- declrs = analyseTyDeclr (emptyDeclr node)+ | [(Just declr,Nothing,Nothing)] <- declrs = analyseTyDeclr declr+ | otherwise = astError node "Bad declarator for type declaration"+ where+ analyseTyDeclr (CDeclr Nothing derived_declrs Nothing attrs _declrnode)+ | (not (null storagespec) || not (null funspecs) || not (null alignspecs)) =+ astError node "storage, function or alignment specifier for type declaration"+ | 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, funspecs, alignspecs) = partitionDeclSpecs declspecs+ analyseTyDeclr _ = astError node "Non-abstract declarator in type declaration"+++-- | translate a type+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 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 (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+ = do (quals,attrs) <- tTypeQuals arr_quals+ arr_sz <- tArraySize size+ return$ ArrayType inner_ty arr_sz quals attrs+ -- We build functions in function prototype scope.+ -- When analyzing the the function body, we push parameters in function body scope.+ buildFunctionType params is_variadic attrs _node return_ty+ = do enterPrototypeScope+ params' <- mapM tParamDecl params+ leavePrototypeScope+ 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] -> TypeSpecAnalysis -> m Type+tDirectType handle_sue_def node ty_quals canonTySpec = do+ (quals,attrs) <- tTypeQuals ty_quals+ let baseType ty_name = DirectType ty_name quals attrs+ case canonTySpec of+ TSNone -> return$ baseType (TyIntegral TyInt)+ TSVoid -> return$ baseType TyVoid+ TSBool -> return$ baseType (TyIntegral TyBool)+ TSNum tsnum -> do+ numType <- tNumType tsnum+ return . baseType $+ case numType of+ 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+ TSType t -> mergeTypeAttributes node quals attrs t+ TSNonBasic t -> astError node ("Unexpected typespec: " ++ show t)++-- | Merge type attributes+--+-- This handles for example the form+--+-- > /* tyqual attr typeof(type) */+-- > const typeof(char volatile) x;+mergeTypeAttributes :: (MonadCError m) => NodeInfo -> TypeQuals -> [Attr] -> Type -> m Type+mergeTypeAttributes node_info quals attrs typ =+ case typ of+ DirectType ty_name quals' attrs' -> merge quals' attrs' $ DirectType 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 fty attrs'+ | quals /= noTypeQuals -> astError node_info "type qualifiers for function type"+ | otherwise -> return$ FunctionType fty (attrs' ++ attrs)+ TypeDefType tdr quals' attrs'+ -> merge quals' attrs' $ TypeDefType tdr+ where+ merge quals' attrs' tyf = return $ tyf (mergeTypeQuals quals quals') (attrs' ++ attrs)++typeDefRef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> m TypeDefRef+typeDefRef t_node name = lookupTypeDef name >>= \ty -> return (TypeDefRef name ty t_node)++-- extract a struct\/union+-- we emit @declStructUnion@ and @defStructUnion@ actions+--+-- TODO: should attributes be part of declarartions too ?+tCompTypeDecl :: (MonadTrav m) => Bool -> CStructUnion -> m CompTypeRef+tCompTypeDecl handle_def (CStruct tag ident_opt member_decls_opt attrs node_info) = do+ -- create reference+ sue_ref <- createSUERef node_info ident_opt+ let tag' = tTag tag+ attrs' <- mapM tAttr attrs+ -- record tag name+ let decl = CompTypeRef sue_ref tag' node_info+ handleTagDecl (CompDecl decl)+ -- when handle_def is true, enter the definition+ when handle_def $+ maybeM member_decls_opt $ \decls ->+ tCompType sue_ref tag' decls attrs' node_info+ >>= (handleTagDef.CompDef)+ return decl++tTag :: CStructTag -> CompTyKind+tTag CStructTag = StructTag+tTag CUnionTag = UnionTag++tCompType :: (MonadTrav m) => SUERef -> CompTyKind -> [CDecl] -> Attributes -> NodeInfo -> m CompType+tCompType tag sue_ref member_decls attrs node+ = return (CompType tag sue_ref) `ap`+ (concatMapM tMemberDecls member_decls) `ap`+ (return attrs) `ap`+ (return node)++-- | translate a enum type decl+--+-- > enum my_enum+-- > enum your_enum { x, y=3 }+--+tEnumTypeDecl :: (MonadTrav m) => Bool -> CEnum -> m EnumTypeRef+tEnumTypeDecl handle_def (CEnum ident_opt enumerators_opt attrs node_info)+ | (Nothing, Nothing) <- (ident_opt, enumerators_opt) = astError node_info "both definition and name of enum missing"+ | Just [] <- enumerators_opt = astError node_info "empty enumerator list"+ | otherwise+ = do sue_ref <- createSUERef node_info ident_opt+ attrs' <- mapM tAttr attrs+ let decl = EnumTypeRef sue_ref node_info+ when handle_def $+ maybeM enumerators_opt $ \enumerators ->+ tEnumType sue_ref enumerators attrs' node_info+ >>= (handleTagDef . EnumDef)+ return decl++-- | translate and analyse an enumeration type+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+ where+ ty = EnumType sue_ref enumerators' attrs node+ (_,enumerators') = mapAccumL nextEnumerator (Left 0) enumerators+ nextEnumerator memo (ident,e) =+ let (memo',expr) = nextEnrExpr memo e in+ (memo', Enumerator ident expr ty (nodeInfo ident))+ nextEnrExpr :: Either Integer (Expr,Integer) -> Maybe CExpr -> (Either Integer (Expr,Integer), CExpr)+ 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) 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 :: (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+ | Unsigned <- sgn -> intType TyUChar+ | otherwise -> intType TyChar+ (intbase, _, NoSizeMod) | optBase BaseInt intbase ->+ intType$ case sgn of+ Unsigned -> TyUInt+ _ -> TyInt+ (intbase, _, NoSizeMod) | optBase BaseInt128 intbase ->+ intType$ case sgn of+ Unsigned -> TyUInt128+ _ -> TyInt128+ (intbase, signed, sizemod) | optBase BaseInt intbase, optSign Signed signed ->+ intType$ case sizemod of ShortMod -> TyShort+ LongMod -> TyLong+ LongLongMod -> TyLLong+ _ -> internalErr "numTypeMapping: unexpected pattern matching error"+ (intbase, Unsigned, sizemod) | optBase BaseInt intbase ->+ intType$ case sizemod of ShortMod -> TyUShort+ LongMod -> TyULong+ LongLongMod -> TyULLong+ _ -> internalErr "numTypeMapping: unexpected pattern matching error"+ (BaseFloat, NoSignSpec, NoSizeMod) -> floatType TyFloat+ (BaseDouble, NoSignSpec, NoSizeMod) -> floatType TyDouble+ (BaseDouble, NoSignSpec, LongMod) -> floatType TyLDouble+ (BaseFloatN n x, NoSignSpec, NoSizeMod) -> floatType (TyFloatN n x)+ -- TODO: error analysis+ (_,_,_) -> error "Bad AST analysis"+ where+ optBase _ NoBaseType = True+ optBase expect baseTy = expect == baseTy+ optSign _ NoSignSpec = True+ optSign expect sign = expect == sign+ intType = return . Right+ floatType ft = return (Left (ft,iscomplex))++-- TODO: currently bogus+tArraySize :: (MonadTrav m) => CArrSize -> m ArraySize+tArraySize (CNoArrSize False) = return (UnknownArraySize False)+tArraySize (CNoArrSize True) = return (UnknownArraySize True)+tArraySize (CArrSize static szexpr) = liftM (ArraySize static) (return szexpr)++tTypeQuals :: (MonadTrav m) => [CTypeQual] -> m (TypeQuals,Attributes)+tTypeQuals = foldrM go (noTypeQuals,[]) where+ go (CConstQual _) (tq,attrs) = return (tq { constant = True },attrs)+ go (CVolatQual _) (tq,attrs) = return (tq { volatile = True },attrs)+ go (CRestrQual _) (tq,attrs) = return (tq { restrict = True },attrs)+ go (CAtomicQual _) (tq,attrs) = return (tq { atomic = True },attrs)+ go (CAttrQual attr) (tq,attrs) = liftM (\attr' -> (tq,attr':attrs)) (tAttr attr)+ go (CNullableQual _) (tq,attrs) = return (tq { nullable = True }, attrs)+ go (CNonnullQual _) (tq,attrs) = return (tq { nonnull = True }, attrs)++-- * analysis+++{-+To canoicalize type specifiers, we define a canonical form:+void | bool | (char|int|int128|float|double|floatNx)? (signed|unsigned)? (long long?)? complex? | othertype+-}+data NumBaseType = NoBaseType | BaseChar | BaseInt | BaseInt128 | BaseFloat |+ BaseFloatN Int Bool | BaseDouble deriving (Eq,Ord)+data SignSpec = NoSignSpec | Signed | Unsigned deriving (Eq,Ord)+data SizeMod = NoSizeMod | ShortMod | LongMod | LongLongMod deriving (Eq,Ord)+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 |+ TSTypeDef TypeDefRef | TSType Type | TSNonBasic CTypeSpec++canonicalTypeSpec :: (MonadTrav m) => [CTypeSpec] -> m TypeSpecAnalysis+canonicalTypeSpec = foldrM go TSNone where+ getNTS TSNone = Just emptyNumTypeSpec+ getNTS (TSNum nts) = Just nts+ getNTS _ = Nothing+ updLongMod NoSizeMod = Just LongMod+ updLongMod LongMod = Just LongLongMod+ updLongMod _ = Nothing+ 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+ = return$ TSNum$ nts { base = BaseChar }+ go (CIntType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa+ = return$ TSNum$ nts { base = BaseInt }+ go (CInt128Type _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa+ = return$ TSNum$ nts { base = BaseInt128 }+ go (CFloatType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa+ = return$ TSNum$ nts { base = BaseFloat }+ go (CFloatNType n x _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa+ = return$ TSNum$ nts { base = BaseFloatN n x }+ go (CDoubleType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa+ = return$ TSNum$ nts { base = BaseDouble }+ go (CShortType _) tsa | (Just nts@(NumTypeSpec { sizeMod = NoSizeMod })) <- getNTS tsa+ = return$ TSNum$nts { sizeMod = ShortMod }+ go (CLongType _) tsa | (Just nts@(NumTypeSpec { sizeMod = szMod })) <- getNTS tsa,+ (Just szMod') <- updLongMod szMod+ = return$ TSNum$ nts { sizeMod = szMod' }+ go (CSignedType _) tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa+ = return$ TSNum$ nts { signSpec = Signed }+ go (CUnsigType _) tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa+ = 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+ -- todo: atomic qualifier discarded+ go (CAtomicType d _ni) TSNone = liftM TSType $ analyseTypeDecl d+ go otherType TSNone = return$ TSNonBasic otherType+ go ty _ts = astError (nodeInfo ty) "Invalid type specifier"++-- compute storage given storage specifiers+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+ updStorage (CThread _) NoStorageSpec = return ThreadSpec+ updStorage (CThread _) (StaticSpec _) = return$ StaticSpec True+ updStorage (CThread _) (ExternSpec _) = return$ ExternSpec True+ updStorage (CStatic _) NoStorageSpec = return$ StaticSpec False+ updStorage (CExtern _) NoStorageSpec = return$ ExternSpec False+ updStorage (CStatic _) ThreadSpec = return$ StaticSpec True+ updStorage (CExtern _) ThreadSpec = return$ ExternSpec True+ updStorage badSpec old+ = astError (nodeInfo badSpec) $ "Invalid storage specifier "++render (pretty badSpec)++" in combination with "++show old+ elideAuto AutoSpec = NoStorageSpec+ elideAuto spec = spec++-- | convert old style parameters+--+-- This requires matching parameter names and declarations, as in the following example:+--+-- > int f(d,c,a,b)+-- > char a,*b;+-- > int c;+-- > { }+--+-- is converted to+--+-- > 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 :: (MonadCError m) => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr]+mergeOldStyle _node [] declrs = return declrs+mergeOldStyle node oldstyle_params (CFunDeclr params attrs fdnode : dds) =+ case params of+ Left list -> do+ -- FIXME: This translation doesn't work in the following example+ -- [| int f(b,a) struct x { }; int b,a; { struct x local; return local.x } |]+ oldstyle_params' <- liftM concat $ mapM splitCDecl oldstyle_params+ param_map <- liftM Map.fromList $ mapM attachNameOfDecl oldstyle_params'+ (newstyle_params,param_map') <- foldrM insertParamDecl ([],param_map) list+ unless (Map.null param_map') $+ astError node $ "declarations for parameter(s) "++ showParamMap param_map' ++" but no such parameter"+ return (CFunDeclr (Right (newstyle_params, False)) attrs fdnode : dds)+ Right _newstyle -> astError node "oldstyle parameter list, but newstyle function declaration"+ where+ attachNameOfDecl decl = nameOfDecl decl >>= \n -> return (n,decl)+ insertParamDecl param_name (ps, param_map)+ = case Map.lookup param_name param_map of+ Just p -> return (p:ps, Map.delete param_name param_map)+ Nothing -> return (implicitIntParam param_name : ps, param_map)+ implicitIntParam param_name =+ let nInfo = nodeInfo param_name in+ CDecl [CTypeSpec (CIntType nInfo)] [(Just (CDeclr (Just param_name) [] Nothing [] nInfo),Nothing,Nothing)] nInfo+ showParamMap = intercalate ", " . map identToString . Map.keys+mergeOldStyle node _ _ = astError node "oldstyle parameter list, but not function type"++-- | split a CDecl into declarators, hereby eliding SUE defs from the second declarator on.+--+-- There are several reasons why this isn't the preferred way for handling multiple-declarator declarations,+-- but it can be convinient some times.+--+-- > splitCDecl [d| struct x { int z; } a,*b; |]+-- > [ [d| struct x { int z; } a, struct x *b; |] ]+--+-- /TODO/: This could be moved to syntax, as it operates on the AST only+splitCDecl :: (MonadCError m) => CDecl -> m [CDecl]+splitCDecl decl@(CStaticAssert _ _ _) = return [decl]+splitCDecl decl@(CDecl declspecs declrs node) =+ case declrs of+ [] -> internalErr "splitCDecl applied to empty declaration"+ -- single declarator, not need to split+ [_declr] -> return [decl]+ -- more than one declarator+ (d1:ds) ->+ let declspecs' = map elideSUEDef declspecs in+ return$ (CDecl declspecs [d1] node) : [ CDecl declspecs' [declr] node | declr <- ds ]+ where+ elideSUEDef declspec@(CTypeSpec tyspec) =+ case tyspec of+ (CEnumType (CEnum name _def _attrs enum_node) node_info) ->+ CTypeSpec (CEnumType (CEnum name Nothing [] enum_node) node_info)+ (CSUType (CStruct tag name _def _attrs su_node) node_info) ->+ CTypeSpec (CSUType (CStruct tag name Nothing [] su_node) node_info)+ _ -> declspec+ elideSUEDef declspec = declspec+++-- | translate @__attribute__@ annotations+-- TODO: This is a unwrap and wrap stub+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 :: (MonadCError m, MonadSymtab m) =>+ NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName+mkVarName _node Nothing _ = return NoName+mkVarName _node (Just n) asm = return $ VarName n asm++-- helpers+nameOfDecl :: (MonadCError m) => CDecl -> m Ident+nameOfDecl d = getOnlyDeclr d >>= \declr ->+ case declr of+ (CDeclr (Just name) _ _ _ _node) -> return name+ (CDeclr Nothing _ _ _ _node) -> internalErr "nameOfDecl: abstract declarator"+emptyDeclr :: NodeInfo -> CDeclr+emptyDeclr node = CDeclr Nothing [] Nothing [] node+getOnlyDeclr :: (MonadCError m) => CDecl -> m CDeclr+getOnlyDeclr (CDecl _ [(Just declr,_,_)] _) = return declr+getOnlyDeclr (CDecl _ _ _node) = internalErr "getOnlyDeclr: declaration doesn't have a unique declarator"+getOnlyDeclr (CStaticAssert _ _ _) = internalErr "getOnlyDeclr: static assertion doesn't have a unique declarator"
src/Language/C/Analysis/DefTable.hs view
@@ -1,331 +1,331 @@-{-# LANGUAGE PatternGuards, DeriveDataTypeable #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Analysis.DefTable --- Copyright : (c) 2008 Benedikt Huber --- based on code from c2hs --- (c) [1999..2001] Manuel M. T. Chakravarty --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : alpha --- Portability : ghc --- --- This module manages symbols in local and global scopes. --- --- There are four different kind of identifiers: ordinary identifiers (henceforth --- simply called `identifier'), tag names (names of struct\/union\/enum types), --- labels and structure members. ------------------------------------------------------------------------------ -module Language.C.Analysis.DefTable ( - IdentEntry, identOfTyDecl, - TagEntry, TagFwdDecl(..), - 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 -import Language.C.Analysis.NameSpaceMap -import Language.C.Analysis.SemRep - -import qualified Data.Map as Map -import Data.IntMap (IntMap, union) -import qualified Data.IntMap as IntMap -import Data.Generics - -{- Name spaces, scopes and contexts [Scopes] - - In C, there are 4 categories of identifiers: - - * labels - * tag names (@(struct|union|enum) tag-name@), where /all/ tag names live in one namespace - * members of structures and unions - * ordinary identifiers, denoting objects, functions, typeDefs and enumeration constants - - There are 4 kind of scopes: - - * file scope: outside of parameter lists and blocks - * function prototype scope - * function scope: labels are visible within the entire function, and declared implicitely - * block scope - - While function scope is irrelevant for variable declarations, they might also appear in member declarations. - Therefore, there are also 4 kinds of contexts where a variable might be declared: - - * File Scope Context: external declaration \/ definition - * Block Scope Context: either external or local definition - * Function prototype scope context - * Member Declaration context - - See - <http://www.embedded.com/design/206901036> - C99 6 --} - --- | All ordinary identifiers map to 'IdenTyDecl': either a typedef or a object\/function\/enumerator -type IdentEntry = Either TypeDef IdentDecl - -identOfTyDecl :: IdentEntry -> Ident -identOfTyDecl = either identOfTypeDef declIdent - -data TagFwdDecl = CompDecl CompTypeRef - | EnumDecl EnumTypeRef -instance HasSUERef TagFwdDecl where - sueRef (CompDecl ctr) = sueRef ctr - sueRef (EnumDecl etr) = sueRef etr -instance CNode TagFwdDecl where - nodeInfo (CompDecl ctr) = nodeInfo ctr - nodeInfo (EnumDecl etr) = nodeInfo etr - --- | Tag names map to forward declarations or definitions of struct\/union\/enum types -type TagEntry = Either TagFwdDecl TagDef - --- | Table holding current definitions -data DefTable = DefTable - { - 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 - typeTable :: IntMap Type - } - --- | empty definition table, with all name space maps in global scope -emptyDefTable :: DefTable -emptyDefTable = DefTable nameSpaceMap nameSpaceMap nameSpaceMap nameSpaceMap IntMap.empty IntMap.empty - --- | get the globally defined entries of a definition table -globalDefs :: DefTable -> GlobalDecls -globalDefs deftbl = Map.foldWithKey insertDecl (GlobalDecls e gtags e) (globalNames $ identDecls deftbl) - where - e = Map.empty - (_fwd_decls,gtags) = Map.mapEither id $ globalNames (tagDecls deftbl) - 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 - -enterLocalScope :: DefTable -> DefTable -enterLocalScope deftbl = deftbl { - identDecls = enterNewScope (identDecls deftbl), - tagDecls = enterNewScope (tagDecls deftbl) - } -leaveLocalScope :: DefTable -> DefTable -leaveLocalScope deftbl = deftbl { - identDecls = leaveScope_ (identDecls deftbl), - tagDecls = leaveScope_ (tagDecls deftbl) - } - --- | Enter function scope (AND the corresponding block scope) -enterFunctionScope :: DefTable -> DefTable -enterFunctionScope deftbl = enterLocalScope $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) } - --- | Leave function scope, and return the associated DefTable. --- Error if not in function scope. -leaveFunctionScope :: DefTable -> DefTable -leaveFunctionScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) } - --- | Enter new block scope -enterBlockScope :: DefTable -> DefTable -enterBlockScope deftbl = enterLocalScope $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) } - --- | Leave innermost block scope -leaveBlockScope :: DefTable -> DefTable -leaveBlockScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) } - --- | Enter new member declaration scope -enterMemberDecl :: DefTable -> DefTable -enterMemberDecl deftbl = deftbl { memberDecls = enterNewScope (memberDecls deftbl) } - --- | Leave innermost member declaration scope -leaveMemberDecl :: DefTable -> ([MemberDecl], DefTable) -leaveMemberDecl deftbl = - let (decls',members) = leaveScope (memberDecls deftbl) - in (,) (map snd members) - (deftbl { memberDecls = decls' }) - --- * declarations - --- | Status of a declaration -data DeclarationStatus t = - NewDecl -- ^ new entry - | Redeclared t -- ^ old def was overwritten - | KeepDef t -- ^ new def was discarded - | Shadowed t -- ^ new def shadows one in outer scope - | KindMismatch t -- ^ kind mismatch - deriving (Data,Typeable) -declStatusDescr :: DeclarationStatus t -> String -declStatusDescr NewDecl = "new" -declStatusDescr (Redeclared _) = "redeclared" -declStatusDescr (KeepDef _) = "keep old" -declStatusDescr (Shadowed _) = "shadowed" -declStatusDescr (KindMismatch _) = "kind mismatch" - -compatIdentEntry :: IdentEntry -> IdentEntry -> Bool -compatIdentEntry (Left _tydef) = either (const True) (const False) -compatIdentEntry (Right def) = either (const False) $ - \other_def -> case (def,other_def) of - (EnumeratorDef _, EnumeratorDef _) -> True - (EnumeratorDef _, _) -> True - (_, EnumeratorDef _) -> True - (_,_) -> True - -data TagEntryKind = CompKind CompTyKind | EnumKind - deriving (Eq,Ord) -instance Show TagEntryKind where - show (CompKind ctk) = show ctk - show EnumKind = "enum" - --- | @sameTagKind ty1 ty2@ returns @True@ if @ty1,ty2@ are the same kind of tag (struct,union or enum) -tagKind :: TagEntry -> TagEntryKind -tagKind (Left (CompDecl cd)) = CompKind (compTag cd) -tagKind (Left (EnumDecl _)) = EnumKind -tagKind (Right (CompDef cd)) = CompKind (compTag cd) -tagKind (Right (EnumDef _)) = EnumKind - -compatTagEntry :: TagEntry -> TagEntry -> Bool -compatTagEntry te1 te2 = tagKind te1 == tagKind te2 - -defRedeclStatus :: (t -> t -> Bool) -> t -> Maybe t -> DeclarationStatus t -defRedeclStatus sameKind def oldDecl = - case oldDecl of - 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 = - case defRedeclStatus sameKind def oldDecl of - NewDecl -> case lookupName nsm ident of - Just shadowed -> Shadowed shadowed - Nothing -> NewDecl - redecl -> redecl - -defineTypeDef :: Ident -> TypeDef -> DefTable -> (DeclarationStatus IdentEntry, DefTable) -defineTypeDef ident tydef deftbl = - (defRedeclStatus compatIdentEntry (Left tydef) oldDecl, deftbl { identDecls = decls' }) - where - (decls', oldDecl) = defLocal (identDecls deftbl) ident (Left tydef) - --- | declare\/define a global object\/function\/typeDef --- --- returns @Redeclared def@ if there is already an object\/function\/typeDef --- in global scope, or @DifferentKindRedec def@ if the old declaration is of a different kind. -defineGlobalIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable) -defineGlobalIdent ident def deftbl = - (defRedeclStatus compatIdentEntry (Right def) oldDecl, deftbl { identDecls = decls' }) - where - (decls',oldDecl) = defGlobal (identDecls deftbl) ident (Right def) --- | declare\/define a object\/function\/typeDef with lexical scope --- --- returns @Redeclared def@ or @DifferentKindRedec def@ if there is already an object\/function\/typeDef --- in the same scope. -defineScopedIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable) -defineScopedIdent = defineScopedIdentWhen (const True) - --- | declare\/define a object\/function\/typeDef with lexical scope, if the given predicate holds on the old --- entry. --- --- returns @Keep old_def@ if the old definition shouldn't be overwritten, and otherwise @Redeclared def@ or --- @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 - = (redecl_status, deftbl { identDecls = decls' }) - where - new_def = Right def - old_decls = identDecls deftbl - old_decl_opt = lookupInnermostScope old_decls ident - (decls',redecl_status) | (Just old_decl) <- old_decl_opt, not (old_decl `compatIdentEntry` new_def) - = (new_decls, KindMismatch old_decl) - | maybe True doOverride old_decl_opt - = (new_decls, redeclStatus' old_decl_opt) - | otherwise - = (old_decls, maybe NewDecl KeepDef old_decl_opt) - new_decls = fst (defLocal old_decls ident new_def) - doOverride (Left _) = False - doOverride (Right old_def) = override_def old_def - redeclStatus' overriden_decl = defRedeclStatusLocal compatIdentEntry ident new_def overriden_decl old_decls - --- | declare a tag (fwd decl in case the struct name isn't defined yet) -declareTag :: SUERef -> TagFwdDecl -> DefTable -> (DeclarationStatus TagEntry, DefTable) -declareTag sueref decl deftbl = - case lookupTag sueref deftbl of - Nothing -> (NewDecl, deftbl { tagDecls = fst $ defLocal (tagDecls deftbl) sueref (Left decl) }) - Just old_def | tagKind old_def == tagKind (Left decl) -> (KeepDef old_def, deftbl) - | otherwise -> (KindMismatch old_def, deftbl) - --- | define a tag -defineTag :: SUERef -> TagDef -> DefTable -> (DeclarationStatus TagEntry, DefTable) -defineTag sueref def deftbl = - (redeclStatus, deftbl { tagDecls = decls'}) - where - (decls',olddecl) = defLocal (tagDecls deftbl) sueref (Right def) - redeclStatus = - case olddecl of - Just fwd_decl@(Left _) | tagKind fwd_decl == tagKind (Right def) -> NewDecl -- should be NewDef - | otherwise -> KindMismatch fwd_decl - _ -> defRedeclStatusLocal compatTagEntry sueref (Right def) olddecl (tagDecls deftbl) - --- | define a label --- Return the old label if it is already defined in this function's scope -defineLabel :: Ident -> DefTable -> (DeclarationStatus Ident, DefTable) -defineLabel ident deftbl = - let (labels',old_label) = defLocal (labelDefs deftbl) ident ident - in (maybe NewDecl Redeclared old_label, deftbl { labelDefs = labels' }) - --- | lookup identifier (object, function, typeDef, enumerator) -lookupIdent :: Ident -> DefTable -> Maybe IdentEntry -lookupIdent ident deftbl = lookupName (identDecls deftbl) ident - --- | lookup tag -lookupTag :: SUERef -> DefTable -> Maybe TagEntry -lookupTag sue_ref deftbl = lookupName (tagDecls deftbl) sue_ref - --- | lookup label -lookupLabel :: Ident -> DefTable -> Maybe Ident -lookupLabel ident deftbl = lookupName (labelDefs deftbl) ident - --- | lookup an object in the innermost scope -lookupIdentInner :: Ident -> DefTable -> Maybe IdentEntry -lookupIdentInner ident deftbl = lookupInnermostScope (identDecls deftbl) ident - --- | 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) - +{-# LANGUAGE PatternGuards, DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Analysis.DefTable+-- Copyright : (c) 2008 Benedikt Huber+-- based on code from c2hs+-- (c) [1999..2001] Manuel M. T. Chakravarty+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : alpha+-- Portability : ghc+--+-- This module manages symbols in local and global scopes.+--+-- There are four different kind of identifiers: ordinary identifiers (henceforth+-- simply called `identifier'), tag names (names of struct\/union\/enum types),+-- labels and structure members.+-----------------------------------------------------------------------------+module Language.C.Analysis.DefTable (+ IdentEntry, identOfTyDecl,+ TagEntry, TagFwdDecl(..),+ 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+import Language.C.Analysis.NameSpaceMap+import Language.C.Analysis.SemRep++import qualified Data.Map as Map+import Data.IntMap (IntMap, union)+import qualified Data.IntMap as IntMap+import Data.Generics++{- Name spaces, scopes and contexts [Scopes]++ In C, there are 4 categories of identifiers:++ * labels+ * tag names (@(struct|union|enum) tag-name@), where /all/ tag names live in one namespace+ * members of structures and unions+ * ordinary identifiers, denoting objects, functions, typeDefs and enumeration constants++ There are 4 kind of scopes:++ * file scope: outside of parameter lists and blocks+ * function prototype scope+ * function scope: labels are visible within the entire function, and declared implicitely+ * block scope++ While function scope is irrelevant for variable declarations, they might also appear in member declarations.+ Therefore, there are also 4 kinds of contexts where a variable might be declared:++ * File Scope Context: external declaration \/ definition+ * Block Scope Context: either external or local definition+ * Function prototype scope context+ * Member Declaration context++ See+ <http://www.embedded.com/design/206901036>+ C99 6+-}++-- | All ordinary identifiers map to 'IdenTyDecl': either a typedef or a object\/function\/enumerator+type IdentEntry = Either TypeDef IdentDecl++identOfTyDecl :: IdentEntry -> Ident+identOfTyDecl = either identOfTypeDef declIdent++data TagFwdDecl = CompDecl CompTypeRef+ | EnumDecl EnumTypeRef+instance HasSUERef TagFwdDecl where+ sueRef (CompDecl ctr) = sueRef ctr+ sueRef (EnumDecl etr) = sueRef etr+instance CNode TagFwdDecl where+ nodeInfo (CompDecl ctr) = nodeInfo ctr+ nodeInfo (EnumDecl etr) = nodeInfo etr++-- | Tag names map to forward declarations or definitions of struct\/union\/enum types+type TagEntry = Either TagFwdDecl TagDef++-- | Table holding current definitions+data DefTable = DefTable+ {+ 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+ typeTable :: IntMap Type+ }++-- | empty definition table, with all name space maps in global scope+emptyDefTable :: DefTable+emptyDefTable = DefTable nameSpaceMap nameSpaceMap nameSpaceMap nameSpaceMap IntMap.empty IntMap.empty++-- | get the globally defined entries of a definition table+globalDefs :: DefTable -> GlobalDecls+globalDefs deftbl = Map.foldWithKey insertDecl (GlobalDecls e gtags e) (globalNames $ identDecls deftbl)+ where+ e = Map.empty+ (_fwd_decls,gtags) = Map.mapEither id $ globalNames (tagDecls deftbl)+ 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++enterLocalScope :: DefTable -> DefTable+enterLocalScope deftbl = deftbl {+ identDecls = enterNewScope (identDecls deftbl),+ tagDecls = enterNewScope (tagDecls deftbl)+ }+leaveLocalScope :: DefTable -> DefTable+leaveLocalScope deftbl = deftbl {+ identDecls = leaveScope_ (identDecls deftbl),+ tagDecls = leaveScope_ (tagDecls deftbl)+ }++-- | Enter function scope (AND the corresponding block scope)+enterFunctionScope :: DefTable -> DefTable+enterFunctionScope deftbl = enterLocalScope $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) }++-- | Leave function scope, and return the associated DefTable.+-- Error if not in function scope.+leaveFunctionScope :: DefTable -> DefTable+leaveFunctionScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) }++-- | Enter new block scope+enterBlockScope :: DefTable -> DefTable+enterBlockScope deftbl = enterLocalScope $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) }++-- | Leave innermost block scope+leaveBlockScope :: DefTable -> DefTable+leaveBlockScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) }++-- | Enter new member declaration scope+enterMemberDecl :: DefTable -> DefTable+enterMemberDecl deftbl = deftbl { memberDecls = enterNewScope (memberDecls deftbl) }++-- | Leave innermost member declaration scope+leaveMemberDecl :: DefTable -> ([MemberDecl], DefTable)+leaveMemberDecl deftbl =+ let (decls',members) = leaveScope (memberDecls deftbl)+ in (,) (map snd members)+ (deftbl { memberDecls = decls' })++-- * declarations++-- | Status of a declaration+data DeclarationStatus t =+ NewDecl -- ^ new entry+ | Redeclared t -- ^ old def was overwritten+ | KeepDef t -- ^ new def was discarded+ | Shadowed t -- ^ new def shadows one in outer scope+ | KindMismatch t -- ^ kind mismatch+ deriving (Data,Typeable)+declStatusDescr :: DeclarationStatus t -> String+declStatusDescr NewDecl = "new"+declStatusDescr (Redeclared _) = "redeclared"+declStatusDescr (KeepDef _) = "keep old"+declStatusDescr (Shadowed _) = "shadowed"+declStatusDescr (KindMismatch _) = "kind mismatch"++compatIdentEntry :: IdentEntry -> IdentEntry -> Bool+compatIdentEntry (Left _tydef) = either (const True) (const False)+compatIdentEntry (Right def) = either (const False) $+ \other_def -> case (def,other_def) of+ (EnumeratorDef _, EnumeratorDef _) -> True+ (EnumeratorDef _, _) -> True+ (_, EnumeratorDef _) -> True+ (_,_) -> True++data TagEntryKind = CompKind CompTyKind | EnumKind+ deriving (Eq,Ord)+instance Show TagEntryKind where+ show (CompKind ctk) = show ctk+ show EnumKind = "enum"++-- | @sameTagKind ty1 ty2@ returns @True@ if @ty1,ty2@ are the same kind of tag (struct,union or enum)+tagKind :: TagEntry -> TagEntryKind+tagKind (Left (CompDecl cd)) = CompKind (compTag cd)+tagKind (Left (EnumDecl _)) = EnumKind+tagKind (Right (CompDef cd)) = CompKind (compTag cd)+tagKind (Right (EnumDef _)) = EnumKind++compatTagEntry :: TagEntry -> TagEntry -> Bool+compatTagEntry te1 te2 = tagKind te1 == tagKind te2++defRedeclStatus :: (t -> t -> Bool) -> t -> Maybe t -> DeclarationStatus t+defRedeclStatus sameKind def oldDecl =+ case oldDecl of+ 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 =+ case defRedeclStatus sameKind def oldDecl of+ NewDecl -> case lookupName nsm ident of+ Just shadowed -> Shadowed shadowed+ Nothing -> NewDecl+ redecl -> redecl++defineTypeDef :: Ident -> TypeDef -> DefTable -> (DeclarationStatus IdentEntry, DefTable)+defineTypeDef ident tydef deftbl =+ (defRedeclStatus compatIdentEntry (Left tydef) oldDecl, deftbl { identDecls = decls' })+ where+ (decls', oldDecl) = defLocal (identDecls deftbl) ident (Left tydef)++-- | declare\/define a global object\/function\/typeDef+--+-- returns @Redeclared def@ if there is already an object\/function\/typeDef+-- in global scope, or @DifferentKindRedec def@ if the old declaration is of a different kind.+defineGlobalIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)+defineGlobalIdent ident def deftbl =+ (defRedeclStatus compatIdentEntry (Right def) oldDecl, deftbl { identDecls = decls' })+ where+ (decls',oldDecl) = defGlobal (identDecls deftbl) ident (Right def)+-- | declare\/define a object\/function\/typeDef with lexical scope+--+-- returns @Redeclared def@ or @DifferentKindRedec def@ if there is already an object\/function\/typeDef+-- in the same scope.+defineScopedIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)+defineScopedIdent = defineScopedIdentWhen (const True)++-- | declare\/define a object\/function\/typeDef with lexical scope, if the given predicate holds on the old+-- entry.+--+-- returns @Keep old_def@ if the old definition shouldn't be overwritten, and otherwise @Redeclared def@ or+-- @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+ = (redecl_status, deftbl { identDecls = decls' })+ where+ new_def = Right def+ old_decls = identDecls deftbl+ old_decl_opt = lookupInnermostScope old_decls ident+ (decls',redecl_status) | (Just old_decl) <- old_decl_opt, not (old_decl `compatIdentEntry` new_def)+ = (new_decls, KindMismatch old_decl)+ | maybe True doOverride old_decl_opt+ = (new_decls, redeclStatus' old_decl_opt)+ | otherwise+ = (old_decls, maybe NewDecl KeepDef old_decl_opt)+ new_decls = fst (defLocal old_decls ident new_def)+ doOverride (Left _) = False+ doOverride (Right old_def) = override_def old_def+ redeclStatus' overriden_decl = defRedeclStatusLocal compatIdentEntry ident new_def overriden_decl old_decls++-- | declare a tag (fwd decl in case the struct name isn't defined yet)+declareTag :: SUERef -> TagFwdDecl -> DefTable -> (DeclarationStatus TagEntry, DefTable)+declareTag sueref decl deftbl =+ case lookupTag sueref deftbl of+ Nothing -> (NewDecl, deftbl { tagDecls = fst $ defLocal (tagDecls deftbl) sueref (Left decl) })+ Just old_def | tagKind old_def == tagKind (Left decl) -> (KeepDef old_def, deftbl)+ | otherwise -> (KindMismatch old_def, deftbl)++-- | define a tag+defineTag :: SUERef -> TagDef -> DefTable -> (DeclarationStatus TagEntry, DefTable)+defineTag sueref def deftbl =+ (redeclStatus, deftbl { tagDecls = decls'})+ where+ (decls',olddecl) = defLocal (tagDecls deftbl) sueref (Right def)+ redeclStatus =+ case olddecl of+ Just fwd_decl@(Left _) | tagKind fwd_decl == tagKind (Right def) -> NewDecl -- should be NewDef+ | otherwise -> KindMismatch fwd_decl+ _ -> defRedeclStatusLocal compatTagEntry sueref (Right def) olddecl (tagDecls deftbl)++-- | define a label+-- Return the old label if it is already defined in this function's scope+defineLabel :: Ident -> DefTable -> (DeclarationStatus Ident, DefTable)+defineLabel ident deftbl =+ let (labels',old_label) = defLocal (labelDefs deftbl) ident ident+ in (maybe NewDecl Redeclared old_label, deftbl { labelDefs = labels' })++-- | lookup identifier (object, function, typeDef, enumerator)+lookupIdent :: Ident -> DefTable -> Maybe IdentEntry+lookupIdent ident deftbl = lookupName (identDecls deftbl) ident++-- | lookup tag+lookupTag :: SUERef -> DefTable -> Maybe TagEntry+lookupTag sue_ref deftbl = lookupName (tagDecls deftbl) sue_ref++-- | lookup label+lookupLabel :: Ident -> DefTable -> Maybe Ident+lookupLabel ident deftbl = lookupName (labelDefs deftbl) ident++-- | lookup an object in the innermost scope+lookupIdentInner :: Ident -> DefTable -> Maybe IdentEntry+lookupIdentInner ident deftbl = lookupInnermostScope (identDecls deftbl) ident++-- | 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
@@ -1,233 +1,285 @@------------------------------------------------------------------------------ --- | --- Module : Language.C.Analysis.Export --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : prototype --- Portability : ghc --- --- /WARNING/ : This is just an implementation sketch and not very well tested. --- --- Export 'SemRep' entities to 'AST' nodes. ------------------------------------------------------------------------------ -module Language.C.Analysis.Export ( -exportDeclr, -exportType, exportTypeDecl, exportTypeSpec, -exportTypeDef, -exportCompType, exportCompTypeDecl, exportCompTypeRef, -exportEnumType, exportEnumTypeDecl, exportEnumTypeRef, -) -where -import Language.C.Data.Ident -import Language.C.Data.Name (nameId) -import Language.C.Data.Node -import Language.C.Syntax.AST -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) - where - (specs,derived) = exportType ty - (ident,asmname) = case name of (VarName vident asmname_opt) -> (Just vident, asmname_opt) - _ -> (Nothing,Nothing) - -exportTypeDecl :: Type -> CDecl -exportTypeDecl ty = - CDecl declspecs declrs ni - where - (declspecs,derived) = exportType ty - declrs | null derived = [] - | otherwise = [(Just $ CDeclr Nothing derived Nothing [] ni,Nothing,Nothing)] - -exportTypeDef :: TypeDef -> CDecl -exportTypeDef (TypeDef ident ty attrs node_info) = - CDecl (CStorageSpec (CTypedef ni) : declspecs) [declr] node_info - where - (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) = - 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)] - where - select (predicate,tyqual) | predicate quals = Just tyqual - | otherwise = Nothing - -exportTypeQualsAttrs :: TypeQuals -> Attributes -> [CTypeQual] -exportTypeQualsAttrs tyqs attrs = (exportTypeQuals tyqs ++ map CAttrQual (exportAttrs attrs)) - -exportArraySize :: ArraySize -> CArrSize -exportArraySize (ArraySize static e) = CArrSize static e -exportArraySize (UnknownArraySize complete) = CNoArrSize complete - -exportTypeSpec :: TypeName -> [CTypeSpec] -exportTypeSpec tyname = - case tyname of - TyVoid -> [CVoidType ni] - TyIntegral ity -> exportIntType ity - TyFloating fty -> exportFloatType fty - TyComplex fty -> exportComplexType fty - 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 = - case ty of - TyBool -> [CBoolType ni] - TyChar -> [CCharType ni] - TySChar -> [CSignedType ni,CCharType ni] - TyUChar -> [CUnsigType ni,CCharType ni] - TyShort -> [CShortType ni] - TyUShort -> [CUnsigType ni, CShortType ni] - TyInt -> [CIntType ni] - TyUInt -> [CUnsigType ni, CIntType ni] - TyInt128 -> [CInt128Type ni] - TyUInt128 -> [CUnsigType ni, CInt128Type ni] - TyLong -> [CLongType ni] - TyULong -> [CUnsigType ni,CLongType ni] - TyLLong -> [CLongType ni, CLongType ni] - TyULLong -> [CUnsigType ni, CLongType ni, CLongType ni] - -exportFloatType :: FloatType -> [CTypeSpec] -exportFloatType ty = - case ty of - TyFloat -> [CFloatType ni] - TyDouble -> [CDoubleType ni] - TyLDouble -> [CLongType ni, CDoubleType ni] - TyFloat128 -> [CFloat128Type ni] - -exportComplexType :: FloatType -> [CTypeSpec] -exportComplexType ty = (CComplexType ni) : exportFloatType ty - -exportCompTypeDecl :: CompTypeRef -> [CTypeSpec] -exportCompTypeDecl ty = [CSUType (exportComp ty) ni] - where - exportComp (CompTypeRef sue_ref comp_tag _n) = - CStruct (if comp_tag == StructTag then CStructTag else CUnionTag) - (exportSUERef sue_ref) Nothing [] ni - -exportEnumTypeDecl :: EnumTypeRef -> [CTypeSpec] -exportEnumTypeDecl ty = [CEnumType (exportEnum ty) ni] - where - exportEnum (EnumTypeRef sue_ref _n) = - CEnum (exportSUERef sue_ref) Nothing [] ni - -exportCompType :: CompType -> [CTypeSpec] -exportCompType (CompType sue_ref comp_tag members attrs node_info) = [CSUType comp ni] - where - comp = CStruct (if comp_tag == StructTag then CStructTag else CUnionTag) - (exportSUERef sue_ref) - (Just (map exportMemberDecl members)) - (exportAttrs attrs) - node_info -exportCompTypeRef :: CompType -> [CTypeSpec] -exportCompTypeRef (CompType sue_ref com_tag _ _ node_info) = exportCompTypeDecl (CompTypeRef sue_ref com_tag node_info) - -exportEnumType :: EnumType -> [CTypeSpec] -exportEnumType (EnumType sue_ref enumerators attrs node_info) = [CEnumType enum ni] - where - enum = CEnum (exportSUERef sue_ref) - (Just (map exportEnumerator enumerators)) - (exportAttrs attrs) - node_info - exportEnumerator (Enumerator ident val _ty _) = (ident,Just val) - -exportEnumTypeRef :: EnumType -> [CTypeSpec] -exportEnumTypeRef (EnumType sue_ref _ _ node_info) = exportEnumTypeDecl (EnumTypeRef sue_ref node_info) - --- XXX: relies on a the source program not having any $'s in it -exportSUERef :: SUERef -> Maybe Ident -exportSUERef (AnonymousRef name) = Just (internalIdent $ "$" ++ show (nameId name)) -exportSUERef (NamedRef ident) = Just ident - -exportMemberDecl :: MemberDecl -> CDecl -exportMemberDecl (AnonBitField ty expr node_info) = - CDecl (map CTypeSpec $ exportTypeSpec $ fromDirectType ty) [(Nothing,Nothing,Just expr)] node_info -exportMemberDecl (MemberDecl vardecl bitfieldsz node_info) = - let (specs,declarator) = exportVarDecl vardecl - in CDecl specs [(Just declarator, Nothing, bitfieldsz)] node_info -exportVarDecl :: VarDecl -> ([CDeclSpec],CDeclr) - --- NOTE: that there is an ambiguity between two possible places for __attributes__ s here -exportVarDecl (VarDecl name attrs ty) = exportDeclr (exportDeclAttrs attrs) ty [] name -exportParamDecl :: ParamDecl -> CDecl -exportParamDecl paramdecl = - let (specs,declr) = exportVarDecl (getVarDecl paramdecl) - in CDecl specs [(Just declr, Nothing , Nothing) ] (nodeInfo paramdecl) - -exportDeclAttrs :: DeclAttrs -> [CDeclSpec] -exportDeclAttrs (DeclAttrs fun_attrs storage attrs) = - map CFunSpec (exportFunAttrs fun_attrs) - ++ map CStorageSpec (exportStorage storage) - ++ map (CTypeQual . CAttrQual) (exportAttrs attrs) - --- | export function attributes to C function specifiers -exportFunAttrs :: FunctionAttrs -> [CFunSpec] -exportFunAttrs fattrs = catMaybes [inlQual, noretQual] - where - inlQual = if isInline fattrs then Just (CInlineQual ni) else Nothing - noretQual = if isNoreturn fattrs then Just (CNoreturnQual ni) else Nothing - --- | express storage in terms of storage specifiers. --- --- This isn't always possible and depends on the context the identifier is declared. --- Most importantly, if there is a /conflicting/ declaration in scope, export is impossible. --- Furthermore, automatic storage is impossible in file scope. --- If the storage can actually be specified, the export is correct. -exportStorage :: Storage -> [CStorageSpec] -exportStorage NoStorage = [] -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 (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 -threadLocal True = ((CThread ni) :) - -exportAttrs :: [Attr] -> [CAttr] -exportAttrs = map exportAttr where - exportAttr (Attr ident es n) = CAttr ident es n - -fromDirectType :: Type -> TypeName -fromDirectType (DirectType ty _ _) = ty -fromDirectType (TypeDefType (TypeDefRef _ ty _) _ _) = fromDirectType ty -fromDirectType _ = error "fromDirectType" - -ni :: NodeInfo -ni = undefNode +-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Analysis.Export+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : prototype+-- Portability : ghc+--+-- /WARNING/ : This is just an implementation sketch and not very well tested.+--+-- Export 'SemRep' entities to 'AST' nodes.+-----------------------------------------------------------------------------+module Language.C.Analysis.Export (+exportDeclr,+exportType, exportTypeDecl, exportTypeSpec,+exportTypeDef,+exportCompType, exportCompTypeDecl, exportCompTypeRef,+exportEnumType, exportEnumTypeDecl, exportEnumTypeRef,+export,+)+where+import Data.Functor ((<$>))+import Data.List+import qualified Data.Map as Map+import Data.Maybe+import Language.C.Analysis.SemRep+import Language.C.Data.Ident+import Language.C.Data.Name (nameId)+import Language.C.Data.Node+import Language.C.Syntax.AST+++-- | Export global declarations+-- TODO: This does not export tags and type defs yet+export :: GlobalDecls -> CTranslUnit+export (GlobalDecls objs tags typedefs) = CTranslUnit (declarations ++ []) undefNode+ where declarations = fmap exportIdentDecl (filterBuiltins $ Map.toList objs)+ filterBuiltins = Prelude.filter noBuiltIns+ noBuiltIns (idn, _) = let n = identToString idn+ in not ("__builtin" `isPrefixOf` n) &&+ (n /= "__FUNCTION__") &&+ (n /= "__PRETTY_FUNCTION__") &&+ (n /= "__func__" )+++exportIdentDecl :: (Ident, IdentDecl) -> CExternalDeclaration NodeInfo+exportIdentDecl (_, Declaration decl) = CDeclExt $ exportDeclaration decl+exportIdentDecl (_, FunctionDef fundef) = CFDefExt $ exportFunDef fundef+exportIdentDecl (_, ObjectDef objdef) = CDeclExt $ exportObject objdef+exportIdentDecl (_, EnumeratorDef _) = error "not implemented: enumerator definition"++exportObject :: ObjDef -> CDeclaration NodeInfo+exportObject d@(ObjDef _ mInit nInf) = CDecl specs' [(Just decl, mInit, Nothing)] nInf+ where+ (DeclAttrs _ _ attrs) = declAttrs d+ specs = exportDeclarationSpecifiers (declAttrs d)+ (specs', decl) = exportDeclr specs (declType d) attrs (declName d)+++exportDeclaration :: Decl -> CDeclaration NodeInfo+exportDeclaration d = CDecl specs' [(Just decl, Nothing, Nothing)] undefNode+ where+ (DeclAttrs _ _ attrs) = declAttrs d+ specs = exportDeclarationSpecifiers (declAttrs d)+ (specs', decl) = exportDeclr specs (declType d) attrs (declName d)+++exportFunDef :: FunDef -> CFunctionDef NodeInfo+exportFunDef d@(FunDef _ stmt _) = CFunDef cDeclSpecs cDecl oldStyleParams stmt undefNode+ where+ (cDeclSpecs, cDecl) = exportDeclr specs (declType d) ([] :: Attributes) (declName d)+ oldStyleParams= [] :: [CDeclaration NodeInfo] -- TODO:?+ specs = exportDeclarationSpecifiers (declAttrs d):: [CDeclarationSpecifier NodeInfo]++exportDeclarationSpecifiers :: DeclAttrs -> [CDeclarationSpecifier NodeInfo]+exportDeclarationSpecifiers (DeclAttrs funcAttrs storage attrs ) = specifiers+ where specifiers = (CFunSpec <$> exportFunAttrs funcAttrs) ++ (CStorageSpec <$> exportStorage storage)+++-- |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)+ where+ (specs,derived) = exportType ty+ (ident,asmname) = case name of (VarName vident asmname_opt) -> (Just vident, asmname_opt)+ _ -> (Nothing,Nothing)++exportTypeDecl :: Type -> CDecl+exportTypeDecl ty =+ CDecl declspecs declrs ni+ where+ (declspecs,derived) = exportType ty+ declrs | null derived = []+ | otherwise = [(Just $ CDeclr Nothing derived Nothing [] ni,Nothing,Nothing)]++exportTypeDef :: TypeDef -> CDecl+exportTypeDef (TypeDef ident ty attrs node_info) =+ CDecl (CStorageSpec (CTypedef ni) : declspecs) [declr] node_info+ where+ (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) =+ 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)]+ where+ select (predicate,tyqual) | predicate quals = Just tyqual+ | otherwise = Nothing++exportTypeQualsAttrs :: TypeQuals -> Attributes -> [CTypeQual]+exportTypeQualsAttrs tyqs attrs = (exportTypeQuals tyqs ++ map CAttrQual (exportAttrs attrs))++exportArraySize :: ArraySize -> CArrSize+exportArraySize (ArraySize static e) = CArrSize static e+exportArraySize (UnknownArraySize complete) = CNoArrSize complete++exportTypeSpec :: TypeName -> [CTypeSpec]+exportTypeSpec tyname =+ case tyname of+ TyVoid -> [CVoidType ni]+ TyIntegral ity -> exportIntType ity+ TyFloating fty -> exportFloatType fty+ TyComplex fty -> exportComplexType fty+ 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 =+ case ty of+ TyBool -> [CBoolType ni]+ TyChar -> [CCharType ni]+ TySChar -> [CSignedType ni,CCharType ni]+ TyUChar -> [CUnsigType ni,CCharType ni]+ TyShort -> [CShortType ni]+ TyUShort -> [CUnsigType ni, CShortType ni]+ TyInt -> [CIntType ni]+ TyUInt -> [CUnsigType ni, CIntType ni]+ TyInt128 -> [CInt128Type ni]+ TyUInt128 -> [CUnsigType ni, CInt128Type ni]+ TyLong -> [CLongType ni]+ TyULong -> [CUnsigType ni,CLongType ni]+ TyLLong -> [CLongType ni, CLongType ni]+ TyULLong -> [CUnsigType ni, CLongType ni, CLongType ni]++exportFloatType :: FloatType -> [CTypeSpec]+exportFloatType ty =+ case ty of+ TyFloat -> [CFloatType ni]+ TyDouble -> [CDoubleType ni]+ TyLDouble -> [CLongType ni, CDoubleType ni]+ TyFloatN n x -> [CFloatNType n x ni]++exportComplexType :: FloatType -> [CTypeSpec]+exportComplexType ty = (CComplexType ni) : exportFloatType ty++exportCompTypeDecl :: CompTypeRef -> [CTypeSpec]+exportCompTypeDecl ty = [CSUType (exportComp ty) ni]+ where+ exportComp (CompTypeRef sue_ref comp_tag _n) =+ CStruct (if comp_tag == StructTag then CStructTag else CUnionTag)+ (exportSUERef sue_ref) Nothing [] ni++exportEnumTypeDecl :: EnumTypeRef -> [CTypeSpec]+exportEnumTypeDecl ty = [CEnumType (exportEnum ty) ni]+ where+ exportEnum (EnumTypeRef sue_ref _n) =+ CEnum (exportSUERef sue_ref) Nothing [] ni++exportCompType :: CompType -> [CTypeSpec]+exportCompType (CompType sue_ref comp_tag members attrs node_info) = [CSUType comp ni]+ where+ comp = CStruct (if comp_tag == StructTag then CStructTag else CUnionTag)+ (exportSUERef sue_ref)+ (Just (map exportMemberDecl members))+ (exportAttrs attrs)+ node_info+exportCompTypeRef :: CompType -> [CTypeSpec]+exportCompTypeRef (CompType sue_ref com_tag _ _ node_info) = exportCompTypeDecl (CompTypeRef sue_ref com_tag node_info)++exportEnumType :: EnumType -> [CTypeSpec]+exportEnumType (EnumType sue_ref enumerators attrs node_info) = [CEnumType enum ni]+ where+ enum = CEnum (exportSUERef sue_ref)+ (Just (map exportEnumerator enumerators))+ (exportAttrs attrs)+ node_info+ exportEnumerator (Enumerator ident val _ty _) = (ident,Just val)++exportEnumTypeRef :: EnumType -> [CTypeSpec]+exportEnumTypeRef (EnumType sue_ref _ _ node_info) = exportEnumTypeDecl (EnumTypeRef sue_ref node_info)++-- XXX: relies on a the source program not having any $'s in it+exportSUERef :: SUERef -> Maybe Ident+exportSUERef (AnonymousRef name) = Just (internalIdent $ "$" ++ show (nameId name))+exportSUERef (NamedRef ident) = Just ident++exportMemberDecl :: MemberDecl -> CDecl+exportMemberDecl (AnonBitField ty expr node_info) =+ CDecl (map CTypeSpec $ exportTypeSpec $ fromDirectType ty) [(Nothing,Nothing,Just expr)] node_info+exportMemberDecl (MemberDecl vardecl bitfieldsz node_info) =+ let (specs,declarator) = exportVarDecl vardecl+ in CDecl specs [(Just declarator, Nothing, bitfieldsz)] node_info+exportVarDecl :: VarDecl -> ([CDeclSpec],CDeclr)++-- NOTE: that there is an ambiguity between two possible places for __attributes__ s here+exportVarDecl (VarDecl name attrs ty) = exportDeclr (exportDeclAttrs attrs) ty [] name+exportParamDecl :: ParamDecl -> CDecl+exportParamDecl paramdecl =+ let (specs,declr) = exportVarDecl (getVarDecl paramdecl)+ in CDecl specs [(Just declr, Nothing , Nothing) ] (nodeInfo paramdecl)++exportDeclAttrs :: DeclAttrs -> [CDeclSpec]+exportDeclAttrs (DeclAttrs fun_attrs storage attrs) =+ map CFunSpec (exportFunAttrs fun_attrs)+ ++ map CStorageSpec (exportStorage storage)+ ++ map (CTypeQual . CAttrQual) (exportAttrs attrs)++-- | export function attributes to C function specifiers+exportFunAttrs :: FunctionAttrs -> [CFunSpec]+exportFunAttrs fattrs = catMaybes [inlQual, noretQual]+ where+ inlQual = if isInline fattrs then Just (CInlineQual ni) else Nothing+ noretQual = if isNoreturn fattrs then Just (CNoreturnQual ni) else Nothing++-- | express storage in terms of storage specifiers.+--+-- This isn't always possible and depends on the context the identifier is declared.+-- Most importantly, if there is a /conflicting/ declaration in scope, export is impossible.+-- Furthermore, automatic storage is impossible in file scope.+-- If the storage can actually be specified, the export is correct.+exportStorage :: Storage -> [CStorageSpec]+exportStorage NoStorage = []+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 (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+threadLocal True = ((CThread ni) :)++exportAttrs :: [Attr] -> [CAttr]+exportAttrs = map exportAttr where+ exportAttr (Attr ident es n) = CAttr ident es n++fromDirectType :: Type -> TypeName+fromDirectType (DirectType ty _ _) = ty+fromDirectType (TypeDefType (TypeDefRef _ ty _) _ _) = fromDirectType ty+fromDirectType _ = error "fromDirectType"++ni :: NodeInfo+ni = undefNode
src/Language/C/Analysis/NameSpaceMap.hs view
@@ -1,159 +1,159 @@------------------------------------------------------------------------------ --- | --- Module : Language.C.Analysis.NameSpaceMap --- Copyright : (c) [1995..1999] Manuel M. T. Chakravarty --- (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : alpha --- Portability : portable --- --- This module manages name spaces. --- --- * A name space map associates identifiers with their definition. --- --- * Each name space map is organized in a hierarchical way using the notion of --- scopes. A name space map, at any moment, always has a global scope and may --- have several local scopes. Definitions in inner scopes hide definitions --- of the same identifier in outer scopes. --- -module Language.C.Analysis.NameSpaceMap ( - -- * name space maps - NameSpaceMap, nameSpaceMap, nsMapToList, - globalNames,localNames,hasLocalNames, - -- * scope modification - defGlobal, - 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, union) -import qualified Data.List as List (unionBy) -import Data.Map (Map) - -{- -C Namespaces and scopes: - - --} - --- DevDocs: --- --- * the definitions in the global scope are stored in a finite map, because --- they tend to be a lot. --- --- * the definitions of the local scopes are stored in a single list, usually --- they are not very many and the definitions entered last are the most --- frequently accessed ones; the list structure naturally hides older --- definitions, i.e., definitions from outer scopes; adding new definitions --- is done in time proportinal to the current size of the scope; removing a --- scope is done in constant time (and the definitions of a scope can be --- returned as a result of leaving the scope); lookup is proportional to the --- number of definitions in the local scopes and the logarithm of the number --- of definitions in the global scope -- i.e., efficiency relies on a --- relatively low number of local definitions together with frequent lookup --- of the most recently defined local identifiers --- - --- | @NameSpaceMap a@ is a Map from identifiers to @a@, which manages --- global and local name spaces. -data NameSpaceMap k v = NsMap (Map k v) -- defs in global scope - [[(k, v)]] -- stack of local scopes -globalNames :: (Ord k) => NameSpaceMap k v -> Map k v -globalNames (NsMap g _) = g -hasLocalNames :: NameSpaceMap k v -> Bool -hasLocalNames (NsMap _ l) = not (null l) -localNames :: (Ord k) => NameSpaceMap k v -> [[(k,v)]] -localNames (NsMap _ l) = l - --- | create a name space -nameSpaceMap :: (Ord k) => NameSpaceMap k v -nameSpaceMap = NsMap Map.empty [] - - - --- | Add global definition --- --- @(ns',oldDef) = defGlobal ns ident def@ --- adds a global definition @ident := def@ to the namespace. --- It returns the modified namespace @ns'@. If the identifier is --- already declared in the global namespace, the definition is overwritten --- and the old definition @oldDef@ is returned. -defGlobal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a) -defGlobal (NsMap gs lss) ident def - = (NsMap (Map.insert ident def gs) lss, Map.lookup ident gs) - --- | Enter new local scope --- --- @ns' = enterNewScope ns@ creates and enters a new local scope. -enterNewScope :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a -enterNewScope (NsMap gs lss) = NsMap gs ([]:lss) - --- | Leave innermost local scope --- --- @(ns',defs) = leaveScope ns@ pops leaves the innermost local scope. --- and returns its definitions -leaveScope :: (Ord k) => NameSpaceMap k a -> (NameSpaceMap k a, [(k, a)]) -leaveScope (NsMap _ []) = error "NsMaps.leaveScope: No local scope!" -leaveScope (NsMap gs (ls:lss)) = (NsMap gs lss, ls) - --- | Add local definition --- --- @(ns',oldDef) = defLocal ns ident def@ adds the local definition --- @ident := def@ to the innermost local scope, if there is a local scope, --- and to the global scope otherwise. --- It returns the modified name space @ns'@ and the old binding of --- the identifier @oldDef@, which is overwritten. -defLocal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a) -defLocal ns@(NsMap _ []) ident def = defGlobal ns ident def -defLocal (NsMap gs (ls:lss)) ident def = - (NsMap gs (((ident, def):ls):lss), - Prelude.lookup ident ls) - --- | Search for a definition --- --- @def = find ns ident@ returns the definition in some scope (inner to outer), --- if there is one. -lookupName :: (Ord k) => NameSpaceMap k a -> k -> Maybe a -lookupName ns@(NsMap _ localDefs) ident - = case lookupLocal localDefs of - Nothing -> lookupGlobal ns ident - Just def -> Just def - where - lookupLocal [] = Nothing - lookupLocal (ls:lss) = - case Prelude.lookup ident ls of - Nothing -> lookupLocal lss - Just def -> Just def - -lookupGlobal :: (Ord k) => NameSpaceMap k a -> k -> Maybe a -lookupGlobal (NsMap gs _) ident = Map.lookup ident gs - -lookupInnermostScope :: (Ord k) => NameSpaceMap k a -> k -> Maybe a -lookupInnermostScope nsm@(NsMap _gs localDefs) ident = - case localDefs of - (ls : _lss) -> Prelude.lookup ident ls - [] -> lookupGlobal nsm ident - --- | flatten a namespace into a assoc list --- --- @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 +-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Analysis.NameSpaceMap+-- Copyright : (c) [1995..1999] Manuel M. T. Chakravarty+-- (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : alpha+-- Portability : portable+--+-- This module manages name spaces.+--+-- * A name space map associates identifiers with their definition.+--+-- * Each name space map is organized in a hierarchical way using the notion of+-- scopes. A name space map, at any moment, always has a global scope and may+-- have several local scopes. Definitions in inner scopes hide definitions+-- of the same identifier in outer scopes.+--+module Language.C.Analysis.NameSpaceMap (+ -- * name space maps+ NameSpaceMap, nameSpaceMap, nsMapToList,+ globalNames,localNames,hasLocalNames,+ -- * scope modification+ defGlobal,+ 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, union)+import qualified Data.List as List (unionBy)+import Data.Map (Map)++{-+C Namespaces and scopes:+++-}++-- DevDocs:+--+-- * the definitions in the global scope are stored in a finite map, because+-- they tend to be a lot.+--+-- * the definitions of the local scopes are stored in a single list, usually+-- they are not very many and the definitions entered last are the most+-- frequently accessed ones; the list structure naturally hides older+-- definitions, i.e., definitions from outer scopes; adding new definitions+-- is done in time proportinal to the current size of the scope; removing a+-- scope is done in constant time (and the definitions of a scope can be+-- returned as a result of leaving the scope); lookup is proportional to the+-- number of definitions in the local scopes and the logarithm of the number+-- of definitions in the global scope -- i.e., efficiency relies on a+-- relatively low number of local definitions together with frequent lookup+-- of the most recently defined local identifiers+--++-- | @NameSpaceMap a@ is a Map from identifiers to @a@, which manages+-- global and local name spaces.+data NameSpaceMap k v = NsMap (Map k v) -- defs in global scope+ [[(k, v)]] -- stack of local scopes+globalNames :: (Ord k) => NameSpaceMap k v -> Map k v+globalNames (NsMap g _) = g+hasLocalNames :: NameSpaceMap k v -> Bool+hasLocalNames (NsMap _ l) = not (null l)+localNames :: (Ord k) => NameSpaceMap k v -> [[(k,v)]]+localNames (NsMap _ l) = l++-- | create a name space+nameSpaceMap :: (Ord k) => NameSpaceMap k v+nameSpaceMap = NsMap Map.empty []++++-- | Add global definition+--+-- @(ns',oldDef) = defGlobal ns ident def@+-- adds a global definition @ident := def@ to the namespace.+-- It returns the modified namespace @ns'@. If the identifier is+-- already declared in the global namespace, the definition is overwritten+-- and the old definition @oldDef@ is returned.+defGlobal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a)+defGlobal (NsMap gs lss) ident def+ = (NsMap (Map.insert ident def gs) lss, Map.lookup ident gs)++-- | Enter new local scope+--+-- @ns' = enterNewScope ns@ creates and enters a new local scope.+enterNewScope :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a+enterNewScope (NsMap gs lss) = NsMap gs ([]:lss)++-- | Leave innermost local scope+--+-- @(ns',defs) = leaveScope ns@ pops leaves the innermost local scope.+-- and returns its definitions+leaveScope :: (Ord k) => NameSpaceMap k a -> (NameSpaceMap k a, [(k, a)])+leaveScope (NsMap _ []) = error "NsMaps.leaveScope: No local scope!"+leaveScope (NsMap gs (ls:lss)) = (NsMap gs lss, ls)++-- | Add local definition+--+-- @(ns',oldDef) = defLocal ns ident def@ adds the local definition+-- @ident := def@ to the innermost local scope, if there is a local scope,+-- and to the global scope otherwise.+-- It returns the modified name space @ns'@ and the old binding of+-- the identifier @oldDef@, which is overwritten.+defLocal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a)+defLocal ns@(NsMap _ []) ident def = defGlobal ns ident def+defLocal (NsMap gs (ls:lss)) ident def =+ (NsMap gs (((ident, def):ls):lss),+ Prelude.lookup ident ls)++-- | Search for a definition+--+-- @def = find ns ident@ returns the definition in some scope (inner to outer),+-- if there is one.+lookupName :: (Ord k) => NameSpaceMap k a -> k -> Maybe a+lookupName ns@(NsMap _ localDefs) ident+ = case lookupLocal localDefs of+ Nothing -> lookupGlobal ns ident+ Just def -> Just def+ where+ lookupLocal [] = Nothing+ lookupLocal (ls:lss) =+ case Prelude.lookup ident ls of+ Nothing -> lookupLocal lss+ Just def -> Just def++lookupGlobal :: (Ord k) => NameSpaceMap k a -> k -> Maybe a+lookupGlobal (NsMap gs _) ident = Map.lookup ident gs++lookupInnermostScope :: (Ord k) => NameSpaceMap k a -> k -> Maybe a+lookupInnermostScope nsm@(NsMap _gs localDefs) ident =+ case localDefs of+ (ls : _lss) -> Prelude.lookup ident ls+ [] -> lookupGlobal nsm ident++-- | flatten a namespace into a assoc list+--+-- @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
@@ -1,109 +1,109 @@-{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Analysis.SemError --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : alpha --- Portability : ghc --- --- Errors in the semantic analysis ------------------------------------------------------------------------------ -module Language.C.Analysis.SemError ( -InvalidASTError(..), invalidAST, -BadSpecifierError(..), badSpecifierError, -TypeMismatch(..), typeMismatch, -RedefError(..), RedefInfo(..), RedefKind(..), redefinition, -) -where -import Data.Typeable - --- this means we cannot use SemError in SemRep, but use rich types here -import Language.C.Analysis.SemRep - -import Language.C.Data.Error -import Language.C.Data.Node - --- here are the errors available - --- | InvalidASTError is caused by the violation of an invariant in the AST -newtype InvalidASTError = InvalidAST ErrorInfo deriving (Typeable) - -instance Error InvalidASTError where - errorInfo (InvalidAST ei) = ei - changeErrorLevel (InvalidAST ei) lvl' = InvalidAST (changeErrorLevel ei lvl') - --- | BadSpecifierError is caused by an invalid combination of specifiers -newtype BadSpecifierError = BadSpecifierError ErrorInfo deriving (Typeable) - -instance Error BadSpecifierError where - errorInfo (BadSpecifierError ei) = ei - changeErrorLevel (BadSpecifierError ei) lvl' = BadSpecifierError (changeErrorLevel ei lvl') - --- | RedefError is caused by an invalid redefinition of the same identifier or type -data RedefError = RedefError ErrorLevel RedefInfo deriving Typeable - -data RedefInfo = RedefInfo String RedefKind NodeInfo NodeInfo -data RedefKind = DuplicateDef | DiffKindRedecl | ShadowedDef | DisagreeLinkage | - NoLinkageOld -data TypeMismatch = TypeMismatch String (NodeInfo,Type) (NodeInfo,Type) deriving Typeable - --- Invalid AST --- ~~~~~~~~~~~ - -instance Show InvalidASTError where show = showError "AST invariant violated" - -invalidAST :: NodeInfo -> String -> InvalidASTError -invalidAST node_info msg = InvalidAST (mkErrorInfo LevelError msg node_info) - --- Bad specifier (e.g. static for a parameter, or extern when there is an initializer) --- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -instance Show BadSpecifierError where show = showError "Bad specifier" - -badSpecifierError :: NodeInfo -> String -> BadSpecifierError -badSpecifierError node_info msg = BadSpecifierError (mkErrorInfo LevelError msg node_info) - --- Type mismatch --- ~~~~~~~~~~~~~ -typeMismatch :: String -> (NodeInfo, Type) -> (NodeInfo,Type) -> TypeMismatch -typeMismatch = TypeMismatch - -instance Show TypeMismatch where - show tm = showError "Type mismatch" (typeMismatchInfo tm) -instance Error TypeMismatch where - errorInfo = typeMismatchInfo -typeMismatchInfo :: TypeMismatch -> ErrorInfo -typeMismatchInfo (TypeMismatch reason (node1,_ty2) _t2) = - ErrorInfo LevelError (posOfNode node1) [reason] - --- Redefinitions --- ~~~~~~~~~~~~~ - -instance Show RedefError where - show (RedefError lvl info) = showErrorInfo (redefErrLabel info) (redefErrorInfo lvl info) -instance Error RedefError where - errorInfo (RedefError lvl info) = redefErrorInfo lvl info - changeErrorLevel (RedefError _lvl info) lvl' = RedefError lvl' info - -redefErrLabel :: RedefInfo -> String -redefErrLabel (RedefInfo ident _ _ _) = ident ++ " redefined" - -redefErrorInfo :: ErrorLevel -> RedefInfo -> ErrorInfo -redefErrorInfo lvl info@(RedefInfo _ _ node old_node) = - ErrorInfo lvl (posOfNode node) ([redefErrReason info] ++ prevDeclMsg old_node) - -redefErrReason :: RedefInfo -> String -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)] - -redefinition :: ErrorLevel -> String -> RedefKind -> NodeInfo -> NodeInfo -> RedefError -redefinition lvl ctx kind new old = RedefError lvl (RedefInfo ctx kind new old) - +{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Analysis.SemError+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : alpha+-- Portability : ghc+--+-- Errors in the semantic analysis+-----------------------------------------------------------------------------+module Language.C.Analysis.SemError (+InvalidASTError(..), invalidAST,+BadSpecifierError(..), badSpecifierError,+TypeMismatch(..), typeMismatch,+RedefError(..), RedefInfo(..), RedefKind(..), redefinition,+)+where+import Data.Typeable++-- this means we cannot use SemError in SemRep, but use rich types here+import Language.C.Analysis.SemRep++import Language.C.Data.Error+import Language.C.Data.Node++-- here are the errors available++-- | InvalidASTError is caused by the violation of an invariant in the AST+newtype InvalidASTError = InvalidAST ErrorInfo deriving (Typeable)++instance Error InvalidASTError where+ errorInfo (InvalidAST ei) = ei+ changeErrorLevel (InvalidAST ei) lvl' = InvalidAST (changeErrorLevel ei lvl')++-- | BadSpecifierError is caused by an invalid combination of specifiers+newtype BadSpecifierError = BadSpecifierError ErrorInfo deriving (Typeable)++instance Error BadSpecifierError where+ errorInfo (BadSpecifierError ei) = ei+ changeErrorLevel (BadSpecifierError ei) lvl' = BadSpecifierError (changeErrorLevel ei lvl')++-- | RedefError is caused by an invalid redefinition of the same identifier or type+data RedefError = RedefError ErrorLevel RedefInfo deriving Typeable++data RedefInfo = RedefInfo String RedefKind NodeInfo NodeInfo+data RedefKind = DuplicateDef | DiffKindRedecl | ShadowedDef | DisagreeLinkage |+ NoLinkageOld+data TypeMismatch = TypeMismatch String (NodeInfo,Type) (NodeInfo,Type) deriving Typeable++-- Invalid AST+-- ~~~~~~~~~~~++instance Show InvalidASTError where show = showError "AST invariant violated"++invalidAST :: NodeInfo -> String -> InvalidASTError+invalidAST node_info msg = InvalidAST (mkErrorInfo LevelError msg node_info)++-- Bad specifier (e.g. static for a parameter, or extern when there is an initializer)+-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++instance Show BadSpecifierError where show = showError "Bad specifier"++badSpecifierError :: NodeInfo -> String -> BadSpecifierError+badSpecifierError node_info msg = BadSpecifierError (mkErrorInfo LevelError msg node_info)++-- Type mismatch+-- ~~~~~~~~~~~~~+typeMismatch :: String -> (NodeInfo, Type) -> (NodeInfo,Type) -> TypeMismatch+typeMismatch = TypeMismatch++instance Show TypeMismatch where+ show tm = showError "Type mismatch" (typeMismatchInfo tm)+instance Error TypeMismatch where+ errorInfo = typeMismatchInfo+typeMismatchInfo :: TypeMismatch -> ErrorInfo+typeMismatchInfo (TypeMismatch reason (node1,_ty2) _t2) =+ ErrorInfo LevelError (posOfNode node1) [reason]++-- Redefinitions+-- ~~~~~~~~~~~~~++instance Show RedefError where+ show (RedefError lvl info) = showErrorInfo (redefErrLabel info) (redefErrorInfo lvl info)+instance Error RedefError where+ errorInfo (RedefError lvl info) = redefErrorInfo lvl info+ changeErrorLevel (RedefError _lvl info) lvl' = RedefError lvl' info++redefErrLabel :: RedefInfo -> String+redefErrLabel (RedefInfo ident _ _ _) = ident ++ " redefined"++redefErrorInfo :: ErrorLevel -> RedefInfo -> ErrorInfo+redefErrorInfo lvl info@(RedefInfo _ _ node old_node) =+ ErrorInfo lvl (posOfNode node) ([redefErrReason info] ++ prevDeclMsg old_node)++redefErrReason :: RedefInfo -> String+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)]++redefinition :: ErrorLevel -> String -> RedefKind -> NodeInfo -> NodeInfo -> RedefError+redefinition lvl ctx kind new old = RedefError lvl (RedefInfo ctx kind new old)+
src/Language/C/Analysis/SemRep.hs view
@@ -1,682 +1,682 @@-{-# LANGUAGE DeriveDataTypeable #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Analysis.Syntax --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : alpha --- Portability : ghc --- --- This module contains definitions for representing C translation units. --- In contrast to 'Language.C.Syntax.AST', the representation tries to express the semantics of --- of a translation unit. ---------------------------------------------------------------------------------------------------- -module Language.C.Analysis.SemRep( --- * Sums of tags and identifiers -TagDef(..),typeOfTagDef, -Declaration(..),declIdent,declName,declType,declAttrs, -IdentDecl(..),objKindDescr, splitIdentDecls, --- * Global definitions -GlobalDecls(..),emptyGlobalDecls,filterGlobalDecls,mergeGlobalDecls, --- * Events for visitors -DeclEvent(..), --- * Declarations and definitions -Decl(..), -ObjDef(..),isTentative, -FunDef(..), -ParamDecl(..),MemberDecl(..), -TypeDef(..),identOfTypeDef, -VarDecl(..), --- * Declaration attributes -DeclAttrs(..),isExtDecl, -FunctionAttrs(..), functionAttrs, noFunctionAttrs, -Storage(..),declStorage,ThreadLocal,Register, -Linkage(..),hasLinkage,declLinkage, --- * Types -Type(..), -FunType(..), -ArraySize(..), -TypeDefRef(..), -TypeName(..),BuiltinType(..), -IntType(..),FloatType(..), -HasSUERef(..),HasCompTyKind(..), -CompTypeRef(..),CompType(..),typeOfCompDef,CompTyKind(..), -EnumTypeRef(..),EnumType(..),typeOfEnumDef, -Enumerator(..), -TypeQuals(..),noTypeQuals,mergeTypeQuals, --- * Variable names -VarName(..),identOfVarName,isNoName,AsmName, --- * Attributes (STUB, not yet analyzed) -Attr(..),Attributes,noAttributes,mergeAttributes, --- * Statements and Expressions (STUB, aliases to Syntax) -Stmt,Expr,Initializer,AsmBlock, -) -where -import Language.C.Data -import Language.C.Syntax -import Data.Map (Map) -import qualified Data.Map as Map -import Data.Maybe -import Data.Generics - --- | accessor class : struct\/union\/enum names -class HasSUERef a where - sueRef :: a -> SUERef - --- | accessor class : composite type tags (struct or union) -class HasCompTyKind a where - compTag :: a -> CompTyKind - --- | Composite type definitions (tags) -data TagDef = CompDef CompType --composite definition - | EnumDef EnumType --enum definition - deriving (Typeable, Data {-! ,CNode !-}) - -instance HasSUERef TagDef where - sueRef (CompDef ct) = sueRef ct - sueRef (EnumDef et) = sueRef et - --- | return the type corresponding to a tag definition -typeOfTagDef :: TagDef -> TypeName -typeOfTagDef (CompDef comptype) = typeOfCompDef comptype -typeOfTagDef (EnumDef enumtype) = typeOfEnumDef enumtype - --- | All datatypes aggregating a declaration are instances of @Declaration@ -class Declaration n where - -- | get the name, type and declaration attributes of a declaration or definition - getVarDecl :: n -> VarDecl - --- | get the declaration corresponding to a definition -declOfDef :: (Declaration n, CNode n) => n -> Decl -declOfDef def = let vd = getVarDecl def in Decl vd (nodeInfo def) - --- | get the variable identifier of a declaration (only safe if the --- the declaration is known to have a name) -declIdent :: (Declaration n) => n -> Ident -declIdent = identOfVarName . declName --- | get the variable name of a @Declaration@ -declName :: (Declaration n) => n -> VarName -declName = (\(VarDecl n _ _) -> n) . getVarDecl --- | get the type of a @Declaration@ -declType :: (Declaration n) => n -> Type -declType = (\(VarDecl _ _ ty) -> ty) . getVarDecl --- | get the declaration attributes of a @Declaration@ -declAttrs :: (Declaration n) => n -> DeclAttrs -declAttrs = (\(VarDecl _ specs _) -> specs) . getVarDecl - -instance (Declaration a, Declaration b) => Declaration (Either a b) where - getVarDecl = either getVarDecl getVarDecl - --- | identifiers, typedefs and enumeration constants (namespace sum) -data IdentDecl = Declaration Decl -- ^ object or function declaration - | ObjectDef ObjDef -- ^ object definition - | FunctionDef FunDef -- ^ function definition - | EnumeratorDef Enumerator -- ^ definition of an enumerator - deriving (Typeable, Data {-! ,CNode !-}) - -instance Declaration IdentDecl where - getVarDecl (Declaration decl) = getVarDecl decl - getVarDecl (ObjectDef def) = getVarDecl def - getVarDecl (FunctionDef def) = getVarDecl def - getVarDecl (EnumeratorDef def) = getVarDecl def - --- | textual description of the kind of an object -objKindDescr :: IdentDecl -> String -objKindDescr (Declaration _ ) = "declaration" -objKindDescr (ObjectDef _) = "object definition" -objKindDescr (FunctionDef _) = "function definition" -objKindDescr (EnumeratorDef _) = "enumerator definition" - --- | @splitIdentDecls includeAllDecls@ splits a map of object, function and enumerator declarations and definitions into one map --- holding declarations, and three maps for object definitions, enumerator definitions and function definitions. --- If @includeAllDecls@ is @True@ all declarations are present in the first map, otherwise only those where no corresponding definition --- is available. -splitIdentDecls :: Bool -> Map Ident IdentDecl -> (Map Ident Decl, - ( Map Ident Enumerator, - Map Ident ObjDef, - Map Ident FunDef ) ) -splitIdentDecls include_all = Map.foldWithKey (if include_all then deal else deal') (Map.empty,(Map.empty,Map.empty,Map.empty)) - where - deal ident entry (decls,defs) = (Map.insert ident (declOfDef entry) decls, addDef ident entry defs) - deal' ident (Declaration d) (decls,defs) = (Map.insert ident d decls,defs) - deal' ident def (decls,defs) = (decls, addDef ident def defs) - addDef ident entry (es,os,fs) = - case entry of - Declaration _ -> (es,os,fs) - EnumeratorDef e -> (Map.insert ident e es,os,fs) - ObjectDef o -> (es,Map.insert ident o os,fs) - FunctionDef f -> (es, os,Map.insert ident f fs) - - --- | global declaration\/definition table returned by the analysis -data GlobalDecls = GlobalDecls { - gObjs :: Map Ident IdentDecl, - gTags :: Map SUERef TagDef, - gTypeDefs :: Map Ident TypeDef - } - --- | empty global declaration table -emptyGlobalDecls :: GlobalDecls -emptyGlobalDecls = GlobalDecls Map.empty Map.empty Map.empty - --- | filter global declarations -filterGlobalDecls :: (DeclEvent -> Bool) -> GlobalDecls -> GlobalDecls -filterGlobalDecls decl_filter gmap = GlobalDecls - { - gObjs = Map.filter (decl_filter . DeclEvent) (gObjs gmap), - gTags = Map.filter (decl_filter . TagEvent) (gTags gmap), - gTypeDefs = Map.filter (decl_filter . TypeDefEvent) (gTypeDefs gmap) - } --- | merge global declarations -mergeGlobalDecls :: GlobalDecls -> GlobalDecls -> GlobalDecls -mergeGlobalDecls gmap1 gmap2 = GlobalDecls - { - gObjs = Map.union (gObjs gmap1) (gObjs gmap2), - gTags = Map.union (gTags gmap1) (gTags gmap2), - gTypeDefs = Map.union (gTypeDefs gmap1) (gTypeDefs gmap2) - } - - --- * Events - --- | Declaration events --- --- Those events are reported to callbacks, which are executed during the traversal. -data DeclEvent = - TagEvent TagDef - -- ^ 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 - -- ^ assembler block - deriving ({-! CNode !-}) - --- * Declarations and definitions - --- | Declarations, which aren't definitions -data Decl = Decl VarDecl NodeInfo - deriving (Typeable, Data {-! ,CNode !-}) - -instance Declaration Decl where - getVarDecl (Decl vd _) = vd - --- | Object Definitions --- --- An object definition is a declaration together with an initializer. --- --- 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 !-}) -instance Declaration ObjDef where - getVarDecl (ObjDef vd _ _) = vd - --- | Returns @True@ if the given object definition is tentative. -isTentative :: ObjDef -> Bool -isTentative (ObjDef decl init_opt _) | isExtDecl decl = isNothing init_opt - | otherwise = False - --- | Function definitions --- --- A function definition is a declaration together with a statement (the function body). -data FunDef = FunDef VarDecl Stmt NodeInfo - deriving (Typeable, Data {-! ,CNode !-}) -instance Declaration FunDef where - getVarDecl (FunDef vd _ _) = vd - - --- | Parameter declaration -data ParamDecl = ParamDecl VarDecl NodeInfo - | AbstractParamDecl VarDecl NodeInfo - deriving (Typeable, Data {-! ,CNode !-} ) - -instance Declaration ParamDecl where - getVarDecl (ParamDecl vd _) = vd - getVarDecl (AbstractParamDecl vd _) = vd - --- | Struct\/Union member declaration -data MemberDecl = MemberDecl VarDecl (Maybe Expr) NodeInfo - -- ^ @MemberDecl vardecl bitfieldsize node@ - | AnonBitField Type Expr NodeInfo - -- ^ @AnonBitField typ size@ - deriving (Typeable, Data {-! ,CNode !-} ) - -instance Declaration MemberDecl where - getVarDecl (MemberDecl vd _ _) = vd - getVarDecl (AnonBitField ty _ _) = VarDecl NoName (DeclAttrs noFunctionAttrs NoStorage []) ty - --- | @typedef@ definitions. --- --- The identifier is a new name for the given type. -data TypeDef = TypeDef Ident Type Attributes NodeInfo - deriving (Typeable, Data {-! ,CNode !-} ) - --- | return the idenitifier of a @typedef@ -identOfTypeDef :: TypeDef -> Ident -identOfTypeDef (TypeDef ide _ _ _) = ide - --- | Generic variable declarations -data VarDecl = VarDecl VarName DeclAttrs Type - deriving (Typeable, Data) - -instance Declaration VarDecl where - getVarDecl = id - --- @isExtDecl d@ returns true if the declaration has /linkage/ -isExtDecl :: (Declaration n) => n -> Bool -isExtDecl = hasLinkage . declStorage - --- | Declaration attributes of the form @DeclAttrs isInlineFunction storage linkage attrs@ --- --- They specify the storage and linkage of a declared object. -data DeclAttrs = DeclAttrs FunctionAttrs Storage Attributes - -- ^ @DeclAttrs fspecs storage attrs@ - deriving (Typeable, Data) - --- | get the 'Storage' of a declaration -declStorage :: (Declaration d) => d -> Storage -declStorage d = case declAttrs d of (DeclAttrs _ st _) -> st - --- | get the `function attributes' of a declaration -functionAttrs :: (Declaration d) => d -> FunctionAttrs -functionAttrs d = case declAttrs d of (DeclAttrs fa _ _) -> fa - --- Function attributes (inline, noreturn) -data FunctionAttrs = FunctionAttrs { isInline :: Bool, isNoreturn :: Bool } - deriving (Eq, Ord, Typeable, Data) - -noFunctionAttrs :: FunctionAttrs -noFunctionAttrs = FunctionAttrs { isInline = False, isNoreturn = False } - - --- In C we have --- Identifiers can either have internal, external or no linkage --- (same object everywhere, same object within the translation unit, unique). --- * top-level identifiers --- static : internal linkage (objects and function defs) --- extern : linkage of prior declaration (if specified), external linkage otherwise --- no-spec: external linkage --- * storage duration --- * static storage duration: objects with external or internal linkage, or local ones with the static keyword --- * automatic storage duration: otherwise (register) --- See http://publications.gbdirect.co.uk/c_book/chapter8/declarations_and_definitions.html, Table 8.1, 8.2 - --- | Storage duration and linkage of a variable -data Storage = NoStorage -- ^ no storage - | Auto Register -- ^ automatic storage (optional: register) - | 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 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 (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 Attributes - -- ^ a non-derived type - | PtrType Type TypeQuals Attributes - -- ^ pointer type - | ArrayType Type ArraySize TypeQuals Attributes - -- ^ array type - | FunctionType FunType Attributes - -- ^ function type - | TypeDefType TypeDefRef TypeQuals Attributes - -- ^ a defined type - deriving (Typeable, Data) - --- | 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 - | FunTypeIncomplete Type - deriving (Typeable, Data) - --- | 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' (@[*]@). -data ArraySize = UnknownArraySize Bool - -- ^ @UnknownArraySize is-starred@ - | ArraySize Bool Expr - -- ^ @FixedSizeArray is-static size-expr@ - deriving (Typeable, Data) - --- | normalized type representation -data TypeName = - TyVoid - | TyIntegral IntType - | TyFloating FloatType - | TyComplex FloatType - | TyComp CompTypeRef - | TyEnum EnumTypeRef - | TyBuiltin BuiltinType - deriving (Typeable, Data) - --- | 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 Type NodeInfo - deriving (Typeable, Data {-! ,CNode !-}) - --- | integral types (C99 6.7.2.2) -data IntType = - TyBool - | TyChar - | TySChar - | TyUChar - | TyShort - | TyUShort - | TyInt - | TyUInt - | TyInt128 - | TyUInt128 - | TyLong - | TyULong - | TyLLong - | TyULLong - deriving (Typeable, Data, Eq, Ord) - -instance Show IntType where - show TyBool = "_Bool" - show TyChar = "char" - show TySChar = "signed char" - show TyUChar = "unsigned char" - show TyShort = "short" - show TyUShort = "unsigned short" - show TyInt = "int" - show TyUInt = "unsigned int" - show TyInt128 = "__int128" - show TyUInt128 = "unsigned __int128" - show TyLong = "long" - show TyULong = "unsigned long" - show TyLLong = "long long" - show TyULLong = "unsigned long long" - --- | floating point type (C99 6.7.2.2) -data FloatType = - TyFloat - | TyDouble - | TyLDouble - | TyFloat128 - deriving (Typeable, Data, Eq, Ord) - -instance Show FloatType where - show TyFloat = "float" - show TyDouble = "double" - show TyLDouble = "long double" - show TyFloat128 = "__float128" - --- | composite type declarations -data CompTypeRef = CompTypeRef SUERef CompTyKind NodeInfo - 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 !-}) -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 !-} ) -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 undefNode) - --- | a tag to determine wheter we refer to a @struct@ or @union@, see 'CompType'. -data CompTyKind = StructTag - | UnionTag - deriving (Eq,Ord,Typeable,Data) - -instance Show CompTyKind where - show StructTag = "struct" - show UnionTag = "union" - --- | Representation of C enumeration types -data EnumType = EnumType SUERef [Enumerator] Attributes NodeInfo - -- ^ @EnumType name enumeration-constants attrs node@ - 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 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 !-}) -instance Declaration Enumerator where - getVarDecl (Enumerator ide _ enumty _) = - VarDecl - (VarName ide Nothing) - (DeclAttrs noFunctionAttrs NoStorage []) - (DirectType (typeOfEnumDef enumty) noTypeQuals noAttributes) - --- | Type qualifiers: constant, volatile and restrict -data TypeQuals = TypeQuals { constant :: Bool, volatile :: Bool, - restrict :: Bool, atomic :: Bool, - nullable :: Bool, nonnull :: Bool } - deriving (Typeable, Data) - -instance Eq TypeQuals where - (==) (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) = - c1 == c2 && v1 == v2 && r1 == r2 && a1 == a2 && n1 == n2 && nn1 == nn2 - -instance Ord TypeQuals where - (<=) (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) = - c1 <= c2 && v1 <= v2 && r1 <= r2 && a1 <= a2 && n1 <= n2 && nn1 <= nn2 - - --- | no type qualifiers -noTypeQuals :: TypeQuals -noTypeQuals = TypeQuals False False False False False False - --- | merge (/&&/) two type qualifier sets -mergeTypeQuals :: TypeQuals -> TypeQuals -> TypeQuals -mergeTypeQuals (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) = - TypeQuals (c1 && c2) (v1 && v2) (r1 && r2) (a1 && a2) (n1 && n2) (nn1 && nn2) - --- * initializers - --- | 'Initializer' is currently an alias for 'CInit'. --- --- We're planning a normalized representation, but this depends on the implementation of --- constant expression evaluation -type Initializer = CInit - --- | Normalized C Initializers --- * If the expression has scalar type, the initializer is an expression --- * If the expression has struct type, the initializer is a map from designators to initializers --- * If the expression has array type, the initializer is a list of values --- Not implemented yet, as it depends on constant expression evaluation - - --- * names and attributes - --- | @VarName name assembler-name@ is a name of an declared object -data VarName = VarName Ident (Maybe AsmName) - | NoName - deriving (Typeable, Data) -identOfVarName :: VarName -> Ident -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 - --- | Assembler name (alias for @CStrLit@) -type AsmName = CStrLit - --- | @__attribute__@ annotations --- --- Those are of the form @Attr attribute-name attribute-parameters@, --- and serve as generic properties of some syntax tree elements. --- --- Some examples: --- --- * labels can be attributed with /unused/ to indicate that their not used --- --- * struct definitions can be attributed with /packed/ to tell the compiler to use the most compact representation --- --- * declarations can be attributed with /deprecated/ --- --- * function declarations can be attributes with /noreturn/ to tell the compiler that the function will never return, --- --- * or with /const/ to indicate that it is a pure function --- --- /TODO/: ultimatively, we want to parse attributes and represent them in a typed way -data Attr = Attr Ident [Expr] NodeInfo - 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 -instance Pos TagDef where - posOf x = posOf (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 = posOf (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 Pos DeclEvent where - posOf x = posOf (nodeInfo x) - -instance CNode Decl where - nodeInfo (Decl _ n) = n -instance Pos Decl where - posOf x = posOf (nodeInfo x) - -instance CNode ObjDef where - nodeInfo (ObjDef _ _ n) = n -instance Pos ObjDef where - posOf x = posOf (nodeInfo x) - -instance CNode FunDef where - nodeInfo (FunDef _ _ n) = n -instance Pos FunDef where - posOf x = posOf (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 +{-# LANGUAGE DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Analysis.Syntax+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : alpha+-- Portability : ghc+--+-- This module contains definitions for representing C translation units.+-- In contrast to 'Language.C.Syntax.AST', the representation tries to express the semantics of+-- of a translation unit.+---------------------------------------------------------------------------------------------------+module Language.C.Analysis.SemRep(+-- * Sums of tags and identifiers+TagDef(..),typeOfTagDef,+Declaration(..),declIdent,declName,declType,declAttrs,+IdentDecl(..),objKindDescr, splitIdentDecls,+-- * Global definitions+GlobalDecls(..),emptyGlobalDecls,filterGlobalDecls,mergeGlobalDecls,+-- * Events for visitors+DeclEvent(..),+-- * Declarations and definitions+Decl(..),+ObjDef(..),isTentative,+FunDef(..),+ParamDecl(..),MemberDecl(..),+TypeDef(..),identOfTypeDef,+VarDecl(..),+-- * Declaration attributes+DeclAttrs(..),isExtDecl,+FunctionAttrs(..), functionAttrs, noFunctionAttrs,+Storage(..),declStorage,ThreadLocal,Register,+Linkage(..),hasLinkage,declLinkage,+-- * Types+Type(..),+FunType(..),+ArraySize(..),+TypeDefRef(..),+TypeName(..),BuiltinType(..),+IntType(..),FloatType(..),+HasSUERef(..),HasCompTyKind(..),+CompTypeRef(..),CompType(..),typeOfCompDef,CompTyKind(..),+EnumTypeRef(..),EnumType(..),typeOfEnumDef,+Enumerator(..),+TypeQuals(..),noTypeQuals,mergeTypeQuals,+-- * Variable names+VarName(..),identOfVarName,isNoName,AsmName,+-- * Attributes (STUB, not yet analyzed)+Attr(..),Attributes,noAttributes,mergeAttributes,+-- * Statements and Expressions (STUB, aliases to Syntax)+Stmt,Expr,Initializer,AsmBlock,+)+where+import Language.C.Data+import Language.C.Syntax+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Maybe+import Data.Generics++-- | accessor class : struct\/union\/enum names+class HasSUERef a where+ sueRef :: a -> SUERef++-- | accessor class : composite type tags (struct or union)+class HasCompTyKind a where+ compTag :: a -> CompTyKind++-- | Composite type definitions (tags)+data TagDef = CompDef CompType --composite definition+ | EnumDef EnumType --enum definition+ deriving (Typeable, Data {-! ,CNode !-})++instance HasSUERef TagDef where+ sueRef (CompDef ct) = sueRef ct+ sueRef (EnumDef et) = sueRef et++-- | return the type corresponding to a tag definition+typeOfTagDef :: TagDef -> TypeName+typeOfTagDef (CompDef comptype) = typeOfCompDef comptype+typeOfTagDef (EnumDef enumtype) = typeOfEnumDef enumtype++-- | All datatypes aggregating a declaration are instances of @Declaration@+class Declaration n where+ -- | get the name, type and declaration attributes of a declaration or definition+ getVarDecl :: n -> VarDecl++-- | get the declaration corresponding to a definition+declOfDef :: (Declaration n, CNode n) => n -> Decl+declOfDef def = let vd = getVarDecl def in Decl vd (nodeInfo def)++-- | get the variable identifier of a declaration (only safe if the+-- the declaration is known to have a name)+declIdent :: (Declaration n) => n -> Ident+declIdent = identOfVarName . declName+-- | get the variable name of a @Declaration@+declName :: (Declaration n) => n -> VarName+declName = (\(VarDecl n _ _) -> n) . getVarDecl+-- | get the type of a @Declaration@+declType :: (Declaration n) => n -> Type+declType = (\(VarDecl _ _ ty) -> ty) . getVarDecl+-- | get the declaration attributes of a @Declaration@+declAttrs :: (Declaration n) => n -> DeclAttrs+declAttrs = (\(VarDecl _ specs _) -> specs) . getVarDecl++instance (Declaration a, Declaration b) => Declaration (Either a b) where+ getVarDecl = either getVarDecl getVarDecl++-- | identifiers, typedefs and enumeration constants (namespace sum)+data IdentDecl = Declaration Decl -- ^ object or function declaration+ | ObjectDef ObjDef -- ^ object definition+ | FunctionDef FunDef -- ^ function definition+ | EnumeratorDef Enumerator -- ^ definition of an enumerator+ deriving (Typeable, Data {-! ,CNode !-})++instance Declaration IdentDecl where+ getVarDecl (Declaration decl) = getVarDecl decl+ getVarDecl (ObjectDef def) = getVarDecl def+ getVarDecl (FunctionDef def) = getVarDecl def+ getVarDecl (EnumeratorDef def) = getVarDecl def++-- | textual description of the kind of an object+objKindDescr :: IdentDecl -> String+objKindDescr (Declaration _ ) = "declaration"+objKindDescr (ObjectDef _) = "object definition"+objKindDescr (FunctionDef _) = "function definition"+objKindDescr (EnumeratorDef _) = "enumerator definition"++-- | @splitIdentDecls includeAllDecls@ splits a map of object, function and enumerator declarations and definitions into one map+-- holding declarations, and three maps for object definitions, enumerator definitions and function definitions.+-- If @includeAllDecls@ is @True@ all declarations are present in the first map, otherwise only those where no corresponding definition+-- is available.+splitIdentDecls :: Bool -> Map Ident IdentDecl -> (Map Ident Decl,+ ( Map Ident Enumerator,+ Map Ident ObjDef,+ Map Ident FunDef ) )+splitIdentDecls include_all = Map.foldWithKey (if include_all then deal else deal') (Map.empty,(Map.empty,Map.empty,Map.empty))+ where+ deal ident entry (decls,defs) = (Map.insert ident (declOfDef entry) decls, addDef ident entry defs)+ deal' ident (Declaration d) (decls,defs) = (Map.insert ident d decls,defs)+ deal' ident def (decls,defs) = (decls, addDef ident def defs)+ addDef ident entry (es,os,fs) =+ case entry of+ Declaration _ -> (es,os,fs)+ EnumeratorDef e -> (Map.insert ident e es,os,fs)+ ObjectDef o -> (es,Map.insert ident o os,fs)+ FunctionDef f -> (es, os,Map.insert ident f fs)+++-- | global declaration\/definition table returned by the analysis+data GlobalDecls = GlobalDecls {+ gObjs :: Map Ident IdentDecl,+ gTags :: Map SUERef TagDef,+ gTypeDefs :: Map Ident TypeDef+ }++-- | empty global declaration table+emptyGlobalDecls :: GlobalDecls+emptyGlobalDecls = GlobalDecls Map.empty Map.empty Map.empty++-- | filter global declarations+filterGlobalDecls :: (DeclEvent -> Bool) -> GlobalDecls -> GlobalDecls+filterGlobalDecls decl_filter gmap = GlobalDecls+ {+ gObjs = Map.filter (decl_filter . DeclEvent) (gObjs gmap),+ gTags = Map.filter (decl_filter . TagEvent) (gTags gmap),+ gTypeDefs = Map.filter (decl_filter . TypeDefEvent) (gTypeDefs gmap)+ }+-- | merge global declarations+mergeGlobalDecls :: GlobalDecls -> GlobalDecls -> GlobalDecls+mergeGlobalDecls gmap1 gmap2 = GlobalDecls+ {+ gObjs = Map.union (gObjs gmap1) (gObjs gmap2),+ gTags = Map.union (gTags gmap1) (gTags gmap2),+ gTypeDefs = Map.union (gTypeDefs gmap1) (gTypeDefs gmap2)+ }+++-- * Events++-- | Declaration events+--+-- Those events are reported to callbacks, which are executed during the traversal.+data DeclEvent =+ TagEvent TagDef+ -- ^ 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+ -- ^ assembler block+ deriving ({-! CNode !-})++-- * Declarations and definitions++-- | Declarations, which aren't definitions+data Decl = Decl VarDecl NodeInfo+ deriving (Typeable, Data {-! ,CNode !-})++instance Declaration Decl where+ getVarDecl (Decl vd _) = vd++-- | Object Definitions+--+-- An object definition is a declaration together with an initializer.+--+-- 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 !-})+instance Declaration ObjDef where+ getVarDecl (ObjDef vd _ _) = vd++-- | Returns @True@ if the given object definition is tentative.+isTentative :: ObjDef -> Bool+isTentative (ObjDef decl init_opt _) | isExtDecl decl = isNothing init_opt+ | otherwise = False++-- | Function definitions+--+-- A function definition is a declaration together with a statement (the function body).+data FunDef = FunDef VarDecl Stmt NodeInfo+ deriving (Typeable, Data {-! ,CNode !-})+instance Declaration FunDef where+ getVarDecl (FunDef vd _ _) = vd+++-- | Parameter declaration+data ParamDecl = ParamDecl VarDecl NodeInfo+ | AbstractParamDecl VarDecl NodeInfo+ deriving (Typeable, Data {-! ,CNode !-} )++instance Declaration ParamDecl where+ getVarDecl (ParamDecl vd _) = vd+ getVarDecl (AbstractParamDecl vd _) = vd++-- | Struct\/Union member declaration+data MemberDecl = MemberDecl VarDecl (Maybe Expr) NodeInfo+ -- ^ @MemberDecl vardecl bitfieldsize node@+ | AnonBitField Type Expr NodeInfo+ -- ^ @AnonBitField typ size@+ deriving (Typeable, Data {-! ,CNode !-} )++instance Declaration MemberDecl where+ getVarDecl (MemberDecl vd _ _) = vd+ getVarDecl (AnonBitField ty _ _) = VarDecl NoName (DeclAttrs noFunctionAttrs NoStorage []) ty++-- | @typedef@ definitions.+--+-- The identifier is a new name for the given type.+data TypeDef = TypeDef Ident Type Attributes NodeInfo+ deriving (Typeable, Data {-! ,CNode !-} )++-- | return the idenitifier of a @typedef@+identOfTypeDef :: TypeDef -> Ident+identOfTypeDef (TypeDef ide _ _ _) = ide++-- | Generic variable declarations+data VarDecl = VarDecl VarName DeclAttrs Type+ deriving (Typeable, Data)++instance Declaration VarDecl where+ getVarDecl = id++-- @isExtDecl d@ returns true if the declaration has /linkage/+isExtDecl :: (Declaration n) => n -> Bool+isExtDecl = hasLinkage . declStorage++-- | Declaration attributes of the form @DeclAttrs isInlineFunction storage linkage attrs@+--+-- They specify the storage and linkage of a declared object.+data DeclAttrs = DeclAttrs FunctionAttrs Storage Attributes+ -- ^ @DeclAttrs fspecs storage attrs@+ deriving (Typeable, Data)++-- | get the 'Storage' of a declaration+declStorage :: (Declaration d) => d -> Storage+declStorage d = case declAttrs d of (DeclAttrs _ st _) -> st++-- | get the `function attributes' of a declaration+functionAttrs :: (Declaration d) => d -> FunctionAttrs+functionAttrs d = case declAttrs d of (DeclAttrs fa _ _) -> fa++-- Function attributes (inline, noreturn)+data FunctionAttrs = FunctionAttrs { isInline :: Bool, isNoreturn :: Bool }+ deriving (Eq, Ord, Typeable, Data)++noFunctionAttrs :: FunctionAttrs+noFunctionAttrs = FunctionAttrs { isInline = False, isNoreturn = False }+++-- In C we have+-- Identifiers can either have internal, external or no linkage+-- (same object everywhere, same object within the translation unit, unique).+-- * top-level identifiers+-- static : internal linkage (objects and function defs)+-- extern : linkage of prior declaration (if specified), external linkage otherwise+-- no-spec: external linkage+-- * storage duration+-- * static storage duration: objects with external or internal linkage, or local ones with the static keyword+-- * automatic storage duration: otherwise (register)+-- See http://publications.gbdirect.co.uk/c_book/chapter8/declarations_and_definitions.html, Table 8.1, 8.2++-- | Storage duration and linkage of a variable+data Storage = NoStorage -- ^ no storage+ | Auto Register -- ^ automatic storage (optional: register)+ | 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 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 (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 Attributes+ -- ^ a non-derived type+ | PtrType Type TypeQuals Attributes+ -- ^ pointer type+ | ArrayType Type ArraySize TypeQuals Attributes+ -- ^ array type+ | FunctionType FunType Attributes+ -- ^ function type+ | TypeDefType TypeDefRef TypeQuals Attributes+ -- ^ a defined type+ deriving (Typeable, Data)++-- | 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+ | FunTypeIncomplete Type+ deriving (Typeable, Data)++-- | 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' (@[*]@).+data ArraySize = UnknownArraySize Bool+ -- ^ @UnknownArraySize is-starred@+ | ArraySize Bool Expr+ -- ^ @FixedSizeArray is-static size-expr@+ deriving (Typeable, Data)++-- | normalized type representation+data TypeName =+ TyVoid+ | TyIntegral IntType+ | TyFloating FloatType+ | TyComplex FloatType+ | TyComp CompTypeRef+ | TyEnum EnumTypeRef+ | TyBuiltin BuiltinType+ deriving (Typeable, Data)++-- | 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 Type NodeInfo+ deriving (Typeable, Data {-! ,CNode !-})++-- | integral types (C99 6.7.2.2)+data IntType =+ TyBool+ | TyChar+ | TySChar+ | TyUChar+ | TyShort+ | TyUShort+ | TyInt+ | TyUInt+ | TyInt128+ | TyUInt128+ | TyLong+ | TyULong+ | TyLLong+ | TyULLong+ deriving (Typeable, Data, Eq, Ord)++instance Show IntType where+ show TyBool = "_Bool"+ show TyChar = "char"+ show TySChar = "signed char"+ show TyUChar = "unsigned char"+ show TyShort = "short"+ show TyUShort = "unsigned short"+ show TyInt = "int"+ show TyUInt = "unsigned int"+ show TyInt128 = "__int128"+ show TyUInt128 = "unsigned __int128"+ show TyLong = "long"+ show TyULong = "unsigned long"+ show TyLLong = "long long"+ show TyULLong = "unsigned long long"++-- | floating point type (C99 6.7.2.2)+data FloatType =+ TyFloat+ | TyDouble+ | TyLDouble+ | TyFloatN Int Bool+ deriving (Typeable, Data, Eq, Ord)++instance Show FloatType where+ show TyFloat = "float"+ show TyDouble = "double"+ show TyLDouble = "long double"+ show (TyFloatN n x) = "_Float" ++ (show n) ++ (if x then "x" else "")++-- | composite type declarations+data CompTypeRef = CompTypeRef SUERef CompTyKind NodeInfo+ 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 !-})+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 !-} )+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 undefNode)++-- | a tag to determine wheter we refer to a @struct@ or @union@, see 'CompType'.+data CompTyKind = StructTag+ | UnionTag+ deriving (Eq,Ord,Typeable,Data)++instance Show CompTyKind where+ show StructTag = "struct"+ show UnionTag = "union"++-- | Representation of C enumeration types+data EnumType = EnumType SUERef [Enumerator] Attributes NodeInfo+ -- ^ @EnumType name enumeration-constants attrs node@+ 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 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 !-})+instance Declaration Enumerator where+ getVarDecl (Enumerator ide _ enumty _) =+ VarDecl+ (VarName ide Nothing)+ (DeclAttrs noFunctionAttrs NoStorage [])+ (DirectType (typeOfEnumDef enumty) noTypeQuals noAttributes)++-- | Type qualifiers: constant, volatile and restrict+data TypeQuals = TypeQuals { constant :: Bool, volatile :: Bool,+ restrict :: Bool, atomic :: Bool,+ nullable :: Bool, nonnull :: Bool }+ deriving (Typeable, Data)++instance Eq TypeQuals where+ (==) (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) =+ c1 == c2 && v1 == v2 && r1 == r2 && a1 == a2 && n1 == n2 && nn1 == nn2++instance Ord TypeQuals where+ (<=) (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) =+ c1 <= c2 && v1 <= v2 && r1 <= r2 && a1 <= a2 && n1 <= n2 && nn1 <= nn2+++-- | no type qualifiers+noTypeQuals :: TypeQuals+noTypeQuals = TypeQuals False False False False False False++-- | merge (/&&/) two type qualifier sets+mergeTypeQuals :: TypeQuals -> TypeQuals -> TypeQuals+mergeTypeQuals (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) =+ TypeQuals (c1 && c2) (v1 && v2) (r1 && r2) (a1 && a2) (n1 && n2) (nn1 && nn2)++-- * initializers++-- | 'Initializer' is currently an alias for 'CInit'.+--+-- We're planning a normalized representation, but this depends on the implementation of+-- constant expression evaluation+type Initializer = CInit++-- | Normalized C Initializers+-- * If the expression has scalar type, the initializer is an expression+-- * If the expression has struct type, the initializer is a map from designators to initializers+-- * If the expression has array type, the initializer is a list of values+-- Not implemented yet, as it depends on constant expression evaluation+++-- * names and attributes++-- | @VarName name assembler-name@ is a name of an declared object+data VarName = VarName Ident (Maybe AsmName)+ | NoName+ deriving (Typeable, Data)+identOfVarName :: VarName -> Ident+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++-- | Assembler name (alias for @CStrLit@)+type AsmName = CStrLit++-- | @__attribute__@ annotations+--+-- Those are of the form @Attr attribute-name attribute-parameters@,+-- and serve as generic properties of some syntax tree elements.+--+-- Some examples:+--+-- * labels can be attributed with /unused/ to indicate that their not used+--+-- * struct definitions can be attributed with /packed/ to tell the compiler to use the most compact representation+--+-- * declarations can be attributed with /deprecated/+--+-- * function declarations can be attributes with /noreturn/ to tell the compiler that the function will never return,+--+-- * or with /const/ to indicate that it is a pure function+--+-- /TODO/: ultimatively, we want to parse attributes and represent them in a typed way+data Attr = Attr Ident [Expr] NodeInfo+ 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+instance Pos TagDef where+ posOf x = posOf (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 = posOf (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 Pos DeclEvent where+ posOf x = posOf (nodeInfo x)++instance CNode Decl where+ nodeInfo (Decl _ n) = n+instance Pos Decl where+ posOf x = posOf (nodeInfo x)++instance CNode ObjDef where+ nodeInfo (ObjDef _ _ n) = n+instance Pos ObjDef where+ posOf x = posOf (nodeInfo x)++instance CNode FunDef where+ nodeInfo (FunDef _ _ n) = n+instance Pos FunDef where+ posOf x = posOf (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
@@ -1,513 +1,513 @@-{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleContexts,FlexibleInstances, - PatternGuards, RankNTypes, ScopedTypeVariables #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Analysis.TravMonad --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : alpha --- Portability : ghc --- --- Monad for Traversals of the C AST. --- --- For the traversal, we maintain a symboltable and need MonadError and unique --- name generation facilities. --- 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 - handleTagDecl, handleTagDef, handleEnumeratorDef, handleTypeDef, - handleObjectDef,handleFunDef,handleVarDecl,handleParamDecl, - handleAsmBlock, - -- * Symbol table scope modification - enterPrototypeScope,leavePrototypeScope, - enterFunctionScope,leaveFunctionScope, - enterBlockScope,leaveBlockScope, - -- * Symbol table lookup (delegate) - lookupTypeDef, lookupObject, - -- * Symbol table modification - createSUERef, - -- * Additional error handling facilities - hadHardErrors,handleTravError,throwOnLeft, - astError, warn, - -- * Trav - default MonadTrav implementation - 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.RList as RList - -import Language.C.Analysis.Builtins -import Language.C.Analysis.SemError -import Language.C.Analysis.SemRep -import Language.C.Analysis.TypeUtils (sameType) -import Language.C.Analysis.DefTable hiding (enterBlockScope,leaveBlockScope, - enterFunctionScope,leaveFunctionScope) -import qualified Language.C.Analysis.DefTable as ST - -import Data.IntMap (insert) -import Data.Maybe -import Control.Applicative (Applicative(..)) -import Control.Monad (liftM, ap) -import Prelude hiding (lookup) - -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' occurred (without throwing it) - recordError :: Error e => e -> m () - -- | return the list of recorded errors - getErrors :: m [CError] - --- | 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 :: (MonadCError m, CNode t, CNode t1) => String -> t -> (DeclarationStatus t1) -> m () -checkRedef subject new_decl redecl_status = - case redecl_status of - NewDecl -> return () - Redeclared old_def -> throwTravError $ - redefinition LevelError subject DuplicateDef (nodeInfo new_decl) (nodeInfo old_def) - KindMismatch old_def -> throwTravError $ - redefinition LevelError subject DiffKindRedecl (nodeInfo new_decl) (nodeInfo old_def) - Shadowed _old_def -> return () - -- warn $ - -- redefinition LevelWarn subject ShadowedDef (nodeInfo new_decl) (nodeInfo old_def) - KeepDef _old_def -> return () - --- | forward declaration of a tag. Only necessary for name analysis, but otherwise no semantic --- consequences. -handleTagDecl :: (MonadCError m, MonadSymtab m) => TagFwdDecl -> m () -handleTagDecl decl = do - redecl <- withDefTable $ declareTag (sueRef decl) decl - checkRedef (sueRefToString $ sueRef decl) decl redecl - --- | define the given composite type or enumeration --- If there is a declaration visible, overwrite it with the definition. --- Otherwise, enter a new definition in the current namespace. --- If there is already a definition present, yield an error (redeclaration). -handleTagDef :: (MonadTrav m) => TagDef -> m () -handleTagDef def = do - redecl <- withDefTable $ defineTag (sueRef def) def - checkRedef (sueRefToString $ sueRef def) def redecl - handleDecl (TagEvent def) - -handleEnumeratorDef :: (MonadCError m, MonadSymtab m) => Enumerator -> m () -handleEnumeratorDef enumerator = do - let ident = declIdent enumerator - redecl <- withDefTable $ defineScopedIdent ident (EnumeratorDef enumerator) - checkRedef (identToString ident) ident redecl - return () - -handleTypeDef :: (MonadTrav m) => TypeDef -> m () -handleTypeDef typeDef@(TypeDef ident t1 _ _) = do - redecl <- withDefTable $ defineTypeDef ident typeDef - -- C11 6.7/3 If an identifier has no linkage, there shall be no more than - -- one declaration of the identifier (in a declarator or type specifier) - -- with the same scope and in the same name space, except that: a typedef - -- name may be redefined to denote the same type as it currently does, - -- provided that type is not a variably modified type; - case redecl of - Redeclared (Left (TypeDef _ t2 _ _)) | sameType t1 t2 -> return () - _ -> checkRedef (identToString ident) typeDef redecl - handleDecl (TypeDefEvent typeDef) - return () - -handleAsmBlock :: (MonadTrav m) => AsmBlock -> m () -handleAsmBlock asm = handleDecl (AsmEvent asm) - -redefErr :: (MonadCError m, CNode old, CNode new) => - Ident -> ErrorLevel -> new -> old -> RedefKind -> m () -redefErr name lvl new old kind = - throwTravError $ redefinition lvl (identToString name) kind (nodeInfo new) (nodeInfo old) - --- TODO: unused -_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 -_checkIdentTyRedef (Left tydef) (Redeclared old_def) = - redefErr (identOfTypeDef tydef) LevelError tydef old_def DuplicateDef -_checkIdentTyRedef (Left _tydef) _ = return () - --- 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 - -- 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 new_def old_def = - case (declLinkage new_def, declLinkage old_def) of - (NoLinkage, _) -> redefErr (declIdent new_def) LevelError new_def old_def NoLinkageOld - _ -> redefErr (declIdent new_def) LevelError new_def old_def DisagreeLinkage - - new_ty = declType def - canBeOverwritten (Declaration _) = True - canBeOverwritten (ObjectDef od) = isTentative od - canBeOverwritten _ = False - agreeOnLinkage new_def old_def - | declStorage old_def == FunLinkage InternalLinkage = True - | not (hasLinkage $ declStorage new_def) || not (hasLinkage $ declStorage old_def) = False - | (declLinkage new_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) => Bool -> Decl -> m () -handleVarDecl is_local decl = do - def <- enterDecl decl (const False) - 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. --- FIXME: I think it would be more transparent to handle parameter declarations in a special way -handleParamDecl :: (MonadTrav m) => ParamDecl -> m () -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 - handleDecl (ParamEvent pd) - --- shared impl -enterDecl :: (MonadCError m, MonadSymtab m) => Decl -> (IdentDecl -> Bool) -> m IdentDecl -enterDecl decl cond = do - let def = Declaration decl - redecl <- withDefTable $ - defineScopedIdentWhen cond (declIdent def) def - checkVarRedef def redecl - return def - --- | handle function definitions -handleFunDef :: (MonadTrav m) => Ident -> FunDef -> m () -handleFunDef ident fun_def = do - let def = FunctionDef fun_def - redecl <- withDefTable $ - defineScopedIdentWhen isDeclaration ident def - checkVarRedef def redecl - handleDecl (DeclEvent def) - -isDeclaration :: IdentDecl -> Bool -isDeclaration (Declaration _) = True -isDeclaration _ = False - -checkCompatibleTypes :: Type -> Type -> Either TypeMismatch () -checkCompatibleTypes _ _ = Right () - --- | handle object defintions (maybe tentative) -handleObjectDef :: (MonadTrav m) => Bool -> Ident -> ObjDef -> m () -handleObjectDef local ident obj_def = do - let def = ObjectDef obj_def - redecl <- withDefTable $ - defineScopedIdentWhen (shouldOverride def) ident def - checkVarRedef def redecl - handleDecl ((if local then LocalEvent else DeclEvent) def) - where - isTentativeDef (ObjectDef object_def) = isTentative object_def - isTentativeDef _ = False - shouldOverride def old | isDeclaration old = True - | not (isTentativeDef def) = True - | isTentativeDef old = True - | otherwise = False - --- * scope manipulation --- --- * file scope: outside of parameter lists and blocks (outermost) --- --- * function prototype scope --- --- * function scope: labels are visible within the entire function, and declared implicitely --- --- * block scope -updDefTable :: (MonadSymtab m) => (DefTable -> DefTable) -> m () -updDefTable f = withDefTable (\st -> ((),f st)) - -enterPrototypeScope :: (MonadSymtab m) => m () -enterPrototypeScope = updDefTable (ST.enterBlockScope) - -leavePrototypeScope :: (MonadSymtab m) => m () -leavePrototypeScope = updDefTable (ST.leaveBlockScope) - -enterFunctionScope :: (MonadSymtab m) => m () -enterFunctionScope = updDefTable (ST.enterFunctionScope) - -leaveFunctionScope :: (MonadSymtab m) => m () -leaveFunctionScope = updDefTable (ST.leaveFunctionScope) - -enterBlockScope :: (MonadSymtab m) => m () -enterBlockScope = updDefTable (ST.enterBlockScope) - -leaveBlockScope :: (MonadSymtab m) => m () -leaveBlockScope = updDefTable (ST.leaveBlockScope) - --- * Lookup - --- | lookup a type definition --- the 'wrong kind of object' is an internal error here, --- because the parser should distinguish typeDefs and other --- objects -lookupTypeDef :: (MonadCError m, MonadSymtab m) => Ident -> m Type -lookupTypeDef ident = - getDefTable >>= \symt -> - case lookupIdent ident symt of - 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: expected typedef but found "++ (objKindDescr d) - ++ " (for identifier `" ++ identToString ident ++ "')" - - --- | lookup an object, function or enumerator -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 -> 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 - --- * inserting declarations - --- | create a reference to a struct\/union\/enum --- --- 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 :: (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 :: (MonadCError m) => m a -> m (Maybe a) -handleTravError a = liftM Just a `catchTravError` (\e -> recordError e >> return Nothing) - --- | check wheter non-recoverable errors occurred -hadHardErrors :: [CError] -> Bool -hadHardErrors = any isHardError - --- | raise an error caused by a malformed AST -astError :: (MonadCError m) => NodeInfo -> String -> m a -astError node msg = throwTravError $ invalidAST node msg - --- | raise an error based on an Either argument -throwOnLeft :: (MonadCError m, Error e) => Either e a -> m a -throwOnLeft (Left err) = throwTravError err -throwOnLeft (Right v) = return v - -warn :: (Error e, MonadCError m) => e -> m () -warn err = recordError (changeErrorLevel err LevelWarn) - --- * The Trav datatype - --- | simple traversal monad, providing user state and callbacks -newtype Trav s a = Trav { unTrav :: TravState s -> Either CError (a, TravState s) } -modify :: (TravState s -> TravState s) -> Trav s () -modify f = Trav (\s -> Right ((),f s)) -gets :: (TravState s -> a) -> Trav s a -gets f = Trav (\s -> Right (f s, s)) -get :: Trav s (TravState s) -get = Trav (\s -> Right (s,s)) -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 - Left trav_err -> Left [trav_err] - Right (v, ts) | hadHardErrors (travErrors ts) -> Left (travErrors ts) - | otherwise -> Right (v,ts) - where - action = do withDefTable (const ((), builtins)) - traversal - -runTrav_ :: Trav () a -> Either [CError] (a,[CError]) -runTrav_ t = fmap fst . runTrav () $ - do r <- t - es <- getErrors - return (r,es) - -withExtDeclHandler :: Trav s a -> (DeclEvent -> Trav s ()) -> Trav s a -withExtDeclHandler action handler = - do modify $ \st -> st { doHandleExtDecl = handler } - action - -instance Functor (Trav s) where - fmap = liftM - -instance Applicative (Trav s) where - pure = return - (<*>) = ap - -instance Monad (Trav s) where - return x = Trav (\s -> Right (x,s)) - m >>= k = Trav (\s -> case unTrav m s of - Right (x,s1) -> unTrav (k x) s1 - Left e -> Left e) - -instance MonadName (Trav s) where - -- unique name generation - genName = generateName - -instance MonadSymtab (Trav s) where - -- symbol table handling - getDefTable = gets symbolTable - withDefTable f = do - ts <- get - let (r,symt') = f (symbolTable ts) - put $ ts { symbolTable = symt' } - return r - -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, - options :: TravOptions - } - -travErrors :: TravState s -> [CError] -travErrors = RList.reverse . rerrors - -initTravState :: s -> TravState s -initTravState userst = - TravState { - symbolTable = emptyDefTable, - rerrors = RList.empty, - nameGenerator = newNameSupply, - doHandleExtDecl = const (return ()), - 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 = - get >>= \ts -> - do let (new_name : gen') = nameGenerator ts - put $ ts { nameGenerator = gen'} - return new_name - --- * helpers -mapMaybeM :: (Monad m) => (Maybe a) -> (a -> m b) -> m (Maybe b) -mapMaybeM m f = maybe (return Nothing) (liftM Just . f) m - -maybeM :: (Monad m) => (Maybe a) -> (a -> m ()) -> m () -maybeM m f = maybe (return ()) f m - -mapSndM :: (Monad m) => (b -> m c) -> (a,b) -> m (a,c) -mapSndM f (a,b) = liftM ((,) a) (f b) - -concatMapM :: (Monad m) => (a -> m [b]) -> [a] -> m [b] -concatMapM f = liftM concat . mapM f +{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleContexts,FlexibleInstances,+ PatternGuards, RankNTypes, ScopedTypeVariables #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Analysis.TravMonad+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : alpha+-- Portability : ghc+--+-- Monad for Traversals of the C AST.+--+-- For the traversal, we maintain a symboltable and need MonadError and unique+-- name generation facilities.+-- 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+ handleTagDecl, handleTagDef, handleEnumeratorDef, handleTypeDef,+ handleObjectDef,handleFunDef,handleVarDecl,handleParamDecl,+ handleAsmBlock,+ -- * Symbol table scope modification+ enterPrototypeScope,leavePrototypeScope,+ enterFunctionScope,leaveFunctionScope,+ enterBlockScope,leaveBlockScope,+ -- * Symbol table lookup (delegate)+ lookupTypeDef, lookupObject,+ -- * Symbol table modification+ createSUERef,+ -- * Additional error handling facilities+ hadHardErrors,handleTravError,throwOnLeft,+ astError, warn,+ -- * Trav - default MonadTrav implementation+ 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.RList as RList++import Language.C.Analysis.Builtins+import Language.C.Analysis.SemError+import Language.C.Analysis.SemRep+import Language.C.Analysis.TypeUtils (sameType)+import Language.C.Analysis.DefTable hiding (enterBlockScope,leaveBlockScope,+ enterFunctionScope,leaveFunctionScope)+import qualified Language.C.Analysis.DefTable as ST++import Data.IntMap (insert)+import Data.Maybe+import Control.Applicative (Applicative(..))+import Control.Monad (liftM, ap)+import Prelude hiding (lookup)++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' occurred (without throwing it)+ recordError :: Error e => e -> m ()+ -- | return the list of recorded errors+ getErrors :: m [CError]++-- | 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 :: (MonadCError m, CNode t, CNode t1) => String -> t -> (DeclarationStatus t1) -> m ()+checkRedef subject new_decl redecl_status =+ case redecl_status of+ NewDecl -> return ()+ Redeclared old_def -> throwTravError $+ redefinition LevelError subject DuplicateDef (nodeInfo new_decl) (nodeInfo old_def)+ KindMismatch old_def -> throwTravError $+ redefinition LevelError subject DiffKindRedecl (nodeInfo new_decl) (nodeInfo old_def)+ Shadowed _old_def -> return ()+ -- warn $+ -- redefinition LevelWarn subject ShadowedDef (nodeInfo new_decl) (nodeInfo old_def)+ KeepDef _old_def -> return ()++-- | forward declaration of a tag. Only necessary for name analysis, but otherwise no semantic+-- consequences.+handleTagDecl :: (MonadCError m, MonadSymtab m) => TagFwdDecl -> m ()+handleTagDecl decl = do+ redecl <- withDefTable $ declareTag (sueRef decl) decl+ checkRedef (sueRefToString $ sueRef decl) decl redecl++-- | define the given composite type or enumeration+-- If there is a declaration visible, overwrite it with the definition.+-- Otherwise, enter a new definition in the current namespace.+-- If there is already a definition present, yield an error (redeclaration).+handleTagDef :: (MonadTrav m) => TagDef -> m ()+handleTagDef def = do+ redecl <- withDefTable $ defineTag (sueRef def) def+ checkRedef (sueRefToString $ sueRef def) def redecl+ handleDecl (TagEvent def)++handleEnumeratorDef :: (MonadCError m, MonadSymtab m) => Enumerator -> m ()+handleEnumeratorDef enumerator = do+ let ident = declIdent enumerator+ redecl <- withDefTable $ defineScopedIdent ident (EnumeratorDef enumerator)+ checkRedef (identToString ident) ident redecl+ return ()++handleTypeDef :: (MonadTrav m) => TypeDef -> m ()+handleTypeDef typeDef@(TypeDef ident t1 _ _) = do+ redecl <- withDefTable $ defineTypeDef ident typeDef+ -- C11 6.7/3 If an identifier has no linkage, there shall be no more than+ -- one declaration of the identifier (in a declarator or type specifier)+ -- with the same scope and in the same name space, except that: a typedef+ -- name may be redefined to denote the same type as it currently does,+ -- provided that type is not a variably modified type;+ case redecl of+ Redeclared (Left (TypeDef _ t2 _ _)) | sameType t1 t2 -> return ()+ _ -> checkRedef (identToString ident) typeDef redecl+ handleDecl (TypeDefEvent typeDef)+ return ()++handleAsmBlock :: (MonadTrav m) => AsmBlock -> m ()+handleAsmBlock asm = handleDecl (AsmEvent asm)++redefErr :: (MonadCError m, CNode old, CNode new) =>+ Ident -> ErrorLevel -> new -> old -> RedefKind -> m ()+redefErr name lvl new old kind =+ throwTravError $ redefinition lvl (identToString name) kind (nodeInfo new) (nodeInfo old)++-- TODO: unused+_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+_checkIdentTyRedef (Left tydef) (Redeclared old_def) =+ redefErr (identOfTypeDef tydef) LevelError tydef old_def DuplicateDef+_checkIdentTyRedef (Left _tydef) _ = return ()++-- 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+ -- 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 new_def old_def =+ case (declLinkage new_def, declLinkage old_def) of+ (NoLinkage, _) -> redefErr (declIdent new_def) LevelError new_def old_def NoLinkageOld+ _ -> redefErr (declIdent new_def) LevelError new_def old_def DisagreeLinkage++ new_ty = declType def+ canBeOverwritten (Declaration _) = True+ canBeOverwritten (ObjectDef od) = isTentative od+ canBeOverwritten _ = False+ agreeOnLinkage new_def old_def+ | declStorage old_def == FunLinkage InternalLinkage = True+ | not (hasLinkage $ declStorage new_def) || not (hasLinkage $ declStorage old_def) = False+ | (declLinkage new_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) => Bool -> Decl -> m ()+handleVarDecl is_local decl = do+ def <- enterDecl decl (const False)+ 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.+-- FIXME: I think it would be more transparent to handle parameter declarations in a special way+handleParamDecl :: (MonadTrav m) => ParamDecl -> m ()+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+ handleDecl (ParamEvent pd)++-- shared impl+enterDecl :: (MonadCError m, MonadSymtab m) => Decl -> (IdentDecl -> Bool) -> m IdentDecl+enterDecl decl cond = do+ let def = Declaration decl+ redecl <- withDefTable $+ defineScopedIdentWhen cond (declIdent def) def+ checkVarRedef def redecl+ return def++-- | handle function definitions+handleFunDef :: (MonadTrav m) => Ident -> FunDef -> m ()+handleFunDef ident fun_def = do+ let def = FunctionDef fun_def+ redecl <- withDefTable $+ defineScopedIdentWhen isDeclaration ident def+ checkVarRedef def redecl+ handleDecl (DeclEvent def)++isDeclaration :: IdentDecl -> Bool+isDeclaration (Declaration _) = True+isDeclaration _ = False++checkCompatibleTypes :: Type -> Type -> Either TypeMismatch ()+checkCompatibleTypes _ _ = Right ()++-- | handle object defintions (maybe tentative)+handleObjectDef :: (MonadTrav m) => Bool -> Ident -> ObjDef -> m ()+handleObjectDef local ident obj_def = do+ let def = ObjectDef obj_def+ redecl <- withDefTable $+ defineScopedIdentWhen (shouldOverride def) ident def+ checkVarRedef def redecl+ handleDecl ((if local then LocalEvent else DeclEvent) def)+ where+ isTentativeDef (ObjectDef object_def) = isTentative object_def+ isTentativeDef _ = False+ shouldOverride def old | isDeclaration old = True+ | not (isTentativeDef def) = True+ | isTentativeDef old = True+ | otherwise = False++-- * scope manipulation+--+-- * file scope: outside of parameter lists and blocks (outermost)+--+-- * function prototype scope+--+-- * function scope: labels are visible within the entire function, and declared implicitely+--+-- * block scope+updDefTable :: (MonadSymtab m) => (DefTable -> DefTable) -> m ()+updDefTable f = withDefTable (\st -> ((),f st))++enterPrototypeScope :: (MonadSymtab m) => m ()+enterPrototypeScope = updDefTable (ST.enterBlockScope)++leavePrototypeScope :: (MonadSymtab m) => m ()+leavePrototypeScope = updDefTable (ST.leaveBlockScope)++enterFunctionScope :: (MonadSymtab m) => m ()+enterFunctionScope = updDefTable (ST.enterFunctionScope)++leaveFunctionScope :: (MonadSymtab m) => m ()+leaveFunctionScope = updDefTable (ST.leaveFunctionScope)++enterBlockScope :: (MonadSymtab m) => m ()+enterBlockScope = updDefTable (ST.enterBlockScope)++leaveBlockScope :: (MonadSymtab m) => m ()+leaveBlockScope = updDefTable (ST.leaveBlockScope)++-- * Lookup++-- | lookup a type definition+-- the 'wrong kind of object' is an internal error here,+-- because the parser should distinguish typeDefs and other+-- objects+lookupTypeDef :: (MonadCError m, MonadSymtab m) => Ident -> m Type+lookupTypeDef ident =+ getDefTable >>= \symt ->+ case lookupIdent ident symt of+ 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: expected typedef but found "++ (objKindDescr d)+ ++ " (for identifier `" ++ identToString ident ++ "')"+++-- | lookup an object, function or enumerator+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 -> 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++-- * inserting declarations++-- | create a reference to a struct\/union\/enum+--+-- 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 :: (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 :: (MonadCError m) => m a -> m (Maybe a)+handleTravError a = liftM Just a `catchTravError` (\e -> recordError e >> return Nothing)++-- | check wheter non-recoverable errors occurred+hadHardErrors :: [CError] -> Bool+hadHardErrors = any isHardError++-- | raise an error caused by a malformed AST+astError :: (MonadCError m) => NodeInfo -> String -> m a+astError node msg = throwTravError $ invalidAST node msg++-- | raise an error based on an Either argument+throwOnLeft :: (MonadCError m, Error e) => Either e a -> m a+throwOnLeft (Left err) = throwTravError err+throwOnLeft (Right v) = return v++warn :: (Error e, MonadCError m) => e -> m ()+warn err = recordError (changeErrorLevel err LevelWarn)++-- * The Trav datatype++-- | simple traversal monad, providing user state and callbacks+newtype Trav s a = Trav { unTrav :: TravState s -> Either CError (a, TravState s) }+modify :: (TravState s -> TravState s) -> Trav s ()+modify f = Trav (\s -> Right ((),f s))+gets :: (TravState s -> a) -> Trav s a+gets f = Trav (\s -> Right (f s, s))+get :: Trav s (TravState s)+get = Trav (\s -> Right (s,s))+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+ Left trav_err -> Left [trav_err]+ Right (v, ts) | hadHardErrors (travErrors ts) -> Left (travErrors ts)+ | otherwise -> Right (v,ts)+ where+ action = do withDefTable (const ((), builtins))+ traversal++runTrav_ :: Trav () a -> Either [CError] (a,[CError])+runTrav_ t = fmap fst . runTrav () $+ do r <- t+ es <- getErrors+ return (r,es)++withExtDeclHandler :: Trav s a -> (DeclEvent -> Trav s ()) -> Trav s a+withExtDeclHandler action handler =+ do modify $ \st -> st { doHandleExtDecl = handler }+ action++instance Functor (Trav s) where+ fmap = liftM++instance Applicative (Trav s) where+ pure = return+ (<*>) = ap++instance Monad (Trav s) where+ return x = Trav (\s -> Right (x,s))+ m >>= k = Trav (\s -> case unTrav m s of+ Right (x,s1) -> unTrav (k x) s1+ Left e -> Left e)++instance MonadName (Trav s) where+ -- unique name generation+ genName = generateName++instance MonadSymtab (Trav s) where+ -- symbol table handling+ getDefTable = gets symbolTable+ withDefTable f = do+ ts <- get+ let (r,symt') = f (symbolTable ts)+ put $ ts { symbolTable = symt' }+ return r++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,+ options :: TravOptions+ }++travErrors :: TravState s -> [CError]+travErrors = RList.reverse . rerrors++initTravState :: s -> TravState s+initTravState userst =+ TravState {+ symbolTable = emptyDefTable,+ rerrors = RList.empty,+ nameGenerator = newNameSupply,+ doHandleExtDecl = const (return ()),+ 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 =+ get >>= \ts ->+ do let (new_name : gen') = nameGenerator ts+ put $ ts { nameGenerator = gen'}+ return new_name++-- * helpers+mapMaybeM :: (Monad m) => (Maybe a) -> (a -> m b) -> m (Maybe b)+mapMaybeM m f = maybe (return Nothing) (liftM Just . f) m++maybeM :: (Monad m) => (Maybe a) -> (a -> m ()) -> m ()+maybeM m f = maybe (return ()) f m++mapSndM :: (Monad m) => (b -> m c) -> (a,b) -> m (a,c)+mapSndM f (a,b) = liftM ((,) a) (f b)++concatMapM :: (Monad m) => (a -> m [b]) -> [a] -> m [b]+concatMapM f = liftM concat . mapM f
src/Language/C/Analysis/TypeCheck.hs view
@@ -1,446 +1,446 @@-{-# LANGUAGE FlexibleInstances, CPP #-} -module Language.C.Analysis.TypeCheck where - -import Control.Monad -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.DefTable -import Language.C.Analysis.SemRep -import Language.C.Analysis.TravMonad -import Language.C.Analysis.TypeConversions -import Language.C.Analysis.TypeUtils -import Language.C.Analysis.Debug () -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 = Left $ "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 _ _ _ -> Right () - PtrType _ _ _ -> Right () - ArrayType _ _ _ _ -> Right () -- because it's just a pointer - t' -> Left $ - "expected scalar type, got: " - ++ pType t ++ " (" ++ pType t' ++ ")" - -checkIntegral :: Type -> Either String () -checkIntegral t | isIntegralType (canonicalType t) = Right () - | otherwise = Left $ - "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 = void$ compositeType t1 t2 - --- | Determine the composite type of two compatible types. -compositeType :: Type -> Type -> Either String Type -compositeType t1 (DirectType (TyBuiltin TyAny) _ _) = Right t1 -compositeType (DirectType (TyBuiltin TyAny) _ _) t2 = Right t2 -compositeType t1@(DirectType tn1 q1 a1) t2@(DirectType tn2 q2 a2) = - do tn <- case (tn1, tn2) of - (TyVoid, TyVoid) -> Right TyVoid - (TyIntegral _, TyEnum _) -> Right tn1 - (TyEnum _, TyIntegral _) -> Right tn2 - (TyIntegral i1, TyIntegral i2) -> - Right $ TyIntegral (intConversion i1 i2) - (TyFloating f1, TyFloating f2) -> - Right $ TyFloating (floatConversion f1 f2) - (TyComplex f1, TyComplex f2) -> - Right $ TyComplex (floatConversion f1 f2) - (TyComp c1, TyComp c2) -> - do when (sueRef c1 /= sueRef c2) $ - Left $ "incompatible composite types: " - ++ pType t1 ++ ", " ++ pType t2 - Right tn1 - (TyEnum e1, TyEnum e2) -> - do when (sueRef e1 /= sueRef e2) $ - Left $ "incompatible enumeration types: " - ++ pType t1 ++ ", " ++ pType t2 - Right $ TyEnum e1 - (TyBuiltin TyVaList, TyBuiltin TyVaList) -> - Right $ TyBuiltin TyVaList - (TyBuiltin _, TyBuiltin _) -> - Left $ "incompatible builtin types: " - ++ pType t1 ++ ", " ++ pType t2 - (_, _) -> Left $ "incompatible direct types: " - ++ pType t1 ++ ", " ++ pType t2 - Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2) -compositeType (PtrType t1 q1 a1) (PtrType (DirectType TyVoid _ _) q2 _) = - Right $ PtrType t1 (mergeTypeQuals q1 q2) a1 -compositeType (PtrType (DirectType TyVoid _ _) q1 _) (PtrType t2 q2 a2) = - Right $ PtrType t2 (mergeTypeQuals q1 q2) a2 -compositeType (PtrType t1 q1 a1) t2 | isIntegralType t2 = - Right $ PtrType t1 (mergeTypeQuals q1 (typeQuals t2)) a1 -compositeType t1 (PtrType t2 q2 a2) | isIntegralType t1 = - Right $ PtrType t2 (mergeTypeQuals (typeQuals t1) q2) a2 -compositeType (ArrayType t1 _sz1 q1 a1) t2 | isIntegralType t2 = - Right $ PtrType t1 q1 a1 -compositeType t1 (ArrayType t2 _sz2 q2 a2) | isIntegralType t1 = - Right $ 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 - Right (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) - Right (PtrType t quals attrs) -compositeType (TypeDefType tdr1 _q1 _a1) (TypeDefType tdr2 _q2 _a2) = - case (tdr1, tdr2) of - (TypeDefRef _ t1 _, TypeDefRef _ t2 _) -> - compositeType t1 t2 -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) $ - Left "different numbers of arguments in function types" -} - args <- zipWithM compositeParamDecl args1 args2 - when (varargs1 /= varargs2) $ - Left "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 - Right (FunctionType (FunTypeIncomplete rt) (mergeAttrs attrs1 attrs2)) - where doFunType rt1 rt2 args varargs = - do rt <- compositeType rt1 rt2 - Right (FunctionType - (FunType rt args varargs) - (mergeAttrs attrs1 attrs2)) -compositeType t1 t2 = Left $ "incompatible types: " - ++ pType t1 ++ ", " ++ pType t2 - --- XXX: this may not be correct -compositeSize :: ArraySize -> ArraySize -> Either String ArraySize -compositeSize (UnknownArraySize _) s2 = Right s2 -compositeSize s1 (UnknownArraySize _) = Right s1 -compositeSize (ArraySize s1 e1) (ArraySize s2 e2) - | s1 == s2 && sizeEqual e1 e2 = Right $ ArraySize s1 e1 - | otherwise = Right $ 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') - Right $ 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 - Right (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 _ _, _) -> Right () - (_, _) -> 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) _ _, _) -> Right () - (_, DirectType (TyBuiltin TyAny) _ _) -> Right () - -- XXX: check qualifiers - (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> Right () - -- XXX: check qualifiers - (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right () - (PtrType _ _ _, t2') | isIntegralType t2' -> Right () - (t1', t2') | isPointerType t1' && isPointerType t2' -> - compatible (baseType t1') (baseType t2') - --unless (typeQuals t2 <= typeQuals t1) $ - -- Left $ - -- "incompatible qualifiers in pointer assignment: " - -- ++ pType t1 ++ ", " ++ pType t2 - (DirectType (TyComp c1) _ _, DirectType (TyComp c2) _ _) - | sueRef c1 == sueRef c2 -> Right () - | otherwise -> Left $ - "incompatible compound types in assignment: " - ++ pType t1 ++ ", " ++ pType t2 - (DirectType (TyBuiltin TyVaList) _ _, DirectType (TyBuiltin TyVaList) _ _) -> - Right () - (DirectType tn1 _ _, DirectType tn2 _ _) - | isJust (arithmeticConversion tn1 tn2) -> Right () - | otherwise -> Left $ "incompatible direct types in assignment: " - ++ pType t1 ++ ", " ++ pType t2 - (t1', t2') -> compatible t1' t2' -assignCompatible op t1 t2 = void$ binopType (assignBinop op) t1 t2 - --- | 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' >> Right boolType - | isCmpOp op -> - case (t1', t2') of - (DirectType tn1 _ _, DirectType tn2 _ _) -> - case arithmeticConversion tn1 tn2 of - Just _ -> Right boolType - Nothing -> Left $ render $ - text "incompatible arithmetic types in comparison: " - <+> pretty t1 <+> text "and" <+> pretty t2 - (PtrType (DirectType TyVoid _ _) _ _, _) - | isPointerType t2' -> Right boolType - (_, PtrType (DirectType TyVoid _ _) _ _) - | isPointerType t1' -> Right boolType - (_, _) - | isPointerType t1' && isIntegralType t2' -> Right boolType - | isIntegralType t1' && isPointerType t2' -> Right boolType - | isPointerType t1' && isPointerType t2' -> - compatible t1' t2' >> Right boolType - (_, _) -> Left "incompatible types in comparison" - (CSubOp, ArrayType t1' _ _ _, ArrayType t2' _ _ _) -> - compatible t1' t2' >> Right ptrDiffType - (CSubOp, ArrayType t1' _ _ _, PtrType t2' _ _) -> - compatible t1' t2' >> Right ptrDiffType - (CSubOp, PtrType t1' _ _, ArrayType t2' _ _ _) -> - compatible t1' t2' >> Right ptrDiffType - (CSubOp, PtrType t1' _ _, PtrType t2' _ _) -> - compatible t1' t2' >> Right ptrDiffType - (_, PtrType _ _ _, t2') - | isPtrOp op && isIntegralType t2' -> Right t1 - | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op) - (CAddOp, t1', PtrType _ _ _) | isIntegralType t1' -> Right t2 - (_, ArrayType _ _ _ _, t2') - | isPtrOp op && isIntegralType t2' -> Right t1 - | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op) - (CAddOp, t1', ArrayType _ _ _ _) | isIntegralType t1' -> Right t2 - (_, DirectType tn1 q1 a1, DirectType tn2 q2 a2) -> - do when (isBitOp op) (checkIntegral t1 >> checkIntegral t2) - case arithmeticConversion tn1 tn2 of - Just tn -> Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2) - Nothing -> Left $ render $ - text "invalid binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2 - (_, _, _) -> Left $ 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' -> Right t2 - (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right t1 - (ArrayType t1' _ q1 a1, ArrayType t2' _ q2 a2) -> - do t <- compositeType t1' t2' - Right $ 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 -> Right $ 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 _ _) = Right t -derefType (ArrayType t _ _ _) = Right t -derefType t = - -- XXX: is it good to use canonicalType here? - case canonicalType t of - PtrType t' _ _ -> Right t' - ArrayType t' _ _ _ -> Right t' - _ -> Left $ "dereferencing non-pointer: " ++ pType t - -varAddrType :: IdentDecl -> Either String Type -varAddrType d = - do case declStorage d of - Auto True -> Left "address of register variable" - _ -> Right () - case t of - ArrayType _ _ q a -> Right $ PtrType t q a - _ -> Right $ 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 +{-# LANGUAGE FlexibleInstances, CPP #-}+module Language.C.Analysis.TypeCheck where++import Control.Monad+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.DefTable+import Language.C.Analysis.SemRep+import Language.C.Analysis.TravMonad+import Language.C.Analysis.TypeConversions+import Language.C.Analysis.TypeUtils+import Language.C.Analysis.Debug ()+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 = Left $ "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 _ _ _ -> Right ()+ PtrType _ _ _ -> Right ()+ ArrayType _ _ _ _ -> Right () -- because it's just a pointer+ t' -> Left $+ "expected scalar type, got: "+ ++ pType t ++ " (" ++ pType t' ++ ")"++checkIntegral :: Type -> Either String ()+checkIntegral t | isIntegralType (canonicalType t) = Right ()+ | otherwise = Left $+ "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 = void$ compositeType t1 t2++-- | Determine the composite type of two compatible types.+compositeType :: Type -> Type -> Either String Type+compositeType t1 (DirectType (TyBuiltin TyAny) _ _) = Right t1+compositeType (DirectType (TyBuiltin TyAny) _ _) t2 = Right t2+compositeType t1@(DirectType tn1 q1 a1) t2@(DirectType tn2 q2 a2) =+ do tn <- case (tn1, tn2) of+ (TyVoid, TyVoid) -> Right TyVoid+ (TyIntegral _, TyEnum _) -> Right tn1+ (TyEnum _, TyIntegral _) -> Right tn2+ (TyIntegral i1, TyIntegral i2) ->+ Right $ TyIntegral (intConversion i1 i2)+ (TyFloating f1, TyFloating f2) ->+ Right $ TyFloating (floatConversion f1 f2)+ (TyComplex f1, TyComplex f2) ->+ Right $ TyComplex (floatConversion f1 f2)+ (TyComp c1, TyComp c2) ->+ do when (sueRef c1 /= sueRef c2) $+ Left $ "incompatible composite types: "+ ++ pType t1 ++ ", " ++ pType t2+ Right tn1+ (TyEnum e1, TyEnum e2) ->+ do when (sueRef e1 /= sueRef e2) $+ Left $ "incompatible enumeration types: "+ ++ pType t1 ++ ", " ++ pType t2+ Right $ TyEnum e1+ (TyBuiltin TyVaList, TyBuiltin TyVaList) ->+ Right $ TyBuiltin TyVaList+ (TyBuiltin _, TyBuiltin _) ->+ Left $ "incompatible builtin types: "+ ++ pType t1 ++ ", " ++ pType t2+ (_, _) -> Left $ "incompatible direct types: "+ ++ pType t1 ++ ", " ++ pType t2+ Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)+compositeType (PtrType t1 q1 a1) (PtrType (DirectType TyVoid _ _) q2 _) =+ Right $ PtrType t1 (mergeTypeQuals q1 q2) a1+compositeType (PtrType (DirectType TyVoid _ _) q1 _) (PtrType t2 q2 a2) =+ Right $ PtrType t2 (mergeTypeQuals q1 q2) a2+compositeType (PtrType t1 q1 a1) t2 | isIntegralType t2 =+ Right $ PtrType t1 (mergeTypeQuals q1 (typeQuals t2)) a1+compositeType t1 (PtrType t2 q2 a2) | isIntegralType t1 =+ Right $ PtrType t2 (mergeTypeQuals (typeQuals t1) q2) a2+compositeType (ArrayType t1 _sz1 q1 a1) t2 | isIntegralType t2 =+ Right $ PtrType t1 q1 a1+compositeType t1 (ArrayType t2 _sz2 q2 a2) | isIntegralType t1 =+ Right $ 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+ Right (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)+ Right (PtrType t quals attrs)+compositeType (TypeDefType tdr1 _q1 _a1) (TypeDefType tdr2 _q2 _a2) =+ case (tdr1, tdr2) of+ (TypeDefRef _ t1 _, TypeDefRef _ t2 _) ->+ compositeType t1 t2+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) $+ Left "different numbers of arguments in function types" -}+ args <- zipWithM compositeParamDecl args1 args2+ when (varargs1 /= varargs2) $+ Left "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+ Right (FunctionType (FunTypeIncomplete rt) (mergeAttrs attrs1 attrs2))+ where doFunType rt1 rt2 args varargs =+ do rt <- compositeType rt1 rt2+ Right (FunctionType+ (FunType rt args varargs)+ (mergeAttrs attrs1 attrs2))+compositeType t1 t2 = Left $ "incompatible types: "+ ++ pType t1 ++ ", " ++ pType t2++-- XXX: this may not be correct+compositeSize :: ArraySize -> ArraySize -> Either String ArraySize+compositeSize (UnknownArraySize _) s2 = Right s2+compositeSize s1 (UnknownArraySize _) = Right s1+compositeSize (ArraySize s1 e1) (ArraySize s2 e2)+ | s1 == s2 && sizeEqual e1 e2 = Right $ ArraySize s1 e1+ | otherwise = Right $ 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')+ Right $ 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+ Right (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 _ _, _) -> Right ()+ (_, _) -> 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) _ _, _) -> Right ()+ (_, DirectType (TyBuiltin TyAny) _ _) -> Right ()+ -- XXX: check qualifiers+ (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> Right ()+ -- XXX: check qualifiers+ (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right ()+ (PtrType _ _ _, t2') | isIntegralType t2' -> Right ()+ (t1', t2') | isPointerType t1' && isPointerType t2' ->+ compatible (baseType t1') (baseType t2')+ --unless (typeQuals t2 <= typeQuals t1) $+ -- Left $+ -- "incompatible qualifiers in pointer assignment: "+ -- ++ pType t1 ++ ", " ++ pType t2+ (DirectType (TyComp c1) _ _, DirectType (TyComp c2) _ _)+ | sueRef c1 == sueRef c2 -> Right ()+ | otherwise -> Left $+ "incompatible compound types in assignment: "+ ++ pType t1 ++ ", " ++ pType t2+ (DirectType (TyBuiltin TyVaList) _ _, DirectType (TyBuiltin TyVaList) _ _) ->+ Right ()+ (DirectType tn1 _ _, DirectType tn2 _ _)+ | isJust (arithmeticConversion tn1 tn2) -> Right ()+ | otherwise -> Left $ "incompatible direct types in assignment: "+ ++ pType t1 ++ ", " ++ pType t2+ (t1', t2') -> compatible t1' t2'+assignCompatible op t1 t2 = void$ binopType (assignBinop op) t1 t2++-- | 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' >> Right boolType+ | isCmpOp op ->+ case (t1', t2') of+ (DirectType tn1 _ _, DirectType tn2 _ _) ->+ case arithmeticConversion tn1 tn2 of+ Just _ -> Right boolType+ Nothing -> Left $ render $+ text "incompatible arithmetic types in comparison: "+ <+> pretty t1 <+> text "and" <+> pretty t2+ (PtrType (DirectType TyVoid _ _) _ _, _)+ | isPointerType t2' -> Right boolType+ (_, PtrType (DirectType TyVoid _ _) _ _)+ | isPointerType t1' -> Right boolType+ (_, _)+ | isPointerType t1' && isIntegralType t2' -> Right boolType+ | isIntegralType t1' && isPointerType t2' -> Right boolType+ | isPointerType t1' && isPointerType t2' ->+ compatible t1' t2' >> Right boolType+ (_, _) -> Left "incompatible types in comparison"+ (CSubOp, ArrayType t1' _ _ _, ArrayType t2' _ _ _) ->+ compatible t1' t2' >> Right ptrDiffType+ (CSubOp, ArrayType t1' _ _ _, PtrType t2' _ _) ->+ compatible t1' t2' >> Right ptrDiffType+ (CSubOp, PtrType t1' _ _, ArrayType t2' _ _ _) ->+ compatible t1' t2' >> Right ptrDiffType+ (CSubOp, PtrType t1' _ _, PtrType t2' _ _) ->+ compatible t1' t2' >> Right ptrDiffType+ (_, PtrType _ _ _, t2')+ | isPtrOp op && isIntegralType t2' -> Right t1+ | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op)+ (CAddOp, t1', PtrType _ _ _) | isIntegralType t1' -> Right t2+ (_, ArrayType _ _ _ _, t2')+ | isPtrOp op && isIntegralType t2' -> Right t1+ | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op)+ (CAddOp, t1', ArrayType _ _ _ _) | isIntegralType t1' -> Right t2+ (_, DirectType tn1 q1 a1, DirectType tn2 q2 a2) ->+ do when (isBitOp op) (checkIntegral t1 >> checkIntegral t2)+ case arithmeticConversion tn1 tn2 of+ Just tn -> Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)+ Nothing -> Left $ render $+ text "invalid binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2+ (_, _, _) -> Left $ 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' -> Right t2+ (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right t1+ (ArrayType t1' _ q1 a1, ArrayType t2' _ q2 a2) ->+ do t <- compositeType t1' t2'+ Right $ 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 -> Right $ 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 _ _) = Right t+derefType (ArrayType t _ _ _) = Right t+derefType t =+ -- XXX: is it good to use canonicalType here?+ case canonicalType t of+ PtrType t' _ _ -> Right t'+ ArrayType t' _ _ _ -> Right t'+ _ -> Left $ "dereferencing non-pointer: " ++ pType t++varAddrType :: IdentDecl -> Either String Type+varAddrType d =+ do case declStorage d of+ Auto True -> Left "address of register variable"+ _ -> Right ()+ case t of+ ArrayType _ _ q a -> Right $ PtrType t q a+ _ -> Right $ 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
@@ -1,39 +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) - +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
@@ -1,343 +1,343 @@-module Language.C.Analysis.TypeUtils ( - -- * Constructors - integral, - floating, - simplePtr, - uint16_tType, - uint32_tType, - uint64_tType, - 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, - -- * Type comparisons - sameType, - -- * Other utilities - getIntType, - getFloatType -) where - -import Language.C.Analysis.SemRep -import Language.C.Data.Node (CNode(..)) -import Language.C.Syntax.AST (CExpression (..), CConstant (..)) -import Language.C.Syntax.Constants - --- | 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 (noTypeQuals { constant = True }) [] - --- | The underlying type for @uint16_t@. For now, this is just @unsigned short@. -uint16_tType :: Type -uint16_tType = integral TyUShort - --- | The underlying type for @uint32_t@. For now, this is just @unsigned int@. -uint32_tType :: Type -uint32_tType = integral TyUInt - --- | The underlying type for @uint64_t@. For now, this is just @unsigned long long@. -uint64_tType :: Type -uint64_tType = integral TyULLong - --- | 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) - (noTypeQuals { constant = True }) - 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 _ actual_ty _) _ _ -> isFunctionType actual_ty - 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 _ 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 _ 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 _ 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 _ t _) q a) = - (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q)) - (deepDerefTypeDef t) -deepDerefTypeDef t = t - --- | True iff Type is a variable length array or a derived type thereof. --- Variably modified types have function or block scope, so only some --- constructions are possible. -isVariablyModifiedType :: Type -> Bool -isVariablyModifiedType t = - case derefTypeDef t of - TypeDefType {} -> error "impossible: derefTypeDef t returned a TypeDefType" - DirectType {} -> False - PtrType ptr_ty _ _ -> isVariablyModifiedType ptr_ty - ArrayType _ sz _ _ -> isVariableArraySize sz - FunctionType {} -> False - where - isVariableArraySize :: ArraySize -> Bool - isVariableArraySize (UnknownArraySize isStarred) = isStarred - isVariableArraySize (ArraySize isStatic e) = isStatic || isConstantSize e - - isConstantSize :: Expr -> Bool - isConstantSize (CConst (CIntConst {})) = True - isConstantSize _ = False - --- | Two types denote the same type if they are identical, ignoring type --- definitions, and neither is a variably modified type. -sameType :: Type -> Type -> Bool -sameType t1 t2 = - not (isVariablyModifiedType t1 || isVariablyModifiedType t2) && sameType' - where - sameType' = - case (derefTypeDef t1, derefTypeDef t2) of - (TypeDefType {}, _) -> error "impossible: derefTypeDef t1 returned a TypeDefType" - (_, TypeDefType {}) -> error "impossible: derefTypeDef t2 returned a TypeDefType" - (DirectType tn1 q1 _a1, DirectType tn2 q2 _a2) -> - sameTypeName tn1 tn2 && sameQuals q1 q2 {- FIXME: same attributes? -} - (PtrType pt1 q1 _a1, PtrType pt2 q2 _a2) -> - sameType pt1 pt2 && sameQuals q1 q2 - (ArrayType at1 sz1 q1 _a1, ArrayType at2 sz2 q2 _a2) -> - sameType at1 at2 && sameArraySize sz1 sz2 && sameQuals q1 q2 - (FunctionType ft1 _a1, FunctionType ft2 _a2) -> - sameFunType ft1 ft2 - _ -> False - -sameTypeName :: TypeName -> TypeName -> Bool -sameTypeName t1 t2 = - case (t1, t2) of - (TyVoid, TyVoid) -> True - (TyIntegral i1, TyIntegral i2) -> i1 == i2 - (TyFloating f1, TyFloating f2) -> f1 == f2 - (TyComplex f1, TyComplex f2) -> f1 == f2 - (TyComp ctr1, TyComp ctr2) -> sameCompTypeRef ctr1 ctr2 - (TyEnum etr1, TyEnum etr2) -> sameEnumTypeRef etr1 etr2 - (TyBuiltin b1, TyBuiltin b2) -> sameBuiltinType b1 b2 - _ -> False - -sameBuiltinType :: BuiltinType -> BuiltinType -> Bool -sameBuiltinType TyVaList TyVaList = True -sameBuiltinType TyAny TyAny = False {- what does TyAny mean? -} -sameBuiltinType _ _ = False - -sameCompTypeRef :: CompTypeRef -> CompTypeRef -> Bool -sameCompTypeRef (CompTypeRef sue1 kind1 _) (CompTypeRef sue2 kind2 _) = - sue1 == sue2 && kind1 == kind2 - -sameEnumTypeRef :: EnumTypeRef -> EnumTypeRef -> Bool -sameEnumTypeRef (EnumTypeRef sue1 _) (EnumTypeRef sue2 _) = sue1 == sue2 - -sameFunType :: FunType -> FunType -> Bool -sameFunType (FunType rt1 params1 isVar1) (FunType rt2 params2 isVar2) = - sameType rt1 rt2 && sameParamDecls params1 params2 && isVar1 == isVar2 - where - sameParamDecls :: [ParamDecl] -> [ParamDecl] -> Bool - sameParamDecls param_list1 param_list2 = - length param_list1 == length param_list2 - && and (zipWith sameParamDecl param_list1 param_list2) - -- ignores param identifiers, just compares types - sameParamDecl :: ParamDecl -> ParamDecl -> Bool - sameParamDecl p1 p2 = sameType (declType p1) (declType p2) -sameFunType (FunTypeIncomplete rt1) (FunTypeIncomplete rt2) = - sameType rt1 rt2 -sameFunType _ _ = False - --- | Returns 'True' iff both array sizes denote the same size. Assumes that --- neither array type was a variably modified type. -sameArraySize :: ArraySize -> ArraySize -> Bool -sameArraySize (UnknownArraySize isStar1) (UnknownArraySize isStar2) = isStar1 == isStar2 -sameArraySize (ArraySize s1 e1) (ArraySize s2 e2) = s1 == s2 && sizeEqual e1 e2 - where - -- FIXME: Do something better, and combine with sizeEqual in Language.C.Analysis.TypeCheck - sizeEqual :: Expr -> Expr -> Bool - sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2 - sizeEqual oe1 oe2 = nodeInfo oe1 == nodeInfo oe2 -sameArraySize _ _ = False - -sameQuals :: TypeQuals -> TypeQuals -> Bool -sameQuals (TypeQuals {constant = c1, volatile = v1, restrict = r1}) - (TypeQuals {constant = c2, volatile = v2, restrict = r2}) = - c1 == c2 && v1 == v2 && r1 == r2 - -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 = all (`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 - +module Language.C.Analysis.TypeUtils (+ -- * Constructors+ integral,+ floating,+ simplePtr,+ uint16_tType,+ uint32_tType,+ uint64_tType,+ 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,+ -- * Type comparisons+ sameType,+ -- * Other utilities+ getIntType,+ getFloatType+) where++import Language.C.Analysis.SemRep+import Language.C.Data.Node (CNode(..))+import Language.C.Syntax.AST (CExpression (..), CConstant (..))+import Language.C.Syntax.Constants++-- | 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 (noTypeQuals { constant = True }) []++-- | The underlying type for @uint16_t@. For now, this is just @unsigned short@.+uint16_tType :: Type+uint16_tType = integral TyUShort++-- | The underlying type for @uint32_t@. For now, this is just @unsigned int@.+uint32_tType :: Type+uint32_tType = integral TyUInt++-- | The underlying type for @uint64_t@. For now, this is just @unsigned long long@.+uint64_tType :: Type+uint64_tType = integral TyULLong++-- | 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)+ (noTypeQuals { constant = True })+ 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 _ actual_ty _) _ _ -> isFunctionType actual_ty+ 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 _ 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 _ 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 _ 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 _ t _) q a) =+ (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q))+ (deepDerefTypeDef t)+deepDerefTypeDef t = t++-- | True iff Type is a variable length array or a derived type thereof.+-- Variably modified types have function or block scope, so only some+-- constructions are possible.+isVariablyModifiedType :: Type -> Bool+isVariablyModifiedType t =+ case derefTypeDef t of+ TypeDefType {} -> error "impossible: derefTypeDef t returned a TypeDefType"+ DirectType {} -> False+ PtrType ptr_ty _ _ -> isVariablyModifiedType ptr_ty+ ArrayType _ sz _ _ -> isVariableArraySize sz+ FunctionType {} -> False+ where+ isVariableArraySize :: ArraySize -> Bool+ isVariableArraySize (UnknownArraySize isStarred) = isStarred+ isVariableArraySize (ArraySize isStatic e) = isStatic || isConstantSize e++ isConstantSize :: Expr -> Bool+ isConstantSize (CConst (CIntConst {})) = True+ isConstantSize _ = False++-- | Two types denote the same type if they are identical, ignoring type+-- definitions, and neither is a variably modified type.+sameType :: Type -> Type -> Bool+sameType t1 t2 =+ not (isVariablyModifiedType t1 || isVariablyModifiedType t2) && sameType'+ where+ sameType' =+ case (derefTypeDef t1, derefTypeDef t2) of+ (TypeDefType {}, _) -> error "impossible: derefTypeDef t1 returned a TypeDefType"+ (_, TypeDefType {}) -> error "impossible: derefTypeDef t2 returned a TypeDefType"+ (DirectType tn1 q1 _a1, DirectType tn2 q2 _a2) ->+ sameTypeName tn1 tn2 && sameQuals q1 q2 {- FIXME: same attributes? -}+ (PtrType pt1 q1 _a1, PtrType pt2 q2 _a2) ->+ sameType pt1 pt2 && sameQuals q1 q2+ (ArrayType at1 sz1 q1 _a1, ArrayType at2 sz2 q2 _a2) ->+ sameType at1 at2 && sameArraySize sz1 sz2 && sameQuals q1 q2+ (FunctionType ft1 _a1, FunctionType ft2 _a2) ->+ sameFunType ft1 ft2+ _ -> False++sameTypeName :: TypeName -> TypeName -> Bool+sameTypeName t1 t2 =+ case (t1, t2) of+ (TyVoid, TyVoid) -> True+ (TyIntegral i1, TyIntegral i2) -> i1 == i2+ (TyFloating f1, TyFloating f2) -> f1 == f2+ (TyComplex f1, TyComplex f2) -> f1 == f2+ (TyComp ctr1, TyComp ctr2) -> sameCompTypeRef ctr1 ctr2+ (TyEnum etr1, TyEnum etr2) -> sameEnumTypeRef etr1 etr2+ (TyBuiltin b1, TyBuiltin b2) -> sameBuiltinType b1 b2+ _ -> False++sameBuiltinType :: BuiltinType -> BuiltinType -> Bool+sameBuiltinType TyVaList TyVaList = True+sameBuiltinType TyAny TyAny = False {- what does TyAny mean? -}+sameBuiltinType _ _ = False++sameCompTypeRef :: CompTypeRef -> CompTypeRef -> Bool+sameCompTypeRef (CompTypeRef sue1 kind1 _) (CompTypeRef sue2 kind2 _) =+ sue1 == sue2 && kind1 == kind2++sameEnumTypeRef :: EnumTypeRef -> EnumTypeRef -> Bool+sameEnumTypeRef (EnumTypeRef sue1 _) (EnumTypeRef sue2 _) = sue1 == sue2++sameFunType :: FunType -> FunType -> Bool+sameFunType (FunType rt1 params1 isVar1) (FunType rt2 params2 isVar2) =+ sameType rt1 rt2 && sameParamDecls params1 params2 && isVar1 == isVar2+ where+ sameParamDecls :: [ParamDecl] -> [ParamDecl] -> Bool+ sameParamDecls param_list1 param_list2 =+ length param_list1 == length param_list2+ && and (zipWith sameParamDecl param_list1 param_list2)+ -- ignores param identifiers, just compares types+ sameParamDecl :: ParamDecl -> ParamDecl -> Bool+ sameParamDecl p1 p2 = sameType (declType p1) (declType p2)+sameFunType (FunTypeIncomplete rt1) (FunTypeIncomplete rt2) =+ sameType rt1 rt2+sameFunType _ _ = False++-- | Returns 'True' iff both array sizes denote the same size. Assumes that+-- neither array type was a variably modified type.+sameArraySize :: ArraySize -> ArraySize -> Bool+sameArraySize (UnknownArraySize isStar1) (UnknownArraySize isStar2) = isStar1 == isStar2+sameArraySize (ArraySize s1 e1) (ArraySize s2 e2) = s1 == s2 && sizeEqual e1 e2+ where+ -- FIXME: Do something better, and combine with sizeEqual in Language.C.Analysis.TypeCheck+ sizeEqual :: Expr -> Expr -> Bool+ sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2+ sizeEqual oe1 oe2 = nodeInfo oe1 == nodeInfo oe2+sameArraySize _ _ = False++sameQuals :: TypeQuals -> TypeQuals -> Bool+sameQuals (TypeQuals {constant = c1, volatile = v1, restrict = r1})+ (TypeQuals {constant = c2, volatile = v2, restrict = r2}) =+ c1 == c2 && v1 == v2 && r1 == r2++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 = all (`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
@@ -1,40 +1,40 @@------------------------------------------------------------------------------ --- | --- Module : Language.C.Data --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- Portability : ghc --- --- Common data types for Language.C: Identifiers, unique names, source code locations, --- ast node attributes and extensible errors. ------------------------------------------------------------------------------ -module Language.C.Data ( - -- * Input stream - module Language.C.Data.InputStream, - -- * Identifiers - SUERef(..), isAnonymousRef, sueRefToString, - Ident,mkIdent, identToString, internalIdent, isInternalIdent, builtinIdent, - -- * Unqiue names - Name(..),newNameSupply, - -- * Source code positions - Position(..),posFile,posParent, - Pos(..), - initPos, nopos,builtinPos,internalPos, - isSourcePos,isBuiltinPos,isInternalPos, - -- * Syntax tree nodes - NodeInfo(..),CNode(..), - fileOfNode,posOfNode,nameOfNode, - undefNode,mkNodeInfoOnlyPos,mkNodeInfo, - internalNode, -- DEPRECATED - -- * Extensible errors - module Language.C.Data.Error -) -where -import Language.C.Data.InputStream -import Language.C.Data.Ident -import Language.C.Data.Name -import Language.C.Data.Position -import Language.C.Data.Error -import Language.C.Data.Node +-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Data+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : ghc+--+-- Common data types for Language.C: Identifiers, unique names, source code locations,+-- ast node attributes and extensible errors.+-----------------------------------------------------------------------------+module Language.C.Data (+ -- * Input stream+ module Language.C.Data.InputStream,+ -- * Identifiers+ SUERef(..), isAnonymousRef, sueRefToString,+ Ident,mkIdent, identToString, internalIdent, isInternalIdent, builtinIdent,+ -- * Unqiue names+ Name(..),newNameSupply,+ -- * Source code positions+ Position(..),posFile,posParent,+ Pos(..),+ initPos, nopos,builtinPos,internalPos,+ isSourcePos,isBuiltinPos,isInternalPos,+ -- * Syntax tree nodes+ NodeInfo(..),CNode(..),+ fileOfNode,posOfNode,nameOfNode,+ undefNode,mkNodeInfoOnlyPos,mkNodeInfo,+ internalNode, -- DEPRECATED+ -- * Extensible errors+ module Language.C.Data.Error+)+where+import Language.C.Data.InputStream+import Language.C.Data.Ident+import Language.C.Data.Name+import Language.C.Data.Position+import Language.C.Data.Error+import Language.C.Data.Node
src/Language/C/Data/Error.hs view
@@ -1,171 +1,171 @@-{-# LANGUAGE ExistentialQuantification, DeriveDataTypeable #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Data.Error --- Copyright : (c) 2008 Benedikt Huber, Manuel M. T. Chakravarty --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- Portability : ghc --- --- 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]" ------------------------------------------------------------------------------ -module Language.C.Data.Error ( - -- * Severity Level - ErrorLevel(..), isHardError, - -- * Error class - Error(..), errorPos, errorLevel, errorMsgs, - -- * Error 'supertype' - CError(..), - -- * Infos attached to errors - ErrorInfo(..),showError,showErrorInfo,mkErrorInfo, - -- * Default error types - UnsupportedFeature, unsupportedFeature, unsupportedFeature_, - UserError, userErr, - -- * Raising internal errors - internalErr, -) -where -import Data.Typeable -import Language.C.Data.Node -import Language.C.Data.Position - --- | Error levels (severity) -data ErrorLevel = LevelWarn - | LevelError - | LevelFatal - deriving (Eq, Ord) - -instance Show ErrorLevel where - show LevelWarn = "WARNING" - show LevelError = "ERROR" - show LevelFatal = "FATAL ERROR" - --- | return @True@ when the given error makes it impossible to continue --- analysis or compilation. -isHardError :: (Error ex) => ex -> Bool -isHardError = ( > LevelWarn) . errorLevel - --- | information attached to every error in Language.C -data ErrorInfo = ErrorInfo ErrorLevel Position [String] deriving Typeable - --- to facilitate newtype deriving -instance Show ErrorInfo where show = showErrorInfo "error" -instance Error ErrorInfo where - errorInfo = id - changeErrorLevel (ErrorInfo _ pos msgs) lvl' = ErrorInfo lvl' pos msgs - -mkErrorInfo :: ErrorLevel -> String -> NodeInfo -> ErrorInfo -mkErrorInfo lvl msg node = ErrorInfo lvl (posOfNode node) (lines msg) - --- | `supertype' of all errors -data CError - = forall err. (Error err) => CError err - deriving Typeable - --- | errors in Language.C are instance of 'Error' -class (Typeable e, Show e) => Error e where - -- | obtain source location etc. of an error - errorInfo :: e -> ErrorInfo - -- | wrap error in 'CError' - toError :: e -> CError - -- | try to cast a generic 'CError' to the specific error type - fromError :: CError -> (Maybe e) - -- | modify the error level - changeErrorLevel :: e -> ErrorLevel -> e - - -- default implementation - fromError (CError e) = cast e - toError = CError - changeErrorLevel e lvl = - if errorLevel e == lvl - then e - else error $ "changeErrorLevel: not possible for " ++ show e - -instance Show CError where - show (CError e) = show e -instance Error CError where - errorInfo (CError err) = errorInfo err - toError = id - fromError = Just - changeErrorLevel (CError e) = CError . changeErrorLevel e - --- | position of an @Error@ -errorPos :: (Error e) => e -> Position -errorPos = ( \(ErrorInfo _ pos _) -> pos ) . errorInfo - --- | severity level of an @Error@ -errorLevel :: (Error e) => e -> ErrorLevel -errorLevel = ( \(ErrorInfo lvl _ _) -> lvl ) . errorInfo - --- | message lines of an @Error@ -errorMsgs :: (Error e) => e -> [String] -errorMsgs = ( \(ErrorInfo _ _ msgs) -> msgs ) . errorInfo - --- | error raised if a operation requires an unsupported or not yet implemented feature. -data UnsupportedFeature = UnsupportedFeature String Position deriving Typeable -instance Error UnsupportedFeature where - errorInfo (UnsupportedFeature msg pos) = ErrorInfo LevelError pos (lines msg) -instance Show UnsupportedFeature where show = showError "Unsupported Feature" - -unsupportedFeature :: (Pos a) => String -> a -> UnsupportedFeature -unsupportedFeature msg a = UnsupportedFeature msg (posOf a) - -unsupportedFeature_ :: String -> UnsupportedFeature -unsupportedFeature_ msg = UnsupportedFeature msg internalPos - --- | unspecified error raised by the user (in case the user does not want to define --- her own error types). -newtype UserError = UserError ErrorInfo deriving Typeable -instance Error UserError where - errorInfo (UserError info) = info -instance Show UserError where show = showError "User Error" - -userErr :: String -> UserError -userErr msg = UserError (ErrorInfo LevelError internalPos (lines msg)) - --- other errors to be defined elsewhere - -showError :: (Error e) => String -> e -> String -showError short_msg = showErrorInfo short_msg . errorInfo - --- | converts an error into a string using a fixed format --- --- * either the lines of the long error message or the short message has to be non-empty --- --- * the format is --- --- > <fname>:<row>: (column <col>) [<err lvl>] --- > >>> <line_1> --- > <line_2> --- > ... --- > <line_n> -showErrorInfo :: String -> ErrorInfo -> String -showErrorInfo short_msg (ErrorInfo level pos msgs) = - header ++ showMsgLines (if null short_msg then msgs else short_msg:msgs) - where - header = showPos pos ++ "[" ++ show level ++ "]" - showPos p | isSourcePos p = (posFile p) ++ ":" ++ show (posRow pos) ++ ": " ++ - "(column " ++ show (posColumn pos) ++ ") " - | otherwise = show p ++ ":: " - showMsgLines [] = internalErr "No short message or error message provided." - showMsgLines (x:xs) = indent ++ ">>> " ++ x ++ "\n" ++ unlines (map (indent++) xs) - - --- internal errors -internalErrPrefix :: String -internalErrPrefix = unlines [ "Language.C : Internal Error" , - "This is propably a bug, and should be reported at "++ - "http://www.sivity.net/projects/language.c/newticket"] - --- | raise a fatal internal error; message may have multiple lines -internalErr :: String -> a -internalErr msg = error (internalErrPrefix ++ "\n" - ++ indentLines msg - ++ "\n") -indent :: String -indent = " " -indentLines :: String -> String -indentLines = unlines . map (indent++) . lines +{-# LANGUAGE ExistentialQuantification, DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Data.Error+-- Copyright : (c) 2008 Benedikt Huber, Manuel M. T. Chakravarty+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : ghc+--+-- 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]"+-----------------------------------------------------------------------------+module Language.C.Data.Error (+ -- * Severity Level+ ErrorLevel(..), isHardError,+ -- * Error class+ Error(..), errorPos, errorLevel, errorMsgs,+ -- * Error 'supertype'+ CError(..),+ -- * Infos attached to errors+ ErrorInfo(..),showError,showErrorInfo,mkErrorInfo,+ -- * Default error types+ UnsupportedFeature, unsupportedFeature, unsupportedFeature_,+ UserError, userErr,+ -- * Raising internal errors+ internalErr,+)+where+import Data.Typeable+import Language.C.Data.Node+import Language.C.Data.Position++-- | Error levels (severity)+data ErrorLevel = LevelWarn+ | LevelError+ | LevelFatal+ deriving (Eq, Ord)++instance Show ErrorLevel where+ show LevelWarn = "WARNING"+ show LevelError = "ERROR"+ show LevelFatal = "FATAL ERROR"++-- | return @True@ when the given error makes it impossible to continue+-- analysis or compilation.+isHardError :: (Error ex) => ex -> Bool+isHardError = ( > LevelWarn) . errorLevel++-- | information attached to every error in Language.C+data ErrorInfo = ErrorInfo ErrorLevel Position [String] deriving Typeable++-- to facilitate newtype deriving+instance Show ErrorInfo where show = showErrorInfo "error"+instance Error ErrorInfo where+ errorInfo = id+ changeErrorLevel (ErrorInfo _ pos msgs) lvl' = ErrorInfo lvl' pos msgs++mkErrorInfo :: ErrorLevel -> String -> NodeInfo -> ErrorInfo+mkErrorInfo lvl msg node = ErrorInfo lvl (posOfNode node) (lines msg)++-- | `supertype' of all errors+data CError+ = forall err. (Error err) => CError err+ deriving Typeable++-- | errors in Language.C are instance of 'Error'+class (Typeable e, Show e) => Error e where+ -- | obtain source location etc. of an error+ errorInfo :: e -> ErrorInfo+ -- | wrap error in 'CError'+ toError :: e -> CError+ -- | try to cast a generic 'CError' to the specific error type+ fromError :: CError -> (Maybe e)+ -- | modify the error level+ changeErrorLevel :: e -> ErrorLevel -> e++ -- default implementation+ fromError (CError e) = cast e+ toError = CError+ changeErrorLevel e lvl =+ if errorLevel e == lvl+ then e+ else error $ "changeErrorLevel: not possible for " ++ show e++instance Show CError where+ show (CError e) = show e+instance Error CError where+ errorInfo (CError err) = errorInfo err+ toError = id+ fromError = Just+ changeErrorLevel (CError e) = CError . changeErrorLevel e++-- | position of an @Error@+errorPos :: (Error e) => e -> Position+errorPos = ( \(ErrorInfo _ pos _) -> pos ) . errorInfo++-- | severity level of an @Error@+errorLevel :: (Error e) => e -> ErrorLevel+errorLevel = ( \(ErrorInfo lvl _ _) -> lvl ) . errorInfo++-- | message lines of an @Error@+errorMsgs :: (Error e) => e -> [String]+errorMsgs = ( \(ErrorInfo _ _ msgs) -> msgs ) . errorInfo++-- | error raised if a operation requires an unsupported or not yet implemented feature.+data UnsupportedFeature = UnsupportedFeature String Position deriving Typeable+instance Error UnsupportedFeature where+ errorInfo (UnsupportedFeature msg pos) = ErrorInfo LevelError pos (lines msg)+instance Show UnsupportedFeature where show = showError "Unsupported Feature"++unsupportedFeature :: (Pos a) => String -> a -> UnsupportedFeature+unsupportedFeature msg a = UnsupportedFeature msg (posOf a)++unsupportedFeature_ :: String -> UnsupportedFeature+unsupportedFeature_ msg = UnsupportedFeature msg internalPos++-- | unspecified error raised by the user (in case the user does not want to define+-- her own error types).+newtype UserError = UserError ErrorInfo deriving Typeable+instance Error UserError where+ errorInfo (UserError info) = info+instance Show UserError where show = showError "User Error"++userErr :: String -> UserError+userErr msg = UserError (ErrorInfo LevelError internalPos (lines msg))++-- other errors to be defined elsewhere++showError :: (Error e) => String -> e -> String+showError short_msg = showErrorInfo short_msg . errorInfo++-- | converts an error into a string using a fixed format+--+-- * either the lines of the long error message or the short message has to be non-empty+--+-- * the format is+--+-- > <fname>:<row>: (column <col>) [<err lvl>]+-- > >>> <line_1>+-- > <line_2>+-- > ...+-- > <line_n>+showErrorInfo :: String -> ErrorInfo -> String+showErrorInfo short_msg (ErrorInfo level pos msgs) =+ header ++ showMsgLines (if null short_msg then msgs else short_msg:msgs)+ where+ header = showPos pos ++ "[" ++ show level ++ "]"+ showPos p | isSourcePos p = (posFile p) ++ ":" ++ show (posRow pos) ++ ": " +++ "(column " ++ show (posColumn pos) ++ ") "+ | otherwise = show p ++ ":: "+ showMsgLines [] = internalErr "No short message or error message provided."+ showMsgLines (x:xs) = indent ++ ">>> " ++ x ++ "\n" ++ unlines (map (indent++) xs)+++-- internal errors+internalErrPrefix :: String+internalErrPrefix = unlines [ "Language.C : Internal Error" ,+ "This is propably a bug, and should be reported at "+++ "http://www.sivity.net/projects/language.c/newticket"]++-- | raise a fatal internal error; message may have multiple lines+internalErr :: String -> a+internalErr msg = error (internalErrPrefix ++ "\n"+ ++ indentLines msg+ ++ "\n")+indent :: String+indent = " "+indentLines :: String -> String+indentLines = unlines . map (indent++) . lines
src/Language/C/Data/Ident.hs view
@@ -1,134 +1,140 @@-{-# LANGUAGE DeriveDataTypeable #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Data.Ident --- Copyright : (c) [1995..1999] Manuel M. T. Chakravarty --- (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- 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 --- 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. ------------------------------------------------------------------------------ -module Language.C.Data.Ident ( - Ident(..), - SUERef(..), isAnonymousRef, - mkIdent, builtinIdent, internalIdent, internalIdentAt, isInternalIdent, - identToString, sueRefToString, dumpIdent) -where - --- TODO (comment from manuel): --- * Hashing is not 8bit clean. - -import Data.Char -import Language.C.Data.Position -import Language.C.Data.Node -import Language.C.Data.Name (Name) -import Data.Generics - --- | References uniquely determining a struct, union or enum type. --- Those are either identified by an string identifier, or by a unique --- name (anonymous types). -data SUERef = AnonymousRef Name - | NamedRef Ident - deriving (Typeable, Data, Ord, Eq, Show) --, Read - --- | Return true if the struct\/union\/enum reference is anonymous. -isAnonymousRef :: SUERef -> Bool -isAnonymousRef (AnonymousRef _) = True -isAnonymousRef _ = False - --- | C identifiers -data Ident = Ident String -- lexeme - {-# UNPACK #-} !Int -- hash to speed up equality check - NodeInfo -- attributes of this ident. incl. position - deriving (Data,Typeable,Show) -- Read - --- the definition of the equality allows identifiers to be equal that are --- defined at different source text positions, and aims at speeding up the --- equality test, by comparing the lexemes only if the two numbers are equal --- -instance Eq Ident where - (Ident s h _) == (Ident s' h' _) = (h == h') && (s == s') - --- this does *not* follow the alphanumerical ordering of the lexemes --- -instance Ord Ident where - compare (Ident s h _) (Ident s' h' _) = compare (h, s) (h', s') - --- identifiers are attributed -instance CNode Ident where - nodeInfo (Ident _ _ at) = at -instance Pos Ident where - posOf = posOfNode . nodeInfo --- to speed up the equality test we compute some hash-like value for each --- identifiers lexeme and store it in the identifiers representation - --- hash function from the dragon book pp437; assumes 7 bit characters and needs --- the (nearly) full range of values guaranteed for `Int' by the Haskell --- language definition; can handle 8 bit characters provided we have 29 bit --- for the `Int's without sign --- -quad :: String -> Int -quad (c1:c2:c3:c4:s) = ((ord c4 * bits21 - + ord c3 * bits14 - + ord c2 * bits7 - + ord c1) - `mod` bits28) - + (quad s `mod` bits28) -quad (c1:c2:c3:[] ) = ord c3 * bits14 + ord c2 * bits7 + ord c1 -quad (c1:c2:[] ) = ord c2 * bits7 + ord c1 -quad (c1:[] ) = ord c1 -quad ([] ) = 0 - -bits7 :: Int -bits7 = 2^(7::Int) -bits14 :: Int -bits14 = 2^(14::Int) -bits21 :: Int -bits21 = 2^(21::Int) -bits28 :: Int -bits28 = 2^(28::Int) - --- | build an identifier from a string. --- --- * only minimal error checking, e.g., the characters of the identifier are --- not checked for being alphanumerical only; the correct lexis of the --- identifier should be ensured by the caller, e.g., the scanner. --- --- * for reasons of simplicity the complete lexeme is hashed. -mkIdent :: Position -> String -> Name -> Ident -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 -internalIdent s = Ident s (quad s) (mkNodeInfoOnlyPos internalPos) - --- | return an /internal/ identifier with position info -internalIdentAt :: Position -> String -> Ident -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 -builtinIdent s = Ident s (quad s) (mkNodeInfoOnlyPos builtinPos) - --- | return @True@ if the given identifier is /internal/ -isInternalIdent :: Ident -> Bool -isInternalIdent (Ident _ _ nodeinfo) = isInternalPos (posOfNode nodeinfo) - --- | string of an identifier -identToString :: Ident -> String -identToString (Ident s _ _) = s - --- | string of a SUE ref (empty if anonymous) -sueRefToString :: SUERef -> String -sueRefToString (AnonymousRef _) = "" -sueRefToString (NamedRef ident) = identToString ident - --- | dump the identifier string and its positions for debugging purposes -dumpIdent :: Ident -> String -dumpIdent ide = identToString ide ++ " at " ++ show (nodeInfo ide) +{-# LANGUAGE DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Data.Ident+-- Copyright : (c) [1995..1999] Manuel M. T. Chakravarty+-- (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- 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+-- 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.+-----------------------------------------------------------------------------+module Language.C.Data.Ident (+ Ident(..),+ SUERef(..), isAnonymousRef,+ mkIdent, builtinIdent, internalIdent, internalIdentAt, isInternalIdent,+ identToString, sueRefToString, dumpIdent)+where++-- TODO (comment from manuel):+-- * Hashing is not 8bit clean.++import Data.Char+import Language.C.Data.Position+import Language.C.Data.Node+import Language.C.Data.Name (Name)+import Data.Generics hiding (Generic)+import GHC.Generics (Generic)+import Control.DeepSeq (NFData)++-- | References uniquely determining a struct, union or enum type.+-- Those are either identified by an string identifier, or by a unique+-- name (anonymous types).+data SUERef = AnonymousRef Name+ | NamedRef Ident+ deriving (Typeable, Data, Ord, Eq, Show, Generic) --, Read++instance NFData SUERef++-- | Return true if the struct\/union\/enum reference is anonymous.+isAnonymousRef :: SUERef -> Bool+isAnonymousRef (AnonymousRef _) = True+isAnonymousRef _ = False++-- | C identifiers+data Ident = Ident String -- lexeme+ {-# UNPACK #-} !Int -- hash to speed up equality check+ NodeInfo -- attributes of this ident. incl. position+ deriving (Data,Typeable,Show, Generic) -- Read++instance NFData Ident++-- the definition of the equality allows identifiers to be equal that are+-- defined at different source text positions, and aims at speeding up the+-- equality test, by comparing the lexemes only if the two numbers are equal+--+instance Eq Ident where+ (Ident s h _) == (Ident s' h' _) = (h == h') && (s == s')++-- this does *not* follow the alphanumerical ordering of the lexemes+--+instance Ord Ident where+ compare (Ident s h _) (Ident s' h' _) = compare (h, s) (h', s')++-- identifiers are attributed+instance CNode Ident where+ nodeInfo (Ident _ _ at) = at+instance Pos Ident where+ posOf = posOfNode . nodeInfo+-- to speed up the equality test we compute some hash-like value for each+-- identifiers lexeme and store it in the identifiers representation++-- hash function from the dragon book pp437; assumes 7 bit characters and needs+-- the (nearly) full range of values guaranteed for `Int' by the Haskell+-- language definition; can handle 8 bit characters provided we have 29 bit+-- for the `Int's without sign+--+quad :: String -> Int+quad (c1:c2:c3:c4:s) = ((ord c4 * bits21+ + ord c3 * bits14+ + ord c2 * bits7+ + ord c1)+ `mod` bits28)+ + (quad s `mod` bits28)+quad (c1:c2:c3:[] ) = ord c3 * bits14 + ord c2 * bits7 + ord c1+quad (c1:c2:[] ) = ord c2 * bits7 + ord c1+quad (c1:[] ) = ord c1+quad ([] ) = 0++bits7 :: Int+bits7 = 2^(7::Int)+bits14 :: Int+bits14 = 2^(14::Int)+bits21 :: Int+bits21 = 2^(21::Int)+bits28 :: Int+bits28 = 2^(28::Int)++-- | build an identifier from a string.+--+-- * only minimal error checking, e.g., the characters of the identifier are+-- not checked for being alphanumerical only; the correct lexis of the+-- identifier should be ensured by the caller, e.g., the scanner.+--+-- * for reasons of simplicity the complete lexeme is hashed.+mkIdent :: Position -> String -> Name -> Ident+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+internalIdent s = Ident s (quad s) (mkNodeInfoOnlyPos internalPos)++-- | return an /internal/ identifier with position info+internalIdentAt :: Position -> String -> Ident+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+builtinIdent s = Ident s (quad s) (mkNodeInfoOnlyPos builtinPos)++-- | return @True@ if the given identifier is /internal/+isInternalIdent :: Ident -> Bool+isInternalIdent (Ident _ _ nodeinfo) = isInternalPos (posOfNode nodeinfo)++-- | string of an identifier+identToString :: Ident -> String+identToString (Ident s _ _) = s++-- | string of a SUE ref (empty if anonymous)+sueRefToString :: SUERef -> String+sueRefToString (AnonymousRef _) = ""+sueRefToString (NamedRef ident) = identToString ident++-- | dump the identifier string and its positions for debugging purposes+dumpIdent :: Ident -> String+dumpIdent ide = identToString ide ++ " at " ++ show (nodeInfo ide)
src/Language/C/Data/InputStream.hs view
@@ -1,99 +1,99 @@-{-# LANGUAGE CPP, BangPatterns #-} -{-# OPTIONS -Wall #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Data.InputStream --- Copyright : (c) 2008,2011 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- Portability : ghc --- --- Compile time input abstraction for the parser, relying on ByteString. --- The String interface only supports Latin-1 since alex-3, as alex now requires --- byte based access to the input stream. -------------------------------------------------------------------------------- -module Language.C.Data.InputStream ( - InputStream, readInputStream,inputStreamToString,inputStreamFromString, - takeByte, takeChar, inputStreamEmpty, takeChars, - countLines, -) -where - -import Data.Word - -#ifndef NO_BYTESTRING -import Data.ByteString (ByteString) -import qualified Data.ByteString as BSW -import qualified Data.ByteString.Char8 as BSC -#else -import qualified Data.Char as Char -#endif - --- Generic InputStream stuff - --- | read a file into an 'InputStream' -readInputStream :: FilePath -> IO InputStream - --- | convert 'InputStream' to 'String' -inputStreamToString :: InputStream -> String -{-# INLINE inputStreamToString #-} - --- | convert a 'String' to an 'InputStream' -inputStreamFromString :: String -> InputStream - --- | @(b,is') = takeByte is@ reads and removes --- the first byte @b@ from the 'InputStream' @is@ -takeByte :: InputStream -> (Word8, InputStream) -{-# INLINE takeByte #-} - --- | @(c,is') = takeChar is@ reads and removes --- the first character @c@ from the 'InputStream' @is@ -takeChar :: InputStream -> (Char, InputStream) -{-# INLINE takeChar #-} - --- | return @True@ if the given input stream is empty -inputStreamEmpty :: InputStream -> Bool -{-# INLINE inputStreamEmpty #-} - --- | @str = takeChars n is@ returns the first @n@ characters --- of the given input stream, without removing them -takeChars :: Int -> InputStream -> [Char] -{-# INLINE takeChars #-} - --- | @countLines@ returns the number of text lines in the --- given 'InputStream' -countLines :: InputStream -> Int - -#ifndef NO_BYTESTRING - -type InputStream = ByteString -takeByte bs = BSW.head bs `seq` (BSW.head bs, BSW.tail bs) -takeChar bs = BSC.head bs `seq` (BSC.head bs, BSC.tail bs) -inputStreamEmpty = BSW.null -#ifndef __HADDOCK__ -takeChars !n bstr = BSC.unpack $ BSC.take n bstr --leaks -#endif -readInputStream = BSW.readFile - -inputStreamToString = BSC.unpack -inputStreamFromString = BSC.pack -countLines = length . BSC.lines - - -#else - -type InputStream = String -takeByte bs - | Char.isLatin1 c = let b = fromIntegral (Char.ord c) in b `seq` (b, tail bs) - | otherwise = error "takeByte: not a latin-1 character" - where c = head bs -takeChar bs = (head bs, tail bs) -inputStreamEmpty = null -takeChars n str = take n str -readInputStream = readFile -inputStreamToString = id -inputStreamFromString = id -countLines = length . lines -#endif - +{-# LANGUAGE CPP, BangPatterns #-}+{-# OPTIONS -Wall #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Data.InputStream+-- Copyright : (c) 2008,2011 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : ghc+--+-- Compile time input abstraction for the parser, relying on ByteString.+-- The String interface only supports Latin-1 since alex-3, as alex now requires+-- byte based access to the input stream.+-------------------------------------------------------------------------------+module Language.C.Data.InputStream (+ InputStream, readInputStream,inputStreamToString,inputStreamFromString,+ takeByte, takeChar, inputStreamEmpty, takeChars,+ countLines,+)+where++import Data.Word++#ifndef NO_BYTESTRING+import Data.ByteString (ByteString)+import qualified Data.ByteString as BSW+import qualified Data.ByteString.Char8 as BSC+#else+import qualified Data.Char as Char+#endif++-- Generic InputStream stuff++-- | read a file into an 'InputStream'+readInputStream :: FilePath -> IO InputStream++-- | convert 'InputStream' to 'String'+inputStreamToString :: InputStream -> String+{-# INLINE inputStreamToString #-}++-- | convert a 'String' to an 'InputStream'+inputStreamFromString :: String -> InputStream++-- | @(b,is') = takeByte is@ reads and removes+-- the first byte @b@ from the 'InputStream' @is@+takeByte :: InputStream -> (Word8, InputStream)+{-# INLINE takeByte #-}++-- | @(c,is') = takeChar is@ reads and removes+-- the first character @c@ from the 'InputStream' @is@+takeChar :: InputStream -> (Char, InputStream)+{-# INLINE takeChar #-}++-- | return @True@ if the given input stream is empty+inputStreamEmpty :: InputStream -> Bool+{-# INLINE inputStreamEmpty #-}++-- | @str = takeChars n is@ returns the first @n@ characters+-- of the given input stream, without removing them+takeChars :: Int -> InputStream -> [Char]+{-# INLINE takeChars #-}++-- | @countLines@ returns the number of text lines in the+-- given 'InputStream'+countLines :: InputStream -> Int++#ifndef NO_BYTESTRING++type InputStream = ByteString+takeByte bs = BSW.head bs `seq` (BSW.head bs, BSW.tail bs)+takeChar bs = BSC.head bs `seq` (BSC.head bs, BSC.tail bs)+inputStreamEmpty = BSW.null+#ifndef __HADDOCK__+takeChars !n bstr = BSC.unpack $ BSC.take n bstr --leaks+#endif+readInputStream = BSW.readFile++inputStreamToString = BSC.unpack+inputStreamFromString = BSC.pack+countLines = length . BSC.lines+++#else++type InputStream = String+takeByte bs+ | Char.isLatin1 c = let b = fromIntegral (Char.ord c) in b `seq` (b, tail bs)+ | otherwise = error "takeByte: not a latin-1 character"+ where c = head bs+takeChar bs = (head bs, tail bs)+inputStreamEmpty = null+takeChars n str = take n str+readInputStream = readFile+inputStreamToString = id+inputStreamFromString = id+countLines = length . lines+#endif+
src/Language/C/Data/Name.hs view
@@ -1,31 +1,36 @@-{-# LANGUAGE DeriveDataTypeable #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Data.Name --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- Portability : ghc --- --- Unique Names with fast equality (newtype 'Int') -module Language.C.Data.Name ( -Name(..),newNameSupply, namesStartingFrom -) where -import Data.Ix -import Data.Generics - --- | Name is a unique identifier -newtype Name = Name { nameId :: Int } deriving (Show, Read, Eq, Ord, Ix, Data, Typeable) - -instance Enum Name where - toEnum = Name - fromEnum (Name n) = n - --- | return an infinite stream of 'Name's starting with @nameId@ 0 -newNameSupply :: [Name] -newNameSupply = namesStartingFrom 0 - --- | get the infinite stream of unique names starting from the given integer -namesStartingFrom :: Int -> [Name] -namesStartingFrom k = [Name k..] +{-# LANGUAGE DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Data.Name+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : ghc+--+-- Unique Names with fast equality (newtype 'Int')+module Language.C.Data.Name (+Name(..),newNameSupply, namesStartingFrom+) where+import Data.Ix+import Data.Generics hiding (Generic)+import GHC.Generics (Generic)+import Control.DeepSeq (NFData)++-- | Name is a unique identifier+newtype Name = Name { nameId :: Int }+ deriving (Show, Read, Eq, Ord, Ix, Data, Typeable, Generic)++instance NFData Name++instance Enum Name where+ toEnum = Name+ fromEnum (Name n) = n++-- | return an infinite stream of 'Name's starting with @nameId@ 0+newNameSupply :: [Name]+newNameSupply = namesStartingFrom 0++-- | get the infinite stream of unique names starting from the given integer+namesStartingFrom :: Int -> [Name]+namesStartingFrom k = [Name k..]
src/Language/C/Data/Node.hs view
@@ -1,124 +1,128 @@-{-# LANGUAGE DeriveDataTypeable #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Syntax.Attributes --- Copyright : (c) [1995..1999] Manuel M. T. Chakravarty --- (c) 2008 Benedikt Huber (stripped radically) --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- Portability : ghc --- --- source position and unqiue name ------------------------------------------------------------------------------ -module Language.C.Data.Node ( - NodeInfo(..), undefNode, isUndefNode, - mkNodeInfoOnlyPos,mkNodeInfoPosLen, mkNodeInfo,mkNodeInfo', - internalNode, -- deprecated, use undefNode - CNode(nodeInfo), fileOfNode, - posOfNode, nameOfNode, getLastTokenPos, lengthOfNode, - eqByName, -) where -import Language.C.Data.Position -import Language.C.Data.Name (Name) -import Data.Generics - --- | Parsed entity attribute -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,Eq,Ord) - -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 --- _ == _ = --- error "Attributes: Attempt to compare `OnlyPos' attributes!" - --- attribute ordering ---instance Ord NodeInfo where --- (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 - --- | 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,lastTokLen) | lastTokLen < 0 = Nothing - | otherwise = Just (posOffset lastPos + lastTokLen - 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 -instance CNode NodeInfo where - nodeInfo = id -instance (CNode a, CNode b) => CNode (Either a b) where - nodeInfo = either nodeInfo nodeInfo - -nameOfNode :: NodeInfo -> Maybe 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 -> 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 -eqByName obj1 obj2 = (nodeInfo obj1) == (nodeInfo obj2) - - --- attribute identifier creation --- ----------------------------- -{-# DEPRECATED internalNode "use undefNode instead" #-} -internalNode :: NodeInfo -internalNode = undefNode - --- | 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 (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 (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 - +{-# LANGUAGE DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Syntax.Attributes+-- Copyright : (c) [1995..1999] Manuel M. T. Chakravarty+-- (c) 2008 Benedikt Huber (stripped radically)+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : ghc+--+-- source position and unqiue name+-----------------------------------------------------------------------------+module Language.C.Data.Node (+ NodeInfo(..), undefNode, isUndefNode,+ mkNodeInfoOnlyPos,mkNodeInfoPosLen, mkNodeInfo,mkNodeInfo',+ internalNode, -- deprecated, use undefNode+ CNode(nodeInfo), fileOfNode,+ posOfNode, nameOfNode, getLastTokenPos, lengthOfNode,+ eqByName,+) where+import Language.C.Data.Position+import Language.C.Data.Name (Name)+import Data.Generics hiding (Generic)+import GHC.Generics (Generic)+import Control.DeepSeq (NFData)++-- | Parsed entity attribute+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,Eq,Ord, Generic)++instance NFData NodeInfo++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+-- _ == _ =+-- error "Attributes: Attempt to compare `OnlyPos' attributes!"++-- attribute ordering+--instance Ord NodeInfo where+-- (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++-- | 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,lastTokLen) | lastTokLen < 0 = Nothing+ | otherwise = Just (posOffset lastPos + lastTokLen - 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+instance CNode NodeInfo where+ nodeInfo = id+instance (CNode a, CNode b) => CNode (Either a b) where+ nodeInfo = either nodeInfo nodeInfo++nameOfNode :: NodeInfo -> Maybe 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 -> 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+eqByName obj1 obj2 = (nodeInfo obj1) == (nodeInfo obj2)+++-- attribute identifier creation+-- -----------------------------+{-# DEPRECATED internalNode "use undefNode instead" #-}+internalNode :: NodeInfo+internalNode = undefNode++-- | 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 (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 (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
@@ -1,129 +1,135 @@-{-# LANGUAGE DeriveDataTypeable #-} ------------------------------------------------------------------------------ --- | --- 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 --- Portability : ghc --- --- Source code position ------------------------------------------------------------------------------ -module Language.C.Data.Position ( - -- - -- source text positions - -- - Position(), - position, - PosLength, - posFile,posRow,posColumn,posOffset,posParent, - initPos, isSourcePos, - nopos, isNoPos, - builtinPos, isBuiltinPos, - internalPos, isInternalPos, - incPos, retPos, - incOffset, - Pos(..), -) where -import Data.Generics - --- | file position information -data FilePosition = FilePosition { posSrcFile :: String, -- ^ source file - posParentFile :: (Maybe Position) -- ^ including file, if any - } - deriving (Eq, Ord, Typeable, Data) - --- | uniform representation of source file positions -data Position = Position { posOffset :: {-# UNPACK #-} !Int -- ^ absolute offset in the preprocessed 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. - , posFileInfo :: FilePosition -- ^ position in source file, including files - } - | NoPosition - | BuiltinPosition - | InternalPosition - deriving (Eq, Ord, Typeable, Data) - -posFile :: Position -> String -posFile = posSrcFile . posFileInfo - -posParent :: Position -> (Maybe Position) -posParent = posParentFile . posFileInfo - --- | Position and length of a token -type PosLength = (Position,Int) - -instance Show Position where - showsPrec _ (Position _ row _ (FilePosition fname mparent)) = - showString "(" . showsPrec 0 fname . showString ": line " . showsPrec 0 row . - maybe id (\p -> showString ", in file included from " . showsPrec 0 p) mparent . - showString ")" - showsPrec _ NoPosition = showString "<no file>" - showsPrec _ BuiltinPosition = showString "<builtin>" - showsPrec _ InternalPosition = showString "<internal>" - --- | @position absoluteOffset fileName lineNumber columnNumber@ initializes a @Position@ using the given arguments -position :: Int -> String -> Int -> Int -> Maybe Position -> Position -position offset fname row col mparent = Position offset row col (FilePosition fname mparent) - --- | class of type which aggregate a source code location -class Pos a where - posOf :: a -> Position - --- | initialize a Position to the start of the translation unit starting in the given file -initPos :: FilePath -> Position -initPos file = Position 0 1 1 (FilePosition file Nothing) - --- | returns @True@ if the given position refers to an actual source file -isSourcePos :: Position -> Bool -isSourcePos (Position _ _ _ _) = True -isSourcePos _ = False - --- | no position (for unknown position information) -nopos :: Position -nopos = NoPosition - --- | returns @True@ if the there is no position information available -isNoPos :: Position -> Bool -isNoPos NoPosition = True -isNoPos _ = False - --- | position attached to built-in objects --- -builtinPos :: Position -builtinPos = BuiltinPosition - --- | returns @True@ if the given position refers to a builtin definition -isBuiltinPos :: Position -> Bool -isBuiltinPos BuiltinPosition = True -isBuiltinPos _ = False - --- | position used for internal errors -internalPos :: Position -internalPos = InternalPosition - --- | returns @True@ if the given position is internal -isInternalPos :: Position -> Bool -isInternalPos InternalPosition = True -isInternalPos _ = False - -{-# INLINE incPos #-} --- | advance column -incPos :: Position -> Int -> Position -incPos (Position offs row col fpos) n = Position (offs + n) row (col + n) fpos -incPos p _ = p - -{-# INLINE retPos #-} --- | advance to next line -retPos :: Position -> Position -retPos (Position offs row _ fpos) = Position (offs+1) (row + 1) 1 fpos -retPos p = p - -{-# INLINE incOffset #-} --- | advance just the offset -incOffset :: Position -> Int -> Position -incOffset (Position o r c f) n = Position (o + n) r c f -incOffset pos _ = pos +{-# LANGUAGE DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- 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+-- Portability : ghc+--+-- Source code position+-----------------------------------------------------------------------------+module Language.C.Data.Position (+ --+ -- source text positions+ --+ Position(),+ position,+ PosLength,+ posFile,posRow,posColumn,posOffset,posParent,+ initPos, isSourcePos,+ nopos, isNoPos,+ builtinPos, isBuiltinPos,+ internalPos, isInternalPos,+ incPos, retPos,+ incOffset,+ Pos(..),+) where+import Data.Generics hiding (Generic)+import GHC.Generics (Generic)+import Control.DeepSeq (NFData)++-- | file position information+data FilePosition = FilePosition { posSrcFile :: String, -- ^ source file+ posParentFile :: (Maybe Position) -- ^ including file, if any+ }+ deriving (Eq, Ord, Typeable, Data, Generic)++instance NFData FilePosition++-- | uniform representation of source file positions+data Position = Position { posOffset :: {-# UNPACK #-} !Int -- ^ absolute offset in the preprocessed 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.+ , posFileInfo :: FilePosition -- ^ position in source file, including files+ }+ | NoPosition+ | BuiltinPosition+ | InternalPosition+ deriving (Eq, Ord, Typeable, Data, Generic)++instance NFData Position++posFile :: Position -> String+posFile = posSrcFile . posFileInfo++posParent :: Position -> (Maybe Position)+posParent = posParentFile . posFileInfo++-- | Position and length of a token+type PosLength = (Position,Int)++instance Show Position where+ showsPrec _ (Position _ row _ (FilePosition fname mparent)) =+ showString "(" . showsPrec 0 fname . showString ": line " . showsPrec 0 row .+ maybe id (\p -> showString ", in file included from " . showsPrec 0 p) mparent .+ showString ")"+ showsPrec _ NoPosition = showString "<no file>"+ showsPrec _ BuiltinPosition = showString "<builtin>"+ showsPrec _ InternalPosition = showString "<internal>"++-- | @position absoluteOffset fileName lineNumber columnNumber@ initializes a @Position@ using the given arguments+position :: Int -> String -> Int -> Int -> Maybe Position -> Position+position offset fname row col mparent = Position offset row col (FilePosition fname mparent)++-- | class of type which aggregate a source code location+class Pos a where+ posOf :: a -> Position++-- | initialize a Position to the start of the translation unit starting in the given file+initPos :: FilePath -> Position+initPos file = Position 0 1 1 (FilePosition file Nothing)++-- | returns @True@ if the given position refers to an actual source file+isSourcePos :: Position -> Bool+isSourcePos (Position _ _ _ _) = True+isSourcePos _ = False++-- | no position (for unknown position information)+nopos :: Position+nopos = NoPosition++-- | returns @True@ if the there is no position information available+isNoPos :: Position -> Bool+isNoPos NoPosition = True+isNoPos _ = False++-- | position attached to built-in objects+--+builtinPos :: Position+builtinPos = BuiltinPosition++-- | returns @True@ if the given position refers to a builtin definition+isBuiltinPos :: Position -> Bool+isBuiltinPos BuiltinPosition = True+isBuiltinPos _ = False++-- | position used for internal errors+internalPos :: Position+internalPos = InternalPosition++-- | returns @True@ if the given position is internal+isInternalPos :: Position -> Bool+isInternalPos InternalPosition = True+isInternalPos _ = False++{-# INLINE incPos #-}+-- | advance column+incPos :: Position -> Int -> Position+incPos (Position offs row col fpos) n = Position (offs + n) row (col + n) fpos+incPos p _ = p++{-# INLINE retPos #-}+-- | advance to next line+retPos :: Position -> Position+retPos (Position offs row _ fpos) = Position (offs+1) (row + 1) 1 fpos+retPos p = p++{-# INLINE incOffset #-}+-- | advance just the offset+incOffset :: Position -> Int -> Position+incOffset (Position o r c f) n = Position (o + n) r c f+incOffset pos _ = pos
src/Language/C/Data/RList.hs view
@@ -1,52 +1,52 @@------------------------------------------------------------------------------ --- | --- Module : Language.C.Data.RList --- Copyright : (c) [2007..2008] Duncan Coutts, Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- Portability : ghc --- --- Due to the way the grammar is constructed we very often have to build lists --- in reverse. To make sure we do this consistently and correctly we have a --- newtype to wrap the reversed style of list: ------------------------------------------------------------------------------ -module Language.C.Data.RList ( - RList,Reversed(..), - empty,singleton,snoc,rappend,appendr,rappendr,rmap,reverse, - viewr, -) -where -import Prelude hiding (reverse) -import qualified Data.List as List - -newtype Reversed a = Reversed a -type RList a = Reversed [a] -empty :: Reversed [a] -empty = Reversed [] - -singleton :: a -> Reversed [a] -singleton x = Reversed [x] - -snoc :: Reversed [a] -> a -> Reversed [a] -snoc (Reversed xs) x = Reversed (x : xs) -infixl 5 `snoc` - -rappend :: Reversed [a] -> [a] -> Reversed [a] -rappend (Reversed xs) ys = Reversed (List.reverse ys ++ xs) - -appendr :: [a] -> Reversed [a] -> Reversed [a] -appendr xs (Reversed ys) = Reversed (ys ++ List.reverse xs) - -rappendr :: Reversed [a] -> Reversed [a] -> Reversed [a] -rappendr (Reversed xs) (Reversed ys) = Reversed (ys ++ xs) - -rmap :: (a -> b) -> Reversed [a] -> Reversed [b] -rmap f (Reversed xs) = Reversed (map f xs) - -reverse :: Reversed [a] -> [a] -reverse (Reversed xs) = List.reverse xs - -viewr :: Reversed [a] -> (Reversed [a] , a) -viewr (Reversed []) = error "viewr: empty RList" -viewr (Reversed (x:xs)) = (Reversed xs, x) +-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Data.RList+-- Copyright : (c) [2007..2008] Duncan Coutts, Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : ghc+--+-- Due to the way the grammar is constructed we very often have to build lists+-- in reverse. To make sure we do this consistently and correctly we have a+-- newtype to wrap the reversed style of list:+-----------------------------------------------------------------------------+module Language.C.Data.RList (+ RList,Reversed(..),+ empty,singleton,snoc,rappend,appendr,rappendr,rmap,reverse,+ viewr,+)+where+import Prelude hiding (reverse)+import qualified Data.List as List++newtype Reversed a = Reversed a+type RList a = Reversed [a]+empty :: Reversed [a]+empty = Reversed []++singleton :: a -> Reversed [a]+singleton x = Reversed [x]++snoc :: Reversed [a] -> a -> Reversed [a]+snoc (Reversed xs) x = Reversed (x : xs)+infixl 5 `snoc`++rappend :: Reversed [a] -> [a] -> Reversed [a]+rappend (Reversed xs) ys = Reversed (List.reverse ys ++ xs)++appendr :: [a] -> Reversed [a] -> Reversed [a]+appendr xs (Reversed ys) = Reversed (ys ++ List.reverse xs)++rappendr :: Reversed [a] -> Reversed [a] -> Reversed [a]+rappendr (Reversed xs) (Reversed ys) = Reversed (ys ++ xs)++rmap :: (a -> b) -> Reversed [a] -> Reversed [b]+rmap f (Reversed xs) = Reversed (map f xs)++reverse :: Reversed [a] -> [a]+reverse (Reversed xs) = List.reverse xs++viewr :: Reversed [a] -> (Reversed [a] , a)+viewr (Reversed []) = error "viewr: empty RList"+viewr (Reversed (x:xs)) = (Reversed xs, x)
src/Language/C/Parser.hs view
@@ -1,36 +1,36 @@-{-# OPTIONS #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Parser --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- Portability : ghc --- --- Language.C parser ------------------------------------------------------------------------------ -module Language.C.Parser ( - -- * Simple API - parseC, - -- * Parser Monad - P,execParser,execParser_,builtinTypeNames, - -- * Exposed Parsers - translUnitP, extDeclP, statementP, expressionP, - -- * Parser Monad - ParseError(..) -) -where -import Language.C.Parser.Parser (parseC,translUnitP, extDeclP, statementP, expressionP) -import Language.C.Parser.ParserMonad (execParser, ParseError(..),P) -import Language.C.Parser.Builtin (builtinTypeNames) - -import Language.C.Data - --- | run the given parser using a new name supply and builtin typedefs --- see 'execParser' --- --- Synopsis: @runParser parser inputStream initialPos@ -execParser_ :: P a -> InputStream -> Position -> Either ParseError a -execParser_ parser input pos = - fmap fst $ execParser parser input pos builtinTypeNames newNameSupply +{-# OPTIONS #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Parser+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : ghc+--+-- Language.C parser+-----------------------------------------------------------------------------+module Language.C.Parser (+ -- * Simple API+ parseC,+ -- * Parser Monad+ P,execParser,execParser_,builtinTypeNames,+ -- * Exposed Parsers+ translUnitP, extDeclP, statementP, expressionP,+ -- * Parser Monad+ ParseError(..)+)+where+import Language.C.Parser.Parser (parseC,translUnitP, extDeclP, statementP, expressionP)+import Language.C.Parser.ParserMonad (execParser, ParseError(..),P)+import Language.C.Parser.Builtin (builtinTypeNames)++import Language.C.Data++-- | run the given parser using a new name supply and builtin typedefs+-- see 'execParser'+--+-- Synopsis: @runParser parser inputStream initialPos@+execParser_ :: P a -> InputStream -> Position -> Either ParseError a+execParser_ parser input pos =+ fmap fst $ execParser parser input pos builtinTypeNames newNameSupply
src/Language/C/Parser/Builtin.hs view
@@ -1,21 +1,23 @@--- | --- Module : Language.C.Parser.Builtin --- Copyright : (c) 2001 Manuel M. T. Chakravarty --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Portability : portable --- --- This module provides information about builtin entities. --- --- Currently, only builtin type names are supported. The only builtin type --- name is `__builtin_va_list', which is a builtin of GNU C. --- -module Language.C.Parser.Builtin ( - builtinTypeNames -) where -import Language.C.Data.Ident (Ident, builtinIdent) - --- predefined type names --- -builtinTypeNames :: [Ident] -builtinTypeNames = [builtinIdent "__builtin_va_list"] +-- |+-- Module : Language.C.Parser.Builtin+-- Copyright : (c) 2001 Manuel M. T. Chakravarty+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Portability : portable+--+-- This module provides information about builtin entities.+--+-- Currently, only builtin type names are supported. The only builtin type+-- name is `__builtin_va_list', which is a builtin of GNU C.+--+module Language.C.Parser.Builtin (+ builtinTypeNames+) where+import Language.C.Data.Ident (Ident, builtinIdent)++-- predefined type names+--+builtinTypeNames :: [Ident]+builtinTypeNames = [+ builtinIdent "__builtin_va_list"+ ]
src/Language/C/Parser/Lexer.x view
@@ -1,566 +1,577 @@------------------------------------------------------------------------------ --- Module : Lexer.x --- Copyright : (c) [1999..2004] Manuel M T Chakravarty --- (c) 2005 Duncan Coutts --- (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Portability : portable --- --- Lexer for C files, after being processed by the C preprocessor --- --- We assume that the input already went through cpp. Thus, we do not handle --- comments and preprocessor directives here. It supports the --- C99 `restrict' extension: <http://www.lysator.liu.se/c/restrict.html> as --- well as inline functions. --- --- Comments: --- --- * Universal character names and multi-character character constants, --- as well as trigraphs are unsupported. They are lexed, but yield an error. --- --- * We add `typedef-name' (K&R 8.9) as a token, as proposed in K&R A13. --- However, as these tokens cannot be recognized lexically, but require a --- context analysis, they are never produced by the lexer, but instead have --- to be introduced in a later phase (by converting the corresponding --- identifiers). --- --- * We also recognize GNU C `__attribute__', `__extension__', `__complex__', --- `__const', `__const__', `__imag', `__imag__', `__inline', `__inline__', --- `__real', `__real__, `__restrict', and `__restrict__'. --- --- * Any line starting with `#pragma' is ignored. --- --- With K&R we refer to ``The C Programming Language'', second edition, Brain --- W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988. --- --- With C99 we refer to ``ISO/IEC 9899:TC3'', --- available online at http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf. --- ---- TODO ---------------------------------------------------------------------- --- --- * There are more GNU C specific keywords. Add them and change `Parser.y' --- correspondingly (in particular, most tokens within __attribute ((...)) --- expressions are actually keywords, but we handle them as identifiers at --- the moment). --- --- * Add support for bytestrings - -{ - -module Language.C.Parser.Lexer (lexC, parseError) where - -import Data.Char (chr, isDigit) -import Data.Word (Word8) -import Control.Monad (liftM, when) - -import Language.C.Data.InputStream - (InputStream, inputStreamEmpty, takeByte, takeChar, takeChars) - --- ( InputStream, readInputStream,inputStreamToString,inputStreamFromString, --- takeByte, takeChar, inputStreamEmpty, takeChars, --- countLines, --- ) -import Language.C.Data.Position -import Language.C.Data.Ident (mkIdent) - -import Language.C.Syntax.Constants - -import Language.C.Parser.Tokens -import Language.C.Parser.ParserMonad -} - -$space = [ \ \t ] -- horizontal white space -$eol = \n -- end of line - -$letter = [a-zA-Z] -$identletter = [a-zA-Z_\$] -- GNU extension: allow $ in variable names -$octdigit = 0-7 -$digit = 0-9 -$digitNZ = 1-9 -$hexdigit = [0-9a-fA-F] - -$inchar = . # [ \\ \' \n \r ] -- valid character in char constant -$instr = . # [ \\ \" \n \r ] -- valid character in a string literal -$infname = . # [ \\ \" ] -- valid character in a filename - -@sp = $space* - --- character escape sequence (follows K&R A2.5.2) --- --- * also used for strings --- * C99: 6.4.4.4 -@charesc = \\([ntvbrfaeE\\\?\'\"]|$octdigit{1,3}|x$hexdigit+) -@ucn = \\u$hexdigit{4}|\\U$hexdigit{8} - --- components of integer constants --- --- * C99: 6.4.4.1 -@int = $digitNZ$digit* - --- integer suffixes -@llsuffix = ll|LL -@gnusuffix = [ij]? -@intsuffix = [uU][lL]?|[uU]@llsuffix|[lL][uU]?|@llsuffix[uU]? -@intgnusuffix = @intsuffix@gnusuffix?|@gnusuffix@intsuffix? - --- components of float constants (follows K&R A2.5.3) --- --- * C99: 6.4.4.2 -@digits = $digit+ -@intpart = @digits -@fractpart = @digits - -@mantpart = @intpart?\.@fractpart|@intpart\. -@exppart = [eE][\+\-]?@digits - -@hexprefix = 0x -@hexdigits = $hexdigit+ -@hexmant = @hexdigits?\.@hexdigits|@hexdigits\. -@binexp = [pP][\+\-]?@digits - --- Suffixes `qQwW` are GNU floating type extensions: <https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html> -@floatsuffix = [fFlLqQwW] -@floatgnusuffix = @floatsuffix@gnusuffix?|@gnusuffix@floatsuffix? - --- clang version literals with a major.minor.rev -@clangversion = @intpart\.@intpart\.@intpart - -tokens :- - --- whitespace (follows K&R A2.1) --- --- * horizontal and vertical tabs, newlines, and form feeds are filter out by --- `Lexers.ctrlLexer' --- --- * comments are not handled, as we assume the input already went through cpp --- -$white+ ; - --- #line directive (C11 6.10.4, GCC Line Control) --- --- * standard form: int => change line number --- * standard form: int string => change source file and line number --- * preprocessor (gcc/clang): int string int => change source file and line number, --- push or pop item from stack --- --- * see https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html --- -\#$space*@int$space*(\"($infname|@charesc)*\"$space*)?(@int$space*)*\r?$eol - { \pos len str -> setPos (adjustLineDirective len (takeChars len str) pos) >> lexToken' False } - --- #pragma directive (K&R A12.8) --- --- * we simply ignore any #pragma (but take care to update the position --- information) --- -\#$space*pragma.*$eol ; - --- #ident directive, eg used by rcs/cvs --- --- * we simply ignore any #ident (but take care to update the position --- information) --- -\#$space*ident.*$eol ; - --- identifiers and keywords (follows K&R A2.3 and A2.4) --- -$identletter($identletter|$digit)* { \pos len str -> idkwtok (takeChars len str) pos } - --- constants (follows K&R A2.5) --- --- * K&R,C99 explicitly mention `enumeration-constants'; however, as they are --- lexically identifiers, we do not have an extra case for them --- - --- integer constants (follows K&R A2.5.1, C99 6.4.4.1) --- NOTE: 0 is lexed as octal integer constant, and readCOctal takes care of this -0$octdigit*@intgnusuffix? { token_plus CTokILit readCOctal } -$digitNZ$digit*@intgnusuffix? { token_plus CTokILit (readCInteger DecRepr) } -0[xX]$hexdigit+@intgnusuffix? { token_plus CTokILit (readCInteger HexRepr . drop 2) } - -(0$octdigit*|$digitNZ$digit*|0[xX]$hexdigit+)[uUlL]+ { token_fail "Invalid integer constant suffix" } - --- character constants (follows K&R A2.5.2, C99 6.4.4.4) --- --- * Universal Character Names are unsupported and cause an error. -\'($inchar|@charesc)\' { token CTokCLit (cChar . fst . unescapeChar . tail) } -L\'($inchar|@charesc)\' { token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) } -\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars False . unescapeMultiChars .tail) } -L\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) } - --- Clang version literals -@clangversion { token (\pos -> CTokClangC pos . ClangCVersionTok) readClangCVersion } - --- float constants (follows K&R A2.5.3. C99 6.4.4.2) --- --- * NOTE: Hexadecimal floating constants without binary exponents are forbidden. --- They generate a lexer error, because they are hard to recognize in the parser. -(@mantpart@exppart?|@intpart@exppart)@floatgnusuffix? { token CTokFLit readCFloat } -@hexprefix(@hexmant|@hexdigits)@binexp@floatgnusuffix? { token CTokFLit readCFloat } -@hexprefix@hexmant { token_fail "Hexadecimal floating constant requires an exponent" } - --- string literal (follows K&R A2.6) --- C99: 6.4.5. -\"($instr|@charesc)*\" { token CTokSLit (cString . unescapeString . init . tail) } -L\"($instr|@charesc)*\" { token CTokSLit (cString_w . unescapeString . init . tail . tail) } - -L?\'@ucn\' { token_fail "Universal character names are unsupported" } -L?\'\\[^0-7'\"\?\\abfnrtvuUx]\' { token_fail "Invalid escape sequence" } -L?\"($inchar|@charesc)*@ucn($inchar|@charesc|@ucn)*\" { token_fail "Universal character names in string literals are unsupported"} - --- operators and separators --- -"(" { 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 } - - -{ --- Fix the 'octal' lexing of '0' -readCOctal :: String -> Either String CInteger -readCOctal s@('0':r) = - case r of - (c:_) | isDigit c -> readCInteger OctalRepr r - _ -> readCInteger DecRepr s -readCOctal _ = error "ReadOctal: string does not start with `0'" - --- We use the odd looking list of string patterns here rather than normal --- 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 change makes a significant performance difference [chak] --- --- To make this a little more maintainable, we autogenerate it from this list, --- using the script GenerateKeywords.hs (in /scripts) -{- -alignas _Alignas, alignof _Alignof __alignof alignof __alignof__, asm @__, atomic _Atomic, auto -break, bool _Bool, -case, char, const @__, continue, complex _Complex __complex__ -default, do, double, -else, enum, extern, -float, for, goto, -if, inline @__, int, __int128, long, noreturn _Noreturn, -float, for, -generic _Generic, goto, -if, inline @__, int, int128 __int128, long, -noreturn _Noreturn, _Nullable __nullable, _Nonnull __nonnull, -register, restrict @__, return -short, signed @__, sizeof, static, staticAssert _Static_assert, struct, switch, -typedef, typeof @__, thread __thread _Thread_local -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 -(CTokClangC ClangBuiltinConvertVector) __builtin_convertvector --} --- Tokens: _Alignas _Alignof __alignof alignof __alignof__ __asm asm __asm__ _Atomic auto break _Bool case char __const const __const__ continue _Complex __complex__ default do double else enum extern float __float128 _Float128 for _Generic goto if __inline inline __inline__ int __int128 long _Noreturn _Nullable __nullable _Nonnull __nonnull register __restrict restrict __restrict__ return short __signed signed __signed__ sizeof static _Static_assert struct switch typedef __typeof typeof __typeof__ __thread _Thread_local union unsigned void __volatile volatile __volatile__ while __label__ __attribute __attribute__ __extension__ __real __real__ __imag __imag__ __builtin_va_arg __builtin_offsetof __builtin_types_compatible_p __builtin_convertvector -idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'a' : 's' : []) = tok 8 CTokAlignas -idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 8 CTokAlignof -idkwtok ('_' : 'A' : 't' : 'o' : 'm' : 'i' : 'c' : []) = tok 7 CTokAtomic -idkwtok ('_' : 'B' : 'o' : 'o' : 'l' : []) = tok 5 CTokBool -idkwtok ('_' : 'C' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : []) = tok 8 CTokComplex -idkwtok ('_' : 'N' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 8 CTokNonnull -idkwtok ('_' : 'G' : 'e' : 'n' : 'e' : 'r' : 'i' : 'c' : []) = tok 8 CTokGeneric -idkwtok ('_' : 'N' : 'o' : 'r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 9 CTokNoreturn -idkwtok ('_' : 'N' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 9 CTokNullable -idkwtok ('_' : 'S' : 't' : 'a' : 't' : 'i' : 'c' : '_' : 'a' : 's' : 's' : 'e' : 'r' : 't' : []) = tok 14 CTokStaticAssert -idkwtok ('_' : 'T' : 'h' : 'r' : 'e' : 'a' : 'd' : '_' : 'l' : 'o' : 'c' : 'a' : 'l' : []) = tok 13 CTokThread -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 ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'c' : 'o' : 'n' : 'v' : 'e' : 'r' : 't' : 'v' : 'e' : 'c' : 't' : 'o' : 'r' : []) = tok 23 (flip CTokClangC ClangBuiltinConvertVector) -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' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 10 CTokFloat128 -idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 9 CTokFloat128 -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 ('_' : '_' : 'i' : 'n' : 't' : '1' : '2' : '8' : []) = tok 8 CTokInt128 -idkwtok ('_' : '_' : 'l' : 'a' : 'b' : 'e' : 'l' : '_' : '_' : []) = tok 9 CTokLabel -idkwtok ('l' : 'o' : 'n' : 'g' : []) = tok 4 CTokLong -idkwtok ('_' : '_' : 'n' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 9 CTokNonnull -idkwtok ('_' : '_' : 'n' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 10 CTokNullable -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,len) ident) - else return (CTokIdent (pos,len) ident) - -ignoreAttribute :: P () -ignoreAttribute = skipTokens (0::Int) - where skipTokens :: Int -> P () - skipTokens n = do - ntok <- lexToken' False - case ntok of - CTokRParen _ | n == 1 -> return () - | otherwise -> skipTokens (n-1) - CTokLParen _ -> skipTokens (n+1) - _ -> skipTokens n - -tok :: Int -> (PosLength -> CToken) -> Position -> P CToken -tok len tc pos = return (tc (pos,len)) - -adjustLineDirective :: Int -> String -> Position -> Position -adjustLineDirective pragmaLen str pos = - offs' `seq` fname' `seq` row' `seq` parent' `seq` (position offs' fname' row' 1 parent') - where - -- offset changes by length of #line pragma - offs' = (posOffset pos) + pragmaLen - str' = dropWhite . drop 1 $ str - (rowStr, str'') = span isDigit str' - -- row changes to the first number in the line pragma - row' = read rowStr - str''' = dropWhite str'' - (fnameStr,str'''') = span (/= '"') . drop 1 $ str''' - fname = posFile pos - no_fn = null str''' || (head str''' /= '"') || (head str'''' /= '"') - -- filename changes to new filename, if specified - fname' | no_fn = fname - -- try and get more sharing of file name strings - | fnameStr == fname = fname - | otherwise = fnameStr - -- analye flags - min_flag = find_min_flag (5 :: Int) (drop 1 str'''') - find_min_flag cur_min = select_min . span isDigit . dropWhile (not . isDigit) - where - select_min (numStr, fstr') | null numStr = cur_min - | otherwise = find_min_flag (read numStr `min` cur_min) fstr' - parent = posParent pos - parent' = case min_flag of - 1 -> Just pos -- push - 2 -> case parent >>= posParent of - Nothing -> Nothing -- pop/underflow - Just gp -> gp `seq` Just gp -- pop - 3 -> parent -- unchanged stack, system header info - 4 -> parent -- unchanged stack, extern C info - _ -> Nothing - -- - dropWhite = dropWhile (\c -> c == ' ' || c == '\t') - --- special utility for the lexer -unescapeMultiChars :: String -> [Char] -unescapeMultiChars cs@(_ : _ : _) = case unescapeChar cs of (c,cs') -> c : unescapeMultiChars cs' -unescapeMultiChars ('\'' : []) = [] -unescapeMultiChars _ = error "Unexpected end of multi-char constant" - -{-# INLINE token_ #-} --- token that ignores the string -token_ :: Int -> (PosLength -> CToken) -> Position -> Int -> InputStream -> P CToken -token_ len mkTok pos _ _ = return (mkTok (pos,len)) - -{-# INLINE token_fail #-} --- error token -token_fail :: String -> Position -> - Int -> InputStream -> P CToken -token_fail errmsg pos _ _ = failP pos [ "Lexical Error !", errmsg ] - - -{-# INLINE token #-} --- token that uses the string -token :: (PosLength -> a -> CToken) -> (String -> a) - -> Position -> Int -> InputStream -> P CToken -token mkTok fromStr pos len str = return (mkTok (pos,len) (fromStr $ takeChars len str)) - -{-# INLINE token_plus #-} --- token that may fail -token_plus :: (PosLength -> a -> CToken) -> (String -> Either String a) - -> Position -> Int -> InputStream -> P CToken -token_plus mkTok fromStr pos len str = - case fromStr (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ] - Right ok -> return $! mkTok (pos,len) ok - --- ----------------------------------------------------------------------------- --- The input type - -type AlexInput = (Position, -- current position, - InputStream) -- current input string - -alexInputPrevChar :: AlexInput -> Char -alexInputPrevChar _ = error "alexInputPrevChar not used" - --- for alex-3.0 -alexGetByte :: AlexInput -> Maybe (Word8, AlexInput) -alexGetByte (p,is) | inputStreamEmpty is = Nothing - | otherwise = let (b,s) = takeByte is in - -- this is safe for latin-1, but ugly - let p' = alexMove p (chr (fromIntegral b)) in p' `seq` - Just (b, (p', s)) - -alexGetChar :: AlexInput -> Maybe (Char,AlexInput) -alexGetChar (p,is) | inputStreamEmpty is = Nothing - | otherwise = let (c,s) = takeChar is in - let p' = alexMove p c in p' `seq` - Just (c, (p', s)) - -alexMove :: Position -> Char -> Position -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 - pos <- getPos - (c,_) <- liftM takeChar getInput - failP pos - ["Lexical error !", - "The character " ++ show c ++ " does not fit here."] - -parseError :: P a -parseError = do - lastTok <- getLastToken - failP (posOf lastTok) - ["Syntax error !", - "The symbol `" ++ show lastTok ++ "' 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 = lexToken' True - -lexToken' :: Bool -> P CToken -lexToken' modifyCache = do - pos <- getPos - inp <- getInput - case alexScan (pos, inp) 0 of - AlexEOF -> do - handleEofToken - return CTokEof - AlexError _inp -> lexicalError - AlexSkip (pos', inp') _len -> do - setPos pos' - setInput inp' - lexToken' modifyCache - AlexToken (pos', inp') len action -> do - setPos pos' - setInput inp' - nextTok <- action pos len inp - when modifyCache $ setLastToken nextTok - return nextTok - -lexC :: (CToken -> P a) -> P a -lexC cont = do - nextTok <- lexToken - cont nextTok -} +-----------------------------------------------------------------------------+-- Module : Lexer.x+-- Copyright : (c) [1999..2004] Manuel M T Chakravarty+-- (c) 2005 Duncan Coutts+-- (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Portability : portable+--+-- Lexer for C files, after being processed by the C preprocessor+--+-- We assume that the input already went through cpp. Thus, we do not handle+-- comments and preprocessor directives here. It supports the+-- C99 `restrict' extension: <http://www.lysator.liu.se/c/restrict.html> as+-- well as inline functions.+--+-- Comments:+--+-- * Universal character names and multi-character character constants,+-- as well as trigraphs are unsupported. They are lexed, but yield an error.+--+-- * We add `typedef-name' (K&R 8.9) as a token, as proposed in K&R A13.+-- However, as these tokens cannot be recognized lexically, but require a+-- context analysis, they are never produced by the lexer, but instead have+-- to be introduced in a later phase (by converting the corresponding+-- identifiers).+--+-- * We also recognize GNU C `__attribute__', `__extension__', `__complex__',+-- `__const', `__const__', `__imag', `__imag__', `__inline', `__inline__',+-- `__real', `__real__, `__restrict', and `__restrict__'.+--+-- * Any line starting with `#pragma' is ignored.+--+-- With K&R we refer to ``The C Programming Language'', second edition, Brain+-- W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988.+--+-- With C99 we refer to ``ISO/IEC 9899:TC3'',+-- available online at http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf.+--+--- TODO ----------------------------------------------------------------------+--+-- * There are more GNU C specific keywords. Add them and change `Parser.y'+-- correspondingly (in particular, most tokens within __attribute ((...))+-- expressions are actually keywords, but we handle them as identifiers at+-- the moment).+--+-- * Add support for bytestrings++{++module Language.C.Parser.Lexer (lexC, parseError) where++import Data.Char (chr, isDigit)+import Data.Word (Word8)+import Control.Monad (liftM, when)++import Language.C.Data.InputStream+ (InputStream, inputStreamEmpty, takeByte, takeChar, takeChars)++-- ( InputStream, readInputStream,inputStreamToString,inputStreamFromString,+-- takeByte, takeChar, inputStreamEmpty, takeChars,+-- countLines,+-- )+import Language.C.Data.Position+import Language.C.Data.Ident (mkIdent)++import Language.C.Syntax.Constants++import Language.C.Parser.Tokens+import Language.C.Parser.ParserMonad+}++$space = [ \ \t ] -- horizontal white space+$eol = \n -- end of line++$letter = [a-zA-Z]+$identletter = [a-zA-Z_\$] -- GNU extension: allow $ in variable names+$octdigit = 0-7+$digit = 0-9+$digitNZ = 1-9+$hexdigit = [0-9a-fA-F]++$inchar = . # [ \\ \' \n \r ] -- valid character in char constant+$instr = . # [ \\ \" \n \r ] -- valid character in a string literal+$infname = . # [ \\ \" ] -- valid character in a filename++@sp = $space*++-- character escape sequence (follows K&R A2.5.2)+--+-- * also used for strings+-- * C99: 6.4.4.4+@charesc = \\([ntvbrfaeE\\\?\'\"]|$octdigit{1,3}|x$hexdigit+)+@ucn = \\u$hexdigit{4}|\\U$hexdigit{8}++-- components of integer constants+--+-- * C99: 6.4.4.1+@int = $digitNZ$digit*++-- integer suffixes+@llsuffix = ll|LL+@gnusuffix = [ij]?+@intsuffix = [uU][lL]?|[uU]@llsuffix|[lL][uU]?|@llsuffix[uU]?+@intgnusuffix = @intsuffix@gnusuffix?|@gnusuffix@intsuffix?++-- components of float constants (follows K&R A2.5.3)+--+-- * C99: 6.4.4.2+@digits = $digit++@intpart = @digits+@fractpart = @digits++@mantpart = @intpart?\.@fractpart|@intpart\.+@exppart = [eE][\+\-]?@digits++@hexprefix = 0x+@hexdigits = $hexdigit++@hexmant = @hexdigits?\.@hexdigits|@hexdigits\.+@binexp = [pP][\+\-]?@digits++-- Suffixes `qQwW` are GNU floating type extensions: <https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html>+@iec60559suffix = (32|64|128)[x]?+@floatsuffix = [fFlLqQwW]@iec60559suffix?+@floatgnusuffix = @floatsuffix@gnusuffix?|@gnusuffix@floatsuffix?++-- clang version literals with a major.minor.rev+@clangversion = @intpart\.@intpart\.@intpart++tokens :-++-- whitespace (follows K&R A2.1)+--+-- * horizontal and vertical tabs, newlines, and form feeds are filter out by+-- `Lexers.ctrlLexer'+--+-- * comments are not handled, as we assume the input already went through cpp+--+$white+ ;++-- #line directive (C11 6.10.4, GCC Line Control)+--+-- * standard form: int => change line number+-- * standard form: int string => change source file and line number+-- * preprocessor (gcc/clang): int string int => change source file and line number,+-- push or pop item from stack+--+-- * see https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html+--+\#$space*@int$space*(\"($infname|@charesc)*\"$space*)?(@int$space*)*\r?$eol+ { \pos len str -> setPos (adjustLineDirective len (takeChars len str) pos) >> lexToken' False }++-- #pragma directive (K&R A12.8)+--+-- * we simply ignore any #pragma (but take care to update the position+-- information)+--+\#$space*pragma.*$eol ;++-- #ident directive, eg used by rcs/cvs+--+-- * we simply ignore any #ident (but take care to update the position+-- information)+--+\#$space*ident.*$eol ;++-- identifiers and keywords (follows K&R A2.3 and A2.4)+--+$identletter($identletter|$digit)* { \pos len str -> idkwtok (takeChars len str) pos }++-- constants (follows K&R A2.5)+--+-- * K&R,C99 explicitly mention `enumeration-constants'; however, as they are+-- lexically identifiers, we do not have an extra case for them+--++-- integer constants (follows K&R A2.5.1, C99 6.4.4.1)+-- NOTE: 0 is lexed as octal integer constant, and readCOctal takes care of this+0$octdigit*@intgnusuffix? { token_plus CTokILit readCOctal }+$digitNZ$digit*@intgnusuffix? { token_plus CTokILit (readCInteger DecRepr) }+0[xX]$hexdigit+@intgnusuffix? { token_plus CTokILit (readCInteger HexRepr . drop 2) }++(0$octdigit*|$digitNZ$digit*|0[xX]$hexdigit+)[uUlL]+ { token_fail "Invalid integer constant suffix" }++-- character constants (follows K&R A2.5.2, C99 6.4.4.4)+--+-- * Universal Character Names are unsupported and cause an error.+\'($inchar|@charesc)\' { token CTokCLit (cChar . fst . unescapeChar . tail) }+L\'($inchar|@charesc)\' { token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) }+\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars False . unescapeMultiChars .tail) }+L\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) }++-- Clang version literals+@clangversion { token (\pos -> CTokClangC pos . ClangCVersionTok) readClangCVersion }++-- float constants (follows K&R A2.5.3. C99 6.4.4.2)+--+-- * NOTE: Hexadecimal floating constants without binary exponents are forbidden.+-- They generate a lexer error, because they are hard to recognize in the parser.+(@mantpart@exppart?|@intpart@exppart)@floatgnusuffix? { token CTokFLit readCFloat }+@hexprefix(@hexmant|@hexdigits)@binexp@floatgnusuffix? { token CTokFLit readCFloat }+@hexprefix@hexmant { token_fail "Hexadecimal floating constant requires an exponent" }++-- string literal (follows K&R A2.6)+-- C99: 6.4.5.+\"($instr|@charesc)*\" { token CTokSLit (cString . unescapeString . init . tail) }+L\"($instr|@charesc)*\" { token CTokSLit (cString_w . unescapeString . init . tail . tail) }++L?\'@ucn\' { token_fail "Universal character names are unsupported" }+L?\'\\[^0-7'\"\?\\abfnrtvuUx]\' { token_fail "Invalid escape sequence" }+L?\"($inchar|@charesc)*@ucn($inchar|@charesc|@ucn)*\" { token_fail "Universal character names in string literals are unsupported"}++-- operators and separators+--+"(" { 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 }+++{+-- Fix the 'octal' lexing of '0'+readCOctal :: String -> Either String CInteger+readCOctal s@('0':r) =+ case r of+ (c:_) | isDigit c -> readCInteger OctalRepr r+ _ -> readCInteger DecRepr s+readCOctal _ = error "ReadOctal: string does not start with `0'"+++-- We use the odd looking list of string patterns here rather than normal+-- 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 change makes a significant performance difference [chak]+--+-- To make this a little more maintainable, we autogenerate it from this list,+-- using the script GenerateKeywords.hs (in /scripts)+{-+alignas _Alignas, alignof _Alignof __alignof alignof __alignof__, asm @__, atomic _Atomic, auto+break, bool _Bool,+case, char, const @__, continue, complex _Complex __complex__+default, do, double,+else, enum, extern,+float, for,+generic _Generic, goto,+if, inline @__, int, int128 __int128, long,+noreturn _Noreturn, _Nonnull __nonnull, _Nullable __nullable,+register, restrict @__, return+short, signed @__, sizeof, static, staticAssert _Static_assert, struct, switch,+typedef, typeof @__, thread __thread _Thread_local+union, unsigned, void, volatile @__,+while,+label __label__+(CTokFloatN 32 False) _Float32+(CTokFloatN 32 True) _Float32x+(CTokFloatN 64 False) _Float64+(CTokFloatN 64 True) _Float64x+(CTokFloatN 128 False) _Float128 __float128+(CTokFloatN 128 True) _Float128x+(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+(CTokClangC ClangBuiltinConvertVector) __builtin_convertvector+-}+-- Tokens: _Alignas _Alignof __alignof alignof __alignof__ __asm asm __asm__ _Atomic auto break _Bool case char __const const __const__ continue _Complex __complex__ default do double else enum extern float for _Generic goto if __inline inline __inline__ int __int128 long _Noreturn __nullable __nonnull register __restrict restrict __restrict__ return short __signed signed __signed__ sizeof static _Static_assert struct switch typedef __typeof typeof __typeof__ __thread _Thread_local union unsigned void __volatile volatile __volatile__ while __label__ _Float32 _Float32x _Float64 _Float64x _Float128 __float128 _Float128x __attribute __attribute__ __extension__ __real __real__ __imag __imag__ __builtin_va_arg __builtin_offsetof __builtin_types_compatible_p __builtin_convertvector+idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'a' : 's' : []) = tok 8 CTokAlignas+idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 8 CTokAlignof+idkwtok ('_' : 'A' : 't' : 'o' : 'm' : 'i' : 'c' : []) = tok 7 CTokAtomic+idkwtok ('_' : 'B' : 'o' : 'o' : 'l' : []) = tok 5 CTokBool+idkwtok ('_' : 'C' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : []) = tok 8 CTokComplex+idkwtok ('_' : 'G' : 'e' : 'n' : 'e' : 'r' : 'i' : 'c' : []) = tok 8 CTokGeneric+idkwtok ('_' : 'N' : 'o' : 'r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 9 CTokNoreturn+idkwtok ('_' : 'S' : 't' : 'a' : 't' : 'i' : 'c' : '_' : 'a' : 's' : 's' : 'e' : 'r' : 't' : []) = tok 14 CTokStaticAssert+idkwtok ('_' : 'T' : 'h' : 'r' : 'e' : 'a' : 'd' : '_' : 'l' : 'o' : 'c' : 'a' : 'l' : []) = tok 13 CTokThread+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' : '_' : 'c' : 'o' : 'n' : 'v' : 'e' : 'r' : 't' : 'v' : 'e' : 'c' : 't' : 'o' : 'r' : []) = tok 23 (flip CTokClangC ClangBuiltinConvertVector)+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' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 10 (CTokFloatN 128 False)+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 ('_' : '_' : 'i' : 'n' : 't' : '1' : '2' : '8' : []) = tok 8 CTokInt128+idkwtok ('_' : '_' : 'l' : 'a' : 'b' : 'e' : 'l' : '_' : '_' : []) = tok 9 CTokLabel+idkwtok ('l' : 'o' : 'n' : 'g' : []) = tok 4 CTokLong+idkwtok ('_' : '_' : 'n' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 9 CTokNonnull+idkwtok ('_' : '_' : 'n' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 10 CTokNullable+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+#ifdef IEC_60559_TYPES_EXT+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '3' : '2' : []) = tok 8 (CTokFloatN 32 False)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '3' : '2' : 'x' : []) = tok 9 (CTokFloatN 32 True)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '6' : '4' : []) = tok 8 (CTokFloatN 64 False)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '6' : '4' : 'x' : []) = tok 9 (CTokFloatN 64 True)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 9 (CTokFloatN 128 False)+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : 'x' : []) = tok 10 (CTokFloatN 128 True)+#endif++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,len) ident)+ else return (CTokIdent (pos,len) ident)++ignoreAttribute :: P ()+ignoreAttribute = skipTokens (0::Int)+ where skipTokens :: Int -> P ()+ skipTokens n = do+ ntok <- lexToken' False+ case ntok of+ CTokRParen _ | n == 1 -> return ()+ | otherwise -> skipTokens (n-1)+ CTokLParen _ -> skipTokens (n+1)+ _ -> skipTokens n++tok :: Int -> (PosLength -> CToken) -> Position -> P CToken+tok len tc pos = return (tc (pos,len))++adjustLineDirective :: Int -> String -> Position -> Position+adjustLineDirective pragmaLen str pos =+ offs' `seq` fname' `seq` row' `seq` parent' `seq` (position offs' fname' row' 1 parent')+ where+ -- offset changes by length of #line pragma+ offs' = (posOffset pos) + pragmaLen+ str' = dropWhite . drop 1 $ str+ (rowStr, str'') = span isDigit str'+ -- row changes to the first number in the line pragma+ row' = read rowStr+ str''' = dropWhite str''+ (fnameStr,str'''') = span (/= '"') . drop 1 $ str'''+ fname = posFile pos+ no_fn = null str''' || (head str''' /= '"') || (head str'''' /= '"')+ -- filename changes to new filename, if specified+ fname' | no_fn = fname+ -- try and get more sharing of file name strings+ | fnameStr == fname = fname+ | otherwise = fnameStr+ -- analye flags+ min_flag = find_min_flag (5 :: Int) (drop 1 str'''')+ find_min_flag cur_min = select_min . span isDigit . dropWhile (not . isDigit)+ where+ select_min (numStr, fstr') | null numStr = cur_min+ | otherwise = find_min_flag (read numStr `min` cur_min) fstr'+ parent = posParent pos+ parent' = case min_flag of+ 1 -> Just pos -- push+ 2 -> case parent >>= posParent of+ Nothing -> Nothing -- pop/underflow+ Just gp -> gp `seq` Just gp -- pop+ 3 -> parent -- unchanged stack, system header info+ 4 -> parent -- unchanged stack, extern C info+ _ -> Nothing+ --+ dropWhite = dropWhile (\c -> c == ' ' || c == '\t')++-- special utility for the lexer+unescapeMultiChars :: String -> [Char]+unescapeMultiChars cs@(_ : _ : _) = case unescapeChar cs of (c,cs') -> c : unescapeMultiChars cs'+unescapeMultiChars ('\'' : []) = []+unescapeMultiChars _ = error "Unexpected end of multi-char constant"++{-# INLINE token_ #-}+-- token that ignores the string+token_ :: Int -> (PosLength -> CToken) -> Position -> Int -> InputStream -> P CToken+token_ len mkTok pos _ _ = return (mkTok (pos,len))++{-# INLINE token_fail #-}+-- error token+token_fail :: String -> Position ->+ Int -> InputStream -> P CToken+token_fail errmsg pos _ _ = failP pos [ "Lexical Error !", errmsg ]+++{-# INLINE token #-}+-- token that uses the string+token :: (PosLength -> a -> CToken) -> (String -> a)+ -> Position -> Int -> InputStream -> P CToken+token mkTok fromStr pos len str = return (mkTok (pos,len) (fromStr $ takeChars len str))++{-# INLINE token_plus #-}+-- token that may fail+token_plus :: (PosLength -> a -> CToken) -> (String -> Either String a)+ -> Position -> Int -> InputStream -> P CToken+token_plus mkTok fromStr pos len str =+ case fromStr (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]+ Right ok -> return $! mkTok (pos,len) ok++-- -----------------------------------------------------------------------------+-- The input type++type AlexInput = (Position, -- current position,+ InputStream) -- current input string++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar _ = error "alexInputPrevChar not used"++-- for alex-3.0+alexGetByte :: AlexInput -> Maybe (Word8, AlexInput)+alexGetByte (p,is) | inputStreamEmpty is = Nothing+ | otherwise = let (b,s) = takeByte is in+ -- this is safe for latin-1, but ugly+ let p' = alexMove p (chr (fromIntegral b)) in p' `seq`+ Just (b, (p', s))++alexGetChar :: AlexInput -> Maybe (Char,AlexInput)+alexGetChar (p,is) | inputStreamEmpty is = Nothing+ | otherwise = let (c,s) = takeChar is in+ let p' = alexMove p c in p' `seq`+ Just (c, (p', s))++alexMove :: Position -> Char -> Position+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+ pos <- getPos+ (c,_) <- liftM takeChar getInput+ failP pos+ ["Lexical error !",+ "The character " ++ show c ++ " does not fit here."]++parseError :: P a+parseError = do+ lastTok <- getLastToken+ failP (posOf lastTok)+ ["Syntax error !",+ "The symbol `" ++ show lastTok ++ "' 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 = lexToken' True++lexToken' :: Bool -> P CToken+lexToken' modifyCache = do+ pos <- getPos+ inp <- getInput+ case alexScan (pos, inp) 0 of+ AlexEOF -> do+ handleEofToken+ return CTokEof+ AlexError _inp -> lexicalError+ AlexSkip (pos', inp') _len -> do+ setPos pos'+ setInput inp'+ lexToken' modifyCache+ AlexToken (pos', inp') len action -> do+ setPos pos'+ setInput inp'+ nextTok <- action pos len inp+ when modifyCache $ setLastToken nextTok+ return nextTok++lexC :: (CToken -> P a) -> P a+lexC cont = do+ nextTok <- lexToken+ cont nextTok+}
src/Language/C/Parser/Parser.y view
@@ -1,2345 +1,2356 @@------------------------------------------------------------------------------ --- Module : Parser.y --- Copyright : (c) 2005-2007 Duncan Coutts --- (c) 2008 Benedikt Huber --- (c) [1999..2004] Manuel M T Chakravarty --- Portions copyright 1989, 1990 James A. Roskind --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Portability : portable --- --- Parser for C translation units, which have already been run through the C --- preprocessor. It is recommended to use the `strict' flag for happy. --- --- The parser recognizes all of ISO C 99 and most GNU C extensions. --- --- With C99 we refer to the ISO C99 standard, specifically the section numbers --- used below refer to this report: --- --- <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf> --- --- GNU extensions are documented in the gcc parser --- --- <http://gcc.gnu.org/viewcvs/trunk/gcc/c-parser.c> --- --- and in: <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html> --- --- The set of supported extensions is documented in --- --- <http://www.sivity.net/projects/language.c/wiki/Cee> ------------------------------------------------------------------- -{ -module Language.C.Parser.Parser ( - -- * Parse a C translation unit - parseC, - -- * Exposed Parsers - translUnitP, extDeclP, statementP, expressionP -) where - --- Relevant C99 sections: --- --- 6.5 Expressions .1 - .17 and 6.6 (almost literally) --- Supported GNU extensions: --- - Allow a compound statement as an expression --- - Various __builtin_* forms that take type parameters --- - `alignof' expression or type --- - `__extension__' to suppress warnings about extensions --- - Allow taking address of a label with: && label --- - Omitting the `then' part of conditional expressions --- - complex numbers --- --- 6.7 C Declarations .1 -.8 --- Supported GNU extensions: --- - '__thread' thread local storage (6.7.1) --- --- 6.8 Statements .1 - .8 --- Supported GNU extensions: --- - case ranges (C99 6.8.1) --- - '__label__ ident;' declarations (C99 6.8.2) --- - computed gotos (C99 6.8.6) --- --- 6.9 Translation unit --- Supported GNU extensions: --- - allow empty translation_unit --- - allow redundant ';' --- - allow extension keyword before external declaration --- - asm definitions --- --- Since some of the grammar productions are quite difficult to read, --- (especially those involved with the decleration syntax) we document them --- with an extended syntax that allows a more consise representation: --- --- Ordinary rules --- --- foo named terminal or non-terminal --- --- 'c' terminal, literal character token --- --- A B concatenation --- --- A | B alternation --- --- (A) grouping --- --- Extended rules --- --- A? optional, short hand for (A|) or [A]{ 0==A || 1==A } --- --- ... stands for some part of the grammar omitted for clarity --- --- {A} represents sequences, 0 or more. --- --- <permute> modifier which states that any permutation of the immediate subterms is valid --- --- ---- TODO ---------------------------------------------------------------------- --- --- !* We ignore C11 _Atomic type annotations --- !* We ignore the C99 static keyword (see C99 6.7.5.3) --- !* We do not distinguish in the AST between incomplete array types and --- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2) --- !* The AST doesn't allow recording __attribute__ of unnamed struct field --- (see , struct_default_declaring_list, struct_identifier_declarator) --- !* see `We're being far to liberal here' (... struct definition within structs) --- * Documentation isn't complete and consistent yet. - -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(..), ClangCTok (..), 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 -import Language.C.Data.Ident -import Language.C.Data.Name -import Language.C.Data.Node -import Language.C.Data.Position -import Language.C.Syntax - -} --- in order to document the parsers, we have to alias them -%name translation_unit translation_unit -%name external_declaration external_declaration -%name statement statement -%name expression expression - -%tokentype { CToken } - -%monad { P } { >>= } { return } -%lexer { lexC } { CTokEof } - -%expect 1 - -%token - -'(' { CTokLParen _ } -')' { CTokRParen _ } -'[' { CTokLBracket _ } -']' { CTokRBracket _ } -"->" { CTokArrow _ } -'.' { CTokDot _ } -'!' { CTokExclam _ } -'~' { CTokTilde _ } -"++" { CTokInc _ } -"--" { CTokDec _ } -'+' { CTokPlus _ } -'-' { CTokMinus _ } -'*' { CTokStar _ } -'/' { CTokSlash _ } -'%' { CTokPercent _ } -'&' { CTokAmper _ } -"<<" { CTokShiftL _ } -">>" { CTokShiftR _ } -'<' { CTokLess _ } -"<=" { CTokLessEq _ } -'>' { CTokHigh _ } -">=" { CTokHighEq _ } -"==" { CTokEqual _ } -"!=" { CTokUnequal _ } -'^' { CTokHat _ } -'|' { CTokBar _ } -"&&" { CTokAnd _ } -"||" { CTokOr _ } -'?' { CTokQuest _ } -':' { CTokColon _ } -'=' { CTokAssign _ } -"+=" { CTokPlusAss _ } -"-=" { CTokMinusAss _ } -"*=" { CTokStarAss _ } -"/=" { CTokSlashAss _ } -"%=" { CTokPercAss _ } -"&=" { CTokAmpAss _ } -"^=" { CTokHatAss _ } -"|=" { CTokBarAss _ } -"<<=" { CTokSLAss _ } -">>=" { CTokSRAss _ } -',' { CTokComma _ } -';' { CTokSemic _ } -'{' { CTokLBrace _ } -'}' { CTokRBrace _ } -"..." { CTokEllipsis _ } -alignof { CTokAlignof _ } -alignas { CTokAlignas _ } -"_Atomic" { CTokAtomic _ } -asm { CTokAsm _ } -auto { CTokAuto _ } -break { CTokBreak _ } -"_Bool" { CTokBool _ } -case { CTokCase _ } -char { CTokChar _ } -const { CTokConst _ } -continue { CTokContinue _ } -"_Complex" { CTokComplex _ } -default { CTokDefault _ } -do { CTokDo _ } -double { CTokDouble _ } -else { CTokElse _ } -enum { CTokEnum _ } -extern { CTokExtern _ } -float { CTokFloat _ } -"__float128" { CTokFloat128 _ } -"_Float128" { CTokFloat128 _ } -for { CTokFor _ } -"_Generic" { CTokGeneric _ } -goto { CTokGoto _ } -if { CTokIf _ } -inline { CTokInline _ } -int { CTokInt _ } -"__int128" { CTokInt128 _ } -long { CTokLong _ } -"__label__" { CTokLabel _ } -"_Noreturn" { CTokNoreturn _ } -"_Nullable" { CTokNullable _ } -"_Nonnull" { CTokNonnull _ } -register { CTokRegister _ } -restrict { CTokRestrict _ } -return { CTokReturn _ } -short { CTokShort _ } -signed { CTokSigned _ } -sizeof { CTokSizeof _ } -static { CTokStatic _ } -"_Static_assert"{ CTokStaticAssert _ } -struct { CTokStruct _ } -switch { CTokSwitch _ } -typedef { CTokTypedef _ } -typeof { CTokTypeof _ } -"__thread" { CTokThread _ } -union { CTokUnion _ } -unsigned { CTokUnsigned _ } -void { CTokVoid _ } -volatile { CTokVolatile _ } -while { CTokWhile _ } -cchar { CTokCLit _ _ } -- character constant -cint { CTokILit _ _ } -- integer constant -cfloat { CTokFLit _ _ } -- float constant -cstr { CTokSLit _ _ } -- string constant (no escapes) -ident { CTokIdent _ $$ } -- identifier -tyident { CTokTyIdent _ $$ } -- `typedef-name' identifier -"__attribute__" { CTokGnuC GnuCAttrTok _ } -- special GNU C tokens -"__extension__" { CTokGnuC GnuCExtTok _ } -- special GNU C tokens -"__real__" { CTokGnuC GnuCComplexReal _ } -"__imag__" { CTokGnuC GnuCComplexImag _ } --- special GNU C builtin 'functions' that actually take types as parameters: -"__builtin_va_arg" { CTokGnuC GnuCVaArg _ } -"__builtin_offsetof" { CTokGnuC GnuCOffsetof _ } -"__builtin_types_compatible_p" { CTokGnuC GnuCTyCompat _ } -"__builtin_convertvector" { CTokClangC _ ClangBuiltinConvertVector } -clangcversion { CTokClangC _ (ClangCVersionTok $$) } -- Clang version literal - -%% - - --- parse a complete C translation unit --- we have to take special care of empty translation units -translation_unit :: { CTranslUnit } -translation_unit - : 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) --- --- * GNU extensions: --- allow empty translation_unit --- allow redundant ';' -ext_decl_list :: { Reversed [CExtDecl] } -ext_decl_list - : {- empty -} { empty } - | ext_decl_list ';' { $1 } - | ext_decl_list external_declaration { $1 `snoc` $2 } - - --- parse external C declaration (C99 6.9) --- --- * GNU extensions: --- allow extension keyword before external declaration (TODO: discarded) --- asm definitions -external_declaration :: { CExtDecl } -external_declaration - : function_definition { CFDefExt $1 } - | declaration { CDeclExt $1 } - | "__extension__" external_declaration { $2 } - | asm '(' string_literal ')' ';' {% withNodeInfo $1 $ CAsmExt $3 } - - --- parse C function definition (C99 6.9.1) --- --- function_definition :- specifiers? fun-declarator compound-statement --- specifiers? old-fun-declarator declaration-list compound-statement --- --- The specifiers are a list consisting of type-names (int, struct foo, ...), --- storage-class specifiers (extern, static,...) and type qualifiers (const, volatile, ...). --- --- declaration_specifier :- <permute> type-qualifier* storage-class+ typename+ "extern unsigned static volatile int f()" --- type_specifier :- <permute> type-qualifier* typename+ "const int f()", "long int f()" --- declaration_qualifier_list :- <permute> type_qualifier* storage-class+ "extern static const f()" --- type_qualifier_list :- type-qualifier+ "const f()" --- --- * GNU extension: --- __attribute__ annotations --- -function_definition :: { CFunDef } -function_definition - : function_declarator compound_statement - {% leaveScope >> (withNodeInfo $1 $ CFunDef [] $1 [] $2) } - - | attrs function_declarator compound_statement - {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftCAttrs $1) $2 [] $3) } - - | declaration_specifier function_declarator compound_statement - {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) } - - | type_specifier function_declarator compound_statement - {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) } - - | declaration_qualifier_list function_declarator compound_statement - {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) } - - | type_qualifier_list function_declarator compound_statement - {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) } - - | type_qualifier_list attrs function_declarator compound_statement - {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) } - - -- old function declarators - - | function_declarator_old declaration_list compound_statement - {% withNodeInfo $1 $ CFunDef [] $1 (reverse $2) $3 } - - | attrs function_declarator_old declaration_list compound_statement - {% withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 (reverse $3) $4 } - - | declaration_specifier function_declarator_old declaration_list compound_statement - {% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 } - - | type_specifier function_declarator_old declaration_list compound_statement - {% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 } - - | declaration_qualifier_list function_declarator_old declaration_list compound_statement - {% withNodeInfo $1 $ CFunDef (reverse $1) $2 (reverse $3) $4 } - - | type_qualifier_list function_declarator_old declaration_list compound_statement - {% withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 (reverse $3) $4 } - - | type_qualifier_list attrs function_declarator_old declaration_list compound_statement - {% withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 (reverse $4) $5 } - --- Read declarator and put function -function_declarator :: { CDeclr } -function_declarator - : identifier_declarator - {% let declr = reverseDeclr $1 in - enterScope >> doFuncParamDeclIdent declr >> return declr } - - --- parse C statement (C99 6.8) --- --- * GNU extension: ' __asm__ (...); ' statements --- -statement :: { CStat } -statement - : labeled_statement { $1 } - | compound_statement { $1 } - | expression_statement { $1 } - | selection_statement { $1 } - | iteration_statement { $1 } - | jump_statement { $1 } - | asm_statement {% withNodeInfo $1 (CAsm $1) } - - --- parse C labeled statement (C99 6.8.1) --- --- * GNU extension: case ranges --- -labeled_statement :: { CStat } -labeled_statement - : 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 - {% withNodeInfo $1 $ CCases $2 $4 $6 } - - --- parse C compound statement (C99 6.8.2) --- --- * GNU extension: '__label__ ident;' declarations --- -compound_statement :: { CStat } -compound_statement - : '{' enter_scope block_item_list leave_scope '}' - {% withNodeInfo $1 $ CCompound [] (reverse $3) } - - | '{' enter_scope label_declarations block_item_list leave_scope '}' - {% withNodeInfo $1 $ CCompound (reverse $3) (reverse $4) } - - --- No syntax for these, just side effecting semantic actions. --- -enter_scope :: { () } -enter_scope : {% enterScope } -leave_scope :: { () } -leave_scope : {% leaveScope } - - -block_item_list :: { Reversed [CBlockItem] } -block_item_list - : {- empty -} { empty } - | block_item_list block_item { $1 `snoc` $2 } - -block_item :: { CBlockItem } -block_item - : statement { CBlockStmt $1 } - | nested_declaration { $1 } - -nested_declaration :: { CBlockItem } -nested_declaration - : declaration { CBlockDecl $1 } - | nested_function_definition { CNestedFunDef $1 } - | "__extension__" nested_declaration { $2 } - -nested_function_definition :: { CFunDef } -nested_function_definition - : declaration_specifier function_declarator compound_statement - {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) } - - | type_specifier function_declarator compound_statement - {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) } - - | declaration_qualifier_list function_declarator compound_statement - {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) } - - | type_qualifier_list function_declarator compound_statement - {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) } - - | type_qualifier_list attrs function_declarator compound_statement - {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) } - - -label_declarations :: { Reversed [Ident] } -label_declarations - : "__label__" identifier_list ';' { $2 } - | label_declarations "__label__" identifier_list ';' { $1 `rappendr` $3 } - - --- parse C expression statement (C99 6.8.3) --- -expression_statement :: { CStat } -expression_statement - : ';' {% withNodeInfo $1 $ CExpr Nothing } - | expression ';' {% withNodeInfo $1 $ CExpr (Just $1) } - - --- parse C selection statement (C99 6.8.4) --- -selection_statement :: { CStat } -selection_statement - : if '(' expression ')' statement - {% withNodeInfo $1 $ CIf $3 $5 Nothing } - - | if '(' expression ')' statement else statement - {% withNodeInfo $1 $ CIf $3 $5 (Just $7) } - - | switch '(' expression ')' statement - {% withNodeInfo $1 $ CSwitch $3 $5 } - - --- parse C iteration statement (C99 6.8.5) --- -iteration_statement :: { CStat } -iteration_statement - : while '(' expression ')' statement - {% withNodeInfo $1 $ CWhile $3 $5 False } - - | do statement while '(' expression ')' ';' - {% withNodeInfo $1 $ CWhile $5 $2 True } - - | for '(' expression_opt ';' expression_opt ';' expression_opt ')' statement - {% withNodeInfo $1 $ CFor (Left $3) $5 $7 $9 } - - | for '(' enter_scope declaration expression_opt ';' expression_opt ')' statement leave_scope - {% withNodeInfo $1 $ CFor (Right $4) $5 $7 $9 } - - --- parse C jump statement (C99 6.8.6) --- --- * GNU extension: computed gotos --- -jump_statement :: { CStat } -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 } - - --- parse GNU C __asm__ statement (compatible with C99: J.5.10) --- --- asm_stmt :- asm volatile? ( "asm..." : output-operands : input-operands : asm-clobbers ) --- asm_operand :- [operand-name] "constraint" ( expr ) --- asm_clobber :- "r1", "r2", ... --- -asm_statement :: { CAsmStmt } -asm_statement - : asm maybe_type_qualifier '(' string_literal ')' ';' - {% withNodeInfo $1 $ CAsmStmt $2 $4 [] [] [] } - - | asm maybe_type_qualifier '(' string_literal ':' asm_operands ')' ';' - {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 [] [] } - - | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ')' ';' - {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 [] } - - | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';' - {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 (reverse $10) } - - -maybe_type_qualifier :: { Maybe CTypeQual } -maybe_type_qualifier - : {- empty -} { Nothing } - | type_qualifier { Just $1 } - -asm_operands :: { [CAsmOperand] } -asm_operands - : {- empty -} { [] } - | 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 :: { CAsmOperand } -asm_operand - : 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 } - | asm_clobbers ',' string_literal { $1 `snoc` $3 } - -{- ---------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------- --- Declarations ---------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------- - -Declarations are the most complicated part of the grammar, and shall be summarized here. -To allow a lightweight notation, we will use the modifier <permute> to indicate that the order of the immidieate right-hand sides doesn't matter. - - <permute> a* b+ c === any sequence of a's, b's and c's, which contains exactly 1 'c' and at least one 'b' - --- storage class and type qualifier ---------------------------------------------------------------------------------------------------------------- -attr :- __attribute__((..)) -storage_class :- typedef | extern | static | auto | register | _Thread_local -function_specifier :- inline | _Noreturn -alignment_specifier :- _Alignas (type_name) | _Alignas (constant_expr) - -type_qualifier :- const | volatile | restrict | _Atomic | _Nullable | _Nonnull -type_qualifier_list :- type_qualifier+ - -declaration_qualifier :- storage_class | type_qualifier | function_specifier | alginment_specifier -declaration_qualifier_list :- <permute> type_qualifier* storage_class+ - -qualifiers :- declaration_qualifier_list | type_qualifier_list - := <permute> (type_qualifier|storage_class)+ - --- type names ---------------------------------------------------------------------------------------------------------------- -declaration_specifier :- <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident ) -type_specifier :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | tyident) - -specifiers :- declaration_specifier | type_specifier - := <permute> type_qualifier* storage_class* (basic_type_name+ | elaborated_type_name | tyident ) - --- struct/union/enum declarations ---------------------------------------------------------------------------------------------------------------- -sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name -sue_type_specifier :- <permute> type_qualifier* elaborated_type_name - -sue_declaration := sue_declaration_specifier | sue_type_specifier - :- <permute> type_qualifier* storage_class* elaborated_type_name - --- declarators ---------------------------------------------------------------------------------------------------------------- -identifier_declarator :- ( '*' (type_qualifier | attr)* ) * ident [ array_decl | "(" parameter-list ")" ] - plus additional parenthesis' ending ^^ here -typedef_declartor :- -declarator :- identifier_declarator | typedef_declarator - --- Declaration lists ---------------------------------------------------------------------------------------------------------------- -default_declaring_list :- qualifiers ( identifier_declarator asm*attrs* initializer? )_comma_list - -declaring_list :- specifiers ( declarator asm*attrs* initializer? )_comma_list - -declaration_list := default_declaring_list | declaring_list - --- Declaration ---------------------------------------------------------------------------------------------------------------- -declaration = sue_declaration | declaration_list | _Static_assert(..) - ---------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------- --- Attributes --- (citing http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html) ---------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------- - -"Attributes may appear after the colon following a label (expect case and default)" - -labeled_statement :- identifier ':' attrs_opt statement - -"Attributes may go either immediately after the struct/union/enum keyword or after the closing brace" - -struct attrs_opt ... -struct ... { } attrs_opt - -"In general: Attributes appear as part of declarations, either belonging to a declaration or declarator" - -"Any list of specifiers and qualifiers at the start of a declaration may contain attribute specifiers" -"An attribute list may appear immediately before the comma, = or semicolon terminating a declaration of an identifier" - ---------------------------------------------------------------------------------------------------------------- -For the parser, we modified the following rules to be interleaved with attributes: - -default_declaring_list' :- (declaration_qualifier_list' | type_qualifier_list' attr*) - identifier_declarator asm*attr* initializer? - { ',' attr* identifier_declarator asm*attr* initializer? } -declaring_list' :- specifier' declarator asm*attr* initializer? - { ',' attr* declarator asm*attr* initializer? } - - -type_qualifier_list' is like type_qualifier_list, but with preceeding and/or interleaving (but not terminating) __attribute__ annotations. -declaration_qualifier_list', declaration_specifier' and type_specifier' are like their unprimed variants, but with arbitrary preceeding, interleaving and/or terminating __attribute__ annotations. - -"An attribute list may appear immediately before a declarator other than the first in a comma seperated list of declarators" - -"The attribute specifiers may be the only specifiers present (implicit int)" [not supported] - -"Attribute specifiers may be mixed with type qualifiers appearing inside the [] of an parameter array declarator" - -tbc. --} - - - --- parse C declaration (C11 6.7) --- --- * new form in C11 --- _Static_assert(expr,string_literal) -declaration :: { CDecl } -declaration - : sue_declaration_specifier ';' - {% withNodeInfo $1 $ CDecl (reverse $1) [] } - - | sue_type_specifier ';' - {% withNodeInfo $1 $ CDecl (reverse $1) [] } - - | declaring_list ';' - {% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) } - - | default_declaring_list ';' - {% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) } - | "_Static_assert" '(' constant_expression ',' string_literal ')' ';' - {% withNodeInfo $1 $ CStaticAssert $3 $5 } - -declaration_list :: { Reversed [CDecl] } -declaration_list - : {- empty -} { empty } - | declaration_list declaration { $1 `snoc` $2 } - - --- * SUMMARY: default_declaring_list :- qualifier* identifier_declarator asm_attrs initializer? --- { ',' identifier_declarator asm_attrs initializer? } --- --- * GNU extensions --- __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11) --- asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12) --- The assembler annotation is used to specifiy an assembler name for the declarator. --- -default_declaring_list :: { CDecl } -default_declaring_list - : declaration_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt - {% let declspecs = reverse $1 in - do{ declr <- withAsmNameAttrs $3 $2 - ; doDeclIdent declspecs declr - ; withNodeInfo $1 $ - CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }} - - | type_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt - {% let declspecs = liftTypeQuals $1 in - do{ declr <- withAsmNameAttrs $3 $2 - ; doDeclIdent declspecs declr - ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }} - - | type_qualifier_list attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt -- FIX 1600 - {% let declspecs = liftTypeQuals $1 in - do{ declr <- withAsmNameAttrs $4 $3 - ; doDeclIdent declspecs declr - ; withNodeInfo $1 $ CDecl (declspecs ++ liftCAttrs $2) [(Just (reverseDeclr declr), $5, Nothing)] }} - - -- GNU extension: __attribute__ as the only qualifier - | attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt - {% let declspecs = liftCAttrs $1 in - do{ declr <- withAsmNameAttrs $3 $2 - ; doDeclIdent declspecs declr - ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }} - - | default_declaring_list ',' attrs_opt identifier_declarator asm_attrs_opt {-{}-} initializer_opt - {% case $1 of - CDecl declspecs dies at -> do - declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4 - doDeclIdent declspecs declr - withLength at $ CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) } - --- assembler, followed by attribute annotation -asm_attrs_opt :: { (Maybe CStrLit, [CAttr]) } -asm_attrs_opt - : asm_opt attrs_opt - { ($1,$2) } - --- --- SUMMARY: declaring_list :- specifier* declarator asm_attrs initializer? --- { ',' declarator asm_attrs initializer? } --- --- GNU extensions: --- __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11) --- asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12) --- -declaring_list :: { CDecl } -declaring_list - : declaration_specifier declarator asm_attrs_opt initializer_opt - {% do{ - declr <- withAsmNameAttrs $3 $2; - doDeclIdent $1 declr; - withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] } - } - - | type_specifier declarator asm_attrs_opt initializer_opt - {% do{ - declr <- withAsmNameAttrs $3 $2; - doDeclIdent $1 declr; - withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] } - } - - | declaring_list ',' attrs_opt declarator asm_attrs_opt initializer_opt - {% case $1 of - 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) } - - --- parse C declaration specifiers (C99 6.7) --- --- * <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident ) --- -declaration_specifier :: { [CDeclSpec] } -declaration_specifier - : basic_declaration_specifier { reverse $1 } -- Arithmetic or void - | sue_declaration_specifier { reverse $1 } -- Struct/Union/Enum - | typedef_declaration_specifier { reverse $1 } -- Typedef - - --- A mixture of type qualifiers (const, volatile, restrict, _Atomic, _Nonnull, _Nullable), --- function specifiers (inline, _Noreturn), --- alignment specifiers (_Alignas) and --- storage class specifiers (extern, static, auto, register, _Thread_local), --- in any order, but containing at least one storage class specifier. --- --- declaration_qualifier_list :- <permute> type_qualifier* alignment_specifier* function_specifier* storage_class+ --- --- GNU extensions --- * arbitrary interleaved __attribute__ annotations --- -declaration_qualifier_list :: { Reversed [CDeclSpec] } -declaration_qualifier_list - : declaration_qualifier_without_types - { singleton $1 } - - | attrs declaration_qualifier_without_types - { reverseList (liftCAttrs $1) `snoc` $2 } - - | type_qualifier_list declaration_qualifier_without_types - { rmap CTypeQual $1 `snoc` $2 } - - | type_qualifier_list attrs declaration_qualifier_without_types - { (rmap CTypeQual $1 `rappend` liftCAttrs $2) `snoc` $3 } - - | declaration_qualifier_list declaration_qualifier - { $1 `snoc` $2 } - - | declaration_qualifier_list attr - { addTrailingAttrs $1 $2 } - --- --- declaration_qualifier :- storage_class | type_qualifier | function_specifier | alignment_specifier --- -declaration_qualifier :: { CDeclSpec } -declaration_qualifier - : storage_class { CStorageSpec $1 } - | type_qualifier { CTypeQual $1 } - | function_specifier { CFunSpec $1 } - | alignment_specifier { CAlignSpec $1 } - - -declaration_qualifier_without_types :: { CDeclSpec } - : storage_class { CStorageSpec $1 } - | function_specifier { CFunSpec $1 } - | alignment_specifier { CAlignSpec $1 } - - --- parse C storage class specifier (C99 6.7.1) --- --- * GNU extensions: '__thread' thread local storage --- -storage_class :: { CStorageSpec } -storage_class - : typedef {% withNodeInfo $1 $ CTypedef } - | extern {% withNodeInfo $1 $ CExtern } - | static {% withNodeInfo $1 $ CStatic } - | auto {% withNodeInfo $1 $ CAuto } - | register {% withNodeInfo $1 $ CRegister } - | "__thread" {% withNodeInfo $1 $ CThread } - --- parse C function specifier (C11 6.7.4) -function_specifier :: { CFunSpec } -function_specifier - : inline {% withNodeInfo $1 $ CInlineQual } - | "_Noreturn" {% withNodeInfo $1 $ CNoreturnQual } - --- parse C alignment specifier (C11 6.7.5) -alignment_specifier :: { CAlignSpec } -alignment_specifier - : alignas '(' type_name ')' {% withNodeInfo $1 $ CAlignAsType $3 } - | alignas '(' constant_expression ')' {% withNodeInfo $1 $ CAlignAsExpr $3 } - --- parse C type specifier (C99 6.7.2) --- --- 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 | g) --- --- Type specifier _Atomic(type) is not yet supported because of conflicts with type qualifier _Atomic -type_specifier :: { [CDeclSpec] } -type_specifier - : basic_type_specifier { reverse $1 } -- Arithmetic or void - | sue_type_specifier { reverse $1 } -- Struct/Union/Enum - | typedef_type_specifier { reverse $1 } -- Typedef --- | "_Atomic" '(' type_name ')' -- _Atomic(type) --- {% withNodeInfo $1 $ \at -> [CTypeSpec (CAtomicType $3 at)] } - -basic_type_name :: { CTypeSpec } -basic_type_name - : void {% withNodeInfo $1 $ CVoidType } - | char {% withNodeInfo $1 $ CCharType } - | short {% withNodeInfo $1 $ CShortType } - | int {% withNodeInfo $1 $ CIntType } - | long {% withNodeInfo $1 $ CLongType } - | float {% withNodeInfo $1 $ CFloatType } - | double {% withNodeInfo $1 $ CDoubleType } - | signed {% withNodeInfo $1 $ CSignedType } - | unsigned {% withNodeInfo $1 $ CUnsigType } - | "_Bool" {% withNodeInfo $1 $ CBoolType } - | "_Complex" {% withNodeInfo $1 $ CComplexType } - | "__int128" {% withNodeInfo $1 $ CInt128Type } - | "__float128" {% withNodeInfo $1 $ CFloat128Type } - | "_Float128" {% withNodeInfo $1 $ CFloat128Type } - - --- A mixture of type qualifiers, storage class and basic type names in any --- order, but containing at least one basic type name and at least one storage --- class specifier. --- --- basic_declaration_specifier :- <permute> type_qualifier* storage_class+ basic_type_name+ --- --- GNU extensions --- arbitrary interleaved __attribute__ annotations --- -basic_declaration_specifier :: { Reversed [CDeclSpec] } -basic_declaration_specifier - : declaration_qualifier_list basic_type_name - { $1 `snoc` CTypeSpec $2 } - - | basic_type_specifier storage_class - { $1 `snoc` CStorageSpec $2 } - - | basic_declaration_specifier declaration_qualifier - { $1 `snoc` $2 } - - | basic_declaration_specifier basic_type_name - { $1 `snoc` CTypeSpec $2 } - - | basic_declaration_specifier attr - { addTrailingAttrs $1 $2 } - - --- A mixture of type qualifiers and basic type names in any order, but --- containing at least one basic type name. --- --- basic_type_specifier :- <permute> type_qualifier* basic_type_name+ --- --- GNU extensions --- arbitrary interleaved __attribute__ annotations --- -basic_type_specifier :: { Reversed [CDeclSpec] } -basic_type_specifier - -- Arithmetic or void - : basic_type_name - { singleton (CTypeSpec $1) } - - | attrs basic_type_name - { (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) } - - | type_qualifier_list basic_type_name - { rmap CTypeQual $1 `snoc` CTypeSpec $2 } - - | type_qualifier_list attrs basic_type_name - { rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 } - - | basic_type_specifier type_qualifier - { $1 `snoc` CTypeQual $2 } - - | basic_type_specifier basic_type_name - { $1 `snoc` CTypeSpec $2 } - - | basic_type_specifier attr - { addTrailingAttrs $1 $2 } - - --- A named or anonymous struct, union or enum type along with at least one --- storage class and any mix of type qualifiers. --- --- * Summary: --- sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name --- -sue_declaration_specifier :: { Reversed [CDeclSpec] } -sue_declaration_specifier - : declaration_qualifier_list elaborated_type_name - { $1 `snoc` CTypeSpec $2 } - - | sue_type_specifier storage_class - { $1 `snoc` CStorageSpec $2 } - - | sue_declaration_specifier declaration_qualifier - { $1 `snoc` $2 } - - | sue_declaration_specifier attr - { addTrailingAttrs $1 $2 } - - --- A struct, union or enum type (named or anonymous) with optional leading and --- trailing type qualifiers. --- --- * Summary: --- sue_type_specifier :- <permute> type_qualifier* elaborated_type_name --- --- * GNU Extensions: records __attribute__ annotations --- -sue_type_specifier :: { Reversed [CDeclSpec] } -sue_type_specifier - -- struct/union/enum - : elaborated_type_name - { singleton (CTypeSpec $1) } - - | attrs elaborated_type_name - { (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) } - - | type_qualifier_list elaborated_type_name - { rmap CTypeQual $1 `snoc` CTypeSpec $2 } - - | type_qualifier_list attrs elaborated_type_name - { rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 } - - | sue_type_specifier type_qualifier - { $1 `snoc` CTypeQual $2 } - - | sue_type_specifier attr - { addTrailingAttrs $1 $2 } - --- A typedef'ed type identifier with at least one storage qualifier and any --- number of type qualifiers --- --- * Summary: --- typedef_declaration_specifier :- <permute> type_qualifier* storage_class+ tyident --- --- * Note: --- the tyident can also be a: typeof '(' ... ')' --- -typedef_declaration_specifier :: { Reversed [CDeclSpec] } -typedef_declaration_specifier - : typedef_type_specifier storage_class - { $1 `snoc` CStorageSpec $2 } - - | declaration_qualifier_list tyident - {% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeDef $2 at) } - - | declaration_qualifier_list typeof '(' expression ')' - {% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) } - - | declaration_qualifier_list typeof '(' type_name ')' - {% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeOfType $4 at) } - - | typedef_declaration_specifier declaration_qualifier - { $1 `snoc` $2 } - - | typedef_declaration_specifier attr - { addTrailingAttrs $1 $2 } - - --- typedef'ed type identifier with optional leading and trailing type qualifiers --- --- * Summary: --- type_qualifier* ( tyident | typeof '('...')' ) type_qualifier* --- -typedef_type_specifier :: { Reversed [CDeclSpec] } -typedef_type_specifier - : tyident - {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeDef $1 at)) } - - | typeof '(' expression ')' - {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfExpr $3 at)) } - - | typeof '(' type_name ')' - {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfType $3 at)) } - - | type_qualifier_list tyident - {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeDef $2 at) } - - | type_qualifier_list typeof '(' expression ')' - {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) } - - | type_qualifier_list typeof '(' type_name ')' - {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeOfType $4 at) } - - -- repeat with attrs (this could be easier if type qualifier list wouldn't allow leading attributes) - | attrs tyident - {% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeDef $2 at)) } - - | attrs typeof '(' expression ')' - {% 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 $3 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeDef $3 at) } - - | type_qualifier_list attrs typeof '(' expression ')' - {% withNodeInfo $3 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfExpr $5 at) } - - | type_qualifier_list attrs typeof '(' type_name ')' - {% withNodeInfo $3 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfType $5 at) } - - | typedef_type_specifier type_qualifier - { $1 `snoc` CTypeQual $2 } - - | typedef_type_specifier attr - { addTrailingAttrs $1 $2 } - - --- A named or anonymous struct, union or enum type. --- --- * Summary: --- (struct|union|enum) (identifier? '{' ... '}' | identifier) --- -elaborated_type_name :: { CTypeSpec } -elaborated_type_name - : struct_or_union_specifier {% withNodeInfo $1 $ CSUType $1 } - | enum_specifier {% withNodeInfo $1 $ CEnumType $1 } - - --- parse C structure or union declaration (C99 6.7.2.1) --- --- * Summary: --- (struct|union) (identifier? '{' ... '}' | identifier) --- -struct_or_union_specifier :: { CStructUnion } -struct_or_union_specifier - : struct_or_union attrs_opt identifier '{' struct_declaration_list '}' - {% withNodeInfo $1 $ CStruct (unL $1) (Just $3) (Just$ reverse $5) $2 } - - | struct_or_union attrs_opt '{' struct_declaration_list '}' - {% withNodeInfo $1 $ CStruct (unL $1) Nothing (Just$ reverse $4) $2 } - - | struct_or_union attrs_opt identifier - {% withNodeInfo $1 $ CStruct (unL $1) (Just $3) Nothing $2 } - - -struct_or_union :: { Located CStructTag } -struct_or_union - : struct { L CStructTag (posOf $1) } - | union { L CUnionTag (posOf $1) } - - -struct_declaration_list :: { Reversed [CDecl] } -struct_declaration_list - : {- empty -} { empty } - | struct_declaration_list ';' { $1 } - | struct_declaration_list struct_declaration { $1 `snoc` $2 } - - --- parse C structure declaration (C99 6.7.2.1) --- -struct_declaration :: { CDecl } -struct_declaration - : struct_declaring_list ';' - { case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at } - - | struct_default_declaring_list';' - { case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at } - - | "__extension__" struct_declaration { $2 } - - --- --- * Note: doesn't redeclare typedef --- --- TODO: FIXME: AST doesn't allow recording attributes of unnamed struct members -struct_default_declaring_list :: { CDecl } -struct_default_declaring_list - : type_qualifier_list attrs_opt struct_identifier_declarator - {% withNodeInfo $1 $ case $3 of (d,s) -> CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [(d,Nothing,s)] } - - -- GNU extension: __attribute__ as only type qualifier - | attrs struct_identifier_declarator - {% withNodeInfo $1 $ case $2 of (d,s) -> CDecl (liftCAttrs $1) [(d,Nothing,s)] } - -- attrs_opt apply to the declared object - | struct_default_declaring_list ',' attrs_opt struct_identifier_declarator - { case $1 of - CDecl declspecs dies at -> - case $4 of - (Just d,s) -> CDecl declspecs ((Just $ appendObjAttrs $3 d,Nothing,s) : dies) at - (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) at } -- FIXME - --- * GNU extensions: --- allow anonymous nested structures and unions --- FIXME: cannot record attribute of unnamed field -struct_declaring_list :: { CDecl } -struct_declaring_list - : type_specifier struct_declarator attrs_opt - {% withNodeInfo $1 $ case $2 of { (Just d,s) -> CDecl $1 [(Just $! appendObjAttrs $3 d,Nothing,s)] - ; (Nothing,s) -> CDecl $1 [(Nothing,Nothing,s)] } } {- DO FIXME -} - | struct_declaring_list ',' attrs_opt struct_declarator attrs_opt - { case $1 of - CDecl declspecs dies attr -> - case $4 of - (Just d,s) -> CDecl declspecs ((Just$ appendObjAttrs ($3++$5) d,Nothing,s) : dies) attr - (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) attr } - - -- FIXME: We're being far too liberal in the parsing here, we really want to just - -- allow unnamed struct and union fields but we're actually allowing any - -- unnamed struct member. Making it allow only unnamed structs or unions in - -- the parser is far too tricky, it makes things ambiguous. So we'll have to - -- diagnose unnamed fields that are not structs/unions in a later stage. - - -- Note that a plain type specifier can have a trailing attribute - - | type_specifier - {% withNodeInfo $1 $ CDecl $1 [] } - - --- parse C structure declarator (C99 6.7.2.1) --- -struct_declarator :: { (Maybe CDeclr, Maybe CExpr) } -struct_declarator - : declarator { (Just (reverseDeclr $1), Nothing) } - | ':' constant_expression { (Nothing, Just $2) } - | declarator ':' constant_expression { (Just (reverseDeclr $1), Just $3) } - --- FIXME: anonymous bitfield doesn't allow recording of attributes -struct_identifier_declarator :: { (Maybe CDeclr, Maybe CExpr) } -struct_identifier_declarator - : identifier_declarator { (Just (reverseDeclr $1), Nothing) } - | ':' constant_expression { (Nothing, Just $2) } - | identifier_declarator ':' constant_expression { (Just (reverseDeclr $1), Just $3) } - | struct_identifier_declarator attr - { case $1 of { (Nothing,expr) -> (Nothing,expr) {- FIXME -} - ; (Just (CDeclr name derived asmname attrs node), bsz) -> - (Just (CDeclr name derived asmname (attrs++$2) node),bsz) - } - } - --- parse C enumeration declaration (C99 6.7.2.2) --- --- * Summary: --- enum (identifier? '{' ... '}' | identifier) --- -enum_specifier :: { CEnum } -enum_specifier - : enum attrs_opt '{' enumerator_list '}' - {% withNodeInfo $1 $ CEnum Nothing (Just$ reverse $4) $2 } - - | enum attrs_opt '{' enumerator_list ',' '}' - {% withNodeInfo $1 $ CEnum Nothing (Just$ reverse $4) $2 } - - | enum attrs_opt identifier '{' enumerator_list '}' - {% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 } - - | enum attrs_opt identifier '{' enumerator_list ',' '}' - {% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 } - - | enum attrs_opt identifier - {% withNodeInfo $1 $ CEnum (Just $3) Nothing $2 } - -enumerator_list :: { Reversed [(Ident, Maybe CExpr)] } -enumerator_list - : enumerator { singleton $1 } - | enumerator_list ',' enumerator { $1 `snoc` $3 } - - -enumerator :: { (Ident, Maybe CExpr) } -enumerator - : identifier { ($1, Nothing) } - | identifier attrs { ($1, Nothing) } - | identifier attrs '=' constant_expression { ($1, Just $4) } - | identifier '=' constant_expression { ($1, Just $3) } - - --- parse C type qualifier (C11 6.7.3) --- --- concerning atomic, note: If the _Atomic keyword is immediately followed by a left --- parenthesis, it should be interpreted as a type specifier (with a type name), not as a type qualifier -type_qualifier :: { CTypeQual } -type_qualifier - : const {% withNodeInfo $1 $ CConstQual } - | volatile {% withNodeInfo $1 $ CVolatQual } - | restrict {% withNodeInfo $1 $ CRestrQual } - | "_Nullable" {% withNodeInfo $1 $ CNullableQual } - | "_Nonnull" {% withNodeInfo $1 $ CNonnullQual } - | "_Atomic" {% withNodeInfo $1 $ CAtomicQual } - --- a list containing at least one type_qualifier (const, volatile, restrict, inline, _Noreturn) --- and additionally CAttrs -type_qualifier_list :: { Reversed [CTypeQual] } -type_qualifier_list - : attrs_opt type_qualifier { reverseList (map CAttrQual $1) `snoc` $2 } - | type_qualifier_list type_qualifier { $1 `snoc` $2 } - | type_qualifier_list attrs type_qualifier { ($1 `rappend` map CAttrQual $2) `snoc` $3} - --- parse C declarator (C99 6.7.5) --- -declarator :: { CDeclrR } -declarator - : identifier_declarator { $1 } - | typedef_declarator { $1 } - - --- Parse GNU C's asm annotations --- --- Those annotations allow to give an assembler name to a function or identifier. -asm_opt :: { Maybe CStrLit } -asm_opt - : {- empty -} { Nothing } - | asm '(' string_literal ')' { Just $3 } - --- --- typedef_declarator :- - -typedef_declarator :: { CDeclrR } -typedef_declarator - -- would be ambiguous as parameter - : paren_typedef_declarator { $1 } - - -- not ambiguous as param - | parameter_typedef_declarator { $1 } - - --- parameter_typedef_declarator :- tyident declarator_postfix? --- | '(' attrs? clean_typedef_declarator ')' declarator_postfix? --- | '*' attrs? type_qualifier_list? parameter_typedef_declarator --- -parameter_typedef_declarator :: { CDeclrR } -parameter_typedef_declarator - : tyident - {% withNodeInfo $1 $ mkVarDeclr $1 } - - | tyident postfixing_abstract_declarator - {% withNodeInfo $1 $ \at -> $2 (mkVarDeclr $1 at) } - - | clean_typedef_declarator - { $1 } - - --- The following have at least one '*'. --- There is no (redundant) '(' between the '*' and the tyident. --- --- clean_typedef_declarator :- '(' attrs? clean_typedef_declarator ')' declarator_postfix? --- | '*' attrs? type_qualifier_list? parameter_typedef_declarator --- -clean_typedef_declarator :: { CDeclrR } -clean_typedef_declarator - : clean_postfix_typedef_declarator - { $1 } - - | '*' parameter_typedef_declarator - {% withNodeInfo $1 $ ptrDeclr $2 [] } - - | '*' attrs parameter_typedef_declarator - {% withAttribute $1 $2 $ ptrDeclr $3 [] } - - | '*' type_qualifier_list parameter_typedef_declarator - {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) } - - | '*' type_qualifier_list attrs parameter_typedef_declarator - {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) } - --- clean_postfix_typedef_declarator :- ( attrs? clean_typedef_declarator ) declarator_postfix? --- -clean_postfix_typedef_declarator :: { CDeclrR } -clean_postfix_typedef_declarator - : '(' clean_typedef_declarator ')' { $2 } - | '(' clean_typedef_declarator ')' postfixing_abstract_declarator { $4 $2 } - | '(' attrs clean_typedef_declarator ')' { appendDeclrAttrs $2 $3 } - | '(' attrs clean_typedef_declarator ')' postfixing_abstract_declarator { appendDeclrAttrs $2 ($5 $3) } - - --- The following have a redundant '(' placed --- immediately to the left of the tyident --- -paren_typedef_declarator :: { CDeclrR } -paren_typedef_declarator - : paren_postfix_typedef_declarator - { $1 } - - -- redundant paren - | '*' '(' simple_paren_typedef_declarator ')' - {% withNodeInfo $1 $ ptrDeclr $3 [] } - - | '*' type_qualifier_list '(' simple_paren_typedef_declarator ')' - {% withNodeInfo $1 $ ptrDeclr $4 (reverse $2) } - | '*' type_qualifier_list attrs '(' simple_paren_typedef_declarator ')' - {% withAttribute $1 $3 $ ptrDeclr $5 (reverse $2) } - - | '*' paren_typedef_declarator - {% withNodeInfo $1 $ ptrDeclr $2 [] } - - | '*' type_qualifier_list paren_typedef_declarator - {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) } - | '*' type_qualifier_list attrs paren_typedef_declarator - {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) } - --- redundant paren to left of tname -paren_postfix_typedef_declarator :: { CDeclrR } -paren_postfix_typedef_declarator - : '(' paren_typedef_declarator ')' - { $2 } - - -- redundant paren - | '(' simple_paren_typedef_declarator postfixing_abstract_declarator ')' - { $3 $2 } - - | '(' paren_typedef_declarator ')' postfixing_abstract_declarator - { $4 $2 } - - --- Just a type name in any number of nested brackets --- -simple_paren_typedef_declarator :: { CDeclrR } -simple_paren_typedef_declarator - : tyident - {% withNodeInfo $1 $ mkVarDeclr $1 } - - | '(' simple_paren_typedef_declarator ')' - { $2 } - --- --- Declarators --- * Summary --- declarator :- ( '*' (type_qualifier | attr)* )* ident ( array_decl | "(" parameter-list ")" )? --- + additional parenthesis --- -identifier_declarator :: { CDeclrR } -identifier_declarator - : unary_identifier_declarator { $1 } - | paren_identifier_declarator { $1 } - - -unary_identifier_declarator :: { CDeclrR } -unary_identifier_declarator - : postfix_identifier_declarator - { $1 } - - | '*' identifier_declarator - {% withNodeInfo $1 $ ptrDeclr $2 [] } - - | '*' attrs identifier_declarator - {% withAttribute $1 $2 $ ptrDeclr $3 [] } - - | '*' type_qualifier_list identifier_declarator - {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) } - - | '*' type_qualifier_list attrs identifier_declarator - {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) } - -postfix_identifier_declarator :: { CDeclrR } -postfix_identifier_declarator - : paren_identifier_declarator postfixing_abstract_declarator - { $2 $1 } - - | '(' unary_identifier_declarator ')' - { $2 } - - | '(' unary_identifier_declarator ')' postfixing_abstract_declarator - { $4 $2 } - - | '(' attrs unary_identifier_declarator ')' - { appendDeclrAttrs $2 $3 } - - | '(' attrs unary_identifier_declarator ')' postfixing_abstract_declarator - { appendDeclrAttrs $2 ($5 $3) } - - --- just an identifier in any number of nested parenthesis -paren_identifier_declarator :: { CDeclrR } -paren_identifier_declarator - : ident - {% withNodeInfo $1 $ mkVarDeclr $1 } - - | '(' paren_identifier_declarator ')' - { $2 } - - | '(' attrs paren_identifier_declarator ')' - { appendDeclrAttrs $2 $3 } - -function_declarator_old :: { CDeclr } -function_declarator_old - : old_function_declarator - { reverseDeclr $1 } - -old_function_declarator :: { CDeclrR } -old_function_declarator - : postfix_old_function_declarator - { $1 } - - | '*' old_function_declarator - {% withNodeInfo $1 $ ptrDeclr $2 [] } -- FIXME: no attr possible here ??? - - | '*' type_qualifier_list old_function_declarator - {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) } - -postfix_old_function_declarator :: { CDeclrR } -postfix_old_function_declarator - : paren_identifier_declarator '(' identifier_list ')' - {% withNodeInfo $1 $ funDeclr $1 (Left $ reverse $3) [] } - - | '(' old_function_declarator ')' - { $2 } - - | '(' old_function_declarator ')' postfixing_abstract_declarator - { $4 $2 } - - --- parse C parameter type list (C99 6.7.5) --- -parameter_type_list :: { ([CDecl], Bool) } -parameter_type_list - : {- empty -} { ([], False)} - | parameter_list { (reverse $1, False) } - | parameter_list ',' "..." { (reverse $1, True) } - -parameter_list :: { Reversed [CDecl] } -parameter_list - : parameter_declaration { singleton $1 } - | parameter_list ',' parameter_declaration { $1 `snoc` $3 } - -parameter_declaration :: { CDecl } -parameter_declaration - : declaration_specifier - {% withNodeInfo $1 $ CDecl $1 [] } - - | declaration_specifier abstract_declarator - {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] } - - | declaration_specifier identifier_declarator attrs_opt - {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] } - - | declaration_specifier parameter_typedef_declarator attrs_opt - {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] } - - | declaration_qualifier_list - {% withNodeInfo $1 $ CDecl (reverse $1) [] } - - | declaration_qualifier_list abstract_declarator - {% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $2), Nothing, Nothing)] } - - | declaration_qualifier_list identifier_declarator attrs_opt - {% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] } - - | type_specifier - {% withNodeInfo $1 $ CDecl $1 [] } - - | type_specifier abstract_declarator - {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] } - - | type_specifier identifier_declarator attrs_opt - {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] } - - | type_specifier parameter_typedef_declarator attrs_opt - {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] } - - | type_qualifier_list - {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [] } - | type_qualifier_list attr - {% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] } - - | type_qualifier_list abstract_declarator - {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] } - - | type_qualifier_list identifier_declarator attrs_opt - {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr$ appendDeclrAttrs $3 $2), Nothing, Nothing)] } - - -identifier_list :: { Reversed [Ident] } -identifier_list - : ident { singleton $1 } - | identifier_list ',' ident { $1 `snoc` $3 } - - --- parse C type name (C99 6.7.6) --- -type_name :: { CDecl } -type_name - : type_specifier - {% withNodeInfo $1 $ CDecl $1 [] } - - | type_specifier abstract_declarator - {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] } - - | type_qualifier_list attr - {% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] } - - | type_qualifier_list abstract_declarator - {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] } - --- parse C abstract declarator (C99 6.7.6) --- --- postfix starts with '(' --- postfixing starts with '(' or '[' --- unary start with '*' -abstract_declarator :: { CDeclrR } -abstract_declarator - : unary_abstract_declarator { $1 } - | postfix_abstract_declarator { $1 } - | postfixing_abstract_declarator { $1 emptyDeclr } - --- --- FIXME --- | postfixing_abstract_declarator attrs_opt { $1 emptyDeclr } - - -postfixing_abstract_declarator :: { CDeclrR -> CDeclrR } -postfixing_abstract_declarator - : array_abstract_declarator - { $1 } - - | '(' parameter_type_list ')' - {% withNodeInfo $1 $ \at declr -> case $2 of - (params, variadic) -> funDeclr declr (Right (params,variadic)) [] at } - - --- * TODO: Note that we recognise but ignore the C99 static keyword (see C99 6.7.5.3) --- --- * TODO: We do not distinguish in the AST between incomplete array types and --- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2) --- -array_abstract_declarator :: { CDeclrR -> CDeclrR } -array_abstract_declarator - : postfix_array_abstract_declarator - { $1 } - - | array_abstract_declarator postfix_array_abstract_declarator - { \decl -> $2 ($1 decl) } - --- --- TODO: record static -postfix_array_abstract_declarator :: { CDeclrR -> CDeclrR } -postfix_array_abstract_declarator - : '[' assignment_expression_opt ']' - {% withNodeInfo $1 $ \at declr -> arrDeclr declr [] False False $2 at } - - | '[' attrs assignment_expression_opt ']' - {% withAttributePF $1 $2 $ \at declr -> arrDeclr declr [] False False $3 at } - - | '[' type_qualifier_list assignment_expression_opt ']' - {% withNodeInfo $1 $ \at declr -> arrDeclr declr (reverse $2) False False $3 at } - - | '[' type_qualifier_list attrs assignment_expression_opt ']' - {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr (reverse $2) False False $4 at } - - | '[' static attrs_opt assignment_expression ']' - {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] False True (Just $4) at } - - | '[' static type_qualifier_list attrs_opt assignment_expression ']' - {% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $3) False True (Just $5) at } - - | '[' type_qualifier_list attrs_opt static attrs_opt assignment_expression ']' - {% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) False True (Just $6) at } - - | '[' '*' attrs_opt ']' - {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] True False Nothing at } - | '[' attrs '*' attrs_opt ']' - {% withAttributePF $1 ($2 ++ $4) $ \at declr -> arrDeclr declr [] True False Nothing at } - - | '[' type_qualifier_list '*' attrs_opt ']' - {% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at } - | '[' type_qualifier_list attrs '*' attrs_opt ']' - {% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at } - -unary_abstract_declarator :: { CDeclrR } -unary_abstract_declarator - : '*' - {% withNodeInfo $1 $ ptrDeclr emptyDeclr [] } - - | '*' type_qualifier_list attrs_opt - {% withAttribute $1 $3 $ ptrDeclr emptyDeclr (reverse $2) } - - | '*' abstract_declarator - {% withNodeInfo $1 $ ptrDeclr $2 [] } - - | '*' type_qualifier_list abstract_declarator - {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) } - - | '*' attrs - {% withAttribute $1 $2 $ ptrDeclr emptyDeclr [] } - | '*' attrs abstract_declarator - {% withAttribute $1 $2 $ ptrDeclr $3 [] } - --- postfix_ad starts with '(', postfixing with '(' or '[', unary_abstract starts with '*' -postfix_abstract_declarator :: { CDeclrR } -postfix_abstract_declarator - : '(' unary_abstract_declarator ')' { $2 } - | '(' postfix_abstract_declarator ')' { $2 } - | '(' postfixing_abstract_declarator ')' { $2 emptyDeclr } - | '(' unary_abstract_declarator ')' postfixing_abstract_declarator { $4 $2 } - --- FIX 0700 - | '(' attrs unary_abstract_declarator ')' { appendDeclrAttrs $2 $3 } - | '(' attrs postfix_abstract_declarator ')' { appendDeclrAttrs $2 $3 } - | '(' attrs postfixing_abstract_declarator ')' { appendDeclrAttrs $2 ($3 emptyDeclr) } - | '(' attrs unary_abstract_declarator ')' postfixing_abstract_declarator { appendDeclrAttrs $2 ($5 $3) } - | postfix_abstract_declarator attr { appendDeclrAttrs $2 $1 } - - --- parse C initializer (C99 6.7.8) --- -initializer :: { CInit } -initializer - : assignment_expression {% withNodeInfo $1 $ CInitExpr $1 } - | '{' initializer_list '}' {% withNodeInfo $1 $ CInitList (reverse $2) } - | '{' initializer_list ',' '}' {% withNodeInfo $1 $ CInitList (reverse $2) } - - -initializer_opt :: { Maybe CInit } -initializer_opt - : {- empty -} { Nothing } - | '=' initializer { Just $2 } - - -initializer_list :: { Reversed CInitList } -initializer_list - : {- empty -} { empty } - | initializer { singleton ([],$1) } - | designation initializer { singleton ($1,$2) } - | initializer_list ',' initializer { $1 `snoc` ([],$3) } - | initializer_list ',' designation initializer { $1 `snoc` ($3,$4) } - - --- designation --- --- * GNU extensions: --- old style member designation: 'ident :' --- array range designation --- -designation :: { [CDesignator] } -designation - : designator_list '=' { reverse $1 } - | identifier ':' {% withNodeInfo $1 $ \at -> [CMemberDesig $1 at] } - | array_designator { [$1] } - - -designator_list :: { Reversed [CDesignator] } -designator_list - : designator { singleton $1 } - | designator_list designator { $1 `snoc` $2 } - - -designator :: { CDesignator } -designator - : '[' constant_expression ']' {% withNodeInfo $1 $ CArrDesig $2 } - | '.' identifier {% withNodeInfo $1 $ CMemberDesig $2 } - | array_designator { $1 } - - -array_designator :: { CDesignator } -array_designator - : '[' constant_expression "..." constant_expression ']' - {% withNodeInfo $1 $ CRangeDesig $2 $4 } - - --- parse C primary expression (C11 6.5.1) --- --- We cannot use a typedef name as a variable --- --- * C11: generic selection --- * GNU extensions: --- allow a compound statement as an expression --- __builtin_va_arg --- __builtin_offsetof --- __builtin_types_compatible_p -primary_expression :: { CExpr } -primary_expression - : ident {% withNodeInfo $1 $ CVar $1 } - | constant { CConst $1 } - | string_literal { CConst (liftStrLit $1) } - | '(' expression ')' { $2 } - | "_Generic" '(' assignment_expression ',' generic_assoc_list ')' - {% withNodeInfo $1 $ CGenericSelection $3 (reverse $5) } - -- GNU extensions - | '(' compound_statement ')' - {% withNodeInfo $1 $ CStatExpr $2 } - - | "__builtin_va_arg" '(' assignment_expression ',' type_name ')' - {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinVaArg $3 $5 } - - | "__builtin_offsetof" '(' type_name ',' offsetof_member_designator ')' - {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinOffsetOf $3 (reverse $5) } - - | "__builtin_types_compatible_p" '(' type_name ',' type_name ')' - {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinTypesCompatible $3 $5 } - - | "__builtin_convertvector" '(' assignment_expression ',' type_name ')' - {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinConvertVector $3 $5 } - --- Generic Selection association list (C11 6.5.1.1) --- --- TODO: introduce AST type for generic association -generic_assoc_list :: { Reversed [(Maybe CDecl, CExpr)] } - : generic_assoc_list ',' generic_assoc { $1 `snoc` $3 } - | generic_assoc { singleton $1 } -generic_assoc :: { (Maybe CDecl, CExpr) } -generic_assoc - : type_name ':' assignment_expression { (Just $1, $3) } - | default ':' assignment_expression { (Nothing, $3) } - -offsetof_member_designator :: { Reversed [CDesignator] } -offsetof_member_designator - : identifier {% withNodeInfo $1 $ singleton . CMemberDesig $1 } - | offsetof_member_designator '.' identifier {% withNodeInfo $3 $ ($1 `snoc`) . CMemberDesig $3 } - | offsetof_member_designator '[' expression ']' {% withNodeInfo $3 $ ($1 `snoc`) . CArrDesig $3 } - - --- parse C postfix expression (C99 6.5.2) --- -postfix_expression :: { CExpr } -postfix_expression - : primary_expression - { $1 } - - | postfix_expression '[' expression ']' - {% withNodeInfo $1 $ CIndex $1 $3 } - - | postfix_expression '(' ')' - {% withNodeInfo $1 $ CCall $1 [] } - - | postfix_expression '(' argument_expression_list ')' - {% withNodeInfo $1 $ CCall $1 (reverse $3) } - - | postfix_expression '.' identifier - {% withNodeInfo $1 $ CMember $1 $3 False } - - | postfix_expression "->" identifier - {% withNodeInfo $1 $ CMember $1 $3 True } - - | postfix_expression "++" - {% withNodeInfo $1 $ CUnary CPostIncOp $1 } - - | postfix_expression "--" - {% withNodeInfo $1 $ CUnary CPostDecOp $1 } - - | '(' type_name ')' '{' initializer_list '}' - {% withNodeInfo $1 $ CCompoundLit $2 (reverse $5) } - - | '(' type_name ')' '{' initializer_list ',' '}' - {% withNodeInfo $1 $ CCompoundLit $2 (reverse $5) } - - -argument_expression_list :: { Reversed [CExpr] } -argument_expression_list - : assignment_expression { singleton $1 } - | argument_expression_list ',' assignment_expression { $1 `snoc` $3 } - - --- parse C unary expression (C99 6.5.3) --- --- * GNU extensions: --- 'alignof' expression or type --- '__real' and '__imag' expression --- '__extension__' to suppress warnings about extensions --- allow taking address of a label with: && label --- -unary_expression :: { CExpr } -unary_expression - : postfix_expression { $1 } - | "++" unary_expression {% withNodeInfo $1 $ CUnary CPreIncOp $2 } - | "--" unary_expression {% withNodeInfo $1 $ CUnary CPreDecOp $2 } - | "__extension__" cast_expression { $2 } - | unary_operator cast_expression {% withNodeInfo $1 $ CUnary (unL $1) $2 } - | sizeof unary_expression {% withNodeInfo $1 $ CSizeofExpr $2 } - | sizeof '(' type_name ')' {% withNodeInfo $1 $ CSizeofType $3 } - -- GNU: alignof, complex and && extension - | alignof unary_expression {% withNodeInfo $1 $ CAlignofExpr $2 } - | alignof '(' type_name ')' {% withNodeInfo $1 $ CAlignofType $3 } - | "__real__" unary_expression {% withNodeInfo $1 $ CComplexReal $2 } - | "__imag__" unary_expression {% withNodeInfo $1 $ CComplexImag $2 } - | "&&" identifier {% withNodeInfo $1 $ CLabAddrExpr $2 } - - -unary_operator :: { Located CUnaryOp } -unary_operator - : '&' { L CAdrOp (posOf $1) } - | '*' { L CIndOp (posOf $1) } - | '+' { L CPlusOp (posOf $1) } - | '-' { L CMinOp (posOf $1) } - | '~' { L CCompOp (posOf $1) } - | '!' { L CNegOp (posOf $1) } - - --- parse C cast expression (C99 6.5.4) --- -cast_expression :: { CExpr } -cast_expression - : unary_expression { $1 } - | '(' type_name ')' cast_expression {% withNodeInfo $1 $ CCast $2 $4 } - - --- parse C multiplicative expression (C99 6.5.5) --- -multiplicative_expression :: { CExpr } -multiplicative_expression - : cast_expression - { $1 } - - | multiplicative_expression '*' cast_expression - {% withNodeInfo $1 $ CBinary CMulOp $1 $3 } - - | multiplicative_expression '/' cast_expression - {% withNodeInfo $1 $ CBinary CDivOp $1 $3 } - - | multiplicative_expression '%' cast_expression - {% withNodeInfo $1 $ CBinary CRmdOp $1 $3 } - - --- parse C additive expression (C99 6.5.6) --- -additive_expression :: { CExpr } -additive_expression - : multiplicative_expression - { $1 } - - | additive_expression '+' multiplicative_expression - {% withNodeInfo $1 $ CBinary CAddOp $1 $3 } - - | additive_expression '-' multiplicative_expression - {% withNodeInfo $1 $ CBinary CSubOp $1 $3 } - - --- parse C shift expression (C99 6.5.7) --- -shift_expression :: { CExpr } -shift_expression - : additive_expression - { $1 } - - | shift_expression "<<" additive_expression - {% withNodeInfo $1 $ CBinary CShlOp $1 $3 } - - | shift_expression ">>" additive_expression - {% withNodeInfo $1 $ CBinary CShrOp $1 $3 } - - --- parse C relational expression (C99 6.5.8) --- -relational_expression :: { CExpr } -relational_expression - : shift_expression - { $1 } - - | relational_expression '<' shift_expression - {% withNodeInfo $1 $ CBinary CLeOp $1 $3 } - - | relational_expression '>' shift_expression - {% withNodeInfo $1 $ CBinary CGrOp $1 $3 } - - | relational_expression "<=" shift_expression - {% withNodeInfo $1 $ CBinary CLeqOp $1 $3 } - - | relational_expression ">=" shift_expression - {% withNodeInfo $1 $ CBinary CGeqOp $1 $3 } - - --- parse C equality expression (C99 6.5.9) --- -equality_expression :: { CExpr } -equality_expression - : relational_expression - { $1 } - - | equality_expression "==" relational_expression - {% withNodeInfo $1 $ CBinary CEqOp $1 $3 } - - | equality_expression "!=" relational_expression - {% withNodeInfo $1 $ CBinary CNeqOp $1 $3 } - - --- parse C bitwise and expression (C99 6.5.10) --- -and_expression :: { CExpr } -and_expression - : equality_expression - { $1 } - - | and_expression '&' equality_expression - {% withNodeInfo $1 $ CBinary CAndOp $1 $3 } - - --- parse C bitwise exclusive or expression (C99 6.5.11) --- -exclusive_or_expression :: { CExpr } -exclusive_or_expression - : and_expression - { $1 } - - | exclusive_or_expression '^' and_expression - {% withNodeInfo $1 $ CBinary CXorOp $1 $3 } - - --- parse C bitwise or expression (C99 6.5.12) --- -inclusive_or_expression :: { CExpr } -inclusive_or_expression - : exclusive_or_expression - { $1 } - - | inclusive_or_expression '|' exclusive_or_expression - {% withNodeInfo $1 $ CBinary COrOp $1 $3 } - - --- parse C logical and expression (C99 6.5.13) --- -logical_and_expression :: { CExpr } -logical_and_expression - : inclusive_or_expression - { $1 } - - | logical_and_expression "&&" inclusive_or_expression - {% withNodeInfo $1 $ CBinary CLndOp $1 $3 } - - --- parse C logical or expression (C99 6.5.14) --- -logical_or_expression :: { CExpr } -logical_or_expression - : logical_and_expression - { $1 } - - | logical_or_expression "||" logical_and_expression - {% withNodeInfo $1 $ CBinary CLorOp $1 $3 } - - --- parse C conditional expression (C99 6.5.15) --- --- * GNU extensions: --- omitting the `then' part -conditional_expression :: { CExpr } -conditional_expression - : logical_or_expression - { $1 } - - | logical_or_expression '?' expression ':' conditional_expression - {% withNodeInfo $1 $ CCond $1 (Just $3) $5 } - - | logical_or_expression '?' ':' conditional_expression - {% withNodeInfo $1 $ CCond $1 Nothing $4 } - - --- parse C assignment expression (C99 6.5.16) --- --- * NOTE: LHS of assignment is more restricted than in gcc. --- `x ? y : z = 3' parses in gcc as `(x ? y : z) = 3', --- but `x ? y : z' is not an unary expression. -assignment_expression :: { CExpr } -assignment_expression - : conditional_expression - { $1 } - - | unary_expression assignment_operator assignment_expression - {% withNodeInfo $1 $ CAssign (unL $2) $1 $3 } - - -assignment_operator :: { Located CAssignOp } -assignment_operator - : '=' { L CAssignOp (posOf $1) } - | "*=" { L CMulAssOp (posOf $1) } - | "/=" { L CDivAssOp (posOf $1) } - | "%=" { L CRmdAssOp (posOf $1) } - | "+=" { L CAddAssOp (posOf $1) } - | "-=" { L CSubAssOp (posOf $1) } - | "<<=" { L CShlAssOp (posOf $1) } - | ">>=" { L CShrAssOp (posOf $1) } - | "&=" { L CAndAssOp (posOf $1) } - | "^=" { L CXorAssOp (posOf $1) } - | "|=" { L COrAssOp (posOf $1) } - - --- parse C expression (C99 6.5.17) --- -expression :: { CExpr } -expression - : assignment_expression - { $1 } - - | assignment_expression ',' comma_expression - {% let es = reverse $3 in withNodeInfo es $ CComma ($1:es) } - -comma_expression :: { Reversed [CExpr] } -comma_expression - : assignment_expression { singleton $1 } - | comma_expression ',' assignment_expression { $1 `snoc` $3 } - - --- The following was used for clarity -expression_opt :: { Maybe CExpr } -expression_opt - : {- empty -} { Nothing } - | expression { Just $1 } - - --- The following was used for clarity -assignment_expression_opt :: { Maybe CExpr } -assignment_expression_opt - : {- empty -} { Nothing } - | assignment_expression { Just $1 } - - --- parse C constant expression (C99 6.6) --- -constant_expression :: { CExpr } -constant_expression - : conditional_expression { $1 } - - --- parse C constants --- -constant :: { CConst } -constant - : cint {% withNodeInfo $1 $ case $1 of CTokILit _ i -> CIntConst i } - | cchar {% withNodeInfo $1 $ case $1 of CTokCLit _ c -> CCharConst c } - | cfloat {% withNodeInfo $1 $ case $1 of CTokFLit _ f -> CFloatConst f } - - -string_literal :: { CStrLit } -string_literal - : cstr - {% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit s } - - | cstr string_literal_list - {% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse $2)) } - - -string_literal_list :: { Reversed [CString] } -string_literal_list - : cstr { case $1 of CTokSLit _ s -> singleton s } - | string_literal_list cstr { case $2 of CTokSLit _ s -> $1 `snoc` s } - -clang_version_literal :: { ClangCVersion } - : clangcversion { $1 } - -identifier :: { Ident } -identifier - : ident { $1 } - | tyident { $1 } - - --- parse GNU C attribute annotation -attrs_opt :: { [CAttr] } -attrs_opt - : {- empty -} { [] } - | attrs { $1 } - --- GNU C attribute annotation -attrs :: { [CAttr] } -attrs - : attr { $1 } - | attrs attr { $1 ++ $2 } - -attr :: { [CAttr] } -attr - : "__attribute__" '(' '(' attribute_list ')' ')' { reverse $4 } - -attribute_list :: { Reversed [CAttr] } - : attribute { case $1 of Nothing -> empty; Just attr -> singleton attr } - | attribute_list ',' attribute { (maybe id (flip snoc) $3) $1 } - - -attribute :: { Maybe CAttr } -attribute - : {- empty -} { Nothing } - | ident {% withNodeInfo $1 $ Just . CAttr $1 [] } - | const {% withNodeInfo $1 $ Just . CAttr (internalIdent "const") [] } - | ident '(' attribute_params ')' {% withNodeInfo $1 $ Just . CAttr $1 (reverse $3) } - | ident '(' ')' {% withNodeInfo $1 $ Just . CAttr $1 [] } - --- OS X 10.9 (Mavericks) makes use of more liberal attribute syntax --- that includes assignment-like expressions referencing version --- numbers. - -attribute_params :: { Reversed [CExpr] } -attribute_params - : constant_expression { singleton $1 } - | unary_expression assignment_operator clang_version_literal { Reversed [] } - | unary_expression assignment_operator unary_expression { Reversed [] } - | attribute_params ',' constant_expression { $1 `snoc` $3 } - | attribute_params ',' unary_expression assignment_operator unary_expression { $1 } - | attribute_params ',' unary_expression assignment_operator clang_version_literal { $1 } - -{ - --- sometimes it is neccessary to reverse an unreversed list -reverseList :: [a] -> Reversed [a] -reverseList = Reversed . List.reverse - --- We occasionally need things to have a location when they don't naturally --- have one built in as tokens and most AST elements do. --- -data Located a = L !a !Position - -unL :: Located a -> a -unL (L a pos) = a - -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 mkAttrNode = do - name <- getNewName - 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 -withAttribute node cattrs mkDeclrNode = do - name <- getNewName - let attrs = mkNodeInfo (posOf node) name - let newDeclr = appendDeclrAttrs cattrs $ mkDeclrNode attrs - attrs `seq` newDeclr `seq` return newDeclr - --- postfixing variant -{-# INLINE withAttributePF #-} -withAttributePF :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR -> CDeclrR) -> P (CDeclrR -> CDeclrR) -withAttributePF node cattrs mkDeclrCtor = do - name <- getNewName - let attrs = mkNodeInfo (posOf node) name - let newDeclr = appendDeclrAttrs cattrs . mkDeclrCtor attrs - attrs `seq` newDeclr `seq` return newDeclr - --- add top level attributes for a declarator. --- --- In the following example --- --- > int declr1, __attribute__((a1)) * __attribute__((a2)) y() __asm__("$" "y") __attribute__((a3)); --- --- the attributes `a1' and `a3' are top-level attributes for y. --- The (pseudo)-AST for the second declarator is --- --- > CDeclr "y" --- > [CFunDeclr ..., CPtrDeclr __attribute__((a2)) ... ] --- > (asm "$y") --- > [__attribute__((a1)), __attribute__((a3)) ] --- --- So assembler names and preceeding and trailing attributes are recorded in object declarator. --- -appendObjAttrs :: [CAttr] -> CDeclr -> CDeclr -appendObjAttrs newAttrs (CDeclr ident indirections asmname cAttrs at) - = CDeclr ident indirections asmname (cAttrs ++ newAttrs) at -appendObjAttrsR :: [CAttr] -> CDeclrR -> CDeclrR -appendObjAttrsR newAttrs (CDeclrR ident indirections asmname cAttrs at) - = CDeclrR ident indirections asmname (cAttrs ++ newAttrs) at - -setAsmName :: Maybe CStrLit -> CDeclrR -> P CDeclrR -setAsmName mAsmName (CDeclrR ident indirections oldName cattrs at) = - case combineName mAsmName oldName of - Left (n1,n2) -> failP (posOf n2) ["Duplicate assembler name: ",showName n1,showName n2] - Right newName -> return $ CDeclrR ident indirections newName cattrs at - where - combineName Nothing Nothing = Right Nothing - combineName Nothing oldname@(Just _) = Right oldname - combineName newname@(Just _) Nothing = Right newname - combineName (Just n1) (Just n2) = Left (n1,n2) - showName (CStrLit cstr _) = show cstr - -withAsmNameAttrs :: (Maybe CStrLit, [CAttr]) -> CDeclrR -> P CDeclrR -withAsmNameAttrs (mAsmName, newAttrs) declr = setAsmName mAsmName (appendObjAttrsR newAttrs declr) - -appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR -appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at) - = CDeclrR ident empty asmname (cattrs ++ newAttrs) at -appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at) - = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where - appendAttrs (CPtrDeclr typeQuals at) = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at - appendAttrs (CArrDeclr typeQuals arraySize at) = CArrDeclr (typeQuals ++ map CAttrQual newAttrs) arraySize at - appendAttrs (CFunDeclr parameters cattrs at) = CFunDeclr parameters (cattrs ++ newAttrs) at - -ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR -ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at - = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat -funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR -funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at - = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat -arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR -arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at - = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat ) - where - arr_sz = case size_expr_opt of - Just e -> CArrSize static_size e - Nothing -> CNoArrSize var_sized - -liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec] -liftTypeQuals = map CTypeQual . reverse - --- lift CAttrs to DeclSpecs --- -liftCAttrs :: [CAttr] -> [CDeclSpec] -liftCAttrs = map (CTypeQual . CAttrQual) - --- when we parsed (decl_spec_1,...,decl_spec_n,attrs), add the __attributes__s to the declspec list --- needs special care when @decl_spec_n@ is a SUE definition -addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec] -addTrailingAttrs declspecs new_attrs = - case viewr declspecs of - (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node)) - -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node)) - (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node)) - -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node)) - _ -> declspecs `rappend` (liftCAttrs new_attrs) - --- convenient instance, the position of a list of things is the position of --- the first thing in the list --- -instance Pos a => Pos [a] where - posOf (x:_) = posOf x - -instance Pos a => Pos (Reversed a) where - posOf (Reversed x) = posOf x - -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 --- if the decl is defining a typedef then we add it to the set, --- if it's a var decl then that shadows typedefed identifiers --- -doDeclIdent :: [CDeclSpec] -> CDeclrR -> P () -doDeclIdent declspecs (CDeclrR mIdent _ _ _ _) = - case mIdent of - Nothing -> return () - Just ident | any iypedef declspecs -> addTypedef ident - | otherwise -> shadowTypedef ident - - where iypedef (CStorageSpec (CTypedef _)) = True - iypedef _ = False - -doFuncParamDeclIdent :: CDeclr -> P () -doFuncParamDeclIdent (CDeclr _ (CFunDeclr params _ _ : _) _ _ _) = - sequence_ - [ case getCDeclrIdent declr of - Nothing -> return () - Just ident -> shadowTypedef ident - | CDecl _ dle _ <- either (const []) fst params - , (Just declr, _, _) <- dle ] -doFuncParamDeclIdent _ = return () - --- extract all identifiers -getCDeclrIdent :: CDeclr -> Maybe Ident -getCDeclrIdent (CDeclr mIdent _ _ _ _) = mIdent - -happyError :: P a -happyError = parseError - --- * public interface - --- | @parseC input initialPos@ parses the given preprocessed C-source input and returns the AST or a list of parse errors. -parseC :: InputStream -> Position -> Either ParseError CTranslUnit -parseC input initialPosition = - fmap fst $ execParser translUnitP input initialPosition builtinTypeNames (namesStartingFrom 0) - --- | @translUnitP@ provides a parser for a complete C translation unit, i.e. a list of external declarations. -translUnitP :: P CTranslUnit -translUnitP = translation_unit --- | @extDeclP@ provides a parser for an external (file-scope) declaration -extDeclP :: P CExtDecl -extDeclP = external_declaration --- | @statementP@ provides a parser for C statements -statementP :: P CStat -statementP = statement --- | @expressionP@ provides a parser for C expressions -expressionP :: P CExpr -expressionP = expression -} +-----------------------------------------------------------------------------+-- Module : Parser.y+-- Copyright : (c) 2005-2007 Duncan Coutts+-- (c) 2008 Benedikt Huber+-- (c) [1999..2004] Manuel M T Chakravarty+-- Portions copyright 1989, 1990 James A. Roskind+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Portability : portable+--+-- Parser for C translation units, which have already been run through the C+-- preprocessor. It is recommended to use the `strict' flag for happy.+--+-- The parser recognizes all of ISO C 99 and most GNU C extensions.+--+-- With C99 we refer to the ISO C99 standard, specifically the section numbers+-- used below refer to this report:+--+-- <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf>+--+-- GNU extensions are documented in the gcc parser+--+-- <http://gcc.gnu.org/viewcvs/trunk/gcc/c-parser.c>+--+-- and in: <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>+--+-- The set of supported extensions is documented in+--+-- <http://www.sivity.net/projects/language.c/wiki/Cee>+------------------------------------------------------------------+{+module Language.C.Parser.Parser (+ -- * Parse a C translation unit+ parseC,+ -- * Exposed Parsers+ translUnitP, extDeclP, statementP, expressionP+) where++-- Relevant C99 sections:+--+-- 6.5 Expressions .1 - .17 and 6.6 (almost literally)+-- Supported GNU extensions:+-- - Allow a compound statement as an expression+-- - Various __builtin_* forms that take type parameters+-- - `alignof' expression or type+-- - `__extension__' to suppress warnings about extensions+-- - Allow taking address of a label with: && label+-- - Omitting the `then' part of conditional expressions+-- - complex numbers+--+-- 6.7 C Declarations .1 -.8+-- Supported GNU extensions:+-- - '__thread' thread local storage (6.7.1)+--+-- 6.8 Statements .1 - .8+-- Supported GNU extensions:+-- - case ranges (C99 6.8.1)+-- - '__label__ ident;' declarations (C99 6.8.2)+-- - computed gotos (C99 6.8.6)+--+-- 6.9 Translation unit+-- Supported GNU extensions:+-- - allow empty translation_unit+-- - allow redundant ';'+-- - allow extension keyword before external declaration+-- - asm definitions+--+-- Since some of the grammar productions are quite difficult to read,+-- (especially those involved with the decleration syntax) we document them+-- with an extended syntax that allows a more consise representation:+--+-- Ordinary rules+--+-- foo named terminal or non-terminal+--+-- 'c' terminal, literal character token+--+-- A B concatenation+--+-- A | B alternation+--+-- (A) grouping+--+-- Extended rules+--+-- A? optional, short hand for (A|) or [A]{ 0==A || 1==A }+--+-- ... stands for some part of the grammar omitted for clarity+--+-- {A} represents sequences, 0 or more.+--+-- <permute> modifier which states that any permutation of the immediate subterms is valid+--+--+--- TODO ----------------------------------------------------------------------+--+-- !* We ignore C11 _Atomic type annotations+-- !* We ignore the C99 static keyword (see C99 6.7.5.3)+-- !* We do not distinguish in the AST between incomplete array types and+-- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)+-- !* The AST doesn't allow recording __attribute__ of unnamed struct field+-- (see , struct_default_declaring_list, struct_identifier_declarator)+-- !* see `We're being far to liberal here' (... struct definition within structs)+-- * Documentation isn't complete and consistent yet.++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(..), ClangCTok (..), 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+import Language.C.Data.Ident+import Language.C.Data.Name+import Language.C.Data.Node+import Language.C.Data.Position+import Language.C.Syntax++}+-- in order to document the parsers, we have to alias them+%name translation_unit translation_unit+%name external_declaration external_declaration+%name statement statement+%name expression expression++%tokentype { CToken }++%monad { P } { >>= } { return }+%lexer { lexC } { CTokEof }++%expect 1++%token++'(' { CTokLParen _ }+')' { CTokRParen _ }+'[' { CTokLBracket _ }+']' { CTokRBracket _ }+"->" { CTokArrow _ }+'.' { CTokDot _ }+'!' { CTokExclam _ }+'~' { CTokTilde _ }+"++" { CTokInc _ }+"--" { CTokDec _ }+'+' { CTokPlus _ }+'-' { CTokMinus _ }+'*' { CTokStar _ }+'/' { CTokSlash _ }+'%' { CTokPercent _ }+'&' { CTokAmper _ }+"<<" { CTokShiftL _ }+">>" { CTokShiftR _ }+'<' { CTokLess _ }+"<=" { CTokLessEq _ }+'>' { CTokHigh _ }+">=" { CTokHighEq _ }+"==" { CTokEqual _ }+"!=" { CTokUnequal _ }+'^' { CTokHat _ }+'|' { CTokBar _ }+"&&" { CTokAnd _ }+"||" { CTokOr _ }+'?' { CTokQuest _ }+':' { CTokColon _ }+'=' { CTokAssign _ }+"+=" { CTokPlusAss _ }+"-=" { CTokMinusAss _ }+"*=" { CTokStarAss _ }+"/=" { CTokSlashAss _ }+"%=" { CTokPercAss _ }+"&=" { CTokAmpAss _ }+"^=" { CTokHatAss _ }+"|=" { CTokBarAss _ }+"<<=" { CTokSLAss _ }+">>=" { CTokSRAss _ }+',' { CTokComma _ }+';' { CTokSemic _ }+'{' { CTokLBrace _ }+'}' { CTokRBrace _ }+"..." { CTokEllipsis _ }+alignof { CTokAlignof _ }+alignas { CTokAlignas _ }+"_Atomic" { CTokAtomic _ }+asm { CTokAsm _ }+auto { CTokAuto _ }+break { CTokBreak _ }+"_Bool" { CTokBool _ }+case { CTokCase _ }+char { CTokChar _ }+const { CTokConst _ }+continue { CTokContinue _ }+"_Complex" { CTokComplex _ }+default { CTokDefault _ }+do { CTokDo _ }+double { CTokDouble _ }+else { CTokElse _ }+enum { CTokEnum _ }+extern { CTokExtern _ }+float { CTokFloat _ }+"_Float32" { CTokFloatN 32 False _ }+"_Float32x" { CTokFloatN 32 True _ }+"_Float64" { CTokFloatN 64 False _ }+"_Float64x" { CTokFloatN 64 True _ }+"_Float128" { CTokFloatN 128 False _ }+"_Float128x" { CTokFloatN 128 True _ }+"__float128" { CTokFloatN 128 False _ }+for { CTokFor _ }+"_Generic" { CTokGeneric _ }+goto { CTokGoto _ }+if { CTokIf _ }+inline { CTokInline _ }+int { CTokInt _ }+"__int128" { CTokInt128 _ }+long { CTokLong _ }+"__label__" { CTokLabel _ }+"_Noreturn" { CTokNoreturn _ }+"_Nullable" { CTokNullable _ }+"_Nonnull" { CTokNonnull _ }+register { CTokRegister _ }+restrict { CTokRestrict _ }+return { CTokReturn _ }+short { CTokShort _ }+signed { CTokSigned _ }+sizeof { CTokSizeof _ }+static { CTokStatic _ }+"_Static_assert"{ CTokStaticAssert _ }+struct { CTokStruct _ }+switch { CTokSwitch _ }+typedef { CTokTypedef _ }+typeof { CTokTypeof _ }+"__thread" { CTokThread _ }+union { CTokUnion _ }+unsigned { CTokUnsigned _ }+void { CTokVoid _ }+volatile { CTokVolatile _ }+while { CTokWhile _ }+cchar { CTokCLit _ _ } -- character constant+cint { CTokILit _ _ } -- integer constant+cfloat { CTokFLit _ _ } -- float constant+cstr { CTokSLit _ _ } -- string constant (no escapes)+ident { CTokIdent _ $$ } -- identifier+tyident { CTokTyIdent _ $$ } -- `typedef-name' identifier+"__attribute__" { CTokGnuC GnuCAttrTok _ } -- special GNU C tokens+"__extension__" { CTokGnuC GnuCExtTok _ } -- special GNU C tokens+"__real__" { CTokGnuC GnuCComplexReal _ }+"__imag__" { CTokGnuC GnuCComplexImag _ }+-- special GNU C builtin 'functions' that actually take types as parameters:+"__builtin_va_arg" { CTokGnuC GnuCVaArg _ }+"__builtin_offsetof" { CTokGnuC GnuCOffsetof _ }+"__builtin_types_compatible_p" { CTokGnuC GnuCTyCompat _ }+"__builtin_convertvector" { CTokClangC _ ClangBuiltinConvertVector }+clangcversion { CTokClangC _ (ClangCVersionTok $$) } -- Clang version literal++%%+++-- parse a complete C translation unit+-- we have to take special care of empty translation units+translation_unit :: { CTranslUnit }+translation_unit+ : 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)+--+-- * GNU extensions:+-- allow empty translation_unit+-- allow redundant ';'+ext_decl_list :: { Reversed [CExtDecl] }+ext_decl_list+ : {- empty -} { empty }+ | ext_decl_list ';' { $1 }+ | ext_decl_list external_declaration { $1 `snoc` $2 }+++-- parse external C declaration (C99 6.9)+--+-- * GNU extensions:+-- allow extension keyword before external declaration (TODO: discarded)+-- asm definitions+external_declaration :: { CExtDecl }+external_declaration+ : function_definition { CFDefExt $1 }+ | declaration { CDeclExt $1 }+ | "__extension__" external_declaration { $2 }+ | asm '(' string_literal ')' ';' {% withNodeInfo $1 $ CAsmExt $3 }+++-- parse C function definition (C99 6.9.1)+--+-- function_definition :- specifiers? fun-declarator compound-statement+-- specifiers? old-fun-declarator declaration-list compound-statement+--+-- The specifiers are a list consisting of type-names (int, struct foo, ...),+-- storage-class specifiers (extern, static,...) and type qualifiers (const, volatile, ...).+--+-- declaration_specifier :- <permute> type-qualifier* storage-class+ typename+ "extern unsigned static volatile int f()"+-- type_specifier :- <permute> type-qualifier* typename+ "const int f()", "long int f()"+-- declaration_qualifier_list :- <permute> type_qualifier* storage-class+ "extern static const f()"+-- type_qualifier_list :- type-qualifier+ "const f()"+--+-- * GNU extension:+-- __attribute__ annotations+--+function_definition :: { CFunDef }+function_definition+ : function_declarator compound_statement+ {% leaveScope >> (withNodeInfo $1 $ CFunDef [] $1 [] $2) }++ | attrs function_declarator compound_statement+ {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftCAttrs $1) $2 [] $3) }++ | declaration_specifier function_declarator compound_statement+ {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }++ | type_specifier function_declarator compound_statement+ {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }++ | declaration_qualifier_list function_declarator compound_statement+ {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }++ | type_qualifier_list function_declarator compound_statement+ {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }++ | type_qualifier_list attrs function_declarator compound_statement+ {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) }++ -- old function declarators++ | function_declarator_old declaration_list compound_statement+ {% withNodeInfo $1 $ CFunDef [] $1 (reverse $2) $3 }++ | attrs function_declarator_old declaration_list compound_statement+ {% withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 (reverse $3) $4 }++ | declaration_specifier function_declarator_old declaration_list compound_statement+ {% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }++ | type_specifier function_declarator_old declaration_list compound_statement+ {% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }++ | declaration_qualifier_list function_declarator_old declaration_list compound_statement+ {% withNodeInfo $1 $ CFunDef (reverse $1) $2 (reverse $3) $4 }++ | type_qualifier_list function_declarator_old declaration_list compound_statement+ {% withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 (reverse $3) $4 }++ | type_qualifier_list attrs function_declarator_old declaration_list compound_statement+ {% withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 (reverse $4) $5 }++-- Read declarator and put function+function_declarator :: { CDeclr }+function_declarator+ : identifier_declarator+ {% let declr = reverseDeclr $1 in+ enterScope >> doFuncParamDeclIdent declr >> return declr }+++-- parse C statement (C99 6.8)+--+-- * GNU extension: ' __asm__ (...); ' statements+--+statement :: { CStat }+statement+ : labeled_statement { $1 }+ | compound_statement { $1 }+ | expression_statement { $1 }+ | selection_statement { $1 }+ | iteration_statement { $1 }+ | jump_statement { $1 }+ | asm_statement {% withNodeInfo $1 (CAsm $1) }+++-- parse C labeled statement (C99 6.8.1)+--+-- * GNU extension: case ranges+--+labeled_statement :: { CStat }+labeled_statement+ : 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+ {% withNodeInfo $1 $ CCases $2 $4 $6 }+++-- parse C compound statement (C99 6.8.2)+--+-- * GNU extension: '__label__ ident;' declarations+--+compound_statement :: { CStat }+compound_statement+ : '{' enter_scope block_item_list leave_scope '}'+ {% withNodeInfo $1 $ CCompound [] (reverse $3) }++ | '{' enter_scope label_declarations block_item_list leave_scope '}'+ {% withNodeInfo $1 $ CCompound (reverse $3) (reverse $4) }+++-- No syntax for these, just side effecting semantic actions.+--+enter_scope :: { () }+enter_scope : {% enterScope }+leave_scope :: { () }+leave_scope : {% leaveScope }+++block_item_list :: { Reversed [CBlockItem] }+block_item_list+ : {- empty -} { empty }+ | block_item_list block_item { $1 `snoc` $2 }++block_item :: { CBlockItem }+block_item+ : statement { CBlockStmt $1 }+ | nested_declaration { $1 }++nested_declaration :: { CBlockItem }+nested_declaration+ : declaration { CBlockDecl $1 }+ | nested_function_definition { CNestedFunDef $1 }+ | "__extension__" nested_declaration { $2 }++nested_function_definition :: { CFunDef }+nested_function_definition+ : declaration_specifier function_declarator compound_statement+ {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }++ | type_specifier function_declarator compound_statement+ {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }++ | declaration_qualifier_list function_declarator compound_statement+ {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }++ | type_qualifier_list function_declarator compound_statement+ {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }++ | type_qualifier_list attrs function_declarator compound_statement+ {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) }+++label_declarations :: { Reversed [Ident] }+label_declarations+ : "__label__" identifier_list ';' { $2 }+ | label_declarations "__label__" identifier_list ';' { $1 `rappendr` $3 }+++-- parse C expression statement (C99 6.8.3)+--+expression_statement :: { CStat }+expression_statement+ : ';' {% withNodeInfo $1 $ CExpr Nothing }+ | expression ';' {% withNodeInfo $1 $ CExpr (Just $1) }+++-- parse C selection statement (C99 6.8.4)+--+selection_statement :: { CStat }+selection_statement+ : if '(' expression ')' statement+ {% withNodeInfo $1 $ CIf $3 $5 Nothing }++ | if '(' expression ')' statement else statement+ {% withNodeInfo $1 $ CIf $3 $5 (Just $7) }++ | switch '(' expression ')' statement+ {% withNodeInfo $1 $ CSwitch $3 $5 }+++-- parse C iteration statement (C99 6.8.5)+--+iteration_statement :: { CStat }+iteration_statement+ : while '(' expression ')' statement+ {% withNodeInfo $1 $ CWhile $3 $5 False }++ | do statement while '(' expression ')' ';'+ {% withNodeInfo $1 $ CWhile $5 $2 True }++ | for '(' expression_opt ';' expression_opt ';' expression_opt ')' statement+ {% withNodeInfo $1 $ CFor (Left $3) $5 $7 $9 }++ | for '(' enter_scope declaration expression_opt ';' expression_opt ')' statement leave_scope+ {% withNodeInfo $1 $ CFor (Right $4) $5 $7 $9 }+++-- parse C jump statement (C99 6.8.6)+--+-- * GNU extension: computed gotos+--+jump_statement :: { CStat }+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 }+++-- parse GNU C __asm__ statement (compatible with C99: J.5.10)+--+-- asm_stmt :- asm volatile? ( "asm..." : output-operands : input-operands : asm-clobbers )+-- asm_operand :- [operand-name] "constraint" ( expr )+-- asm_clobber :- "r1", "r2", ...+--+asm_statement :: { CAsmStmt }+asm_statement+ : asm maybe_type_qualifier '(' string_literal ')' ';'+ {% withNodeInfo $1 $ CAsmStmt $2 $4 [] [] [] }++ | asm maybe_type_qualifier '(' string_literal ':' asm_operands ')' ';'+ {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 [] [] }++ | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ')' ';'+ {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 [] }++ | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';'+ {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 (reverse $10) }+++maybe_type_qualifier :: { Maybe CTypeQual }+maybe_type_qualifier+ : {- empty -} { Nothing }+ | type_qualifier { Just $1 }++asm_operands :: { [CAsmOperand] }+asm_operands+ : {- empty -} { [] }+ | 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 :: { CAsmOperand }+asm_operand+ : 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 }+ | asm_clobbers ',' string_literal { $1 `snoc` $3 }++{-+---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-- Declarations+---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------++Declarations are the most complicated part of the grammar, and shall be summarized here.+To allow a lightweight notation, we will use the modifier <permute> to indicate that the order of the immidieate right-hand sides doesn't matter.+ - <permute> a* b+ c === any sequence of a's, b's and c's, which contains exactly 1 'c' and at least one 'b'++-- storage class and type qualifier+---------------------------------------------------------------------------------------------------------------+attr :- __attribute__((..))+storage_class :- typedef | extern | static | auto | register | _Thread_local+function_specifier :- inline | _Noreturn+alignment_specifier :- _Alignas (type_name) | _Alignas (constant_expr)++type_qualifier :- const | volatile | restrict | _Atomic | _Nullable | _Nonnull+type_qualifier_list :- type_qualifier+++declaration_qualifier :- storage_class | type_qualifier | function_specifier | alginment_specifier+declaration_qualifier_list :- <permute> type_qualifier* storage_class+++qualifiers :- declaration_qualifier_list | type_qualifier_list+ := <permute> (type_qualifier|storage_class)+++-- type names+---------------------------------------------------------------------------------------------------------------+declaration_specifier :- <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident )+type_specifier :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | tyident)++specifiers :- declaration_specifier | type_specifier+ := <permute> type_qualifier* storage_class* (basic_type_name+ | elaborated_type_name | tyident )++-- struct/union/enum declarations+---------------------------------------------------------------------------------------------------------------+sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name+sue_type_specifier :- <permute> type_qualifier* elaborated_type_name++sue_declaration := sue_declaration_specifier | sue_type_specifier+ :- <permute> type_qualifier* storage_class* elaborated_type_name++-- declarators+---------------------------------------------------------------------------------------------------------------+identifier_declarator :- ( '*' (type_qualifier | attr)* ) * ident [ array_decl | "(" parameter-list ")" ]+ plus additional parenthesis' ending ^^ here+typedef_declartor :-+declarator :- identifier_declarator | typedef_declarator++-- Declaration lists+---------------------------------------------------------------------------------------------------------------+default_declaring_list :- qualifiers ( identifier_declarator asm*attrs* initializer? )_comma_list++declaring_list :- specifiers ( declarator asm*attrs* initializer? )_comma_list++declaration_list := default_declaring_list | declaring_list++-- Declaration+---------------------------------------------------------------------------------------------------------------+declaration = sue_declaration | declaration_list | _Static_assert(..)++---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+-- Attributes+-- (citing http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html)+---------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------++"Attributes may appear after the colon following a label (expect case and default)"++labeled_statement :- identifier ':' attrs_opt statement++"Attributes may go either immediately after the struct/union/enum keyword or after the closing brace"++struct attrs_opt ...+struct ... { } attrs_opt++"In general: Attributes appear as part of declarations, either belonging to a declaration or declarator"++"Any list of specifiers and qualifiers at the start of a declaration may contain attribute specifiers"+"An attribute list may appear immediately before the comma, = or semicolon terminating a declaration of an identifier"++---------------------------------------------------------------------------------------------------------------+For the parser, we modified the following rules to be interleaved with attributes:++default_declaring_list' :- (declaration_qualifier_list' | type_qualifier_list' attr*)+ identifier_declarator asm*attr* initializer?+ { ',' attr* identifier_declarator asm*attr* initializer? }+declaring_list' :- specifier' declarator asm*attr* initializer?+ { ',' attr* declarator asm*attr* initializer? }+++type_qualifier_list' is like type_qualifier_list, but with preceeding and/or interleaving (but not terminating) __attribute__ annotations.+declaration_qualifier_list', declaration_specifier' and type_specifier' are like their unprimed variants, but with arbitrary preceeding, interleaving and/or terminating __attribute__ annotations.++"An attribute list may appear immediately before a declarator other than the first in a comma seperated list of declarators"++"The attribute specifiers may be the only specifiers present (implicit int)" [not supported]++"Attribute specifiers may be mixed with type qualifiers appearing inside the [] of an parameter array declarator"++tbc.+-}++++-- parse C declaration (C11 6.7)+--+-- * new form in C11+-- _Static_assert(expr,string_literal)+declaration :: { CDecl }+declaration+ : sue_declaration_specifier ';'+ {% withNodeInfo $1 $ CDecl (reverse $1) [] }++ | sue_type_specifier ';'+ {% withNodeInfo $1 $ CDecl (reverse $1) [] }++ | declaring_list ';'+ {% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) }++ | default_declaring_list ';'+ {% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) }+ | "_Static_assert" '(' constant_expression ',' string_literal ')' ';'+ {% withNodeInfo $1 $ CStaticAssert $3 $5 }++declaration_list :: { Reversed [CDecl] }+declaration_list+ : {- empty -} { empty }+ | declaration_list declaration { $1 `snoc` $2 }+++-- * SUMMARY: default_declaring_list :- qualifier* identifier_declarator asm_attrs initializer?+-- { ',' identifier_declarator asm_attrs initializer? }+--+-- * GNU extensions+-- __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11)+-- asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12)+-- The assembler annotation is used to specifiy an assembler name for the declarator.+--+default_declaring_list :: { CDecl }+default_declaring_list+ : declaration_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt+ {% let declspecs = reverse $1 in+ do{ declr <- withAsmNameAttrs $3 $2+ ; doDeclIdent declspecs declr+ ; withNodeInfo $1 $+ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}++ | type_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt+ {% let declspecs = liftTypeQuals $1 in+ do{ declr <- withAsmNameAttrs $3 $2+ ; doDeclIdent declspecs declr+ ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}++ | type_qualifier_list attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt -- FIX 1600+ {% let declspecs = liftTypeQuals $1 in+ do{ declr <- withAsmNameAttrs $4 $3+ ; doDeclIdent declspecs declr+ ; withNodeInfo $1 $ CDecl (declspecs ++ liftCAttrs $2) [(Just (reverseDeclr declr), $5, Nothing)] }}++ -- GNU extension: __attribute__ as the only qualifier+ | attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt+ {% let declspecs = liftCAttrs $1 in+ do{ declr <- withAsmNameAttrs $3 $2+ ; doDeclIdent declspecs declr+ ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}++ | default_declaring_list ',' attrs_opt identifier_declarator asm_attrs_opt {-{}-} initializer_opt+ {% case $1 of+ CDecl declspecs dies at -> do+ declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4+ doDeclIdent declspecs declr+ withLength at $ CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) }++-- assembler, followed by attribute annotation+asm_attrs_opt :: { (Maybe CStrLit, [CAttr]) }+asm_attrs_opt+ : asm_opt attrs_opt+ { ($1,$2) }++--+-- SUMMARY: declaring_list :- specifier* declarator asm_attrs initializer?+-- { ',' declarator asm_attrs initializer? }+--+-- GNU extensions:+-- __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11)+-- asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12)+--+declaring_list :: { CDecl }+declaring_list+ : declaration_specifier declarator asm_attrs_opt initializer_opt+ {% do{+ declr <- withAsmNameAttrs $3 $2;+ doDeclIdent $1 declr;+ withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] }+ }++ | type_specifier declarator asm_attrs_opt initializer_opt+ {% do{+ declr <- withAsmNameAttrs $3 $2;+ doDeclIdent $1 declr;+ withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] }+ }++ | declaring_list ',' attrs_opt declarator asm_attrs_opt initializer_opt+ {% case $1 of+ 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) }+++-- parse C declaration specifiers (C99 6.7)+--+-- * <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident )+--+declaration_specifier :: { [CDeclSpec] }+declaration_specifier+ : basic_declaration_specifier { reverse $1 } -- Arithmetic or void+ | sue_declaration_specifier { reverse $1 } -- Struct/Union/Enum+ | typedef_declaration_specifier { reverse $1 } -- Typedef+++-- A mixture of type qualifiers (const, volatile, restrict, _Atomic, _Nonnull, _Nullable),+-- function specifiers (inline, _Noreturn),+-- alignment specifiers (_Alignas) and+-- storage class specifiers (extern, static, auto, register, _Thread_local),+-- in any order, but containing at least one storage class specifier.+--+-- declaration_qualifier_list :- <permute> type_qualifier* alignment_specifier* function_specifier* storage_class++--+-- GNU extensions+-- * arbitrary interleaved __attribute__ annotations+--+declaration_qualifier_list :: { Reversed [CDeclSpec] }+declaration_qualifier_list+ : declaration_qualifier_without_types+ { singleton $1 }++ | attrs declaration_qualifier_without_types+ { reverseList (liftCAttrs $1) `snoc` $2 }++ | type_qualifier_list declaration_qualifier_without_types+ { rmap CTypeQual $1 `snoc` $2 }++ | type_qualifier_list attrs declaration_qualifier_without_types+ { (rmap CTypeQual $1 `rappend` liftCAttrs $2) `snoc` $3 }++ | declaration_qualifier_list declaration_qualifier+ { $1 `snoc` $2 }++ | declaration_qualifier_list attr+ { addTrailingAttrs $1 $2 }++--+-- declaration_qualifier :- storage_class | type_qualifier | function_specifier | alignment_specifier+--+declaration_qualifier :: { CDeclSpec }+declaration_qualifier+ : storage_class { CStorageSpec $1 }+ | type_qualifier { CTypeQual $1 }+ | function_specifier { CFunSpec $1 }+ | alignment_specifier { CAlignSpec $1 }+++declaration_qualifier_without_types :: { CDeclSpec }+ : storage_class { CStorageSpec $1 }+ | function_specifier { CFunSpec $1 }+ | alignment_specifier { CAlignSpec $1 }+++-- parse C storage class specifier (C99 6.7.1)+--+-- * GNU extensions: '__thread' thread local storage+--+storage_class :: { CStorageSpec }+storage_class+ : typedef {% withNodeInfo $1 $ CTypedef }+ | extern {% withNodeInfo $1 $ CExtern }+ | static {% withNodeInfo $1 $ CStatic }+ | auto {% withNodeInfo $1 $ CAuto }+ | register {% withNodeInfo $1 $ CRegister }+ | "__thread" {% withNodeInfo $1 $ CThread }++-- parse C function specifier (C11 6.7.4)+function_specifier :: { CFunSpec }+function_specifier+ : inline {% withNodeInfo $1 $ CInlineQual }+ | "_Noreturn" {% withNodeInfo $1 $ CNoreturnQual }++-- parse C alignment specifier (C11 6.7.5)+alignment_specifier :: { CAlignSpec }+alignment_specifier+ : alignas '(' type_name ')' {% withNodeInfo $1 $ CAlignAsType $3 }+ | alignas '(' constant_expression ')' {% withNodeInfo $1 $ CAlignAsExpr $3 }++-- parse C type specifier (C99 6.7.2)+--+-- 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 | g)+--+-- Type specifier _Atomic(type) is not yet supported because of conflicts with type qualifier _Atomic+type_specifier :: { [CDeclSpec] }+type_specifier+ : basic_type_specifier { reverse $1 } -- Arithmetic or void+ | sue_type_specifier { reverse $1 } -- Struct/Union/Enum+ | typedef_type_specifier { reverse $1 } -- Typedef+-- | "_Atomic" '(' type_name ')' -- _Atomic(type)+-- {% withNodeInfo $1 $ \at -> [CTypeSpec (CAtomicType $3 at)] }++basic_type_name :: { CTypeSpec }+basic_type_name+ : void {% withNodeInfo $1 $ CVoidType }+ | char {% withNodeInfo $1 $ CCharType }+ | short {% withNodeInfo $1 $ CShortType }+ | int {% withNodeInfo $1 $ CIntType }+ | long {% withNodeInfo $1 $ CLongType }+ | float {% withNodeInfo $1 $ CFloatType }+ | double {% withNodeInfo $1 $ CDoubleType }+ | signed {% withNodeInfo $1 $ CSignedType }+ | unsigned {% withNodeInfo $1 $ CUnsigType }+ | "_Bool" {% withNodeInfo $1 $ CBoolType }+ | "_Complex" {% withNodeInfo $1 $ CComplexType }+ | "__int128" {% withNodeInfo $1 $ CInt128Type }+ | "_Float32" {% withNodeInfo $1 $ (CFloatNType 32 False) }+ | "_Float32x" {% withNodeInfo $1 $ (CFloatNType 32 True) }+ | "_Float64" {% withNodeInfo $1 $ (CFloatNType 64 False) }+ | "_Float64x" {% withNodeInfo $1 $ (CFloatNType 64 True) }+ | "_Float128" {% withNodeInfo $1 $ (CFloatNType 128 False) }+ | "_Float128x" {% withNodeInfo $1 $ (CFloatNType 128 True) }+ | "__float128" {% withNodeInfo $1 $ (CFloatNType 128 False) }++++-- A mixture of type qualifiers, storage class and basic type names in any+-- order, but containing at least one basic type name and at least one storage+-- class specifier.+--+-- basic_declaration_specifier :- <permute> type_qualifier* storage_class+ basic_type_name++--+-- GNU extensions+-- arbitrary interleaved __attribute__ annotations+--+basic_declaration_specifier :: { Reversed [CDeclSpec] }+basic_declaration_specifier+ : declaration_qualifier_list basic_type_name+ { $1 `snoc` CTypeSpec $2 }++ | basic_type_specifier storage_class+ { $1 `snoc` CStorageSpec $2 }++ | basic_declaration_specifier declaration_qualifier+ { $1 `snoc` $2 }++ | basic_declaration_specifier basic_type_name+ { $1 `snoc` CTypeSpec $2 }++ | basic_declaration_specifier attr+ { addTrailingAttrs $1 $2 }+++-- A mixture of type qualifiers and basic type names in any order, but+-- containing at least one basic type name.+--+-- basic_type_specifier :- <permute> type_qualifier* basic_type_name++--+-- GNU extensions+-- arbitrary interleaved __attribute__ annotations+--+basic_type_specifier :: { Reversed [CDeclSpec] }+basic_type_specifier+ -- Arithmetic or void+ : basic_type_name+ { singleton (CTypeSpec $1) }++ | attrs basic_type_name+ { (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }++ | type_qualifier_list basic_type_name+ { rmap CTypeQual $1 `snoc` CTypeSpec $2 }++ | type_qualifier_list attrs basic_type_name+ { rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }++ | basic_type_specifier type_qualifier+ { $1 `snoc` CTypeQual $2 }++ | basic_type_specifier basic_type_name+ { $1 `snoc` CTypeSpec $2 }++ | basic_type_specifier attr+ { addTrailingAttrs $1 $2 }+++-- A named or anonymous struct, union or enum type along with at least one+-- storage class and any mix of type qualifiers.+--+-- * Summary:+-- sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name+--+sue_declaration_specifier :: { Reversed [CDeclSpec] }+sue_declaration_specifier+ : declaration_qualifier_list elaborated_type_name+ { $1 `snoc` CTypeSpec $2 }++ | sue_type_specifier storage_class+ { $1 `snoc` CStorageSpec $2 }++ | sue_declaration_specifier declaration_qualifier+ { $1 `snoc` $2 }++ | sue_declaration_specifier attr+ { addTrailingAttrs $1 $2 }+++-- A struct, union or enum type (named or anonymous) with optional leading and+-- trailing type qualifiers.+--+-- * Summary:+-- sue_type_specifier :- <permute> type_qualifier* elaborated_type_name+--+-- * GNU Extensions: records __attribute__ annotations+--+sue_type_specifier :: { Reversed [CDeclSpec] }+sue_type_specifier+ -- struct/union/enum+ : elaborated_type_name+ { singleton (CTypeSpec $1) }++ | attrs elaborated_type_name+ { (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }++ | type_qualifier_list elaborated_type_name+ { rmap CTypeQual $1 `snoc` CTypeSpec $2 }++ | type_qualifier_list attrs elaborated_type_name+ { rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }++ | sue_type_specifier type_qualifier+ { $1 `snoc` CTypeQual $2 }++ | sue_type_specifier attr+ { addTrailingAttrs $1 $2 }++-- A typedef'ed type identifier with at least one storage qualifier and any+-- number of type qualifiers+--+-- * Summary:+-- typedef_declaration_specifier :- <permute> type_qualifier* storage_class+ tyident+--+-- * Note:+-- the tyident can also be a: typeof '(' ... ')'+--+typedef_declaration_specifier :: { Reversed [CDeclSpec] }+typedef_declaration_specifier+ : typedef_type_specifier storage_class+ { $1 `snoc` CStorageSpec $2 }++ | declaration_qualifier_list tyident+ {% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeDef $2 at) }++ | declaration_qualifier_list typeof '(' expression ')'+ {% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }++ | declaration_qualifier_list typeof '(' type_name ')'+ {% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeOfType $4 at) }++ | typedef_declaration_specifier declaration_qualifier+ { $1 `snoc` $2 }++ | typedef_declaration_specifier attr+ { addTrailingAttrs $1 $2 }+++-- typedef'ed type identifier with optional leading and trailing type qualifiers+--+-- * Summary:+-- type_qualifier* ( tyident | typeof '('...')' ) type_qualifier*+--+typedef_type_specifier :: { Reversed [CDeclSpec] }+typedef_type_specifier+ : tyident+ {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeDef $1 at)) }++ | typeof '(' expression ')'+ {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfExpr $3 at)) }++ | typeof '(' type_name ')'+ {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfType $3 at)) }++ | type_qualifier_list tyident+ {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeDef $2 at) }++ | type_qualifier_list typeof '(' expression ')'+ {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }++ | type_qualifier_list typeof '(' type_name ')'+ {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeOfType $4 at) }++ -- repeat with attrs (this could be easier if type qualifier list wouldn't allow leading attributes)+ | attrs tyident+ {% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeDef $2 at)) }++ | attrs typeof '(' expression ')'+ {% 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 $3 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeDef $3 at) }++ | type_qualifier_list attrs typeof '(' expression ')'+ {% withNodeInfo $3 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfExpr $5 at) }++ | type_qualifier_list attrs typeof '(' type_name ')'+ {% withNodeInfo $3 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfType $5 at) }++ | typedef_type_specifier type_qualifier+ { $1 `snoc` CTypeQual $2 }++ | typedef_type_specifier attr+ { addTrailingAttrs $1 $2 }+++-- A named or anonymous struct, union or enum type.+--+-- * Summary:+-- (struct|union|enum) (identifier? '{' ... '}' | identifier)+--+elaborated_type_name :: { CTypeSpec }+elaborated_type_name+ : struct_or_union_specifier {% withNodeInfo $1 $ CSUType $1 }+ | enum_specifier {% withNodeInfo $1 $ CEnumType $1 }+++-- parse C structure or union declaration (C99 6.7.2.1)+--+-- * Summary:+-- (struct|union) (identifier? '{' ... '}' | identifier)+--+struct_or_union_specifier :: { CStructUnion }+struct_or_union_specifier+ : struct_or_union attrs_opt identifier '{' struct_declaration_list '}'+ {% withNodeInfo $1 $ CStruct (unL $1) (Just $3) (Just$ reverse $5) $2 }++ | struct_or_union attrs_opt '{' struct_declaration_list '}'+ {% withNodeInfo $1 $ CStruct (unL $1) Nothing (Just$ reverse $4) $2 }++ | struct_or_union attrs_opt identifier+ {% withNodeInfo $1 $ CStruct (unL $1) (Just $3) Nothing $2 }+++struct_or_union :: { Located CStructTag }+struct_or_union+ : struct { L CStructTag (posOf $1) }+ | union { L CUnionTag (posOf $1) }+++struct_declaration_list :: { Reversed [CDecl] }+struct_declaration_list+ : {- empty -} { empty }+ | struct_declaration_list ';' { $1 }+ | struct_declaration_list struct_declaration { $1 `snoc` $2 }+++-- parse C structure declaration (C99 6.7.2.1)+--+struct_declaration :: { CDecl }+struct_declaration+ : struct_declaring_list ';'+ { case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at }++ | struct_default_declaring_list';'+ { case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at }++ | "__extension__" struct_declaration { $2 }+++--+-- * Note: doesn't redeclare typedef+--+-- TODO: FIXME: AST doesn't allow recording attributes of unnamed struct members+struct_default_declaring_list :: { CDecl }+struct_default_declaring_list+ : type_qualifier_list attrs_opt struct_identifier_declarator+ {% withNodeInfo $1 $ case $3 of (d,s) -> CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [(d,Nothing,s)] }++ -- GNU extension: __attribute__ as only type qualifier+ | attrs struct_identifier_declarator+ {% withNodeInfo $1 $ case $2 of (d,s) -> CDecl (liftCAttrs $1) [(d,Nothing,s)] }+ -- attrs_opt apply to the declared object+ | struct_default_declaring_list ',' attrs_opt struct_identifier_declarator+ { case $1 of+ CDecl declspecs dies at ->+ case $4 of+ (Just d,s) -> CDecl declspecs ((Just $ appendObjAttrs $3 d,Nothing,s) : dies) at+ (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) at } -- FIXME++-- * GNU extensions:+-- allow anonymous nested structures and unions+-- FIXME: cannot record attribute of unnamed field+struct_declaring_list :: { CDecl }+struct_declaring_list+ : type_specifier struct_declarator attrs_opt+ {% withNodeInfo $1 $ case $2 of { (Just d,s) -> CDecl $1 [(Just $! appendObjAttrs $3 d,Nothing,s)]+ ; (Nothing,s) -> CDecl $1 [(Nothing,Nothing,s)] } } {- DO FIXME -}+ | struct_declaring_list ',' attrs_opt struct_declarator attrs_opt+ { case $1 of+ CDecl declspecs dies attr ->+ case $4 of+ (Just d,s) -> CDecl declspecs ((Just$ appendObjAttrs ($3++$5) d,Nothing,s) : dies) attr+ (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) attr }++ -- FIXME: We're being far too liberal in the parsing here, we really want to just+ -- allow unnamed struct and union fields but we're actually allowing any+ -- unnamed struct member. Making it allow only unnamed structs or unions in+ -- the parser is far too tricky, it makes things ambiguous. So we'll have to+ -- diagnose unnamed fields that are not structs/unions in a later stage.++ -- Note that a plain type specifier can have a trailing attribute++ | type_specifier+ {% withNodeInfo $1 $ CDecl $1 [] }+++-- parse C structure declarator (C99 6.7.2.1)+--+struct_declarator :: { (Maybe CDeclr, Maybe CExpr) }+struct_declarator+ : declarator { (Just (reverseDeclr $1), Nothing) }+ | ':' constant_expression { (Nothing, Just $2) }+ | declarator ':' constant_expression { (Just (reverseDeclr $1), Just $3) }++-- FIXME: anonymous bitfield doesn't allow recording of attributes+struct_identifier_declarator :: { (Maybe CDeclr, Maybe CExpr) }+struct_identifier_declarator+ : identifier_declarator { (Just (reverseDeclr $1), Nothing) }+ | ':' constant_expression { (Nothing, Just $2) }+ | identifier_declarator ':' constant_expression { (Just (reverseDeclr $1), Just $3) }+ | struct_identifier_declarator attr+ { case $1 of { (Nothing,expr) -> (Nothing,expr) {- FIXME -}+ ; (Just (CDeclr name derived asmname attrs node), bsz) ->+ (Just (CDeclr name derived asmname (attrs++$2) node),bsz)+ }+ }++-- parse C enumeration declaration (C99 6.7.2.2)+--+-- * Summary:+-- enum (identifier? '{' ... '}' | identifier)+--+enum_specifier :: { CEnum }+enum_specifier+ : enum attrs_opt '{' enumerator_list '}'+ {% withNodeInfo $1 $ CEnum Nothing (Just$ reverse $4) $2 }++ | enum attrs_opt '{' enumerator_list ',' '}'+ {% withNodeInfo $1 $ CEnum Nothing (Just$ reverse $4) $2 }++ | enum attrs_opt identifier '{' enumerator_list '}'+ {% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }++ | enum attrs_opt identifier '{' enumerator_list ',' '}'+ {% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }++ | enum attrs_opt identifier+ {% withNodeInfo $1 $ CEnum (Just $3) Nothing $2 }++enumerator_list :: { Reversed [(Ident, Maybe CExpr)] }+enumerator_list+ : enumerator { singleton $1 }+ | enumerator_list ',' enumerator { $1 `snoc` $3 }+++enumerator :: { (Ident, Maybe CExpr) }+enumerator+ : identifier { ($1, Nothing) }+ | identifier attrs { ($1, Nothing) }+ | identifier attrs '=' constant_expression { ($1, Just $4) }+ | identifier '=' constant_expression { ($1, Just $3) }+++-- parse C type qualifier (C11 6.7.3)+--+-- concerning atomic, note: If the _Atomic keyword is immediately followed by a left+-- parenthesis, it should be interpreted as a type specifier (with a type name), not as a type qualifier+type_qualifier :: { CTypeQual }+type_qualifier+ : const {% withNodeInfo $1 $ CConstQual }+ | volatile {% withNodeInfo $1 $ CVolatQual }+ | restrict {% withNodeInfo $1 $ CRestrQual }+ | "_Nullable" {% withNodeInfo $1 $ CNullableQual }+ | "_Nonnull" {% withNodeInfo $1 $ CNonnullQual }+ | "_Atomic" {% withNodeInfo $1 $ CAtomicQual }++-- a list containing at least one type_qualifier (const, volatile, restrict, inline, _Noreturn)+-- and additionally CAttrs+type_qualifier_list :: { Reversed [CTypeQual] }+type_qualifier_list+ : attrs_opt type_qualifier { reverseList (map CAttrQual $1) `snoc` $2 }+ | type_qualifier_list type_qualifier { $1 `snoc` $2 }+ | type_qualifier_list attrs type_qualifier { ($1 `rappend` map CAttrQual $2) `snoc` $3}++-- parse C declarator (C99 6.7.5)+--+declarator :: { CDeclrR }+declarator+ : identifier_declarator { $1 }+ | typedef_declarator { $1 }+++-- Parse GNU C's asm annotations+--+-- Those annotations allow to give an assembler name to a function or identifier.+asm_opt :: { Maybe CStrLit }+asm_opt+ : {- empty -} { Nothing }+ | asm '(' string_literal ')' { Just $3 }++--+-- typedef_declarator :-++typedef_declarator :: { CDeclrR }+typedef_declarator+ -- would be ambiguous as parameter+ : paren_typedef_declarator { $1 }++ -- not ambiguous as param+ | parameter_typedef_declarator { $1 }+++-- parameter_typedef_declarator :- tyident declarator_postfix?+-- | '(' attrs? clean_typedef_declarator ')' declarator_postfix?+-- | '*' attrs? type_qualifier_list? parameter_typedef_declarator+--+parameter_typedef_declarator :: { CDeclrR }+parameter_typedef_declarator+ : tyident+ {% withNodeInfo $1 $ mkVarDeclr $1 }++ | tyident postfixing_abstract_declarator+ {% withNodeInfo $1 $ \at -> $2 (mkVarDeclr $1 at) }++ | clean_typedef_declarator+ { $1 }+++-- The following have at least one '*'.+-- There is no (redundant) '(' between the '*' and the tyident.+--+-- clean_typedef_declarator :- '(' attrs? clean_typedef_declarator ')' declarator_postfix?+-- | '*' attrs? type_qualifier_list? parameter_typedef_declarator+--+clean_typedef_declarator :: { CDeclrR }+clean_typedef_declarator+ : clean_postfix_typedef_declarator+ { $1 }++ | '*' parameter_typedef_declarator+ {% withNodeInfo $1 $ ptrDeclr $2 [] }++ | '*' attrs parameter_typedef_declarator+ {% withAttribute $1 $2 $ ptrDeclr $3 [] }++ | '*' type_qualifier_list parameter_typedef_declarator+ {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }++ | '*' type_qualifier_list attrs parameter_typedef_declarator+ {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }++-- clean_postfix_typedef_declarator :- ( attrs? clean_typedef_declarator ) declarator_postfix?+--+clean_postfix_typedef_declarator :: { CDeclrR }+clean_postfix_typedef_declarator+ : '(' clean_typedef_declarator ')' { $2 }+ | '(' clean_typedef_declarator ')' postfixing_abstract_declarator { $4 $2 }+ | '(' attrs clean_typedef_declarator ')' { appendDeclrAttrs $2 $3 }+ | '(' attrs clean_typedef_declarator ')' postfixing_abstract_declarator { appendDeclrAttrs $2 ($5 $3) }+++-- The following have a redundant '(' placed+-- immediately to the left of the tyident+--+paren_typedef_declarator :: { CDeclrR }+paren_typedef_declarator+ : paren_postfix_typedef_declarator+ { $1 }++ -- redundant paren+ | '*' '(' simple_paren_typedef_declarator ')'+ {% withNodeInfo $1 $ ptrDeclr $3 [] }++ | '*' type_qualifier_list '(' simple_paren_typedef_declarator ')'+ {% withNodeInfo $1 $ ptrDeclr $4 (reverse $2) }+ | '*' type_qualifier_list attrs '(' simple_paren_typedef_declarator ')'+ {% withAttribute $1 $3 $ ptrDeclr $5 (reverse $2) }++ | '*' paren_typedef_declarator+ {% withNodeInfo $1 $ ptrDeclr $2 [] }++ | '*' type_qualifier_list paren_typedef_declarator+ {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }+ | '*' type_qualifier_list attrs paren_typedef_declarator+ {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }++-- redundant paren to left of tname+paren_postfix_typedef_declarator :: { CDeclrR }+paren_postfix_typedef_declarator+ : '(' paren_typedef_declarator ')'+ { $2 }++ -- redundant paren+ | '(' simple_paren_typedef_declarator postfixing_abstract_declarator ')'+ { $3 $2 }++ | '(' paren_typedef_declarator ')' postfixing_abstract_declarator+ { $4 $2 }+++-- Just a type name in any number of nested brackets+--+simple_paren_typedef_declarator :: { CDeclrR }+simple_paren_typedef_declarator+ : tyident+ {% withNodeInfo $1 $ mkVarDeclr $1 }++ | '(' simple_paren_typedef_declarator ')'+ { $2 }++--+-- Declarators+-- * Summary+-- declarator :- ( '*' (type_qualifier | attr)* )* ident ( array_decl | "(" parameter-list ")" )?+-- + additional parenthesis+--+identifier_declarator :: { CDeclrR }+identifier_declarator+ : unary_identifier_declarator { $1 }+ | paren_identifier_declarator { $1 }+++unary_identifier_declarator :: { CDeclrR }+unary_identifier_declarator+ : postfix_identifier_declarator+ { $1 }++ | '*' identifier_declarator+ {% withNodeInfo $1 $ ptrDeclr $2 [] }++ | '*' attrs identifier_declarator+ {% withAttribute $1 $2 $ ptrDeclr $3 [] }++ | '*' type_qualifier_list identifier_declarator+ {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }++ | '*' type_qualifier_list attrs identifier_declarator+ {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }++postfix_identifier_declarator :: { CDeclrR }+postfix_identifier_declarator+ : paren_identifier_declarator postfixing_abstract_declarator+ { $2 $1 }++ | '(' unary_identifier_declarator ')'+ { $2 }++ | '(' unary_identifier_declarator ')' postfixing_abstract_declarator+ { $4 $2 }++ | '(' attrs unary_identifier_declarator ')'+ { appendDeclrAttrs $2 $3 }++ | '(' attrs unary_identifier_declarator ')' postfixing_abstract_declarator+ { appendDeclrAttrs $2 ($5 $3) }+++-- just an identifier in any number of nested parenthesis+paren_identifier_declarator :: { CDeclrR }+paren_identifier_declarator+ : ident+ {% withNodeInfo $1 $ mkVarDeclr $1 }++ | '(' paren_identifier_declarator ')'+ { $2 }++ | '(' attrs paren_identifier_declarator ')'+ { appendDeclrAttrs $2 $3 }++function_declarator_old :: { CDeclr }+function_declarator_old+ : old_function_declarator+ { reverseDeclr $1 }++old_function_declarator :: { CDeclrR }+old_function_declarator+ : postfix_old_function_declarator+ { $1 }++ | '*' old_function_declarator+ {% withNodeInfo $1 $ ptrDeclr $2 [] } -- FIXME: no attr possible here ???++ | '*' type_qualifier_list old_function_declarator+ {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }++postfix_old_function_declarator :: { CDeclrR }+postfix_old_function_declarator+ : paren_identifier_declarator '(' identifier_list ')'+ {% withNodeInfo $1 $ funDeclr $1 (Left $ reverse $3) [] }++ | '(' old_function_declarator ')'+ { $2 }++ | '(' old_function_declarator ')' postfixing_abstract_declarator+ { $4 $2 }+++-- parse C parameter type list (C99 6.7.5)+--+parameter_type_list :: { ([CDecl], Bool) }+parameter_type_list+ : {- empty -} { ([], False)}+ | parameter_list { (reverse $1, False) }+ | parameter_list ',' "..." { (reverse $1, True) }++parameter_list :: { Reversed [CDecl] }+parameter_list+ : parameter_declaration { singleton $1 }+ | parameter_list ',' parameter_declaration { $1 `snoc` $3 }++parameter_declaration :: { CDecl }+parameter_declaration+ : declaration_specifier+ {% withNodeInfo $1 $ CDecl $1 [] }++ | declaration_specifier abstract_declarator+ {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }++ | declaration_specifier identifier_declarator attrs_opt+ {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }++ | declaration_specifier parameter_typedef_declarator attrs_opt+ {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }++ | declaration_qualifier_list+ {% withNodeInfo $1 $ CDecl (reverse $1) [] }++ | declaration_qualifier_list abstract_declarator+ {% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }++ | declaration_qualifier_list identifier_declarator attrs_opt+ {% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }++ | type_specifier+ {% withNodeInfo $1 $ CDecl $1 [] }++ | type_specifier abstract_declarator+ {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }++ | type_specifier identifier_declarator attrs_opt+ {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }++ | type_specifier parameter_typedef_declarator attrs_opt+ {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }++ | type_qualifier_list+ {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [] }+ | type_qualifier_list attr+ {% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] }++ | type_qualifier_list abstract_declarator+ {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }++ | type_qualifier_list identifier_declarator attrs_opt+ {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr$ appendDeclrAttrs $3 $2), Nothing, Nothing)] }+++identifier_list :: { Reversed [Ident] }+identifier_list+ : ident { singleton $1 }+ | identifier_list ',' ident { $1 `snoc` $3 }+++-- parse C type name (C99 6.7.6)+--+type_name :: { CDecl }+type_name+ : type_specifier+ {% withNodeInfo $1 $ CDecl $1 [] }++ | type_specifier abstract_declarator+ {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }++ | type_qualifier_list attr+ {% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] }++ | type_qualifier_list abstract_declarator+ {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }++-- parse C abstract declarator (C99 6.7.6)+--+-- postfix starts with '('+-- postfixing starts with '(' or '['+-- unary start with '*'+abstract_declarator :: { CDeclrR }+abstract_declarator+ : unary_abstract_declarator { $1 }+ | postfix_abstract_declarator { $1 }+ | postfixing_abstract_declarator { $1 emptyDeclr }++--+-- FIXME+-- | postfixing_abstract_declarator attrs_opt { $1 emptyDeclr }+++postfixing_abstract_declarator :: { CDeclrR -> CDeclrR }+postfixing_abstract_declarator+ : array_abstract_declarator+ { $1 }++ | '(' parameter_type_list ')'+ {% withNodeInfo $1 $ \at declr -> case $2 of+ (params, variadic) -> funDeclr declr (Right (params,variadic)) [] at }+++-- * TODO: Note that we recognise but ignore the C99 static keyword (see C99 6.7.5.3)+--+-- * TODO: We do not distinguish in the AST between incomplete array types and+-- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)+--+array_abstract_declarator :: { CDeclrR -> CDeclrR }+array_abstract_declarator+ : postfix_array_abstract_declarator+ { $1 }++ | array_abstract_declarator postfix_array_abstract_declarator+ { \decl -> $2 ($1 decl) }++--+-- TODO: record static+postfix_array_abstract_declarator :: { CDeclrR -> CDeclrR }+postfix_array_abstract_declarator+ : '[' assignment_expression_opt ']'+ {% withNodeInfo $1 $ \at declr -> arrDeclr declr [] False False $2 at }++ | '[' attrs assignment_expression_opt ']'+ {% withAttributePF $1 $2 $ \at declr -> arrDeclr declr [] False False $3 at }++ | '[' type_qualifier_list assignment_expression_opt ']'+ {% withNodeInfo $1 $ \at declr -> arrDeclr declr (reverse $2) False False $3 at }++ | '[' type_qualifier_list attrs assignment_expression_opt ']'+ {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr (reverse $2) False False $4 at }++ | '[' static attrs_opt assignment_expression ']'+ {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] False True (Just $4) at }++ | '[' static type_qualifier_list attrs_opt assignment_expression ']'+ {% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $3) False True (Just $5) at }++ | '[' type_qualifier_list attrs_opt static attrs_opt assignment_expression ']'+ {% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) False True (Just $6) at }++ | '[' '*' attrs_opt ']'+ {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] True False Nothing at }+ | '[' attrs '*' attrs_opt ']'+ {% withAttributePF $1 ($2 ++ $4) $ \at declr -> arrDeclr declr [] True False Nothing at }++ | '[' type_qualifier_list '*' attrs_opt ']'+ {% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at }+ | '[' type_qualifier_list attrs '*' attrs_opt ']'+ {% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at }++unary_abstract_declarator :: { CDeclrR }+unary_abstract_declarator+ : '*'+ {% withNodeInfo $1 $ ptrDeclr emptyDeclr [] }++ | '*' type_qualifier_list attrs_opt+ {% withAttribute $1 $3 $ ptrDeclr emptyDeclr (reverse $2) }++ | '*' abstract_declarator+ {% withNodeInfo $1 $ ptrDeclr $2 [] }++ | '*' type_qualifier_list abstract_declarator+ {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }++ | '*' attrs+ {% withAttribute $1 $2 $ ptrDeclr emptyDeclr [] }+ | '*' attrs abstract_declarator+ {% withAttribute $1 $2 $ ptrDeclr $3 [] }++-- postfix_ad starts with '(', postfixing with '(' or '[', unary_abstract starts with '*'+postfix_abstract_declarator :: { CDeclrR }+postfix_abstract_declarator+ : '(' unary_abstract_declarator ')' { $2 }+ | '(' postfix_abstract_declarator ')' { $2 }+ | '(' postfixing_abstract_declarator ')' { $2 emptyDeclr }+ | '(' unary_abstract_declarator ')' postfixing_abstract_declarator { $4 $2 }++-- FIX 0700+ | '(' attrs unary_abstract_declarator ')' { appendDeclrAttrs $2 $3 }+ | '(' attrs postfix_abstract_declarator ')' { appendDeclrAttrs $2 $3 }+ | '(' attrs postfixing_abstract_declarator ')' { appendDeclrAttrs $2 ($3 emptyDeclr) }+ | '(' attrs unary_abstract_declarator ')' postfixing_abstract_declarator { appendDeclrAttrs $2 ($5 $3) }+ | postfix_abstract_declarator attr { appendDeclrAttrs $2 $1 }+++-- parse C initializer (C99 6.7.8)+--+initializer :: { CInit }+initializer+ : assignment_expression {% withNodeInfo $1 $ CInitExpr $1 }+ | '{' initializer_list '}' {% withNodeInfo $1 $ CInitList (reverse $2) }+ | '{' initializer_list ',' '}' {% withNodeInfo $1 $ CInitList (reverse $2) }+++initializer_opt :: { Maybe CInit }+initializer_opt+ : {- empty -} { Nothing }+ | '=' initializer { Just $2 }+++initializer_list :: { Reversed CInitList }+initializer_list+ : {- empty -} { empty }+ | initializer { singleton ([],$1) }+ | designation initializer { singleton ($1,$2) }+ | initializer_list ',' initializer { $1 `snoc` ([],$3) }+ | initializer_list ',' designation initializer { $1 `snoc` ($3,$4) }+++-- designation+--+-- * GNU extensions:+-- old style member designation: 'ident :'+-- array range designation+--+designation :: { [CDesignator] }+designation+ : designator_list '=' { reverse $1 }+ | identifier ':' {% withNodeInfo $1 $ \at -> [CMemberDesig $1 at] }+ | array_designator { [$1] }+++designator_list :: { Reversed [CDesignator] }+designator_list+ : designator { singleton $1 }+ | designator_list designator { $1 `snoc` $2 }+++designator :: { CDesignator }+designator+ : '[' constant_expression ']' {% withNodeInfo $1 $ CArrDesig $2 }+ | '.' identifier {% withNodeInfo $1 $ CMemberDesig $2 }+ | array_designator { $1 }+++array_designator :: { CDesignator }+array_designator+ : '[' constant_expression "..." constant_expression ']'+ {% withNodeInfo $1 $ CRangeDesig $2 $4 }+++-- parse C primary expression (C11 6.5.1)+--+-- We cannot use a typedef name as a variable+--+-- * C11: generic selection+-- * GNU extensions:+-- allow a compound statement as an expression+-- __builtin_va_arg+-- __builtin_offsetof+-- __builtin_types_compatible_p+primary_expression :: { CExpr }+primary_expression+ : ident {% withNodeInfo $1 $ CVar $1 }+ | constant { CConst $1 }+ | string_literal { CConst (liftStrLit $1) }+ | '(' expression ')' { $2 }+ | "_Generic" '(' assignment_expression ',' generic_assoc_list ')'+ {% withNodeInfo $1 $ CGenericSelection $3 (reverse $5) }+ -- GNU extensions+ | '(' compound_statement ')'+ {% withNodeInfo $1 $ CStatExpr $2 }++ | "__builtin_va_arg" '(' assignment_expression ',' type_name ')'+ {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinVaArg $3 $5 }++ | "__builtin_offsetof" '(' type_name ',' offsetof_member_designator ')'+ {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinOffsetOf $3 (reverse $5) }++ | "__builtin_types_compatible_p" '(' type_name ',' type_name ')'+ {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinTypesCompatible $3 $5 }++ | "__builtin_convertvector" '(' assignment_expression ',' type_name ')'+ {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinConvertVector $3 $5 }++-- Generic Selection association list (C11 6.5.1.1)+--+-- TODO: introduce AST type for generic association+generic_assoc_list :: { Reversed [(Maybe CDecl, CExpr)] }+ : generic_assoc_list ',' generic_assoc { $1 `snoc` $3 }+ | generic_assoc { singleton $1 }+generic_assoc :: { (Maybe CDecl, CExpr) }+generic_assoc+ : type_name ':' assignment_expression { (Just $1, $3) }+ | default ':' assignment_expression { (Nothing, $3) }++offsetof_member_designator :: { Reversed [CDesignator] }+offsetof_member_designator+ : identifier {% withNodeInfo $1 $ singleton . CMemberDesig $1 }+ | offsetof_member_designator '.' identifier {% withNodeInfo $3 $ ($1 `snoc`) . CMemberDesig $3 }+ | offsetof_member_designator '[' expression ']' {% withNodeInfo $3 $ ($1 `snoc`) . CArrDesig $3 }+++-- parse C postfix expression (C99 6.5.2)+--+postfix_expression :: { CExpr }+postfix_expression+ : primary_expression+ { $1 }++ | postfix_expression '[' expression ']'+ {% withNodeInfo $1 $ CIndex $1 $3 }++ | postfix_expression '(' ')'+ {% withNodeInfo $1 $ CCall $1 [] }++ | postfix_expression '(' argument_expression_list ')'+ {% withNodeInfo $1 $ CCall $1 (reverse $3) }++ | postfix_expression '.' identifier+ {% withNodeInfo $1 $ CMember $1 $3 False }++ | postfix_expression "->" identifier+ {% withNodeInfo $1 $ CMember $1 $3 True }++ | postfix_expression "++"+ {% withNodeInfo $1 $ CUnary CPostIncOp $1 }++ | postfix_expression "--"+ {% withNodeInfo $1 $ CUnary CPostDecOp $1 }++ | '(' type_name ')' '{' initializer_list '}'+ {% withNodeInfo $1 $ CCompoundLit $2 (reverse $5) }++ | '(' type_name ')' '{' initializer_list ',' '}'+ {% withNodeInfo $1 $ CCompoundLit $2 (reverse $5) }+++argument_expression_list :: { Reversed [CExpr] }+argument_expression_list+ : assignment_expression { singleton $1 }+ | argument_expression_list ',' assignment_expression { $1 `snoc` $3 }+++-- parse C unary expression (C99 6.5.3)+--+-- * GNU extensions:+-- 'alignof' expression or type+-- '__real' and '__imag' expression+-- '__extension__' to suppress warnings about extensions+-- allow taking address of a label with: && label+--+unary_expression :: { CExpr }+unary_expression+ : postfix_expression { $1 }+ | "++" unary_expression {% withNodeInfo $1 $ CUnary CPreIncOp $2 }+ | "--" unary_expression {% withNodeInfo $1 $ CUnary CPreDecOp $2 }+ | "__extension__" cast_expression { $2 }+ | unary_operator cast_expression {% withNodeInfo $1 $ CUnary (unL $1) $2 }+ | sizeof unary_expression {% withNodeInfo $1 $ CSizeofExpr $2 }+ | sizeof '(' type_name ')' {% withNodeInfo $1 $ CSizeofType $3 }+ -- GNU: alignof, complex and && extension+ | alignof unary_expression {% withNodeInfo $1 $ CAlignofExpr $2 }+ | alignof '(' type_name ')' {% withNodeInfo $1 $ CAlignofType $3 }+ | "__real__" unary_expression {% withNodeInfo $1 $ CComplexReal $2 }+ | "__imag__" unary_expression {% withNodeInfo $1 $ CComplexImag $2 }+ | "&&" identifier {% withNodeInfo $1 $ CLabAddrExpr $2 }+++unary_operator :: { Located CUnaryOp }+unary_operator+ : '&' { L CAdrOp (posOf $1) }+ | '*' { L CIndOp (posOf $1) }+ | '+' { L CPlusOp (posOf $1) }+ | '-' { L CMinOp (posOf $1) }+ | '~' { L CCompOp (posOf $1) }+ | '!' { L CNegOp (posOf $1) }+++-- parse C cast expression (C99 6.5.4)+--+cast_expression :: { CExpr }+cast_expression+ : unary_expression { $1 }+ | '(' type_name ')' cast_expression {% withNodeInfo $1 $ CCast $2 $4 }+++-- parse C multiplicative expression (C99 6.5.5)+--+multiplicative_expression :: { CExpr }+multiplicative_expression+ : cast_expression+ { $1 }++ | multiplicative_expression '*' cast_expression+ {% withNodeInfo $1 $ CBinary CMulOp $1 $3 }++ | multiplicative_expression '/' cast_expression+ {% withNodeInfo $1 $ CBinary CDivOp $1 $3 }++ | multiplicative_expression '%' cast_expression+ {% withNodeInfo $1 $ CBinary CRmdOp $1 $3 }+++-- parse C additive expression (C99 6.5.6)+--+additive_expression :: { CExpr }+additive_expression+ : multiplicative_expression+ { $1 }++ | additive_expression '+' multiplicative_expression+ {% withNodeInfo $1 $ CBinary CAddOp $1 $3 }++ | additive_expression '-' multiplicative_expression+ {% withNodeInfo $1 $ CBinary CSubOp $1 $3 }+++-- parse C shift expression (C99 6.5.7)+--+shift_expression :: { CExpr }+shift_expression+ : additive_expression+ { $1 }++ | shift_expression "<<" additive_expression+ {% withNodeInfo $1 $ CBinary CShlOp $1 $3 }++ | shift_expression ">>" additive_expression+ {% withNodeInfo $1 $ CBinary CShrOp $1 $3 }+++-- parse C relational expression (C99 6.5.8)+--+relational_expression :: { CExpr }+relational_expression+ : shift_expression+ { $1 }++ | relational_expression '<' shift_expression+ {% withNodeInfo $1 $ CBinary CLeOp $1 $3 }++ | relational_expression '>' shift_expression+ {% withNodeInfo $1 $ CBinary CGrOp $1 $3 }++ | relational_expression "<=" shift_expression+ {% withNodeInfo $1 $ CBinary CLeqOp $1 $3 }++ | relational_expression ">=" shift_expression+ {% withNodeInfo $1 $ CBinary CGeqOp $1 $3 }+++-- parse C equality expression (C99 6.5.9)+--+equality_expression :: { CExpr }+equality_expression+ : relational_expression+ { $1 }++ | equality_expression "==" relational_expression+ {% withNodeInfo $1 $ CBinary CEqOp $1 $3 }++ | equality_expression "!=" relational_expression+ {% withNodeInfo $1 $ CBinary CNeqOp $1 $3 }+++-- parse C bitwise and expression (C99 6.5.10)+--+and_expression :: { CExpr }+and_expression+ : equality_expression+ { $1 }++ | and_expression '&' equality_expression+ {% withNodeInfo $1 $ CBinary CAndOp $1 $3 }+++-- parse C bitwise exclusive or expression (C99 6.5.11)+--+exclusive_or_expression :: { CExpr }+exclusive_or_expression+ : and_expression+ { $1 }++ | exclusive_or_expression '^' and_expression+ {% withNodeInfo $1 $ CBinary CXorOp $1 $3 }+++-- parse C bitwise or expression (C99 6.5.12)+--+inclusive_or_expression :: { CExpr }+inclusive_or_expression+ : exclusive_or_expression+ { $1 }++ | inclusive_or_expression '|' exclusive_or_expression+ {% withNodeInfo $1 $ CBinary COrOp $1 $3 }+++-- parse C logical and expression (C99 6.5.13)+--+logical_and_expression :: { CExpr }+logical_and_expression+ : inclusive_or_expression+ { $1 }++ | logical_and_expression "&&" inclusive_or_expression+ {% withNodeInfo $1 $ CBinary CLndOp $1 $3 }+++-- parse C logical or expression (C99 6.5.14)+--+logical_or_expression :: { CExpr }+logical_or_expression+ : logical_and_expression+ { $1 }++ | logical_or_expression "||" logical_and_expression+ {% withNodeInfo $1 $ CBinary CLorOp $1 $3 }+++-- parse C conditional expression (C99 6.5.15)+--+-- * GNU extensions:+-- omitting the `then' part+conditional_expression :: { CExpr }+conditional_expression+ : logical_or_expression+ { $1 }++ | logical_or_expression '?' expression ':' conditional_expression+ {% withNodeInfo $1 $ CCond $1 (Just $3) $5 }++ | logical_or_expression '?' ':' conditional_expression+ {% withNodeInfo $1 $ CCond $1 Nothing $4 }+++-- parse C assignment expression (C99 6.5.16)+--+-- * NOTE: LHS of assignment is more restricted than in gcc.+-- `x ? y : z = 3' parses in gcc as `(x ? y : z) = 3',+-- but `x ? y : z' is not an unary expression.+assignment_expression :: { CExpr }+assignment_expression+ : conditional_expression+ { $1 }++ | unary_expression assignment_operator assignment_expression+ {% withNodeInfo $1 $ CAssign (unL $2) $1 $3 }+++assignment_operator :: { Located CAssignOp }+assignment_operator+ : '=' { L CAssignOp (posOf $1) }+ | "*=" { L CMulAssOp (posOf $1) }+ | "/=" { L CDivAssOp (posOf $1) }+ | "%=" { L CRmdAssOp (posOf $1) }+ | "+=" { L CAddAssOp (posOf $1) }+ | "-=" { L CSubAssOp (posOf $1) }+ | "<<=" { L CShlAssOp (posOf $1) }+ | ">>=" { L CShrAssOp (posOf $1) }+ | "&=" { L CAndAssOp (posOf $1) }+ | "^=" { L CXorAssOp (posOf $1) }+ | "|=" { L COrAssOp (posOf $1) }+++-- parse C expression (C99 6.5.17)+--+expression :: { CExpr }+expression+ : assignment_expression+ { $1 }++ | assignment_expression ',' comma_expression+ {% let es = reverse $3 in withNodeInfo es $ CComma ($1:es) }++comma_expression :: { Reversed [CExpr] }+comma_expression+ : assignment_expression { singleton $1 }+ | comma_expression ',' assignment_expression { $1 `snoc` $3 }+++-- The following was used for clarity+expression_opt :: { Maybe CExpr }+expression_opt+ : {- empty -} { Nothing }+ | expression { Just $1 }+++-- The following was used for clarity+assignment_expression_opt :: { Maybe CExpr }+assignment_expression_opt+ : {- empty -} { Nothing }+ | assignment_expression { Just $1 }+++-- parse C constant expression (C99 6.6)+--+constant_expression :: { CExpr }+constant_expression+ : conditional_expression { $1 }+++-- parse C constants+--+constant :: { CConst }+constant+ : cint {% withNodeInfo $1 $ case $1 of CTokILit _ i -> CIntConst i }+ | cchar {% withNodeInfo $1 $ case $1 of CTokCLit _ c -> CCharConst c }+ | cfloat {% withNodeInfo $1 $ case $1 of CTokFLit _ f -> CFloatConst f }+++string_literal :: { CStrLit }+string_literal+ : cstr+ {% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit s }++ | cstr string_literal_list+ {% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse $2)) }+++string_literal_list :: { Reversed [CString] }+string_literal_list+ : cstr { case $1 of CTokSLit _ s -> singleton s }+ | string_literal_list cstr { case $2 of CTokSLit _ s -> $1 `snoc` s }++clang_version_literal :: { ClangCVersion }+ : clangcversion { $1 }++identifier :: { Ident }+identifier+ : ident { $1 }+ | tyident { $1 }+++-- parse GNU C attribute annotation+attrs_opt :: { [CAttr] }+attrs_opt+ : {- empty -} { [] }+ | attrs { $1 }++-- GNU C attribute annotation+attrs :: { [CAttr] }+attrs+ : attr { $1 }+ | attrs attr { $1 ++ $2 }++attr :: { [CAttr] }+attr+ : "__attribute__" '(' '(' attribute_list ')' ')' { reverse $4 }++attribute_list :: { Reversed [CAttr] }+ : attribute { case $1 of Nothing -> empty; Just attr -> singleton attr }+ | attribute_list ',' attribute { (maybe id (flip snoc) $3) $1 }+++attribute :: { Maybe CAttr }+attribute+ : {- empty -} { Nothing }+ | ident {% withNodeInfo $1 $ Just . CAttr $1 [] }+ | const {% withNodeInfo $1 $ Just . CAttr (internalIdent "const") [] }+ | ident '(' attribute_params ')' {% withNodeInfo $1 $ Just . CAttr $1 (reverse $3) }+ | ident '(' ')' {% withNodeInfo $1 $ Just . CAttr $1 [] }++-- OS X 10.9 (Mavericks) makes use of more liberal attribute syntax+-- that includes assignment-like expressions referencing version+-- numbers.++attribute_params :: { Reversed [CExpr] }+attribute_params+ : constant_expression { singleton $1 }+ | unary_expression assignment_operator clang_version_literal { Reversed [] }+ | unary_expression assignment_operator unary_expression { Reversed [] }+ | attribute_params ',' constant_expression { $1 `snoc` $3 }+ | attribute_params ',' unary_expression assignment_operator unary_expression { $1 }+ | attribute_params ',' unary_expression assignment_operator clang_version_literal { $1 }++{++-- sometimes it is neccessary to reverse an unreversed list+reverseList :: [a] -> Reversed [a]+reverseList = Reversed . List.reverse++-- We occasionally need things to have a location when they don't naturally+-- have one built in as tokens and most AST elements do.+--+data Located a = L !a !Position++unL :: Located a -> a+unL (L a pos) = a++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 mkAttrNode = do+ name <- getNewName+ 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+withAttribute node cattrs mkDeclrNode = do+ name <- getNewName+ let attrs = mkNodeInfo (posOf node) name+ let newDeclr = appendDeclrAttrs cattrs $ mkDeclrNode attrs+ attrs `seq` newDeclr `seq` return newDeclr++-- postfixing variant+{-# INLINE withAttributePF #-}+withAttributePF :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR -> CDeclrR) -> P (CDeclrR -> CDeclrR)+withAttributePF node cattrs mkDeclrCtor = do+ name <- getNewName+ let attrs = mkNodeInfo (posOf node) name+ let newDeclr = appendDeclrAttrs cattrs . mkDeclrCtor attrs+ attrs `seq` newDeclr `seq` return newDeclr++-- add top level attributes for a declarator.+--+-- In the following example+--+-- > int declr1, __attribute__((a1)) * __attribute__((a2)) y() __asm__("$" "y") __attribute__((a3));+--+-- the attributes `a1' and `a3' are top-level attributes for y.+-- The (pseudo)-AST for the second declarator is+--+-- > CDeclr "y"+-- > [CFunDeclr ..., CPtrDeclr __attribute__((a2)) ... ]+-- > (asm "$y")+-- > [__attribute__((a1)), __attribute__((a3)) ]+--+-- So assembler names and preceeding and trailing attributes are recorded in object declarator.+--+appendObjAttrs :: [CAttr] -> CDeclr -> CDeclr+appendObjAttrs newAttrs (CDeclr ident indirections asmname cAttrs at)+ = CDeclr ident indirections asmname (cAttrs ++ newAttrs) at+appendObjAttrsR :: [CAttr] -> CDeclrR -> CDeclrR+appendObjAttrsR newAttrs (CDeclrR ident indirections asmname cAttrs at)+ = CDeclrR ident indirections asmname (cAttrs ++ newAttrs) at++setAsmName :: Maybe CStrLit -> CDeclrR -> P CDeclrR+setAsmName mAsmName (CDeclrR ident indirections oldName cattrs at) =+ case combineName mAsmName oldName of+ Left (n1,n2) -> failP (posOf n2) ["Duplicate assembler name: ",showName n1,showName n2]+ Right newName -> return $ CDeclrR ident indirections newName cattrs at+ where+ combineName Nothing Nothing = Right Nothing+ combineName Nothing oldname@(Just _) = Right oldname+ combineName newname@(Just _) Nothing = Right newname+ combineName (Just n1) (Just n2) = Left (n1,n2)+ showName (CStrLit cstr _) = show cstr++withAsmNameAttrs :: (Maybe CStrLit, [CAttr]) -> CDeclrR -> P CDeclrR+withAsmNameAttrs (mAsmName, newAttrs) declr = setAsmName mAsmName (appendObjAttrsR newAttrs declr)++appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR+appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at)+ = CDeclrR ident empty asmname (cattrs ++ newAttrs) at+appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at)+ = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where+ appendAttrs (CPtrDeclr typeQuals at) = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at+ appendAttrs (CArrDeclr typeQuals arraySize at) = CArrDeclr (typeQuals ++ map CAttrQual newAttrs) arraySize at+ appendAttrs (CFunDeclr parameters cattrs at) = CFunDeclr parameters (cattrs ++ newAttrs) at++ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR+ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at+ = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat+funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR+funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at+ = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat+arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR+arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at+ = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat )+ where+ arr_sz = case size_expr_opt of+ Just e -> CArrSize static_size e+ Nothing -> CNoArrSize var_sized++liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]+liftTypeQuals = map CTypeQual . reverse++-- lift CAttrs to DeclSpecs+--+liftCAttrs :: [CAttr] -> [CDeclSpec]+liftCAttrs = map (CTypeQual . CAttrQual)++-- when we parsed (decl_spec_1,...,decl_spec_n,attrs), add the __attributes__s to the declspec list+-- needs special care when @decl_spec_n@ is a SUE definition+addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec]+addTrailingAttrs declspecs new_attrs =+ case viewr declspecs of+ (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node))+ -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node))+ (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node))+ -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))+ _ -> declspecs `rappend` (liftCAttrs new_attrs)++-- convenient instance, the position of a list of things is the position of+-- the first thing in the list+--+instance Pos a => Pos [a] where+ posOf (x:_) = posOf x++instance Pos a => Pos (Reversed a) where+ posOf (Reversed x) = posOf x++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+-- if the decl is defining a typedef then we add it to the set,+-- if it's a var decl then that shadows typedefed identifiers+--+doDeclIdent :: [CDeclSpec] -> CDeclrR -> P ()+doDeclIdent declspecs (CDeclrR mIdent _ _ _ _) =+ case mIdent of+ Nothing -> return ()+ Just ident | any iypedef declspecs -> addTypedef ident+ | otherwise -> shadowTypedef ident++ where iypedef (CStorageSpec (CTypedef _)) = True+ iypedef _ = False++doFuncParamDeclIdent :: CDeclr -> P ()+doFuncParamDeclIdent (CDeclr _ (CFunDeclr params _ _ : _) _ _ _) =+ sequence_+ [ case getCDeclrIdent declr of+ Nothing -> return ()+ Just ident -> shadowTypedef ident+ | CDecl _ dle _ <- either (const []) fst params+ , (Just declr, _, _) <- dle ]+doFuncParamDeclIdent _ = return ()++-- extract all identifiers+getCDeclrIdent :: CDeclr -> Maybe Ident+getCDeclrIdent (CDeclr mIdent _ _ _ _) = mIdent++happyError :: P a+happyError = parseError++-- * public interface++-- | @parseC input initialPos@ parses the given preprocessed C-source input and returns the AST or a list of parse errors.+parseC :: InputStream -> Position -> Either ParseError CTranslUnit+parseC input initialPosition =+ fmap fst $ execParser translUnitP input initialPosition builtinTypeNames (namesStartingFrom 0)++-- | @translUnitP@ provides a parser for a complete C translation unit, i.e. a list of external declarations.+translUnitP :: P CTranslUnit+translUnitP = translation_unit+-- | @extDeclP@ provides a parser for an external (file-scope) declaration+extDeclP :: P CExtDecl+extDeclP = external_declaration+-- | @statementP@ provides a parser for C statements+statementP :: P CStat+statementP = statement+-- | @expressionP@ provides a parser for C expressions+expressionP :: P CExpr+expressionP = expression+}
src/Language/C/Parser/ParserMonad.hs view
@@ -1,181 +1,181 @@------------------------------------------------------------------------------ --- | --- Module : Language.C.Syntax.ParserMonad --- Copyright : (c) [1999..2004] Manuel M T Chakravarty --- (c) 2005-2007 Duncan Coutts --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Portability : portable --- --- Monad for the C lexer and parser --- --- This monad has to be usable with Alex and Happy. Some things in it are --- dictated by that, eg having to be able to remember the last token. --- --- The monad also provides a unique name supply (via the Name module) --- --- For parsing C we have to maintain a set of identifiers that we know to be --- typedef'ed type identifiers. We also must deal correctly with scope so we --- keep a list of sets of identifiers so we can save the outer scope when we --- enter an inner scope. -module Language.C.Parser.ParserMonad ( - P, - execParser, - failP, - getNewName, -- :: P Name - addTypedef, -- :: Ident -> P () - shadowTypedef, -- :: Ident -> P () - isTypeIdent, -- :: Ident -> P Bool - enterScope, -- :: P () - leaveScope, -- :: P () - setPos, -- :: Position -> P () - getPos, -- :: P Position - 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(..)) -import Language.C.Data.Position (Position(..)) -import Language.C.Data.InputStream -import Language.C.Data.Name (Name) -import Language.C.Data.Ident (Ident) -import Language.C.Parser.Tokens (CToken(CTokEof)) - -import Control.Applicative (Applicative(..)) -import Control.Monad (liftM, ap) -import Data.Set (Set) -import qualified Data.Set as Set (fromList, insert, member, delete) - -newtype ParseError = ParseError ([String],Position) -instance Show ParseError where - show (ParseError (msgs,pos)) = showErrorInfo "Syntax Error !" (ErrorInfo LevelError pos msgs) - - -data ParseResult a - = POk !PState a - | PFailed [String] Position -- The error message and position - -data PState = PState { - 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 - } - -newtype P a = P { unP :: PState -> ParseResult a } - -instance Functor P where - fmap = liftM - -instance Applicative P where - pure = return - (<*>) = ap - -instance Monad P where - return = returnP - (>>=) = thenP - fail m = getPos >>= \pos -> failP pos [m] - - --- | execute the given parser on the supplied input stream. --- returns 'ParseError' if the parser failed, and a pair of --- result and remaining name supply otherwise --- --- Synopsis: @execParser parser inputStream initialPos predefinedTypedefs uniqNameSupply@ -execParser :: P a -> InputStream -> Position -> [Ident] -> [Name] - -> Either ParseError (a,[Name]) -execParser (P parser) input pos builtins names = - case parser initialState of - PFailed message errpos -> Left (ParseError (message,errpos)) - POk st result -> Right (result, namesupply st) - where initialState = PState { - 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 = [] - } - -{-# INLINE returnP #-} -returnP :: a -> P a -returnP a = P $ \s -> POk s a - -{-# INLINE thenP #-} -thenP :: P a -> (a -> P b) -> P b -(P m) `thenP` k = P $ \s -> - case m s of - POk s' a -> (unP (k a)) s' - PFailed err pos -> PFailed err pos - -failP :: Position -> [String] -> P a -failP pos msg = P $ \_ -> PFailed msg pos - -getNewName :: P Name -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} () - -getPos :: P Position -getPos = P $ \s@PState{curPos=pos} -> POk s pos - -addTypedef :: Ident -> P () -addTypedef ident = (P $ \s@PState{tyidents=tyids} -> - POk s{tyidents = ident `Set.insert` tyids} ()) - -shadowTypedef :: Ident -> P () -shadowTypedef ident = (P $ \s@PState{tyidents=tyids} -> - -- optimisation: mostly the ident will not be in - -- the tyident set so do a member lookup to avoid - -- churn induced by calling delete - POk s{tyidents = if ident `Set.member` tyids - then ident `Set.delete` tyids - else tyids } ()) - -isTypeIdent :: Ident -> P Bool -isTypeIdent ident = P $ \s@PState{tyidents=tyids} -> - POk s $! Set.member ident tyids - -enterScope :: P () -enterScope = P $ \s@PState{tyidents=tyids,scopes=ss} -> - POk s{scopes=tyids:ss} () - -leaveScope :: P () -leaveScope = P $ \s@PState{scopes=ss} -> - case ss of - [] -> error "leaveScope: already in global scope" - (tyids:ss') -> POk s{tyidents=tyids, scopes=ss'} () - -getInput :: P InputStream -getInput = P $ \s@PState{curInput=i} -> POk s i - -setInput :: InputStream -> P () -setInput i = P $ \s -> POk s{curInput=i} () - -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 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 +-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Syntax.ParserMonad+-- Copyright : (c) [1999..2004] Manuel M T Chakravarty+-- (c) 2005-2007 Duncan Coutts+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Portability : portable+--+-- Monad for the C lexer and parser+--+-- This monad has to be usable with Alex and Happy. Some things in it are+-- dictated by that, eg having to be able to remember the last token.+--+-- The monad also provides a unique name supply (via the Name module)+--+-- For parsing C we have to maintain a set of identifiers that we know to be+-- typedef'ed type identifiers. We also must deal correctly with scope so we+-- keep a list of sets of identifiers so we can save the outer scope when we+-- enter an inner scope.+module Language.C.Parser.ParserMonad (+ P,+ execParser,+ failP,+ getNewName, -- :: P Name+ addTypedef, -- :: Ident -> P ()+ shadowTypedef, -- :: Ident -> P ()+ isTypeIdent, -- :: Ident -> P Bool+ enterScope, -- :: P ()+ leaveScope, -- :: P ()+ setPos, -- :: Position -> P ()+ getPos, -- :: P Position+ 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(..))+import Language.C.Data.Position (Position(..))+import Language.C.Data.InputStream+import Language.C.Data.Name (Name)+import Language.C.Data.Ident (Ident)+import Language.C.Parser.Tokens (CToken(CTokEof))++import Control.Applicative (Applicative(..))+import Control.Monad (liftM, ap)+import Data.Set (Set)+import qualified Data.Set as Set (fromList, insert, member, delete)++newtype ParseError = ParseError ([String],Position)+instance Show ParseError where+ show (ParseError (msgs,pos)) = showErrorInfo "Syntax Error !" (ErrorInfo LevelError pos msgs)+++data ParseResult a+ = POk !PState a+ | PFailed [String] Position -- The error message and position++data PState = PState {+ 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+ }++newtype P a = P { unP :: PState -> ParseResult a }++instance Functor P where+ fmap = liftM++instance Applicative P where+ pure = return+ (<*>) = ap++instance Monad P where+ return = returnP+ (>>=) = thenP+ fail m = getPos >>= \pos -> failP pos [m]+++-- | execute the given parser on the supplied input stream.+-- returns 'ParseError' if the parser failed, and a pair of+-- result and remaining name supply otherwise+--+-- Synopsis: @execParser parser inputStream initialPos predefinedTypedefs uniqNameSupply@+execParser :: P a -> InputStream -> Position -> [Ident] -> [Name]+ -> Either ParseError (a,[Name])+execParser (P parser) input pos builtins names =+ case parser initialState of+ PFailed message errpos -> Left (ParseError (message,errpos))+ POk st result -> Right (result, namesupply st)+ where initialState = PState {+ 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 = []+ }++{-# INLINE returnP #-}+returnP :: a -> P a+returnP a = P $ \s -> POk s a++{-# INLINE thenP #-}+thenP :: P a -> (a -> P b) -> P b+(P m) `thenP` k = P $ \s ->+ case m s of+ POk s' a -> (unP (k a)) s'+ PFailed err pos -> PFailed err pos++failP :: Position -> [String] -> P a+failP pos msg = P $ \_ -> PFailed msg pos++getNewName :: P Name+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} ()++getPos :: P Position+getPos = P $ \s@PState{curPos=pos} -> POk s pos++addTypedef :: Ident -> P ()+addTypedef ident = (P $ \s@PState{tyidents=tyids} ->+ POk s{tyidents = ident `Set.insert` tyids} ())++shadowTypedef :: Ident -> P ()+shadowTypedef ident = (P $ \s@PState{tyidents=tyids} ->+ -- optimisation: mostly the ident will not be in+ -- the tyident set so do a member lookup to avoid+ -- churn induced by calling delete+ POk s{tyidents = if ident `Set.member` tyids+ then ident `Set.delete` tyids+ else tyids } ())++isTypeIdent :: Ident -> P Bool+isTypeIdent ident = P $ \s@PState{tyidents=tyids} ->+ POk s $! Set.member ident tyids++enterScope :: P ()+enterScope = P $ \s@PState{tyidents=tyids,scopes=ss} ->+ POk s{scopes=tyids:ss} ()++leaveScope :: P ()+leaveScope = P $ \s@PState{scopes=ss} ->+ case ss of+ [] -> error "leaveScope: already in global scope"+ (tyids:ss') -> POk s{tyidents=tyids, scopes=ss'} ()++getInput :: P InputStream+getInput = P $ \s@PState{curInput=i} -> POk s i++setInput :: InputStream -> P ()+setInput i = P $ \s -> POk s{curInput=i} ()++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 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
@@ -1,382 +1,383 @@-{-# OPTIONS #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Parser.Tokens --- Copyright : [1999..2004] Manuel M T Chakravarty --- 2005 Duncan Coutts --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Portability : portable --- --- C Tokens for the C lexer. --- ------------------------------------------------------------------------------ -module Language.C.Parser.Tokens (CToken(..), posLenOfTok, GnuCTok(..), ClangCTok(..)) where - -import Language.C.Data.Position (Position, Pos(..), PosLength) -import Language.C.Data.Ident (Ident, identToString) -import Language.C.Syntax.Constants (CChar, CInteger, CFloat, CString, ClangCVersion) - --- token definition --- ---------------- - --- possible tokens (EXPORTED) --- -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__') - | CTokAlignas !PosLength -- `_Alignas' - | CTokAsm !PosLength -- `asm' - -- (or `__asm', - -- `__asm__') - | CTokAtomic !PosLength -- `_Atomic' - | CTokAuto !PosLength -- `auto' - | CTokBreak !PosLength -- `break' - | CTokBool !PosLength -- `_Bool' - | CTokCase !PosLength -- `case' - | CTokChar !PosLength -- `char' - | CTokConst !PosLength -- `const' - -- (or `__const', `__const__') - | 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' - | CTokFloat128 !PosLength -- `__float128' or `_Float128` - | CTokFor !PosLength -- `for' - | CTokGeneric !PosLength -- `_Generic' - | CTokGoto !PosLength -- `goto' - | CTokIf !PosLength -- `if' - | CTokInline !PosLength -- `inline' - -- (or `__inline', - -- `__inline__') - | CTokInt !PosLength -- `int' - | CTokInt128 !PosLength -- `__int128` - | CTokLong !PosLength -- `long' - | CTokLabel !PosLength -- `__label__ - | CTokNoreturn !PosLength -- `_Noreturn' - | CTokNullable !PosLength -- `_Nullable' - | CTokNonnull !PosLength -- `_Nonnull' - | CTokRegister !PosLength -- `register' - | CTokRestrict !PosLength -- `restrict' - -- (or `__restrict', - -- `__restrict__') - | CTokReturn !PosLength -- `return' - | CTokShort !PosLength -- `short' - | CTokSigned !PosLength -- `signed' - -- (or `__signed', - -- `__signed__') - | CTokSizeof !PosLength -- `sizeof' - | CTokStatic !PosLength -- `static' - | CTokStaticAssert !PosLength -- `_Static_assert' - | 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 !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 !PosLength !Ident -- `typedef-name' identifier - | CTokGnuC !GnuCTok !PosLength -- special GNU C tokens - | CTokClangC !PosLength !ClangCTok -- special Clang C tokens - | CTokEof -- end of file - --- special tokens used in GNU C extensions to ANSI C --- -data GnuCTok = GnuCAttrTok -- `__attribute__' - | GnuCExtTok -- `__extension__' - | GnuCVaArg -- `__builtin_va_arg' - | GnuCOffsetof -- `__builtin_offsetof' - | GnuCTyCompat -- `__builtin_types_compatible_p' - | GnuCComplexReal -- `__real__' - | GnuCComplexImag -- `__imag__' - -data ClangCTok = ClangCVersionTok !ClangCVersion -- version constant from 'availability' attribute - | ClangBuiltinConvertVector - -instance Pos CToken where - 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 (CTokAlignas pos ) = pos -posLenOfTok (CTokAsm pos ) = pos -posLenOfTok (CTokAtomic 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 (CTokFloat128 pos ) = pos -posLenOfTok (CTokFor pos ) = pos -posLenOfTok (CTokGeneric pos ) = pos -posLenOfTok (CTokGoto pos ) = pos -posLenOfTok (CTokInt pos ) = pos -posLenOfTok (CTokInt128 pos ) = pos -posLenOfTok (CTokInline pos ) = pos -posLenOfTok (CTokIf pos ) = pos -posLenOfTok (CTokLong pos ) = pos -posLenOfTok (CTokLabel pos ) = pos -posLenOfTok (CTokNoreturn pos ) = pos -posLenOfTok (CTokNullable pos ) = pos -posLenOfTok (CTokNonnull 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 (CTokStaticAssert 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 (CTokClangC pos _) = pos -posLenOfTok CTokEof = error "tokenPos: Eof" - -instance Show CToken where - showsPrec _ (CTokLParen _ ) = showString "(" - showsPrec _ (CTokRParen _ ) = showString ")" - showsPrec _ (CTokLBracket _ ) = showString "[" - showsPrec _ (CTokRBracket _ ) = showString "]" - showsPrec _ (CTokArrow _ ) = showString "->" - showsPrec _ (CTokDot _ ) = showString "." - showsPrec _ (CTokExclam _ ) = showString "!" - showsPrec _ (CTokTilde _ ) = showString "~" - showsPrec _ (CTokInc _ ) = showString "++" - showsPrec _ (CTokDec _ ) = showString "--" - showsPrec _ (CTokPlus _ ) = showString "+" - showsPrec _ (CTokMinus _ ) = showString "-" - showsPrec _ (CTokStar _ ) = showString "*" - showsPrec _ (CTokSlash _ ) = showString "/" - showsPrec _ (CTokPercent _ ) = showString "%" - showsPrec _ (CTokAmper _ ) = showString "&" - showsPrec _ (CTokShiftL _ ) = showString "<<" - showsPrec _ (CTokShiftR _ ) = showString ">>" - showsPrec _ (CTokLess _ ) = showString "<" - showsPrec _ (CTokLessEq _ ) = showString "<=" - showsPrec _ (CTokHigh _ ) = showString ">" - showsPrec _ (CTokHighEq _ ) = showString ">=" - showsPrec _ (CTokEqual _ ) = showString "==" - showsPrec _ (CTokUnequal _ ) = showString "!=" - showsPrec _ (CTokHat _ ) = showString "^" - showsPrec _ (CTokBar _ ) = showString "|" - showsPrec _ (CTokAnd _ ) = showString "&&" - showsPrec _ (CTokOr _ ) = showString "||" - showsPrec _ (CTokQuest _ ) = showString "?" - showsPrec _ (CTokColon _ ) = showString ":" - showsPrec _ (CTokAssign _ ) = showString "=" - showsPrec _ (CTokPlusAss _ ) = showString "+=" - showsPrec _ (CTokMinusAss _ ) = showString "-=" - showsPrec _ (CTokStarAss _ ) = showString "*=" - showsPrec _ (CTokSlashAss _ ) = showString "/=" - showsPrec _ (CTokPercAss _ ) = showString "%=" - showsPrec _ (CTokAmpAss _ ) = showString "&=" - showsPrec _ (CTokHatAss _ ) = showString "^=" - showsPrec _ (CTokBarAss _ ) = showString "|=" - showsPrec _ (CTokSLAss _ ) = showString "<<=" - showsPrec _ (CTokSRAss _ ) = showString ">>=" - showsPrec _ (CTokComma _ ) = showString "," - showsPrec _ (CTokSemic _ ) = showString ";" - showsPrec _ (CTokLBrace _ ) = showString "{" - showsPrec _ (CTokRBrace _ ) = showString "}" - showsPrec _ (CTokEllipsis _ ) = showString "..." - showsPrec _ (CTokAlignof _ ) = showString "alignof" - showsPrec _ (CTokAlignas _ ) = showString "_Alignas" - showsPrec _ (CTokAsm _ ) = showString "asm" - showsPrec _ (CTokAtomic _ ) = showString "_Atomic" - showsPrec _ (CTokAuto _ ) = showString "auto" - showsPrec _ (CTokBool _) = showString "_Bool" - showsPrec _ (CTokBreak _ ) = showString "break" - showsPrec _ (CTokCase _ ) = showString "case" - showsPrec _ (CTokChar _ ) = showString "char" - showsPrec _ (CTokComplex _) = showString "_Complex" - showsPrec _ (CTokConst _ ) = showString "const" - showsPrec _ (CTokContinue _ ) = showString "continue" - showsPrec _ (CTokDefault _ ) = showString "default" - showsPrec _ (CTokDouble _ ) = showString "double" - showsPrec _ (CTokDo _ ) = showString "do" - showsPrec _ (CTokElse _ ) = showString "else" - showsPrec _ (CTokEnum _ ) = showString "enum" - showsPrec _ (CTokExtern _ ) = showString "extern" - showsPrec _ (CTokFloat _ ) = showString "float" - showsPrec _ (CTokFloat128 _ ) = showString "__float128" - showsPrec _ (CTokFor _ ) = showString "for" - showsPrec _ (CTokGeneric _ ) = showString "_Generic" - showsPrec _ (CTokGoto _ ) = showString "goto" - showsPrec _ (CTokIf _ ) = showString "if" - showsPrec _ (CTokInline _ ) = showString "inline" - showsPrec _ (CTokInt _ ) = showString "int" - showsPrec _ (CTokInt128 _ ) = showString "__int128" - showsPrec _ (CTokLong _ ) = showString "long" - showsPrec _ (CTokLabel _ ) = showString "__label__" - showsPrec _ (CTokNoreturn _ ) = showString "_Noreturn" - showsPrec _ (CTokNullable _ ) = showString "_Nullable" - showsPrec _ (CTokNonnull _ ) = showString "_Nonnull" - showsPrec _ (CTokRegister _ ) = showString "register" - showsPrec _ (CTokRestrict _ ) = showString "restrict" - showsPrec _ (CTokReturn _ ) = showString "return" - showsPrec _ (CTokShort _ ) = showString "short" - showsPrec _ (CTokSigned _ ) = showString "signed" - showsPrec _ (CTokSizeof _ ) = showString "sizeof" - showsPrec _ (CTokStatic _ ) = showString "static" - showsPrec _ (CTokStaticAssert _ ) = showString "_Static_assert" - showsPrec _ (CTokStruct _ ) = showString "struct" - showsPrec _ (CTokSwitch _ ) = showString "switch" - showsPrec _ (CTokTypedef _ ) = showString "typedef" - showsPrec _ (CTokTypeof _ ) = showString "typeof" - showsPrec _ (CTokThread _ ) = showString "_Thread_local" - showsPrec _ (CTokUnion _ ) = showString "union" - showsPrec _ (CTokUnsigned _ ) = showString "unsigned" - showsPrec _ (CTokVoid _ ) = showString "void" - showsPrec _ (CTokVolatile _ ) = showString "volatile" - showsPrec _ (CTokWhile _ ) = showString "while" - showsPrec _ (CTokCLit _ c) = shows c - showsPrec _ (CTokILit _ i) = shows i - showsPrec _ (CTokFLit _ f) = shows f - showsPrec _ (CTokSLit _ s) = shows s - showsPrec _ (CTokIdent _ i) = (showString . identToString) i - showsPrec _ (CTokTyIdent _ i) = (showString . identToString) i - showsPrec _ (CTokGnuC GnuCAttrTok _) = showString "__attribute__" - showsPrec _ (CTokGnuC GnuCExtTok _) = showString "__extension__" - showsPrec _ (CTokGnuC GnuCComplexReal _) = showString "__real__" - showsPrec _ (CTokGnuC GnuCComplexImag _) = showString "__imag__" - showsPrec _ (CTokGnuC GnuCVaArg _) = showString "__builtin_va_arg" - showsPrec _ (CTokGnuC GnuCOffsetof _) = showString "__builtin_offsetof" - showsPrec _ (CTokGnuC GnuCTyCompat _) = showString "__builtin_types_compatible_p" - showsPrec _ (CTokClangC _ (ClangCVersionTok v)) = shows v - showsPrec _ (CTokClangC _ ClangBuiltinConvertVector) = showString "__builtin_convertvector" - showsPrec _ CTokEof = error "show CToken : CTokEof" +{-# OPTIONS #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Parser.Tokens+-- Copyright : [1999..2004] Manuel M T Chakravarty+-- 2005 Duncan Coutts+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Portability : portable+--+-- C Tokens for the C lexer.+--+-----------------------------------------------------------------------------+module Language.C.Parser.Tokens (CToken(..), posLenOfTok, GnuCTok(..), ClangCTok(..)) where++import Language.C.Data.Position (Position, Pos(..), PosLength)+import Language.C.Data.Ident (Ident, identToString)+import Language.C.Syntax.Constants (CChar, CInteger, CFloat, CString, ClangCVersion)++-- token definition+-- ----------------++-- possible tokens (EXPORTED)+--+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__')+ | CTokAlignas !PosLength -- `_Alignas'+ | CTokAsm !PosLength -- `asm'+ -- (or `__asm',+ -- `__asm__')+ | CTokAtomic !PosLength -- `_Atomic'+ | CTokAuto !PosLength -- `auto'+ | CTokBreak !PosLength -- `break'+ | CTokBool !PosLength -- `_Bool'+ | CTokCase !PosLength -- `case'+ | CTokChar !PosLength -- `char'+ | CTokConst !PosLength -- `const'+ -- (or `__const', `__const__')+ | 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'+ | CTokFloatN !Int !Bool !PosLength -- `__float128' or `_Float{32,64,128}{,x}`+ | CTokFor !PosLength -- `for'+ | CTokGeneric !PosLength -- `_Generic'+ | CTokGoto !PosLength -- `goto'+ | CTokIf !PosLength -- `if'+ | CTokInline !PosLength -- `inline'+ -- (or `__inline',+ -- `__inline__')+ | CTokInt !PosLength -- `int'+ | CTokInt128 !PosLength -- `__int128`+ | CTokLong !PosLength -- `long'+ | CTokLabel !PosLength -- `__label__+ | CTokNoreturn !PosLength -- `_Noreturn'+ | CTokNullable !PosLength -- `_Nullable'+ | CTokNonnull !PosLength -- `_Nonnull'+ | CTokRegister !PosLength -- `register'+ | CTokRestrict !PosLength -- `restrict'+ -- (or `__restrict',+ -- `__restrict__')+ | CTokReturn !PosLength -- `return'+ | CTokShort !PosLength -- `short'+ | CTokSigned !PosLength -- `signed'+ -- (or `__signed',+ -- `__signed__')+ | CTokSizeof !PosLength -- `sizeof'+ | CTokStatic !PosLength -- `static'+ | CTokStaticAssert !PosLength -- `_Static_assert'+ | 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 !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 !PosLength !Ident -- `typedef-name' identifier+ | CTokGnuC !GnuCTok !PosLength -- special GNU C tokens+ | CTokClangC !PosLength !ClangCTok -- special Clang C tokens+ | CTokEof -- end of file++-- special tokens used in GNU C extensions to ANSI C+--+data GnuCTok = GnuCAttrTok -- `__attribute__'+ | GnuCExtTok -- `__extension__'+ | GnuCVaArg -- `__builtin_va_arg'+ | GnuCOffsetof -- `__builtin_offsetof'+ | GnuCTyCompat -- `__builtin_types_compatible_p'+ | GnuCComplexReal -- `__real__'+ | GnuCComplexImag -- `__imag__'++data ClangCTok = ClangCVersionTok !ClangCVersion -- version constant from 'availability' attribute+ | ClangBuiltinConvertVector++instance Pos CToken where+ 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 (CTokAlignas pos ) = pos+posLenOfTok (CTokAsm pos ) = pos+posLenOfTok (CTokAtomic 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 (CTokFloatN _ _ pos) = pos+posLenOfTok (CTokFor pos ) = pos+posLenOfTok (CTokGeneric pos ) = pos+posLenOfTok (CTokGoto pos ) = pos+posLenOfTok (CTokInt pos ) = pos+posLenOfTok (CTokInt128 pos ) = pos+posLenOfTok (CTokInline pos ) = pos+posLenOfTok (CTokIf pos ) = pos+posLenOfTok (CTokLong pos ) = pos+posLenOfTok (CTokLabel pos ) = pos+posLenOfTok (CTokNoreturn pos ) = pos+posLenOfTok (CTokNullable pos ) = pos+posLenOfTok (CTokNonnull 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 (CTokStaticAssert 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 (CTokClangC pos _) = pos+posLenOfTok CTokEof = error "tokenPos: Eof"++instance Show CToken where+ showsPrec _ (CTokLParen _ ) = showString "("+ showsPrec _ (CTokRParen _ ) = showString ")"+ showsPrec _ (CTokLBracket _ ) = showString "["+ showsPrec _ (CTokRBracket _ ) = showString "]"+ showsPrec _ (CTokArrow _ ) = showString "->"+ showsPrec _ (CTokDot _ ) = showString "."+ showsPrec _ (CTokExclam _ ) = showString "!"+ showsPrec _ (CTokTilde _ ) = showString "~"+ showsPrec _ (CTokInc _ ) = showString "++"+ showsPrec _ (CTokDec _ ) = showString "--"+ showsPrec _ (CTokPlus _ ) = showString "+"+ showsPrec _ (CTokMinus _ ) = showString "-"+ showsPrec _ (CTokStar _ ) = showString "*"+ showsPrec _ (CTokSlash _ ) = showString "/"+ showsPrec _ (CTokPercent _ ) = showString "%"+ showsPrec _ (CTokAmper _ ) = showString "&"+ showsPrec _ (CTokShiftL _ ) = showString "<<"+ showsPrec _ (CTokShiftR _ ) = showString ">>"+ showsPrec _ (CTokLess _ ) = showString "<"+ showsPrec _ (CTokLessEq _ ) = showString "<="+ showsPrec _ (CTokHigh _ ) = showString ">"+ showsPrec _ (CTokHighEq _ ) = showString ">="+ showsPrec _ (CTokEqual _ ) = showString "=="+ showsPrec _ (CTokUnequal _ ) = showString "!="+ showsPrec _ (CTokHat _ ) = showString "^"+ showsPrec _ (CTokBar _ ) = showString "|"+ showsPrec _ (CTokAnd _ ) = showString "&&"+ showsPrec _ (CTokOr _ ) = showString "||"+ showsPrec _ (CTokQuest _ ) = showString "?"+ showsPrec _ (CTokColon _ ) = showString ":"+ showsPrec _ (CTokAssign _ ) = showString "="+ showsPrec _ (CTokPlusAss _ ) = showString "+="+ showsPrec _ (CTokMinusAss _ ) = showString "-="+ showsPrec _ (CTokStarAss _ ) = showString "*="+ showsPrec _ (CTokSlashAss _ ) = showString "/="+ showsPrec _ (CTokPercAss _ ) = showString "%="+ showsPrec _ (CTokAmpAss _ ) = showString "&="+ showsPrec _ (CTokHatAss _ ) = showString "^="+ showsPrec _ (CTokBarAss _ ) = showString "|="+ showsPrec _ (CTokSLAss _ ) = showString "<<="+ showsPrec _ (CTokSRAss _ ) = showString ">>="+ showsPrec _ (CTokComma _ ) = showString ","+ showsPrec _ (CTokSemic _ ) = showString ";"+ showsPrec _ (CTokLBrace _ ) = showString "{"+ showsPrec _ (CTokRBrace _ ) = showString "}"+ showsPrec _ (CTokEllipsis _ ) = showString "..."+ showsPrec _ (CTokAlignof _ ) = showString "alignof"+ showsPrec _ (CTokAlignas _ ) = showString "_Alignas"+ showsPrec _ (CTokAsm _ ) = showString "asm"+ showsPrec _ (CTokAtomic _ ) = showString "_Atomic"+ showsPrec _ (CTokAuto _ ) = showString "auto"+ showsPrec _ (CTokBool _) = showString "_Bool"+ showsPrec _ (CTokBreak _ ) = showString "break"+ showsPrec _ (CTokCase _ ) = showString "case"+ showsPrec _ (CTokChar _ ) = showString "char"+ showsPrec _ (CTokComplex _) = showString "_Complex"+ showsPrec _ (CTokConst _ ) = showString "const"+ showsPrec _ (CTokContinue _ ) = showString "continue"+ showsPrec _ (CTokDefault _ ) = showString "default"+ showsPrec _ (CTokDouble _ ) = showString "double"+ showsPrec _ (CTokDo _ ) = showString "do"+ showsPrec _ (CTokElse _ ) = showString "else"+ showsPrec _ (CTokEnum _ ) = showString "enum"+ showsPrec _ (CTokExtern _ ) = showString "extern"+ showsPrec _ (CTokFloat _ ) = showString "float"+ showsPrec _ (CTokFloatN n x _) = showString "_Float" . shows n .+ showString (if x then "x" else "")+ showsPrec _ (CTokFor _ ) = showString "for"+ showsPrec _ (CTokGeneric _ ) = showString "_Generic"+ showsPrec _ (CTokGoto _ ) = showString "goto"+ showsPrec _ (CTokIf _ ) = showString "if"+ showsPrec _ (CTokInline _ ) = showString "inline"+ showsPrec _ (CTokInt _ ) = showString "int"+ showsPrec _ (CTokInt128 _ ) = showString "__int128"+ showsPrec _ (CTokLong _ ) = showString "long"+ showsPrec _ (CTokLabel _ ) = showString "__label__"+ showsPrec _ (CTokNoreturn _ ) = showString "_Noreturn"+ showsPrec _ (CTokNullable _ ) = showString "_Nullable"+ showsPrec _ (CTokNonnull _ ) = showString "_Nonnull"+ showsPrec _ (CTokRegister _ ) = showString "register"+ showsPrec _ (CTokRestrict _ ) = showString "restrict"+ showsPrec _ (CTokReturn _ ) = showString "return"+ showsPrec _ (CTokShort _ ) = showString "short"+ showsPrec _ (CTokSigned _ ) = showString "signed"+ showsPrec _ (CTokSizeof _ ) = showString "sizeof"+ showsPrec _ (CTokStatic _ ) = showString "static"+ showsPrec _ (CTokStaticAssert _ ) = showString "_Static_assert"+ showsPrec _ (CTokStruct _ ) = showString "struct"+ showsPrec _ (CTokSwitch _ ) = showString "switch"+ showsPrec _ (CTokTypedef _ ) = showString "typedef"+ showsPrec _ (CTokTypeof _ ) = showString "typeof"+ showsPrec _ (CTokThread _ ) = showString "_Thread_local"+ showsPrec _ (CTokUnion _ ) = showString "union"+ showsPrec _ (CTokUnsigned _ ) = showString "unsigned"+ showsPrec _ (CTokVoid _ ) = showString "void"+ showsPrec _ (CTokVolatile _ ) = showString "volatile"+ showsPrec _ (CTokWhile _ ) = showString "while"+ showsPrec _ (CTokCLit _ c) = shows c+ showsPrec _ (CTokILit _ i) = shows i+ showsPrec _ (CTokFLit _ f) = shows f+ showsPrec _ (CTokSLit _ s) = shows s+ showsPrec _ (CTokIdent _ i) = (showString . identToString) i+ showsPrec _ (CTokTyIdent _ i) = (showString . identToString) i+ showsPrec _ (CTokGnuC GnuCAttrTok _) = showString "__attribute__"+ showsPrec _ (CTokGnuC GnuCExtTok _) = showString "__extension__"+ showsPrec _ (CTokGnuC GnuCComplexReal _) = showString "__real__"+ showsPrec _ (CTokGnuC GnuCComplexImag _) = showString "__imag__"+ showsPrec _ (CTokGnuC GnuCVaArg _) = showString "__builtin_va_arg"+ showsPrec _ (CTokGnuC GnuCOffsetof _) = showString "__builtin_offsetof"+ showsPrec _ (CTokGnuC GnuCTyCompat _) = showString "__builtin_types_compatible_p"+ showsPrec _ (CTokClangC _ (ClangCVersionTok v)) = shows v+ showsPrec _ (CTokClangC _ ClangBuiltinConvertVector) = showString "__builtin_convertvector"+ showsPrec _ CTokEof = error "show CToken : CTokEof"
src/Language/C/Pretty.hs view
@@ -1,546 +1,547 @@-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, FlexibleContexts #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Pretty --- Copyright : Copyright (c) 2007 Bertram Felgenhauer --- (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- Portability : portable --- --- This module provides a pretty printer for the parse tree --- ('Language.C.Syntax.AST'). ------------------------------------------------------------------------------ -module Language.C.Pretty ( - -- * Pretty Printing - Pretty (..), - -- * Testing - prettyUsingInclude -) where -import Data.List (isSuffixOf) -import qualified Data.Set as Set -import Text.PrettyPrint.HughesPJ -import Debug.Trace {- for warnings -} -import Prelude hiding ((<>)) - -import Language.C.Data -import Language.C.Syntax - --- | A class of types which can be pretty printed -class Pretty p where - -- | pretty print the given value - pretty :: p -> Doc - -- | @prettyPrec prec p@ pretty prints p assuming - -- that the surrounding context has a precedence of - -- @prec@ - prettyPrec :: Int -> p -> Doc - - pretty = prettyPrec 0 - prettyPrec _ = pretty - --- pretty print optional chunk -maybeP :: (p -> Doc) -> Maybe p -> Doc -maybeP = maybe empty - --- pretty print when flag is true -ifP :: Bool -> Doc -> Doc -ifP flag doc = if flag then doc else empty - --- pretty print _optional_ list, i.e. [] ~ Nothing and (x:xs) ~ Just (x:xs) -mlistP :: ([p] -> Doc) -> [p] -> Doc -mlistP pp xs = maybeP pp (if null xs then Nothing else Just xs) - --- pretty print identifier -identP :: Ident -> Doc -identP = text . identToString - --- pretty print attribute annotations -attrlistP :: [CAttr] -> Doc -attrlistP [] = empty -attrlistP attrs = text "__attribute__" <> parens (parens (hcat . punctuate comma . map pretty $ attrs)) - --- analogous to showParen -parenPrec :: Int -> Int -> Doc -> Doc -parenPrec prec prec2 t = if prec <= prec2 then t else parens t - --- indent a chunk of code -ii :: Doc -> Doc -ii = nest 4 - --- Pretty instances -instance Pretty CTranslUnit where - pretty (CTranslUnit edecls _) = vcat (map pretty edecls) - --- | 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 useful --- for testing, as otherwise the pretty printed file will be cluttered with declarations from system headers. -prettyUsingInclude :: CTranslUnit -> Doc -prettyUsingInclude (CTranslUnit edecls _) = - includeWarning headerFiles - $$ - vcat (map (either includeHeader pretty) mappedDecls) - where - (headerFiles,mappedDecls) = foldr (addDecl . tagIncludedDecls) (Set.empty,[]) edecls - tagIncludedDecls edecl | maybe False isHeaderFile (fileOfNode edecl) = Left ((posFile . posOf) edecl) - | otherwise = Right edecl - addDecl decl@(Left headerRef) (headerSet, ds) - | Set.member headerRef headerSet = (headerSet, ds) - | otherwise = (Set.insert headerRef headerSet, decl : ds) - addDecl decl (headerSet,ds) = (headerSet, decl : ds) - 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 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 - --- TODO: Check that old-style and new-style aren't mixed -instance Pretty CFunDef where - pretty (CFunDef declspecs declr decls stat _) = -- Example: - hsep (map pretty declspecs) -- __attribute__((noreturn)) static long - <+> pretty declr -- foo(b) - $+$ (ii . vcat . map ((<> semi) . pretty)) decls -- register long b; - $$ prettyPrec (-1) stat -- { ... - -- } - -instance Pretty CStat where - pretty (CLabel ident stat cattrs _) = identP ident <> text ":" <+> attrlistP cattrs $$ pretty stat - pretty (CCase expr stat _) = - text "case" <+> pretty expr <> text ":" $$ pretty stat - pretty (CCases expr1 expr2 stat _) = - text "case" <+> pretty expr1 <+> text "..." - <+> pretty expr2 <> text ":" $$ pretty stat - pretty (CDefault stat _) = text "default:" $$ pretty stat - pretty (CExpr expr _) = ii $ maybeP pretty expr <> semi - pretty c@(CCompound _ _ _) = prettyPrec 0 c - pretty (CIf expr stat estat _) = - ii $ text "if" <+> parens (pretty expr) - $+$ prettyBody stat - $$ maybeP prettyElse estat - where - 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" <+> parens (pretty else_if_expr) - $+$ prettyBody else_if_stat - $$ maybeP prettyElse else_stat - prettyElse else_stmt = - text "else" - $+$ prettyBody else_stmt - - pretty (CSwitch expr stat _) = - ii $ text "switch" <+> text "(" <> pretty expr <> text ")" - $+$ prettyPrec (-1) stat - pretty (CWhile expr stat False _) = - ii $ text "while" <+> text "(" <> pretty expr <> text ")" - $+$ prettyPrec (-1) stat - pretty (CWhile expr stat True _) = - ii $ text "do" $+$ prettyPrec (-1) stat - $$ text "while" <+> text "(" <> pretty expr <> text ");" - pretty (CFor for_init cond step stat _) = - ii $ text "for" <+> text "(" - <> either (maybeP pretty) pretty for_init <> semi - <+> maybeP pretty cond <> semi - <+> maybeP pretty step <> text ")" $+$ prettyPrec (-1) stat - pretty (CGoto ident _) = ii $ text "goto" <+> identP ident <> semi - pretty (CGotoPtr expr _) = ii $ text "goto" <+> text "*" <+> prettyPrec 30 expr <> semi - pretty (CCont _) = ii $ text "continue" <> semi - pretty (CBreak _) = ii $ text "break" <> semi - pretty (CReturn Nothing _) = ii $ text "return" <> semi - pretty (CReturn (Just e) _) = ii $ text "return" <+> pretty e <> semi - pretty (CAsm asmStmt _) = pretty asmStmt - prettyPrec p (CCompound localLabels bis _) = - let inner = text "{" $+$ mlistP ppLblDecls localLabels $+$ vcat (map pretty bis) $$ text "}" - in if p == -1 then inner else ii inner - where ppLblDecls = vcat . map (\l -> text "__label__" <+> identP l <+> semi) - prettyPrec _ p = pretty p - -instance Pretty CAsmStmt where - pretty (CAsmStmt tyQual expr outOps inOps clobbers _) = - ii $ text "__asm__" <+> - maybeP pretty tyQual <> - parens asmStmt <> semi - where - asmStmt = pretty expr <+> - (if all null [inOps,outOps] && null clobbers then empty else ops) - ops = text ":" <+> hcat (punctuate comma (map pretty outOps)) <+> - text ":" <+> hcat (punctuate comma (map pretty inOps)) <+> - (if null clobbers then empty else clobs) - clobs = text ":" <+> hcat (punctuate comma (map pretty clobbers)) - -instance Pretty CAsmOperand where - -- asm_operand :~ [operand-name] "constraint" ( expr ) - pretty (CAsmOperand mArgName cnstr expr _) = - maybeP (\argName -> text "[" <> identP argName <> text "]") mArgName <+> - pretty cnstr <+> - parens (pretty expr) - --- TODO: Check need of __extension__ -instance Pretty CBlockItem where - pretty (CBlockStmt stat) = pretty stat - pretty (CBlockDecl decl) = ii $ pretty decl <> semi - pretty (CNestedFunDef fundef) = ii $ pretty fundef - -instance Pretty CDecl where - -- CAVEAT: - -- we may not print __attribute__s directly after typespecs, - -- as this may change the semantics of the declaration. - -- The parser fixes this, but to avoid hard-to-track code generator - -- errors, we enforce this invariant on the AST level. - pretty (CDecl specs divs _) = - hsep (map pretty checked_specs) <+> hsep (punctuate comma (map p divs)) - where - -- possible hint for AST improvement - (declr, initializer, expr, attrs) - -- currently there are no sensible attributes for unnamed bitfields though - p (declr, initializer, expr) = - maybeP (prettyDeclr False 0) declr <+> - maybeP ((text ":" <+>) . pretty) expr <+> - attrlistP (getAttrs declr) <+> - maybeP ((text "=" <+>) . pretty) initializer - checked_specs = - if any isAttrAfterSUE (zip specs (tail specs)) - then trace - ("Warning: AST Invariant violated: __attribute__ specifier following struct/union/enum:" ++ - show (map pretty specs)) - specs - else specs - isAttrAfterSUE (CTypeSpec ty,CTypeQual (CAttrQual _)) = isSUEDef ty - isAttrAfterSUE _ = False - getAttrs Nothing = [] - getAttrs (Just (CDeclr _ _ _ cattrs _)) = cattrs - pretty (CStaticAssert expr str _) = - text "_Static_assert" <> parens (hsep (punctuate comma [pretty expr, pretty str])) - -instance Pretty CDeclSpec where - pretty (CStorageSpec sp) = pretty sp - pretty (CTypeSpec sp) = pretty sp - pretty (CTypeQual qu) = pretty qu - pretty (CFunSpec fs) = pretty fs - pretty (CAlignSpec sa) = pretty sa - -instance Pretty CAlignSpec where - pretty (CAlignAsType decl _) = - text "_Alignas" <> parens (pretty decl) - pretty (CAlignAsExpr expr _) = - text "_Alignas" <> parens (pretty expr) - -instance Pretty CStorageSpec where - pretty (CAuto _) = text "auto" - pretty (CRegister _) = text "register" - pretty (CStatic _) = text "static" - pretty (CExtern _) = text "extern" - pretty (CTypedef _) = text "typedef" - pretty (CThread _) = text "_Thread_local" - -instance Pretty CTypeSpec where - pretty (CVoidType _) = text "void" - pretty (CCharType _) = text "char" - pretty (CShortType _) = text "short" - pretty (CIntType _) = text "int" - pretty (CLongType _) = text "long" - pretty (CFloatType _) = text "float" - pretty (CFloat128Type _) = text "__float128" - pretty (CDoubleType _) = text "double" - pretty (CSignedType _) = text "signed" - pretty (CUnsigType _) = text "unsigned" - pretty (CBoolType _) = text "_Bool" - pretty (CComplexType _) = text "_Complex" - pretty (CInt128Type _) = text "__int128" - pretty (CSUType union _) = pretty union - pretty (CEnumType enum _) = pretty enum - pretty (CTypeDef ident _) = identP ident - pretty (CTypeOfExpr expr _) = - text "typeof" <> parens (pretty expr) - pretty (CTypeOfType decl _) = - text "typeof" <> parens (pretty decl) - pretty (CAtomicType decl _) = - text "_Atomic" <> parens (pretty decl) - -instance Pretty CTypeQual where - pretty (CConstQual _) = text "const" - pretty (CVolatQual _) = text "volatile" - pretty (CRestrQual _) = text "__restrict" - pretty (CAtomicQual _) = text "_Atomic" - pretty (CAttrQual a) = attrlistP [a] - pretty (CNullableQual _) = text "_Nullable" - pretty (CNonnullQual _) = text "_Nonnull" - -instance Pretty CFunSpec where - pretty (CInlineQual _) = text "inline" - pretty (CNoreturnQual _) = text "_Noreturn" - -instance Pretty CStructUnion where - pretty (CStruct tag ident Nothing cattrs _) = pretty tag <+> attrlistP cattrs <+> maybeP identP ident - pretty (CStruct tag ident (Just []) cattrs _) = - pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{ }" - pretty (CStruct tag ident (Just decls) cattrs _) = vcat [ - pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{", - ii $ sep (map ((<> semi) . pretty) decls), - text "}"] - -instance Pretty CStructTag where - pretty CStructTag = text "struct" - pretty CUnionTag = text "union" - -instance Pretty CEnum where - pretty (CEnum enum_ident Nothing cattrs _) = text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident - pretty (CEnum enum_ident (Just vals) cattrs _) = vcat [ - text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident <+> text "{", - ii $ sep (punctuate comma (map p vals)), - text "}"] where - p (ident, expr) = identP ident <+> maybeP ((text "=" <+>) . pretty) expr - --- Analyze a declarator and return a human-readable description --- See C99 Spec p 115ff. --- describeDeclr :: CDeclr -> Doc --- describeDeclr declr = --- let declrs = reverse (declrChain declr) in --- endDescr (foldl descrDeclr undefined declrs) --- --- where --- declrChain declr@(CVarDeclr _ _ _ _) = [declr] --- declrChain declr@(CPtrDeclr _ ideclr _) = declr : declrChain ideclr --- declrChain declr@(CArrDeclr ideclr _ _ _) = declr : declrChain ideclr --- declrChain declr@(CFunDeclr ideclr _ _ _) = declr : declrChain ideclr --- --- descrDeclr _ (CVarDeclr ident asm cattrs _) = single False $ \_ -> --- maybe (text "<anonymous>") identP ident <+> --- maybeP (\asmname -> parens (text "asm:" <+> pretty asmname)) asm <+> --- text "is" <+> (if null cattrs then empty else prettyList (map CAttrQual cattrs) <> comma) --- descrDeclr (pre,isPlural) (CPtrDeclr quals declr _) = single isPlural $ \pluralize -> --- pre <+> indefArticle isPlural <> prettyList quals <+> pluralize "pointer to" "pointers to" --- descrDeclr (pre,isPlural) (CArrDeclr declr quals expr _) = plural isPlural $ \pluralize -> --- pre <+> indefArticle' isPlural <> prettyList quals <+> pluralize "array of" "arrays of" --- descrDeclr (pre,isPlural) (CFunDeclr declr params cattrs _) = single isPlural $ \pluralize -> --- pre <+> indefArticle isPlural <> prettyList (map CAttrQual cattrs) <+> pluralize "function returning" "functions returning" --- endDescr (pre, isPlural) = pre <+> text (if isPlural then "<typed objects>" else "a <typed object>") --- single :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool) --- single isPlural mkDescr = (mkDescr (pluralize isPlural), isPlural) --- plural :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool) --- plural isPlural mkDescr = (mkDescr (pluralize isPlural), True) --- indefArticle isPlural = text$ if isPlural then "" else "a " --- indefArticle' isPlural = text$ if isPlural then "" else "an " --- pluralize isPlural s p = text (if isPlural then p else s) --- prettyList :: (Pretty a) => [a] -> Doc --- prettyList = hsep . punctuate comma . map pretty -instance Pretty CDeclr where - prettyPrec prec declr = prettyDeclr True prec declr - -prettyDeclr :: Bool -> Int -> CDeclr -> Doc -prettyDeclr show_attrs prec (CDeclr name derived_declrs asmname cattrs _) = - ppDeclr prec (reverse derived_declrs) <+> prettyAsmName asmname <+> ifP show_attrs (attrlistP cattrs) - where - ppDeclr _ [] = maybeP identP name - --'*' __attribute__? qualifiers declarator - ppDeclr p (CPtrDeclr quals _ : declrs) = - parenPrec p 5 $ text "*" <+> hsep (map pretty quals) <+> ppDeclr 5 declrs - - -- declarator[ __attribute__? qualifiers expr ] - ppDeclr p (CArrDeclr quals size _ : declrs) = - parenPrec p 6 $ ppDeclr 6 declrs <> brackets (hsep (map pretty quals) <+> pretty size) - -- declarator ( arguments ) - -- or (__attribute__ declarator) (arguments) - ppDeclr _ (CFunDeclr params fun_attrs _ : declrs) = - (if not (null fun_attrs) then parens (attrlistP fun_attrs <+> ppDeclr 5 declrs) else ppDeclr 6 declrs) - <> parens (prettyParams params) - prettyParams (Right (decls, isVariadic)) = - sep (punctuate comma (map pretty decls)) - <> (if isVariadic then text "," <+> text "..." else empty) - prettyParams (Left oldStyleIds) = - hsep (punctuate comma (map identP oldStyleIds)) - prettyAsmName asm_name_opt - = maybe empty (\asm_name -> text "__asm__" <> parens (pretty asm_name)) asm_name_opt - -instance Pretty CArrSize where - pretty (CNoArrSize completeType) = ifP completeType (text "*") - pretty (CArrSize staticMod expr) = ifP staticMod (text "static") <+> pretty expr --- initializer :: { CInit } --- initializer :- assignment_expression --- | '{' (designation? initializer)_cs_list '}' -instance Pretty CInit where - pretty (CInitExpr expr _) = pretty expr - pretty (CInitList initl _) = - text "{" <+> hsep (punctuate comma (map p initl)) <+> text "}" where - p ([], initializer) = pretty initializer - p (desigs, initializer) = hsep (map pretty desigs) <+> text "=" <+> pretty initializer - --- designation :- designator_list '=' --- | array_range_designator --- arr_designator :- '[' constant_expression ']' --- member_designator :- '.' identifier --- arr_range _designator :- '[' constant_expression "..." constant_expression ']' - -instance Pretty CDesignator where - pretty (CArrDesig expr _) = text "[" <> pretty expr <> text "]" - pretty (CMemberDesig ident _) = text "." <> identP ident - pretty (CRangeDesig expr1 expr2 _) = - text "[" <> pretty expr1 <+> text "..." <+> pretty expr2 <> text "]" - -instance Pretty CAttr where - pretty (CAttr attrName [] _) = identP attrName - pretty (CAttr attrName attrParams _) = identP attrName <> parens (hsep . punctuate comma . map pretty $ attrParams) - -instance Pretty CExpr where - prettyPrec p (CComma exprs _) = - parenPrec p (-1) $ hsep (punctuate comma (map (prettyPrec 2) exprs)) - prettyPrec p (CAssign op expr1 expr2 _) = - parenPrec p 2 $ prettyPrec 3 expr1 <+> pretty op <+> prettyPrec 2 expr2 - prettyPrec p (CCond expr1 expr2 expr3 _) = - parenPrec p 2 $ prettyPrec 4 expr1 <+> text "?" -- NB: assignment only has a higher precedence if cond is on the rhs - <+> maybeP pretty expr2 <+> text ":" <+> prettyPrec 4 expr3 - prettyPrec p (CBinary op expr1 expr2 _) = - let prec = binPrec op - in parenPrec p prec $ prettyPrec prec expr1 - <+> pretty op <+> prettyPrec (prec + 1) expr2 - prettyPrec p (CCast decl expr _) = - parenPrec p 25 $ text "(" <> pretty decl <> text ")" - <+> prettyPrec 25 expr - prettyPrec p (CUnary CPostIncOp expr _) = - parenPrec p 26 $ prettyPrec 26 expr <> text "++" - prettyPrec p (CUnary CPostDecOp expr _) = - parenPrec p 26 $ prettyPrec 26 expr <> text "--" - prettyPrec p (CUnary op expr@(CUnary _ _ _) _) = - -- 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 - prettyPrec p (CSizeofExpr expr _) = - parenPrec p 25 $ text "sizeof" <> parens (pretty expr) - prettyPrec p (CSizeofType decl _) = - parenPrec p 25 $ text "sizeof" <> parens (pretty decl) - prettyPrec p (CAlignofExpr expr _) = - parenPrec p 25 $ text "__alignof" <> parens (pretty expr) - prettyPrec p (CAlignofType decl _) = - parenPrec p 25 $ text "__alignof" <> parens (pretty decl) - prettyPrec p (CComplexReal expr _) = - parenPrec p 25 $ text "__real" <+> prettyPrec 25 expr - prettyPrec p (CComplexImag expr _) = - parenPrec p 25 $ text "__imag" <+> prettyPrec 25 expr - prettyPrec p (CIndex expr1 expr2 _) = - parenPrec p 26 $ prettyPrec 26 expr1 - <> text "[" <> pretty expr2 <> text "]" - prettyPrec p (CCall expr args _) = - parenPrec p 30 $ prettyPrec 30 expr <> text "(" - <> (sep . punctuate comma . map pretty) args <> text ")" - prettyPrec p (CMember expr ident deref _) = - parenPrec p 26 $ prettyPrec 26 expr - <> text (if deref then "->" else ".") <> identP ident - prettyPrec _p (CVar ident _) = identP ident - prettyPrec _p (CConst constant) = pretty constant - prettyPrec _p (CCompoundLit decl initl _) = - parens (pretty decl) <+> (braces . hsep . punctuate comma) (map p initl) where - p ([], initializer) = pretty initializer - p (mems, initializer) = hcat (punctuate (text ".") (map pretty mems)) <+> text "=" <+> pretty initializer - - prettyPrec _p (CStatExpr stat _) = - text "(" <> pretty stat <> text ")" - - -- unary_expr :- && ident {- address of label -} - prettyPrec _p (CLabAddrExpr ident _) = text "&&" <> identP ident - prettyPrec _p (CGenericSelection expr assoc_list _) = - text "_Generic" <> (parens.hsep.punctuate comma) (pretty expr : map pAssoc assoc_list) - where - pAssoc (mty, expr1) = maybe (text "default") pretty mty <> text ":" <+> pretty expr1 - prettyPrec _p (CBuiltinExpr builtin) = pretty builtin - -instance Pretty CBuiltin where - pretty (CBuiltinVaArg expr ty_name _) = - text "__builtin_va_arg" <+> - parens (pretty expr <> comma <+> pretty ty_name) - -- The first desig has to be a member field. - pretty (CBuiltinOffsetOf ty_name (CMemberDesig field1 _ : desigs) _) = - text "__builtin_offsetof" <+> - parens (pretty ty_name <> comma <+> identP field1 <> hcat (map pretty desigs) ) - pretty (CBuiltinOffsetOf _ty_name otherDesigs _) = - error $ "Inconsistent AST: Cannot interpret designators in offsetOf: " ++ - show (hcat $ map pretty otherDesigs) - pretty (CBuiltinTypesCompatible ty1 ty2 _) = - text "__builtin_types_compatible_p" <+> - parens (pretty ty1 <> comma <+> pretty ty2) - pretty (CBuiltinConvertVector expr ty _) = - text "__builtin_convertvector" <+> - parens (pretty expr <> comma <+> pretty ty) - -instance Pretty CAssignOp where - pretty op = text $ case op of - CAssignOp -> "=" - CMulAssOp -> "*=" - CDivAssOp -> "/=" - CRmdAssOp -> "%=" - CAddAssOp -> "+=" - CSubAssOp -> "-=" - CShlAssOp -> "<<=" - CShrAssOp -> ">>=" - CAndAssOp -> "&=" - CXorAssOp -> "^=" - COrAssOp -> "|=" - -instance Pretty CBinaryOp where - 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 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) - pretty (CCharConst chr _) = text (show chr) - pretty (CFloatConst flt _) = text (show flt) - pretty (CStrConst str _) = text (show str) - -instance Pretty CStrLit where - pretty (CStrLit str _) = text (show str) - --- precedence of C operators -binPrec :: CBinaryOp -> Int -binPrec CMulOp = 20 -binPrec CDivOp = 20 -binPrec CRmdOp = 20 -binPrec CAddOp = 19 -binPrec CSubOp = 19 -binPrec CShlOp = 18 -binPrec CShrOp = 18 -binPrec CLeOp = 17 -binPrec CGrOp = 17 -binPrec CLeqOp = 17 -binPrec CGeqOp = 17 -binPrec CEqOp = 16 -binPrec CNeqOp = 16 -binPrec CAndOp = 15 -binPrec CXorOp = 14 -binPrec COrOp = 13 -binPrec CLndOp = 12 -binPrec CLorOp = 11 +{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, FlexibleContexts #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Pretty+-- Copyright : Copyright (c) 2007 Bertram Felgenhauer+-- (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : portable+--+-- This module provides a pretty printer for the parse tree+-- ('Language.C.Syntax.AST').+-----------------------------------------------------------------------------+module Language.C.Pretty (+ -- * Pretty Printing+ Pretty (..),+ -- * Testing+ prettyUsingInclude+) where+import Data.List (isSuffixOf)+import qualified Data.Set as Set+import Text.PrettyPrint.HughesPJ+import Debug.Trace {- for warnings -}+import Prelude hiding ((<>))++import Language.C.Data+import Language.C.Syntax++-- | A class of types which can be pretty printed+class Pretty p where+ -- | pretty print the given value+ pretty :: p -> Doc+ -- | @prettyPrec prec p@ pretty prints p assuming+ -- that the surrounding context has a precedence of+ -- @prec@+ prettyPrec :: Int -> p -> Doc++ pretty = prettyPrec 0+ prettyPrec _ = pretty++-- pretty print optional chunk+maybeP :: (p -> Doc) -> Maybe p -> Doc+maybeP = maybe empty++-- pretty print when flag is true+ifP :: Bool -> Doc -> Doc+ifP flag doc = if flag then doc else empty++-- pretty print _optional_ list, i.e. [] ~ Nothing and (x:xs) ~ Just (x:xs)+mlistP :: ([p] -> Doc) -> [p] -> Doc+mlistP pp xs = maybeP pp (if null xs then Nothing else Just xs)++-- pretty print identifier+identP :: Ident -> Doc+identP = text . identToString++-- pretty print attribute annotations+attrlistP :: [CAttr] -> Doc+attrlistP [] = empty+attrlistP attrs = text "__attribute__" <> parens (parens (hcat . punctuate comma . map pretty $ attrs))++-- analogous to showParen+parenPrec :: Int -> Int -> Doc -> Doc+parenPrec prec prec2 t = if prec <= prec2 then t else parens t++-- indent a chunk of code+ii :: Doc -> Doc+ii = nest 4++-- Pretty instances+instance Pretty CTranslUnit where+ pretty (CTranslUnit edecls _) = vcat (map pretty edecls)++-- | 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 useful+-- for testing, as otherwise the pretty printed file will be cluttered with declarations from system headers.+prettyUsingInclude :: CTranslUnit -> Doc+prettyUsingInclude (CTranslUnit edecls _) =+ includeWarning headerFiles+ $$+ vcat (map (either includeHeader pretty) mappedDecls)+ where+ (headerFiles,mappedDecls) = foldr (addDecl . tagIncludedDecls) (Set.empty,[]) edecls+ tagIncludedDecls edecl | maybe False isHeaderFile (fileOfNode edecl) = Left ((posFile . posOf) edecl)+ | otherwise = Right edecl+ addDecl decl@(Left headerRef) (headerSet, ds)+ | Set.member headerRef headerSet = (headerSet, ds)+ | otherwise = (Set.insert headerRef headerSet, decl : ds)+ addDecl decl (headerSet,ds) = (headerSet, decl : ds)+ 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 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++-- TODO: Check that old-style and new-style aren't mixed+instance Pretty CFunDef where+ pretty (CFunDef declspecs declr decls stat _) = -- Example:+ hsep (map pretty declspecs) -- __attribute__((noreturn)) static long+ <+> pretty declr -- foo(b)+ $+$ (ii . vcat . map ((<> semi) . pretty)) decls -- register long b;+ $$ prettyPrec (-1) stat -- { ...+ -- }++instance Pretty CStat where+ pretty (CLabel ident stat cattrs _) = identP ident <> text ":" <+> attrlistP cattrs $$ pretty stat+ pretty (CCase expr stat _) =+ text "case" <+> pretty expr <> text ":" $$ pretty stat+ pretty (CCases expr1 expr2 stat _) =+ text "case" <+> pretty expr1 <+> text "..."+ <+> pretty expr2 <> text ":" $$ pretty stat+ pretty (CDefault stat _) = text "default:" $$ pretty stat+ pretty (CExpr expr _) = ii $ maybeP pretty expr <> semi+ pretty c@(CCompound _ _ _) = prettyPrec 0 c+ pretty (CIf expr stat estat _) =+ ii $ text "if" <+> parens (pretty expr)+ $+$ prettyBody stat+ $$ maybeP prettyElse estat+ where+ 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" <+> parens (pretty else_if_expr)+ $+$ prettyBody else_if_stat+ $$ maybeP prettyElse else_stat+ prettyElse else_stmt =+ text "else"+ $+$ prettyBody else_stmt++ pretty (CSwitch expr stat _) =+ ii $ text "switch" <+> text "(" <> pretty expr <> text ")"+ $+$ prettyPrec (-1) stat+ pretty (CWhile expr stat False _) =+ ii $ text "while" <+> text "(" <> pretty expr <> text ")"+ $+$ prettyPrec (-1) stat+ pretty (CWhile expr stat True _) =+ ii $ text "do" $+$ prettyPrec (-1) stat+ $$ text "while" <+> text "(" <> pretty expr <> text ");"+ pretty (CFor for_init cond step stat _) =+ ii $ text "for" <+> text "("+ <> either (maybeP pretty) pretty for_init <> semi+ <+> maybeP pretty cond <> semi+ <+> maybeP pretty step <> text ")" $+$ prettyPrec (-1) stat+ pretty (CGoto ident _) = ii $ text "goto" <+> identP ident <> semi+ pretty (CGotoPtr expr _) = ii $ text "goto" <+> text "*" <+> prettyPrec 30 expr <> semi+ pretty (CCont _) = ii $ text "continue" <> semi+ pretty (CBreak _) = ii $ text "break" <> semi+ pretty (CReturn Nothing _) = ii $ text "return" <> semi+ pretty (CReturn (Just e) _) = ii $ text "return" <+> pretty e <> semi+ pretty (CAsm asmStmt _) = pretty asmStmt+ prettyPrec p (CCompound localLabels bis _) =+ let inner = text "{" $+$ mlistP ppLblDecls localLabels $+$ vcat (map pretty bis) $$ text "}"+ in if p == -1 then inner else ii inner+ where ppLblDecls = vcat . map (\l -> text "__label__" <+> identP l <+> semi)+ prettyPrec _ p = pretty p++instance Pretty CAsmStmt where+ pretty (CAsmStmt tyQual expr outOps inOps clobbers _) =+ ii $ text "__asm__" <+>+ maybeP pretty tyQual <>+ parens asmStmt <> semi+ where+ asmStmt = pretty expr <+>+ (if all null [inOps,outOps] && null clobbers then empty else ops)+ ops = text ":" <+> hcat (punctuate comma (map pretty outOps)) <+>+ text ":" <+> hcat (punctuate comma (map pretty inOps)) <+>+ (if null clobbers then empty else clobs)+ clobs = text ":" <+> hcat (punctuate comma (map pretty clobbers))++instance Pretty CAsmOperand where+ -- asm_operand :~ [operand-name] "constraint" ( expr )+ pretty (CAsmOperand mArgName cnstr expr _) =+ maybeP (\argName -> text "[" <> identP argName <> text "]") mArgName <+>+ pretty cnstr <+>+ parens (pretty expr)++-- TODO: Check need of __extension__+instance Pretty CBlockItem where+ pretty (CBlockStmt stat) = pretty stat+ pretty (CBlockDecl decl) = ii $ pretty decl <> semi+ pretty (CNestedFunDef fundef) = ii $ pretty fundef++instance Pretty CDecl where+ -- CAVEAT:+ -- we may not print __attribute__s directly after typespecs,+ -- as this may change the semantics of the declaration.+ -- The parser fixes this, but to avoid hard-to-track code generator+ -- errors, we enforce this invariant on the AST level.+ pretty (CDecl specs divs _) =+ hsep (map pretty checked_specs) <+> hsep (punctuate comma (map p divs))+ where+ -- possible hint for AST improvement - (declr, initializer, expr, attrs)+ -- currently there are no sensible attributes for unnamed bitfields though+ p (declr, initializer, expr) =+ maybeP (prettyDeclr False 0) declr <+>+ maybeP ((text ":" <+>) . pretty) expr <+>+ attrlistP (getAttrs declr) <+>+ maybeP ((text "=" <+>) . pretty) initializer+ checked_specs =+ if any isAttrAfterSUE (zip specs (tail specs))+ then trace+ ("Warning: AST Invariant violated: __attribute__ specifier following struct/union/enum:" +++ show (map pretty specs))+ specs+ else specs+ isAttrAfterSUE (CTypeSpec ty,CTypeQual (CAttrQual _)) = isSUEDef ty+ isAttrAfterSUE _ = False+ getAttrs Nothing = []+ getAttrs (Just (CDeclr _ _ _ cattrs _)) = cattrs+ pretty (CStaticAssert expr str _) =+ text "_Static_assert" <> parens (hsep (punctuate comma [pretty expr, pretty str]))++instance Pretty CDeclSpec where+ pretty (CStorageSpec sp) = pretty sp+ pretty (CTypeSpec sp) = pretty sp+ pretty (CTypeQual qu) = pretty qu+ pretty (CFunSpec fs) = pretty fs+ pretty (CAlignSpec sa) = pretty sa++instance Pretty CAlignSpec where+ pretty (CAlignAsType decl _) =+ text "_Alignas" <> parens (pretty decl)+ pretty (CAlignAsExpr expr _) =+ text "_Alignas" <> parens (pretty expr)++instance Pretty CStorageSpec where+ pretty (CAuto _) = text "auto"+ pretty (CRegister _) = text "register"+ pretty (CStatic _) = text "static"+ pretty (CExtern _) = text "extern"+ pretty (CTypedef _) = text "typedef"+ pretty (CThread _) = text "_Thread_local"++instance Pretty CTypeSpec where+ pretty (CVoidType _) = text "void"+ pretty (CCharType _) = text "char"+ pretty (CShortType _) = text "short"+ pretty (CIntType _) = text "int"+ pretty (CLongType _) = text "long"+ pretty (CFloatType _) = text "float"+ pretty (CFloatNType n x _) = text "_Float" <> text (show n) <>+ (if x then text "x" else empty) + pretty (CDoubleType _) = text "double"+ pretty (CSignedType _) = text "signed"+ pretty (CUnsigType _) = text "unsigned"+ pretty (CBoolType _) = text "_Bool"+ pretty (CComplexType _) = text "_Complex"+ pretty (CInt128Type _) = text "__int128"+ pretty (CSUType union _) = pretty union+ pretty (CEnumType enum _) = pretty enum+ pretty (CTypeDef ident _) = identP ident+ pretty (CTypeOfExpr expr _) =+ text "typeof" <> parens (pretty expr)+ pretty (CTypeOfType decl _) =+ text "typeof" <> parens (pretty decl)+ pretty (CAtomicType decl _) =+ text "_Atomic" <> parens (pretty decl)++instance Pretty CTypeQual where+ pretty (CConstQual _) = text "const"+ pretty (CVolatQual _) = text "volatile"+ pretty (CRestrQual _) = text "__restrict"+ pretty (CAtomicQual _) = text "_Atomic"+ pretty (CAttrQual a) = attrlistP [a]+ pretty (CNullableQual _) = text "_Nullable"+ pretty (CNonnullQual _) = text "_Nonnull"++instance Pretty CFunSpec where+ pretty (CInlineQual _) = text "inline"+ pretty (CNoreturnQual _) = text "_Noreturn"++instance Pretty CStructUnion where+ pretty (CStruct tag ident Nothing cattrs _) = pretty tag <+> attrlistP cattrs <+> maybeP identP ident+ pretty (CStruct tag ident (Just []) cattrs _) =+ pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{ }"+ pretty (CStruct tag ident (Just decls) cattrs _) = vcat [+ pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{",+ ii $ sep (map ((<> semi) . pretty) decls),+ text "}"]++instance Pretty CStructTag where+ pretty CStructTag = text "struct"+ pretty CUnionTag = text "union"++instance Pretty CEnum where+ pretty (CEnum enum_ident Nothing cattrs _) = text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident+ pretty (CEnum enum_ident (Just vals) cattrs _) = vcat [+ text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident <+> text "{",+ ii $ sep (punctuate comma (map p vals)),+ text "}"] where+ p (ident, expr) = identP ident <+> maybeP ((text "=" <+>) . pretty) expr++-- Analyze a declarator and return a human-readable description+-- See C99 Spec p 115ff.+-- describeDeclr :: CDeclr -> Doc+-- describeDeclr declr =+-- let declrs = reverse (declrChain declr) in+-- endDescr (foldl descrDeclr undefined declrs)+--+-- where+-- declrChain declr@(CVarDeclr _ _ _ _) = [declr]+-- declrChain declr@(CPtrDeclr _ ideclr _) = declr : declrChain ideclr+-- declrChain declr@(CArrDeclr ideclr _ _ _) = declr : declrChain ideclr+-- declrChain declr@(CFunDeclr ideclr _ _ _) = declr : declrChain ideclr+--+-- descrDeclr _ (CVarDeclr ident asm cattrs _) = single False $ \_ ->+-- maybe (text "<anonymous>") identP ident <+>+-- maybeP (\asmname -> parens (text "asm:" <+> pretty asmname)) asm <+>+-- text "is" <+> (if null cattrs then empty else prettyList (map CAttrQual cattrs) <> comma)+-- descrDeclr (pre,isPlural) (CPtrDeclr quals declr _) = single isPlural $ \pluralize ->+-- pre <+> indefArticle isPlural <> prettyList quals <+> pluralize "pointer to" "pointers to"+-- descrDeclr (pre,isPlural) (CArrDeclr declr quals expr _) = plural isPlural $ \pluralize ->+-- pre <+> indefArticle' isPlural <> prettyList quals <+> pluralize "array of" "arrays of"+-- descrDeclr (pre,isPlural) (CFunDeclr declr params cattrs _) = single isPlural $ \pluralize ->+-- pre <+> indefArticle isPlural <> prettyList (map CAttrQual cattrs) <+> pluralize "function returning" "functions returning"+-- endDescr (pre, isPlural) = pre <+> text (if isPlural then "<typed objects>" else "a <typed object>")+-- single :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool)+-- single isPlural mkDescr = (mkDescr (pluralize isPlural), isPlural)+-- plural :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool)+-- plural isPlural mkDescr = (mkDescr (pluralize isPlural), True)+-- indefArticle isPlural = text$ if isPlural then "" else "a "+-- indefArticle' isPlural = text$ if isPlural then "" else "an "+-- pluralize isPlural s p = text (if isPlural then p else s)+-- prettyList :: (Pretty a) => [a] -> Doc+-- prettyList = hsep . punctuate comma . map pretty+instance Pretty CDeclr where+ prettyPrec prec declr = prettyDeclr True prec declr++prettyDeclr :: Bool -> Int -> CDeclr -> Doc+prettyDeclr show_attrs prec (CDeclr name derived_declrs asmname cattrs _) =+ ppDeclr prec (reverse derived_declrs) <+> prettyAsmName asmname <+> ifP show_attrs (attrlistP cattrs)+ where+ ppDeclr _ [] = maybeP identP name+ --'*' __attribute__? qualifiers declarator+ ppDeclr p (CPtrDeclr quals _ : declrs) =+ parenPrec p 5 $ text "*" <+> hsep (map pretty quals) <+> ppDeclr 5 declrs++ -- declarator[ __attribute__? qualifiers expr ]+ ppDeclr p (CArrDeclr quals size _ : declrs) =+ parenPrec p 6 $ ppDeclr 6 declrs <> brackets (hsep (map pretty quals) <+> pretty size)+ -- declarator ( arguments )+ -- or (__attribute__ declarator) (arguments)+ ppDeclr _ (CFunDeclr params fun_attrs _ : declrs) =+ (if not (null fun_attrs) then parens (attrlistP fun_attrs <+> ppDeclr 5 declrs) else ppDeclr 6 declrs)+ <> parens (prettyParams params)+ prettyParams (Right (decls, isVariadic)) =+ sep (punctuate comma (map pretty decls))+ <> (if isVariadic then text "," <+> text "..." else empty)+ prettyParams (Left oldStyleIds) =+ hsep (punctuate comma (map identP oldStyleIds))+ prettyAsmName asm_name_opt+ = maybe empty (\asm_name -> text "__asm__" <> parens (pretty asm_name)) asm_name_opt++instance Pretty CArrSize where+ pretty (CNoArrSize completeType) = ifP completeType (text "*")+ pretty (CArrSize staticMod expr) = ifP staticMod (text "static") <+> pretty expr+-- initializer :: { CInit }+-- initializer :- assignment_expression+-- | '{' (designation? initializer)_cs_list '}'+instance Pretty CInit where+ pretty (CInitExpr expr _) = pretty expr+ pretty (CInitList initl _) =+ text "{" <+> hsep (punctuate comma (map p initl)) <+> text "}" where+ p ([], initializer) = pretty initializer+ p (desigs, initializer) = hsep (map pretty desigs) <+> text "=" <+> pretty initializer++-- designation :- designator_list '='+-- | array_range_designator+-- arr_designator :- '[' constant_expression ']'+-- member_designator :- '.' identifier+-- arr_range _designator :- '[' constant_expression "..." constant_expression ']'++instance Pretty CDesignator where+ pretty (CArrDesig expr _) = text "[" <> pretty expr <> text "]"+ pretty (CMemberDesig ident _) = text "." <> identP ident+ pretty (CRangeDesig expr1 expr2 _) =+ text "[" <> pretty expr1 <+> text "..." <+> pretty expr2 <> text "]"++instance Pretty CAttr where+ pretty (CAttr attrName [] _) = identP attrName+ pretty (CAttr attrName attrParams _) = identP attrName <> parens (hsep . punctuate comma . map pretty $ attrParams)++instance Pretty CExpr where+ prettyPrec p (CComma exprs _) =+ parenPrec p (-1) $ hsep (punctuate comma (map (prettyPrec 2) exprs))+ prettyPrec p (CAssign op expr1 expr2 _) =+ parenPrec p 2 $ prettyPrec 3 expr1 <+> pretty op <+> prettyPrec 2 expr2+ prettyPrec p (CCond expr1 expr2 expr3 _) =+ parenPrec p 2 $ prettyPrec 4 expr1 <+> text "?" -- NB: assignment only has a higher precedence if cond is on the rhs+ <+> maybeP pretty expr2 <+> text ":" <+> prettyPrec 4 expr3+ prettyPrec p (CBinary op expr1 expr2 _) =+ let prec = binPrec op+ in parenPrec p prec $ prettyPrec prec expr1+ <+> pretty op <+> prettyPrec (prec + 1) expr2+ prettyPrec p (CCast decl expr _) =+ parenPrec p 25 $ text "(" <> pretty decl <> text ")"+ <+> prettyPrec 25 expr+ prettyPrec p (CUnary CPostIncOp expr _) =+ parenPrec p 26 $ prettyPrec 26 expr <> text "++"+ prettyPrec p (CUnary CPostDecOp expr _) =+ parenPrec p 26 $ prettyPrec 26 expr <> text "--"+ prettyPrec p (CUnary op expr@(CUnary _ _ _) _) =+ -- 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+ prettyPrec p (CSizeofExpr expr _) =+ parenPrec p 25 $ text "sizeof" <> parens (pretty expr)+ prettyPrec p (CSizeofType decl _) =+ parenPrec p 25 $ text "sizeof" <> parens (pretty decl)+ prettyPrec p (CAlignofExpr expr _) =+ parenPrec p 25 $ text "__alignof" <> parens (pretty expr)+ prettyPrec p (CAlignofType decl _) =+ parenPrec p 25 $ text "__alignof" <> parens (pretty decl)+ prettyPrec p (CComplexReal expr _) =+ parenPrec p 25 $ text "__real" <+> prettyPrec 25 expr+ prettyPrec p (CComplexImag expr _) =+ parenPrec p 25 $ text "__imag" <+> prettyPrec 25 expr+ prettyPrec p (CIndex expr1 expr2 _) =+ parenPrec p 26 $ prettyPrec 26 expr1+ <> text "[" <> pretty expr2 <> text "]"+ prettyPrec p (CCall expr args _) =+ parenPrec p 30 $ prettyPrec 30 expr <> text "("+ <> (sep . punctuate comma . map pretty) args <> text ")"+ prettyPrec p (CMember expr ident deref _) =+ parenPrec p 26 $ prettyPrec 26 expr+ <> text (if deref then "->" else ".") <> identP ident+ prettyPrec _p (CVar ident _) = identP ident+ prettyPrec _p (CConst constant) = pretty constant+ prettyPrec _p (CCompoundLit decl initl _) =+ parens (pretty decl) <+> (braces . hsep . punctuate comma) (map p initl) where+ p ([], initializer) = pretty initializer+ p (mems, initializer) = hcat (punctuate (text ".") (map pretty mems)) <+> text "=" <+> pretty initializer++ prettyPrec _p (CStatExpr stat _) =+ text "(" <> pretty stat <> text ")"++ -- unary_expr :- && ident {- address of label -}+ prettyPrec _p (CLabAddrExpr ident _) = text "&&" <> identP ident+ prettyPrec _p (CGenericSelection expr assoc_list _) =+ text "_Generic" <> (parens.hsep.punctuate comma) (pretty expr : map pAssoc assoc_list)+ where+ pAssoc (mty, expr1) = maybe (text "default") pretty mty <> text ":" <+> pretty expr1+ prettyPrec _p (CBuiltinExpr builtin) = pretty builtin++instance Pretty CBuiltin where+ pretty (CBuiltinVaArg expr ty_name _) =+ text "__builtin_va_arg" <+>+ parens (pretty expr <> comma <+> pretty ty_name)+ -- The first desig has to be a member field.+ pretty (CBuiltinOffsetOf ty_name (CMemberDesig field1 _ : desigs) _) =+ text "__builtin_offsetof" <+>+ parens (pretty ty_name <> comma <+> identP field1 <> hcat (map pretty desigs) )+ pretty (CBuiltinOffsetOf _ty_name otherDesigs _) =+ error $ "Inconsistent AST: Cannot interpret designators in offsetOf: " +++ show (hcat $ map pretty otherDesigs)+ pretty (CBuiltinTypesCompatible ty1 ty2 _) =+ text "__builtin_types_compatible_p" <+>+ parens (pretty ty1 <> comma <+> pretty ty2)+ pretty (CBuiltinConvertVector expr ty _) =+ text "__builtin_convertvector" <+>+ parens (pretty expr <> comma <+> pretty ty)++instance Pretty CAssignOp where+ pretty op = text $ case op of+ CAssignOp -> "="+ CMulAssOp -> "*="+ CDivAssOp -> "/="+ CRmdAssOp -> "%="+ CAddAssOp -> "+="+ CSubAssOp -> "-="+ CShlAssOp -> "<<="+ CShrAssOp -> ">>="+ CAndAssOp -> "&="+ CXorAssOp -> "^="+ COrAssOp -> "|="++instance Pretty CBinaryOp where+ 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 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)+ pretty (CCharConst chr _) = text (show chr)+ pretty (CFloatConst flt _) = text (show flt)+ pretty (CStrConst str _) = text (show str)++instance Pretty CStrLit where+ pretty (CStrLit str _) = text (show str)++-- precedence of C operators+binPrec :: CBinaryOp -> Int+binPrec CMulOp = 20+binPrec CDivOp = 20+binPrec CRmdOp = 20+binPrec CAddOp = 19+binPrec CSubOp = 19+binPrec CShlOp = 18+binPrec CShrOp = 18+binPrec CLeOp = 17+binPrec CGrOp = 17+binPrec CLeqOp = 17+binPrec CGeqOp = 17+binPrec CEqOp = 16+binPrec CNeqOp = 16+binPrec CAndOp = 15+binPrec CXorOp = 14+binPrec COrOp = 13+binPrec CLndOp = 12+binPrec CLorOp = 11
src/Language/C/Syntax.hs view
@@ -1,20 +1,20 @@------------------------------------------------------------------------------ --- | --- Module : Language.C.Syntax --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- Portability : ghc --- --- Syntax of C files: The abstract syntax tree and constants. ------------------------------------------------------------------------------ -module Language.C.Syntax ( - -- * Constants - module Language.C.Syntax.Constants, - -- * Syntax tree - module Language.C.Syntax.AST, -) -where -import Language.C.Syntax.AST -import Language.C.Syntax.Constants +-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Syntax+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : ghc+--+-- Syntax of C files: The abstract syntax tree and constants.+-----------------------------------------------------------------------------+module Language.C.Syntax (+ -- * Constants+ module Language.C.Syntax.Constants,+ -- * Syntax tree+ module Language.C.Syntax.AST,+)+where+import Language.C.Syntax.AST+import Language.C.Syntax.Constants
src/Language/C/Syntax/AST.hs view
@@ -1,1393 +1,1434 @@-{-# LANGUAGE DeriveDataTypeable #-} -{-# 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, CFunSpec, CAlignSpec, CAttr, - CFunctionSpecifier(..), CDeclarationSpecifier(..), CStorageSpecifier(..), CTypeSpecifier(..), - CAlignmentSpecifier(..), - 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(..), - -- * Annoated type class - Annotated(..) -) where -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 -- annotation - | CStaticAssert - (CExpression a) -- assert expression - (CStringLiteral a) -- assert text - a -- annotation - 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) - fmap f (CStaticAssert expression strlit annot) = - CStaticAssert (fmap f expression) (fmap f strlit) (f annot) - --- | 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 - | CFunSpec (CFunctionSpecifier a) -- ^ function specifier - | CAlignSpec (CAlignmentSpecifier a) -- ^ alignment specifier - deriving (Show, Data,Typeable {-! ,CNode ,Functor, Annotated !-}) - - --- | Separate the declaration specifiers --- --- @__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] - , [CFunctionSpecifier a], [CAlignmentSpecifier a]) -partitionDeclSpecs = foldr deals ([],[],[],[],[],[]) where - deals (CStorageSpec sp) (sts,ats,tqs,tss,fss,ass) = (sp:sts,ats,tqs,tss,fss,ass) - deals (CTypeQual (CAttrQual attr)) (sts,ats,tqs,tss,fss,ass) = (sts,attr:ats,tqs,tss,fss,ass) - deals (CTypeQual tq) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tq:tqs,tss,fss,ass) - deals (CTypeSpec ts) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,ts:tss,fss,ass) - deals (CFunSpec fs) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,tss,fs:fss,ass) - deals (CAlignSpec as) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,tss,fss,as:ass) - --- | 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 -- ^ C11/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 - | CFloat128Type a - | CDoubleType a - | CSignedType a - | CUnsigType a - | CBoolType a - | CComplexType a - | CInt128Type 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)@ - | CAtomicType (CDeclaration a) a -- ^ @_Atomic(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) and attributes. --- --- @const@, @volatile@ and @restrict@ type qualifiers --- Additionally, @__attribute__@ annotations for declarations and declarators, and --- function specifiers -type CTypeQual = CTypeQualifier NodeInfo -data CTypeQualifier a - = CConstQual a - | CVolatQual a - | CRestrQual a - | CAtomicQual a - | CAttrQual (CAttribute a) - | CNullableQual a - | CNonnullQual a - deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) - --- | C function specifiers (C99 6.7.4) --- --- function specifiers @inline@ and @_Noreturn@ -type CFunSpec = CFunctionSpecifier NodeInfo -data CFunctionSpecifier a - = CInlineQual a - | CNoreturnQual a - deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) - --- | C alignment specifiers (C99 6.7.5) --- -type CAlignSpec = CAlignmentSpecifier NodeInfo -data CAlignmentSpecifier a - = CAlignAsType (CDeclaration a) a -- ^ @_Alignas(type)@ - | CAlignAsExpr (CExpression a) a -- ^ @_Alignas(expr)@ - 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 - | CGenericSelection (CExpression a) [(Maybe (CDeclaration a), CExpression a)] a -- ^ C11 generic selection - | 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) - fmap _f (CGenericSelection expr list annot) = - CGenericSelection (fmap _f expr) (map fmap_helper list) (_f annot) - where - fmap_helper (ma1, a2) = (fmap (fmap _f) ma1, fmap _f a2) - --- | 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)@ - | CBuiltinConvertVector (CExpression a) (CDeclaration a) a -- ^ @(expr, 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 - nodeInfo (CStaticAssert _ _ n) = nodeInfo n -instance CNode t1 => Pos (CDeclaration t1) where - posOf x = posOf (nodeInfo x) - -instance Annotated CDeclaration where - annotation (CDecl _ _ n) = n - annotation (CStaticAssert _ _ n) = n - amap f (CDecl a_1 a_2 a_3) = CDecl a_1 a_2 (f a_3) - amap f (CStaticAssert a_1 a_2 a_3) = CStaticAssert 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 - nodeInfo (CFunSpec d) = nodeInfo d - nodeInfo (CAlignSpec 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) - fmap _f (CFunSpec a1) = CFunSpec (fmap _f a1) - fmap _f (CAlignSpec a1) = CAlignSpec (fmap _f a1) - -instance Annotated CDeclarationSpecifier where - annotation (CStorageSpec n) = annotation n - annotation (CTypeSpec n) = annotation n - annotation (CTypeQual n) = annotation n - annotation (CFunSpec n) = annotation n - annotation (CAlignSpec 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) - amap f (CFunSpec n) = CFunSpec (amap f n) - amap f (CAlignSpec n) = CAlignSpec (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 (CFloat128Type 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 (CInt128Type 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 - nodeInfo (CAtomicType _ 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 (CFloat128Type a1) = CFloat128Type (_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 (CInt128Type a1) = CInt128Type (_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) - fmap _f (CAtomicType a1 a2) = CAtomicType (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 (CFloat128Type n) = n - annotation (CDoubleType n) = n - annotation (CSignedType n) = n - annotation (CUnsigType n) = n - annotation (CBoolType n) = n - annotation (CComplexType n) = n - annotation (CInt128Type n) = n - annotation (CSUType _ n) = n - annotation (CEnumType _ n) = n - annotation (CTypeDef _ n) = n - annotation (CTypeOfExpr _ n) = n - annotation (CTypeOfType _ n) = n - annotation (CAtomicType _ 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 (CFloat128Type a_1) = CFloat128Type (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 (CInt128Type a_1) = CInt128Type (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) - amap f (CAtomicType a_1 a_2) = CAtomicType 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 (CAtomicQual d) = nodeInfo d - nodeInfo (CAttrQual d) = nodeInfo d - nodeInfo (CNullableQual d) = nodeInfo d - nodeInfo (CNonnullQual 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 (CAtomicQual a1) = CAtomicQual (_f a1) - fmap _f (CAttrQual a1) = CAttrQual (fmap _f a1) - fmap _f (CNullableQual a1) = CNullableQual (_f a1) - fmap _f (CNonnullQual a1) = CNonnullQual (_f a1) - -instance Annotated CTypeQualifier where - annotation (CConstQual n) = n - annotation (CVolatQual n) = n - annotation (CRestrQual n) = n - annotation (CAtomicQual n) = n - annotation (CAttrQual n) = annotation n - annotation (CNullableQual n) = n - annotation (CNonnullQual n) = 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 (CAtomicQual a_1) = CAtomicQual (f a_1) - amap f (CAttrQual n) = CAttrQual (amap f n) - amap f (CNullableQual a_1) = CNullableQual (f a_1) - amap f (CNonnullQual a_1) = CNonnullQual (f a_1) - -instance CNode t1 => CNode (CFunctionSpecifier t1) where - nodeInfo (CInlineQual d) = nodeInfo d - nodeInfo (CNoreturnQual d) = nodeInfo d -instance CNode t1 => Pos (CFunctionSpecifier t1) where - posOf x = posOf (nodeInfo x) - -instance Functor CFunctionSpecifier where - fmap _f (CInlineQual a1) = CInlineQual (_f a1) - fmap _f (CNoreturnQual a1) = CNoreturnQual (_f a1) - -instance Annotated CFunctionSpecifier where - annotation (CInlineQual n) = n - annotation (CNoreturnQual n) = n - amap f (CInlineQual a_1) = CInlineQual (f a_1) - amap f (CNoreturnQual a_1) = CNoreturnQual (f a_1) - -instance CNode t1 => CNode (CAlignmentSpecifier t1) where - nodeInfo (CAlignAsType _ n) = nodeInfo n - nodeInfo (CAlignAsExpr _ n) = nodeInfo n -instance CNode t1 => Pos (CAlignmentSpecifier t1) where - posOf x = posOf (nodeInfo x) - -instance Functor CAlignmentSpecifier where - fmap _f (CAlignAsType a1 a2) = CAlignAsType (fmap _f a1) (_f a2) - fmap _f (CAlignAsExpr a1 a2) = CAlignAsExpr (fmap _f a1) (_f a2) - -instance Annotated CAlignmentSpecifier where - annotation (CAlignAsType _ n) = n - annotation (CAlignAsExpr _ n) = n - amap f (CAlignAsType a_1 a_2) = CAlignAsType a_1 (f a_2) - amap f (CAlignAsExpr a_1 a_2) = CAlignAsExpr a_1 (f a_2) - -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 (CGenericSelection _ _ 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 (CGenericSelection _ _ 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 (CGenericSelection a_1 a_2 a_3) - = CGenericSelection 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 - nodeInfo (CBuiltinConvertVector _ _ 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) - fmap _f (CBuiltinConvertVector a1 a2 a3) - = CBuiltinConvertVector (fmap _f a1) (fmap _f a2) (_f a3) - -instance Annotated CBuiltinThing where - annotation (CBuiltinVaArg _ _ n) = n - annotation (CBuiltinOffsetOf _ _ n) = n - annotation (CBuiltinTypesCompatible _ _ n) = n - annotation (CBuiltinConvertVector _ _ 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) - amap f (CBuiltinConvertVector a_1 a_2 a_3) = - CBuiltinConvertVector 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 +{-# LANGUAGE DeriveDataTypeable #-}+{-# 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, CFunSpec, CAlignSpec, CAttr,+ CFunctionSpecifier(..), CDeclarationSpecifier(..), CStorageSpecifier(..), CTypeSpecifier(..),+ CAlignmentSpecifier(..),+ 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(..),+ -- * Annoated type class+ Annotated(..)+) where+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 hiding (Generic)+import GHC.Generics (Generic, Generic1)+import Control.DeepSeq (NFData)++-- | 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, Generic, Generic1 {-! ,CNode ,Functor, Annotated !-})++instance NFData a => NFData (CTranslationUnit a)++-- | 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, Generic, Generic1 {-! ,CNode ,Functor, Annotated !-})++instance NFData a => NFData (CExternalDeclaration a)++-- | 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, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CFunctionDef a)++-- | 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 -- annotation+ | CStaticAssert+ (CExpression a) -- assert expression+ (CStringLiteral a) -- assert text+ a -- annotation+ deriving (Show, Data,Typeable, Generic {-! ,CNode ,Annotated !-})++instance NFData a => NFData (CDeclaration a)++-- 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)+ fmap f (CStaticAssert expression strlit annot) =+ CStaticAssert (fmap f expression) (fmap f strlit) (f annot)++-- | 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, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CDeclarator a)+++-- | 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, Generic {-! ,CNode , Annotated !-})++instance NFData a => NFData (CDerivedDeclarator a)++-- 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, Generic, Generic1 {-! , Functor !-})++instance NFData a => NFData (CArraySize a)++-- | 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, Generic {-! , CNode , Annotated !-})++instance NFData a => NFData (CStatement a)++-- 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, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CAssemblyStatement a)++-- | 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, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CAssemblyOperand a)++-- | 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, Generic, Generic1 {-! , CNode , Functor, Annotated !-})++instance NFData a => NFData (CCompoundBlockItem a)++-- | 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+ | CFunSpec (CFunctionSpecifier a) -- ^ function specifier+ | CAlignSpec (CAlignmentSpecifier a) -- ^ alignment specifier+ deriving (Show, Data,Typeable, Generic, Generic1 {-! ,CNode ,Functor, Annotated !-})++instance NFData a => NFData (CDeclarationSpecifier a)++-- | Separate the declaration specifiers+--+-- @__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]+ , [CFunctionSpecifier a], [CAlignmentSpecifier a])+partitionDeclSpecs = foldr deals ([],[],[],[],[],[]) where+ deals (CStorageSpec sp) (sts,ats,tqs,tss,fss,ass) = (sp:sts,ats,tqs,tss,fss,ass)+ deals (CTypeQual (CAttrQual attr)) (sts,ats,tqs,tss,fss,ass) = (sts,attr:ats,tqs,tss,fss,ass)+ deals (CTypeQual tq) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tq:tqs,tss,fss,ass)+ deals (CTypeSpec ts) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,ts:tss,fss,ass)+ deals (CFunSpec fs) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,tss,fs:fss,ass)+ deals (CAlignSpec as) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,tss,fss,as:ass)++-- | 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 -- ^ C11/GNUC thread local storage+ deriving (Show, Eq,Ord,Data,Typeable, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CStorageSpecifier a)++-- | 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+ | CInt128Type a+ | CFloatNType Int Bool a -- ^ IEC 60227: width (32,64,128), extended flag+ | 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)@+ | CAtomicType (CDeclaration a) a -- ^ @_Atomic(type)@+ deriving (Show, Data,Typeable, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CTypeSpecifier a)++-- | 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) and attributes.+--+-- @const@, @volatile@ and @restrict@ type qualifiers+-- Additionally, @__attribute__@ annotations for declarations and declarators, and+-- function specifiers+type CTypeQual = CTypeQualifier NodeInfo+data CTypeQualifier a+ = CConstQual a+ | CVolatQual a+ | CRestrQual a+ | CAtomicQual a+ | CAttrQual (CAttribute a)+ | CNullableQual a+ | CNonnullQual a+ deriving (Show, Data,Typeable, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CTypeQualifier a)++-- | C function specifiers (C99 6.7.4)+--+-- function specifiers @inline@ and @_Noreturn@+type CFunSpec = CFunctionSpecifier NodeInfo+data CFunctionSpecifier a+ = CInlineQual a+ | CNoreturnQual a+ deriving (Show, Data,Typeable, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CFunctionSpecifier a)++-- | C alignment specifiers (C99 6.7.5)+--+type CAlignSpec = CAlignmentSpecifier NodeInfo+data CAlignmentSpecifier a+ = CAlignAsType (CDeclaration a) a -- ^ @_Alignas(type)@+ | CAlignAsExpr (CExpression a) a -- ^ @_Alignas(expr)@+ deriving (Show, Data,Typeable, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CAlignmentSpecifier a)++-- | 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, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CStructureUnion a)++-- | A tag to determine wheter we refer to a @struct@ or @union@, see 'CStructUnion'.+data CStructTag = CStructTag+ | CUnionTag+ deriving (Show, Eq,Data,Typeable, Generic)++instance NFData CStructTag++-- | 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, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CEnumeration a)++-- | 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, Generic {-! ,CNode , Annotated !-})++instance NFData a => NFData (CInitializer a)++-- 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, Generic {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CPartDesignator a)++-- | @__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, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CAttribute a)++-- | 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+ | CGenericSelection (CExpression a) [(Maybe (CDeclaration a), CExpression a)] a -- ^ C11 generic selection+ | 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, Generic {-! ,CNode , Annotated !-})++instance NFData a => NFData (CExpression a)++-- 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)+ fmap _f (CGenericSelection expr list annot) =+ CGenericSelection (fmap _f expr) (map fmap_helper list) (_f annot)+ where+ fmap_helper (ma1, a2) = (fmap (fmap _f) ma1, fmap _f a2)++-- | 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)@+ | CBuiltinConvertVector (CExpression a) (CDeclaration a) a -- ^ @(expr, type)@+ deriving (Show, Data,Typeable, Generic {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CBuiltinThing a)++-- | 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, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CConstant a)++-- | Attributed string literals+type CStrLit = CStringLiteral NodeInfo+data CStringLiteral a = CStrLit CString a+ deriving (Show, Data,Typeable, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})++instance NFData a => NFData (CStringLiteral a)++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+ nodeInfo (CStaticAssert _ _ n) = nodeInfo n+instance CNode t1 => Pos (CDeclaration t1) where+ posOf x = posOf (nodeInfo x)++instance Annotated CDeclaration where+ annotation (CDecl _ _ n) = n+ annotation (CStaticAssert _ _ n) = n+ amap f (CDecl a_1 a_2 a_3) = CDecl a_1 a_2 (f a_3)+ amap f (CStaticAssert a_1 a_2 a_3) = CStaticAssert 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+ nodeInfo (CFunSpec d) = nodeInfo d+ nodeInfo (CAlignSpec 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)+ fmap _f (CFunSpec a1) = CFunSpec (fmap _f a1)+ fmap _f (CAlignSpec a1) = CAlignSpec (fmap _f a1)++instance Annotated CDeclarationSpecifier where+ annotation (CStorageSpec n) = annotation n+ annotation (CTypeSpec n) = annotation n+ annotation (CTypeQual n) = annotation n+ annotation (CFunSpec n) = annotation n+ annotation (CAlignSpec 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)+ amap f (CFunSpec n) = CFunSpec (amap f n)+ amap f (CAlignSpec n) = CAlignSpec (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 (CFloatNType _ _ 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 (CInt128Type 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+ nodeInfo (CAtomicType _ 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 (CFloatNType n x a1) = CFloatNType n x (_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 (CInt128Type a1) = CInt128Type (_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)+ fmap _f (CAtomicType a1 a2) = CAtomicType (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 (CFloatNType _ _ n) = n+ annotation (CDoubleType n) = n+ annotation (CSignedType n) = n+ annotation (CUnsigType n) = n+ annotation (CBoolType n) = n+ annotation (CComplexType n) = n+ annotation (CInt128Type n) = n+ annotation (CSUType _ n) = n+ annotation (CEnumType _ n) = n+ annotation (CTypeDef _ n) = n+ annotation (CTypeOfExpr _ n) = n+ annotation (CTypeOfType _ n) = n+ annotation (CAtomicType _ 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 (CFloatNType n x a_1) = CFloatNType n x (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 (CInt128Type a_1) = CInt128Type (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)+ amap f (CAtomicType a_1 a_2) = CAtomicType 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 (CAtomicQual d) = nodeInfo d+ nodeInfo (CAttrQual d) = nodeInfo d+ nodeInfo (CNullableQual d) = nodeInfo d+ nodeInfo (CNonnullQual 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 (CAtomicQual a1) = CAtomicQual (_f a1)+ fmap _f (CAttrQual a1) = CAttrQual (fmap _f a1)+ fmap _f (CNullableQual a1) = CNullableQual (_f a1)+ fmap _f (CNonnullQual a1) = CNonnullQual (_f a1)++instance Annotated CTypeQualifier where+ annotation (CConstQual n) = n+ annotation (CVolatQual n) = n+ annotation (CRestrQual n) = n+ annotation (CAtomicQual n) = n+ annotation (CAttrQual n) = annotation n+ annotation (CNullableQual n) = n+ annotation (CNonnullQual n) = 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 (CAtomicQual a_1) = CAtomicQual (f a_1)+ amap f (CAttrQual n) = CAttrQual (amap f n)+ amap f (CNullableQual a_1) = CNullableQual (f a_1)+ amap f (CNonnullQual a_1) = CNonnullQual (f a_1)++instance CNode t1 => CNode (CFunctionSpecifier t1) where+ nodeInfo (CInlineQual d) = nodeInfo d+ nodeInfo (CNoreturnQual d) = nodeInfo d+instance CNode t1 => Pos (CFunctionSpecifier t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CFunctionSpecifier where+ fmap _f (CInlineQual a1) = CInlineQual (_f a1)+ fmap _f (CNoreturnQual a1) = CNoreturnQual (_f a1)++instance Annotated CFunctionSpecifier where+ annotation (CInlineQual n) = n+ annotation (CNoreturnQual n) = n+ amap f (CInlineQual a_1) = CInlineQual (f a_1)+ amap f (CNoreturnQual a_1) = CNoreturnQual (f a_1)++instance CNode t1 => CNode (CAlignmentSpecifier t1) where+ nodeInfo (CAlignAsType _ n) = nodeInfo n+ nodeInfo (CAlignAsExpr _ n) = nodeInfo n+instance CNode t1 => Pos (CAlignmentSpecifier t1) where+ posOf x = posOf (nodeInfo x)++instance Functor CAlignmentSpecifier where+ fmap _f (CAlignAsType a1 a2) = CAlignAsType (fmap _f a1) (_f a2)+ fmap _f (CAlignAsExpr a1 a2) = CAlignAsExpr (fmap _f a1) (_f a2)++instance Annotated CAlignmentSpecifier where+ annotation (CAlignAsType _ n) = n+ annotation (CAlignAsExpr _ n) = n+ amap f (CAlignAsType a_1 a_2) = CAlignAsType a_1 (f a_2)+ amap f (CAlignAsExpr a_1 a_2) = CAlignAsExpr a_1 (f a_2)++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 (CGenericSelection _ _ 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 (CGenericSelection _ _ 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 (CGenericSelection a_1 a_2 a_3)+ = CGenericSelection 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+ nodeInfo (CBuiltinConvertVector _ _ 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)+ fmap _f (CBuiltinConvertVector a1 a2 a3)+ = CBuiltinConvertVector (fmap _f a1) (fmap _f a2) (_f a3)++instance Annotated CBuiltinThing where+ annotation (CBuiltinVaArg _ _ n) = n+ annotation (CBuiltinOffsetOf _ _ n) = n+ annotation (CBuiltinTypesCompatible _ _ n) = n+ annotation (CBuiltinConvertVector _ _ 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)+ amap f (CBuiltinConvertVector a_1 a_2 a_3) =+ CBuiltinConvertVector 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
@@ -1,296 +1,309 @@-{-# LANGUAGE DeriveDataTypeable #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Syntax.Constants --- Copyright : (c) 2007..2008 Duncan Coutts, Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- Portability : ghc --- --- This module provides support for representing, checking and exporting c --- constants, i.e. integral, float, character and string constants. ------------------------------------------------------------------------------ -module Language.C.Syntax.Constants ( - -- * Utilities - escapeChar, unescapeChar, unescapeString, - Flags(..), noFlags, setFlag, clearFlag, testFlag, - -- * C char constants (and multi-character character constants) - cChar, cChar_w, cChars, CChar(..), getCChar, getCCharAsInt, isWideChar, showCharConst, - -- * C integral constants - CIntFlag(..), CIntRepr(..), cInteger, CInteger(..), getCInteger,readCInteger, - -- * C floating point constants - cFloat, CFloat(..), readCFloat, - -- * C string literals - cString, cString_w, CString(..), getCString, showStringLit, concatCStrings, - -- * Clang C version literals - ClangCVersion(..), readClangCVersion, -) -where -import Data.Bits -import Data.Char -import Numeric (showOct, showHex, readHex, readOct, readDec) -import Data.Generics - --- | C char constants (abstract) -data CChar = CChar - !Char - !Bool -- wide flag - | CChars - [Char] -- multi-character character constant - !Bool -- wide flag - deriving (Eq,Ord,Data,Typeable) - -instance Show CChar where - showsPrec _ (CChar c wideflag) = _showWideFlag wideflag . showCharConst c - showsPrec _ (CChars cs wideflag) = _showWideFlag wideflag . sQuote (concatMap escapeCChar cs) - --- | @showCharConst c@ prepends _a_ String representing the C char constant corresponding to @c@. --- If necessary uses octal or hexadecimal escape sequences. -showCharConst :: Char -> ShowS -showCharConst c = sQuote $ escapeCChar c - -_showWideFlag :: Bool -> ShowS -_showWideFlag flag = if flag then showString "L" else id - --- | get the haskell representation of a char constant -getCChar :: CChar -> String -getCChar (CChar c _) = [c] -getCChar (CChars cs _) = cs - --- | get integer value of a C char constant --- undefined result for multi-char char constants -getCCharAsInt :: CChar -> Integer -getCCharAsInt (CChar c _) = fromIntegral (fromEnum c) -getCCharAsInt (CChars _cs _) = error "integer value of multi-character character constants is implementation defined" - --- | return @true@ if the character constant is /wide/. -isWideChar :: CChar -> Bool -isWideChar (CChar _ wideFlag) = wideFlag -isWideChar (CChars _ wideFlag) = wideFlag - --- | construct a character constant from a haskell 'Char' --- Use 'cchar_w' if you want a wide character constant. -cChar :: Char -> CChar -cChar c = CChar c False - --- | construct a wide chararacter constant -cChar_w :: Char -> CChar -cChar_w c = CChar c True - --- | create a multi-character character constant -cChars :: String -> Bool -> CChar -cChars = CChars - --- | datatype for memorizing the representation of an integer -data CIntRepr = DecRepr | HexRepr | OctalRepr deriving (Eq,Ord,Enum,Bounded,Data,Typeable) - --- | datatype representing type flags for integers -data CIntFlag = FlagUnsigned | FlagLong | FlagLongLong | FlagImag deriving (Eq,Ord,Enum,Bounded,Data,Typeable) -instance Show CIntFlag where - show FlagUnsigned = "u" - show FlagLong = "L" - show FlagLongLong = "LL" - show FlagImag = "i" - -{-# SPECIALIZE setFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-} -{-# SPECIALIZE clearFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-} -{-# SPECIALIZE testFlag :: CIntFlag -> Flags CIntFlag -> Bool #-} - -data CInteger = CInteger - !Integer - !CIntRepr - !(Flags CIntFlag) -- integer flags - deriving (Eq,Ord,Data,Typeable) -instance Show CInteger where - showsPrec _ (CInteger ig repr flags) = showInt ig . showString (concatMap showIFlag [FlagUnsigned .. ]) where - showIFlag f = if testFlag f flags then show f else [] - showInt num = case repr of DecRepr -> shows num - OctalRepr -> showString "0" . showOct num - HexRepr -> showString "0x" . showHex num - --- To be used in the lexer --- Note that the flag lexer won't scale -readCInteger :: CIntRepr -> String -> Either String CInteger -readCInteger repr str = - case readNum str of - [(n,suffix)] -> mkCInt n suffix - parseFailed -> Left $ "Bad Integer literal: "++show parseFailed - where - readNum = case repr of DecRepr -> readDec; HexRepr -> readHex; OctalRepr -> readOct - mkCInt n suffix = either Left (Right . CInteger n repr) $ readSuffix suffix - readSuffix = parseFlags noFlags - parseFlags flags [] = Right flags - parseFlags flags ('l':'l':fs) = parseFlags (setFlag FlagLongLong flags) fs - parseFlags flags ('L':'L':fs) = parseFlags (setFlag FlagLongLong flags) fs - parseFlags flags (f:fs) = - let go1 flag = parseFlags (setFlag flag flags) fs in - case f of - 'l' -> go1 FlagLong ; 'L' -> go1 FlagLong - 'u' -> go1 FlagUnsigned ; 'U' -> go1 FlagUnsigned - 'i' -> go1 FlagImag ; 'I' -> go1 FlagImag; 'j' -> go1 FlagImag; 'J' -> go1 FlagImag - _ -> Left $ "Unexpected flag " ++ show f - -getCInteger :: CInteger -> Integer -getCInteger (CInteger i _ _) = i - --- | construct a integer constant (without type flags) from a haskell integer -cInteger :: Integer -> CInteger -cInteger i = CInteger i DecRepr noFlags - - --- | Floats (represented as strings) -data CFloat = CFloat - !String - deriving (Eq,Ord,Data,Typeable) -instance Show CFloat where - showsPrec _ (CFloat internal) = showString internal - -cFloat :: Float -> CFloat -cFloat = CFloat . show - --- dummy implementation -readCFloat :: String -> CFloat -readCFloat = CFloat - --- | Clang dotted version literal --- <https://clang.llvm.org/docs/AttributeReference.html#availability> -data ClangCVersion = ClangCVersion - !String - deriving (Eq,Ord,Data,Typeable) -instance Show ClangCVersion where - showsPrec _ (ClangCVersion internal) = showString internal - -readClangCVersion :: String -> ClangCVersion -readClangCVersion = ClangCVersion - --- | C String literals -data CString = CString - String -- characters - Bool -- wide flag - deriving (Eq,Ord,Data,Typeable) -instance Show CString where - showsPrec _ (CString str wideflag) = _showWideFlag wideflag . showStringLit str - --- construction -cString :: String -> CString -cString str = CString str False -cString_w :: String -> CString -cString_w str = CString str True - --- selectors -getCString :: CString -> String -getCString (CString str _) = str -isWideString :: CString -> Bool -isWideString (CString _ wideflag) = wideflag - --- | concatenate a list of C string literals -concatCStrings :: [CString] -> CString -concatCStrings cs = CString (concatMap getCString cs) (any isWideString cs) - --- | @showStringLiteral s@ prepends a String representing the C string literal corresponding to @s@. --- If necessary it uses octal or hexadecimal escape sequences. -showStringLit :: String -> ShowS -showStringLit = dQuote . concatMap showStringChar - where - showStringChar c | isSChar c = return c - | c == '"' = "\\\"" - | otherwise = escapeChar c - - - --- | @isAsciiSourceChar b@ returns @True@ if the given character is a character which --- may appear in a ASCII C source file and is printable. -isAsciiSourceChar :: Char -> Bool -isAsciiSourceChar c = isAscii c && isPrint c - --- | @isCChar c@ returns true, if c is a source character which does not have to be escaped in --- C char constants (C99: 6.4.4.4) -isCChar :: Char -> Bool -isCChar '\\' = False -isCChar '\'' = False -isCChar '\n' = False -isCChar c = isAsciiSourceChar c - --- | @escapeCChar c@ escapes c for use in a char constant -escapeCChar :: Char -> String -escapeCChar '\'' = "\\'" -escapeCChar c | isCChar c = [c] - | otherwise = escapeChar c - --- | @isSChar c@ returns true if c is a source character which does not have to be escaped in C string --- literals (C99: 6.4.5) -isSChar :: Char -> Bool -isSChar '\\' = False -isSChar '\"' = False -isSChar '\n' = False -isSChar c = isAsciiSourceChar c - -showOct' :: Int -> String -showOct' i = replicate (3 - length s) '0' ++ s - where s = showOct i "" - -escapeChar :: Char -> String -escapeChar '\\' = "\\\\" -escapeChar '\a' = "\\a" -escapeChar '\b' = "\\b" -escapeChar '\ESC' = "\\e"; -escapeChar '\f' = "\\f" -escapeChar '\n' = "\\n" -escapeChar '\r' = "\\r" -escapeChar '\t' = "\\t" -escapeChar '\v' = "\\v" -escapeChar c | (ord c) < 512 = '\\' : showOct' (ord c) - | otherwise = '\\' : 'x' : showHex (ord c) "" - -unescapeChar :: String -> (Char, String) -unescapeChar ('\\':c:cs) = case c of - 'n' -> ('\n', cs) - 't' -> ('\t', cs) - 'v' -> ('\v', cs) - 'b' -> ('\b', cs) - 'r' -> ('\r', cs) - 'f' -> ('\f', cs) - 'a' -> ('\a', cs) - 'e' -> ('\ESC', cs) -- GNU extension - 'E' -> ('\ESC', cs) -- GNU extension - '\\' -> ('\\', cs) - '?' -> ('?', cs) - '\'' -> ('\'', cs) - '"' -> ('"', cs) - 'x' -> case head' "bad escape sequence" (readHex cs) of - (i, cs') -> (toEnum i, cs') - _ -> case head' "bad escape sequence" (readOct' (c:cs)) of - (i, cs') -> (toEnum i, cs') -unescapeChar (c :cs) = (c, cs) -unescapeChar [] = error $ "unescape char: empty string" - -readOct' :: ReadS Int -readOct' s = map (\(i, cs) -> (i, cs ++ rest)) (readOct octStr) - where octStr = takeWhile isOctDigit $ take 3 s - rest = drop (length octStr) s - -unescapeString :: String -> String -unescapeString [] = [] -unescapeString cs = case unescapeChar cs of - (c, cs') -> c : unescapeString cs' - --- helpers -sQuote :: String -> ShowS -sQuote s t = "'" ++ s ++ "'" ++ t -dQuote :: String -> ShowS -dQuote s t = ('"' : s) ++ "\"" ++ t -head' :: String -> [a] -> a -head' err [] = error err -head' _ (x:_) = x - --- TODO: Move to separate file ? -newtype Flags f = Flags Integer deriving (Eq,Ord,Data,Typeable) -noFlags :: Flags f -noFlags = Flags 0 -setFlag :: (Enum f) => f -> Flags f -> Flags f -setFlag flag (Flags k) = Flags$ k `setBit` fromEnum flag -clearFlag :: (Enum f) => f -> Flags f -> Flags f -clearFlag flag (Flags k) = Flags$ k `clearBit` fromEnum flag -testFlag :: (Enum f) => f -> Flags f -> Bool -testFlag flag (Flags k) = k `testBit` fromEnum flag +{-# LANGUAGE DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Syntax.Constants+-- Copyright : (c) 2007..2008 Duncan Coutts, Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : ghc+--+-- This module provides support for representing, checking and exporting c+-- constants, i.e. integral, float, character and string constants.+-----------------------------------------------------------------------------+module Language.C.Syntax.Constants (+ -- * Utilities+ escapeChar, unescapeChar, unescapeString,+ Flags(..), noFlags, setFlag, clearFlag, testFlag,+ -- * C char constants (and multi-character character constants)+ cChar, cChar_w, cChars, CChar(..), getCChar, getCCharAsInt, isWideChar, showCharConst,+ -- * C integral constants+ CIntFlag(..), CIntRepr(..), cInteger, CInteger(..), getCInteger,readCInteger,+ -- * C floating point constants+ cFloat, CFloat(..), readCFloat,+ -- * C string literals+ cString, cString_w, CString(..), getCString, showStringLit, concatCStrings,+ -- * Clang C version literals+ ClangCVersion(..), readClangCVersion,+)+where+import Data.Bits+import Data.Char+import Numeric (showOct, showHex, readHex, readOct, readDec)+import Data.Generics hiding (Generic)+import GHC.Generics (Generic, Generic1)+import Control.DeepSeq (NFData)++-- | C char constants (abstract)+data CChar = CChar+ !Char+ !Bool -- wide flag+ | CChars+ [Char] -- multi-character character constant+ !Bool -- wide flag+ deriving (Eq,Ord,Data,Typeable,Generic)++instance Show CChar where+ showsPrec _ (CChar c wideflag) = _showWideFlag wideflag . showCharConst c+ showsPrec _ (CChars cs wideflag) = _showWideFlag wideflag . sQuote (concatMap escapeCChar cs)++instance NFData CChar++-- | @showCharConst c@ prepends _a_ String representing the C char constant corresponding to @c@.+-- If necessary uses octal or hexadecimal escape sequences.+showCharConst :: Char -> ShowS+showCharConst c = sQuote $ escapeCChar c++_showWideFlag :: Bool -> ShowS+_showWideFlag flag = if flag then showString "L" else id++-- | get the haskell representation of a char constant+getCChar :: CChar -> String+getCChar (CChar c _) = [c]+getCChar (CChars cs _) = cs++-- | get integer value of a C char constant+-- undefined result for multi-char char constants+getCCharAsInt :: CChar -> Integer+getCCharAsInt (CChar c _) = fromIntegral (fromEnum c)+getCCharAsInt (CChars _cs _) = error "integer value of multi-character character constants is implementation defined"++-- | return @true@ if the character constant is /wide/.+isWideChar :: CChar -> Bool+isWideChar (CChar _ wideFlag) = wideFlag+isWideChar (CChars _ wideFlag) = wideFlag++-- | construct a character constant from a haskell 'Char'+-- Use 'cchar_w' if you want a wide character constant.+cChar :: Char -> CChar+cChar c = CChar c False++-- | construct a wide chararacter constant+cChar_w :: Char -> CChar+cChar_w c = CChar c True++-- | create a multi-character character constant+cChars :: String -> Bool -> CChar+cChars = CChars++-- | datatype for memorizing the representation of an integer+data CIntRepr = DecRepr | HexRepr | OctalRepr+ deriving (Eq,Ord,Enum,Bounded,Data,Typeable,Generic)++instance NFData CIntRepr++-- | datatype representing type flags for integers+data CIntFlag = FlagUnsigned | FlagLong | FlagLongLong | FlagImag+ deriving (Eq,Ord,Enum,Bounded,Data,Typeable,Generic)+instance Show CIntFlag where+ show FlagUnsigned = "u"+ show FlagLong = "L"+ show FlagLongLong = "LL"+ show FlagImag = "i"+instance NFData CIntFlag++{-# SPECIALIZE setFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}+{-# SPECIALIZE clearFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}+{-# SPECIALIZE testFlag :: CIntFlag -> Flags CIntFlag -> Bool #-}++data CInteger = CInteger+ !Integer+ !CIntRepr+ !(Flags CIntFlag) -- integer flags+ deriving (Eq,Ord,Data,Typeable,Generic)+instance Show CInteger where+ showsPrec _ (CInteger ig repr flags) = showInt ig . showString (concatMap showIFlag [FlagUnsigned .. ]) where+ showIFlag f = if testFlag f flags then show f else []+ showInt num = case repr of DecRepr -> shows num+ OctalRepr -> showString "0" . showOct num+ HexRepr -> showString "0x" . showHex num+instance NFData CInteger++-- To be used in the lexer+-- Note that the flag lexer won't scale+readCInteger :: CIntRepr -> String -> Either String CInteger+readCInteger repr str =+ case readNum str of+ [(n,suffix)] -> mkCInt n suffix+ parseFailed -> Left $ "Bad Integer literal: "++show parseFailed+ where+ readNum = case repr of DecRepr -> readDec; HexRepr -> readHex; OctalRepr -> readOct+ mkCInt n suffix = either Left (Right . CInteger n repr) $ readSuffix suffix+ readSuffix = parseFlags noFlags+ parseFlags flags [] = Right flags+ parseFlags flags ('l':'l':fs) = parseFlags (setFlag FlagLongLong flags) fs+ parseFlags flags ('L':'L':fs) = parseFlags (setFlag FlagLongLong flags) fs+ parseFlags flags (f:fs) =+ let go1 flag = parseFlags (setFlag flag flags) fs in+ case f of+ 'l' -> go1 FlagLong ; 'L' -> go1 FlagLong+ 'u' -> go1 FlagUnsigned ; 'U' -> go1 FlagUnsigned+ 'i' -> go1 FlagImag ; 'I' -> go1 FlagImag; 'j' -> go1 FlagImag; 'J' -> go1 FlagImag+ _ -> Left $ "Unexpected flag " ++ show f++getCInteger :: CInteger -> Integer+getCInteger (CInteger i _ _) = i++-- | construct a integer constant (without type flags) from a haskell integer+cInteger :: Integer -> CInteger+cInteger i = CInteger i DecRepr noFlags+++-- | Floats (represented as strings)+data CFloat = CFloat+ !String+ deriving (Eq,Ord,Data,Typeable,Generic)+instance Show CFloat where+ showsPrec _ (CFloat internal) = showString internal+instance NFData CFloat++cFloat :: Float -> CFloat+cFloat = CFloat . show++-- dummy implementation+readCFloat :: String -> CFloat+readCFloat = CFloat++-- | Clang dotted version literal+-- <https://clang.llvm.org/docs/AttributeReference.html#availability>+data ClangCVersion = ClangCVersion+ !String+ deriving (Eq,Ord,Data,Typeable)+instance Show ClangCVersion where+ showsPrec _ (ClangCVersion internal) = showString internal++readClangCVersion :: String -> ClangCVersion+readClangCVersion = ClangCVersion++-- | C String literals+data CString = CString+ String -- characters+ Bool -- wide flag+ deriving (Eq,Ord,Data,Typeable, Generic)+instance Show CString where+ showsPrec _ (CString str wideflag) = _showWideFlag wideflag . showStringLit str+instance NFData CString++-- construction+cString :: String -> CString+cString str = CString str False+cString_w :: String -> CString+cString_w str = CString str True++-- selectors+getCString :: CString -> String+getCString (CString str _) = str+isWideString :: CString -> Bool+isWideString (CString _ wideflag) = wideflag++-- | concatenate a list of C string literals+concatCStrings :: [CString] -> CString+concatCStrings cs = CString (concatMap getCString cs) (any isWideString cs)++-- | @showStringLiteral s@ prepends a String representing the C string literal corresponding to @s@.+-- If necessary it uses octal or hexadecimal escape sequences.+showStringLit :: String -> ShowS+showStringLit = dQuote . concatMap showStringChar+ where+ showStringChar c | isSChar c = return c+ | c == '"' = "\\\""+ | otherwise = escapeChar c++++-- | @isAsciiSourceChar b@ returns @True@ if the given character is a character which+-- may appear in a ASCII C source file and is printable.+isAsciiSourceChar :: Char -> Bool+isAsciiSourceChar c = isAscii c && isPrint c++-- | @isCChar c@ returns true, if c is a source character which does not have to be escaped in+-- C char constants (C99: 6.4.4.4)+isCChar :: Char -> Bool+isCChar '\\' = False+isCChar '\'' = False+isCChar '\n' = False+isCChar c = isAsciiSourceChar c++-- | @escapeCChar c@ escapes c for use in a char constant+escapeCChar :: Char -> String+escapeCChar '\'' = "\\'"+escapeCChar c | isCChar c = [c]+ | otherwise = escapeChar c++-- | @isSChar c@ returns true if c is a source character which does not have to be escaped in C string+-- literals (C99: 6.4.5)+isSChar :: Char -> Bool+isSChar '\\' = False+isSChar '\"' = False+isSChar '\n' = False+isSChar c = isAsciiSourceChar c++showOct' :: Int -> String+showOct' i = replicate (3 - length s) '0' ++ s+ where s = showOct i ""++escapeChar :: Char -> String+escapeChar '\\' = "\\\\"+escapeChar '\a' = "\\a"+escapeChar '\b' = "\\b"+escapeChar '\ESC' = "\\e";+escapeChar '\f' = "\\f"+escapeChar '\n' = "\\n"+escapeChar '\r' = "\\r"+escapeChar '\t' = "\\t"+escapeChar '\v' = "\\v"+escapeChar c | (ord c) < 512 = '\\' : showOct' (ord c)+ | otherwise = '\\' : 'x' : showHex (ord c) ""++unescapeChar :: String -> (Char, String)+unescapeChar ('\\':c:cs) = case c of+ 'n' -> ('\n', cs)+ 't' -> ('\t', cs)+ 'v' -> ('\v', cs)+ 'b' -> ('\b', cs)+ 'r' -> ('\r', cs)+ 'f' -> ('\f', cs)+ 'a' -> ('\a', cs)+ 'e' -> ('\ESC', cs) -- GNU extension+ 'E' -> ('\ESC', cs) -- GNU extension+ '\\' -> ('\\', cs)+ '?' -> ('?', cs)+ '\'' -> ('\'', cs)+ '"' -> ('"', cs)+ 'x' -> case head' "bad escape sequence" (readHex cs) of+ (i, cs') -> (toEnum i, cs')+ _ -> case head' "bad escape sequence" (readOct' (c:cs)) of+ (i, cs') -> (toEnum i, cs')+unescapeChar (c :cs) = (c, cs)+unescapeChar [] = error $ "unescape char: empty string"++readOct' :: ReadS Int+readOct' s = map (\(i, cs) -> (i, cs ++ rest)) (readOct octStr)+ where octStr = takeWhile isOctDigit $ take 3 s+ rest = drop (length octStr) s++unescapeString :: String -> String+unescapeString [] = []+unescapeString cs = case unescapeChar cs of+ (c, cs') -> c : unescapeString cs'++-- helpers+sQuote :: String -> ShowS+sQuote s t = "'" ++ s ++ "'" ++ t+dQuote :: String -> ShowS+dQuote s t = ('"' : s) ++ "\"" ++ t+head' :: String -> [a] -> a+head' err [] = error err+head' _ (x:_) = x++-- TODO: Move to separate file ?+newtype Flags f = Flags Integer deriving (Eq,Ord,Data,Typeable,Generic,Generic1)+instance NFData (Flags f)+noFlags :: Flags f+noFlags = Flags 0+setFlag :: (Enum f) => f -> Flags f -> Flags f+setFlag flag (Flags k) = Flags$ k `setBit` fromEnum flag+clearFlag :: (Enum f) => f -> Flags f -> Flags f+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
@@ -1,105 +1,113 @@-{-# LANGUAGE DeriveDataTypeable #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.Syntax.Ops --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- Portability : ghc --- --- Unary, binary and asssignment operators. Exported via AST. ------------------------------------------------------------------------------ -module Language.C.Syntax.Ops ( --- * Assignment operators -CAssignOp(..), -assignBinop, --- * Binary operators -CBinaryOp(..), -isCmpOp, -isPtrOp, -isBitOp, -isLogicOp, --- * Unary operators -CUnaryOp(..), -isEffectfulOp -) -where -import Data.Generics --- | C assignment operators (K&R A7.17) -data CAssignOp = CAssignOp - | CMulAssOp - | CDivAssOp - | CRmdAssOp -- ^ remainder and assignment - | CAddAssOp - | CSubAssOp - | CShlAssOp - | CShrAssOp - | CAndAssOp - | CXorAssOp - | 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 - | CDivOp - | CRmdOp -- ^ remainder of division - | CAddOp - | CSubOp - | CShlOp -- ^ shift left - | CShrOp -- ^ shift right - | CLeOp -- ^ less - | CGrOp -- ^ greater - | CLeqOp -- ^ less or equal - | CGeqOp -- ^ greater or equal - | CEqOp -- ^ equal - | CNeqOp -- ^ not equal - | CAndOp -- ^ bitwise and - | CXorOp -- ^ exclusive bitwise or - | COrOp -- ^ inclusive bitwise or - | CLndOp -- ^ logical and - | CLorOp -- ^ logical or - 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 - | CPreDecOp -- ^ prefix decrement operator - | CPostIncOp -- ^ postfix increment operator - | CPostDecOp -- ^ postfix decrement operator - | CAdrOp -- ^ address operator - | CIndOp -- ^ indirection operator - | CPlusOp -- ^ prefix plus - | CMinOp -- ^ prefix minus - | CCompOp -- ^ one's complement - | CNegOp -- ^ logical negation - deriving (Eq,Ord,Show,Data,Typeable) - -isEffectfulOp :: CUnaryOp -> Bool -isEffectfulOp op = op `elem` [ CPreIncOp, CPreDecOp, CPostIncOp, CPostDecOp ] +{-# LANGUAGE DeriveDataTypeable #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Syntax.Ops+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : ghc+--+-- Unary, binary and asssignment operators. Exported via AST.+-----------------------------------------------------------------------------+module Language.C.Syntax.Ops (+-- * Assignment operators+CAssignOp(..),+assignBinop,+-- * Binary operators+CBinaryOp(..),+isCmpOp,+isPtrOp,+isBitOp,+isLogicOp,+-- * Unary operators+CUnaryOp(..),+isEffectfulOp+)+where+import Data.Generics hiding (Generic)+import GHC.Generics (Generic)+import Control.DeepSeq (NFData)+-- | C assignment operators (K&R A7.17)+data CAssignOp = CAssignOp+ | CMulAssOp+ | CDivAssOp+ | CRmdAssOp -- ^ remainder and assignment+ | CAddAssOp+ | CSubAssOp+ | CShlAssOp+ | CShrAssOp+ | CAndAssOp+ | CXorAssOp+ | COrAssOp+ deriving (Eq,Ord,Show,Data,Typeable,Generic)++instance NFData CAssignOp++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+ | CDivOp+ | CRmdOp -- ^ remainder of division+ | CAddOp+ | CSubOp+ | CShlOp -- ^ shift left+ | CShrOp -- ^ shift right+ | CLeOp -- ^ less+ | CGrOp -- ^ greater+ | CLeqOp -- ^ less or equal+ | CGeqOp -- ^ greater or equal+ | CEqOp -- ^ equal+ | CNeqOp -- ^ not equal+ | CAndOp -- ^ bitwise and+ | CXorOp -- ^ exclusive bitwise or+ | COrOp -- ^ inclusive bitwise or+ | CLndOp -- ^ logical and+ | CLorOp -- ^ logical or+ deriving (Eq,Ord,Show,Data,Typeable,Generic)++instance NFData CBinaryOp++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+ | CPreDecOp -- ^ prefix decrement operator+ | CPostIncOp -- ^ postfix increment operator+ | CPostDecOp -- ^ postfix decrement operator+ | CAdrOp -- ^ address operator+ | CIndOp -- ^ indirection operator+ | CPlusOp -- ^ prefix plus+ | CMinOp -- ^ prefix minus+ | CCompOp -- ^ one's complement+ | CNegOp -- ^ logical negation+ deriving (Eq,Ord,Show,Data,Typeable,Generic)++instance NFData CUnaryOp++isEffectfulOp :: CUnaryOp -> Bool+isEffectfulOp op = op `elem` [ CPreIncOp, CPreDecOp, CPostIncOp, CPostDecOp ]
src/Language/C/Syntax/Utils.hs view
@@ -1,76 +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) - (fmap (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) +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)+ (fmap (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)
src/Language/C/System/GCC.hs view
@@ -1,114 +1,114 @@-{-# LANGUAGE PatternGuards #-} ------------------------------------------------------------------------------ --- | --- Module : Language.C.System.Gcc --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- Portability : portable --- --- Invoking gcc for preprocessing and compiling. ------------------------------------------------------------------------------ -module Language.C.System.GCC ( - GCC,newGCC, -) -where -import Language.C.Data.RList as RList -import Language.C.System.Preprocess -import Data.Maybe -import System.Process -import System.Directory -import Data.List - --- | @GCC@ represents a reference to the gcc compiler -newtype GCC = GCC { gccPath :: FilePath } - --- | create a reference to @gcc@ -newGCC :: FilePath -> GCC -newGCC = GCC - -instance Preprocessor GCC where - parseCPPArgs _ = gccParseCPPArgs - runCPP gcc cpp_args = - do -- copy the input to the outputfile, because in case the input is preprocessed, - -- gcc -E will do nothing. - maybe (return()) (copyWritable (inputFile cpp_args)) (outputFile cpp_args) - rawSystem (gccPath gcc) (buildCppArgs cpp_args) - where copyWritable source target = do copyFile source target - p <- getPermissions target - setPermissions target p{writable=True} - --- | Parse arguments for preprocessing via GCC. --- At least one .c, .hc or .h file has to be present. --- For now we only support the most important gcc options. --- --- 1) Parse all flags relevant to CppArgs --- 2) Move -c,-S,-M? to other_args --- 3) Strip -E --- 4) The rest goes into extra_args -gccParseCPPArgs :: [String] -> Either String (CppArgs, [String]) -gccParseCPPArgs args = - case mungeArgs ((Nothing,Nothing,RList.empty),(RList.empty,RList.empty)) args of - Left err -> Left err - Right ((Nothing,_,_),_) -> Left "No .c / .hc / .h source file given" - Right ((Just input_file,output_file_opt,cpp_opts),(extra_args,other_args)) - -> Right ((rawCppArgs (RList.reverse extra_args) input_file) - { outputFile = output_file_opt, cppOptions = RList.reverse cpp_opts }, - RList.reverse other_args) - where - mungeArgs :: ParseArgsState -> [String] -> Either String ParseArgsState - mungeArgs parsed@( cpp_args@(inp,out,cpp_opts), - unparsed@(extra,other)) - unparsed_args = - case unparsed_args of - ("-E":rest) -> mungeArgs parsed rest - - (flag:flagArg:rest) | flag == "-MF" - || flag == "-MT" - || flag == "-MQ" - -> mungeArgs (cpp_args,(extra,other `snoc` flag `snoc` flagArg)) rest - - (flag:rest) | flag == "-c" - || flag == "-S" - || "-M" `isPrefixOf` flag - -> mungeArgs (cpp_args,(extra,other `snoc` flag)) rest - - ("-o":file:rest) | isJust out -> Left "two output files given" - | otherwise -> mungeArgs ((inp,Just file,cpp_opts),unparsed) rest - - (cpp_opt:rest) | Just (opt,rest') <- getArgOpt cpp_opt rest - -> mungeArgs ((inp,out,cpp_opts `snoc` opt),unparsed) rest' - - (cfile:rest) | any (`isSuffixOf` cfile) (words ".c .hc .h") - -> if isJust inp - then Left "two input files given" - else mungeArgs ((Just cfile,out,cpp_opts),unparsed) rest - - (unknown:rest) -> mungeArgs (cpp_args,(extra `snoc` unknown,other)) rest - - [] -> Right parsed - - getArgOpt cpp_opt rest | "-I" `isPrefixOf` cpp_opt = Just (IncludeDir (drop 2 cpp_opt),rest) - | "-U" `isPrefixOf` cpp_opt = Just (Undefine (drop 2 cpp_opt),rest) - | "-D" `isPrefixOf` cpp_opt = Just (getDefine (drop 2 cpp_opt),rest) - getArgOpt "-include" (f:rest') = Just (IncludeFile f, rest') - getArgOpt _ _ = Nothing - getDefine opt = let (key,val) = break (== '=') opt in Define key (if null val then "" else tail val) - -type ParseArgsState = ((Maybe FilePath, Maybe FilePath, RList CppOption), (RList String, RList String)) - - -buildCppArgs :: CppArgs -> [String] -buildCppArgs (CppArgs options extra_args _tmpdir input_file output_file_opt) = - (concatMap tOption options) - ++ outputFileOpt - ++ ["-E", input_file] - ++ extra_args - where - tOption (IncludeDir incl) = ["-I",incl] - tOption (Define key value) = [ "-D" ++ key ++ (if null value then "" else "=" ++ value) ] - tOption (Undefine key) = [ "-U" ++ key ] - tOption (IncludeFile f) = [ "-include", f] - outputFileOpt = concat [ ["-o",output_file] | output_file <- maybeToList output_file_opt ] - +{-# LANGUAGE PatternGuards #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.C.System.Gcc+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : portable+--+-- Invoking gcc for preprocessing and compiling.+-----------------------------------------------------------------------------+module Language.C.System.GCC (+ GCC,newGCC,+)+where+import Language.C.Data.RList as RList+import Language.C.System.Preprocess+import Data.Maybe+import System.Process+import System.Directory+import Data.List++-- | @GCC@ represents a reference to the gcc compiler+newtype GCC = GCC { gccPath :: FilePath }++-- | create a reference to @gcc@+newGCC :: FilePath -> GCC+newGCC = GCC++instance Preprocessor GCC where+ parseCPPArgs _ = gccParseCPPArgs+ runCPP gcc cpp_args =+ do -- copy the input to the outputfile, because in case the input is preprocessed,+ -- gcc -E will do nothing.+ maybe (return()) (copyWritable (inputFile cpp_args)) (outputFile cpp_args)+ rawSystem (gccPath gcc) (buildCppArgs cpp_args)+ where copyWritable source target = do copyFile source target+ p <- getPermissions target+ setPermissions target p{writable=True}++-- | Parse arguments for preprocessing via GCC.+-- At least one .c, .hc or .h file has to be present.+-- For now we only support the most important gcc options.+--+-- 1) Parse all flags relevant to CppArgs+-- 2) Move -c,-S,-M? to other_args+-- 3) Strip -E+-- 4) The rest goes into extra_args+gccParseCPPArgs :: [String] -> Either String (CppArgs, [String])+gccParseCPPArgs args =+ case mungeArgs ((Nothing,Nothing,RList.empty),(RList.empty,RList.empty)) args of+ Left err -> Left err+ Right ((Nothing,_,_),_) -> Left "No .c / .hc / .h source file given"+ Right ((Just input_file,output_file_opt,cpp_opts),(extra_args,other_args))+ -> Right ((rawCppArgs (RList.reverse extra_args) input_file)+ { outputFile = output_file_opt, cppOptions = RList.reverse cpp_opts },+ RList.reverse other_args)+ where+ mungeArgs :: ParseArgsState -> [String] -> Either String ParseArgsState+ mungeArgs parsed@( cpp_args@(inp,out,cpp_opts),+ unparsed@(extra,other))+ unparsed_args =+ case unparsed_args of+ ("-E":rest) -> mungeArgs parsed rest++ (flag:flagArg:rest) | flag == "-MF"+ || flag == "-MT"+ || flag == "-MQ"+ -> mungeArgs (cpp_args,(extra,other `snoc` flag `snoc` flagArg)) rest++ (flag:rest) | flag == "-c"+ || flag == "-S"+ || "-M" `isPrefixOf` flag+ -> mungeArgs (cpp_args,(extra,other `snoc` flag)) rest++ ("-o":file:rest) | isJust out -> Left "two output files given"+ | otherwise -> mungeArgs ((inp,Just file,cpp_opts),unparsed) rest++ (cpp_opt:rest) | Just (opt,rest') <- getArgOpt cpp_opt rest+ -> mungeArgs ((inp,out,cpp_opts `snoc` opt),unparsed) rest'++ (cfile:rest) | any (`isSuffixOf` cfile) (words ".c .hc .h")+ -> if isJust inp+ then Left "two input files given"+ else mungeArgs ((Just cfile,out,cpp_opts),unparsed) rest++ (unknown:rest) -> mungeArgs (cpp_args,(extra `snoc` unknown,other)) rest++ [] -> Right parsed++ getArgOpt cpp_opt rest | "-I" `isPrefixOf` cpp_opt = Just (IncludeDir (drop 2 cpp_opt),rest)+ | "-U" `isPrefixOf` cpp_opt = Just (Undefine (drop 2 cpp_opt),rest)+ | "-D" `isPrefixOf` cpp_opt = Just (getDefine (drop 2 cpp_opt),rest)+ getArgOpt "-include" (f:rest') = Just (IncludeFile f, rest')+ getArgOpt _ _ = Nothing+ getDefine opt = let (key,val) = break (== '=') opt in Define key (if null val then "" else tail val)++type ParseArgsState = ((Maybe FilePath, Maybe FilePath, RList CppOption), (RList String, RList String))+++buildCppArgs :: CppArgs -> [String]+buildCppArgs (CppArgs options extra_args _tmpdir input_file output_file_opt) =+ (concatMap tOption options)+ ++ outputFileOpt+ ++ ["-E", input_file]+ ++ extra_args+ where+ tOption (IncludeDir incl) = ["-I",incl]+ tOption (Define key value) = [ "-D" ++ key ++ (if null value then "" else "=" ++ value) ]+ tOption (Undefine key) = [ "-U" ++ key ]+ tOption (IncludeFile f) = [ "-include", f]+ outputFileOpt = concat [ ["-o",output_file] | output_file <- maybeToList output_file_opt ]+
src/Language/C/System/Preprocess.hs view
@@ -1,123 +1,123 @@------------------------------------------------------------------------------ --- | --- Module : Language.C.Wrapper.Preprocess --- Copyright : (c) 2008 Benedikt Huber --- License : BSD-style --- Maintainer : benedikt.huber@gmail.com --- Stability : experimental --- Portability : portable --- --- Invoking external preprocessors. ------------------------------------------------------------------------------ -module Language.C.System.Preprocess ( - Preprocessor(..), - CppOption(..), - CppArgs(..),rawCppArgs,addCppOption,addExtraOption,cppFile, - runPreprocessor, - isPreprocessed, -) -where -import Language.C.Data.InputStream -import System.Exit -import System.Directory -import System.FilePath -import System.IO -import Control.Exception -import Control.Monad -import Data.List - --- | 'Preprocessor' encapsulates the abstract interface for invoking C preprocessors -class Preprocessor cpp where - -- | parse the given command line arguments, and return a pair of parsed and ignored arguments - parseCPPArgs :: cpp -> [String] -> Either String (CppArgs, [String]) - -- | run the preprocessor - runCPP :: cpp -> CppArgs -> IO ExitCode - --- | file extension of a preprocessed file -preprocessedExt :: String -preprocessedExt = ".i" - --- | Generic Options for the preprocessor -data CppOption = - IncludeDir FilePath - | Define String String - | Undefine String - | IncludeFile FilePath - --- | Generic arguments for the preprocessor -data CppArgs = CppArgs { - cppOptions :: [CppOption], - extraOptions :: [String], - cppTmpDir :: Maybe FilePath, - inputFile :: FilePath, - outputFile :: Maybe FilePath - } - --- | Cpp arguments that only specify the input file name. -cppFile :: FilePath -> CppArgs -cppFile input_file = CppArgs { cppOptions = [], extraOptions = [], cppTmpDir = Nothing, inputFile = input_file, outputFile = Nothing } - - --- | use the given preprocessor arguments without analyzing them -rawCppArgs :: [String] -> FilePath -> CppArgs -rawCppArgs opts input_file = - CppArgs { inputFile = input_file, cppOptions = [], extraOptions = opts, outputFile = Nothing, cppTmpDir = Nothing } - --- | add a typed option to the given preprocessor arguments -addCppOption :: CppArgs -> CppOption -> CppArgs -addCppOption cpp_args opt = - cpp_args { cppOptions = opt : cppOptions cpp_args } - --- | add a string option to the given preprocessor arguments -addExtraOption :: CppArgs -> String -> CppArgs -addExtraOption cpp_args extra = - cpp_args { extraOptions = extra : extraOptions cpp_args } - --- | run the preprocessor and return an 'InputStream' if preprocesssing succeeded -runPreprocessor :: (Preprocessor cpp) => cpp -> CppArgs -> IO (Either ExitCode InputStream) -runPreprocessor cpp cpp_args = - bracket - getActualOutFile - -- remove outfile if it was temporary - removeTmpOutFile - -- invoke preprocessor - invokeCpp - where - getActualOutFile :: IO FilePath - getActualOutFile = maybe (mkOutputFile (cppTmpDir cpp_args) (inputFile cpp_args)) return (outputFile cpp_args) - invokeCpp actual_out_file = do - exit_code <- runCPP cpp (cpp_args { outputFile = Just actual_out_file}) - case exit_code of - ExitSuccess -> liftM Right (readInputStream actual_out_file) - ExitFailure _ -> return $ Left exit_code - removeTmpOutFile out_file = maybe (removeFile out_file) (\_ -> return ()) (outputFile cpp_args) - --- | create an output file, given @Maybe tmpdir@ and @inputfile@ -mkOutputFile :: Maybe FilePath -> FilePath -> IO FilePath -mkOutputFile tmp_dir_opt input_file = - do tmpDir <- getTempDir tmp_dir_opt - mkTmpFile tmpDir (getOutputFileName input_file) - where - getTempDir (Just tmpdir) = return tmpdir - getTempDir Nothing = getTemporaryDirectory - --- | compute output file name from input file name -getOutputFileName :: FilePath -> FilePath -getOutputFileName fp | hasExtension fp = replaceExtension filename preprocessedExt - | otherwise = addExtension filename preprocessedExt - where - filename = takeFileName fp - --- | create a temporary file -mkTmpFile :: FilePath -> FilePath -> IO FilePath -mkTmpFile tmp_dir file_templ = do - -- putStrLn $ "TmpDir: "++tmp_dir - -- putStrLn $ "FileTempl: "++file_templ - (path,file_handle) <- openTempFile tmp_dir file_templ - hClose file_handle - return path - --- | guess whether a file is preprocessed (file end with .i) -isPreprocessed :: FilePath -> Bool -isPreprocessed = (".i" `isSuffixOf`) - +-----------------------------------------------------------------------------+-- |+-- Module : Language.C.Wrapper.Preprocess+-- Copyright : (c) 2008 Benedikt Huber+-- License : BSD-style+-- Maintainer : benedikt.huber@gmail.com+-- Stability : experimental+-- Portability : portable+--+-- Invoking external preprocessors.+-----------------------------------------------------------------------------+module Language.C.System.Preprocess (+ Preprocessor(..),+ CppOption(..),+ CppArgs(..),rawCppArgs,addCppOption,addExtraOption,cppFile,+ runPreprocessor,+ isPreprocessed,+)+where+import Language.C.Data.InputStream+import System.Exit+import System.Directory+import System.FilePath+import System.IO+import Control.Exception+import Control.Monad+import Data.List++-- | 'Preprocessor' encapsulates the abstract interface for invoking C preprocessors+class Preprocessor cpp where+ -- | parse the given command line arguments, and return a pair of parsed and ignored arguments+ parseCPPArgs :: cpp -> [String] -> Either String (CppArgs, [String])+ -- | run the preprocessor+ runCPP :: cpp -> CppArgs -> IO ExitCode++-- | file extension of a preprocessed file+preprocessedExt :: String+preprocessedExt = ".i"++-- | Generic Options for the preprocessor+data CppOption =+ IncludeDir FilePath+ | Define String String+ | Undefine String+ | IncludeFile FilePath++-- | Generic arguments for the preprocessor+data CppArgs = CppArgs {+ cppOptions :: [CppOption],+ extraOptions :: [String],+ cppTmpDir :: Maybe FilePath,+ inputFile :: FilePath,+ outputFile :: Maybe FilePath+ }++-- | Cpp arguments that only specify the input file name.+cppFile :: FilePath -> CppArgs+cppFile input_file = CppArgs { cppOptions = [], extraOptions = [], cppTmpDir = Nothing, inputFile = input_file, outputFile = Nothing }+++-- | use the given preprocessor arguments without analyzing them+rawCppArgs :: [String] -> FilePath -> CppArgs+rawCppArgs opts input_file =+ CppArgs { inputFile = input_file, cppOptions = [], extraOptions = opts, outputFile = Nothing, cppTmpDir = Nothing }++-- | add a typed option to the given preprocessor arguments+addCppOption :: CppArgs -> CppOption -> CppArgs+addCppOption cpp_args opt =+ cpp_args { cppOptions = opt : cppOptions cpp_args }++-- | add a string option to the given preprocessor arguments+addExtraOption :: CppArgs -> String -> CppArgs+addExtraOption cpp_args extra =+ cpp_args { extraOptions = extra : extraOptions cpp_args }++-- | run the preprocessor and return an 'InputStream' if preprocesssing succeeded+runPreprocessor :: (Preprocessor cpp) => cpp -> CppArgs -> IO (Either ExitCode InputStream)+runPreprocessor cpp cpp_args =+ bracket+ getActualOutFile+ -- remove outfile if it was temporary+ removeTmpOutFile+ -- invoke preprocessor+ invokeCpp+ where+ getActualOutFile :: IO FilePath+ getActualOutFile = maybe (mkOutputFile (cppTmpDir cpp_args) (inputFile cpp_args)) return (outputFile cpp_args)+ invokeCpp actual_out_file = do+ exit_code <- runCPP cpp (cpp_args { outputFile = Just actual_out_file})+ case exit_code of+ ExitSuccess -> liftM Right (readInputStream actual_out_file)+ ExitFailure _ -> return $ Left exit_code+ removeTmpOutFile out_file = maybe (removeFile out_file) (\_ -> return ()) (outputFile cpp_args)++-- | create an output file, given @Maybe tmpdir@ and @inputfile@+mkOutputFile :: Maybe FilePath -> FilePath -> IO FilePath+mkOutputFile tmp_dir_opt input_file =+ do tmpDir <- getTempDir tmp_dir_opt+ mkTmpFile tmpDir (getOutputFileName input_file)+ where+ getTempDir (Just tmpdir) = return tmpdir+ getTempDir Nothing = getTemporaryDirectory++-- | compute output file name from input file name+getOutputFileName :: FilePath -> FilePath+getOutputFileName fp | hasExtension fp = replaceExtension filename preprocessedExt+ | otherwise = addExtension filename preprocessedExt+ where+ filename = takeFileName fp++-- | create a temporary file+mkTmpFile :: FilePath -> FilePath -> IO FilePath+mkTmpFile tmp_dir file_templ = do+ -- putStrLn $ "TmpDir: "++tmp_dir+ -- putStrLn $ "FileTempl: "++file_templ+ (path,file_handle) <- openTempFile tmp_dir file_templ+ hClose file_handle+ return path++-- | guess whether a file is preprocessed (file end with .i)+isPreprocessed :: FilePath -> Bool+isPreprocessed = (".i" `isSuffixOf`)+
test/harness/run-harness.hs view
@@ -1,70 +1,70 @@-module Main where - -import Data.List (intercalate) -import System.Exit (ExitCode(..), exitFailure, exitSuccess, exitWith) -import System.Directory (doesDirectoryExist, doesFileExist, getCurrentDirectory, setCurrentDirectory, - getDirectoryContents) -import System.FilePath ((</>)) -import System.Process (readProcessWithExitCode, callProcess) -import System.IO (hPutStrLn, hPrint, stderr) -import Control.Monad (filterM, liftM, when) - -testDirs :: [String] -testDirs = ["test/harness","harness","."] - -getActualTestDirectory :: [String] -> IO FilePath -getActualTestDirectory test_dirs = do - validDirs <- filterM (doesFileExist . (</> "run-harness.hs")) test_dirs - case validDirs of - [] -> ioError (userError ("run-harness.hs not found in " ++ intercalate " or " test_dirs)) - (d:_) -> return d - -subdirectoriesOf :: FilePath -> IO [FilePath] -subdirectoriesOf fp = do - entries <- getDirectoryContents fp - filterM (doesDirectoryExist . (fp </>)) (filter (not . isSpecialDir) entries) - where - isSpecialDir "." = True - isSpecialDir ".." = True - isSpecialDir _ = False - --- from Control.Monad.Extra -findM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a) -findM _ [] = return Nothing -findM p (x:xs) = do guard <- p x ; if guard then (return $ Just x) else (findM p xs) - -main :: IO ExitCode -main = do - actual_test_dir <- getActualTestDirectory testDirs - has_makefile <- doesFileExist (actual_test_dir </> "Makefile") - when (not has_makefile) $ do - hPutStrLn stderr "No Makefile found (out of source tree)" - hPutStrLn stderr "Skipping harness test" - exitWith ExitSuccess - tests <- subdirectoriesOf actual_test_dir - cdir <- getCurrentDirectory - hPutStrLn stderr ("Changing to test directory " ++ actual_test_dir ++ " and compiling") - -- build test executables - setCurrentDirectory (cdir</>actual_test_dir) - callProcess "make" ["prepare"] - -- run harness tests - hasFailure <- findM (liftM (/= ExitSuccess) . runTest . (cdir</>) . (actual_test_dir</>)) tests - setCurrentDirectory cdir - case hasFailure of - Nothing -> exitSuccess - Just _failed -> exitFailure - where - runTest :: FilePath -> IO ExitCode - runTest dir = do - setCurrentDirectory dir - (exitCode, _outp, _errp) <- readProcessWithExitCode "make" [] "" - hPutStrLn stderr ("cd " ++ dir ++ " && make: " ++ show exitCode) - when (exitCode /= ExitSuccess) $ do - hPutStrLn stderr "=== Standard Output ===" - hPutStrLn stderr _outp - hPutStrLn stderr "=== Error Output ===" - hPutStrLn stderr _errp - hPutStrLn stderr "=== End of Output ===" - return exitCode - - +module Main where++import Data.List (intercalate)+import System.Exit (ExitCode(..), exitFailure, exitSuccess, exitWith)+import System.Directory (doesDirectoryExist, doesFileExist, getCurrentDirectory, setCurrentDirectory,+ getDirectoryContents)+import System.FilePath ((</>))+import System.Process (readProcessWithExitCode, callProcess)+import System.IO (hPutStrLn, hPrint, stderr)+import Control.Monad (filterM, liftM, when)++testDirs :: [String]+testDirs = ["test/harness","harness","."]++getActualTestDirectory :: [String] -> IO FilePath+getActualTestDirectory test_dirs = do+ validDirs <- filterM (doesFileExist . (</> "run-harness.hs")) test_dirs+ case validDirs of+ [] -> ioError (userError ("run-harness.hs not found in " ++ intercalate " or " test_dirs))+ (d:_) -> return d++subdirectoriesOf :: FilePath -> IO [FilePath]+subdirectoriesOf fp = do+ entries <- getDirectoryContents fp+ filterM (doesDirectoryExist . (fp </>)) (filter (not . isSpecialDir) entries)+ where+ isSpecialDir "." = True+ isSpecialDir ".." = True+ isSpecialDir _ = False++-- from Control.Monad.Extra+findM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)+findM _ [] = return Nothing+findM p (x:xs) = do guard <- p x ; if guard then (return $ Just x) else (findM p xs)++main :: IO ExitCode+main = do+ actual_test_dir <- getActualTestDirectory testDirs+ has_makefile <- doesFileExist (actual_test_dir </> "Makefile")+ when (not has_makefile) $ do+ hPutStrLn stderr "No Makefile found (out of source tree)"+ hPutStrLn stderr "Skipping harness test"+ exitWith ExitSuccess+ tests <- subdirectoriesOf actual_test_dir+ cdir <- getCurrentDirectory+ hPutStrLn stderr ("Changing to test directory " ++ actual_test_dir ++ " and compiling")+ -- build test executables+ setCurrentDirectory (cdir</>actual_test_dir)+ callProcess "make" ["prepare"]+ -- run harness tests+ hasFailure <- findM (liftM (/= ExitSuccess) . runTest . (cdir</>) . (actual_test_dir</>)) tests+ setCurrentDirectory cdir+ case hasFailure of+ Nothing -> exitSuccess+ Just _failed -> exitFailure+ where+ runTest :: FilePath -> IO ExitCode+ runTest dir = do+ setCurrentDirectory dir+ (exitCode, _outp, _errp) <- readProcessWithExitCode "make" [] ""+ hPutStrLn stderr ("cd " ++ dir ++ " && make: " ++ show exitCode)+ when (exitCode /= ExitSuccess) $ do+ hPutStrLn stderr "=== Standard Output ==="+ hPutStrLn stderr _outp+ hPutStrLn stderr "=== Error Output ==="+ hPutStrLn stderr _errp+ hPutStrLn stderr "=== End of Output ==="+ return exitCode++