bindings-bfd 1.0.0 → 1.2.0.0
raw patch · 19 files changed
+1124/−691 lines, 19 filesdep ~arraydep ~basedep ~containers
Dependency ranges changed: array, base, containers, unix
Files
- bindings-bfd.cabal +10/−8
- dist/build/Bindings/Bfd/Disasm/I386/Lex.hs +14/−14
- dist/build/Bindings/Bfd/Disasm/I386/Parse.hs +37/−23
- src/Bindings/Bfd.hs-boot +19/−10
- src/Bindings/Bfd.hsc +190/−61
- src/Bindings/Bfd/Disasm/I386/Cell.hs +30/−0
- src/Bindings/Bfd/Disasm/I386/CondCode.hs +19/−4
- src/Bindings/Bfd/Disasm/I386/EffectiveAddr.hs +13/−2
- src/Bindings/Bfd/Disasm/I386/Insn.hs +2/−1
- src/Bindings/Bfd/Disasm/I386/Lex.x +2/−0
- src/Bindings/Bfd/Disasm/I386/Mnemonic.hs +313/−200
- src/Bindings/Bfd/Disasm/I386/Operand.hs +14/−3
- src/Bindings/Bfd/Disasm/I386/Parse.y +13/−9
- src/Bindings/Bfd/Disasm/I386/Register.hs +131/−0
- src/Bindings/Bfd/Disasm/I386/Term.hs +41/−21
- src/Bindings/Bfd/Symbol.hsc +19/−14
- src/Bindings/Bfd/SymbolTable.hs +7/−2
- src/Bindings/Bfd/Target.hs-boot +7/−3
- src/Bindings/Bfd/Target.hsc +243/−316
bindings-bfd.cabal view
@@ -1,10 +1,10 @@ name: bindings-bfd-version: 1.0.0+version: 1.2.0.0 cabal-version: >= 1.4 build-type: Simple license: LGPL-3 license-file: LICENSE-copyright: (c) 2009,2010,2011 Mick Nelso+copyright: (c) 2009-2012 Mick Nelso author: Mick Nelso maintainer: mcnster@gmail.com stability: alpha@@ -15,11 +15,11 @@ description: These are bindings for `libbfd', a library of the GNU `binutils' package. The bindings let a Haskell program query the structure of any executable, object, or - library file format supported by the GNU Project (alot).+ library file format supported by the GNU Project (many). It also has support for disassembly of code in these files where available. category: FFI, Development-tested-with: GHC==7.0.3+tested-with: GHC==7.0.4 extra-source-files: README, LICENSE, TODO,@@ -30,6 +30,7 @@ exposed-modules: Bindings.Bfd Bindings.Bfd.Disasm Bindings.Bfd.Disasm.I386.Address+ Bindings.Bfd.Disasm.I386.Cell Bindings.Bfd.Disasm.I386.CondCode Bindings.Bfd.Disasm.I386.EffectiveAddr Bindings.Bfd.Disasm.I386.Insn@@ -40,6 +41,7 @@ Bindings.Bfd.Disasm.I386.Parse Bindings.Bfd.Disasm.I386.Precision Bindings.Bfd.Disasm.I386.Prefix+ Bindings.Bfd.Disasm.I386.Register Bindings.Bfd.Disasm.I386.Term Bindings.Bfd.Disasm.I386.XmmType Bindings.Bfd.Disasm.Info@@ -58,10 +60,10 @@ Bindings.Bfd.Symbol.Flags Bindings.Bfd.SymbolTable Bindings.Bfd.Target- build-depends: array >= 0.3 && < 1,- base >= 4.1.0.0 && < 5,- containers >= 0.2.0.1 && < 1,- unix >= 2.3.2.0 && < 3+ build-depends: array >= 0.3 && < 0.4,+ base >= 4.3 && < 4.4,+ containers >= 0.4 && < 0.5,+ unix >= 2.4 && < 2.5 hs-source-dirs: src extensions: CPP, ForeignFunctionInterface
dist/build/Bindings/Bfd/Disasm/I386/Lex.hs view
@@ -28,7 +28,6 @@ #endif {-# LINE 1 "templates/wrappers.hs" #-} {-# LINE 1 "templates/wrappers.hs" #-}-{-# LINE 1 "<built-in>" #-} {-# LINE 1 "<command-line>" #-} {-# LINE 1 "templates/wrappers.hs" #-} -- -----------------------------------------------------------------------------@@ -120,19 +119,19 @@ -- For compatibility with previous versions of Alex, and because we can. alex_base :: AlexAddr-alex_base = AlexA# "\xf6\xff\xff\xff\xfc\xff\xff\xff\x00\x00\x00\x00\xdc\xff\xff\xff\x43\x00\x00\x00\x5d\x00\x00\x00\xaa\x00\x00\x00\xc4\x00\x00\x00\x1f\x01\x00\x00\x10\x01\x00\x00\x6c\x01\x00\x00\x86\x01\x00\x00\x92\x01\x00\x00\xd4\xff\xff\xff\x8d\xff\xff\xff\xdf\x01\x00\x00\xf9\x01\x00\x00\x44\x02\x00\x00\x4e\x02\x00\x00\xd6\xff\xff\xff\x93\xff\xff\xff\x58\x02\x00\x00\x62\x02\x00\x00\xe7\xff\xff\xff\xa0\xff\xff\xff\x99\x02\x00\x00\xb3\x02\x00\x00\x00\x03\x00\x00\x1a\x03\x00\x00\x67\x03\x00\x00\x81\x03\x00\x00\xcc\x03\x00\x00\xe6\x03\x00\x00\x33\x04\x00\x00\x4d\x04\x00\x00\xa8\x04\x00\x00\xc2\x04\x00\x00\x0d\x05\x00\x00\x27\x05\x00\x00\x72\x05\x00\x00\x8c\x05\x00\x00\xd9\x05\x00\x00\xf3\x05\x00\x00\x3e\x06\x00\x00\x58\x06\x00\x00\xab\x06\x00\x00\xc5\x06\x00\x00\xfd\xff\xff\xff\xc9\xff\xff\xff\x00\x00\x00\x00\xc2\xff\xff\xff\xc4\xff\xff\xff\xcd\xff\xff\xff\x09\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x4d\x00\x00\x00\x18\x07\x00\x00\x32\x07\x00\x00\x7f\x07\x00\x00\x00\x00\x00\x00\xc3\xff\xff\xff\x00\x00\x00\x00\xd3\xff\xff\xff\xd7\xff\xff\xff\xd5\xff\xff\xff\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#+alex_base = AlexA# "\xf6\xff\xff\xff\xfc\xff\xff\xff\x00\x00\x00\x00\x10\x00\x00\x00\x5f\x00\x00\x00\x79\x00\x00\x00\xc8\x00\x00\x00\xe2\x00\x00\x00\x3d\x01\x00\x00\x2e\x01\x00\x00\x8c\x01\x00\x00\xa6\x01\x00\x00\xe1\x01\x00\x00\xd4\xff\xff\xff\x8d\xff\xff\xff\xfb\x01\x00\x00\x4a\x02\x00\x00\x64\x02\x00\x00\x6e\x02\x00\x00\xd6\xff\xff\xff\x92\xff\xff\xff\xa5\x02\x00\x00\xaf\x02\x00\x00\xdb\xff\xff\xff\x94\xff\xff\xff\xb9\x02\x00\x00\x04\x03\x00\x00\x1e\x03\x00\x00\x6d\x03\x00\x00\x87\x03\x00\x00\xe2\x03\x00\x00\xfc\x03\x00\x00\x47\x04\x00\x00\x61\x04\x00\x00\xb0\x04\x00\x00\xca\x04\x00\x00\x15\x05\x00\x00\x2f\x05\x00\x00\x8a\x05\x00\x00\xa4\x05\x00\x00\xef\x05\x00\x00\x09\x06\x00\x00\x64\x06\x00\x00\x7e\x06\x00\x00\xc9\x06\x00\x00\xe3\x06\x00\x00\x3e\x07\x00\x00\xed\xff\xff\xff\xbf\xff\xff\xff\x00\x00\x00\x00\xac\xff\xff\xff\xae\xff\xff\xff\xad\xff\xff\xff\xe7\xff\xff\xff\x00\x00\x00\x00\xe9\xff\xff\xff\x1a\x00\x00\x00\x58\x07\x00\x00\xa3\x07\x00\x00\xbd\x07\x00\x00\x00\x00\x00\x00\xa0\xff\xff\xff\x00\x00\x00\x00\xa4\xff\xff\xff\xc3\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xff\xff\xff\xb7\xff\xff\xff\xb9\xff\xff\xff\xf8\xff\xff\xff\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\x01\x00\x01\x00\x01\x00\x0e\x00\x0b\x00\x14\x00\x01\x00\x01\x00\x01\x00\x3d\x00\x12\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x01\x00\x18\x00\x16\x00\x46\x00\x13\x00\x3a\x00\x01\x00\x2c\x00\x3f\x00\x43\x00\x47\x00\x2f\x00\x44\x00\x0d\x00\x33\x00\x34\x00\x0f\x00\x10\x00\x10\x00\x3b\x00\x10\x00\x3b\x00\x3b\x00\x3b\x00\x10\x00\x3b\x00\x45\x00\x35\x00\x31\x00\x36\x00\x17\x00\x40\x00\x3c\x00\x3e\x00\x41\x00\x42\x00\x00\x00\x00\x00\x3c\x00\x04\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x03\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x1b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x21\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x05\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x06\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x07\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x08\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x02\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\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3d\x00\x00\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\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\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x3d\x00\x00\x00\x0a\x00\x0a\x00\x0a\x00\x0a\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\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\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\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x0c\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\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\x00\x00\x00\x00\x00\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\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\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x1c\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x1d\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x1e\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\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\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\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\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x22\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x23\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x2e\x00\x3b\x00\x3b\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\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\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\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x29\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x26\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\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\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\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\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x2a\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\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\x30\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#+alex_table = AlexA# "\x00\x00\x01\x00\x01\x00\x01\x00\x0e\x00\x0b\x00\x14\x00\x01\x00\x01\x00\x01\x00\x12\x00\x18\x00\x16\x00\x2c\x00\x33\x00\x34\x00\x31\x00\x35\x00\x36\x00\x3c\x00\x40\x00\x44\x00\x01\x00\x2f\x00\x45\x00\x4a\x00\x13\x00\x3a\x00\x01\x00\x46\x00\x43\x00\x47\x00\x4b\x00\x42\x00\x48\x00\x0d\x00\x00\x00\x00\x00\x0f\x00\x10\x00\x10\x00\x3b\x00\x10\x00\x3b\x00\x3b\x00\x3b\x00\x10\x00\x3b\x00\x49\x00\x41\x00\x3c\x00\x00\x00\x17\x00\x00\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x37\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x03\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x1b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x21\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x04\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x05\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x06\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x07\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x08\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x02\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3f\x00\x00\x00\x3d\x00\x00\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\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\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x3f\x00\x00\x00\x3d\x00\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\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\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x0c\x00\x3b\x00\x3b\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x11\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\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\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x1c\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x1d\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x1e\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\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\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\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\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x22\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\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\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x23\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x2e\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x29\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x26\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\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\x00\x00\x00\x00\x00\x00\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\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\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x2a\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\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x30\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\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\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x3d\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# alex_check :: AlexAddr-alex_check = AlexA# "\xff\xff\x0b\x00\x0c\x00\x0d\x00\x30\x00\x78\x00\x30\x00\x0b\x00\x0c\x00\x0d\x00\x2e\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x30\x00\x78\x00\x23\x00\x24\x00\x25\x00\x20\x00\x20\x00\x28\x00\x29\x00\x2a\x00\x58\x00\x2c\x00\x2d\x00\x62\x00\x61\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x64\x00\x29\x00\x29\x00\x3e\x00\x62\x00\x73\x00\x29\x00\x61\x00\x64\x00\xff\xff\xff\xff\x73\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x20\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x20\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\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\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\xff\xff\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\xff\xff\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\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\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#+alex_check = AlexA# "\xff\xff\x0b\x00\x0c\x00\x0d\x00\x30\x00\x78\x00\x30\x00\x0b\x00\x0c\x00\x0d\x00\x78\x00\x30\x00\x78\x00\x20\x00\x62\x00\x61\x00\x29\x00\x64\x00\x29\x00\x73\x00\x70\x00\x62\x00\x20\x00\x58\x00\x61\x00\x23\x00\x24\x00\x25\x00\x20\x00\x64\x00\x28\x00\x29\x00\x2a\x00\x29\x00\x2c\x00\x2d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x6e\x00\x73\x00\xff\xff\x3e\x00\xff\xff\xff\xff\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2c\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x2c\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x2c\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x20\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x2c\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2c\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\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x2c\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x2c\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\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\x2c\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x2c\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\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\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\x2c\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x2c\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\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\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\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\x2c\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\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\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\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\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\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\x2c\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\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\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# alex_deflt :: AlexAddr-alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#+alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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,71) [[],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_2))],[(AlexAcc (alex_action_2))],[],[(AlexAcc (alex_action_14))],[],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_4))],[],[],[],[(AlexAcc (alex_action_5))],[],[],[],[(AlexAcc (alex_action_6))],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_7))],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_8))],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_9))],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_10))],[],[],[(AlexAcc (alex_action_14))],[],[],[(AlexAcc (alex_action_11))],[],[],[],[],[(AlexAcc (alex_action_12))],[],[],[(AlexAcc (alex_action_13))],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_16))],[],[],[],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_18))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_21))]]-{-# LINE 42 "src/Bindings/Bfd/Disasm/I386/Lex.x" #-}+alex_accept = listArray (0::Int,75) [[],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_2))],[(AlexAcc (alex_action_2))],[],[(AlexAcc (alex_action_14))],[],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_4))],[],[],[],[(AlexAcc (alex_action_5))],[],[],[],[(AlexAcc (alex_action_6))],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_7))],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_8))],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_9))],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_10))],[],[],[(AlexAcc (alex_action_14))],[],[],[(AlexAcc (alex_action_11))],[],[],[],[],[(AlexAcc (alex_action_12))],[],[],[(AlexAcc (alex_action_13))],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[],[(AlexAcc (alex_action_15))],[],[],[(AlexAcc (alex_action_16))],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_18))],[],[],[],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_22))],[(AlexAcc (alex_action_23))]]+{-# LINE 44 "src/Bindings/Bfd/Disasm/I386/Lex.x" #-} data Token = Offset Int | Constant Int@@ -181,15 +180,16 @@ alex_action_13 = register alex_action_14 = mnemonic alex_action_15 = mnemonic -alex_action_16 = parensL -alex_action_17 = parensR -alex_action_18 = comma -alex_action_19 = colon -alex_action_20 = hash -alex_action_21 = star +alex_action_16 = mnemonic +alex_action_17 = mnemonic +alex_action_18 = parensL +alex_action_19 = parensR +alex_action_20 = comma +alex_action_21 = colon +alex_action_22 = hash +alex_action_23 = star {-# LINE 1 "templates/GenericTemplate.hs" #-} {-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-} {-# LINE 1 "<command-line>" #-} {-# LINE 1 "templates/GenericTemplate.hs" #-} -- -----------------------------------------------------------------------------
dist/build/Bindings/Bfd/Disasm/I386/Parse.hs view
@@ -15,6 +15,7 @@ import Bindings.Bfd.Disasm.I386.Mnemonic as R import Bindings.Bfd.Disasm.I386.Operand as O import Bindings.Bfd.Disasm.I386.Prefix+import Bindings.Bfd.Disasm.I386.Register import qualified Data.Array as Happy_Data_Array import qualified GHC.Exts as Happy_GHC_Exts @@ -92,6 +93,12 @@ happyOut14 :: (HappyAbsSyn ) -> (EffectiveAddr) happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x {-# INLINE happyOut14 #-}+happyIn15 :: (Register) -> (HappyAbsSyn )+happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn15 #-}+happyOut15 :: (HappyAbsSyn ) -> (Register)+happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut15 #-} happyInTok :: (Token) -> (HappyAbsSyn ) happyInTok x = Happy_GHC_Exts.unsafeCoerce# x {-# INLINE happyInTok #-}@@ -101,21 +108,21 @@ happyActOffsets :: HappyAddr-happyActOffsets = HappyA# "\x3f\x00\x59\x00\x01\x00\x55\x00\x01\x00\x00\x00\x00\x00\x57\x00\x56\x00\x00\x00\x31\x00\x53\x00\x00\x00\x00\x00\x4f\x00\x00\x00\x00\x00\x52\x00\x26\x00\x23\x00\x00\x00\x00\x00\x00\x00\x39\x00\x54\x00\x2a\x00\x00\x00\x00\x00\x51\x00\x00\x00\x21\x00\x04\x00\x21\x00\x50\x00\x2c\x00\x00\x00\x00\x00\x4d\x00\x4d\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4b\x00\x49\x00\x4e\x00\x00\x00\x00\x00\x00\x00\x48\x00\x48\x00\x00\x00\x00\x00\x41\x00\x45\x00\x4a\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00"#+happyActOffsets = HappyA# "\x44\x00\x61\x00\x01\x00\x5e\x00\x01\x00\x00\x00\x00\x00\x5f\x00\x5d\x00\x00\x00\x22\x00\x5c\x00\x00\x00\x00\x00\x5a\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x37\x00\x33\x00\x00\x00\x00\x00\x00\x00\x3e\x00\x57\x00\x00\x00\x3b\x00\x00\x00\x59\x00\x00\x00\x33\x00\x04\x00\x33\x00\x58\x00\x1b\x00\x00\x00\x00\x00\x55\x00\x55\x00\x00\x00\x00\x00\x00\x00\x52\x00\x00\x00\x54\x00\x4f\x00\x56\x00\x00\x00\x00\x00\x00\x00\x50\x00\x50\x00\x00\x00\x00\x00\x47\x00\x4d\x00\x53\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x00\x00"# happyGotoOffsets :: HappyAddr-happyGotoOffsets = HappyA# "\x3b\x00\x00\x00\x15\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x00\x46\x00\x00\x00\x00\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x1c\x00\x29\x00\x00\x00\x44\x00\x00\x00\x00\x00\x43\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\x28\x00\x12\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#+happyGotoOffsets = HappyA# "\x51\x00\x00\x00\x16\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x45\x00\x00\x00\x00\x00\x00\x00\x42\x00\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x1e\x00\x25\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x49\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x2d\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# happyDefActions :: HappyAddr-happyDefActions = HappyA# "\x00\x00\x00\x00\xfc\xff\x00\x00\xfc\xff\xfd\xff\xfb\xff\xfa\xff\xf9\xff\xf8\xff\xec\xff\xec\xff\xe6\xff\xe2\xff\xe1\xff\xe9\xff\xea\xff\xe8\xff\x00\x00\x00\x00\xfe\xff\xe4\xff\xe7\xff\x00\x00\x00\x00\x00\x00\xe3\xff\xf6\xff\x00\x00\xf7\xff\x00\x00\x00\x00\x00\x00\xf0\xff\xec\xff\xf3\xff\xf5\xff\xec\xff\xec\xff\xf1\xff\xeb\xff\xe5\xff\x00\x00\xe0\xff\x00\x00\x00\x00\x00\x00\xf2\xff\xf4\xff\xef\xff\x00\x00\x00\x00\xee\xff\xe8\xff\xec\xff\x00\x00\x00\x00\x00\x00\xdf\xff\xed\xff\xde\xff"#+happyDefActions = HappyA# "\x00\x00\x00\x00\xfc\xff\x00\x00\xfc\xff\xfd\xff\xfb\xff\xfa\xff\xf9\xff\xf8\xff\xec\xff\xec\xff\xe6\xff\xe2\xff\xe8\xff\xe1\xff\xe9\xff\xea\xff\xdd\xff\x00\x00\x00\x00\xfe\xff\xe4\xff\xe7\xff\x00\x00\x00\x00\xe3\xff\x00\x00\xf6\xff\x00\x00\xf7\xff\x00\x00\x00\x00\x00\x00\xf0\xff\xec\xff\xf3\xff\xf5\xff\xec\xff\xec\xff\xf1\xff\xeb\xff\xe5\xff\x00\x00\xe0\xff\x00\x00\x00\x00\x00\x00\xf2\xff\xf4\xff\xef\xff\x00\x00\x00\x00\xee\xff\xe8\xff\xec\xff\x00\x00\x00\x00\x00\x00\xdf\xff\xed\xff\xde\xff"# happyCheck :: HappyAddr-happyCheck = HappyA# "\xff\xff\x02\x00\x01\x00\x02\x00\x03\x00\x01\x00\x02\x00\x06\x00\x07\x00\x02\x00\x06\x00\x07\x00\x01\x00\x0c\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x01\x00\x05\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x04\x00\x05\x00\x01\x00\x07\x00\x01\x00\x09\x00\x0a\x00\x06\x00\x07\x00\x06\x00\x07\x00\x01\x00\x06\x00\x05\x00\x05\x00\x09\x00\x07\x00\x07\x00\x09\x00\x0a\x00\x05\x00\x09\x00\x07\x00\x0b\x00\x09\x00\x0a\x00\x09\x00\x00\x00\x0b\x00\x09\x00\x0a\x00\x09\x00\x0a\x00\x08\x00\x09\x00\x04\x00\x05\x00\x02\x00\x02\x00\x0a\x00\x02\x00\x02\x00\x08\x00\x01\x00\x0b\x00\x08\x00\x06\x00\x01\x00\xff\xff\x06\x00\x09\x00\xff\xff\x03\x00\x09\x00\x07\x00\xff\xff\x0b\x00\x09\x00\x06\x00\xff\xff\x0a\x00\x04\x00\x0b\x00\x09\x00\x09\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff"#+happyCheck = HappyA# "\xff\xff\x02\x00\x01\x00\x02\x00\x03\x00\x01\x00\x02\x00\x06\x00\x07\x00\x0b\x00\x06\x00\x07\x00\x01\x00\x0c\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x01\x00\x0b\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x04\x00\x05\x00\x09\x00\x07\x00\x0b\x00\x09\x00\x0a\x00\x0b\x00\x05\x00\x09\x00\x07\x00\x0b\x00\x09\x00\x0a\x00\x0b\x00\x05\x00\x05\x00\x07\x00\x01\x00\x09\x00\x0a\x00\x0b\x00\x0b\x00\x06\x00\x07\x00\x05\x00\x01\x00\x06\x00\x09\x00\x0a\x00\x09\x00\x0b\x00\x07\x00\x09\x00\x0a\x00\x0b\x00\x08\x00\x09\x00\x04\x00\x05\x00\x02\x00\x02\x00\x02\x00\x0b\x00\x02\x00\x0a\x00\x02\x00\x00\x00\x0b\x00\x08\x00\x01\x00\x08\x00\x06\x00\x01\x00\x09\x00\xff\xff\x06\x00\x09\x00\x03\x00\x06\x00\xff\xff\xff\xff\x0b\x00\x09\x00\x07\x00\xff\xff\x0a\x00\x04\x00\x09\x00\x0b\x00\x09\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff"# happyTable :: HappyAddr-happyTable = HappyA# "\x00\x00\x3b\x00\x0f\x00\x10\x00\x11\x00\x0f\x00\x10\x00\x12\x00\x13\x00\x2f\x00\x12\x00\x13\x00\x05\x00\x14\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x14\x00\x34\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x23\x00\x24\x00\x0f\x00\x25\x00\x0f\x00\x0c\x00\x0d\x00\x12\x00\x13\x00\x17\x00\x13\x00\x0f\x00\x18\x00\x36\x00\x21\x00\x19\x00\x22\x00\x13\x00\x0c\x00\x0d\x00\x26\x00\x33\x00\x27\x00\x1d\x00\x0c\x00\x0d\x00\x1f\x00\x03\x00\x1d\x00\x29\x00\x0d\x00\x15\x00\x0d\x00\x2c\x00\x2d\x00\x03\x00\x05\x00\x30\x00\x31\x00\x1a\x00\x1b\x00\x1d\x00\x3d\x00\x3a\x00\x1d\x00\x3b\x00\x36\x00\x38\x00\x00\x00\x2e\x00\x39\x00\x00\x00\x29\x00\x2f\x00\x13\x00\x00\x00\x1d\x00\x34\x00\x2b\x00\x00\x00\x1a\x00\x03\x00\x1d\x00\x20\x00\x21\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00"#+happyTable = HappyA# "\x00\x00\x3c\x00\x10\x00\x11\x00\x12\x00\x10\x00\x11\x00\x13\x00\x14\x00\x2e\x00\x13\x00\x14\x00\x05\x00\x15\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x15\x00\x2b\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x24\x00\x25\x00\x34\x00\x26\x00\x1e\x00\x0c\x00\x0d\x00\x0e\x00\x22\x00\x20\x00\x23\x00\x1e\x00\x0c\x00\x0d\x00\x0e\x00\x27\x00\x35\x00\x28\x00\x10\x00\x0c\x00\x0d\x00\x0e\x00\x36\x00\x13\x00\x14\x00\x37\x00\x10\x00\x13\x00\x2a\x00\x0d\x00\x1a\x00\x36\x00\x14\x00\x16\x00\x0d\x00\x17\x00\x2d\x00\x2e\x00\x03\x00\x05\x00\x30\x00\x31\x00\x32\x00\x18\x00\x1c\x00\x1a\x00\x1e\x00\x03\x00\x1e\x00\x3e\x00\x3b\x00\x3c\x00\x13\x00\x39\x00\x3a\x00\x00\x00\x13\x00\x30\x00\x2a\x00\x13\x00\x00\x00\x00\x00\x1e\x00\x35\x00\x14\x00\x00\x00\x1c\x00\x03\x00\x21\x00\x1e\x00\x22\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00"# -happyReduceArr = Happy_Data_Array.array (1, 33) [+happyReduceArr = Happy_Data_Array.array (1, 34) [ (1 , happyReduce_1), (2 , happyReduce_2), (3 , happyReduce_3),@@ -148,11 +155,12 @@ (30 , happyReduce_30), (31 , happyReduce_31), (32 , happyReduce_32),- (33 , happyReduce_33)+ (33 , happyReduce_33),+ (34 , happyReduce_34) ] happy_n_terms = 14 :: Int-happy_n_nonterms = 11 :: Int+happy_n_nonterms = 12 :: Int happyReduce_1 = happySpecReduce_2 0# happyReduction_1 happyReduction_1 happy_x_2@@ -160,7 +168,7 @@ = case happyOutTok happy_x_1 of { (PrefixedMnemonic happy_var_1) -> case happyOut5 happy_x_2 of { happy_var_2 -> happyIn4- (Insn (toPrefix $ head happy_var_1) (toMnemonic $ head $ tail happy_var_1) happy_var_2+ (Insn 0 (toPrefix $ head happy_var_1) (toMnemonic $ head $ tail happy_var_1) happy_var_2 )}} happyReduce_2 = happySpecReduce_2 0# happyReduction_2@@ -169,7 +177,7 @@ = case happyOutTok happy_x_1 of { (L.Mnemonic happy_var_1) -> case happyOut5 happy_x_2 of { happy_var_2 -> happyIn4- (Insn (Nothing ) (toMnemonic happy_var_1) happy_var_2+ (Insn 0 (Nothing ) (toMnemonic happy_var_1) happy_var_2 )}} happyReduce_3 = happySpecReduce_0 1# happyReduction_3@@ -360,7 +368,7 @@ happyReduce_23 = happySpecReduce_1 5# happyReduction_23 happyReduction_23 happy_x_1- = case happyOutTok happy_x_1 of { (Register happy_var_1) -> + = case happyOut15 happy_x_1 of { happy_var_1 -> happyIn9 (DirD happy_var_1 )}@@ -368,7 +376,7 @@ happyReduce_24 = happySpecReduce_2 6# happyReduction_24 happyReduction_24 happy_x_2 happy_x_1- = case happyOutTok happy_x_2 of { (Register happy_var_2) -> + = case happyOut15 happy_x_2 of { happy_var_2 -> happyIn10 (DirJ happy_var_2 )}@@ -377,17 +385,17 @@ happyReduction_25 happy_x_1 = case happyOut13 happy_x_1 of { happy_var_1 -> happyIn11- (IndD "" (fst happy_var_1) (snd happy_var_1) Nothing+ (IndD Nothing (fst happy_var_1) (snd happy_var_1) Nothing )} happyReduce_26 = happySpecReduce_3 7# happyReduction_26 happyReduction_26 happy_x_3 happy_x_2 happy_x_1- = case happyOutTok happy_x_1 of { (Register happy_var_1) -> + = case happyOut15 happy_x_1 of { happy_var_1 -> case happyOut13 happy_x_3 of { happy_var_3 -> happyIn11- (IndD happy_var_1 (fst happy_var_3) (snd happy_var_3) Nothing+ (IndD (Just happy_var_1) (fst happy_var_3) (snd happy_var_3) Nothing )}} happyReduce_27 = happySpecReduce_2 8# happyReduction_27@@ -425,9 +433,9 @@ happyReduction_31 happy_x_3 happy_x_2 happy_x_1- = case happyOutTok happy_x_2 of { (Register happy_var_2) -> + = case happyOut15 happy_x_2 of { happy_var_2 -> happyIn14- (EA happy_var_2 "" 1+ (EA (Just happy_var_2) Nothing 1 )} happyReduce_32 = happyReduce 6# 10# happyReduction_32@@ -438,10 +446,10 @@ happy_x_2 `HappyStk` happy_x_1 `HappyStk` happyRest)- = case happyOutTok happy_x_3 of { (Register happy_var_3) -> + = case happyOut15 happy_x_3 of { happy_var_3 -> case happyOutTok happy_x_5 of { (Offset happy_var_5) -> happyIn14- (EA "" happy_var_3 happy_var_5+ (EA Nothing (Just happy_var_3) happy_var_5 ) `HappyStk` happyRest}} happyReduce_33 = happyReduce 7# 10# happyReduction_33@@ -453,13 +461,20 @@ happy_x_2 `HappyStk` happy_x_1 `HappyStk` happyRest)- = case happyOutTok happy_x_2 of { (Register happy_var_2) -> - case happyOutTok happy_x_4 of { (Register happy_var_4) -> + = case happyOut15 happy_x_2 of { happy_var_2 -> + case happyOut15 happy_x_4 of { happy_var_4 -> case happyOutTok happy_x_6 of { (Offset happy_var_6) -> happyIn14- (EA happy_var_2 happy_var_4 happy_var_6+ (EA (Just happy_var_2) (Just happy_var_4) happy_var_6 ) `HappyStk` happyRest}}} +happyReduce_34 = happySpecReduce_1 11# happyReduction_34+happyReduction_34 happy_x_1+ = case happyOutTok happy_x_1 of { (Register happy_var_1) -> + happyIn15+ (toRegister happy_var_1+ )}+ happyNewToken action sts stk [] = happyDoAction 13# notHappyAtAll action sts stk [] @@ -511,7 +526,6 @@ happyError tks = error $ "Parse.y: parse error at: " ++ (show $ take 10 tks) {-# LINE 1 "templates/GenericTemplate.hs" #-} {-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-} {-# LINE 1 "<command-line>" #-} {-# LINE 1 "templates/GenericTemplate.hs" #-} -- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp
src/Bindings/Bfd.hs-boot view
@@ -16,20 +16,23 @@ -- along with Bindings-bfd. If not, see <http://www.gnu.org/licenses/>. module Bindings.Bfd (- Bfd(ptr)+ Bfd (ptr) , Bfd'- , Bindings.Bfd.mk+ , getPrintSymbol , getOctetsPerByte , getTarget , getSections+ , mk ) where -import Foreign.C-import Foreign.Ptr-import Foreign.Storable+import Foreign.C ( CString )+import Foreign.Ptr ( Ptr )+import Foreign.Storable ( Storable ) -import {-# SOURCE #-} Bindings.Bfd.Section-import {-# SOURCE #-} Bindings.Bfd.Target+import Bindings.Bfd.Misc ( File )+import {-# SOURCE #-} Bindings.Bfd.Section ( Section )+import {-# SOURCE #-} Bindings.Bfd.Symbol ( Symbol )+import {-# SOURCE #-} Bindings.Bfd.Target ( Target ) data Bfd = Bfd {@@ -47,9 +50,11 @@ instance Storable Bfd' -mk- :: Ptr Bfd'- -> Bfd+getPrintSymbol+ :: Bfd+ -> File+ -> Symbol+ -> IO (IO ()) getOctetsPerByte :: Bfd@@ -62,4 +67,8 @@ getSections :: Bfd -> IO [Section]++mk+ :: Ptr Bfd'+ -> Bfd
src/Bindings/Bfd.hsc view
@@ -16,13 +16,15 @@ -- along with Bindings-bfd. If not, see <http://www.gnu.org/licenses/>. -- | This is the top-level module containing operations that can be performed--- on a Binary Format Descriptor (BFD). A BFD is opened on the binary file--- to be queried\/manipulated and serves an opaque pointer. +-- on a Binary Format Descriptor (BFD). One BFD is opened for every binary file+-- to be queried\/manipulated and serves an opaque handle. The usual workflow+-- is to 'open' a binary file (returning a 'Bfd'), perform operations on the+-- 'Bfd' handle, then 'close' the 'Bfd'. module Bindings.Bfd ( -- * Types Bfd (ptr)- -- * Initialization+ -- * Library Initialization , initialize -- * File Operations , targetsAndFormats@@ -59,6 +61,7 @@ , getDynamicRelocations -- * , demangle+ , getPrintSymbol -- * Internal , Bfd' , Bindings.Bfd.mk@@ -70,10 +73,10 @@ import Data.Bits ( (.&.), bit ) import Data.Word ( Word ) -import Foreign.C ( CString, CInt, CUInt, newCString, peekCString+import Foreign.C ( CInt, CLong, CString, CUInt, newCString, peekCString , withCString ) import Foreign.Marshal ( free, mallocArray, peekArray, toBool )-import Foreign.Ptr ( Ptr, nullPtr, wordPtrToPtr )+import Foreign.Ptr ( FunPtr, Ptr, nullPtr, wordPtrToPtr ) import Foreign.Storable ( Storable, alignment, peek, peekByteOff, poke, sizeOf ) import Prelude hiding ( catch )@@ -84,28 +87,31 @@ , throwExceptionIfNull ) import Bindings.Bfd.Flags as BfdFlags ( Flags ( HasReloc ) ) import Bindings.Bfd.Format ( Format ( Object ) )-import Bindings.Bfd.Misc ( Vma, Vma' )+import Bindings.Bfd.Misc ( File, Vma, Vma' ) import Bindings.Bfd.Relocation ( Relocation ) import Bindings.Bfd.Section as Section ( Section, SectionName , getNext, getSize, getVma )+import Bindings.Bfd.Symbol ( Symbol ) import Bindings.Bfd.SymbolTable as SymbolTable ( SymbolTable, mk, tablePtr )-import Bindings.Bfd.Target as Target ( Target, TargetName- , canonicalizeDynamicReloc- , canonicalizeDynamicSymtab- , canonicalizeSymtab- , getDynamicRelocUpperBound- , getDynamicSymtabUpperBound- , getName, getSymtabUpperBound- , listSupported )+import Bindings.Bfd.Target as Target ( Target, TargetName, find+ , getName, listSupported+ , unTarget'CanonicalizeDynamicReloc+ , unTarget'CanonicalizeDynamicSymtab+ , unTarget'CanonicalizeSymtab+ , unTarget'GetDynamicRelocUpperBound+ , unTarget'GetDynamicSymtabUpperBound+ , unTarget'GetSymtabUpperBound + , unTarget'PrintSymbol ) #include <bfd.h> --- PUBLIC ######################################################################+-- ### PUBLIC ################################################################## --- Types =======================================================================+-- === Types =================================================================== --- | The opaque pointer to the Binary File Descriptor.+-- | The opaque handle to the Binary File Descriptor. One 'Bfd' handle is+-- associated with exactly one binary file to be queried\/manipulated. data Bfd = Bfd { ptr :: Ptr Bfd' , filePath :: CString@@ -114,18 +120,21 @@ } deriving (Show) --- Initialization ============================================================== +-- === Library Initialization ==================================================+ -- | Initialize the library. You need to call 'initialize' once, before using -- any of the functions in this library. initialize :: IO () initialize = c_bfd_init --- File Operations ============================================================= +-- === File Operations =========================================================+ -- | Returns a list of tuples representing the possible combinations of --- 'TargetName' and 'Format' that are valid for this file on this platform.+-- 'TargetName' and 'Format' that are valid for the 'FilePath' on this platform+-- (see 'listSupported'). -- -- /Possible Exceptions:/ Same as 'open'. targetsAndFormats @@ -155,23 +164,17 @@ else return xs False -> return xs --- | Opens the file 'FilePath' with the given target 'TargetName' and open mode --- (as defined by the Unix fopen(3) function) and returns a 'Bfd' object on --- success. FIXME: and marks it cacheable. +-- | Opens the 'FilePath' with the given 'TargetName' and /open mode/ as defined +-- by the Unix fopen(3) function, and returns a 'Bfd' handle on success.+-- FIXME: and marks it cacheable. ----- If the target is 'Nothing' then the environment variable /GNUTARGET/ is--- checked for a target name; if this is NULL or not defined then it chooses the--- the default target if set (see 'setDefault') and sets an internal flag in--- the 'Bfd' object indicating that the target was defaulted (see --- 'isTargetDefaulted'), or if not set, the first entry in the target list for --- the platform. Passing the string \"default\" as the 'TargetName' or setting --- the environment variable to \"default\" also causes the above behavior.+-- Calls 'find'. Refer to 'find' for a description of how the 'Target' is+-- selected. ----- /Important:/ Before you use the returned 'Bfd' object from a file you have--- opened, you must call 'checkFormat' to 1) validate that the supplied --- 'TargetName' is appropriate for the opened file, and 2) set the 'Format' for--- the 'Bfd'. So for most intents and purposes, opening a file is a two-step--- process.+-- /Important:/ Before using the returned 'Bfd' handle a call must be made to +-- 'checkFormat' to 1) validate that the associated 'TargetName' is appropriate+-- for the file; and, 2) set the 'Format'. So for most intents and purposes, +-- opening a file is a two-step process: 'open' followed by 'checkFormat'. -- -- /Possible Exceptions:/ 'NoMemory' (if any allocation fails), 'SystemCall' -- (if open failed), and 'InvalidTarget' (if supplied target is unknown).@@ -193,10 +196,12 @@ bfd <- throwExceptionIfNull "open" fp (show targ) cmd return $ Bfd bfd fp' targ' mode' --- | Close a 'Bfd' and if all went well, return 'True'. If the 'Bfd' was open--- for writing, then pending operations are completed and the file written out--- and closed. If the created file is executable, then chmod(3) is called to--- mark it as such.+-- | Close a 'Bfd' handle and if all went well return 'True'. Otherwise +-- 'False'.+--+-- If the 'Bfd' was open for writing then pending operations are completed and+-- the file written out and closed. If the created file is executable then +-- /chmod(3)/ is called to mark it as such. close :: Bfd -> IO Bool@@ -208,11 +213,13 @@ free $ mode bfd return $ toBool r --- | Close a 'Bfd' and if all went well, return 'True'. Differs from 'close'--- in that it does not complete any pending operations. This function would be--- used if the application had just used a 'Bfd' for swapping and didn't want to--- use any of the writing code. If the created file is executable, then --- chmod(3) is called to mark it as such.+-- | Close a 'Bfd' handle and if all went well, return 'True'. Otherwise +-- 'False'.+--+-- Differs from 'close' in that it does not complete any pending operations. +-- This function is used if the application had just used a 'Bfd' for swapping +-- and didn't want to use any of the written code. If the created file is+-- executable, then /chmod(3)/ is called to mark it as such. closeAllDone :: Bfd -> IO Bool@@ -224,15 +231,18 @@ free $ mode bfd return $ toBool r --- Setting the Format ========================================================== --- | The second part of opening a file (see 'open'). Validates that the --- 'TargetName' is appropriate for the opened file and if not, silently picks--- a more suitable 'TargetName', and also sets the 'Format' of the 'Bfd' object--- representing the opened file.+-- === Setting the Format ======================================================++-- | Before a 'Bfd' handle can be used, its 'Format' must be set exactly once. --+-- This function also validates that the 'TargetName' used in the 'open' call is+-- appropriate for the file and if not silently picks a more suitable +-- 'TargetName' from the available targets on the platform (see 'listSupported').+-- -- /Important:/ You must call this function before using the vast majority of--- these functions operating on the 'Bfd' as it updates critical data structures.+-- functions operating on the 'Bfd' handle as it updates critical data+-- structures. -- -- /Possible Exceptions:/ 'InvalidOperation' (if the file was opened write-only), checkFormat@@ -250,8 +260,9 @@ -> IO [TargetName] -} --- Attributes ================================================================== +-- === Attributes ==============================================================+ -- | Returns the disassembler associated with the 'Bfd'. getDisasm :: Bfd@@ -267,7 +278,7 @@ fn <- peekByteOff (ptr bfd) (#offset struct bfd, filename) return $ unBfd'Filename fn --- | Returns a 'List' of the 'Bfd's set 'Flags'.+-- | Returns a 'List' of the 'Flags' set for the 'Bfd'. getFlags :: Bfd -> IO [BfdFlags.Flags]@@ -459,12 +470,11 @@ -> IO SymbolTable getSymbolTable bfd = do- xvec <- getTarget bfd- bound <- getSymtabUpperBound xvec bfd+ bound <- getSymtabUpperBound bfd let ptrs = bound `quot` (#const sizeof(struct bfd_symbol *)) pps <- mallocArray ptrs- count <- canonicalizeSymtab xvec bfd pps+ count <- canonicalizeSymtab bfd pps return $ SymbolTable.mk pps count getDynamicSymbolTable@@ -472,12 +482,11 @@ -> IO SymbolTable getDynamicSymbolTable bfd = do- xvec <- getTarget bfd- bound <- getDynamicSymtabUpperBound xvec bfd+ bound <- getDynamicSymtabUpperBound bfd let ptrs = fromIntegral bound `quot` (#const sizeof(struct bfd_symbol *)) pps <- mallocArray ptrs- count <- canonicalizeDynamicSymtab xvec bfd pps+ count <- canonicalizeDynamicSymtab bfd pps return $ SymbolTable.mk pps count #if 0@@ -502,12 +511,11 @@ -> IO [Relocation] getDynamicRelocations bfd st = do- xvec <- getTarget bfd- bound <- getDynamicRelocUpperBound xvec bfd+ bound <- getDynamicRelocUpperBound bfd let ptrs = fromIntegral bound `quot` (#const sizeof(arelent *)) ppr <- mallocArray ptrs- count <- canonicalizeDynamicReloc xvec bfd ppr $ tablePtr st+ count <- canonicalizeDynamicReloc bfd ppr $ tablePtr st prs <- peekArray count ppr mapM peek prs @@ -527,6 +535,19 @@ s' <- peekCString s return s' +getPrintSymbol+ :: Bfd+ -> File+ -> Symbol+ -> IO (IO ())+getPrintSymbol bfd file sym =+ do + targ <- getTarget bfd+ fn <- peekByteOff targ (#offset struct bfd_target, _bfd_print_symbol)+ let+ f = d_Bfd_File_Symbol_CUInt_Void (unTarget'PrintSymbol fn) (ptr bfd) file sym 2+ return f+ -- Internal ==================================================================== data Bfd' = Filename String@@ -591,6 +612,91 @@ -- PRIVATE ##################################################################### +canonicalizeDynamicReloc+ :: Bfd+ -> Ptr (Ptr Relocation)+ -> Ptr Symbol+ -> IO Int+canonicalizeDynamicReloc bfd rels syms =+ do+ targ <- getTarget bfd+ fn <- peekByteOff targ (#offset struct bfd_target, _bfd_canonicalize_dynamic_reloc)+ r <- d_Bfd_PtrPtrRelocation_PtrSymbol_CLong (unTarget'CanonicalizeDynamicReloc fn) (ptr bfd) rels syms+ return $ fromIntegral r++canonicalizeDynamicSymtab+ :: Bfd+ -> Ptr Symbol+ -> IO Int+canonicalizeDynamicSymtab bfd ps =+ do+ targ <- getTarget bfd+ fn <- peekByteOff targ (#offset struct bfd_target, _bfd_canonicalize_dynamic_symtab)+ r <- d_Bfd_PtrSymbol_CLong (unTarget'CanonicalizeDynamicSymtab fn) (ptr bfd) ps+ return $ fromIntegral r++canonicalizeSymtab+ :: Bfd+ -> Ptr Symbol+ -> IO Int+canonicalizeSymtab bfd ps =+ do+ targ <- getTarget bfd+ fn <- peekByteOff targ (#offset struct bfd_target, _bfd_canonicalize_symtab)+ r <- d_Bfd_PtrSymbol_CLong (unTarget'CanonicalizeSymtab fn) (ptr bfd) ps+ return $ fromIntegral r++getDynamicRelocUpperBound+ :: Bfd+ -> IO Int+getDynamicRelocUpperBound bfd =+ do+ targ <- getTarget bfd+ fn <- peekByteOff targ (#offset struct bfd_target, _bfd_get_dynamic_reloc_upper_bound)+ r <- d_Bfd_CLong (unTarget'GetDynamicRelocUpperBound fn) (ptr bfd)+ return $ fromIntegral r++getDynamicSymtabUpperBound+ :: Bfd+ -> IO Int+getDynamicSymtabUpperBound bfd =+ do+ targ <- getTarget bfd+ fn <- peekByteOff targ (#offset struct bfd_target, _bfd_get_dynamic_symtab_upper_bound)+ r <- d_Bfd_CLong (unTarget'GetDynamicSymtabUpperBound fn) (ptr bfd)+ return $ fromIntegral r++getSymtabUpperBound+ :: Bfd+ -> IO Int+getSymtabUpperBound bfd =+ do+ targ <- getTarget bfd+ fn <- peekByteOff targ (#offset struct bfd_target, _bfd_get_symtab_upper_bound)+ r <- d_Bfd_CLong (unTarget'GetSymtabUpperBound fn) $ ptr bfd+ return $ fromIntegral r++#if 0+getSyntheticSymtab+ :: Bfd+ -> SymbolTable+ -> SymbolTable+ -> Ptr Symbol+ -> IO Int+getSyntheticSymtab bfd sst dst synth =+ do+ targ <- getTarget bfd+ fn <- peekByteOff targ (#offset struct bfd_target, _bfd_get_synthetic_symtab)+ r <- d_Bfd_CLong_PtrSymbol_CLong_PtrSymbol_PtrSymbol_CLong (fn' fn) (ptr bfd) sts stp dts dtp synth+ return $ fromIntegral r+ where+ fn' = unTarget'GetSyntheticSymtab+ sts = fromIntegral $ tableSize sst+ stp = tablePtr sst+ dts = fromIntegral $ tableSize dst+ dtp = tablePtr dst+#endif+ unBfd'Filename :: Bfd' -> String@@ -701,3 +807,26 @@ foreign import ccall unsafe "bfd.h _bfd_peek_is_thin_archive" c__bfd_peek_is_thin_archive :: Ptr Bfd' -> IO CInt++foreign import ccall unsafe "dynamic" d_Bfd_CLong+ :: FunPtr (Ptr Bfd' -> IO CLong)+ -> (Ptr Bfd' -> IO CLong)++#if 0+foreign import ccall unsafe "dynamic" d_Bfd_CLong_PtrSymbol_CLong_PtrSymbol_PtrSymbol_CLong+ :: FunPtr (Ptr Bfd' -> CLong -> Ptr Symbol -> CLong -> Ptr Symbol -> Ptr Symbol -> IO CLong) + -> (Ptr Bfd' -> CLong -> Ptr Symbol -> CLong -> Ptr Symbol -> Ptr Symbol -> IO CLong)+#endif++foreign import ccall unsafe "dynamic" d_Bfd_File_Symbol_CUInt_Void+ :: FunPtr (Ptr Bfd' -> File -> Symbol -> CUInt -> IO ()) + -> (Ptr Bfd' -> File -> Symbol -> CUInt -> IO ())++foreign import ccall unsafe "dynamic" d_Bfd_PtrPtrRelocation_PtrSymbol_CLong+ :: FunPtr (Ptr Bfd' -> Ptr (Ptr Relocation) -> Ptr Symbol -> IO CLong) + -> (Ptr Bfd' -> Ptr (Ptr Relocation) -> Ptr Symbol -> IO CLong)++foreign import ccall unsafe "dynamic" d_Bfd_PtrSymbol_CLong+ :: FunPtr (Ptr Bfd' -> Ptr Symbol -> IO CLong)+ -> (Ptr Bfd' -> Ptr Symbol -> IO CLong)+
+ src/Bindings/Bfd/Disasm/I386/Cell.hs view
@@ -0,0 +1,30 @@+module Bindings.Bfd.Disasm.I386.Cell where++import Bindings.Bfd.Disasm.I386.Address+import Bindings.Bfd.Disasm.I386.EffectiveAddr+import Bindings.Bfd.Disasm.I386.Register+++data Cell = Stk Int Int -- width, offset from rsp+ | Reg Register+ | Flg Char+ | Ind Int (Maybe Register) EffectiveAddr (Maybe Int) (Maybe Address)+ deriving (Show)++{-+checkWidth+ :: Int+ -> [Cell]+ -> [Cell]+checkWidth w cs = map f cs+ where+ f c =+ case width c == w of+ True -> c+ False -> error $ "Cell.checkWidth: " ++ show w ++ " " ++ show c++width+ :: Cell+ -> Int+width c = error $ "Cell.width: " ++ show c+-}
src/Bindings/Bfd/Disasm/I386/CondCode.hs view
@@ -13,14 +13,29 @@ | NotEqual | NotSigned | Parity+ | NotParity | Signed- | Zero deriving (Show) toCondCode :: String -> Maybe CondCode-toCondCode "" = Nothing-toCondCode "z" = Just Zero-toCondCode s = error $ "toCondCode: " ++ show s+toCondCode "" = Nothing+toCondCode "a" = Just Above+toCondCode "ae" = Just AboveOrEqual+toCondCode "b" = Just Below+toCondCode "be" = Just BelowOrEqual+toCondCode "e" = Just Equal+toCondCode "g" = Just Greater+toCondCode "ge" = Just GreaterOrEqual+toCondCode "l" = Just Less+toCondCode "le" = Just LessOrEqual+toCondCode "ne" = Just NotEqual+toCondCode "ns" = Just NotSigned+toCondCode "nz" = Just NotEqual+toCondCode "p" = Just Parity+toCondCode "np" = Just NotParity+toCondCode "s" = Just Signed+toCondCode "z" = Just Equal+toCondCode s = error $ "toCondCode: " ++ show s
src/Bindings/Bfd/Disasm/I386/EffectiveAddr.hs view
@@ -1,10 +1,21 @@ module Bindings.Bfd.Disasm.I386.EffectiveAddr where +import Bindings.Bfd.Disasm.I386.Register + data EffectiveAddr = EA {- base :: String- , index :: String+ base :: Maybe Register+ , index :: Maybe Register , scale :: Int } | NoEA deriving (Eq, Ord, Show)+++registers+ :: EffectiveAddr+ -> [Register]+registers (EA (Just r1) Nothing _) = [r1]+registers (EA Nothing (Just r2) _) = [r2]+registers (EA (Just r1) (Just r2) _) = r1 : [r2]+registers x = error $ "EffectiveAddr.registers: " ++ show x
src/Bindings/Bfd/Disasm/I386/Insn.hs view
@@ -6,7 +6,8 @@ data Insn = Insn {- prefix :: Maybe Prefix+ length :: Int+ , prefix :: Maybe Prefix , mnemonic :: Mnemonic , operands :: [Operand] }
src/Bindings/Bfd/Disasm/I386/Lex.x view
@@ -31,6 +31,8 @@ "%"$alphanum+"("$decdigit")" { register } "%"$alphanum+ { register } $alphanum+".s"{0,1} { mnemonic }+ $alphanum+",pt"{0,1} { mnemonic }+ $alphanum+",pn"{0,1} { mnemonic } "(bad)" { mnemonic } "(" { parensL } ")" { parensR }
src/Bindings/Bfd/Disasm/I386/Mnemonic.hs view
@@ -7,47 +7,51 @@ data Mnemonic = Add {- width1 :: Int+ bits1 :: Int } | AddCarry {- width1 :: Int+ bits1 :: Int } | AddScalar { precision :: Precision }- | BitwiseAnd {- width1 :: Int+ | BitAnd {+ bits1 :: Int }- | BitwiseExclOr {+ | BitAndXmm -- FIXME+ | BitExclOr { xmmType :: XmmType }- | BitwiseNot {- width1 :: Int+ | BitNot {+ bits1 :: Int }- | BitwiseOr {- width1 :: Int+ | BitOr {+ bits1 :: Int }+ | BitOrXmm -- FIXME+ | BitScan -- FIXME | Branch { condCode :: CondCode } | Call {- width1 :: Int+ bits1 :: Int } | Compare {- width1 :: Int+ bits1 :: Int } | CompareExchange {- width1 :: Int+ bits1 :: Int } | CompareString {- width1 :: Int+ bits1 :: Int } | CompareUnordered { precision :: Precision }+ | CompareXmm -- FIXME | Convert {- width1 :: Int- , width2 :: Int+ bits1 :: Int+ , bits2 :: Int , isSplit :: Bool } | ConvertXmm {@@ -58,48 +62,59 @@ } | Cpuid | Decrement {- width1 :: Int+ bits1 :: Int } | Direction { isSet :: Bool } | Divide {- width1 :: Int+ bits1 :: Int } | DivideInt {- width1 :: Int+ bits1 :: Int } | DivideScalar { precision :: Precision } | Exchange {- width1 :: Int+ bits1 :: Int } | ExchangeAdd {- width1 :: Int+ bits1 :: Int }+ | Fpu -- FIXME+ | FpuCopyPop {+ bits1 :: Int+ }+ | FpuLoadValue {+ bits1 :: Int+ }+ | Halt | Increment {- width1 :: Int+ bits1 :: Int } | Jump { mbWidth :: Maybe Int } | Leave {- width1 :: Int+ bits1 :: Int } | LoadEffAddr {- width1 :: Int+ bits1 :: Int }+ | LogicalExclOr | Loop+ | Maximum -- FIXME+ | Minimum -- FIXME | Move {- width1 :: Int- , mbWidthSignExtend :: Maybe (Int, Bool)+ bits1 :: Int+ , mbWidthSignExtend :: Maybe (Int, Bool) -- (bits, T=se,F=ze) } | MoveAligned {- precision :: Precision+ xmmType :: XmmType } | MoveCond {- width1 :: Int+ bits1 :: Int , condCode :: CondCode } | MoveNonTemp {@@ -110,68 +125,75 @@ , isHigh1 :: Bool , isHigh2 :: Bool }- | MoveScalar {- precision :: Precision+ | MoveScalar {+ bits1 :: Int } | MoveString {- width1 :: Int+ bits1 :: Int } | MoveUnaligned { precision :: Precision } | Multiply {- width1 :: Int+ bits1 :: Int } | MultiplyInt {- width1 :: Int+ bits1 :: Int } | MultiplyScalar { xmmType :: XmmType } | Negate {- width1 :: Int+ bits1 :: Int } | NoOp+ | Pause | Pop {- width1 :: Int+ bits1 :: Int } | Push {- width1 :: Int+ bits1 :: Int } | Return {- width1 :: Int+ bits1 :: Int } | Rotate {- width1 :: Int+ bits1 :: Int , isRight :: Bool }+ | ScanString {+ bits1 :: Int+ } | Set { condCode :: CondCode } | Shift {- width1 :: Int+ bits1 :: Int , isRight :: Bool , isArith :: Bool }+ | SquareRoot -- FIXME | StoreString {- width1 :: Int+ bits1 :: Int } | Subtract {- width1 :: Int+ bits1 :: Int } | SubtractBorrow {- width1 :: Int+ bits1 :: Int } | SubtractScalar { precision :: Precision } | Test {- width1 :: Int+ bits1 :: Int } | Unpack { order :: Order- , precision :: Precision+ , xmmType :: XmmType+ , mbWidth :: Maybe Int }+ | FIXME deriving (Show) @@ -179,163 +201,235 @@ :: String -> Mnemonic toMnemonic s- | s == "adcl" = AddCarry 4- | s == "addb" = Add 1- | s == "addl" = Add 4- | s == "addq" = Add 8- | s == "addsd" = AddScalar Double- | s == "addss" = AddScalar Single- | s == "addw" = Add 2- | s == "andb" = BitwiseAnd 1- | s == "andl" = BitwiseAnd 4- | s == "andq" = BitwiseAnd 8- | s == "andw" = BitwiseAnd 2- | s == "callq" = Call 8- | s == "cld" = Direction False- | s == "cltd" = Convert 4 8 True- | s == "cltq" = Convert 4 8 False- | s == "cmovael" = MoveCond 4 AboveOrEqual- | s == "cmovaeq" = MoveCond 8 AboveOrEqual- | s == "cmoval" = MoveCond 4 Above- | s == "cmovaq" = MoveCond 8 Above- | s == "cmovbel" = MoveCond 4 BelowOrEqual- | s == "cmovbeq" = MoveCond 8 BelowOrEqual- | s == "cmovbl" = MoveCond 4 Below- | s == "cmovbq" = MoveCond 8 Below- | s == "cmovel" = MoveCond 4 Equal- | s == "cmoveq" = MoveCond 8 Equal- | s == "cmovgel" = MoveCond 4 GreaterOrEqual- | s == "cmovgl" = MoveCond 4 Greater- | s == "cmovlel" = MoveCond 4 LessOrEqual- | s == "cmovll" = MoveCond 4 Less- | s == "cmovnel" = MoveCond 4 NotEqual- | s == "cmovneq" = MoveCond 8 NotEqual- | s == "cmpb" = Compare 1- | s == "cmpl" = Compare 4- | s == "cmpsb" = CompareString 1- | s == "cmpq" = Compare 8- | s == "cmpw" = Compare 2- | s == "cmpxchgl" = CompareExchange 4- | s == "cmpxchgq" = CompareExchange 8- | s == "cpuid" = Cpuid- | s == "cvtpd2ps" = ConvertXmm 2 (FloatingPt Double) (FloatingPt Single) False- | s == "cvtps2pd" = ConvertXmm 2 (FloatingPt Single) (FloatingPt Double) False- | s == "cvtsd2ss" = ConvertXmm 1 (FloatingPt Double) (Int 0) False -- shouldn't this have a size postfix? it doesn't...- | s == "cvtsi2sdl" = ConvertXmm 1 (Int 4) (FloatingPt Double) False- | s == "cvtsi2sdq" = ConvertXmm 1 (Int 8) (FloatingPt Double) False- | s == "cvtsi2ssl" = ConvertXmm 1 (Int 4) (FloatingPt Single) False- | s == "cvtsi2ssq" = ConvertXmm 1 (Int 8) (FloatingPt Single) False- | s == "cvtss2sd" = ConvertXmm 1 (FloatingPt Single) (FloatingPt Double) False- | s == "cvttsd2si" = ConvertXmm 1 (FloatingPt Double) (Int 0) True -- shouldn't this have a size postfix? it doesn't...- | s == "cvttss2siq" = ConvertXmm 1 (FloatingPt Single) (Int 8) True- | s == "cwtl" = Convert 2 4 False- | s == "decb" = Decrement 1- | s == "decl" = Decrement 4- | s == "decq" = Decrement 8- | s == "divl" = Divide 4- | s == "divq" = Divide 8- | s == "divsd" = DivideScalar Double- | s == "divss" = DivideScalar Single- | s == "idivl" = DivideInt 4- | s == "imull" = MultiplyInt 4- | s == "imulq" = MultiplyInt 8- | s == "incl" = Increment 4- | s == "incq" = Increment 8- | s == "ja" = Branch Above- | s == "jae" = Branch AboveOrEqual- | s == "jb" = Branch Below- | s == "jbe" = Branch BelowOrEqual- | s == "je" = Branch Equal- | s == "jg" = Branch Greater- | s == "jge" = Branch GreaterOrEqual- | s == "jl" = Branch Less- | s == "jle" = Branch LessOrEqual- | s == "jne" = Branch NotEqual- | s == "jns" = Branch NotSigned- | s == "jmp" = Jump Nothing- | s == "jmpq" = Jump $ Just 8- | s == "jp" = Branch Parity- | s == "js" = Branch Signed- | s == "leal" = LoadEffAddr 4- | s == "leaq" = LoadEffAddr 8- | s == "leaveq" = Leave 8- | s == "movabsq" = Move 8 Nothing- | s == "movaps" = MoveAligned Single- | s == "movb" = Move 1 Nothing- | s == "movl" = Move 4 Nothing- | s == "movlpd" = MovePacked Double False False- | s == "movntps" = MoveNonTemp $ Right $ FloatingPt Single- | s == "movq" = Move 8 Nothing- | s == "movsbl" = Move 1 $ Just (4, True)- | s == "movsbq" = Move 1 $ Just (8, True)- | s == "movsd" = MoveString 4- | s == "movslq" = Move 4 $ Just (8, True)- | s == "movsq" = MoveString 8- | s == "movss" = MoveScalar Single- | s == "movswl" = Move 2 $ Just (4, True)- | s == "movswq" = Move 2 $ Just (8, True)- | s == "movups" = MoveUnaligned Single- | s == "movw" = Move 2 Nothing- | s == "movzbl" = Move 1 $ Just (4, False)- | s == "movzwl" = Move 2 $ Just (4, False)- | s == "mull" = Multiply 4- | s == "mulq" = Multiply 8- | s == "mulss" = MultiplyScalar $ FloatingPt Single- | s == "negl" = Negate 4- | s == "negq" = Negate 8- | s == "nop" = NoOp- | s == "nopl" = NoOp- | s == "nopw" = NoOp- | s == "notl" = BitwiseNot 4- | s == "notq" = BitwiseNot 8- | s == "orb" = BitwiseOr 1- | s == "orl" = BitwiseOr 4- | s == "orq" = BitwiseOr 8- | s == "orw" = BitwiseOr 2- | s == "popq" = Pop 8- | s == "pushq" = Push 8- | s == "roll" = Rotate 4 False- | s == "retq" = Return 8- | s == "sarl" = Shift 4 True True- | s == "sarq" = Shift 8 True True- | s == "sbbl" = SubtractBorrow 4- | s == "sbbq" = SubtractBorrow 8- | s == "seta" = Set Above- | s == "setb" = Set Below- | s == "setbe" = Set BelowOrEqual- | s == "sete" = Set Equal- | s == "setg" = Set Greater- | s == "setl" = Set Less- | s == "setle" = Set LessOrEqual- | s == "setne" = Set NotEqual- | s == "shll" = Shift 4 False False- | s == "shlq" = Shift 8 False False- | s == "shrb" = Shift 1 True False- | s == "shrl" = Shift 4 True False- | s == "shrq" = Shift 8 True False- | s == "shrw" = Shift 2 True False- | s == "stosq" = StoreString 8- | s == "subb" = Subtract 1- | s == "subl" = Subtract 4- | s == "subq" = Subtract 8- | s == "subss" = SubtractScalar Single- | s == "testb" = Test 1- | s == "testl" = Test 4- | s == "testq" = Test 8- | s == "testw" = Test 2- | s == "ucomiss" = CompareUnordered Single- | s == "unpcklpd" = Unpack Low Double- | s == "unpcklps" = Unpack Low Single- | s == "xaddl" = ExchangeAdd 4- | s == "xchgl" = Exchange 4- | s == "xchgq" = Exchange 8- | s == "xchgw" = Exchange 2- | s == "xorb" = BitwiseExclOr $ Int 1- | s == "xorl" = BitwiseExclOr $ Int 4- | s == "xorpd" = BitwiseExclOr $ FloatingPt Double- | s == "xorps" = BitwiseExclOr $ FloatingPt Single- | s == "xorq" = BitwiseExclOr $ Int 8- | s == "xorw" = BitwiseExclOr $ Int 2+ | s == "adcl" = AddCarry 32+ | s == "addb" = Add 8+ | s == "addl" = Add 32+ | s == "addq" = Add 64+ | s == "addsd" = AddScalar Double+ | s == "addss" = AddScalar Single+ | s == "addw" = Add 16+ | s == "andb" = BitAnd 8+ | s == "andl" = BitAnd 32+ | s == "andnpd" = BitAndXmm+ | s == "andpd" = BitAndXmm+ | s == "andq" = BitAnd 64+ | s == "andw" = BitAnd 16+ | s == "bsfq" = BitScan+ | s == "callq" = Call 64+ | s == "cbtw" = Convert 8 16 False+ | s == "cld" = Direction False+ | s == "cltd" = Convert 32 64 True+ | s == "cltq" = Convert 32 64 False+ | s == "cmovael" = MoveCond 32 AboveOrEqual+ | s == "cmovaeq" = MoveCond 64 AboveOrEqual+ | s == "cmoval" = MoveCond 32 Above+ | s == "cmovaq" = MoveCond 64 Above+ | s == "cmovbel" = MoveCond 32 BelowOrEqual+ | s == "cmovbeq" = MoveCond 64 BelowOrEqual+ | s == "cmovbl" = MoveCond 32 Below+ | s == "cmovbq" = MoveCond 64 Below+ | s == "cmovel" = MoveCond 32 Equal+ | s == "cmoveq" = MoveCond 64 Equal+ | s == "cmovgel" = MoveCond 32 GreaterOrEqual+ | s == "cmovgeq" = MoveCond 64 GreaterOrEqual+ | s == "cmovgl" = MoveCond 32 Greater+ | s == "cmovgq" = MoveCond 64 Greater+ | s == "cmovlel" = MoveCond 32 LessOrEqual+ | s == "cmovleq" = MoveCond 64 LessOrEqual+ | s == "cmovlew" = MoveCond 16 LessOrEqual+ | s == "cmovll" = MoveCond 32 Less+ | s == "cmovlq" = MoveCond 64 Less+ | s == "cmovnel" = MoveCond 32 NotEqual+ | s == "cmovneq" = MoveCond 64 NotEqual+ | s == "cmovnpl" = MoveCond 32 NotParity+ | s == "cmovnsl" = MoveCond 32 NotSigned+ | s == "cmovnsq" = MoveCond 64 NotSigned+ | s == "cmovpl" = MoveCond 32 Parity+ | s == "cmovpq" = MoveCond 64 Parity+ | s == "cmovsl" = MoveCond 32 Signed+ | s == "cmpb" = Compare 8+ | s == "cmpeqsd" = CompareXmm+ | s == "cmpl" = Compare 32+ | s == "cmpneqsd" = CompareXmm+ | s == "cmpnlesd" = CompareXmm+ | s == "cmpnltsd" = CompareXmm+ | s == "cmpsb" = CompareString 8+ | s == "cmpq" = Compare 64+ | s == "cmpw" = Compare 16+ | s == "cmpxchgl" = CompareExchange 32+ | s == "cmpxchgq" = CompareExchange 64+ | s == "cpuid" = Cpuid+ | s == "cqto" = Convert 64 128 False -- FIXME+ | s == "cvtpd2ps" = ConvertXmm 16 (FloatingPt Double) (FloatingPt Single) False+ | s == "cvtps2pd" = ConvertXmm 16 (FloatingPt Single) (FloatingPt Double) False+ | s == "cvtsd2ss" = ConvertXmm 8 (FloatingPt Double) (Int 0) False -- shouldn't this have a size postfix? it doesn't...+ | s == "cvtsi2sdl" = ConvertXmm 8 (Int 32) (FloatingPt Double) False+ | s == "cvtsi2sdq" = ConvertXmm 8 (Int 64) (FloatingPt Double) False+ | s == "cvtsi2ssl" = ConvertXmm 8 (Int 32) (FloatingPt Single) False+ | s == "cvtsi2ssq" = ConvertXmm 8 (Int 64) (FloatingPt Single) False+ | s == "cvtss2sd" = ConvertXmm 8 (FloatingPt Single) (FloatingPt Double) False+ | s == "cvttsd2si" = ConvertXmm 8 (FloatingPt Double) (Int 0) True -- shouldn't this have a size postfix? it doesn't...+ | s == "cvttsd2siq" = ConvertXmm 8 (FloatingPt Double) (Int 8) True+ | s == "cvttss2siq" = ConvertXmm 8 (FloatingPt Single) (Int 8) True+ | s == "cwtl" = Convert 16 32 False+ | s == "decb" = Decrement 8+ | s == "decl" = Decrement 32+ | s == "decq" = Decrement 64+ | s == "decw" = Decrement 16+ | s == "divl" = Divide 32+ | s == "divq" = Divide 64+ | s == "divsd" = DivideScalar Double+ | s == "divss" = DivideScalar Single+ | s == "fchs" = Fpu+ | s == "fcmove" = Fpu+ | s == "fcmovne" = Fpu+ | s == "fld" = Fpu+ | s == "fldcw" = Fpu+ | s == "fldl" = FpuLoadValue 64+ | s == "fnstcw" = Fpu+ | s == "fstp" = Fpu+ | s == "fstpl" = FpuCopyPop 64+ | s == "fxch" = Fpu+ | s == "hlt" = Halt+ | s == "idivl" = DivideInt 32+ | s == "idivq" = DivideInt 64+ | s == "imull" = MultiplyInt 32+ | s == "imulq" = MultiplyInt 64+ | s == "incl" = Increment 32+ | s == "incq" = Increment 64+ | s == "incw" = Increment 16+ | s == "ja" = Branch Above+ | s == "ja,pn" = Branch Above -- FIXME+ | s == "jae" = Branch AboveOrEqual+ | s == "jae,pn" = Branch AboveOrEqual -- FIXME+ | s == "jb" = Branch Below+ | s == "jbe" = Branch BelowOrEqual+ | s == "jbe,pn" = Branch BelowOrEqual -- FIXME+ | s == "jbe,pt" = Branch BelowOrEqual -- FIXME+ | s == "je" = Branch Equal+ | s == "je,pn" = Branch Equal -- FIXME+ | s == "jg" = Branch Greater+ | s == "jge" = Branch GreaterOrEqual+ | s == "jl" = Branch Less+ | s == "jl,pt" = Branch Less -- FIXME+ | s == "jle" = Branch LessOrEqual+ | s == "jle,pn" = Branch LessOrEqual -- FIXME+ | s == "jne" = Branch NotEqual+ | s == "jne,pn" = Branch NotEqual -- FIXME+ | s == "jne,pt" = Branch NotEqual -- FIXME+ | s == "jnp" = Branch NotParity+ | s == "jns" = Branch NotSigned+ | s == "jmp" = Jump Nothing+ | s == "jmpq" = Jump $ Just 64+ | s == "jp" = Branch Parity+ | s == "jp,pn" = Branch Parity -- FIXME+ | s == "js" = Branch Signed+ | s == "js,pn" = Branch Signed -- FIXME+ | s == "leal" = LoadEffAddr 32+ | s == "leaq" = LoadEffAddr 64+ | s == "leaveq" = Leave 64+ | s == "maxsd" = Maximum -- FIXME+ | s == "minsd" = Minimum -- FIXME+ | s == "movabsq" = Move 64 Nothing+ | s == "movapd" = MoveAligned $ FloatingPt Double+ | s == "movaps" = MoveAligned $ FloatingPt Single+ | s == "movb" = Move 8 Nothing+ | s == "movdqa" = MoveAligned $ Int 128+ | s == "movl" = Move 32 Nothing+ | s == "movlpd" = MovePacked Double False False+ | s == "movntps" = MoveNonTemp $ Right $ FloatingPt Single+ | s == "movq" = Move 64 Nothing+ | s == "movsb" = MoveString 8+ | s == "movsbl" = Move 8 $ Just (32, True)+ | s == "movsbq" = Move 8 $ Just (64, True)+ | s == "movsbw" = Move 8 $ Just (16, True)+ | s == "movsd" = MoveScalar 64+ | s == "movslq" = Move 32 $ Just (64, True)+ | s == "movsq" = MoveString 64+ | s == "movss" = MoveScalar 32+ | s == "movswl" = Move 16 $ Just (32, True)+ | s == "movswq" = Move 16 $ Just (64, True)+ | s == "movups" = MoveUnaligned Single+ | s == "movw" = Move 16 Nothing+ | s == "movzbl" = Move 8 $ Just (32, False)+ | s == "movzbq" = Move 8 $ Just (64, False)+ | s == "movzbw" = Move 8 $ Just (16, False)+ | s == "movzwl" = Move 16 $ Just (32, False)+ | s == "movzwq" = Move 16 $ Just (64, False)+ | s == "mull" = Multiply 32+ | s == "mulq" = Multiply 64+ | s == "mulsd" = MultiplyScalar $ FloatingPt Double+ | s == "mulss" = MultiplyScalar $ FloatingPt Single+ | s == "negl" = Negate 32+ | s == "negq" = Negate 64+ | s == "nop" = NoOp+ | s == "nopl" = NoOp+ | s == "nopw" = NoOp+ | s == "notl" = BitNot 32+ | s == "notq" = BitNot 64+ | s == "orb" = BitOr 8+ | s == "orl" = BitOr 32+ | s == "orpd" = BitOrXmm+ | s == "orq" = BitOr 64+ | s == "orw" = BitOr 16+ | s == "pause" = Pause+ | s == "popq" = Pop 64+ | s == "punpcklqdq" = Unpack Low (Int 64) (Just 128)+ | s == "pushq" = Push 64+ | s == "pxor" = LogicalExclOr+ | s == "roll" = Rotate 32 False+ | s == "retq" = Return 64+ | s == "sarl" = Shift 32 True True+ | s == "sarq" = Shift 64 True True+ | s == "sbbl" = SubtractBorrow 32+ | s == "sbbq" = SubtractBorrow 64+ | s == "scasb" = ScanString 8+ | s == "seta" = Set Above+ | s == "setae" = Set AboveOrEqual+ | s == "setb" = Set Below+ | s == "setbe" = Set BelowOrEqual+ | s == "sete" = Set Equal+ | s == "setg" = Set Greater+ | s == "setge" = Set GreaterOrEqual+ | s == "setl" = Set Less+ | s == "setle" = Set LessOrEqual+ | s == "setne" = Set NotEqual+ | s == "setnp" = Set NotParity+ | s == "setp" = Set Parity+ | s == "shlb" = Shift 8 False False+ | s == "shll" = Shift 32 False False+ | s == "shlq" = Shift 64 False False+ | s == "shrb" = Shift 8 True False+ | s == "shrl" = Shift 32 True False+ | s == "shrq" = Shift 64 True False+ | s == "shrw" = Shift 16 True False+ | s == "sqrtsd" = SquareRoot+ | s == "stosq" = StoreString 64+ | s == "subb" = Subtract 8+ | s == "subl" = Subtract 32+ | s == "subq" = Subtract 64+ | s == "subw" = Subtract 16+ | s == "subsd" = SubtractScalar Double+ | s == "subss" = SubtractScalar Single+ | s == "testb" = Test 8+ | s == "testl" = Test 32+ | s == "testq" = Test 64+ | s == "testw" = Test 16+ | s == "ucomisd" = CompareUnordered Double+ | s == "ucomiss" = CompareUnordered Single+ | s == "unpcklpd" = Unpack Low (FloatingPt Double) Nothing+ | s == "unpcklps" = Unpack Low (FloatingPt Single) Nothing+ | s == "xaddl" = ExchangeAdd 32+ | s == "xaddq" = ExchangeAdd 64+ | s == "xchgl" = Exchange 32+ | s == "xchgq" = Exchange 64+ | s == "xchgw" = Exchange 16+ | s == "xorb" = BitExclOr $ Int 8+ | s == "xorl" = BitExclOr $ Int 32+ | s == "xorpd" = BitExclOr $ FloatingPt Double+ | s == "xorps" = BitExclOr $ FloatingPt Single+ | s == "xorq" = BitExclOr $ Int 64+ | s == "xorw" = BitExclOr $ Int 16 | otherwise = error $ "toMnemonic: " ++ show s @@ -358,9 +452,28 @@ isBranch (Loop ) = True isBranch _ = False +isHalt+ :: Mnemonic+ -> Bool+isHalt Halt = True+isHalt _ = False+ isReturn :: Mnemonic -> Bool isReturn (Return _) = True isReturn _ = False+{-+unpcklps unpack and interleave low packed single precision floating point+unpcklpd unpack and interleave low packed double precision floating point+unpckhps unpack and interleave high packed single precision floating point+unpckhpd unpack and interleave high packed double precision floating point+punpckl unpack and interleave low 1 8+ 1 16+ 2 8+ 2 16+ 4 8+ 4 16+ 8 16+-}
src/Bindings/Bfd/Disasm/I386/Operand.hs view
@@ -1,23 +1,25 @@ module Bindings.Bfd.Disasm.I386.Operand where import Bindings.Bfd.Disasm.I386.Address+import Bindings.Bfd.Disasm.I386.Cell import Bindings.Bfd.Disasm.I386.EffectiveAddr+import Bindings.Bfd.Disasm.I386.Register as R data Operand = Abs { address :: Address } | DirD {- direct :: String+ direct :: Register } | DirJ {- direct :: String+ direct :: Register } | Imm { immed :: Int } | IndD {- section :: String+ section :: Maybe Register , effAddr :: EffectiveAddr , displacement :: Maybe Int , mbAddress :: Maybe Address@@ -51,3 +53,12 @@ -> Bool isDirJ (DirJ _) = True isDirJ _ = False++defines+ :: Int+ -> Operand+ -> [Cell]+defines _ (DirD r ) = [Reg r]+defines w (IndD s ea d a) = [Ind w s ea d a]+defines _ o = error $ "Operand.defines: " ++ show o+
src/Bindings/Bfd/Disasm/I386/Parse.y view
@@ -14,6 +14,7 @@ import Bindings.Bfd.Disasm.I386.Mnemonic as R import Bindings.Bfd.Disasm.I386.Operand as O import Bindings.Bfd.Disasm.I386.Prefix+import Bindings.Bfd.Disasm.I386.Register } %name parse@@ -34,8 +35,8 @@ %% insn :: { Insn }- : PREFIXEDMNEMONIC operands { Insn (toPrefix $ head $1) (toMnemonic $ head $ tail $1) $2 }- | MNEMONIC operands { Insn (Nothing ) (toMnemonic $1) $2 }+ : PREFIXEDMNEMONIC operands { Insn 0 (toPrefix $ head $1) (toMnemonic $ head $ tail $1) $2 }+ | MNEMONIC operands { Insn 0 (Nothing ) (toMnemonic $1) $2 } operands :: { [Operand] } : {- empty -} { [ ]} -- nop@@ -66,14 +67,14 @@ : CONSTANT { Imm $1 } directD :: { Operand }- : REGISTER { DirD $1 }+ : register { DirD $1 } directJ :: { Operand }- : '*' REGISTER { DirJ $2 }+ : '*' register { DirJ $2 } indirD :: { Operand }- : indir1 { IndD "" (fst $1) (snd $1) Nothing }- | REGISTER ':' indir1 { IndD $1 (fst $3) (snd $3) Nothing }+ : indir1 { IndD Nothing (fst $1) (snd $1) Nothing }+ | register ':' indir1 { IndD (Just $1) (fst $3) (snd $3) Nothing } indirJ :: { Operand }@@ -85,9 +86,12 @@ | OFFSET { (NoEA, Just $1) } effAddr :: { EffectiveAddr }- : '(' REGISTER ')' { EA $2 "" 1 }- | '(' ',' REGISTER ',' OFFSET ')' { EA "" $3 $5 }- | '(' REGISTER ',' REGISTER ',' OFFSET ')' { EA $2 $4 $6 }+ : '(' register ')' { EA (Just $2) Nothing 1 }+ | '(' ',' register ',' OFFSET ')' { EA Nothing (Just $3) $5 }+ | '(' register ',' register ',' OFFSET ')' { EA (Just $2) (Just $4) $6 }++register :: { Register }+ : REGISTER { toRegister $1 } { happyError :: [Token] -> a
+ src/Bindings/Bfd/Disasm/I386/Register.hs view
@@ -0,0 +1,131 @@+module Bindings.Bfd.Disasm.I386.Register where+++data Register = X Char Int Int+ | I Char Int Int+ | N Int Int Int+ | P Char Int Int+ | Q Int Int+ | F Int+ | Z Int Int Int+ | S Char+ | C [Register]+ deriving (Eq, Ord, Show)+++toRegister+ :: String+ -> Register+toRegister "ah" = X 'a' 8 15+toRegister "al" = X 'a' 0 7+toRegister "ax" = X 'a' 0 15+toRegister "bh" = X 'b' 8 15+toRegister "bl" = X 'b' 0 7+toRegister "bp" = P 'b' 0 15+toRegister "bpl" = P 'b' 0 7+toRegister "bx" = X 'b' 0 15+toRegister "ch" = X 'c' 8 15+toRegister "cl" = X 'c' 0 7+toRegister "cx" = X 'c' 0 15+toRegister "dh" = X 'd' 8 15+toRegister "di" = I 'd' 0 15+toRegister "dil" = I 'd' 0 7+toRegister "dl" = X 'd' 0 7+toRegister "ds" = S 'd'+toRegister "dx" = X 'd' 0 15+toRegister "dxax" = C [(X 'd' 0 15), (X 'a' 0 15)]+toRegister "eax" = X 'a' 0 31+toRegister "ebp" = P 'b' 0 31+toRegister "ebx" = X 'b' 0 31+toRegister "ecx" = X 'c' 0 31+toRegister "edi" = I 'd' 0 31+toRegister "edx" = X 'd' 0 31+toRegister "edxeax" = C [(X 'd' 0 31), (X 'a' 0 31)]+toRegister "es" = S 'e'+toRegister "esi" = I 's' 0 31+toRegister "fs" = S 'f'+toRegister "r8" = N 8 0 63+toRegister "r8b" = N 8 0 7+toRegister "r8d" = N 8 0 31+toRegister "r8w" = N 8 0 15+toRegister "r9" = N 9 0 63+toRegister "r9b" = N 9 0 7+toRegister "r9d" = N 9 0 31+toRegister "r9w" = N 9 0 15+toRegister "r10" = N 10 0 63+toRegister "r10b" = N 10 0 7+toRegister "r10d" = N 10 0 31+toRegister "r10w" = N 10 0 15+toRegister "r11" = N 11 0 63+toRegister "r11b" = N 11 0 7+toRegister "r11d" = N 11 0 31+toRegister "r11w" = N 11 0 15+toRegister "r12" = N 12 0 63+toRegister "r12b" = N 12 0 7+toRegister "r12d" = N 12 0 31+toRegister "r12w" = N 12 0 15+toRegister "r13" = N 13 0 63+toRegister "r13b" = N 13 0 7+toRegister "r13d" = N 13 0 31+toRegister "r13w" = N 13 0 15+toRegister "r14" = N 14 0 63+toRegister "r14b" = N 14 0 7+toRegister "r14d" = N 14 0 31+toRegister "r14w" = N 14 0 15+toRegister "r15" = N 15 0 63+toRegister "r15b" = N 15 0 7+toRegister "r15d" = N 15 0 31+toRegister "r15w" = N 15 0 15+toRegister "rax" = X 'a' 0 63+toRegister "rbp" = P 'b' 0 63+toRegister "rbx" = X 'b' 0 63+toRegister "rcx" = X 'c' 0 63+toRegister "rdi" = I 'd' 0 63+toRegister "rdx" = X 'd' 0 63+toRegister "rdxrax" = C [X 'd' 0 63, X 'a' 0 63]+toRegister "rip" = Q 0 63+toRegister "rsi" = I 's' 0 63+toRegister "rsp" = P 's' 0 63+toRegister "si" = I 's' 0 15+toRegister "sil" = I 's' 0 7+toRegister "st" = F (-1)+toRegister "st(0)" = F 0+toRegister "st(1)" = F 1+toRegister "xmm0" = Z 0 0 127+toRegister "xmm1" = Z 1 0 127+toRegister "xmm2" = Z 2 0 127+toRegister "xmm3" = Z 3 0 127+toRegister "xmm4" = Z 4 0 127+toRegister "xmm5" = Z 5 0 127+toRegister "xmm6" = Z 6 0 127+toRegister "xmm7" = Z 7 0 127+toRegister "xmm8" = Z 8 0 127+toRegister "xmm9" = Z 9 0 127+toRegister "xmm10" = Z 10 0 127+toRegister "xmm11" = Z 11 0 127+toRegister "xmm12" = Z 12 0 127+toRegister "xmm13" = Z 13 0 127+toRegister "xmm14" = Z 14 0 127+toRegister "xmm15" = Z 15 0 127+toRegister r = error $ "Register.toRegister: " ++ r++size+ :: Register+ -> Int+size (X _ a b) = b - a + 1+size (I _ a b) = b - a + 1+size (N _ a b) = b - a + 1+size (P _ a b) = b - a + 1+size (F _) = 80+size (Z _ a b) = b - a + 1 +size (S _) = 16+size x = error $ "Register.size: " ++ show x++restrictBits+ :: Int+ -> Int+ -> Register+ -> Register+restrictBits a b (X r _ _) = X r a b+restrictBits a b (Z r _ _) = Z r a b+restrictBits _ _ r = error $ "Register.restrictBits: " ++ show r
src/Bindings/Bfd/Disasm/I386/Term.hs view
@@ -1,29 +1,49 @@ module Bindings.Bfd.Disasm.I386.Term where -import Bindings.Bfd.Disasm.I386.Operand+import qualified Bindings.Bfd.Disasm.I386.Cell as C+import Bindings.Bfd.Disasm.I386.Operand as O+import Bindings.Bfd.Disasm.I386.Register as R -data Term = Term `Add` Term- | Term `BitAnd` Term- | Term `BitExclOr` Term- | Term `BitOr` Term- | Term `BitTest` Term- | Term `GreaterOrEqual` Term- | Term `Subtract` Term- | If Term Term Term- | Flag Char Term -- right hand side- -- terminals- | Opr Int Operand -- Int is width- | Stk Int Int- | Reg String- | Flg Char- | Con Int -- assumed to be 64-bits- | Udf -- undefined- | Nul- | Todo -- FIXME+data Term = Term `Add` Term+ | Term `BitAnd` Term+ | Term `BitExclOr` Term+ | Term `BitOr` Term+ | Term `BitTest` Term+ | Term `DivideIntQuotient` Term+ | Term `DivideIntRemainder` Term+ | Term `Subtract` Term+ | SignExtend Term+ | If Term Term Term -- cond; true; false+ | Flag Char Term -- source of Assign+ -- terminals+ | Opr Int Operand -- Operand: Int is width+ | OprA Int Operand -- same as Opr, except gets address instead of val (for lea)+ | Stk Int Int -- offset from rsp, width+ | Reg Register+ | Flg Char -- target of Assign+ | Con Int -- constant; assumed to be 64-bits+ | Udf -- undefined+ | Todo String -- FIXME deriving (Show) -type Assign = (Term, Term)-+type Assign = (Term, Term) -- (read, write) +{-+restrictBits+ :: Int+ -> Int+ -> Term+ -> Term+restrictBits a b (Reg r) = Reg $ R.restrictBits a b r+restrictBits _ _ t = error $ "Term.restrictBits: " ++ show t+-} +defines+ :: Term+ -> [C.Cell]+defines (Opr w op) = O.defines w op+defines (Stk a b ) = [C.Stk b a]+defines (Reg r ) = [C.Reg r ]+defines (Flg f ) = [C.Flg f ]+defines t = error $ "Term.defines: " ++ show t
src/Bindings/Bfd/Symbol.hsc view
@@ -40,21 +40,27 @@ , Symbol' ) where -import Data.Bits-import Data.Word+import Data.Bits ( (.&.), bit )+import Data.Word ( Word ) -import Foreign.C-import Foreign.Ptr-import Foreign.Storable+import Foreign.C ( CString, CUInt, newCString, peekCString )+import Foreign.Ptr ( Ptr, wordPtrToPtr )+import Foreign.Storable ( Storable, alignment, peekByteOff, pokeByteOff, sizeOf ) -import System.Posix.IO+import System.Posix.IO ( FdOption(NonBlockingRead), closeFd, createPipe, fdRead+ , setFdOption ) -import {-# SOURCE #-} Bindings.Bfd as Bfd-import Bindings.Bfd.Flavour-import Bindings.Bfd.Misc-import {-# SOURCE #-} Bindings.Bfd.Section as Section-import Bindings.Bfd.Symbol.Flags as SymbolFlags-import Bindings.Bfd.Target as Target+import {-# SOURCE #-} Bindings.Bfd as Bfd ( Bfd, Bfd'+ , getPrintSymbol+ , getTarget, mk)+import Bindings.Bfd.Flavour ( Flavour(Unknown) )+import Bindings.Bfd.Misc ( Vma, c_fdopen+ , c_fflush )+import {-# SOURCE #-} Bindings.Bfd.Section as Section ( Section+ , getOutputSection+ , getVma )+import Bindings.Bfd.Symbol.Flags as SymbolFlags ( Flags(Local, Synthetic) )+import Bindings.Bfd.Target as Target ( getFlavour ) #include <bfd.h> @@ -294,8 +300,7 @@ mode <- newCString "w" fpWrite <- c_fdopen pipeWrite' mode - xvec <- getTarget bfd- f <- getPrintSymbol xvec bfd fpWrite sym+ f <- getPrintSymbol bfd fpWrite sym f _ <- c_fflush fpWrite
src/Bindings/Bfd/SymbolTable.hs view
@@ -90,8 +90,13 @@ sects <- getSections bfd let- lastSect = last sects- lastSectVma <- getVma lastSect+ f (v,rs) s =+ do+ v' <- Section.getVma s+ case v' > v of+ True -> return (v',s )+ False -> return (v ,rs)+ (lastSectVma,lastSect) <- foldM f (0,externsSect) sects lastSectSize <- Section.getSize lastSect let
src/Bindings/Bfd/Target.hs-boot view
@@ -15,10 +15,14 @@ -- You should have received a copy of the GNU Lesser General Public License -- along with Bindings-bfd. If not, see <http://www.gnu.org/licenses/>. -module Bindings.Bfd.Target where+module Bindings.Bfd.Target (+ Target+ , Target'+ , TargetName+) where -import Foreign.Ptr-import Foreign.Storable+import Foreign.Ptr ( Ptr )+import Foreign.Storable ( Storable ) type TargetName = String
src/Bindings/Bfd/Target.hsc view
@@ -15,161 +15,81 @@ -- You should have received a copy of the GNU Lesser General Public License -- along with Bindings-bfd. If not, see <http://www.gnu.org/licenses/>. --- | The "Target" represents a particular back-end used to interpret the "Bfd".+-- | The "Target" represents a particular back-end used to interpret the Binary+-- File Descriptor (BFD). A 'Bfd' handle will be associated with exactly one+-- 'Target' as set in the 'open' function. module Bindings.Bfd.Target ( -- * Types Target , TargetName -- * Platform , listSupported+ , find , setDefault- -- * Byte Order+ -- * Attributes+ , getFlavour+ , getName+ -- ** Byte Order , getByteorder , getHeaderByteorder- -- *+ -- ** Flags , getObjectFlags , getSectionFlags- , Bindings.Bfd.Target.getFlavour- , getName- -- ** Symtabs- , getSymtabUpperBound- , canonicalizeSymtab- , getDynamicSymtabUpperBound- , canonicalizeDynamicSymtab- , getSyntheticSymtab- -- ** Relocations- , getDynamicRelocUpperBound- , canonicalizeDynamicReloc -- * Testing+ , isCoffFamily -- ** Byte Order , isBigEndian , isLittleEndian , isHeaderBigEndian , isHeaderLittleEndian- -- ** Coff Family- , isCoffFamily- -- *- , getPrintSymbol -- * Internal , Target'+ , unTarget'CanonicalizeDynamicReloc+ , unTarget'CanonicalizeDynamicSymtab+ , unTarget'CanonicalizeSymtab+ , unTarget'GetDynamicRelocUpperBound+ , unTarget'GetDynamicSymtabUpperBound+ , unTarget'GetSymtabUpperBound+ , unTarget'GetSyntheticSymtab+ , unTarget'PrintSymbol ) where -import Data.Bits-import Data.Word+import Data.Bits ( (.&.), bit )+import Data.Word ( Word ) -import Foreign.C-import Foreign.Marshal-import Foreign.Ptr-import Foreign.Storable+import Foreign.C ( CInt, CLong, CString, CUInt, newCString, peekCString+ , withCString )+import Foreign.Marshal ( free, peekArray0, toBool )+import Foreign.Ptr ( FunPtr, Ptr, castPtrToFunPtr, nullPtr, wordPtrToPtr )+import Foreign.Storable ( Storable, alignment, peekByteOff, sizeOf ) -import {-# SOURCE #-} Bindings.Bfd-import Bindings.Bfd.Endian-import Bindings.Bfd.Exception-import Bindings.Bfd.Flags as BfdFlags-import Bindings.Bfd.Flavour-import Bindings.Bfd.Misc-import {-# SOURCE #-} Bindings.Bfd.Relocation-import Bindings.Bfd.Section.Flags as SectionFlags-import {-# SOURCE #-} Bindings.Bfd.Symbol as Symbol-import {-# SOURCE #-} Bindings.Bfd.SymbolTable+import {-# SOURCE #-} Bindings.Bfd ( Bfd, Bfd'+ , ptr )+import Bindings.Bfd.Endian ( Endian(..) )+import Bindings.Bfd.Exception ( throwExceptionIfFalse)+import Bindings.Bfd.Flags as BfdFlags ( Flags(HasReloc) )+import Bindings.Bfd.Flavour ( Flavour(Coff, Xcoff) )+import Bindings.Bfd.Misc ( File )+import {-# SOURCE #-} Bindings.Bfd.Relocation ( Relocation )+import Bindings.Bfd.Section.Flags as SectionFlags ( Flags(Alloc) ) +import {-# SOURCE #-} Bindings.Bfd.Symbol as Symbol ( Symbol ) #include <bfd.h> -type TargetName = String+-- ### PUBLIC ################################################################## +-- === Types ===================================================================+ type Target = Ptr Target' -data Target' = Name TargetName- | Flavour Flavour- | Byteorder Endian- | HeaderByteorder Endian- | ObjectFlags [BfdFlags.Flags]- | SectionFlags [SectionFlags.Flags]- | GetSymtabUpperBound (FunPtr (Ptr Bfd' -> IO CLong))- | CanonicalizeSymtab (FunPtr (Ptr Bfd' -> Ptr Symbol -> IO CLong))- | PrintSymbol (FunPtr (Ptr Bfd' -> File -> Symbol -> CUInt -> IO ()))- | GetDynamicSymtabUpperBound (FunPtr (Ptr Bfd' -> IO CLong))- | CanonicalizeDynamicSymtab (FunPtr (Ptr Bfd' -> Ptr Symbol -> IO CLong))- | GetSyntheticSymtab (FunPtr (Ptr Bfd' -> CLong -> Ptr Symbol -> CLong -> Ptr Symbol -> Ptr Symbol -> IO CLong))- | GetDynamicRelocUpperBound (FunPtr (Ptr Bfd' -> IO CLong))- | CanonicalizeDynamicReloc (FunPtr (Ptr Bfd' -> Ptr (Ptr Relocation) -> Ptr Symbol -> IO CLong))- deriving (Show)+type TargetName = String -instance Storable Target' where- sizeOf _ = #size struct bfd_target- alignment = sizeOf- peekByteOff buf off- | off == (#offset struct bfd_target, name) =- do- val <- (#peek struct bfd_target, name) buf- s <- peekCString val- return $ Bindings.Bfd.Target.Name s- | off == (#offset struct bfd_target, flavour) =- do- val <- (#peek struct bfd_target, flavour) buf :: IO CUInt- return $ Flavour $ toEnum $ fromIntegral val- | off == (#offset struct bfd_target, byteorder) =- do- val <- (#peek struct bfd_target, byteorder) buf :: IO CUInt- return $ Byteorder $ toEnum $ fromIntegral val- | off == (#offset struct bfd_target, header_byteorder) =- do- val <- (#peek struct bfd_target, header_byteorder) buf :: IO CUInt- return $ HeaderByteorder $ toEnum $ fromIntegral val- | off == (#offset struct bfd_target, object_flags) =- do- val <- (#peek struct bfd_target, object_flags) buf :: IO CUInt- let- flags = filter f $ enumFrom HasReloc- where- f e = val .&. (bit $ fromEnum e) /= 0- return $ ObjectFlags flags- | off == (#offset struct bfd_target, section_flags) =- do- val <- (#peek struct bfd_target, section_flags) buf :: IO CUInt- let- flags = filter f $ enumFrom Alloc- where- f e = val .&. (bit $ fromEnum e) /= 0- return $ SectionFlags flags- | off == (#offset struct bfd_target, _bfd_get_symtab_upper_bound) =- do- val <- (#peek struct bfd_target, _bfd_get_symtab_upper_bound) buf :: IO Word- return $ GetSymtabUpperBound $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val- | off == (#offset struct bfd_target, _bfd_canonicalize_symtab) =- do- val <- (#peek struct bfd_target, _bfd_canonicalize_symtab) buf :: IO Word- return $ CanonicalizeSymtab $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val- | off == (#offset struct bfd_target, _bfd_print_symbol) =- do- val <- (#peek struct bfd_target, _bfd_print_symbol) buf :: IO Word- return $ PrintSymbol $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val- | off == (#offset struct bfd_target, _bfd_get_dynamic_symtab_upper_bound) =- do- val <- (#peek struct bfd_target, _bfd_get_dynamic_symtab_upper_bound) buf :: IO Word- return $ GetDynamicSymtabUpperBound $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val- | off == (#offset struct bfd_target, _bfd_canonicalize_dynamic_symtab) =- do- val <- (#peek struct bfd_target, _bfd_canonicalize_dynamic_symtab) buf :: IO Word- return $ CanonicalizeDynamicSymtab $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val- | off == (#offset struct bfd_target, _bfd_get_synthetic_symtab) =- do- val <- (#peek struct bfd_target, _bfd_get_synthetic_symtab) buf :: IO Word- return $ GetSyntheticSymtab $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val- | off == (#offset struct bfd_target, _bfd_get_dynamic_reloc_upper_bound) =- do- val <- (#peek struct bfd_target, _bfd_get_dynamic_reloc_upper_bound) buf :: IO Word- return $ GetDynamicRelocUpperBound $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val- | off == (#offset struct bfd_target, _bfd_canonicalize_dynamic_reloc) =- do- val <- (#peek struct bfd_target, _bfd_canonicalize_dynamic_reloc) buf :: IO Word- return $ CanonicalizeDynamicReloc $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val- | otherwise = error $ "internal error: Bfd.Target.peekByteOff " ++ show off +-- --- Platform and Bfd ======================================================== --- | Return a list of target names that can possibly be interpreted by this--- particular platform.+-- | Returns the /Platform Target List/; that is, the target names that are +-- supported by the platform that /libbfd/ was compiled for. listSupported :: IO [TargetName] listSupported = @@ -181,49 +101,44 @@ free pts -- FIXME is this dodgy? return res --- | Set the default target name for use with 'open' etc. when 'TargetName' is--- equal to \"default\" or empty. Returns 'True' if successful.+-- | Returns a handle to the target named 'TargetName'. If /target/ is +-- 'Nothing', choose the one in the environment variable /GNUTARGET/; if that is+-- null or not defined, then choose the first entry in the /Platform Target List/+-- (see 'listSupported').+-- +-- Passing the 'String' \"default\" as /target/ or setting the environment+-- variable to \"default\" will cause the /Default Target/ to be returned (see +-- 'setDefault'), and the fact that the target is defaulted will be set in the+-- BFD if /bfd/ isn't 'Nothing'. This will cause 'checkFormat' to loop over all+-- the targets to find the one that matches the file being read.+find+ :: Maybe TargetName -- ^ target+ -> Maybe Bfd -- ^ bfd+ -> IO Target+find mbTarg mbBfd =+ do+ targ <- maybe (return nullPtr) (\t -> newCString t) mbTarg+ let+ bfd = maybe nullPtr (\b -> ptr b) mbBfd+ r <- c_bfd_find_target targ bfd+ free targ+ return r++-- | Set the /Default Target/ for use when 'TargetName' is equal to \"default\"+-- or 'Nothing' in the 'find' and 'open' functions. -- -- /Possible exceptions:/ 'InvalidTarget' setDefault :: TargetName- -> IO Bool+ -> IO () setDefault tn = do r <- withCString tn (\s -> c_bfd_set_default_target s)- throwExceptionIfFalse "setDefault" tn (return $ toBool r)+ _ <- throwExceptionIfFalse "setDefault" tn (return $ toBool r)+ return () -getByteorder- :: Target- -> IO Endian-getByteorder targ =- do- bo <- peekByteOff targ (#offset struct bfd_target, byteorder)- return $ unTarget'Byteorder bo -getHeaderByteorder- :: Target- -> IO Endian-getHeaderByteorder targ =- do- bo <- peekByteOff targ (#offset struct bfd_target, header_byteorder)- return $ unTarget'HeaderByteorder bo--getObjectFlags- :: Target- -> IO [BfdFlags.Flags]-getObjectFlags targ =- do- f <- peekByteOff targ (#offset struct bfd_target, object_flags)- return $ unTarget'ObjectFlags f--getSectionFlags- :: Target- -> IO [SectionFlags.Flags]-getSectionFlags targ =- do- f <- peekByteOff targ (#offset struct bfd_target, section_flags)- return $ unTarget'SectionFlags f+-- === Attributes ============================================================== getFlavour :: Target@@ -243,91 +158,54 @@ tn' = unTarget'Name tn return tn' +-- Byte Order ------------------------------------------------------------------ -getSymtabUpperBound+getByteorder :: Target- -> Bfd- -> IO Int-getSymtabUpperBound targ bfd =+ -> IO Endian+getByteorder targ = do- fn <- peekByteOff targ (#offset struct bfd_target, _bfd_get_symtab_upper_bound)- r <- d_Bfd_CLong (unTarget'GetSymtabUpperBound fn) $ ptr bfd- return $ fromIntegral r+ bo <- peekByteOff targ (#offset struct bfd_target, byteorder)+ return $ unTarget'Byteorder bo -canonicalizeSymtab+getHeaderByteorder :: Target- -> Bfd- -> Ptr Symbol- -> IO Int-canonicalizeSymtab targ bfd ps =+ -> IO Endian+getHeaderByteorder targ = do- fn <- peekByteOff targ (#offset struct bfd_target, _bfd_canonicalize_symtab)- r <- d_Bfd_PtrSymbol_CLong (unTarget'CanonicalizeSymtab fn) (ptr bfd) ps- return $ fromIntegral r+ bo <- peekByteOff targ (#offset struct bfd_target, header_byteorder)+ return $ unTarget'HeaderByteorder bo -getDynamicSymtabUpperBound- :: Target- -> Bfd- -> IO Int-getDynamicSymtabUpperBound targ bfd =- do- fn <- peekByteOff targ (#offset struct bfd_target, _bfd_get_dynamic_symtab_upper_bound)- r <- d_Bfd_CLong (unTarget'GetDynamicSymtabUpperBound fn) (ptr bfd)- return $ fromIntegral r+-- Flags ----------------------------------------------------------------------- -canonicalizeDynamicSymtab+getObjectFlags :: Target- -> Bfd- -> Ptr Symbol- -> IO Int-canonicalizeDynamicSymtab targ bfd ps =+ -> IO [BfdFlags.Flags]+getObjectFlags targ = do- fn <- peekByteOff targ (#offset struct bfd_target, _bfd_canonicalize_dynamic_symtab)- r <- d_Bfd_PtrSymbol_CLong (unTarget'CanonicalizeDynamicSymtab fn) (ptr bfd) ps- return $ fromIntegral r+ f <- peekByteOff targ (#offset struct bfd_target, object_flags)+ return $ unTarget'ObjectFlags f -getSyntheticSymtab+getSectionFlags :: Target- -> Bfd- -> SymbolTable- -> SymbolTable- -> Ptr Symbol- -> IO Int-getSyntheticSymtab targ bfd sst dst synth =+ -> IO [SectionFlags.Flags]+getSectionFlags targ = do- fn <- peekByteOff targ (#offset struct bfd_target, _bfd_get_synthetic_symtab)- r <- d_Bfd_CLong_PtrSymbol_CLong_PtrSymbol_PtrSymbol_CLong (fn' fn) (ptr bfd) sts stp dts dtp synth- return $ fromIntegral r- where- fn' = unTarget'GetSyntheticSymtab- sts = fromIntegral $ tableSize sst- stp = tablePtr sst- dts = fromIntegral $ tableSize dst- dtp = tablePtr dst+ f <- peekByteOff targ (#offset struct bfd_target, section_flags)+ return $ unTarget'SectionFlags f -getDynamicRelocUpperBound- :: Target- -> Bfd- -> IO Int-getDynamicRelocUpperBound targ bfd =- do- fn <- peekByteOff targ (#offset struct bfd_target, _bfd_get_dynamic_reloc_upper_bound)- r <- d_Bfd_CLong (unTarget'GetDynamicRelocUpperBound fn) (ptr bfd)- return $ fromIntegral r+-- Testing ===================================================================== -canonicalizeDynamicReloc+-- | Returns 'True' if the 'Flavour' of the 'Target' is either 'Coff' or 'Xcoff'.+-- Otherwise 'False'.+isCoffFamily :: Target- -> Bfd- -> Ptr (Ptr Relocation)- -> Ptr Symbol- -> IO Int-canonicalizeDynamicReloc targ bfd rels syms =+ -> IO Bool+isCoffFamily targ = do- fn <- peekByteOff targ (#offset struct bfd_target, _bfd_canonicalize_dynamic_reloc)- r <- d_Bfd_PtrPtrRelocation_PtrSymbol_CLong (unTarget'CanonicalizeDynamicReloc fn) (ptr bfd) rels syms- return $ fromIntegral r+ flav <- getFlavour targ+ return $ flav == Coff || flav == Xcoff --- Testing ===================================================================== -- Byte Order ------------------------------------------------------------------ -- | Returns 'True' if the 'Target's byte order (see 'getByteorder') is 'Big'.@@ -370,20 +248,145 @@ bo <- getHeaderByteorder targ return $ bo == Little --- Coff Family -----------------------------------------------------------------+-- Internal ==================================================================== --- | Returns 'True' if the 'Flavour' of the 'Target' is either 'Coff' or 'Xcoff'.--- Otherwise 'False'.-isCoffFamily- :: Target- -> IO Bool-isCoffFamily targ =- do- flav <- getFlavour targ- return $ flav == Coff || flav == Xcoff+data Target' = Name TargetName+ | Flavour Flavour+ | Byteorder Endian+ | HeaderByteorder Endian+ | ObjectFlags [BfdFlags.Flags]+ | SectionFlags [SectionFlags.Flags]+ | GetSymtabUpperBound (FunPtr (Ptr Bfd' -> IO CLong))+ | CanonicalizeSymtab (FunPtr (Ptr Bfd' -> Ptr Symbol -> IO CLong))+ | PrintSymbol (FunPtr (Ptr Bfd' -> File -> Symbol -> CUInt -> IO ()))+ | GetDynamicSymtabUpperBound (FunPtr (Ptr Bfd' -> IO CLong))+ | CanonicalizeDynamicSymtab (FunPtr (Ptr Bfd' -> Ptr Symbol -> IO CLong))+ | GetSyntheticSymtab (FunPtr (Ptr Bfd' -> CLong -> Ptr Symbol -> CLong -> Ptr Symbol -> Ptr Symbol -> IO CLong))+ | GetDynamicRelocUpperBound (FunPtr (Ptr Bfd' -> IO CLong))+ | CanonicalizeDynamicReloc (FunPtr (Ptr Bfd' -> Ptr (Ptr Relocation) -> Ptr Symbol -> IO CLong))+ deriving (Show) --- -----------------------------------------------------------------------------+instance Storable Target' where+ sizeOf _ = #size struct bfd_target+ alignment = sizeOf+ peekByteOff buf off+ | off == (#offset struct bfd_target, name) =+ do+ val <- (#peek struct bfd_target, name) buf+ s <- peekCString val+ return $ Bindings.Bfd.Target.Name s+ | off == (#offset struct bfd_target, flavour) =+ do+ val <- (#peek struct bfd_target, flavour) buf :: IO CUInt+ return $ Flavour $ toEnum $ fromIntegral val+ | off == (#offset struct bfd_target, byteorder) =+ do+ val <- (#peek struct bfd_target, byteorder) buf :: IO CUInt+ return $ Byteorder $ toEnum $ fromIntegral val+ | off == (#offset struct bfd_target, header_byteorder) =+ do+ val <- (#peek struct bfd_target, header_byteorder) buf :: IO CUInt+ return $ HeaderByteorder $ toEnum $ fromIntegral val+ | off == (#offset struct bfd_target, object_flags) =+ do+ val <- (#peek struct bfd_target, object_flags) buf :: IO CUInt+ let+ flags = filter f $ enumFrom HasReloc+ where+ f e = val .&. (bit $ fromEnum e) /= 0+ return $ ObjectFlags flags+ | off == (#offset struct bfd_target, section_flags) =+ do+ val <- (#peek struct bfd_target, section_flags) buf :: IO CUInt+ let+ flags = filter f $ enumFrom Alloc+ where+ f e = val .&. (bit $ fromEnum e) /= 0+ return $ SectionFlags flags+ | off == (#offset struct bfd_target, _bfd_get_symtab_upper_bound) =+ do+ val <- (#peek struct bfd_target, _bfd_get_symtab_upper_bound) buf :: IO Word+ return $ GetSymtabUpperBound $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val+ | off == (#offset struct bfd_target, _bfd_canonicalize_symtab) =+ do+ val <- (#peek struct bfd_target, _bfd_canonicalize_symtab) buf :: IO Word+ return $ CanonicalizeSymtab $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val+ | off == (#offset struct bfd_target, _bfd_print_symbol) =+ do+ val <- (#peek struct bfd_target, _bfd_print_symbol) buf :: IO Word+ return $ PrintSymbol $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val+ | off == (#offset struct bfd_target, _bfd_get_dynamic_symtab_upper_bound) =+ do+ val <- (#peek struct bfd_target, _bfd_get_dynamic_symtab_upper_bound) buf :: IO Word+ return $ GetDynamicSymtabUpperBound $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val+ | off == (#offset struct bfd_target, _bfd_canonicalize_dynamic_symtab) =+ do+ val <- (#peek struct bfd_target, _bfd_canonicalize_dynamic_symtab) buf :: IO Word+ return $ CanonicalizeDynamicSymtab $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val+ | off == (#offset struct bfd_target, _bfd_get_synthetic_symtab) =+ do+ val <- (#peek struct bfd_target, _bfd_get_synthetic_symtab) buf :: IO Word+ return $ GetSyntheticSymtab $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val+ | off == (#offset struct bfd_target, _bfd_get_dynamic_reloc_upper_bound) =+ do+ val <- (#peek struct bfd_target, _bfd_get_dynamic_reloc_upper_bound) buf :: IO Word+ return $ GetDynamicRelocUpperBound $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val+ | off == (#offset struct bfd_target, _bfd_canonicalize_dynamic_reloc) =+ do+ val <- (#peek struct bfd_target, _bfd_canonicalize_dynamic_reloc) buf :: IO Word+ return $ CanonicalizeDynamicReloc $ castPtrToFunPtr $ wordPtrToPtr $ fromIntegral val+ | otherwise = error $ "internal error: Bfd.Target.peekByteOff " ++ show off +unTarget'CanonicalizeDynamicReloc+ :: Target'+ -> FunPtr (Ptr Bfd' -> Ptr (Ptr Relocation) -> Ptr Symbol -> IO CLong)+unTarget'CanonicalizeDynamicReloc (CanonicalizeDynamicReloc fn) = fn+unTarget'CanonicalizeDynamicReloc _ = error "unTarget'CanonicalizeDynamicReloc"++unTarget'CanonicalizeDynamicSymtab+ :: Target'+ -> FunPtr (Ptr Bfd' -> Ptr Symbol -> IO CLong)+unTarget'CanonicalizeDynamicSymtab (CanonicalizeDynamicSymtab fn) = fn+unTarget'CanonicalizeDynamicSymtab _ = error "unTarget'CanonicalizeDynamicSymtab"++unTarget'CanonicalizeSymtab+ :: Target'+ -> FunPtr (Ptr Bfd' -> Ptr Symbol -> IO CLong)+unTarget'CanonicalizeSymtab (CanonicalizeSymtab fn) = fn+unTarget'CanonicalizeSymtab _ = error "unTarget'CanonicalizeSymtab"++unTarget'GetDynamicRelocUpperBound+ :: Target'+ -> FunPtr (Ptr Bfd' -> IO CLong)+unTarget'GetDynamicRelocUpperBound (GetDynamicRelocUpperBound fn) = fn+unTarget'GetDynamicRelocUpperBound _ = error "unTarget'GetDynamicRelocUpperBound"++unTarget'GetDynamicSymtabUpperBound+ :: Target'+ -> FunPtr (Ptr Bfd' -> IO CLong)+unTarget'GetDynamicSymtabUpperBound (GetDynamicSymtabUpperBound fn) = fn+unTarget'GetDynamicSymtabUpperBound _ = error "unTarget'GetDynamicSymtabUpperBound"++unTarget'GetSymtabUpperBound+ :: Target'+ -> FunPtr (Ptr Bfd' -> IO CLong)+unTarget'GetSymtabUpperBound (GetSymtabUpperBound fn) = fn+unTarget'GetSymtabUpperBound _ = error "unTarget'GetSymtabUpperBound"++unTarget'GetSyntheticSymtab+ :: Target'+ -> FunPtr (Ptr Bfd' -> CLong -> Ptr Symbol -> CLong -> Ptr Symbol -> Ptr Symbol -> IO CLong)+unTarget'GetSyntheticSymtab (GetSyntheticSymtab fn) = fn+unTarget'GetSyntheticSymtab _ = error "unTarget'GetSyntheticSymtab"++unTarget'PrintSymbol+ :: Target'+ -> FunPtr (Ptr Bfd' -> File -> Symbol -> CUInt -> IO ())+unTarget'PrintSymbol (PrintSymbol fn) = fn+unTarget'PrintSymbol x = error $ "internal error: unXVec2 " ++ show x++-- PRIVATE #####################################################################+ unTarget'Name :: Target' -> TargetName@@ -420,93 +423,17 @@ unTarget'SectionFlags (SectionFlags b) = b unTarget'SectionFlags _ = error "unTarget'SectionFlags" -unTarget'GetSymtabUpperBound- :: Target'- -> FunPtr (Ptr Bfd' -> IO CLong)-unTarget'GetSymtabUpperBound (GetSymtabUpperBound fn) = fn-unTarget'GetSymtabUpperBound _ = error "unTarget'GetSymtabUpperBound"--unTarget'CanonicalizeSymtab- :: Target'- -> FunPtr (Ptr Bfd' -> Ptr Symbol -> IO CLong)-unTarget'CanonicalizeSymtab (CanonicalizeSymtab fn) = fn-unTarget'CanonicalizeSymtab _ = error "unTarget'CanonicalizeSymtab"--unTarget'GetDynamicSymtabUpperBound- :: Target'- -> FunPtr (Ptr Bfd' -> IO CLong)-unTarget'GetDynamicSymtabUpperBound (GetDynamicSymtabUpperBound fn) = fn-unTarget'GetDynamicSymtabUpperBound _ = error "unTarget'GetDynamicSymtabUpperBound"--unTarget'CanonicalizeDynamicSymtab- :: Target'- -> FunPtr (Ptr Bfd' -> Ptr Symbol -> IO CLong)-unTarget'CanonicalizeDynamicSymtab (CanonicalizeDynamicSymtab fn) = fn-unTarget'CanonicalizeDynamicSymtab _ = error "unTarget'CanonicalizeDynamicSymtab"--unTarget'GetSyntheticSymtab- :: Target'- -> FunPtr (Ptr Bfd' -> CLong -> Ptr Symbol -> CLong -> Ptr Symbol -> Ptr Symbol -> IO CLong)-unTarget'GetSyntheticSymtab (GetSyntheticSymtab fn) = fn-unTarget'GetSyntheticSymtab _ = error "unTarget'GetSyntheticSymtab"--unTarget'GetDynamicRelocUpperBound- :: Target'- -> FunPtr (Ptr Bfd' -> IO CLong)-unTarget'GetDynamicRelocUpperBound (GetDynamicRelocUpperBound fn) = fn-unTarget'GetDynamicRelocUpperBound _ = error "unTarget'GetDynamicRelocUpperBound"--unTarget'CanonicalizeDynamicReloc- :: Target'- -> FunPtr (Ptr Bfd' -> Ptr (Ptr Relocation) -> Ptr Symbol -> IO CLong)-unTarget'CanonicalizeDynamicReloc (CanonicalizeDynamicReloc fn) = fn-unTarget'CanonicalizeDynamicReloc _ = error "unTarget'CanonicalizeDynamicReloc"--unXVec2- :: Target'- -> FunPtr (Ptr Bfd' -> File -> Symbol -> CUInt -> IO ())-unXVec2 (PrintSymbol fn) = fn-unXVec2 x = error $ "internal error: unXVec2 " ++ show x---getPrintSymbol- :: Target- -> Bfd- -> File- -> Symbol- -> IO (IO ())-getPrintSymbol targ bfd file sym =- do - fn <- peekByteOff targ (#offset struct bfd_target, _bfd_print_symbol)- let- f = d_Bfd_File_Symbol_CUInt_Void (unXVec2 fn) (ptr bfd) file sym 2- return f---- -----------------------------------------------------------------------------+-- Foreign --------------------------------------------------------------------- foreign import ccall unsafe "bfd.h bfd_target_list" c_bfd_target_list :: Ptr CString +foreign import ccall unsafe "bfd.h bfd_find_target" c_bfd_find_target+ :: CString+ -> Ptr Bfd'+ -> IO Target+ foreign import ccall unsafe "bfd.h bfd_set_default_target" c_bfd_set_default_target :: CString -> IO CInt -foreign import ccall unsafe "dynamic" d_Bfd_CLong- :: FunPtr (Ptr Bfd' -> IO CLong)- -> (Ptr Bfd' -> IO CLong)--foreign import ccall unsafe "dynamic" d_Bfd_CLong_PtrSymbol_CLong_PtrSymbol_PtrSymbol_CLong- :: FunPtr (Ptr Bfd' -> CLong -> Ptr Symbol -> CLong -> Ptr Symbol -> Ptr Symbol -> IO CLong) - -> (Ptr Bfd' -> CLong -> Ptr Symbol -> CLong -> Ptr Symbol -> Ptr Symbol -> IO CLong)--foreign import ccall unsafe "dynamic" d_Bfd_PtrSymbol_CLong- :: FunPtr (Ptr Bfd' -> Ptr Symbol -> IO CLong)- -> (Ptr Bfd' -> Ptr Symbol -> IO CLong)--foreign import ccall unsafe "dynamic" d_Bfd_PtrPtrRelocation_PtrSymbol_CLong- :: FunPtr (Ptr Bfd' -> Ptr (Ptr Relocation) -> Ptr Symbol -> IO CLong) - -> (Ptr Bfd' -> Ptr (Ptr Relocation) -> Ptr Symbol -> IO CLong)--foreign import ccall unsafe "dynamic" d_Bfd_File_Symbol_CUInt_Void- :: FunPtr (Ptr Bfd' -> File -> Symbol -> CUInt -> IO ()) - -> (Ptr Bfd' -> File -> Symbol -> CUInt -> IO ())