diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 6e0bd2963..6cb1406db 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -34,14 +34,25 @@ jobs: matrix: board: - fqbn: arduino:mbed:nano33ble + id: nano33ble - fqbn: arduino:mbed:envie_m7 + id: envie_m7 + - fqbn: arduino:mbed:envie_m7:target_core=cm4 + id: envie_m7_core_cm4 - fqbn: arduino:mbed:nanorp2040connect + id: nanorp2040connect - fqbn: arduino:mbed:nicla_sense + id: nicla_sense - fqbn: arduino:mbed:nicla_vision + id: nicla_vision - fqbn: arduino:mbed:opta + id: opta - fqbn: arduino:mbed:giga + id: giga - fqbn: arduino:mbed:nicla_voice + id: nicla_voice - fqbn: arduino:mbed:edge_control + id: edge_control # compile only the examples compatible with each board include: @@ -71,6 +82,8 @@ jobs: - name: ArduinoBLE - name: ArduinoGraphics - name: Arduino_GigaDisplayTouch + - name: emWin + - name: Arduino_DebugUtils additional-sketch-paths: | - libraries/PDM - libraries/doom @@ -142,6 +155,7 @@ jobs: - name: ArduinoGraphics - name: Arduino_GigaDisplayTouch - name: arducam_dvp + - name: emWin additional-sketch-paths: | - libraries/PDM - libraries/MCUboot @@ -175,6 +189,7 @@ jobs: fqbn: arduino:mbed:edge_control additional-libraries: | - name: MicroNMEA + - name: Arduino_DebugUtils additional-sketch-paths: | - libraries/GSM - libraries/USBHID @@ -183,11 +198,11 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 # The source files are in a subfolder of the ArduinoCore-API repository, so it's not possible to clone it directly to the final destination in the core - name: Checkout ArduinoCore-API - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: repository: arduino/ArduinoCore-API path: ArduinoCore-API @@ -222,7 +237,7 @@ jobs: - name: Save memory usage change report as artifact if: github.event_name == 'pull_request' - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: path: ${{ env.SKETCHES_REPORTS_PATH }} - name: ${{ env.SKETCHES_REPORTS_PATH }} + name: ${{ env.SKETCHES_REPORTS_PATH }}-${{ matrix.board.id }} diff --git a/boards.txt b/boards.txt index 6dea04908..ee8018487 100644 --- a/boards.txt +++ b/boards.txt @@ -163,11 +163,12 @@ envie_m7.bootloader.tool.default=openocd envie_m7.bootloader.config=-f target/stm32h7x_dual_bank.cfg envie_m7.bootloader.programmer=-f interface/stlink.cfg envie_m7.bootloader.extra_action.preflash=stm32h7x option_write 0 0x01c 0xb86aaf0 -envie_m7.bootloader.file=PORTENTA_H7/portentah7_bootloader_mbed_hs_v2.elf +envie_m7.bootloader.file=PORTENTA_H7/portentah7_bootloader_mbed_hs_v2.hex envie_m7.debug.server.openocd.scripts.0=interface/{programmer.protocol}.cfg envie_m7.debug.server.openocd.scripts.1={programmer.transport_script} envie_m7.debug.server.openocd.scripts.2=target/stm32h7x_dual_bank.cfg +envie_m7.debug.cortex-debug.custom.request=attach envie_m7.menu.target_core.cm7.debug.svd_file={runtime.platform.path}/svd/STM32H747_CM7.svd envie_m7.menu.target_core.cm4.debug.svd_file={runtime.platform.path}/svd/STM32H747_CM4.svd @@ -442,6 +443,8 @@ nicla_sense.upload.wait_for_upload_port=true nicla_sense.upload.native_usb=true nicla_sense.upload.maximum_size=527616 nicla_sense.upload.maximum_data_size=64288 +nicla_sense.programmer.protocol=cmsis-dap +nicla_sense.programmer.transport_script={runtime.platform.path}/debugger/select_swd.cfg nicla_sense.bootloader.tool=openocd nicla_sense.bootloader.tool.default=openocd @@ -495,6 +498,8 @@ nicla_voice.upload.wait_for_upload_port=true nicla_voice.upload.native_usb=true nicla_voice.upload.maximum_size=527616 nicla_voice.upload.maximum_data_size=64288 +nicla_voice.programmer.protocol=cmsis-dap +nicla_voice.programmer.transport_script={runtime.platform.path}/debugger/select_swd.cfg nicla_voice.bootloader.tool=openocd nicla_voice.bootloader.tool.default=openocd @@ -598,14 +603,16 @@ nicla_vision.menu.target_core.cm4.upload.maximum_data_size=294248 nicla_vision.debug.tool=gdb nicla_vision.bootloader.tool=openocd +nicla_vision.bootloader.tool.default=openocd nicla_vision.bootloader.config=-f target/stm32h7x_dual_bank.cfg nicla_vision.bootloader.programmer=-f interface/stlink.cfg nicla_vision.bootloader.extra_action.preflash=stm32h7x option_write 0 0x01c 0xb86aaf0 -nicla_vision.bootloader.file=NICLA_VISION/bootloader.elf +nicla_vision.bootloader.file=NICLA_VISION/bootloader.hex nicla_vision.debug.server.openocd.scripts.0=interface/{programmer.protocol}.cfg nicla_vision.debug.server.openocd.scripts.1={programmer.transport_script} nicla_vision.debug.server.openocd.scripts.2=target/stm32h7x_dual_bank.cfg +nicla_vision.debug.cortex-debug.custom.request=attach nicla_vision.menu.target_core.cm7.debug.svd_file={runtime.platform.path}/svd/STM32H747_CM7.svd nicla_vision.menu.target_core.cm4.debug.svd_file={runtime.platform.path}/svd/STM32H747_CM4.svd @@ -733,14 +740,16 @@ opta.menu.target_core.cm4.upload.maximum_data_size=294248 opta.debug.tool=gdb opta.bootloader.tool=openocd +opta.bootloader.tool.default=openocd opta.bootloader.config=-f target/stm32h7x_dual_bank.cfg opta.bootloader.programmer=-f interface/stlink.cfg opta.bootloader.extra_action.preflash=stm32h7x option_write 0 0x01c 0xb86aaf0 -opta.bootloader.file=OPTA/bootloader.elf +opta.bootloader.file=OPTA/bootloader.hex opta.debug.server.openocd.scripts.0=interface/{programmer.protocol}.cfg opta.debug.server.openocd.scripts.1={programmer.transport_script} opta.debug.server.openocd.scripts.2=target/stm32h7x_dual_bank.cfg +opta.debug.cortex-debug.custom.request=attach opta.menu.target_core.cm7.debug.svd_file={runtime.platform.path}/svd/STM32H747_CM7.svd opta.menu.target_core.cm4.debug.svd_file={runtime.platform.path}/svd/STM32H747_CM4.svd @@ -835,13 +844,15 @@ giga.menu.target_core.cm4.upload.maximum_data_size=294248 giga.debug.tool=gdb giga.bootloader.tool=openocd +giga.bootloader.tool.default=openocd giga.bootloader.config=-f target/stm32h7x_dual_bank.cfg giga.bootloader.programmer=-f interface/stlink.cfg giga.bootloader.extra_action.preflash=stm32h7x option_write 0 0x01c 0xb86aaf0 -giga.bootloader.file=GIGA/bootloader.elf +giga.bootloader.file=GIGA/bootloader.hex giga.debug.server.openocd.scripts.0=interface/{programmer.protocol}.cfg giga.debug.server.openocd.scripts.1={programmer.transport_script} giga.debug.server.openocd.scripts.2=target/stm32h7x_dual_bank.cfg +giga.debug.cortex-debug.custom.request=attach giga.menu.target_core.cm7.debug.svd_file={runtime.platform.path}/svd/STM32H747_CM7.svd giga.menu.target_core.cm4.debug.svd_file={runtime.platform.path}/svd/STM32H747_CM4.svd \ No newline at end of file diff --git a/bootloaders/GIGA/bootloader.hex b/bootloaders/GIGA/bootloader.hex new file mode 100644 index 000000000..be299777f --- /dev/null +++ b/bootloaders/GIGA/bootloader.hex @@ -0,0 +1,8008 @@ +:020000040800F2 +:10000000000008247D060008C9060008C90600088B +:10001000C9060008C9060008C9060008000000005B +:10002000000000000000000000000000B50500080E +:10003000C9060008000000004F0600085F0600081F +:10004000C9060008C9060008C9060008C906000854 +:10005000C9060008C9060008C9060008C906000844 +:10006000C9060008C9060008C9060008C906000834 +:10007000C9060008C9060008C9060008C906000824 +:10008000C9060008C9060008C9060008C906000814 +:10009000C9060008C9060008C9060008C906000804 +:1000A000C9060008C9060008C9060008C9060008F4 +:1000B000C9060008C9060008C9060008C9060008E4 +:1000C000C9060008C9060008C9060008C9060008D4 +:1000D000C9060008C9060008C9060008C9060008C4 +:1000E000C9060008C906000800000000C90600088B +:1000F000C9060008C9060008C9060008C9060008A4 +:10010000C9060008C9060008C9060008C906000893 +:10011000C9060008C9060008C9060008C906000883 +:10012000C9060008C9060008C9060008C906000873 +:10013000C9060008C9060008C9060008C906000863 +:10014000C9060008C9060008000000000000000001 +:10015000C9060008C9060008C9060008C906000843 +:10016000C9060008C9060008C9060008C906000833 +:10017000C9060008C9060008C906000800000000FA +:10018000C9060008C9060008C9060008C906000813 +:10019000C9060008C9060008C9060008C906000803 +:1001A000C9060008C9060008C9060008C9060008F3 +:1001B000C9060008C9060008C9060008C9060008E3 +:1001C000C9060008C9060008C9060008C9060008D3 +:1001D000C9060008C9060008C9060008C9060008C3 +:1001E000C9060008C9060008C9060008C9060008B3 +:1001F000C9060008C9060008C9060008C9060008A3 +:10020000C9060008C9060008C9060008C906000892 +:10021000C9060008C9060008C9060008C906000882 +:10022000C9060008C9060008C9060008C906000872 +:10023000C90600087D5B0008C9060008C906000859 +:10024000C9060008C9060008C9060008C906000852 +:10025000C9060008C9060008C9060008C906000842 +:10026000C9060008C9060008C9060008C906000832 +:10027000C9060008C9060008C9060008C906000822 +:10028000C9060008C9060008C906000800000000E9 +:10029000C9060008C90600080000000000000000B0 +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F0004D4355626F6F742041726475696E6F0073 +:10030000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:10031000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:10032000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:10033000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:10034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:10035000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:10036000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:10037000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:10038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:10039000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:1003B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:1003C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:1003D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:1003E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:1003F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:10040000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:10041000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:10042000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:10043000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:10044000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:10045000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:10046000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:10047000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:10048000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:10049000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:1004A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:1004B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:1004C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:1004D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:1004E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:1004F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:1005000010B5054C237833B9044B13B10448AFF34D +:1005100000800123237010BD20040024000000008F +:100520003CC1010808B5034B1BB103490348AFF3B5 +:10053000008008BD00000000240400243CC1010824 +:10054000154B002B08BF134B9D46A3F5803A0021A5 +:100550008B460F461348144A121A18F097F90F4B9E +:10056000002B00D098470E4B002B00D0984700205E +:10057000002104000D000D48002802D00C480CF0AA +:100580005BFF17F07BFF2000290014F057F80DF0F7 +:1005900021F900BF0000080000000824000000004E +:1005A000C14701082004002458A5022439D40008BA +:1005B000000000001EF0040F0CBFEFF30880EFF303 +:1005C0000980816911F8021C002932D101B590E837 +:1005D0000F10E047BDE800508CE80300244B93E87F +:1005E0000600914208BF70471A6041B91EF0100F13 +:1005F00010D1204B186820F0010018600AE02CE9A7 +:10060000F00F1EF0100F08BF2CED108A81F822E0C9 +:10061000C1F838C0906B92F8221061F0FF0E1EF006 +:10062000100F08BFB0EC108AB0E8F00F80F3098813 +:100630007047114A13689942FAD801B552F821C09F +:100640000FC8E047BDE80050CCF80000704701B586 +:1006500014F0EEFABDE80140EFF3098CBEE701B5F6 +:1006600014F028FBBDE80140EFF3098CB6E7000069 +:100670002C01002434EF00E0ACBE0108DFF830D0DC +:1006800005F0AEFA002103E00A4B5B5843500431F9 +:1006900009480A4B42189A42F6D3094A02E000235D +:1006A00042F8043B074B9A42F9D3FFF749FF7047E2 +:1006B0000000082414F0010800000024180400249D +:1006C0002004002458A50224FEE70000264B022245 +:1006D00083F83E201B681A6A22F001021A621A6A25 +:1006E00042F001021A62214A934219D002F5806257 +:1006F000934215D002F57052934211D002F58062F8 +:1007000093420DD002F58062934209D0B3F1804F3D +:100710000ED19968164A0A40062A21D10020704756 +:100720005A6C42F400425A64104A9342EED1F0E708 +:10073000104A9342EDD002F580629342E9D002F56F +:1007400080629342E5D002F578429342E1D0A2F56F +:100750006C429342DDD01A6842F001021A60DDE774 +:10076000B2F5803FF7D1D9E76405002400000140CD +:10077000070001000004004008B5044B027853F85C +:10078000220003685B6B9847C0B208BD00000024DC +:1007900073B50E4600781146064A002452F8200030 +:1007A0000268CDE90034234695693246A84702B075 +:1007B00070BD00BF0000002410B5846802EB011278 +:1007C00001312023A03C0C32A4EB4111FFF7E0FFE4 +:1007D000003818BF012010BD024B6FF002021B68E9 +:1007E0001A61704764050024034B1A68D36823F02C +:1007F0000203D360704700BF64050024064B6FF00E +:1008000002021B681A615A6942F002025A61DA68F0 +:1008100042F00202DA60704764050024054B6FF075 +:1008200002021B6858631A61DA6842F00202DA6059 +:10083000704700BF64050024014B586A704700BF31 +:10084000000C0040064A1168CB6823F00203CB601D +:1008500092F83E30012B01D1FFF738BF704700BF3F +:1008600064050024074B084A13601A69910708D5EC +:10087000DA68920705D56FF0020204481A610CF09D +:1008800097BE7047000C004064050024A4AC01082A +:100890000048704754AC01086AB101F00301074BEE +:1008A0000329596808D000F47060B0F5706F03D167 +:1008B00021EA02025A6070470A43FBE7000400582D +:1008C00030B5114B114DD5F894409C42FBD14943B2 +:1008D000012A01EB41034FEA41046FEA030304D00C +:1008E000022A0BD0C26813400BE0C26813401943C0 +:1008F000C160064B4FF440725A6130BDC26813406C +:100900002343C360F5E700BF000300800064025882 +:100910002DE9F04191F800E04B7874464E69012BC7 +:10092000354F4FEA4414DFF8D4C044D100F51065C8 +:100930002B19B6B91E6937401F611E6946F400269F +:100940001E611E6906EA0C06012A1E6122D10A698F +:1009500002B15A612B5943F004432B510020BDE8EA +:10096000F081D3F8108008EA0C0CC3F810C0D3F85B +:1009700010C00CEA07071F618F68BE421E6946F46B +:10098000002688BF4F611E614E691F69C6F31206BB +:100990003E43D9E72B5943F004432B514B69002BBD +:1009A000DCD00EF00F020123D0F8341893400B4333 +:1009B000C0F83438D2E700F5306003191D6905EA44 +:1009C0000C051D611D693D401D618D6806B14D61BD +:1009D0001E69C5F31205012A46F400261E611E6930 +:1009E00045EA06051D6102D1CA6802B15A61035980 +:1009F00043F004430351B1E7FFFF07E00000F8FFB5 +:100A00004E4A70B5946A966AD36A16F07C7FC6F334 +:100A10000551556C00F08D8007EE901AC3F300234A +:100A2000C5F3CC0104F00304F8EEE76A4B43012C54 +:100A3000B7EE006A07EE903AFAEEE97A6BD0022C34 +:100A40005BD0002C67D113689B0646D51168136CE8 +:100A5000C1F3C1013A4AC3F30803CA4007EE102AA2 +:100A6000F8EEC75A85EEA67A06EE903AF8EEE66AF8 +:100A700076EEA77A77EE867A304A67EE877A136C3D +:100A8000C3F3462307EE103AB8EEC77A37EE067A7C +:100A9000C7EE876AFCEEE66AC0ED006A136CC3F32A +:100AA000064307EE103AB8EEC77A37EE067AC7EE7D +:100AB000876AFCEEE66AC0ED016A136CC3F3066355 +:100AC00007EE103AB8EEC77A37EE066A87EE867AF6 +:100AD000BCEEC77A80ED027A70BD136CDFED195A57 +:100AE000C3F3080307EE103AB8EEC77A77EE277A19 +:100AF00077EE867A85EEA67ABEE7136CDFED125AA2 +:100B0000C3F3080307EE103AB8EEC77A77EE277AF8 +:100B100077EE867AEEE7136CDFED0C5AC3F3080329 +:100B200007EE103AB8EEC77A77EE277A77EE867A34 +:100B3000E0E7C0E900118160CEE700BF0044025841 +:100B40000090D0030024744C0024744B0024744A99 +:100B50004E4A70B5946A966AD36A16F47C3FC6F31F +:100B60000531D56B00F08D8007EE901AC3F30013AA +:100B7000C5F3CC0104F00304F8EEE76A4B43012C03 +:100B8000B7EE006A07EE903AFAEEE97A6BD0022CE3 +:100B90005BD0002C67D113689B0646D51168936B18 +:100BA000C1F3C1013A4AC3F30803CA4007EE102A51 +:100BB000F8EEC75A85EEA67A06EE903AF8EEE66AA7 +:100BC00076EEA77A77EE867A304A67EE877A936B6D +:100BD000C3F3462307EE103AB8EEC77A37EE067A2B +:100BE000C7EE876AFCEEE66AC0ED006A936BC3F35A +:100BF000064307EE103AB8EEC77A37EE067AC7EE2C +:100C0000876AFCEEE66AC0ED016A936BC3F3066384 +:100C100007EE103AB8EEC77A37EE066A87EE867AA4 +:100C2000BCEEC77A80ED027A70BD936BDFED195A86 +:100C3000C3F3080307EE103AB8EEC77A77EE277AC7 +:100C400077EE867A85EEA67ABEE7936BDFED125AD1 +:100C5000C3F3080307EE103AB8EEC77A77EE277AA7 +:100C600077EE867AEEE7936BDFED0C5AC3F3080359 +:100C700007EE103AB8EEC77A77EE277A77EE867AE3 +:100C8000E0E7C0E900118160CEE700BF00440258F0 +:100C90000090D0030024744C0024744B0024744A48 +:100CA000002070476FF0570070476FF05700704793 +:100CB000036810B49C6C0023A4461A465DF8044BEC +:100CC00060476FF05700704743680A46196810B4D0 +:100CD0008C6D8168184623465DF8044B18474368BD +:100CE00081681A681846526D1047436881681A680F +:100CF0001846126D1047436881681A681846D26C0E +:100D0000104730B4446813462268956C0A468168DF +:100D10002046AC4630BC6047436881681A68184674 +:100D2000526C1047436881681A681846126C104765 +:100D300030B4446813462268D56B0A468168204661 +:100D4000AC4630BC604730B4446813462268956BAB +:100D50000A4681682046AC4630BC604710B5044660 +:100D6000406830B10368A1685B6B984700236360FB +:100D700010BD6FF01500FBE738B50446FFF7EEFF36 +:100D80000546236820465B689847284638BD70B5FD +:100D90000D464168044641B929680E6B00F108010F +:100DA0002846B04700B9656070BD6FF01500FBE7DD +:100DB000044B10B50360044643680BB1FFF7CEFF48 +:100DC000204610BD28AB0108034B10B50446036054 +:100DD000FFF7EEFF204610BDB4AB01084368816801 +:100DE0001A681846526F1047436881681A68184697 +:100DF000126F1047436881681A681846D26E104710 +:100E000043680A46196810B48C6E816818462346F8 +:100E10005DF8044B184710B50446406830B10368CC +:100E2000A1681B6E98470023636010BD6FF015002A +:100E3000FBE738B50446FFF7EEFF0546236820467A +:100E40005B689847284638BD38B5436804460D4668 +:100E500043B90B6800F108012846DB6D984700B9DB +:100E6000656038BD6FF01500FBE70000044B10B55E +:100E70000360044643680BB1FFF7CDFF204610BD69 +:100E8000FCAA0108034B10B504460360FFF7EEFF10 +:100E9000204610BD88AB01080368013303600020C1 +:100EA0007047F7B5089F0E4604681946C0690023CD +:100EB000256800970027E0FB0623204601976D690F +:100EC000A84703B0F0BDF7B5089F0E460468194661 +:100ED000C0690023256800970027E0FB0623204611 +:100EE0000197AD69A84703B0F0BD37B50468C36981 +:100EF00000202268009301902046D569A1FB0323BE +:100F0000A84703B030BD006803681B691847002874 +:100F100007DC10F1160F04DA10F1340F08BF6FF080 +:100F2000890070470B4640F20112002170B504465B +:100F3000184617F0ABFC03466068A1680268556E5E +:100F40001A462B46BDE870401847000038B50C4BD8 +:100F500004460C4D03600023C0E9013101230373F3 +:100F6000284610F00BFF09F06FFD074B28461A6862 +:100F70001C60626010F002FF09F046FD204638BD9B +:100F800008AC0108D8060024D406002413B50C468A +:100F9000A430019009F058FDA469019809F034FDCE +:100FA000204602B0BDE81040FFF7B1BF37B50D468F +:100FB000A430019009F048FDEB696C6913F4003F1F +:100FC000019803D02B6A9C4238BF1C4609F01CFDD7 +:100FD000204603B0BDE83040FFF799BF13B50C467B +:100FE000A430019009F030FD246A019809F00CFD4D +:100FF000204602B0BDE81040FFF789BF10B5044697 +:10100000FFF7E2FE204617F0D7FB204610BD10B5D3 +:101010000446FFF737FF204617F0CEFB204610BDF1 +:1010200010B50446FFF7C4FE204617F0C5FB204666 +:1010300010BD10B50446FFF719FF204617F0BCFBA2 +:10104000204610BD37B50546A4300C46019009F086 +:10105000FBFC05F124026B6A01981BB19C420DD187 +:101060002368136009F0D0FC14B1204617F0A4FBEC +:10107000002003B0BDE83040FFF749BF1A461B68A7 +:10108000EBE700002DE9F04FE9B0054693460F4627 +:101090004422002115A8984617F0F8FBEA6D42F2A9 +:1010A00010735946073215A82393D2080DF0D6FFC6 +:1010B0000446002840F0D18105F1340108F10C000C +:1010C0000DF03CFF002840F0A38005F128014046C8 +:1010D0000DF034FFB0FA80F35B090593EB6DB3F5C7 +:1010E000C07F2CBF052204220392059A12B1039AF5 +:1010F00001320392039A934298BF0222013B02F10C +:10110000FF390392012202FA09F206929DF8182093 +:101110000492039A1344B3FBF2F30293059B13B1B9 +:101120006E6F002E5ED12421069818F053FE0646FD +:10113000002800F0958100244FF0240A0AFB046087 +:1011400001340DF0C7FE049AE3B29A42F6D8414644 +:1011500030460EF017FB044600286ED1029B8046F5 +:1011600003FB09FA4FF00109D04553D10DF198095D +:1011700000220123484603EBC30101325B0006EB6A +:101180008101DBB240F8041B04999942F3D826A9E7 +:10119000284610F041F8044600284ED14FF00108CF +:1011A00008EBC803C24606EB830352460AF1FF3A36 +:1011B000002A6BD14FEA4808049B5FFA88F8434540 +:1011C000EED824230132069991426DD14A1E284659 +:1011D00026A910F021F8044678BB059B13B1069BA5 +:1011E0006E67AB67002405F14C0801230DF124095B +:1011F000214640460E94C9F80840C9E90034CDE9BB +:101200000C340EF004F8012853D0A4F59F4414E0E8 +:10121000059463E7029BB8FBF3F009FA00F124237D +:10122000C9B203FB0162029B03FB1080E8B11146C7 +:1012300028460FF05DFB044628B315A80DF078FD95 +:10124000442115A80CF0FAFF42F2107323936B6F40 +:10125000B34202D0002E40F0128114B138460EF095 +:101260001EF9204669B0BDE8F08F49081046079284 +:1012700001EBC10106EB81010EF084FA079A0446E6 +:101280000028D4D0D9E708F101086DE724222846C8 +:10129000079302FB0AF1721819440FF06FFC079BC9 +:1012A0000446002881D0C8E703FB026149F8041B0B +:1012B00088E7214658460DF0AAFFB0FA80FA594651 +:1012C00048460EF033FA04464FEA5A1A00BB5A4613 +:1012D00041460CA80EF0E7FE0446C8B952460CA9D8 +:1012E00048460EF085F8044690B9029B0DF1980827 +:1012F000014626A85A1CA34617F0C8FA4346029A8C +:101300005A454FD14FF0000E4FF0010CE34565D226 +:101310000CA80EF0A3F809A80EF0A0F8002C8CD1B0 +:101320000CA80DF198080DF0D5FD029B3246394608 +:1013300018F8033028460093049B0EF0FBFE044689 +:1013400088B9012107F118000DF0B2FF044650B929 +:1013500015AB4D4A394628460FF060FA044610B9DD +:10136000029B002B5BD10CA80EF08BF8002C7FF4B5 +:1013700064AF5246394628460EF0B8FE04460028AF +:101380007FF45BAF15AB404A394628460FF046FA6A +:10139000044600287FF451AF394628460FF0EEFE90 +:1013A00004464AE75946002248460591CDE90632EF +:1013B0000DF02DFF079A069B9040029993F800C00C +:1013C00001324CEA00001870084605990144039860 +:1013D0009042E9D80BF1010B013390E798F8010036 +:1013E0000CF1010C98F8002080EA0E0300EA0E00D0 +:1013F000D9435BB201F0010112FB01F252B203EAE0 +:101400000209534008F8013F49EA000E18F8013C70 +:101410005FFA8EFE43EAC11108F8011C76E7029BD1 +:101420003A4639462846013B02930FF061FA90B9DB +:10143000029B32460CA9284613F808300093049BFF +:101440000EF078FE38B90CAB3A46394628460FF014 +:1014500095FB002884D0044685E700260496ECE638 +:101460000A4CEAE608FB056001350EF018F8EBB20D +:10147000049A9A42F6D8304617F09EF9EDE6002518 +:101480004FF02408F3E700BF41EE000880B2FFFFF1 +:101490002DE9F04F2DED028BBBB004460E46914670 +:1014A00008EE103A0DF040FD022840F09D814422E4 +:1014B000002129A820AD17F0E9F942F2107328465F +:1014C000012737930DF006FDE26D0023494629A858 +:1014D00007320493D208CDE902730DF0BFFD034635 +:1014E000002862D118EE101A02A80EF01FF9034668 +:1014F00000285AD118EE101A28460EF043F9034678 +:10150000002852D1394630460DF0D2FE034600285D +:101510004BD106F11807014638460DF0C9FE0346C7 +:10152000002842D104F1040B06F10C000DF096FFE7 +:10153000594628460DF002FD00282EDA29ABB34AA1 +:10154000294620460FF020F9034670BB48464FF06D +:1015500001080DF0B7FD431E0093009B01333FD1FE +:1015600029ABAA4A314620460FF00EF90346E0B9EE +:101570005A46394638460FF02DFC0346A8B93B467B +:101580003246314620460FF003F8034668B9012180 +:1015900038460DF08DFE034607E05A462946284698 +:1015A0000EF04DFA03460028C2D029A800930DF092 +:1015B000BFFB442129A80CF041FE42F2107220A882 +:1015C00037920DF05EFF02A80DF048FF009B002B44 +:1015D00000F00B8118463BB0BDEC028BBDE8F08FEC +:1015E000009948460DF013FE29465FFA80FA30460E +:1015F00052460DF0BFFE03460028D6D1524626A91A +:1016000038460DF0B7FE03460028CED13B461F906A +:10161000324605A9CDE90580CDE90708CDE90900E5 +:10162000CDE90B80CDE90D08CDE90F00CDE91180A2 +:10163000CDE91308CDE91500CDE91780CDE91908EA +:10164000CDE91B00CDE91D8020460EF0C9FD034603 +:10165000002840F0938005AB08A920461A460EF0FA +:1016600097FF0346002840F089803B4632460BA98D +:1016700020460EF0C5FD034600287FD10BAB0EA916 +:1016800020461A460EF084FF0346002876D10EABA2 +:1016900008AA11A920460EF0B3FD034600286DD11B +:1016A00026AB2A4614A920460EF09AFD03460028D0 +:1016B00064D126AB2A4617A920460EF0A1FD0346A9 +:1016C00000285BD105AB17AA1AA920460EF060FFCF +:1016D0000346002852D10BAB14AA1DA920460EF0D8 +:1016E00057FF0346002849D11DAB1AAA29462046B8 +:1016F0000EF076FD0346002840D12B462A462946A7 +:1017000020460EF045FF0346002837D11DAB1AAA2C +:1017100026A920460EF074FD034678BB26AB204672 +:101720001A4619460EF034FF034638BB26AB02AA10 +:10173000204619460EF02CFF0346F8B90EAB08AA56 +:10174000314620460EF024FF0346B8B911AB04F130 +:101750001002394620460EF01BFF034670B93B4687 +:101760000EAA394620460EF03BFD034630B93B46F3 +:1017700011AA394620460EF00BFF034605A8019337 +:101780000DF06CFE08A80DF069FE0BA80DF066FECA +:101790000EA80DF063FE11A80DF060FE14A80DF068 +:1017A0005DFE17A80DF05AFE1AA80DF057FE1DA8F1 +:1017B0000DF054FE019B002B7FF4F7AE52462946F4 +:1017C00030460DF0D7FD034600287FF4EEAE5246BA +:1017D00026A938460DF0CEFD009B013B0093034641 +:1017E00000283FF4BAAEE0E6094B204600930DF026 +:1017F0009BFB0128009B7FF4EDAE18EE103A4A46A1 +:1018000031462046FFF73EFC0346E3E641EE000882 +:1018100080B0FFFFF7B505460C461046012116467D +:101820001F460DF0CEFB30B93946204603B0BDE867 +:10183000F0400DF0A7BF4FF0FF3130460DF0C1FB77 +:10184000A0B9394620460DF09DFF10BB04F10C02F3 +:101850000146104601920DF0B4FB019AC8B1291D52 +:10186000104603B0BDE8F0400EF01DBC31462846DE +:101870000DF0DEFC68B9394628460EF0D5FE40B9B9 +:101880003B4632462146284603B0BDE8F040FFF70C +:10189000FFBD03B0F0BD30B58FB00C461946139DA7 +:1018A000FBB10023CDE906330893130F8DF82430E4 +:1018B000130D8DF82530130B12098DF826308DF895 +:1018C00027204FF48E72237802FB0300129B05AA97 +:1018D00005930AAB0430009306ABCDE901550FF038 +:1018E000E1FD0FB030BD37B50223154601AA04460D +:1018F0000FF066FD18B9019B1BB96FF0630003B0D0 +:1019000030BD236893F90030002BF6DB019B3BB11F +:1019100022681178A1B1042BEFD801D10B06ECD4C9 +:1019200000232B60019B5A1E0192002BE7D02368F5 +:10193000296813F8012B42EA01222A602360F1E7AB +:101940000132013B22600193E0E70000F8B50A2371 +:10195000684E05460C46036033681BB90FF0A2FFC2 +:101960000123336005F108032A46214604F11000E3 +:1019700042F8043F8B78043111F8034C1B0443EA0E +:10198000042311F8044C234311F8014C884243EA24 +:10199000046342F8043FEDD12B680C2B2ED00E2BA4 +:1019A0005DD00A2B28D128465349544D00F1A0069A +:1019B0004269103055F8044B50F8087CC2F30723F5 +:1019C0007C40CB5C6340140E0C5D83EA0443D4B2CC +:1019D0000C5D83EA0463C2F307440C5D83EA0423CD +:1019E00050F8044C836063400468C3606340036143 +:1019F000534043618642DBD10020F8BD28463F4C6E +:101A0000C0353D49C269183054F8046B50F8107C59 +:101A1000C2F307237E40CB5C7340160E8E5D83EAD3 +:101A20000643D6B28E5D83EA0663C2F307468E5D37 +:101A300083EA062350F80C6C8360734050F8086CFE +:101A4000C360734050F8046C0361734006684361DF +:101A5000734083615340C3618542D3D1CCE72846AC +:101A60002549264D00F1E006446A203055F8042B44 +:101A700050F8187CC4F307237A40CB5C50F8087CFC +:101A80005340220E8A5C83EA0243E2B28A5C83EA14 +:101A90000263C4F307428A5C83EA022350F8142CE1 +:101AA0008360534050F8102CC360534050F80C2C06 +:101AB00003615340DAB243618A5C7A401F0ECF5D06 +:101AC00082EA0762C3F30727C3F30743CF5DCB5C0A +:101AD00082EA072282EA034350F8042C83615340D0 +:101AE0000268C36153400362634043628642BBD1D4 +:101AF00082E700BF000700243C0400243C050024CA +:101B0000F8B5037890F801C0012B057F0279077BB7 +:101B1000866844792ED0022B2FD0002B30D14FF481 +:101B200080738B610023C1F800C04D614B63C1E934 +:101B30000B333FB3CB61CB60037C012B45D0022B31 +:101B400048D0002B4BD14FF480430B620123027E1F +:101B5000002A47D000230B620B61437F012B6AD020 +:101B6000022B6BD0002B6CD14FF0807300204B62A6 +:101B70008862F8BD4FF40073D3E74FF44073D0E7A9 +:101B80000023CEE7012A4E600BD0022A0CD072B996 +:101B90004FF48063CB61032C09D8DFE804F00B0D10 +:101BA00010134FF40063F5E74FF44063F2E7274862 +:101BB0000BF036FE0023BEE74FF48053BBE74FF433 +:101BC0000053B8E74FF44053B5E74FF400430B62BE +:101BD0000223BCE74FF440430B620423B7E7002322 +:101BE0000B62B4E77BB3427CB2FBF3F403FB142437 +:101BF00014F0FF0F27D1561EF610741C042C22DCA3 +:101C0000C2EBC40212F0FF0210D0B2FBF3F39D420C +:101C100019D3EB1A4B61436903FA02F28A60032E6F +:101C200007D82404A4F580340C6196E743698B60DF +:101C3000F5E70748BCE74FF0007397E74FF04073B4 +:101C400094E7002392E74FF0FF3092E7B4A6010833 +:101C5000DDA6010870B500F1A4060C460546304625 +:101C600008F0F2FE04F11002214605F1140006F01E +:101C700049FD38B9236963606369A3600E23A361DA +:101C80001023E3603046BDE8704008F0BDBE2DE98A +:101C9000F041064600F1A4070C46154614363846B6 +:101CA00008F0D2FE04F110022146304606F02AFD6B +:101CB000D0B9236904F12408A56163606369A36056 +:101CC0001023E360216A21F000439D4201D8E560C2 +:101CD0000AE00029A5EB030506DA42462146304614 +:101CE00006F010FD0028EDD03846BDE8F04108F0C0 +:101CF0008BBE00002DE9F04100F1A408C8B00E46EB +:101D000005464046174608F09FFE4FF484720021B6 +:101D100006A816F0BBFDB36914350E2B22D1222381 +:101D2000364908A88DF8183017F09CFB0F230124C2 +:101D3000B361404608F068FE012C0DD19DF81830C3 +:101D4000112B59D0222B14BF0023032308A9384696 +:101D500087F8003117F086FB204648B0BDE8F04117 +:101D6000FFF7D5B80F2B08D12223254908A88DF8F5 +:101D7000183017F077FB1023D9E702AA314628461E +:101D800007F094F8044618B1821C08BF0024D0E77D +:101D90009DF80C3003F07F02112A01D0222AECD1E9 +:101DA0001B060CD504A9284607F0F0F8041EC0DB7A +:101DB000E3D19DF80C3003F07F038DF80C309DF8D3 +:101DC0000C302846029A112B8DF8183002F10402CB +:101DD0009DF80E1004BF059B07939DF80D301A4423 +:101DE0009DF80F300A440093716808AB06F07DFC43 +:101DF000041E08BF01249CE70523A7E7F5A60108F8 +:101E0000F4A6010830B500F1A40585B004462846C3 +:101E10000193CDE9022108F017FE039904F11400A3 +:101E2000DDE9013206F080FE0446284608F0ECFDAC +:101E3000204605B0BDE83040FFF769B82DE9F04114 +:101E400000F1A40805460E46144640461F4608F019 +:101E5000FBFD05F11400314606F0FCFD054670B9A6 +:101E60003FB1012F336A01D11C4402E0022F0ED092 +:101E70001C46002CAABF25466FF01505346240466B +:101E800008F0C2FD2846BDE8F041FFF740B873698D +:101E9000EAE737B500F1A40504460191284608F0A9 +:101EA000D3FD019904F1140007F012FB0446284603 +:101EB00008F0AAFD204603B0BDE83040FFF727B880 +:101EC000F8B500F1A40705460C46384608F0BCFDFD +:101ED000214605F1140007F0FBFA05F12002064641 +:101EE0002B6A1BB19C4216D123681360A3690BB106 +:101EF0001B682BB96B695B6B13B9606B16F05CFCEC +:101F0000384608F081FD204616F056FC3046BDE804 +:101F1000F840FEF7FCBF1A461B68E2E730B500F157 +:101F2000A40585B0044628460193CDE9022108F0B6 +:101F30008BFD039904F11400DDE9013206F027FF5F +:101F40000446284608F060FD204605B0BDE8304054 +:101F5000FEF7DDBF2DE9F341064614460021282295 +:101F600006F1A4072046002516F090FC384606F13D +:101F70001408019508F068FD06F1180006F0ABFBA7 +:101F800028B901AA0D49404606F022FC054638460C +:101F900008F03AFD6DB9736F019AC4E90033B36F6D +:101FA000C4E902359B1AC4E90435C4E90635FF23A8 +:101FB0006362284602B0BDE8F08100BF990E0008B8 +:101FC0002DE9F041804600F1A406D4B00C4608F19A +:101FD00014073046154608F037FD02AB03AA07A9DF +:101FE0003846029407F0AEFA0446C0B901464FF4F1 +:101FF000847212A816F04AFC9DF8103008F11801FE +:1020000005A8112B8DF8483004BF069B139306F0EA +:1020100051FB0446C0B9174914A817F023FA3046FB +:1020200008F0F2FC139B2B619DF84830112B1DD05A +:10203000222B44F2FF1318BF002320466B6054B0DC +:10204000BDE8F041FEF763BF039B38469DF81110D1 +:1020500004339DF8122019449DF813300A4400936C +:10206000089914AB06F041FB0446D8E748F2FF1389 +:10207000E3E700BFF7A60108F0B500F1A4060546A6 +:102080009FB00C46304605F1140708F0DDFC95F8CA +:1020900054300394002B43D003AB04AA08A938465C +:1020A00007F050FA831C044649D12F21039818F0F9 +:1020B00013F800283AD16B6913A938461B6AEB6400 +:1020C00007F0F0FA0446002830D1119B024613A90C +:1020D0001C93129B1D930346384607F020F80446D4 +:1020E00020BB40F622038DF81600ADF81430039B98 +:1020F0001846019317F0BEF91499159A8DF8170038 +:10210000384606910792019BCDE9111204AA08A94D +:1021100007F0F4FA044648B96B691B6AEB6405E002 +:10212000384606F06BFF04460028B5D0304608F06C +:102130006BFC20461FB0BDE8F040FEF7E8BE00286B +:1021400008BF6FF01004F1E7F0B500F1A4050446F4 +:102150009DB00F46284604F1140608F075FC94F86B +:102160005430019783B101AB02AA06A9304607F0AB +:10217000E9F9044678B1284608F046FC20461DB02F +:10218000BDE8F040FEF7C3BE304606F037FF044618 +:102190000028E8D0EFE79DF80C30222B1ED002AAD1 +:1021A00006A9304607F007F904460028E3D19DF858 +:1021B0000C30222BDFD106AA12A9304606F04BFEC6 +:1021C000041ED8DB1A9B06A930460F931B9B109365 +:1021D00000231A4606F0A3FF0446CCE704AA11A97F +:1021E000304606F08FFA04460028C4D1199B142B00 +:1021F000D5D06FF02604BEE72DE9F04300F1A40529 +:102200008046B3B00F462846144608F01DFC98F8E7 +:10221000543008F11406CDE90274002B4DD0029B16 +:1022200005AA11A93046049304AB07F08BF90446C4 +:10223000002848D19DF8183005AA11A963F07F0342 +:102240008DF818300346304607F029F90446002877 +:1022500039D10DF1240903AB1CA930464A4607F0D9 +:1022600071F90746002837D0821C40F085802F2165 +:10227000039817F031FF00287ED10DAC99E80F00CC +:1022800084E80F0006AA0EAB07CA83E807009DF892 +:10229000383003F07F038DF83830039B18460193E4 +:1022A00017F0E8F8BB1C8DF83B00019B2CD12246AF +:1022B0001CA9304607F022FA2BE0304606F09EFEBD +:1022C00004460028ABD0284608F09EFB204633B0D9 +:1022D000BDE8F043FEF71BBE9DF818309DF828209E +:1022E00003F07F039A4249D1222AC6D10BAA27A91B +:1022F000304606F007FA04460028E4D12F9B142B41 +:10230000BBD06FF02604DEE722461CA9304607F05A +:10231000C6F804460028D6D1012305AA11A93046E3 +:1023200088F8553002AB07F00DF904460028CAD1F1 +:1023300088F85500814605AA11A9304607F03BF8F8 +:1023400004460028BFD10237BDD09DF82830222B8B +:10235000B9D11CAA28A9304606F07DFD041EB2DBC7 +:10236000309B4A461CA930462593319B26934B4609 +:1023700006F0D5FE0446A6E73C46A4E76FF0140439 +:10238000A1E700002DE9F04F00F1A4080646C3B014 +:102390000D46404608F058FBD6F8903063B1002D4A +:1023A00008BF1D46336830469B6A9847044668B1AB +:1023B000404608F029FB05E045B96FF0120440469D +:1023C00008F022FB204643B0BDE8F08F2B6828467A +:1023D0009B68D6E925BAD6E927979847044600288E +:1023E000E6D12422014628A816F050FA6A4B284666 +:1023F00023952493694B2593694B2693694B279327 +:102400002B685B6A98472B6858452CBF2890CDF8FD +:10241000A0B028469B6A98472B6850452CBF29904E +:10242000CDF8A4A02846DB6A98472B6848452CBF06 +:102430002A90CDF8A89028469B6B984723462A9A65 +:1024400018F000F92B901F3023A920F01F00B8428C +:1024500094BF2C902C9731A806F0F1F80446002880 +:1024600040F08680319B014640985A6AD20816F0A7 +:102470000DFA319A0DA931A83C94D2E90832CDE980 +:102480003E439A4294BF3D923D9307F00BF90446B8 +:10249000002869D118A931A807F004F904460028DA +:1024A00062D10346024618A931A806F038FE044658 +:1024B000002859D141F22E438DF816001A9F4FF093 +:1024C0001009ADF814300823DDF864C08DF817301A +:1024D000319B3397DA691B6A089209934FF0011315 +:1024E000314A0A930BAB106851686A46CDF8C8C0F0 +:1024F000CDF81090CDF8009003C334230DA931A876 +:1025000015932023CDE906C7CDE916C705AF019382 +:10251000CDE90273012306F002FE4B4620B110F113 +:10252000340F02D004461FE00124009320236A46A2 +:102530000DA9039331A8CDE90137012306F0EFFD82 +:1025400020B110F1340FEDD1002CEBD0002201238B +:102550000DA931A8CDE900236A4606F0D3F8044658 +:1025600010B9319B1B6A3F9331A806F051F86CB14A +:102570002046FEF7CCFC044600287FF419AF3368F0 +:10258000294630465B6A9847044611E72B6828467F +:10259000DB689847EFE700BFA30E0008C70E0008EE +:1025A000EB0E0008070F0008F9A6010870B500F14E +:1025B000A4060546304608F047FAD5F8904064B1C5 +:1025C00005F1140006F024F8D5F890000368DB68E4 +:1025D000984700230446C5F89030304608F014FAB6 +:1025E000204670BD2DE9F04300F1A4070D460446D6 +:1025F00099B0384608F028FAC4F890502B6828465D +:102600009B689847064648B10023C4F89030384686 +:1026100008F0FAF9304619B0BDE8F08324220146EB +:1026200004F16C0004F1580916F030F9404BA5652F +:102630002846E36504F114083E4B23663E4B63666F +:102640003E4BA3662B685B6A9847D4F8943083426C +:102650002CBFE366E06628462B689B6A9847D4F84F +:10266000983083422CBF2367206728462B68DB6A9B +:102670009847D4F89C3083422CBF63676067284634 +:102680002B689B6B9847626F334617F0DBFFA067A0 +:102690001F30D4F8A030494620F01F00834294BF79 +:1026A000E367E067404605F0CAFF0546002833D1DE +:1026B000636902AA0DA940461B6AA664E36401236C +:1026C00002960393C4E9106606F01CF8054600BBA9 +:1026D000202310220E994046009305AB06F005F822 +:1026E0000546B0B9069B082215490BA8A361079BB4 +:1026F000E36117F025FC064648B90A9B1A0C012A2B +:1027000002D19BB2012B82D96FF0150501E06FF069 +:102710003305404605F07CFF00233846C4F890306E +:1027200008F072F9284619B0BDE8F043FEF7EFBB98 +:10273000A30E0008C70E0008EB0E0008070F0008E4 +:10274000F9A601080C4B03F10802883310B50446C2 +:1027500002604360FFF72AFFD4F8A40012F086FB62 +:10276000064B204603F108023433226040F8043F50 +:102770000FF0FCFB204610BD64AA0108FCA901086B +:10278000A0F10400FFF7DEBF10B50446FFF7DAFF43 +:10279000204616F011F8204610BDA0F10400FFF706 +:1027A000F3BF0000F0B57D4D85B015F0D5F97C4B39 +:1027B000002128607B4800247B4A83F820401A606F +:1027C0005C62C3E904014FF4F0100021C3E9014445 +:1027D000C3E9060113F058FE68B9744C23781BB99D +:1027E00014F0A2FE01232370714B93F82520002AD8 +:1027F00000F0B8805C6B6F4B14202A68C3E9012499 +:102800000AF0D4FD4FF6FF71831E00F1120223F887 +:10281000021F9342FBD1684B0025684C00261860CC +:10282000002767480BF080FC8C21664803F07AF99A +:102830009D21654803F076F94321644803F072F95D +:102840006348644BA0612360C4E90267C4E904558E +:102850000BF0F6FA0AF01CFE5F4A604B1A600AF0B1 +:1028600003FE0123656384F838305D4BC4E90867D3 +:10287000236013F023FE5B4B5B4C186015F06CF982 +:102880005A4B256118605A4B236004F144030293AC +:102890001023CDE900550393EFF30583002B63D09C +:1028A0000020544B0025544E00931C23206468469E +:1028B00003930B2365670193029612F01BFB4422DE +:1028C0006065294606F1200015F0E0FF0123202273 +:1028D0002946A387A6F13C00656115F0D7FF4FF4A8 +:1028E000805328214FF4D060C4E90B31434BA361DE +:1028F000434CA56515F058FF064670B3C21C22F084 +:102900000302131A2846E260C3F5D06323F00303E1 +:102910001946C4E904556F1C002931D100B1256165 +:1029200000252262C4E9065325600BF05DFB0FF021 +:1029300067F8344B60600093334B2581029310237A +:10294000A57284F8245001950393C4E90A55EFF366 +:102950000583CBB10020206366612C480BF0E4FBBB +:1029600005B0F0BD9C6B46E711F06AFE01460028F9 +:1029700096D14FF6FF706A46DFF894C000DF90E70B +:1029800049083D460120C6E711F05AFE0028E1D172 +:102990006846DFF880C000DFDDE700BF480B022497 +:1029A000A80600240000020808A90108A0060024C7 +:1029B000B005002400000024D0060024B00B02243F +:1029C00060060024740B0224280B02240407002450 +:1029D000A4AC01085CA9010871CB0008F00A02242C +:1029E0007CAB0108700B022480130224E80A022445 +:1029F00018AC010802A70108D81302241CA701087B +:102A00002413022437A701085813022420060024A7 +:102A10005D3201081D34010808B57246064B0125D8 +:102A2000D3E84F4FC3E8465FE4B2002EF8D10CB9AB +:102A30000AF08CFD0AF0D4FE440B02240B4B10B5B7 +:102A4000044640F8043BFEF781FA094B002104F1EB +:102A5000140003F10802943322603822636015F0F9 +:102A600015FF4FF0FF332046236510BD40AA010833 +:102A700060A90108144B10B5044640F8043BFEF76A +:102A800065FA124B002104F1140003F108028833A7 +:102A900022604422636015F0F9FE0021382204F11F +:102AA000580015F0F3FE0022402304F1A400C4E90D +:102AB0002423C4F898304FF40073C4E9273308F096 +:102AC000B7F9204610BD00BF40AA010864AA01085A +:102AD00010B50446802112F0B4FA00212046BDE86A +:102AE000104012F0AEBA08B5026500220B4600F1A4 +:102AF0003C0142654FF48072836482870269012A37 +:102B0000D2B208BFC3640068FDF702FF002008BD11 +:102B100008B5C0F8102200220B4600F5FE71C0F87F +:102B20001422A0F8FC210269C0F80832012AD2B2AE +:102B300008BFC0F80C320068FDF7EAFE002008BDAF +:102B40000F4B00F16040DB6800F56140C3F30223E6 +:102B500010B5C3F107041A1D042C28BF0424062A4B +:102B60004FF0FF328CBF033B0023A24021EA020159 +:102B700001FA03F31B01DBB280F8003310BD00BF84 +:102B800000ED00E02DE9F04F4FF00A0C0024012584 +:102B900003260F274FF0020E0A6832FA04F301D120 +:102BA000BDE8F08F05FA04F313422FD04FEA440832 +:102BB000826806FA08F922EA090ACA6802FA08F2E3 +:102BC00042EA0A024FEAD40A826000EB8A0A4268AB +:102BD00022EA03034360C36823EA0903C36004F0E5 +:102BE0000703DAF820209B0007FA03FB22EA0B0B0D +:102BF0000CFA03F242EA0B02CAF82020036823EA27 +:102C000009090EFA08F343EA090303600134C3E734 +:102C10000D4B19884FF6FD734A1E92B29A4297BF28 +:102C20000A4B4FF0026303EA812303F100638342FE +:102C300007D9B0F1006F34BF4FF0FF304FF40030D0 +:102C400070474FF0FF30704780E8F11F00FC3F00F5 +:102C5000064B4FF6FD711A88531E9BB28B429ABFEA +:102C6000034800EA82204FF40010704780E8F11F0B +:102C700000FC3F0038B50C460546012120460CF00B +:102C800075FA28B921462846BDE838400DF09FB9AD +:102C900038BD000070B505460E4609B9114870BD33 +:102CA0000028FBD000240160C0E901440B79053BFA +:102CB000012BF3D86C21012017F08CF8686060B10B +:102CC0006C22214615F0E2FDB179022017F082F85E +:102CD000A86020B928460CF02BF80348DFE720460F +:102CE000DDE700BF00AFFFFF80AEFFFF38B50D4648 +:102CF00006490446FFF7CEFF30B929462046202278 +:102D0000BDE838400BF0B4BF38BD00BF9CAC010833 +:102D1000034653E8000F013843E80002002AF8D1C7 +:102D2000704770B5056BE0B00446B5F5C07F1DD89F +:102D30004FF4C0720021684615F0A8FDE36B2A46E7 +:102D40006946206C9847A0B9266B694620463246F2 +:102D50000CF011F8054608B90123E3621EB13146B3 +:102D600068460BF06BFA284660B070BD6FF0040542 +:102D7000F9E76FF00805F6E7074B5A6890235343CD +:102D8000064AD358DA69120701D508221A62D869AF +:102D9000C0F34010704700BF900B0224F40C0224D3 +:102DA00010B586B004466846039180E80C0006A87A +:102DB00000E90C0010E90700034B84E807002046F7 +:102DC000E36006B010BD00BFDB78000870B50023DB +:102DD00085680446066803619DB93378022B01D9E2 +:102DE000B36A6BB933890BB9022070BDB36AA361B2 +:102DF000A3696561002BF7D0736B0020E361F4E7F2 +:102E00001D467389B2895A430CD12946206806F0C1 +:102E10002CFD431C05460BD00128E5D9B369984227 +:102E2000F3D3E1E72946304606F0D5FCA061DFE7A1 +:102E30000120DAE738B5044605680420A169F9B134 +:102E4000284606F0FAFCC0B9E3691A78DAB1DB7AF1 +:102E5000E52A03F03F03A37109D02E2A07D00F2BD8 +:102E600005D023F02003082B01D0002038BD00211D +:102E7000204607F00BFB0028E0D00023A361F5E714 +:102E80000028F2D0F9E70420F7E72DE9F04F87B0EA +:102E900006468B4617464FF001090DF1170ADDE98A +:102EA00010452544A3EB0408AC4201D1012011E0F8 +:102EB00008EB040300225946304600933B46CDE917 +:102EC00001A905F0D3FA28B914F8013B9DF81720A1 +:102ED0009A42E9D007B0BDE8F08F2DE9F04F89B0F4 +:102EE00006468846DDF84C9005924BB94FF0FF320C +:102EF000C9F80020149A0020136009B0BDE8F08FD3 +:102F0000013B07A900684FF0040A079305F0E6F9B2 +:102F100012A9054630680DF1140B05F0DFF90746DC +:102F2000AF42059B03D3C9F80030129BE2E7EC1BCC +:102F300095FAA5F241463046B4FA84F4B2FA82F228 +:102F4000C4F11F04944228BF1446A200CDE901BA7F +:102F50000092002205F08AFA0028CED1012303FA5C +:102F600004F42D1BDCE72DE9F04700F1A4060D4623 +:102F7000814686B03046904607F066FDEA6909F161 +:102F8000140902F00303012B5AD092036B6903D595 +:102F90002A6A934238BF1346984524D229464846A8 +:102FA00005F058FD0446A8B905AB059005F12C01C4 +:102FB0004846029305F11003CDE90083D5E90423C7 +:102FC000FFF78BFF044628B9EB69C5F8148043F47A +:102FD0008033EB61304607F017FD204606B0BDE8B0 +:102FE000F047FDF794BF2ED92F6ABB4209D029467E +:102FF000484605F02FFD041E15D16B69002B24DB1C +:103000002B624FF0000A2B6A98450ED82946484695 +:1030100005F020FD20B9381EB4BF6FF015002862FE +:1030200000EAE074D6E7D5DBEBE7012305AA2946E1 +:1030300048468DF814A005F077FD041EE3DAC9E7D1 +:103040006FF00804C6E70024C4E76FF01504C1E779 +:10305000184B2DE9F74353F8206000230C46174620 +:103060001D4698460B6033683046D3F83C905B6A47 +:1030700098472A464346CDE900013046C847A8B1E3 +:1030800023682A46304647F833503368196B434665 +:10309000884723682D1807EBC30348EB01085860E5 +:1030A00021680131B1F5707F2160DCD3002003B0CD +:1030B000BDE8F0830000002408B5044B027853F803 +:1030C000220003689B6A9847C0B208BD0000002434 +:1030D0002DE9F0431D4689B006460F466C1E90460A +:1030E000FFF7EAFF044440420440E4B2202C1AD81F +:1030F0003046FDF741FB81462A464146684615F0B9 +:10310000B7FB621B49460DEB050015F0BFFB2346DC +:103110006A4639463046FDF73BFB003818BF0120B0 +:1031200009B0BDE8F0834FF0FF30F9E707B58DF83F +:103130000710012381680DF107028039FFF7C8FFEE +:1031400003B05DF804FB07B58168012301AA40398B +:103150008DF80430FFF7BCFF03B05DF804FB0000FE +:1031600013B5064B007853F8200000230468CDE91E +:1031700000230A46E469A04702B010BD0000002405 +:103180002DE9F843037807460BB1012B20D1114AF2 +:103190002C214FF434664FF0000801FB0323926E9C +:1031A0009D6A56431C46013DE036636A384603EB90 +:1031B000C50253F835101B68013DD2F80490C91AB6 +:1031C000C8444A46FFF7CCFFB045EED3BDE8F883CC +:1031D0000120FBE7200700242DE9F04385B01E46BF +:1031E0001B4B4FF000080392074602780D4653F838 +:1031F00022400A4623682046CDE90068D3F83C9077 +:103200004346C847039958B9124B1B782BB1334634 +:103210002A463978104807F031FE4FF0FF3413E0AA +:10322000236820462A46CDE90068D3F81490434627 +:10323000C847044640B1074B1B782BB133462A469A +:103240003978064807F01AFE204605B0BDE8F0833D +:1032500000000024E40A02243EA701086DA701082B +:103260002DE9F7430446174699460E4629B94FF013 +:10327000FF38404603B0BDE8F083002AF7D00B6961 +:1032800038468D681D44042329460DEB0302FFF7E1 +:10329000A3FF80460028EAD1BDF8041046F60812C4 +:1032A000F368914222D1BDF806109942DFD1042380 +:1032B000294438460DEB0302FFF78EFF0028D6D1D4 +:1032C000BDF8042046F607139A42D0D10023BDF87A +:1032D0000620A4F80890A372F3682B440435E36039 +:1032E000134425616361C4E90067C2E7002BE7D09E +:1032F000BDE700002DE9F04FDFF830B10746884602 +:103300000026DFF820910BF16C0A2DED028B85B0C1 +:10331000CDE90223109BB34201D8002011E0109B9D +:103320003846404A9D1B029BB5F5003F06EB03045F +:1033300028BF4FF4003521462B46FFF74DFF28B13B +:10334000012005B0BDEC028BBDE8F08F3B78022B6D +:10335000039B334408EE103A48D19BF8A432002B6B +:103360003CD198F80030012B25D1039C5846436985 +:1033700013F00C0F1FD0344481688C4205EB040E0F +:1033800049D28E4517D9AEEB0103A1EB040C002204 +:1033900000690844864503D9844234BF031B0023D7 +:1033A000641A09EB0C015046CDE9002104EB0C0234 +:1033B0003946FEF770FA98F80030022B1DD19BF8C1 +:1033C000A432D3B1002318EE102A41465046009390 +:1033D0002B46CDF80490FEF75EFA0EE0CDE9000929 +:1033E0002B46224639465046FEF755FA3B78012BCC +:1033F000B7D198F80030012B0AD12B464A4618EE77 +:10340000101A4046FDF7C4F9002899D12E4481E7EF +:10341000029C0548ABE7621A2B464FF0000C02F005 +:103420000F02B5E7E40A00244C070024200700241B +:103430002DE9F74304460F4690461E464FF6FF79A6 +:10344000D4E904239A4215D22368DB6823B1E368E8 +:10345000934204BF043323610423216960680DEBA8 +:103460000302FFF7B9FE18BBA37A256933B1E368FD +:10347000AB4203D8012003B0BDE8F0832189BDF839 +:103480000630494503F1040203D0BDF804C08C4561 +:103490000BD116B1BDF80410318004353D60A8F899 +:1034A0000030236913442361E5E715442561C7E72C +:1034B0004FF0FF30DFE700002DE9F04FADF5557D0F +:1034C00017780D46144604934FF48E737B43C65C05 +:1034D00000EB030C002E40F00F824FF48C7231464B +:1034E0000CF1040015F0D2F932232246294611A826 +:1034F000FFF7B6FE10B14FF0FF3009E1119B002B32 +:10350000F9D0129B002BF6D033460DF11A0207A911 +:1035100011A8FFF78DFF002840F0FA80BDF81A309F +:10352000712BE8D143AA07992046FFF755FE0028E2 +:10353000E1D1A64C30232FAA08A808948A3421464A +:103540000DF03EFF0028D6D108992F9B1944A142C7 +:1035500040F0FA8037AA08A83796FEF7C4F9379BDF +:10356000034340F0EE808EAB60AA214608A80DF020 +:103570003BFF002840F0E280619A072A40F0DB80A0 +:103580009349629816F0DCFC002840F0D4808F9AB2 +:10359000082A40F0CD808F49909816F0D1FC002881 +:1035A00040F0C68004232FAA214608A80DF008FF8A +:1035B000002840F0BA8030232FAA214608A80DF039 +:1035C000FFFE002840F0AE80379037AA214608A8B9 +:1035D000FEF789F9002840F0A280379B012B40F0CC +:1035E0009E8004232FAA214608A80DF0E9FE00289A +:1035F00040F09280DDF8BC80B8F1200F40F086806A +:10360000089B1FAC03F120051868083353F8041C0D +:103610002246AB4203C21446F6D10023012260A821 +:10362000CDE98823CDE98A32CDE98C330BF05EFCFD +:103630007FA80BF04FFC60A80BF035FF60A80BF0E3 +:1036400055FC032360A88DF880310BF057FD28B19D +:1036500060A80BF028FF7FA80BF013FF412343AABB +:103660007FA960A80BF0BCFF002870D060A84FF0C5 +:10367000FF340BF018FF7FA80BF003FF8BA80BF0B3 +:10368000EDFE88A80BF0EAFE60A80BF00CFF7FA807 +:103690000BF0F7FE002C7FF42EAF0DF19C092146B4 +:1036A00020220F944846CDE90D4415F0EFF8494625 +:1036B0000DA8FFF71BFB28BB202217A90DA80BF0B4 +:1036C000C7FAF8B92FA90DA80BF098FAD0B90123C1 +:1036D0003025A246DFF804B18DF828302FA90DA8B7 +:1036E0000593CDF83CA0CDE90DAAFFF7FFFA48B944 +:1036F000059B002B62D0102259460DA80BF0A8FAAA +:1037000000286DD00DA80BF013FBF4E66FF00B0052 +:103710000DF5557DBDE8F08F6FF00A00F8E76FF00A +:103720000900F5E76FF00800F2E76FF00700EFE738 +:103730006FF00600ECE76FF00500E9E76FF00400BA +:10374000E6E76FF00200E3E76FF00100E0E77FA932 +:1037500060A80CF069FF002888D120221FA98BA83F +:103760000BF008FF8EA80BF0B5FB8BA960A80BF03F +:103770005FFD0446B8B97FA960A80CF055FF044668 +:1037800088B97FAB8BAA8EA960A8FDF781FE04469D +:1037900048B9014694A80BF014FC68B18EA988A81A +:1037A0000BF0C4FF04468EA80BF06BFE202217A975 +:1037B00088A80BF01BFC61E7074CF4E720228EA9D8 +:1037C0000DA80BF045FA002895D09BE700040008EF +:1037D00030AC010840AC010880B0FFFF9BA7010896 +:1037E00001220AA90DA80BF033FA00288AD18EA96C +:1037F0000DA80BF003FA0346002883D137AA202D29 +:1038000002EB040028D90DF50E7C03460DF5167E5B +:103810006246083303CA724543F8080C43F8041C97 +:103820009446F5D1203DADB29DF8283020340133C7 +:10383000A4B28DF828300023002D7FF44FAF0DA8DF +:103840000BF076FA3BA90AA80C95CDE90A55FFF7CB +:103850004DFA48B10AA856E72A468EA9059315F0F5 +:1038600007F8059B1D46DFE70DF26D1410220AA82C +:1038700021460BF0EDF90028ECD12FA90AA80BF096 +:10388000BDF90028E6D12FAB53A913F8012BB8F1ED +:10389000010811F8010F82EA000246EA0206F4D19B +:1038A000002ED7D10AA80BF043FA31464FF48C72A0 +:1038B0008EA814F0EBFF37A98EA8FEF747F8002872 +:1038C0007FF419AE102531460DA82A4614F0DEFF0C +:1038D000049B09AA294605FB07378EA80DABCDF836 +:1038E00000900C370996CDE901470DF0DBFD00385B +:1038F00018BF012040420BE7012009E72DE9F04FF6 +:103900001378ADF50F7D82460D46012B93460DD100 +:103910004B6913F00C0F09D090F81C3133B94FF0FC +:10392000FF3108460DF50F7DBDE8F08F40220021E4 +:103930006DA8DFF8A88214F0A9FFA14AA14B0024CA +:10394000AF682E69DFF898923E44DFF898E2DFF81E +:1039500098C29D489D497D94CDE96B23EB68F3188F +:10396000CDE96598CDE90239CDE9048E954BDFF8B4 +:1039700064820A93CDE96344CDE967ECCDE969013E +:10398000CDE906C0CDE90812029BA34242D829A97D +:1039900063A80BF039F829464FF6FF735A4623A85F +:1039A000FFF75EFC01460028BBD14FF0FF35884E83 +:1039B0000746DFF838922C4606F15B08239B002B64 +:1039C000ADD0249B002BAAD00DA90DF132030CAA77 +:1039D00023A8FFF72DFD011EA3DB40F05682BDF8A2 +:1039E0003230102B59D1BDF83070202F97D10D995E +:1039F0003B4643AA5846FFF7EFFB0146002890D10B +:103A000043A93A4629A816F09BFA0146002888D116 +:103A10000127D3E7029BA3EB0409B9F5807F28BFF8 +:103A20004FF48079A74205D904EB09039F4238BFC0 +:103A3000A7EB0409A64205D904EB09039E4238BF4F +:103A4000A6EB040921464B46624A5846FFF7C4FBE1 +:103A5000014600287FF465AF9BF80030012B12D19E +:103A60006B6913F00C0F0ED0A7420CD8A6420AD9EE +:103A7000E21B59465046CDF8048002F00F03009334 +:103A80004B46FDF708FFB9F1000F04D04A46414606 +:103A900063A80AF053FF4C4476E7012B3DD1BDF8F3 +:103AA0003030202B3FF63BAF0D9943AA5846FFF725 +:103AB00093FB014600287FF434AF9DF83050202D51 +:103AC0007BD8402202906DA814F0E0FE039B02997F +:103AD0005B22659363A8049B7D916693059B679326 +:103AE000069B6893079B6993089B6A93099B6B935A +:103AF0000A9BCDE9631131466C930AF01FFF3AA986 +:103B000063A80AF081FF2A4643A93AA816F018FADA +:103B1000003818BF0120454250E7222B7FF44EAFFA +:103B2000002D7FF44BAFBDF83030802B3FF6F7AE61 +:103B300043AC0D9958462246FFF74EFB014600283C +:103B40007FF4EFAE302331AA41460EA8BDF830A075 +:103B50000E960DF035FC70BB319B3AAA0E9D0EA857 +:103B60001D4463AB29460DF03FFC20BB3B9A072A5E +:103B700021D149463C9816F0E3F9E0B9649A082A45 +:103B800019D11549659816F0DBF9A0B9032331AABC +:103B900029460EA80DF014FC68B9319A5AB1511E8D +:103BA0000E9B3191187830B9581C13449D420E90E9 +:103BB00001D141291CD04FF0FF344FF0FF35FDE615 +:103BC000ABD9831F19CDE05B7F520E518C68059BEA +:103BD00000030008F00B022449AC010885AE67BB66 +:103BE00067E6096A72F36E3C3AF54FA538AC0108F6 +:103BF00063A801250BF07AF9002385A88493CDE909 +:103C000082530BF067F90E99A24B63A80B915B1AD4 +:103C100002930BF048FC63A80BF068F9032263A839 +:103C20008DF88C210BF06AFA029B0B9958B14FF07A +:103C3000FF3463A80BF037FC82A80BF00FFC85A8BB +:103C40000BF01FFCB9E70A4663A885A90BF0C8FC76 +:103C50000028ECD185A963A80CF0E6FC0028E6D189 +:103C6000A244302310AA0F945146CDE91150CDE95A +:103C70001305CDE915000FA80DF0A2FB60B1A0F56A +:103C80009F4411A80BF0EAFB14A80BF0E7FB201EE1 +:103C900018BF01204442CCE7DDE90F3213449A45B6 +:103CA00040F0F18011AA51460FA80DF0E8FB044640 +:103CB00030B914AA51460FA80DF0E1FB044610B12B +:103CC000A4F59F44DDE731A80BF004F99DF88C3191 +:103CD000092BCDE91754CDE91945CDE91B44CDE9B0 +:103CE0001D54CDE91F45CDE9214401D16A4CC8E7F7 +:103CF000789B002BFAD0012111A80BF062F9002863 +:103D000017DA664C31A80BF0BCFB17A80BF0A6FB2A +:103D10001AA80BF0A3FB1DA80BF0A0FB20A80BF02A +:103D20009DFB002CADD10F9A5D4B924518BF1C46F0 +:103D3000A7E776A911A80BF001F90028E1DA012123 +:103D400014A80BF03EF90028DBDB76A914A80BF0D1 +:103D5000F5F80028D5DA7A9D29A917A80735ED08C6 +:103D6000202D28BF20252A460BF004FC04460028FD +:103D7000C8D17A9BE900B3EBC50F3DD376A917A84C +:103D80000BF0DCF8002807DB17A976AA08460CF030 +:103D90008AF904460028B5D176AA14A91AA80DF00C +:103DA00019F804460028ADD11AAA17A91DA80BF0CE +:103DB000FFFC04460028A5D11DA976AA08460CF0F0 +:103DC0003CFA044600289DD11AAA11A920A80BF09C +:103DD000EFFC0446002895D120A976AA08460CF0ED +:103DE0002CFA044600288DD163A80BF09DF8012819 +:103DF0000AD0A4F59D4485E7C91A17A80BF080FAEC +:103E000004460028BAD07DE73AA80BF063F86DAB02 +:103E10001DAA3AA963A8FDF7FDFC0446A0B985AB2D +:103E200020AA31A963A8FDF7F5FC044660B931ABBF +:103E30003AAA63A819460CF0A1FE044620B931A99C +:103E400063A80DF09BF904463AA80BF01AFB002C6E +:103E50007FF458AF214637A80BF0B3F800283FF4A1 +:103E600050AF31A976AA08460CF0E7F904460028BD +:103E70007FF448AF11A931A80BF060F80446002880 +:103E80003FF440AF3DE7074CFBE6002F14BF21464F +:103E9000012146E55B03000880B0FFFF00B2FFFF91 +:103EA00000B4FFFF1AB0FFFF0278074951F8223033 +:103EB0004BB1013B41F822302BB9044B53F822009F +:103EC0000368DB6818477047F005002400000024F1 +:103ED000224B00EB4002012803EB82022DE9F04166 +:103EE00004460A6025D0022826D048BB1C4A5A60E6 +:103EF0001C4F002557F82420013247F824200C22BB +:103F0000624303EB02089C54174B88F8015053F8A6 +:103F10002460336830469B6B984757F82430C8F8C4 +:103F20000800012B17D1336830469B68BDE8F0418B +:103F3000184700221A61DBE74FF01062DA61D7E719 +:103F40000A4B1B781BB10146094806F097FF4FF05A +:103F5000FF30BDE8F0812846FBE700BFFC050024E8 +:103F600000000208F005002400000024E40A0224F6 +:103F7000ACA7010873B5044601A9C0B2FFF7A8FFBA +:103F8000054620B14FF0FF35284602B070BD0198BC +:103F9000FCF7F2FB06460198FFF786FF2C23064844 +:103FA00003FB0404631E0334A342EDD013F8012F76 +:103FB000B242F9D0E6E700BF2007002413B5002085 +:103FC00001A9FFF785FF014610BB2023134A019882 +:103FD000FFF702F9041E18BF01240198FFF764FFE0 +:103FE000D4B901A90120FFF773FF98B92146202316 +:103FF0000B4A0198FFF7F0F8041E18BF012401983E +:10400000FFF752FF0CB184F00104204602B010BD4E +:104010000124E2E70124F2E70024F4E7200700246A +:104020004C07002413B5002001A9FFF751FF90B9F8 +:10403000019801236A4681688DF80030403921F0EB +:104040001F012039FFF744F804460198FFF72CFFC1 +:10405000204602B010BD0124FAE70000F7B504467F +:104060000F46C0B26946FFF733FF30B10125009813 +:10407000FFF71AFF284603B0F0BD1B482C2303FBB3 +:10408000040400982369A6681E44042331460DEBFE +:104090000302FFF7A1F805460028E7D1BDF8042088 +:1040A00046F60813E4689A421AD1BDF806309C42DD +:1040B00001D00325DBE70423311900980DEB03023F +:1040C000FFF78AF80028D1D1BDF8042046F607137F +:1040D0009A42EED1BDF80630234433443B60C6E734 +:1040E000002CF1D0E5E700BF200700242DE9F041C6 +:1040F00086B002230546002601AFDFF85880ADF8F0 +:104100000430294617F8010BFFF7E2FE044658B9C0 +:104110002868102302AA81682039FFF75DF8044659 +:1041200040B12868FFF7C0FE204606B0BDE8F08128 +:104130000126E6E71022414602A815F001FF0446D9 +:104140000028F1D02868FFF7AFFE002EF0D04FF026 +:10415000FF34E9E720AC010838B54FF48E7405460A +:104160004C4302EB011120440C310430FDF7EEFB0F +:104170000028034613BF0022012203464FF0FF33FD +:104180002A55184638BD00002DE9F74304460F466E +:10419000C0B201A9FFF79CFE002863D12046FFF7BB +:1041A000E9FE30B1314E2C2505FB04656B69DA065A +:1041B0000DD50CB9012503E025460198FEF7E0FF77 +:1041C0000198FFF771FE284603B0BDE8F083DDF8E3 +:1041D000048098F80090B9F1010F2AD024482946AC +:1041E0004246FFF78BFB05462C2301986343F158A9 +:1041F000F218204B99420AD113699268D1438B423D +:1042000005D813448268934201D2002DD8D01CB146 +:1042100082680021FEF7A4FF174B1B78002BC9D042 +:10422000164B17491748002C18BF194606F026FEF2 +:10423000C0E713F00C0FD1D03B464246294606F1A9 +:104240006C00FFF739F9002802DA4FF0FF35CBE7B1 +:10425000C4D13A46494606F16C00FFF77DFF0028BD +:10426000BCD0F2E74FF0FF35ADE700BF20070024D8 +:104270008C0700243DB8F396E40A0224D6A701086F +:10428000CEA70108E0A7010838B50C461546FCF793 +:1042900073FA2544214611F8013B984203D1A94203 +:1042A000F9D1012038BD0020FCE738B50C460123C8 +:1042B000114605462246FEF78FFF002810DB4CB161 +:1042C000012221462846FFF7DFFF18B10323002013 +:1042D000237038BD2378012B0CBF01230223F6E79E +:1042E0000120F6E78168F0B589B0A1F12006054606 +:1042F000FCF742FA0B4B07466C460FCB84E80F00E5 +:10430000102239460DEB020014F0C0FA2023224699 +:1043100031462846FCF73CFA003818BF012009B0A6 +:10432000F0BD00BF20AC010830B5002387B00D46BA +:104330008168059302AA20390446CDE90333FF239F +:1043400002931023FEF748FF002811DB102202A978 +:104350002046FFF799FF68B103232B700DF1070288 +:10436000A168012320468039FEF736FF00280BDACA +:1043700001202CE01022174902A815F0E1FD0028C9 +:1043800014BF02230123E8E79DF807300DF1070170 +:10439000204603F00F021B096A7001222B71FFF700 +:1043A00073FF10B96B78042B03D901236B700023C2 +:1043B0002B71A268A91C2046603AFFF776FF0028FF +:1043C000D6D1A268E91C2046403AFFF76EFF07B03D +:1043D00030BD00BF20AC01081FB5002001A9FFF7C8 +:1043E00077FDA8B902A90198FFF79EFF044668B9B6 +:1043F0009DF80B30032B03D10198FEF7A4FE044671 +:104400000198FFF751FD204604B010BD0124F7E7E5 +:104410000124F8E713B50C46C0B201A9FFF758FD17 +:1044200050B921460198FFF77FFF04460198FFF736 +:104430003BFD204602B010BD0124FAE730B585B03F +:104440000D460446012002A9FFF7E4FFE97901299E +:1044500002D02046FEF76AFE9DF80B30012B02D1F8 +:104460002046FEF770FEAB682046A1680193042346 +:10447000A0390DEB0302FEF72BFE2A460021204651 +:10448000FCF79AF92A4601212046FCF795F92046C7 +:10449000FFF728FF002005B030BD042809D005280B +:1044A00003D1481E18BF01207047431A5842584193 +:1044B00070470120704710B50446FEF7FDFD4FF42C +:1044C0003462A368E03B02FB103010BD30B5837945 +:1044D0008DB00546002B03A914BF02200020FFF772 +:1044E000F7FC60BB0398FFF7E6FF164B29799A6E3D +:1044F00001392B6802EB4204013B4A4304FB0323CE +:104500001C180398FEF7D8FD01900398FCF734F9C6 +:104510002022014604A814F0B9F92A792146019B0A +:104520008DF8102004AA0398FCF732F9041E18BF76 +:1045300001240398FFF7B8FC20460DB030BD0124DC +:10454000F7E700BF200700242DE9F04F04468DB0A7 +:1045500000206379012BCDE9040040F093812368AA +:10456000012B40F08F812379012B40F08B81B94DD5 +:10457000B94E2A68B24202D105A9FFF76FFD6B69F7 +:1045800013F00C0F00F0B981B24923462A6A01F1F9 +:104590006C00FEF791FF014618B92246AF48FFF7BD +:1045A000DBFDEB6AB34203D104A90120FFF756FDFE +:1045B0002B6C13F00C0F00F0A781A9492346EA6C7D +:1045C00001F14000FEF778FF20B922460121A348FF +:1045D000FFF7C2FD95F88831ABB104F12C0204F16C +:1045E0001C03114653F8040B934241F8040BF9D114 +:1045F0004FF48C7200219B4814F048F922460221A6 +:104600009648FFF7A9FDDDE90432934288BF059380 +:10461000059BA3608F4D002305996E6A1A462F6D86 +:1046200018469A46A846914201D89A4205D206EB0E +:10463000CA050AF1010A6D682A44994202D89342D8 +:1046400080F08D8107EBC005914200F101006D689B +:104650002B44ECD89942E6D89A42E4D1D1464FF0A7 +:10466000000B814B5D460BF1010B1B782BB10AF15E +:10467000010259467D4806F001FCD8F85830D8F8B8 +:10468000242099680023101D1F4650F839303B4400 +:10469000994203D3B9F10109F6D21F4621684B1E96 +:1046A000AB4200F24A8109F101001368D8F8685062 +:1046B00052F83060D8F82800F61A013807EB060CDB +:1046C00052F83020D31A9C4540F225814FF43463D0 +:1046D0006FF0DF02012903FB15253D4440F01C81EA +:1046E0007B1B18BF0123A37106A90020FFF7F0FB75 +:1046F00007A90120FFF7ECFB08A90220FFF7E8FB60 +:104700002379012B40F00A81089800218268FEF786 +:1047100027FD2368012B13D121460898FFF78EFE51 +:10472000A3796BB906980393FEF72AFD21460698F4 +:10473000FFF784FE0898039B82681946FEF710FD78 +:10474000002332460095DDE90701FEF7D3FD204640 +:10475000FFF7BCFE0223237118B1454A13680133E9 +:1047600013603A4631460798FEF7FAFC3346324664 +:104770000095DDE90601FEF7BDFD2368012B04D19C +:10478000A37913B90798FEF7FBFC2046FFF79EFEBE +:104790000323237118B1364A1368013313603A4674 +:1047A00031460698FEF7DCFC33460022069908984D +:1047B0000095FEF79FFDA379002B39D00898FFF7ED +:1047C0007AFED8F86830024606995B000898009394 +:1047D0007319FEF78FFD18B1254A13680133136072 +:1047E0000AA90898FFF7A0FD9DF82B30012B02D1F4 +:1047F0000698FEF7A8FC9DF82910012902D006981A +:10480000FEF794FC069809AAA3688168099304231B +:10481000A039FEF75DFC224600210698FBF7CCFF8D +:10482000224601210698FBF7C7FF0698FFF75AFDBD +:104830000023A5792046A371FFF748FE23680133C2 +:10484000236001232371A8B1094A1368013313605F +:1048500010E000BF200700243DB8F3968C07002429 +:104860004C070024C8090024E40A022406A8010811 +:10487000E00A0024002D57D03A4600210898FEF7A0 +:104880006FFC51E00AA8FFF731FC50B90A980423E5 +:1048900004F108028168A039FEF79EFC0A98FFF730 +:1048A00003FB04F11C05A3680026394FA94604F157 +:1048B0002C0805930AA85FFA86FAA5F1100BFFF7FA +:1048C00015FC68B90A9810235A468168A1F1A00C1A +:1048D000711CACEB4111FEF77FFC0A98FFF7E4FA7C +:1048E0005A4612F8013BFF2B3DD19542F9D11035C4 +:1048F000002E7FF48FAE0126DCE71022FF2104F1A9 +:104900000C0013F0C3FF4CE61022FF2104F11C0041 +:1049100013F0BCFF77E63D460023E4E6022B3FF4AC +:1049200020AF032B3FF43BAF0698FFF7BDFA079883 +:10493000FFF7BAFA0898FFF7B7FAB9F1FF3F7FF42B +:1049400090AE144B1968002905DD134B1B7813B189 +:10495000124806F093FA00200DB0BDE8F08F9142A6 +:104960007FF67AAE63E6224651463846FFF7F4FBFF +:10497000002EBCD04B46424653F8041B434542F838 +:10498000041BF9D1224602213846FFF7E5FBAEE7CA +:104990008C070024E00A0024E40A02241EA801086F +:1049A00010B508F075FD134B1348144A596A146882 +:1049B000038811601B1B0B440146B3F5803F16D3DF +:1049C0004FF47A71B3FBF1F201FB1233038006E07E +:1049D0000132A3F57A73B3F57A7FF9D20B80084CD4 +:1049E00023681A44226008F03FFD206810BD0022B1 +:1049F000F1E700BF000C0040680B02246C0B02249E +:104A0000F00C02242DE9F8430546294F3C69FFF7D5 +:104A1000C7FF022D0646274B26D1D7F81041264F57 +:104A20001C4044F00044DFF888804CF25039042FD9 +:104A30001DD1D8F81000C0F3800070B934F00041E7 +:104A400022D01E4A002C936943EA04039361184B59 +:104A500017DB5C610120BDE8F883FFF7A1FF801B35 +:104A60004845E4D90320F6E71C400427DBE7D8F8E3 +:104A7000103127EA030313F0040F0CBF01200020BC +:104A8000DBE7C3F81411E5E7012D094B06D11A69DC +:104A9000D103E0D54FF480325A61DCE7D3F810211E +:104AA000D203D8D54FF48032C3F81421D3E700BF26 +:104AB000002000520000EE17040000804C0B02247E +:104AC00070B504460D4616462368DB6935EA0303D4 +:104AD00001D1002017E0FFF763FF801B2368B0F1CE +:104AE000007F1A6810D322F4D0721A609A6822F0FC +:104AF00001029A602023C4F88430C4F8883000236F +:104B0000032084F8803070BD5107DDD5DA691205C5 +:104B1000DAD54FF400621A621A6822F4D0721A6071 +:104B20009A6822F001029A602023C4F88430C4F805 +:104B30008830C4F88C30E2E7F8B53E4C06460D46A6 +:104B4000A36A03F00303032B71D0236823F080537F +:104B50002360FFF725FF074623689A005AD4A36A0B +:104B6000012D326823F07C7343EA0253A362B368D9 +:104B7000F26803F1FF3302F1FF324FEA43234FEAB9 +:104B800002429BB202F4FE0243EA0203726802F19F +:104B9000FF32C2F3080243EA0203326902F1FF3234 +:104BA0004FEA026202F0FE4243EA02032364E36A30 +:104BB000726923F4406343EA0203E362E36AB26981 +:104BC00023F4007343EA0203E362E36A23F480738D +:104BD000E362636CF26923F47F4323F0F80343EA52 +:104BE000C2036364E36A43F48073E362E36A0CBF65 +:104BF00043F4000343F08073E3620E4C236843F0F8 +:104C000080532360FFF7CCFE054623689B0008D540 +:104C1000002005E0FFF7C4FEC01B02289CD903203A +:104C2000F8BDFFF7BDFE401B0228EED9F7E70120D3 +:104C3000F6E700BF00440258F8B53E4C06460D4664 +:104C4000A36A03F00303032B71D0236823F080636E +:104C50002360FFF7A5FE074623681A015AD4A36A0A +:104C6000012D326823F47C3343EA0233A362B36834 +:104C7000F26803F1FF3302F1FF324FEA43234FEAB8 +:104C800002429BB202F4FE0243EA0203726802F19E +:104C9000FF32C2F3080243EA0203326902F1FF3233 +:104CA0004FEA026202F0FE4243EA0203A363E36AB0 +:104CB000726923F0C00343EA0203E362E36AB26964 +:104CC00023F0200343EA0203E362E36A23F01003C4 +:104CD000E362E36BF26923F47F4323F0F80343EAD2 +:104CE000C203E363E36A43F01003E362E36A0CBFC9 +:104CF00043F4801343F40013E3620E4C236843F043 +:104D000080632360FFF74CFE054623681B0108D52E +:104D1000002005E0FFF744FEC01B02289CD90320B9 +:104D2000F8BDFFF73DFE401B0228EED9F7E7012052 +:104D3000F6E700BF00440258F8B503680446D807F8 +:104D40005FD42368990700F1B1802368DA0628D57B +:104D5000AC4B1A69996A02F03802082A07D0182A5F +:104D600040F0118101F00302012A40F00C811B6820 +:104D7000DB0502D5E369802B56D1A34B216A1A6863 +:104D800041F20303B3EB124F9E4BC0F0F5805A681B +:104D9000202922F0F8420CBF42F0804242EA8162B0 +:104DA0005A602368190700F1338123689A0600F1DD +:104DB000548123685D071ED5944D2B6843F480739E +:104DC0002B60FFF7EDFD06462B68DA0540F16A819E +:104DD000A3688C4D012B40F06C812B6F43F00103D5 +:104DE0002B6741F28837FFF7DBFD864E0546336FB0 +:104DF0009B0740F18481606A002840F08781002091 +:104E00002AE0804B1A69996A02F03802102A05D00C +:104E1000182A0BD101F00302022A07D11B689A035A +:104E20008FD56368002B8CD1012015E06268B2F544 +:104E3000803F12D11A6842F480321A60FFF7B0FD49 +:104E4000704E054633689B033FF57BAFFFF7A8FD27 +:104E5000401B6428F6D90320F8BD6A4D2B689AB927 +:104E600023F480332B602B6823F480232B60FFF71F +:104E700097FD06462B689F037FF563AFFFF790FD14 +:104E8000801B6428F6D9E6E7B2F5A02F07D143F4DA +:104E900080232B602B6843F480332B60CEE723F410 +:104EA00080332B602B6823F48023F6E7554B1A6977 +:104EB000996A12F0380203D0182A20D18E071ED129 +:104EC0001B685D0702D5E368002BADD04E4B21690E +:104ED0001A6841F20303B3EB124F4A4B5A6809D3E5 +:104EE00022F47C3240290CBF42F4003242EA013203 +:104EF0005A602AE722F0FE4242EA0162F8E7E168DE +:104F00001A6841B322F019023E4D0A431A60FFF7B6 +:104F100047FD06462B68580712D53B4B2269196896 +:104F200041F20303B3EB114F6B680FD323F47C33CF +:104F3000402A0CBF43F4003343EA02336B6004E7BA +:104F4000FFF72EFD801B0228E4D984E723F0FE43FF +:104F500043EA0263F2E722F001022A4E1A60FFF7E9 +:104F60001FFD0546336859077FF5EFAEFFF718FDC3 +:104F7000401B0228F6D96EE7DA6822F07C5242EA3A +:104F80000162DA600DE7E26952B31A681D4D42F022 +:104F900080021A60FFF704FD06462B68DF0512D574 +:104FA000194B226A196841F20303B3EB114F10D376 +:104FB0006B68202A23F0F8430CBF43F0804343EA98 +:104FC00082636B60EDE6FFF7EBFC801B0228E4D9FF +:104FD00041E7EB6823F07C5343EA0263EB60E0E6D1 +:104FE0001A68084E22F080021A60FFF7D9FC0546C5 +:104FF0003368D8057FF5D5AEFFF7D2FC401B0228F9 +:10500000F6D928E7004402580010005C0048025816 +:105010006369964D83B16B6F43F001036B67FFF7D4 +:10502000BFFC06466B6F9B073FF5BFAEFFF7B8FCB2 +:10503000801B0228F6D90EE76B6F23F001036B6724 +:10504000FFF7AEFC06466B6F9F077FF5AEAEFFF72E +:10505000A7FC801B0228F6D9FDE6A369834D83B126 +:105060002B6843F480532B60FFF79AFC06462B68AD +:1050700098043FF59EAEFFF793FC801B0228F6D9FB +:10508000E9E62B6823F480532B60FFF789FC064682 +:105090002B6899047FF58DAEFFF782FC801B0228F8 +:1050A000F6D9D8E6FFF77CFC801B64287FF68CAE2F +:1050B000D1E6B3B92B6F41F2883723F001032B6798 +:1050C0002B6F23F004032B67FFF76AFC06462B6F58 +:1050D00098077FF590AEFFF763FC801BB842F6D9C6 +:1050E000B9E6052B2B6F03D143F004032B6774E65D +:1050F00023F001032B672B6F23F0040370E6FFF707 +:105100004FFC401BB8427FF672AEA4E6574D2B69A8 +:1051100003F03803182B7AD02B68022823F0807311 +:105120002B6067D1FFF73CFC06462B6899015BD4E6 +:10513000AB6AA26A23F47C7323F003031343E26A8D +:1051400043EA0213AB62636BA26B013B013A5B0261 +:1051500012049BB202F4FE021343226B013AC2F323 +:1051600008021343E26B013A120602F0FE421343B7 +:105170002B63EB6A23F00103EB626B6BA26C23F4ED +:105180007F4323F0F80343EAC2036B63EB6A226CAC +:1051900023F00C031343EB62EB6A626C23F002030F +:1051A0001343EB62EB6A43F48033EB62EB6A43F444 +:1051B0000033EB62EB6A43F48023EB62EB6A43F06B +:1051C0000103EB622B6843F080732B60FFF7E8FB71 +:1051D000264D04462B689A013FF511AEFFF7E0FB20 +:1051E000001B0228F6D936E6FFF7DAFB801B0228FF +:1051F0009BD930E6FFF7D4FB04462B689B017FF573 +:10520000FEADFFF7CDFB001B0228F6D923E60128EF +:10521000AA6A2B6B3FF420AE02F00301A06A814220 +:105220007FF402AEC2F30512E16A8A427FF4FCAD5C +:10523000226BC3F30801013A91427FF4F5AD626B32 +:10524000C3F34621013A91427FF4EEADA26BC3F362 +:105250000641013A91427FF4E7ADE06BC3F3066388 +:105260000138181A18BF0120F6E500BF00440258A3 +:105270002DE9F041DDF8188004460E4615461F461C +:1052800022689368334214BF01230023AB4201D14B +:10529000002012E0B8F1FF3FF3D0FFF781FBC01B05 +:1052A000404502D8B8F1000FEAD10423012084F868 +:1052B0004130636C43F001036364BDE8F0812DE984 +:1052C000F04F054685B00C46FFF76AFB95F8402085 +:1052D00007EE900A012A00F0E1800122022085F801 +:1052E000402095F84120012A40F0BE80002241F282 +:1052F000883117EE903ACDED037A6A64009120214F +:1053000085F841002846FFF7B3FFDDED037A00285A +:1053100040F0AA80D4F824C0BCF1000F03D0A26AE8 +:105320002968013A0A61D4F818A0D4E90727BAF12C +:10533000000F50D063694CEA0A0AD5F800E02668ED +:105340004FEA834BD4F83480D4E90B1967B3A368D0 +:1053500047EA0A0A2769CEF81C30BAB13243114332 +:10536000E26841EA090949EA080848EA07071743D9 +:1053700047EA0B0747EA0A07CEF814706268CEF8CE +:105380001820BCF1000F40F0818062E0314341EA17 +:10539000090949EA080848EA070747EA0B0747EA04 +:1053A0000A07CEF81470ECE752B142EA06070F4341 +:1053B00047EA090747EA0808E76848EA0707D7E71E +:1053C00046EA010747EA090747EA080747EA0B0BDD +:1053D0004BEA0A07E5E737B3A1684CEA0707D5F8B7 +:1053E00000E02669CEF81C106169D4F83480890485 +:1053F000D4E90BA96AB13243E36842EA0A0A4AEAED +:10540000090949EA080848EA030848EA01010F4384 +:10541000B2E746EA0A0646EA090949EA080848EAFC +:1054200001010F43BDE78AB1E16A4CEA02020A4377 +:10543000216B0A43616B0A43E1680A43616942EAEE +:10544000814229684A6162688A619AE7BCF1000F6B +:1054500010D141F2883217EE903A0221284600928C +:105460000122FFF705FFA8B1002385F8403005B001 +:10547000BDE8F08FE36A226B4CEA03031343626BCF +:105480001343626943EA82432A685361012385F822 +:105490004130E9E72B680222DA60F7E70220E6E70D +:1054A000F0B593B004460846164604A91D46FCF71D +:1054B00027FB48B92B6804A920460E93FFF7FFFE8F +:1054C000074618B14FF0FF3013B0F0BDFFF768FA90 +:1054D00025680346A96994F84020012AF2D00122E8 +:1054E00084F8402094F84120012AD0B246D1676464 +:1054F000002E3ED0222284F841202A690132A26384 +:105500002A69266341F28836013262636A6922F0B1 +:10551000406242F080626A61A961A26BA2B9012275 +:10552000022120460096FFF7A3FE10B9236802224D +:10553000DA60012384F841300023C01A84F8403037 +:1055400018BF01204042BFE70122062120460096F5 +:105550000393FFF78DFE0028EBD195F82010226B06 +:10556000039B1170226B01322263A26B013AA2638A +:10557000D3E7636C43F008036364DDE70220DBE7F5 +:10558000F7B50093054690F8943014460191DDE993 +:105590000867F3B1D6B13B68DBB10CF043FD23469D +:1055A0002846DDE9002108F00BFE3B46324605F1B6 +:1055B0006801281DFFF774FF041E284618BF012448 +:1055C00064420CF025FD204603B0F0BD6FF00104ED +:1055D000F9E74FF0FF34F6E7F0B593B0044608461C +:1055E000164604A91D46FCF78BFA48B92B6804A996 +:1055F00020460E93FFF763FE074618B14FF0FF30C9 +:1056000013B0F0BDFFF7CCF994F8402003462568AD +:10561000012AF3D0012284F8402094F84120012A85 +:10562000D0B243D16764002E3BD0122284F84120CF +:105630002A690132E2622A69666241F288360132E1 +:10564000A2626A6922F040626A61E26AA2B901223A +:10565000022120460096FFF70BFE10B923680222B4 +:10566000DA60012384F841300023C01A84F8403006 +:1056700018BF01204042C3E70122042120460096C2 +:105680000393FFF7F5FD0028EBD1626A039B1278C4 +:1056900085F82020626A01326262E26A013AE262BF +:1056A000D3E7636C43F008036364DDE70220DBE7C4 +:1056B0002DE9F0471C4690B090F894300546DDF88F +:1056C0006890DDE918A8CDE9002163B30CF0AAFCCD +:1056D0004FF0FF3328462E1D05F16807DDE9002154 +:1056E00008F06EFD14B1BAF1000F23D1B8F1000F2C +:1056F00002D0B9F1000F19D102A93846FCF700FA1F +:10570000044638B9012302A9CDE90B033046FFF75F +:10571000D6FD08B14FF0FF3428460CF079FC204646 +:1057200010B0BDE8F0874FF0FF34F8E79CB1BAF154 +:10573000000F10D0224602AB39463046CDF808A003 +:10574000FFF74AFF04460028E4D1B8F1000FE3D088 +:10575000B9F1000FE0D002AB424639463046CDF8F1 +:105760000890FFF79DFE041E18BF01246442D3E792 +:1057700000B5564B8DB00A2800F2A480DFE800F097 +:1057800006162432404E5C6A78869400D3F8E020F6 +:105790004F4842F00102C3F8E020D3F8E03003F0B4 +:1057A00001030193019B0DB05DF804FBD3F8E020E9 +:1057B000484842F00202C3F8E020D3F8E03003F09A +:1057C00002030293029BEEE7D3F8E020424842F046 +:1057D0000402C3F8E020D3F8E03003F0040303939D +:1057E000039BE0E7D3F8E0203C4842F00802C3F80E +:1057F000E020D3F8E03003F008030493049BD2E7E1 +:10580000D3F8E020364842F01002C3F8E020D3F885 +:10581000E03003F010030593059BC4E7D3F8E020C4 +:10582000304842F02002C3F8E020D3F8E03003F023 +:1058300020030693069BB6E7D3F8E0202A4842F0FF +:105840004002C3F8E020D3F8E03003F040030793B0 +:10585000079BA8E7D3F8E020244842F08002C3F871 +:10586000E020D3F8E03003F080030893089B9AE728 +:10587000D3F8E0201E4842F48072C3F8E020D3F849 +:10588000E03003F480730993099B8CE7D3F8E020A0 +:10589000184842F40072C3F8E020D3F8E03003F473 +:1058A00000730A930A9B7EE7D3F8E020124842F483 +:1058B0008062C3F8E020D3F8E03003F480630B93F8 +:1058C0000B9B70E70D4807F0ABFF00BF0044025888 +:1058D000000002580004025800080258000C025848 +:1058E000001002580014025800180258001C0258F8 +:1058F0000020025800240258002802584BA8010832 +:1059000038B5431C0D4628D000F00F02134BC0F3EE +:10591000031053F82240FFF72BFF1149114BD1F828 +:1059200094209A42FBD104FB04F2016802EB42038B +:105930000B40B3FBF2F3013B012B03D8436823EA8E +:1059400004034360012D21460CBF2A460022FAF7CA +:10595000B7FF034B4FF440725A6138BD5CAC01088D +:10596000006402580003008038B5044607F0C8FE02 +:105970000C490D4BD1F894209A42FBD1D4E9050390 +:105980005B43026803EB430522EA0502134303600D +:105990004FF44073B4F910004B610021BDE838406A +:1059A000FFF7AEBF00640258000300802DE9F84302 +:1059B000461C05460C4600F09C801FFA80F9554AAB +:1059C00040F47061B2F90030581C4BD10026524BA4 +:1059D00009F00F02C5F3031053F82270FFF7C8FE59 +:1059E0004E494F4BD1F894209A42FBD107FB07FC5C +:1059F000C4F3831283680CEB4C0E0F2A6FEA0E017E +:105A000014BF02FB0CF243EA0E034FF4407E1CBFAE +:105A10000B40134304F007028360022A3F4BC3F894 +:105A200014E036D10EF1004ED3F89480F045FBD14E +:105A300019F0080FC4F383285DD03B0AD0F824E0A6 +:105A40005B435B43C3EB031903FB08F32EEA090E28 +:105A50004EEA03034362314B4FF4407EC3F814E037 +:105A600002231EE043F470638B4210D104F0030361 +:105A70005668032BABD109F47063B3F5706FA6D1F0 +:105A8000324621462846BDE8F843FAF705BF0832FA +:105A900098E7032A3CD002F1FF3EDEF1000343EB1E +:105AA0000E03DFF87890DFF878E0D9F89480F045BD +:105AB000FBD1D0F800E003FB0CFC013A01EA0E0137 +:105AC000012A41EA0C01016005D8436822074CBF56 +:105AD0003B43BB434360C4F301123946FAF7F0FE7F +:105AE000324621462846FAF7D7FE0C4B4FF4407257 +:105AF0005A61BDE8F8830CFB0CF9036AC9EB091E77 +:105B000023EA0E0E09FB08F34EEA03030362A2E741 +:105B10001346C6E7C0A801085CAC0108006402583F +:105B20000003008070B504460D461C22002112F0CF +:105B3000ADFE25822809FFF71BFE4FF47071064663 +:105B40002846FFF733FF238A0B4A012103F00F0396 +:105B500005F00F056661204652F8233001FA05F57D +:105B6000A36106F11003183625606360C4E902667C +:105B7000FFF7FAFE204670BD5CAC0108034BD96804 +:105B80001A6822EA01021A605960704700650258DB +:105B9000124B1A69194602F03802102A1AD004D89A +:105BA000BAB1082A16D00B6814E0182AFBD19A6AF9 +:105BB000996AD86A11F47C7F586B0BD002F003020B +:105BC000012A02D0022A00D01A681B6B034B1B6B00 +:105BD00000E01B68014B9A699B69704700440258BA +:105BE0002B4BD3F8882042F47002C3F888201A693E +:105BF00042F010021A61274A136803F00F03062BC4 +:105C000005D8136823F00F0343F007031360224BFA +:105C10001A6842F001021A6000221A611F4A1968CC +:105C20000A401C491A600A68120705D50A6822F062 +:105C30000F0242F007020A60002219499A61DA61F4 +:105C40001A6299621749D962174919635A639963AD +:105C5000DA6319645A64196821F4802119601A669C +:105C6000124A536A43F480435362114B1B681B0C66 +:105C70001B04B3F1005F02D20E4B01221A600E4BDF +:105C800043F2D2021A600D4A014B9A60704700BF7E +:105C900000ED00E000200052004402587FEDF6EADB +:105CA000000202020000FF0180020101C000005852 +:105CB0000010005C08810051004000520000000804 +:105CC0000A4B013B0FD00269002AFADA0369074A3E +:105CD00043F001030361013A05D0036913F00103A6 +:105CE000F9D1184670470320704700BF410D0300EB +:105CF00030B5056C00F530630F4CA54203D9D0F8E0 +:105D0000004B002C16DB002401291C611C6944F4A3 +:105D100000241C611C6944F018041C611C6944F0D7 +:105D2000C0441C6106D15A61D0F8003B43F0802387 +:105D3000C0F8003B002030BD0A30544FD0F8003E80 +:105D400023F00303C0F8003ED0F8043843F0020308 +:105D5000C0F804380020704770B50023940800F59F +:105D6000805502F00302A34214D301EB84017AB1FF +:105D700000F5805000230468D80024FA00F0C854CD +:105D8000013398B28242F7D1013A92B20132114402 +:105D9000084670BD2E6841F823600133E3E770B513 +:105DA0000E78012500F5006206F00F0374019D4096 +:105DB0004B78012BD36917D11D4300F51060D561D5 +:105DC00003591A040ED48A680559C2F30A03CA7823 +:105DD0002B4343EA824343EA865343F0805343F420 +:105DE00000430351002070BD43EA054500F53060D3 +:105DF000D56103591B04F5D48B680259C3F30A0318 +:105E00001343CA7843EA8243E7E700002DE9F843E9 +:105E10000668054616F0007607D0836C202B1FD04D +:105E20000DD873B1102B15D001262B68D90173D56D +:105E30006B6C032B6FD8DFE803F0201B2220302B84 +:105E4000F2D1734A0026A96CD36C23F030030B43C4 +:105E5000D364EAE76E4AD36A43F40033D362F0E7CF +:105E600002210430FEF7E8FE06460028DDD1E8E70F +:105E7000674AD36A43F40033D362344604E0022114 +:105E8000281DFEF7D9FE0446002C47D1604A696CF4 +:105E9000D36C23F003030B43D3642B685A0247D51A +:105EA0005C4F3B6843F480733B60FEF779FD8046AE +:105EB0003B68DB0534D5002C66D1554BD5F8B400D2 +:105EC0001A6F424012F4407F0BD01A6F196F22F400 +:105ED000407241F480311967196F21F480311967DC +:105EE0001A67B0F5807F3AD0D5F8B430484903F44A +:105EF0004072B2F5407F43D10869474A20F47C5094 +:105F000002EA131202430A61C3F30B03404A116F02 +:105F10000B4313670CE001263446BEE72646BCE778 +:105F2000FEF73EFDA0EB08006428C1D903263446E5 +:105F30002B68D90708D5EB6F102B3CD026D85BB364 +:105F4000082B32D0012634462B689A0748D5AB6F10 +:105F5000052B58D8DFE803F03C37513C3C3CFEF7BA +:105F60001FFDDFF8AC80074641F28839D8F8703061 +:105F70009807B9D4FEF714FDC01B4845F6D9D5E7FC +:105F80000A6922F47C52BEE72646D1E723F00802D4 +:105F9000202A01D0182BD5D19CB91D4AE96F536D29 +:105FA00023F038030B435365CEE70121281DFEF78C +:105FB00043FE0446F0E7012105F12400FEF7BCFD95 +:105FC000F7E72646C0E70121281DFEF735FE044607 +:105FD000E4B90F4AA96F536D23F007030B435365D0 +:105FE0002B685B072AD5D5F89430052B00F29E80EC +:105FF000DFE803F0191496191919012105F124009D +:10600000FEF79AFDE3E701263446E9E72646E7E78F +:106010000044025800480258CFFFFF000121281D0C +:10602000FEF70AFE0446002C40F08380534AD5F860 +:106030009410936D23F007030B4393652B681F07A0 +:1060400014D5D5F88430B3F5805F07D1022105F16E +:106050002400FEF771FD002818BF0126474AD5F835 +:106060008410536D23F440530B4353652B68D806BB +:1060700014D5D5F89830B3F5807F07D1022105F10A +:106080002400FEF759FD002818BF01263B4AD5F829 +:106090009810936D23F440730B4393652B68590359 +:1060A00019D5D5F88830B3F5001F44D0B3F5401F9B +:1060B00007D0B3F5801F45D1304AD36A43F400338B +:1060C000D362002C41D12D4AD5F88810536D23F4AA +:1060D00040130B4353652B68DA0306D52B6D002B59 +:1060E00035D0B3F5803F40D0012629684B0009D553 +:1060F000224B1A6922F400421A611A69D5F8BC00D1 +:1061000002431A61002906DA1C4A696DD36C23F038 +:1061100040530B43D364301E18BF0120BDE8F88301 +:10612000012105F12400FEF707FD7BE70126344637 +:1061300084E7264682E7012105F12400FEF7FCFCF6 +:106140000446BEE701263446C5E72646C3E70B4AA8 +:10615000D36A43F40033D3626CB9084A296DD36C17 +:1061600023F480330B43D364BFE70221281DFEF7DD +:1061700063FD0446F0E72646B7E700BF0044025837 +:10618000484B1A6902F03802102A30B500F08680B8 +:10619000182A0CD0002A40F083801A68424812F076 +:1061A000200F03D01B68C3F3C103D84030BD996AE8 +:1061B0009D6ADA6A15F47C7FC5F305105C6BF5D037 +:1061C000C4F3CC0402F0010207EE900A01F00301CF +:1061D0006243B7EE006AF8EEE76A012907EE902AFB +:1061E000FAEEE97A4CD002293CD0002948D11A684D +:1061F000920627D519682C4AC1F3C1011B6BCA400E +:10620000C3F3080307EE102AF8EEC75A85EEA67A04 +:1062100006EE903AF8EEE66A76EEA77A77EE867AA0 +:10622000204B67EE877A1B6BC3F34623013307EEDF +:10623000103AF8EEC76A87EEA67AFCEEC77A17EE38 +:10624000900AB3E71B6BC3F3080307EE103AB8EEEE +:10625000C77A77EE277A77EE867A9FED146A86EE14 +:10626000267ADDE71B6BC3F3080307EE103AB8EE9E +:10627000C77A77EE277A77EE867A9FED0D6AEEE79A +:106280001B6BC3F3080307EE103AB8EEC77A77EE3C +:10629000277A77EE867A9FED076AE0E7064885E77A +:1062A000064883E7004402580090D0030024744C51 +:1062B0000024744B0024744A0024F40000093D00BB +:1062C00008B5FFF75DFF084B08499A699B69C2F35F +:1062D000032203F00F038A5CCB5C02F01F0203F081 +:1062E0001F03D040D84008BD00440258AFA80108A1 +:1062F00073B50E460446FFF7E3FFB0FBF6F5FF2D3E +:1063000047DCFFF7DDFFB0FBF6F101FB160606B92F +:10631000013D6560FEF744FB94F84120034612B945 +:1063200041F28832A2642068A1680268013922F42F +:10633000706242EA0122202102602046A26C009293 +:106340000022FEF795FF30BB2268E569E36811681B +:106350002B43256A21F07F412B43656821F0D00152 +:1063600043EA05630B4313605568D4E905310B43D9 +:10637000216943EA0143094929400B4353601368EB +:1063800043F0010313600123606484F8413002B0DC +:1063900070BDFF25BDE74FF0FF30F8E7FEF8E0FFE6 +:1063A00008B5FFF78DFF054B054ADB69C3F30223F0 +:1063B000D35C03F01F03D84008BD00BF004402585F +:1063C000AFA8010808B5FFF77BFF054B054ADB695D +:1063D000C3F30213D35C03F01F03D84008BD00BF12 +:1063E00000440258AFA80108DFF86CC290212DE9E3 +:1063F000F043DCE90035834C89B06943DCF8088060 +:10640000DCF80C006218B8F5965F63504FF000019D +:1064100038BF0726DCF8107028BF0E46A2F85610C9 +:10642000A2F85410A2F85E10A2F85C101162516636 +:10643000DCF814E0C2F804809060D760C2F810E085 +:10644000C2E90611C2E90961BCF91A1001315DD136 +:10645000082151616C4A934210D19022B8F5165F21 +:1064600002FB054292F8801057D8012906D019681E +:1064700041F002011960002182F88010902202FB95 +:106480000541D1F884C0BCF1000F01D181F880C072 +:1064900002FB0542242140EA0E00C2F8841019686C +:1064A000526921F001011043584A196019680A40E5 +:1064B000104318605A6822F4405217435F609A688C +:1064C00022F06E4222F430629A60DA6A22F00F0201 +:1064D00016434F4A9342DE6225D14E4B5B6D03F06B +:1064E0003803282B00F284804B4AD35C082B00F23F +:1064F000BB81082B7CD8DFE813F0E001E6017B00CC +:106500007B00E9017B007B007B00EE01BCF91810E9 +:1065100001310CBF04210C219BE70129AED0196881 +:1065200021F00201A6E73D4A934207D1394B5B6D4A +:1065300003F00703052B5BD8394AD6E7394A934263 +:1065400007D1344B5B6D03F00703052B50D8364A57 +:10655000CBE7364A934207D12E4B5B6D03F007031E +:10656000052B45D8324AC0E7324A934207D1294B1E +:106570005B6D03F00703052B3AD82F4AB5E72F4A86 +:10658000934207D1234B5B6D03F03803282B2FD8A0 +:106590002B4AAAE72B4A934207D11E4B5B6D03F0AF +:1065A0000703052B24D8284A9FE7284A934207D19E +:1065B000184B5B6D03F00703052B19D8244A94E7A9 +:1065C000114A934214D102F50E32936D03F0070382 +:1065D000052B0DD81F49CB5C102B00F0088109D882 +:1065E000042B00F0FA80082B00F0FC80022B35D041 +:1065F000012642E0202B00F03581402BF8D14FF4EA +:106600000040FDE0F40C0224000C0058F369FFCFB9 +:1066100000100140004402587AA8010800440040DC +:10662000A3A8010800480040A3A80108004C0040AE +:10663000A3A8010800500040A3A8010800140140CD +:106640007AA8010800780040A3A80108007C004057 +:10665000A3A80108A9A80108900B0224FFF730FEA7 +:10666000A94BAA4A1B6AC3F30213D35C03F01F03AE +:10667000D840002840F0C480002690224FF001133B +:10668000012E02FB05F204EB02018B664FF00003C2 +:10669000C1E91C3300F034818B6A002B66D0D80727 +:1066A00006D5A058C96A426822F400320A43426003 +:1066B0009A0709D590226A43A158A0184A68006B2E +:1066C00022F4803202434A605F0709D590226A4370 +:1066D000A158A0184A68406B22F4802202434A6005 +:1066E000180709D590226A43A158A0184A68806B00 +:1066F00022F4004202434A60D90609D590226A4337 +:10670000A158A0188A68C06B22F4805202438A60A4 +:106710009A0609D590226A43A158A0188A68006C8D +:1067200022F4005202438A605F0613D590226A4326 +:10673000A158A0184A68476C22F48012B7F5801F50 +:1067400042EA07024A6005D14A68806C22F4C0021E +:1067500002434A60180609D590236B43E258E118BA +:106760005368C96C23F400230B43536090276F4395 +:10677000E35904EB07085A6822F490425A609A6879 +:1067800022F02A029A601A6842F001021A6000237D +:10679000C8F88C30FEF704F9E35902461B68190764 +:1067A00000F1A38090236B43E3581B685B0707D578 +:1067B0004FF480014046FEF783F9002840F09F80A7 +:1067C000902303FB05442023C4F88430C4F88830A8 +:1067D0000023E36684F8803092E002A8FAF7B8F963 +:1067E000039846E705A8FAF70BF9069841E71368FE +:1067F000474813F0200F03D01368C3F3C103D840F8 +:106800004FF09009434B09FB05F904EB09014A6A73 +:10681000D1F8048033F8122008EB4801B0FBF2F302 +:106820008B42FFF4E5AEB3EB083F3FF6E1AE002349 +:10683000002113F007FF42460F020023060247EA39 +:1068400010674FEA5800301847F1000113F0FAFEC4 +:10685000314BA0F540729A423FF6CAAE54F8093067 +:10686000D86009E72D48CBE7202B39D0402B39D011 +:10687000102B7FF4BDAE244B25481A6812F0200F70 +:1068800003D01B68C3F3C103D84090236B43E118C6 +:106890004A684E6A1F4931F81610B0FBF1F000EB60 +:1068A0005200B0FBF2F080B24FF6EF72A0F110018F +:1068B00091423FF69DAEE358D2E7FFF783FD0028F3 +:1068C0003FF4DAAEE1E7FFF76BFDF8E702A8FAF76D +:1068D0003FF90398F3E705A8FAF792F80698EEE770 +:1068E0000E48D2E74FF40040CFE701904FF400117B +:1068F0004046FEF7E5F8019A00283FF453AF03261F +:10690000304609B0BDE8F08300440258AFA8010842 +:106910000090D003E8A80108FFFC0F0000093D002B +:10692000294B4FF4E13210B59A60C4B01A68274B76 +:106930009A4245D10021BC2215A811F0A7FF0423DB +:106940001493234B196811F0040116D1482202A8B0 +:1069500011F09CFF02231F4C0193012304930A931F +:10696000402305931C4BD4F88C209A42FBD101A8FC +:10697000FEF7E2F94FF44073E360154B1B685B07C9 +:1069800010D50323134C3993134BD4F88C209A421F +:10699000FBD114A8FFF73AFA4FF44073E360FFF716 +:1069A00023FD78B100230B4C39930B4BD4F88C208A +:1069B0009A42FBD114A8FFF729FA4FF44073E36021 +:1069C000FFF712FD44B010BD900B0224000C0058DC +:1069D00000440258006402580003008037B5444C5C +:1069E0002369A369A369A369E569E369236A05F0DB +:1069F0007005404B1B68FFF7E5FCD4F8E8303E4AD1 +:106A000043F00803C4F8E830D4F8E83003F0080392 +:106A10000193019B394BD2F88C109942FBD1D4F8E9 +:106A2000903043F00803C4F89030D4F8903023F04D +:106A30000803C4F890304FF44073314CD360314BAD +:106A400023604FF0FF33E3602F4B002D4DD1B0FB9F +:106A5000F3F0002301382361A3606060C4E90533CB +:106A600094F83D3003F0FF020BB984F83C20254A2E +:106A7000022384F83D30136823F47C7313604FF0D5 +:106A8000FF33D36201239062536184F8483084F865 +:106A90003E3084F83F3084F8403084F8413084F848 +:106AA000423084F8433084F8443084F8453084F828 +:106AB000463084F8473084F83D30144B144A9B68C4 +:106AC000C3F80821BFF34F8F124B4FF480225A6056 +:106AD00094F83E30012B01D1F9F7F8FD2268D36814 +:106AE00023F00203D36003B030BD4000AFE700BF26 +:106AF0000044025800200052006402580003008045 +:106B000064050024000C004040420F0000ED00E04E +:106B10006508000800E100E070B5002396B001931D +:106B2000874BDA6A22F00102DA62DB6A03F00103C2 +:106B30000193844B9A6942F440429A619A6902F443 +:106B400040420192019A9A699604FCD501223323AE +:106B50008021082003930023069204931493CDE927 +:106B6000092102227821CDE90C230C2310921393E2 +:106B70004023CDE90E0107931021202303A8CDE97E +:106B800011120B93FEF7D8F810B1002016B070BDAB +:106B90006D4A136813F00C0F00F0A4806B4B9A69D8 +:106BA00002F070023F2A40F2AA80DA6902F0700215 +:106BB0003F2A05D8DA6922F0700242F04002DA6119 +:106BC000624BDA6902F4E062B2F5806F05D2DA69ED +:106BD00022F4E06242F48062DA611A6A02F0700222 +:106BE0003F2A05D81A6A22F0700242F040021A6267 +:106BF000564B9A69110705D49A6922F00F0242F0A8 +:106C000008029A619A6922F470629A611A68920184 +:106C1000BBD51A6941F288364C4C22F0070242F08B +:106C200003021A61FDF7BCFE0546236903F0380331 +:106C3000182B6BD1A36903F00F03082B05D9A369A7 +:106C400023F00F0343F00803A3613F4A136803F0E6 +:106C50000F03042B60D83D4B9A6902F07002402A62 +:106C600067D8DA6902F07002402A05D9DA6922F0A1 +:106C7000700242F04002DA61344BDA6902F4E062F9 +:106C8000B2F5806F05D9DA6922F4E06242F48062DD +:106C9000DA611A6A02F07002402A05D91A6A22F0F3 +:106CA000700242F040021A62284CFFF769FAA369A9 +:106CB000A369FFF793FE23680120214A43F0800374 +:106CC0002360D4F8F43043F00203C4F8F430D4F86D +:106CD000F43003F002030293029B136A43F00103B2 +:106CE000136253E7136823F00F0343F004031360A8 +:106CF000136803F00F03042B7FF447AF4EE79A6944 +:106D000022F0700242F040029A614EE7FDF748FE21 +:106D1000401BB04289D938E7136823F00F0343F0D2 +:106D200004031360136803F00F03042B7FF42DAFEB +:106D300091E79A6922F0700242F040029A6190E76E +:106D40000004005800480258002000520044025835 +:106D500090F8BC230368012A21D0012280F8BC23CB +:106D6000826A012A06D18269012A03D09A6B42F411 +:106D700080329A639A6842F001029A60D3F8002E3A +:106D800022F00302C3F8002ED3F8042822F00202F6 +:106D9000C3F80428002380F8BC331846704702204B +:106DA000704700000A4BDA6842F00102DA60DA68E4 +:106DB000D2070BD5D3F80C2142F00102C3F80C2105 +:106DC000D3F80C01C04300F0010070470120704768 +:106DD00000200052104BDA68D20706D40E4BD3F8CD +:106DE0000C0110F001000AD170470C4A5A6002F100 +:106DF00088325A60DB68DB07F0D501207047074A0C +:106E0000C3F8042102F18832C3F80421D3F80C013D +:106E100000F00100704700BF0020005223016745C9 +:106E200038B50446FDF7BCFD05460134FDF7B8FD55 +:106E3000431BA342FAD338BD73B505460C200E465A +:106E4000019206F0B3FA00232946019A0446C0E9EC +:106E50000133074B0360F9F7F7FF054630B12368AC +:106E600020465B689847284602B070BD3460FAE758 +:106E700088AB010873B505460C200E46CDE90032FB +:106E800006F094FA00210446C0E901110849DDE941 +:106E9000003201602946F9F77AFF054630B12368D0 +:106EA00020465B689847284602B070BD3460FAE718 +:106EB000B4AB010803682DE9F041DB6E04460D46D2 +:106EC0009847804640F2011006F070FA23680027C8 +:106ED00006461B6F294620469847236832462946B6 +:106EE00020465B6E9847002801DD0137F5E72368EF +:106EF0004246294620469B6E9847304611F05CFC7E +:106F00003846BDE8F0812DE9F043064687B02C20D5 +:106F1000154606F1A4080F4606F048FA0446404616 +:106F200006F1140903F090FDB36902AA21466360DB +:106F30004846F3690195A36001AB02F003FB0546E7 +:106F4000A8B99DF80C30222B1CD104AA2146484632 +:106F500001F0D8FB054650B963682361A3686361FB +:106F60000E23A3611023E360736A746223604046BA +:106F700003F04AFD4DB93C60284607B0BDE8F04338 +:106F8000F9F7C5BF6FF01305F1E7204611F014FCC7 +:106F9000F2E72DE9F04F07469B4693B0382007F102 +:106FA000A4098846164606F001FA0446484603F04E +:106FB0004BFD1BF0030C07F1140A00F0C580BCF177 +:106FC000010F4FF0000000F0C180BCF1020F8446B9 +:106FD00001D0002100E003214FEA6B0202964FEA44 +:106FE000AB0502F4807205F400752A430BF480654A +:106FF0002A434FEA0B2505F40065154345EA0C05C5 +:1070000005430D4305F00303012B11D102AB03AA85 +:1070100007A9504602F096FA064600BB9DF81030CC +:10702000222B00F08A80A9053FD56FF0100609E0F9 +:1070300097F85430002BE9D1504601F0DFFF0646A7 +:107040000028E3D0484603F0DFFC002E78D1C8F8D2 +:107050000040304613B0BDE8F04FF9F758BF821C2E +:10706000F0D1029B2F211846019313F035F8834687 +:107070000028E7D1EB05E5D5019B40F611028DF81C +:1070800012001846ADF8102012F0F4F94FF0FF325C +:107090008DF8130007A9019B5046CDE9052B03AAE3 +:1070A00002F02CFB06460028CCD1089B0022680584 +:1070B0006360099BA261A360039BE360059B23615E +:1070C000069BC4E9075263610AD44FF0FF337D6920 +:1070D000E3626B6BF3B13A6A62B16FF00B06B1E732 +:1070E00013B145F48035E5614FF0FF320023C4E968 +:1070F0000423EAE76363E36903F00303012B04D08D +:1071000004F12C01284601F006F93B6A00263C6296 +:10711000236097E7E36903F00303012B06D1686955 +:1071200011F042FB60630028EFD1D6E7A86911F0A7 +:107130003BFB60630028E3D1CFE76FF0140681E7E3 +:10714000204611F039FB84E7012042E74FF0020CA2 +:107150003FE7000010B50446EFF3058313B16FF06D +:10716000050010BD0DF06CFA0028F8D120464FF054 +:10717000FF31DFF808C000DFF3E700BFD92B0108BB +:1071800070B50A440E4E036893FAA3F393FAA3F37F +:107190000360914212D011F8014B84EA030505F017 +:1071A0000F0556F8255085EA131383EA141404F0EA +:1071B0000F0456F8244084EA1313EAE7036070BD15 +:1071C00094AD0108437982790433C079134418449B +:1071D000704703681A6AC36AD31A1944B1FBF2F301 +:1071E00002FB1311036B8B4210B50BD94C09C26B18 +:1071F000012301F01F0103FA01F152F824300B437F +:1072000042F82430002010BD03680846184703697F +:1072100010B5044613B150F8041B9847204610BD22 +:1072200038B5036804460D469B6F984723682D695F +:107230002046DB6F9847284638BD38B503680446BA +:107240000D469B6F98472368ED682046DB6F984793 +:10725000284638BD38B5036804460D469B6F9847ED +:1072600023686D692046DB6F9847284638BD036860 +:107270000122D3F88030184708B5064B53F8200098 +:107280000368DB6A984780B2B0F5007F38BF4FF4DF +:10729000007008BDF41402242DE9FF4716461C4671 +:1072A0008046DFF844900391FFF7E6FFA0FB0667F6 +:1072B000A0FB044559F8280032460368CDE9004593 +:1072C000D3F81CA03B46D04750B959F828003246A5 +:1072D00003990368CDE900459C693B46A04700B18E +:1072E000042004B0BDE8F087F41402247FB51646EC +:1072F00005461C460391FFF7BFFF0A4A0346039960 +:1073000052F82500A3FB04450268CDE90045546905 +:10731000A3FB0623A047002814BF0420002004B0CC +:1073200070BD00BFF414022413289ABF014B1856F5 +:1073300040427047FFAC010813128A76CB7603787F +:10734000032B01BF120C0A7512124A7570470328ED +:10735000CA7E8B7E08BF487D43EA022302BF0A7DB6 +:1073600042EA002243EA02431846704760B10368CC +:107370005BB11A785AB18088DA88904216BF09202A +:10738000002000230B60704703460920FAE709201C +:107390001346F7E7026810B504465AB1114611F8D2 +:1073A000013B202B11D93A2BF9D11378303BD8B2BD +:1073B000092802D94FF0FF3006E002329142F9D19C +:1073C000032B1846F6DC216010BD0020FCE738B521 +:1073D000C378044613B90025284638BDD0E90C21EE +:1073E00001234078FFF758FF054680B9216B636A97 +:1073F000E269CB1AE0709342EDD2A378022BEAD176 +:107400000A440123616B6078FFF746FFE4E701253A +:10741000E2E70B0A017043700B0C090E8370C17018 +:10742000704742884378007843EA022340EA032009 +:107430007047002370B51C462E26C5692A5D0134AD +:10744000202A0AD0052A08BFE522092C02BFCD1840 +:1074500001336E72CD1801336A720B2CEDD10B44DF +:1074600000225A72C369DB7A03F03F030B72C469CE +:1074700004F11C00FFF7D5FF0860E27DA37D43EA1D +:107480000223CB80627E237E43EA02238B8070BD81 +:10749000406803689B6C1847D0E9043110B5D0E907 +:1074A0000824D01A64EB010110BD406803685B6BCF +:1074B0001847416830B4D0E904400D6812192D6BAB +:1074C00040EB03030846294630BC084741680B6877 +:1074D00010B41C6BD0E90423084621465DF8044B28 +:1074E0000847406803689B6A1847406803685B6AFE +:1074F00018472DE9F3470546144698464068D5E9F4 +:1075000004230168A218DDE90AA948EB0303CDE9C9 +:1075100000A9496C884780B114EB0A04D5E904320C +:1075200048EB0908E61848EB0207D5E90823BB42F7 +:1075300008BFB2422CBF0120002002B0BDE8F08796 +:107540002DE9F3470546144698464068D5E90423DB +:107550000168A218DDE90AA948EB0303CDE900A9F7 +:10756000096C884780B114EB0A04D5E9043248EB72 +:107570000908E61848EB0207D5E90823BB4208BF13 +:10758000B2422CBF0120002002B0BDE8F0872DE9F7 +:10759000F3470546144698464068D5E90423016838 +:1075A000A218DDE90AA948EB0303CDE900A9C96BDC +:1075B000884780B114EB0A04D5E9043248EB090886 +:1075C000E61848EB0207D5E90823BB4208BFB242E0 +:1075D0002CBF0120002002B0BDE8F0872DE9F34167 +:1075E000DDE908670168044615469846CDE900675D +:1075F000496C884768B16068D4E904230168AA1817 +:10760000CDE9086748EB0303C96902B0BDE8F04162 +:1076100008476FF47A6002B0BDE8F0812DE9F043CD +:1076200085B00446154698460391DDE90C67CDE91F +:1076300000670168D1F84090C84778B16068039945 +:10764000D4E904230468AA18CDE90C67A46948EBBF +:107650000303A44605B0BDE8F04360476FF47A60C9 +:1076600005B0BDE8F0832DE9F04385B0044615462A +:1076700098460391DDE90C67CDE900670168D1F810 +:107680003C90C84778B160680399D4E90423046842 +:10769000AA18CDE90C67646948EB0303A44605B05A +:1076A000BDE8F04360476FF47A6005B0BDE8F08351 +:1076B000406803681B69184740680368DB6818471F +:1076C00073B50446406803689B689847054658BBF5 +:1076D000606803689B6B9847237A3BB12572D4E9B5 +:1076E0000432C31A61EB0202C4E90432237E43B1BF +:1076F0000026D4E908322676C31A61EB0201C4E9F8 +:107700000831D4E90416D4E9083220685B1A62EB28 +:107710000602CDE900320022416C00232046884752 +:10772000002808BF6FF47A65284602B070BD406833 +:1077300010B103689B6C18477047407E7047007E0D +:107740007047D0E9042110B5D0E90234981844EB11 +:10775000010110BDD0E902017047D0E90401704772 +:1077600090F820301BB1406803685B6B18476FF4DA +:107770007A60704790F8201030B459B1D0E9011404 +:10778000C0680D6812192D6B40EB030308462946AB +:1077900030BC08470020002130BC704790F82030F2 +:1077A0001BB140680368DB6A18470020002170475E +:1077B00090F820301BB1406803689B6A184700208E +:1077C0000021704790F820301BB1406803685B6A65 +:1077D00018470020002170472DE9F34190F8201050 +:1077E000044615469846DDE9086799B10168CDE978 +:1077F0000067496C884768B1E368D4E90102016811 +:10780000AA18CDE9086748EB0303C96902B0BDE8CF +:10781000F04108476FF47A6002B0BDE8F0812DE9CD +:10782000F04390F820C085B0044615469846039171 +:10783000DDE90C67BCF1000F16D0CDE900670168E7 +:10784000D1F84090C84778B1E3680399D4E90102C0 +:107850000468AA18CDE90C67A46948EB0303A446A1 +:1078600005B0BDE8F04360476FF47A6005B0BDE84D +:10787000F0832DE9F04390F820C085B0044615460A +:1078800098460391DDE90C67BCF1000F16D0CDE9F5 +:1078900000670168D1F83C90C84778B1E368039964 +:1078A000D4E901020468AA18CDE90C67646948EBC1 +:1078B0000303A44605B0BDE8F04360476FF47A6067 +:1078C00005B0BDE8F08390F820301BB14068036834 +:1078D0001B6918476FF47A6070472DE9F047D0E9CB +:1078E000011405684FEA640A9DF820C005EB6400A6 +:1078F000E4079DF824E048BF55F80A409DF8288029 +:10790000DDF82C9048BF6158DDE90C67CDE90A89A4 +:10791000CDE90C67CDE908CEBDE8F047084730B4A3 +:107920009DF808109DF80C409DF810500291CDE98B +:10793000034530BCC1680847FF207047D0E94401C7 +:107940007047F0B51F46D0F81831164601332DD1D7 +:10795000D0F86021D0E94445AF4208BFA6421CD20E +:10796000D0F82811C9B101290CD000F5B47C00234E +:10797000994212DDFCE80245BD4208BFB44202D282 +:107980000133F5E700230344012193F85441002318 +:107990000C4205D0723350F823201046D117F0BDA9 +:1079A00001334900042B49B2F2D1F6E74FF480507D +:1079B0000021F4E700487047D0AC0108D0F860011E +:1079C0000021704701200021704701682DE9F04730 +:1079D00017469846096B0646DDE9089A884702462D +:1079E0000B463846414612F02DFE134302D00020CC +:1079F000BDE8F08717EB09043368304648EB0A0509 +:107A000014F1FF32196B45F1FF33884702460B46EC +:107A10002046294612F016FE1343E8D1336830465B +:107A20009B6B9847A94208BFA0422CBF01200020B1 +:107A3000DEE72DE9F74F1646016802690546009317 +:107A40000192896B4769DDE90CAB16EB0A0843EB41 +:107A50000B098847494508BF4045DDE9003203D29C +:107A6000002003B0BDE8F08F16F17844284643F1BA +:107A7000FF31A4182A6841EB0707116B324688478B +:107A800002460B462046394612F0DCFD1343E7D18F +:107A900014EB0A042B68284647EB0B0718F1FF325A +:107AA000196B49F1FF33884702460B462046394699 +:107AB00012F0C8FD13430CBF01200020D1E70000E5 +:107AC00000487047D6AC0108D0E90601704790F82D +:107AD0002030002B0CBF4FF0FF30FF20704790F894 +:107AE000203013B12020002170470020FBE72DE952 +:107AF000F0471E460368154604469B6ADDE9087A8E +:107B0000984702460B462846314612F09BFD134328 +:107B100002D00020BDE8F087236820469B6A984782 +:107B200002460B463846514612F08CFD1343F0D105 +:107B300015EB07082368204646EB0A099B6B98471C +:107B4000494508BF40452CBF01200020E2E72DE950 +:107B5000F0471E460368154604465B6ADDE9087A6D +:107B6000984702460B462846314612F06BFD1343F8 +:107B700002D00020BDE8F087236820465B6A984762 +:107B800002460B463846514612F05CFD1343F0D1D5 +:107B900015EB07082368204646EB0A099B6B9847BC +:107BA000494508BF40452CBF01200020E2E70020E6 +:107BB0007047036873B50C469B6F0646984701A94A +:107BC0002046FFF7D3FB054600B9206033683046F6 +:107BD000DB6F984714B1204610F0EEFD284602B046 +:107BE000BDE87040FFF7A0BB08B110F0E5BD7047DD +:107BF00010B5044610F0E0FD204610BD10B5044657 +:107C000010F0DAFD204610BD70B50446FFF7DFFB2B +:107C1000054600283FD12378032B35D12679012E44 +:107C200032D10146A289606B10F030FE636B5522A1 +:107C30004121722083F8FE21AA2283F8FF215223DA +:107C4000626B137053706123D1709370626B82F812 +:107C5000E73182F8E40182F8E50182F8E611606B11 +:107C6000616900F5F470FFF7D4FB606B216900F5E2 +:107C7000F670FFF7CEFB226A3346616B0132607803 +:107C80002263FFF709FB25716278034B53F822004A +:107C9000B0FA80F0400970BDF414022490F820304E +:107CA00010B504465BB11C30FBF732F838B984F8E4 +:107CB000200060680368BDE81040DB6818470020BA +:107CC00010BD2DE9F04F89B09046994605469DF8C4 +:107CD0004820C3469DF8503090F8FA71DDE91561EF +:107CE0000591032A57D8DFE802F01B021903022787 +:107CF0000F2B4FF0000205F1040A08BF95F8FD3183 +:107D000011465046009203933B46CDE901220AF00A +:107D100093F9044638B109B0BDE8F08F0327E7E7CF +:107D20004FF0FF3BE4E7059B4FF0FF329DF84C100E +:107D30005046079307ABCDE900635B46FDF720FC97 +:107D40003B468346224621465046CDE90244CDE9D2 +:107D500000440AF071F90028DDD1BBF1000F01D019 +:107D60005846D8E795F801010028D4D0B9F1000FA2 +:107D700008BFB8F1040F04D1337843F00A0333701D +:107D8000EEE7B9F1000F08BFB8F1020FE8D1337880 +:107D900023F00403F3E74FF0FF30BCE708B590F899 +:107DA00020302BB100691044FAF732FF002108BDE2 +:107DB0001846FBE708B590F8203023B10069FAF7C0 +:107DC00027FF002108BD1846FBE7F7B590F8201003 +:107DD00004461546DDE9086771B10168CDE9006721 +:107DE000496C884740B121693246201D294403B0BF +:107DF000BDE8F0400AF0B6B96FF47A6003B0F0BDA8 +:107E0000F0B590F8207085B0044615460391DDE981 +:107E10000A6C7FB10768CDE9006C3F6CB84748B188 +:107E2000226933460399201D2A4405B0BDE8F0407D +:107E30000AF0E4BA6FF47A6005B0F0BD90F8203033 +:107E400010B5044613B94362002010BD2430FAF780 +:107E50005FFF0028F8D184F82000201DBDE8104005 +:107E60000AF010BC90F820302DE9F04F814685B023 +:107E700003B9436209F1240656E8000F013046E8D1 +:107E80000003002BF8D1012843D109F104000AF0C6 +:107E900015FC804630B13046FAF73AFF404605B04F +:107EA000BDE8F08FD9E906ABD9E904451AEB040324 +:107EB00000934BEB05030193FAF7CAFE002300F190 +:107EC000006C8646DDE900018B4208BF844505D27F +:107ED00030466FF47A68FAF71BFFDFE7002D08BF22 +:107EE000B4F1006FF4D35AEA0B030ED14FF00061E6 +:107EF0000B1B029365EB45030393DDE9026716EB69 +:107F00000E0647F10007C9E90667012189F820102C +:107F1000C4E79846C2E770B514466FF00046126891 +:107F200005460498B24207D238B10146184611F00E +:107F300091FF431C05D1206070BD15B18A4238BF46 +:107F4000AB54236801332360F6E700002DE9F04FBE +:107F500089B0002405469DF850A09DF84800A24530 +:107F6000DDF85480079414BF4FF0300B4FF0200B16 +:107F70000128CDE905443FD1A3423DDA5B42814669 +:107F8000841E00270DF1140C4FF00A0EE4B2029487 +:107F9000029C012C56D8022803F00F044FEA131359 +:107FA0000CBF334E334E345D0CF807407C1C002B65 +:107FB00046D1B9F1000F27D0BAF1000F09D02D2317 +:107FC0002846CDF80080CDE90212FFF7A4FFDDE9D5 +:107FD0000212BC1C139B9C421BDBBAF1000F09D19F +:107FE0002D232846CDF80080CDE90212FFF793FF3C +:107FF000DDE90212013C1EE013B14FF00009BFE7BA +:10800000302301248DF81430139B9C4213DA4FF077 +:1080100000095B462846CDF80080CDE90212FFF743 +:108020007AFF139B013BA3421393DDE90212F0DCBC +:10803000B9F1000FD1D105AE6CB909B0BDE8F08F30 +:108040002746A5E7B3FBFEF40EFB143330330CF8E0 +:1080500007302346AAE7013CCDF800802846335D6F +:10806000CDE90212FFF757FFDDE90212E4E700BF96 +:10807000D4AD0108E4AD01082DE9F04F1C4689B0EC +:1080800000238946129E15460793B2B1994214DB2C +:108090000CBF012301F1FF394FF0000B049315F8D9 +:1080A0000B3073B948B1049B3BB9079B4B4595BF57 +:1080B000049A049BC25400F80930079809B0BDE83F +:1080C000F08F252B40F002810BF1010815F80830E4 +:1080D000203BDBB20D2B07D842F6090222FA03F34C +:1080E000DB0748BF0BF1020815F808302A2B1DD119 +:1080F000002108F1010204348E46AF5CAB182E2F2C +:1081000051D15F782A2F2CD04FF0000AC5F1010C15 +:108110000CEB030213F8017F303F5FFA87F8B8F1E8 +:10812000090F21D80A2202FB0A7AF1E7302B15D178 +:1081300008F1010815F80830302BF9D04FF0010E86 +:10814000A8440021A8EB050218F8013B303BDFB240 +:10815000092FD2D80A2202FB0131F3E74FF0000EBB +:10816000EEE7023254F804ABAB5C682B1ED1AB18BF +:108170005B78682B0CBF7223112303F00308904433 +:1081800015F80870642F01D0692F3FD1822B27D1B9 +:10819000252307AA494600960590252F18BFD846E3 +:1081A000FFF7B9FE2EE06FF0004ADDE76C2B06D139 +:1081B000AB185B786C2B0CBF82232123DDE76A2B85 +:1081C00008D07A2B08D0742B08D04C2B14BF002376 +:1081D0006123D2E73123D0E74123CEE75123CCE717 +:1081E000112B54F8042B0FD0722B00D152B2012363 +:1081F0000191CDE902E600934946134607AA05908E +:10820000FFF7A4FE059838E012B2F0E7752F03D00F +:1082100007F0DF02582A16D1822BB9D0112B54F85F +:10822000042B09D0722B00D1D2B2752F0191CDE968 +:1082300002E603D10023DEE792B2F6E7582F0CBF27 +:1082400003230223D7E7632F09D154F8043B07AA7D +:1082500049460096DBB20590FFF75DFED2E7732F2B +:1082600016D154F804BB0BF1FF3717F8013F23B1C7 +:10827000AAEB07021BEB020F02D108F1010B0EE77C +:1082800007AA494600960590FFF745FE0598ECE7DA +:10829000702F7FF47DAF54F8047B302307AA494642 +:1082A00000960590FFF737FE782307AA4946059800 +:1082B0000096FFF730FE002307AA4946059803966B +:1082C000CDE90133032300933B4699E707AA4946CA +:1082D0000096D8460590FFF71EFE93E7F8B5C569EE +:1082E0000F460E68083DAE4213D3B6FBF5F00138D9 +:1082F00012F0C0F9841CA6EB8404B4FBF5F420460C +:1083000012F0B8F9A6EB800004FB150520463D608D +:10831000F8BD0020FCE710B50C468269FF21A0687B +:1083200010F0B4FA4FF0FF33236010BDF7B50C46E0 +:108330000968064617464B1C21D0006883690093E4 +:108340008568D4E90123A847054620B937B92146F5 +:108350003068FFF7E0FF284603B0F0BD33683946C8 +:1083600030469B690193A3680093D4E90023FAF790 +:108370008CFD002805DBEAD16FF03305EBE7002523 +:10838000E9E70546E7E72DE9F74F0C9C07460D4660 +:1083900091469846DDF838A0BAF1000F03D1504657 +:1083A00003B0BDE8F08F2B6838684345826928D157 +:1083B0006B68A34225D803EB020BA34521D9ABEB95 +:1083C000040BE01AAB68D3450D99184428BFD34677 +:1083D0005A465C4410F04CFA0D9B5B44AAEB0B0B25 +:1083E0000D933B689A69B4FBF2F302FB134333B974 +:1083F0004A4629463846FFF799FF0028D0D1DA4689 +:10840000CAE7B4FBF2F302FB13434BBB924527D3FD +:108410004146BAFBF2F302FB13AB2246AAEB0B0A6E +:10842000CDF800A083681E460D9BB0470028B7D149 +:10843000B9F1000F04D10D9B544453440D93DEE772 +:108440000D9B42464946384600932346CDF804A08A +:10845000FAF71BFD0028A3DBEDD16FF033009FE797 +:10846000E31AD346C5F800806B60C8E72DE9F04FEA +:1084700085B00F4691469846109D0390DDE90E4663 +:108480000DB9284659E0039B1868B9F1000F1ED0BA +:10849000D9F8003043451AD1D9F80410A14216D8B2 +:1084A000826901EB020A544511D2AAEB040A611A4F +:1084B000D9F80830AA4528BFAA4630465246194482 +:1084C00056445444A5EB0A0510F0D2F9D8E73A68AF +:1084D000436990450ED179688C420BD301EB030AB6 +:1084E000544507D2AAEB040A611ABB68AA4528BF03 +:1084F000AA46E2E7B4FBF3F203FB1242D0F804B061 +:108500008AB99D420FD322464146B5FBF3FA03FBDD +:108510001A5A3346A5EB0A050095D84768B92E4488 +:108520002C445546ACE7A21A00934146BB68C7F8F5 +:1085300000807A60D8470028A2D005B0BDE8F08F4F +:108540002DE9F04F8BB0914607468846149A07A94B +:1085500000680DF1200B013A0593DDF858A0079251 +:10856000FFF7BCFE059B0546194605935046159B33 +:108570009847024618BB15B305F001064A4600901D +:108580003846C6F10204059BA100CDE901B1414680 +:10859000FFF76CFF024690B9013C944207DC0AAB3E +:1085A000023E03EB8404354454F8083CDCE70899A8 +:1085B0005046159B984701220028EED002461046EF +:1085C0000BB0BDE8F08F2DE9F04786B005460F46A9 +:1085D000144600F11409D6184FF0010A0DF11708DE +:1085E000B44203D1002006B0BDE8F08700943B46BA +:1085F0000022494628460134CDE9018AFFF736FFBB +:108600000028F0D1012241460E98FEF7B9FDE7E7B8 +:1086100003689B6A10B5044613B9C06910F0CCF822 +:108620002368DB6A13B9A06A10F0C6F823681B6BD5 +:1086300023B9E06BBDE8104010F0BEB810BD38B5EE +:108640008B6A04460D460160CBB1C361EB6A13B37C +:10865000A36204F120012846FFF75DFE4FF0FF33CF +:10866000636123681A6BEAB1E26300204FF0FF33C5 +:10867000C4E90300C4E90133A4F8400038BD4869E7 +:1086800010F092F8E0610028E0D12046FFF7C0FF2B +:108690006FF00B00F2E7A86910F086F8A0620028DE +:1086A000D7D1F2E7586AC00810F07EF8E0630028DE +:1086B000DBD1EAE70B6810B504689C4209D040683A +:1086C0004A68904205D0944203D0181A18BF01207E +:1086D00010BD0020FCE70368013304D04068431C50 +:1086E000584258417047012070471FB5069C0092C0 +:1086F0000022CDE901340B4600F11401FFF7B6FE6C +:1087000004B010BD2DE9F04F13688BB0002607466A +:1087100004930C465368B0460DF1100B06AD4FF0B4 +:10872000100A05935BF826902B46002238464946EE +:10873000CDF800A0FFF7D9FF70B110F1340F06D1CA +:1087400046B1B8F1000F14BF00206FF033000BB03A +:10875000BDE8F08F0126E5E7B8F1000F04D0E2692B +:10876000069B9B1A002BEBDB079B23F00043132B8C +:10877000E6D93A68D2699342E2D84FF0FF3303A8B2 +:10878000102229460393FEF7FBFC079B1022009062 +:10879000494623F000433846103BFFF714FF0028FA +:1087A000CBD1039B002BCBD10AAA86F0010304F1A5 +:1087B0001C0CC4F8049002EB83034FF0010853F83B +:1087C000183CC4E9023A95E80F008CE80F00B7E7BF +:1087D0002DE9F043012397B00F460646002190464D +:1087E000CDE9051305994046B847044610BB0699E4 +:1087F0004046B8470446E8B905AA0BA93046FFF73A +:1088000081FF0446B0B90C25139B0E9A23F0004358 +:1088100002F10C01043B994210D9149B05A8059361 +:10882000159B0693FFF757FF0028DBD0F56806F18C +:1088300014094DBB204617B0BDE8F0830C9908AB76 +:1088400030460095FFF751FF0146002842D107A8A6 +:10885000FEF7B8FC0E9B18449DF8203003F070031F +:108860000E90102BD0D10A9B002BCCD00A4600933F +:1088700006F11401099B3046CDE90178FFF760FE4F +:108880000028C0D00446D5E7EB69DA0312D4EB69BF +:108890009B030DD52B6A5BB1009305F12C02494671 +:1088A0003046CDE901786B6AFFF74AFE0028E9D12E +:1088B0002D68BEE76B69002BE9D0009305F12C020F +:1088C00049463046CDE901782B69FFF739FE00288B +:1088D000DDD0D7E70446ADE72DE9F04104460D466B +:1088E0000127304E4FF00008226BD4E90D1391425E +:1088F00024D1002B52D02068E16AD0F820C00A446D +:10890000B2FBFCF10CFB11220021E262426AE06B37 +:10891000934294BF23632263D208C4F834800FF0DB +:10892000B5FF201DFFF7D7FE0028DDD122463146D6 +:108930002046FFF74DFF0028D4D025E0481C013B1E +:10894000D4F83CC060634809A36301F01F035CF8DE +:10895000200007FA03F30342C7D1E36A19442368EE +:108960001A6AB1FBF2F302FB131129600121256B96 +:10897000636BAB4210D05A0903F01F005CF8222051 +:1089800001FA00F0104001D1BDE8F08101336363CA +:10899000A36B013BA363EBE70020F5E76FF01B003F +:1089A000F2E700BFD37100082DE9F04F044687B00D +:1089B0000E4600F1140A05A92046FFF78DFF054673 +:1089C00048B920680599C3689847054600283BD0F8 +:1089D00010F1340FEFD0284607B0BDE8F08F0DF14D +:1089E0001307736A5A4651462046CDF80890CDE9E0 +:1089F0000087FFF73BFD70B9059B524604F120014B +:108A00002046CDF80080CDE90179FFF7BCFC20B10C +:108A100010F1340FCFD00546DDE708F10108B36A45 +:108A20004345DCD82368A16A9A69706B0FF020FF78 +:108A3000236A04F120012068F362636A3363FFF75D +:108A40006AFC059B7362C6E7804606F12C0B4FF06B +:108A50000109E4E7CB695A0344BF23F480234FF0B4 +:108A6000FF322DE9F04148BFCB610546CB6990B09C +:108A700048BFCA620C4613F400302CD00F6A2C2277 +:108A8000002102A80FF002FF236905F114060693E6 +:108A900063690793012396E80700CDE9093710AB16 +:108AA00003E907004FF0FF3398466B61226A636960 +:108AB0009A4213D304F12C08324641462846FFF768 +:108AC00035FC28B310F1340F05D121462846FFF7B5 +:108AD0006BFF0028F0D010B0BDE8F08101230DF14C +:108AE000070202A9284600F052F90028F3DB01230F +:108AF0000DF107022146284600F016F80028EADBAF +:108B00006B6901331CBFCDF83480C5F81480CDE704 +:108B1000636A2361236A6361E36923F4003343F4E6 +:108B20008033C4E90737D6E72DE9F04F9B468DB077 +:108B3000CB69054604920C4603F00302012A00F0BB +:108B400020815E0314D4E66932051AD4276A17EB34 +:108B50000B0F00F1198116F4003618D0D946E369DD +:108B6000B9F1000F25D123F400235A46E36104E054 +:108B7000FFF770FF02460028E5D010460DB0BDE8B3 +:108B8000F08F6269216A8A4288BF2262DEE76369E8 +:108B90009F42E3D923620BAA0123214628468DF880 +:108BA0002C60FFF7C1FF021EE7DB236A9F42F2D869 +:108BB000D4E79B0304F12C0620D52B68A26ADB695D +:108BC0009A4242D12B6805F1140A1B6AAB63D4E9BF +:108BD0000832CDE909230BA92846FFF77DFE02469E +:108BE000F8B928680B99C3689847024618B312F180 +:108BF000340F16D14FF0FF332B62ECE7236A002BC2 +:108C0000E0D004F12802013B31462846029204F1EB +:108C1000240200930192D4E90423FAF75EF9024694 +:108C200020B1E36943F40023E361A6E731462868F5 +:108C3000FFF771FBC6E70A9B286843BB0B9A626289 +:108C4000A362E36943F40033E361A84658F8143B98 +:108C5000DF69A36AFF1A4F4528BF4F46049B42466F +:108C6000314628460193A36A02970093636AFFF78F +:108C70008AFB0246002875D010F1340FD1D121466D +:108C80002846FFF791FE02460028E7D0C9E7013BDE +:108C90000AA905920A93FFF721FB0A9B2968013371 +:108CA000059AC9690A938B424AD10130904609AFAF +:108CB00090FAA0F3B3FA83F30593013306934FEAD6 +:108CC000880352463146284607930423CDE90173B1 +:108CD000079B00930B9BFFF756FB0246002886D1AB +:108CE000059B434530D108F10108069B4345E6D872 +:108CF0000B9B6362069B9B00A2E701230022514667 +:108D00002846CDF80080CDE90173099BFFF7AEFB43 +:108D10000246002885D10123524631462846CDF827 +:108D20000080CDE901730B9BFFF72DFB0246002865 +:108D30007FF45DAF08F101080A9B9845DDD37DE71C +:108D400090460DF12307F7E7042351462846CDE965 +:108D50000173079B0093099BFFF788FB02460028DD +:108D6000C1D05EE7236AA9EB07093B442362A36AEB +:108D70003B44A362049B3B4404932B681B6AAB6394 +:108D8000EDE66FF00802F8E66FF01A02F5E62DE95D +:108D9000F04F1D46CB69904687B003F003020746AB +:108DA0000C46022A54D09A0305D4266A6269964278 +:108DB00008D3002003E0FFF74DFE0028F5D007B0F0 +:108DC000BDE8F08F961B04F12C0104F1280A04F190 +:108DD000240BAE4228BF2E46B146B9F1000F01D197 +:108DE0003046ECE7E3695B0304D53B68A26ADB69C4 +:108DF0009A4210D1236A384605910093CDE901BA11 +:108E0000D4E90423FAF769F80028D8D1E369059971 +:108E100043F48023E3613A683846A36AD5690022A7 +:108E20000093ED1A636A05914D4528BF4D46CDE983 +:108E30000185FFF71BFB0028C1D1236AA844A9EBD9 +:108E4000050905992B442362A36A2B44A362C4E756 +:108E50006FF00800B3E7F7B5044604300E46154638 +:108E6000FFF739FC10B1002003B0F0BD01230090E2 +:108E70006A46294620460193FFF744FC0028F3D1B7 +:108E800005F124073846FFF726FC0028EBD13146D0 +:108E90003846FFF70FFC38B13A4629462046FFF71F +:108EA00031FC0028EED0DFE70120DDE72DE9F341BA +:108EB00006460C46154601F124081027226AE1688F +:108EC00022F0004301F10C00043B984217D80C2318 +:108ED0000A463046616800932B1DFFF706FC0146E9 +:108EE00090B9E66828462E60FEF76CF93044E060E1 +:108EF0002846FEF767F9A3691844A06104E0002A38 +:108F000006DB29606FF00101084602B0BDE8F08180 +:108F1000214642463046FFF7F5FB01460028F3D1D3 +:108F2000A369E7601433A361C8E72DE9F843144649 +:108F30001D460022012306460F4604F1240805F1D0 +:108F40000809C4E909234046FFF7C5FB08B1002022 +:108F50000DE0424621463046FFF7D4FB38B92A4699 +:108F600021463046FFF7A2FF18B1831CEBD0BDE8C5 +:108F7000F8832B7903F07003202BF0D13946484653 +:108F8000FFF798FB0028EAD10120F0E770B505460D +:108F900092B004300E46FFF79EFB68BB01230190A0 +:108FA00001AA07A928460293FFF7ACFB044618B9AB +:108FB00010A8FFF790FB10B1204612B070BD10AAA8 +:108FC00007A92846FFF79EFB38B903AA07A9284638 +:108FD000FFF76CFF18B1831CEAD00446ECE79DF95B +:108FE0001030002BF1DB0822314605A810F0A8FF55 +:108FF0000028EAD10124DFE70024DDE7F0B50127EE +:10900000061DA7B0044680F840703046FFF763FBAA +:109010000546002840F0818001462C2205A80FF06B +:1090200035FC4FF000432822294610A80D930FF07D +:109030002DFC1A9723681B6A9D4202D36FF0330000 +:109040001BE019A8FFF747FB002866D119AA10A951 +:109050002046FFF757FB80B90D9B002B38DB3046CD +:10906000FFF739FB58B1199B0E931A9B0F930023FE +:1090700005A920461A4600F052F827B0F0BD01AB12 +:109080001BAA0EA92046FFF750FF0028F5DBEAD007 +:10909000039A0E99049B8A420F9801D1984217D0E7 +:1090A000824201D1994213D00E92DFE79DF97030D0 +:1090B000002B0DDA1DA92046FFF768FF0028DCDB36 +:1090C0001ED01BAA10A9204600F075F90028D4D1A3 +:1090D0001BAA10A92046FFF7E9FE0028E6D0831C52 +:1090E000CBD10DF1400C05AF0135BCE80F000FC727 +:1090F000BCE80F000FC79CE8070087E8070099E766 +:109100009DF870301BAA10A903F07F038DF8703012 +:109110000346204600F0C3F9D8E70020ADE72DE96B +:10912000F04F2DED028B9BB006460D460793CB69A1 +:1091300007980133059202EB0017CB610B1DD1E9B3 +:10914000011408EE103A1346C5E901419F420FD1C0 +:109150000023CDE90941069330686968C3689847E0 +:10916000044670B114F1340F00F0F4802046FFE0A3 +:10917000D86810332A6A024453F80C0C121A2A6277 +:10918000E4E705F11C080DF12C094FF0FF3306F15F +:10919000200A10271022414648460B93FDF7F0FFA6 +:1091A000224600946B6851463046CDE90187FFF7AF +:1091B000EAF804460028D5D18346B84608EE909ACE +:1091C0002AE0079B9B4580F2A080059A4FEA0B138B +:1091D000D35802EB0B19434540F0978018EE900AE4 +:1091E000D9E90212FDF7CCFFD9F80C300022514624 +:1091F00002933046D9F80830CDE900736B68FFF769 +:10920000C2F804460028ADD1D9F804300BF1010BA7 +:109210009844D9F80C301F442B6A23F00043043BD8 +:10922000BB42CED804230DF12C08002251460293F4 +:1092300030466B68CDE90078FFF7A5F804460028B2 +:1092400090D14FF0FF330246514630467361FFF72D +:109250006DF80446002885D13068036998470446B4 +:1092600000287FF47FAF4FF0FF330FAF02466968ED +:109270000F9330462B6A009723F00043043BFFF71F +:10928000A2F9044600287FF471AF0F9A0B9B9A4213 +:1092900060D1069B4BB306F104094846FFF71BFA61 +:1092A000002875D143463A4609A93046FFF73DFEEE +:1092B00000285DDB6CD06B684246394630460D9322 +:1092C000AB680E93002300F0EAF8002850D149461D +:1092D00009A8FFF7EFF918B96B687360AB68B36062 +:1092E0003046FFF78BFE002842D13469002C3FF452 +:1092F0003DAF18EE101A201DFFF7DCF918B96B68A6 +:109300006360AB68A3602468F0E7012342460A99D2 +:10931000304600930FABFFF7E8F9044600287FF4CE +:1093200025AF01220FA918EE900AFDF729FF0123AE +:109330002246514602930FAB3046CDE900736B686D +:10934000FFF721F8044600287FF40CAF08F101086C +:10935000013761E74FF0FF3300220FA909A83362FC +:109360000123CDE90F23FFF7A5F930B96FF03300E2 +:109370001BB0BDEC028BBDE8F08F18EE101A304622 +:10938000FFF7AAFA0123069300283FF4E5AEEFE7C2 +:109390003A4609A93046FFF75EFD0028E8DBA4D075 +:1093A0006B68394630461893AB68199300231A4608 +:1093B000FFF7B5FE97E72DE9F04780468CB01046E1 +:1093C0000C461646FDF7FEFE0B6A143023F00043F0 +:1093D00083421DD101AA04314046FFF73CFD051E22 +:1093E00012DB099A002A13DA236A01A9404663F0C6 +:1093F000004313400993636A0A93A36A0B93002303 +:109400001A46FFF78CFE054628460CB0BDE8F087EB +:10941000336830460193FDF7D5FE0023029001AA80 +:1094200021464046CDE903330123FFF778FE054688 +:109430000028E9D1D8F80C70211D4FF0FF3ACFB9C0 +:10944000D8F81070211D002FDED0381DFFF732F93B +:1094500070B9FC6833689C420AD93046FDF7B2FE09 +:10946000201AF8603046FDF7ADFEBB69181AB861E6 +:109470003F68E8E7381DFFF71DF930B9D7F80C90C1 +:109480003368994503D1C7E901AA3F68D7E7FCD9FA +:109490003046FDF797FEA9EB0000F860F5E770B5E0 +:1094A000154688B00C26D27955F8044B002B07924C +:1094B0000094344403960494CDE9052314BF022399 +:1094C00001236A46CDE90165FFF729FE08B070BDAA +:1094D00070B592B006460D46FFF7BCFA044670BB65 +:1094E000EB6903F41023B3F5803F28D12A1D104601 +:1094F000FFF7F1F818BB07A93046FFF703F9044658 +:10950000E8B90C23EA680690009304AB089903922B +:10951000CDE904003046FFF7E8F8044678B92B6936 +:1095200003AA07A905936B69069303463046FFF724 +:10953000B6FF044618B9EB6923F48033EB6120468B +:1095400012B070BD2DE9F04F2DED028B85B01F6874 +:10955000054608EE101A029340F622031446DFF87F +:1095600040915360436893608368D36049463846AE +:1095700010F0E3FD07EB000883464946404610F033 +:10958000B8FD0128064608EB000A05D117F80B3094 +:109590002E2B0AD15746E9E7022806D102463F4959 +:1095A000404610F0CDFC0028F4D057464FF0010B98 +:1095B0004946504610F0C1FD82444946504610F0DD +:1095C00098FD024690B102280CD1039050463349D1 +:1095D00010F0B6FC039A28B9BBF1010B04D10AF1D3 +:1095E0000207C3E70BF1010B9244E1E798F8000092 +:1095F000002846D0029BC3F800802379222B4AD151 +:1096000004F1080A18EE101A28465246FFF77AF8B5 +:10961000002836D105F1140B224618EE101A284600 +:10962000FFF744FC68BB237903F07F03112B01D0C3 +:10963000222BF1D1E379B342EED123685946627906 +:10964000284604331344A279134418EE102ACDE9B6 +:1096500000865268F9F719FC002812DBDCD095F877 +:109660004130002B82D194F90430002BBFF67EAF3D +:1096700051462846FFF78AFC002807D001DB6FF02F +:10968000010005B0BDEC028BBDE8F08F237903F03B +:109690007F0323716AE76FF01300F2E7F4A6010875 +:1096A000F7A6010873B50C4604310646FFF714F916 +:1096B0000546F0B904F108013046FFF70DF90546FB +:1096C000B8B90423024661683046009304F11C03D4 +:1096D000FFF70BF810B110F1340F0DD1E36914222C +:1096E0000133E3614FF0FF33C4E90823A362102381 +:1096F000E360284602B070BD0546FAE72DE9F04365 +:10970000074695B00E469046994601F1240440461E +:10971000316AFDF757FD3B680844DB69984218D869 +:1097200004394346002243F8041B0991CDE90A237A +:109730000C23CDE90C3198F807303146CDE90E29DC +:10974000109309AA02233846FFF7E9FC15B0BDE8DB +:10975000F083002937DB354609AC0FCD0FC40FCDA0 +:109760000FC495E8070084E8070031463846FFF744 +:1097700099FF0028EAD1129B424631467362139B3F +:10978000B362336A043B42F8043B03920C22CDE9F6 +:109790000130CDE9042398F8073001AACDE9060984 +:1097A000089338460223FFF7BAFC0028CED1119B5C +:1097B000024609A943F00043119373681293B368FA +:1097C00013930346BFE7224631463846FEF79AFF19 +:1097D00000289CD0BAE783690239023B8B4283BFE1 +:1097E0004389C06A01FB030000207047F7B50546B6 +:1097F0000191FDF7ECFD0446E8B901992846FFF711 +:10980000EAFFAA89286306462146686B0FF03EF8F6 +:109810006F6B6B89A34208D90123321939466878E6 +:10982000FDF73AFD08B90134F3E76889001B18BF5A +:10983000012003B0F0BD0120FBE738B5036B0546FE +:109840000C468B420FD0FDF7C2FD58B922460123CA +:10985000696B6878FDF74AFD00281CBF4FF0FF34A4 +:1098600001202C6338BD0020FCE70129F8B504462F +:109870000E4664D98369994261D20378022B30D0B5 +:10988000032B45D0012B5AD101EB51058389416A45 +:10989000B5FBF3F31944FFF7D0FF10B14FF0FF30E1 +:1098A000F8BDA1896F1C2046B5FBF1F301FB1355F0 +:1098B000636BB7FBF1F15D5D636A1944FFF7BDFFB0 +:1098C0000028EBD1A289B7FBF2F302FB1373626BA2 +:1098D000D05CF30745EA00204CBF0009C0F30B0041 +:1098E000DEE783895B08B1FBF3F3416A1944FFF7B4 +:1098F000A4FF0028D2D1A2897600B6FBF2F302FBC6 +:109900001366636B9A19985D527840EA0220C7E7A4 +:1099100083899B08B1FBF3F3416A1944FFF78DFF7C +:109920000028BBD1A189B600B6FBF1F001FB10669F +:10993000606B3044FDF775FD20F07040B0E701200A +:10994000AEE72DE9F04F1E46036885B00C469B6FCD +:1099500082469146984703A92046FDF707FD054634 +:109960000746002840F0A380657C0DBB237C13F0E4 +:109970000103009300F09D80E3682F4662699B1A03 +:109980009E4228BF1E469EB1039862698389B2FB3E +:10999000F3F103FB1123002B69D14389013B0B40F9 +:1099A00001931ED18AB9A068012813D802256574D5 +:1099B000DAF800305046DB6F9847002D7CD02846FF +:1099C00005B0BDE8F04FFDF7AFBCA1692068FFF717 +:1099D0004CFFE9E7431C03D10123009D6374E7E7D3 +:1099E000A061DDF80CB0A1695846FFF7F4FE00282D +:1099F000DCD0019B03EB0008BBF80C309E4234D353 +:109A00000199BBF80A209BF80100B6FBF3F3194457 +:109A10009142494684BF019BD31A42460193FDF708 +:109A200065FC019B0028D7D1DDF80CB09BF8032022 +:109A30007AB1DBF83000A0EB0800834209D9BBF80B +:109A40000C20DBF8341000FB029001930EF010FFA5 +:109A5000019BBBF80C8003FB08F86369A6EB0806C2 +:109A60004744C144434463618DE7C4F81C800398B4 +:109A700062698389E169B2FBF3F803FB1828A3EB61 +:109A80000803B34228BF33469846FFF7D6FE0028A6 +:109A9000A2D1039A60699189B0FBF1F301FB130332 +:109AA000516B4846424619440EF0E2FED5E70027C6 +:109AB0007EE72F4607257BE7384605B0BDE8F08FE7 +:109AC00038B500230446C3704FF0FF330363FFF73C +:109AD000B4FE002851D1646B237894F8FF5194F8B8 +:109AE000FE01EB2B40EA052503D01833DBB2012B36 +:109AF0003CD84AF655239D4207D10822214904F15A +:109B0000520010F01DFA002836D0227BE37A43EA97 +:109B10000223A3F50072B2F5606F27D8607B28B3EB +:109B2000591E421E0B40024013431FD1E27BA37B10 +:109B300053EA02231AD0237C013B012B16D8A27CC6 +:109B4000637C53EA022311D0227DE37C43EA0223A3 +:109B50007F2B06D804F12000FDF763FCB0F5803FB1 +:109B600004D3E27DA37D53EA022308D14AF65520AF +:109B700085420CBF0220032038BD0420FCE70020F2 +:109B8000FAE700BFDFAC01082DE9F04F002687B0EF +:109B90000D4617460E60FDF7FDFB0028C0F251810F +:109BA000B04B53F82040002C00F04D812C602378FE +:109BB000BBB96070C0B2AC4D55F8200003689B681B +:109BC000984710F00106C3B240F03F8117F0FE0F36 +:109BD00002D05B0700F13B81607855F8203023B953 +:109BE0000126304607B0BDE8F08FFDF745FBA0F534 +:109BF0000072A081B2F5606FF2D8421E0242EFD12E +:109C0000636B002B00F0F28000212046FFF758FF25 +:109C1000022840F0FD80656B02AF05F5E371B846A0 +:109C200005F206250846FDF7FCFB103148F8040B49 +:109C30008D42F7D1002557F8041B002900F0DE8083 +:109C40002046FFF73DFF012800F2D980656BB4F88C +:109C50000C902A7BEB7A43EA0223994540F0D680A8 +:109C6000E87DA97D51EA002104D105F12400FDF72A +:109C7000D8FB0146E16195F810A0D4F830B00AF1A4 +:109C8000FF3384F802A0012B00F2C0806B7B63815C +:109C9000002B00F0BB805A1E1A4240F0B780AA7C0D +:109CA00095F8118048EA02280FFA88F2A4F8088093 +:109CB00000924FEA5912B8FBF2F702FB178292B2F8 +:109CC000002A40F0A3802A7DE87C50EA022005D1DA +:109CD00005F120000193FDF7A4FB019B95F80FC04F +:109CE000AA7B52EA0C2200F0918001FB0AFC174487 +:109CF00007EB0C0E7045C0F08980A0EB0E00984277 +:109D0000B0FBF3F7C0F08280584B9F427ED84FF6ED +:109D1000F5739F4240F29D804FF0030A02375A4488 +:109D20000BEB0E03BAF1030FA761C4F820B0626217 +:109D3000E36274D195F82B2095F82A3043EA022388 +:109D4000009A1A4313B2002B60D1BF0005F12C001A +:109D5000FDF767FBA06209F1FF331F44B7FBF9F978 +:109D6000894553D84FF0FF33BAF1030FC4E90433E8 +:109D70004FF08003237130D195F8312095F83030C1 +:109D800043EA0223012B28D10BF101012046FFF702 +:109D900054FD10BB616B207191F8FF2191F8FE31E9 +:109DA00043EA02234AF65522934216D10846FDF7AC +:109DB00038FB2F4B984210D101F5F270FDF731FBC3 +:109DC0002C4B984209D101F5F470FDF72AFB606134 +:109DD00001F5F670FDF725FB2061274A84F800A005 +:109DE000138801339BB21380E380FAE60EF0DCFCAB +:109DF000606300287FF408AF1126F2E603200135E6 +:109E0000042D7FF418AF04283FF4EAAE0D26E8E6EF +:109E100004283FF4E5AE01287FF618AFF6E7B8F165 +:109E2000000FF3D0BAF1020F4FEA470362441ABFA2 +:109E3000DB1907F001071F46A26218BF07EB5307A3 +:109E400089E70B26CDE60C26CBE60326C9E60A26D3 +:109E5000C7E640F6F57A57458CBF4FF0020A4FF03F +:109E6000010A5BE740140224F4140224F5FFFF0FFB +:109E700052526141727241613C1402242DE9F74F44 +:109E8000154680462822002128460EF0FFFCD8F80F +:109E9000003040469B6F984708F14C03002201A90F +:109EA00068460093FFF770FE0646044600286ED110 +:109EB000DDF80490D9E9057AAAF102039F421CD982 +:109EC00099F80060012E35D14FF0020A074651463D +:109ED0004846FFF7CAFC431C59D0012856D000B9A8 +:109EE0000137019B0AF1010A9B699A45EFD3019B57 +:109EF0001A795F6142F001021A71B9F80C3000243E +:109F0000D9F818204046C5E90033023AB9F80A30BA +:109F10005A435F430C236B62D8F80030C5E9022432 +:109F2000DB6FC5E90474C5E906749847204603B0A1 +:109F3000BDE8F08FD9F8241007463CB9019801F12B +:109F4000010BFFF77AFC064608BB5946019E3278A2 +:109F5000736B022A03EB04000FD11B5D02344278BD +:109F600053EA022308BF0137B389BAF1010AB4FBEF +:109F7000F3F203FB1244E0D1B9E7FDF752FA30F0F7 +:109F8000704304F1040408BF0137EDE70226D8F856 +:109F900000304046DB6F9847304603B0BDE8F04FD5 +:109FA000FDF7C2B97FB5CDE9001003A814460391AF +:109FB000FDF7F0F9051E19DB0D4E56F8252022B1EC +:109FC0000023506B13700EF0F7FB019B13B10022BE +:109FD0001A705A6346F825302CB1002201A9684650 +:109FE000FFF7D2FD0446204604B070BD0B24FAE70B +:109FF00040140224F8B5036804469B6F9847236D0C +:10A00000013307D123686FF015052046DB6F9847B1 +:10A010002846F8BD002204F14C01104F1046FFF70E +:10A02000C1FF236D064657F823000368DB68984795 +:10A030002368054618B1DB6F20469847E8E7226D94 +:10A04000DB6F47F822004FF0FF3220462265984729 +:10A050003046BDE8F840FDF767B900BFF4140224AC +:10A06000084B10B503608C3304464360FFF7C2FF12 +:10A07000054B204623602C3340F8043F07F076FF61 +:10A08000204610BD68A9010804AA0108A0F1040037 +:10A09000FFF7E6BF10B50446FFF7E2FF20460EF0DB +:10A0A0008BFB204610BDA0F10400FFF7F3BF0000BA +:10A0B000036873B504469B6F01920D469847236D64 +:10A0C000019A013307D023682046DB6F98476FF071 +:10A0D000150002B070BD16480023064650F8041B58 +:10A0E000D9B946F8235004F114002365303384F8BD +:10A0F0004E1004F14C0184F84C303A2384F84D3072 +:10A10000FFF750FF236805462046DB6F9847284637 +:10A1100002B0BDE87040FDF707B90133042BDDD173 +:10A1200023682046DB6F98476FF00B00D1E700BF34 +:10A13000F414022401292DE9F84304460E4617467B +:10A1400040F2838083698B427FD90378022B45D00C +:10A15000032B5AD0012B78D101EB51098389416A35 +:10A16000B9FBF3F31944FFF768FB054660BBA3890D +:10A1700016F00106606B09F10108B9FBF3F203FB6D +:10A1800012920FBFFBB2835C03F00F013B011CBFB7 +:10A1900003F0F0030B4383540123616A2046E3700C +:10A1A000A389B8FBF3F31944FFF747FB054658B9F9 +:10A1B000A389616BB8FBF3F003FB10803EB1C7F3DA +:10A1C00007170F540123E3702846BDE8F8830B5CA2 +:10A1D000C7F3032723F00F031F43F2E783895B08CC +:10A1E000B1FBF3F3416A1944FFF727FB054600284A +:10A1F000EAD1A2897600B6FBF2F302FB1366636B29 +:10A200009F5598193F124770DCE783899B08B1FB83 +:10A21000F3F3416A1944FFF710FB05460028D3D138 +:10A22000A389B60027F07047B6FBF3F103FB116179 +:10A23000666B0E443046FDF7F4F800F0704047EAD4 +:10A2400000013046FDF7E5F8BCE70225BCE72DE943 +:10A25000F041804605680F4649B92E69C6B1AB6921 +:10A26000B34298BF01266B69A3B9002406E02846D3 +:10A27000FFF7FBFA0128044603D801242046BDE875 +:10A28000F081421C51D0AB698342F7D83E46EAE7E1 +:10A290000126E8E7BE4215D1AB69741CD8F800006E +:10A2A000A34298BF02242146FFF7DFFA0128E4D039 +:10A2B000431C3AD0D8B12B69012B03D9AA69934228 +:10A2C00038BF1E4634460134AB69A34202D8012E82 +:10A2D000CBD902242146D8F80000FFF7C6FA40B1D6 +:10A2E0000128CAD0013020D0B442ECD1BDE7002C07 +:10A2F000E8D04FF0FF3221462846FFF71BFF90B908 +:10A3000057B92C61D5E90532023A934210D92B791D +:10A3100043F001032B71B1E7224639462846FFF787 +:10A3200009FF0028EDD00128A7D14FF0FF34A5E7A1 +:10A33000013B6B61EBE72DE9F3410D4601A90446B2 +:10A34000FDF714F80646002863D1667C002E60D124 +:10A35000E368AB4204D2227C12F0020F08BF1D4614 +:10A36000002263696261B5B90020E26863699342C3 +:10A3700081BF227CE36042F040022274019A9189FD +:10A38000B3FBF1F201FB1233002B42D0E3698342AD +:10A3900018BFE0613DE0019A518997894F4373B33B +:10A3A000013B6A1EB3FBF7F1B2FBF7F28A4226D3F8 +:10A3B0007A42A1691340ED1A63610029D4D0BD42ED +:10A3C00063690CD93B44A5EB07086361237C9A07BA +:10A3D0002AD52046FFF73BFF054648BB0146636987 +:10A3E00001982B4463618389B5FBF3F203FB12559B +:10A3F000002DB9D0FFF7EFF948B11044B5E7A168D7 +:10A4000081B92046FFF723FF0128014605D1022626 +:10A410006674304602B0BDE8F081481C01D10126C7 +:10A42000F6E7A160A161C8E72068FFF71EFA0546BC +:10A430006B1CF4D0012DEAD9019B9B69AB42E6D994 +:10A440002946A5614546BAE7F8B51F4603680646A2 +:10A450000D469B6F14469847022F11D1EB681C44A0 +:10A4600021462846FFF767FF336804463046DB6F16 +:10A470006D69984744B12046BDE8F840FCF754BFE9 +:10A48000012FEDD16B69EAE72846F8BD2DE9F041CF +:10A4900007690446884606682037B7F5001F24BFC1 +:10A4A00000238361836983B1B289B7FBF2F002FBB9 +:10A4B0001072002A38D101336169A36139B9338937 +:10A4C000B3EB571F30D80023A36104200AE073893F +:10A4D000013B034228D13046FFF7C7F90128054662 +:10A4E00002D80220BDE8F081421C01D10120F9E729 +:10A4F000B369834212D8B8F1000FE4D061692046F5 +:10A50000FFF7A5FE0546D0B10128EAD0431CEDD0E7 +:10A5100001463046FFF76AF90028E7D12946304660 +:10A520006561FFF758F9A061B28900202761B7FB88 +:10A53000F2F302FB1373776B1F44E761D2E7072046 +:10A54000D0E737B50D4601A90446FCF70FFF18B94F +:10A5500020461DB9F8F73AFC03B030BDF8F76AFCA5 +:10A5600010F0FB03F8D16B72A3691BB1294620469A +:10A57000FCF75FFF00212046FFF788FF042808BF93 +:10A580000020E9E7036870B50D4604469B6F9847C5 +:10A5900028460021FFF7D5FF23682046DB6FBDE882 +:10A5A000704018470368F0B516460F6987B09B6F77 +:10A5B00005460C469847B74209DD00212046FFF7C3 +:10A5C000C0FF2B682846DB6F984707B0F0BDB74245 +:10A5D000F7DA69462046FFF7B4FF27690028F0D173 +:10A5E0009DF80930002BF2D1EBE7036870B50E46F9 +:10A5F00086B004469B6F1546984730466946FFF77C +:10A60000A0FF236806462046DB6F98472EB13046F0 +:10A6100006B0BDE87040FCF787BE9DF8090078B130 +:10A620009DF808300C220DF10901284613F0100F97 +:10A6300014BF0323052385F800310FF06BFD0120C3 +:10A6400006B070BD2DE9F74F0446D0F800900D46D6 +:10A6500011F8013B2F2BFAD05C2BF8D00023A3601C +:10A660002B781F2B25D904F120074FF0203BC5F193 +:10A67000020305F1FF3A00264FF008080093514A03 +:10A68000514BC7F804B0C7F800B0C7F807B000993D +:10A6900001EB0A001AF8011F20292ED92F2901D019 +:10A6A0005C290FD12B5C2F2B01D05C2B25D10130E5 +:10A6B000F8E78023204684F82B3003B0BDE8F04F44 +:10A6C000F8F784BB2E2976D0B04572D90806184613 +:10A6D00044BF01F07F01515C01910FF0FDFC0028A7 +:10A6E00067D10199384BA1F16100364A19289CBF06 +:10A6F0002039C9B2B9550136C9E70544002E58D0F2 +:10A7000094F82030E52B04BF052384F8203020295D +:10A7100028D92B78212B34BF04230023204684F82A +:10A720002B30D4F80080F8F751FB0646E8B9A16950 +:10A730004046FFF782F80646B8B9E06903789BB156 +:10A74000C37A03F03F03A371C67A16F0080604D15A +:10A750000B2239460FF0F4FB38B100212046FFF7F9 +:10A7600095FEE2E70423D9E7042694F82B304EB196 +:10A77000042E03D113F0040F08BF0526304603B0A2 +:10A78000BDE8F08F5A07F9D4A379DB060FD5B9F8E5 +:10A790000C10226999F80000B2FBF1F301FB1323BE +:10A7A000D9F834101944FCF7D2FDA0605FE7052604 +:10A7B000E4E70626E2E7B8F10B0FFAD008264FF0DF +:10A7C0000B0864E713AD0108E8AC010870B5054655 +:10A7D0000668F8F7FBFA044648BBA9693046FFF75C +:10A7E0002CF8044618BBEB691B78E52B18D1A96936 +:10A7F0003046FFF722F8044680B920220146E86976 +:10A800000EF044F8EB6955F8202F1A606A685A6018 +:10A810002A891A81AA7A9A720123F370204670BDA0 +:10A82000002BE4D001212846FFF730FED3E7042CAB +:10A8300008BF0724F2E700002DE9F74F0C468046D9 +:10A8400011460568012C5AD9AB69A34257D962B9A0 +:10A850002746DFF8B4902146D8F800002646FFF7D7 +:10A8600004F8044658B9002006E04FF0FF322846AD +:10A87000FFF760FC0028EBD003B0BDE8F08F0128A3 +:10A880003DD0431C3DD0002231462846FFF752FC04 +:10A890000028F1D1D5E90532023A934205D20133BD +:10A8A0006B612B7943F001032B71731CA34222D0FF +:10A8B00095F801B059F82B30E3B139462846FEF738 +:10A8C0008AFF314682462846FEF785FF6F89064695 +:10A8D0005846FCF7D1FC02463E4459F82B00A6EB43 +:10A8E0000A060368A6FB0267CDE90067196AA2FBA6 +:10A8F0000A2388472746AB69A342ACD8B3E70220B6 +:10A90000BAE70120B8E700BFF41402242DE9FF41A3 +:10A9100003680C46019206469B6F984701992046B2 +:10A920006769FFF708FD054648B133683046DB6FBD +:10A930009847284604B0BDE8F041FCF7F5BC03A9F0 +:10A940002046FCF713FD05460028EED1657C002D5E +:10A95000EBD1237C9A0701D40725E6E7D4F81480CD +:10A96000E368984508D320463946FFF7E4FC0446DF +:10A9700070BB04B0BDE8F081B8F1000F11D12A46D8 +:10A98000A1682046FFF758FF0546C4F808806369B0 +:10A99000E360237C43F040032374002DE3D065740F +:10A9A000C3E7A1692068FEF760FF431C01460BD096 +:10A9B00001280BD0039B9B699842E8D2A2692046EC +:10A9C000FFF73AFF0546E2E70125E0E70225DEE76B +:10A9D00033683046DB6F98472046ABE770477047D7 +:10A9E000034B10B504460360FDF728FA204610BD5E +:10A9F00008A9010810B50446FFF7F2FF20460DF044 +:10AA0000DBFE204610BD000008B5036A013B03626F +:10AA100000680AF05BFA014630B1044B1B78DBB2E8 +:10AA200013B90348F7F7F8FF08BD00BF440B022431 +:10AA30001701028008B5034807F0A0F9BDE80840F7 +:10AA4000FFF7E2BFCC14022410B504460068FCF7FF +:10AA500081FB014618B9236A0133236210BD044B00 +:10AA60001B78DBB2002BF9D10248F7F7D5FF00BF06 +:10AA7000440B02241501028008B5034807F07EF953 +:10AA8000BDE80840FFF7E0BFCC14022413B5154C15 +:10AA9000204607F073F9FFF7D7FF204607F06EF95D +:10AAA000FFF7B2FF4FF0FF324FF0FF336846CDE9BA +:10AAB00000230DF007FDD0E90232DB0243EA024336 +:10AAC000426843EA4213026802EBD27243EA62032D +:10AAD00042690069503A013043EA426343EA405018 +:10AAE00002B010BD50140224F7B501A90546FCF7C9 +:10AAF0003DFC044660BB2C7C14F0400428D0FFF7DA +:10AB0000C5FF296A07460198FEF797FE0446F8B983 +:10AB10006E6AF37A314643F02003F372AA6828681C +:10AB2000FCF70AFCE96806F11C00FCF772FC3946E8 +:10AB300006F11600FCF76DFC01230198B474F4745F +:10AB4000C370FDF761F82B7C044623F040032B749F +:10AB5000204603B0F0BD38B503680D4604469B6F30 +:10AB600098472846FFF7C0FF236805462046DB6F5D +:10AB700098472846BDE83840FCF7D6BB2DE9F04F92 +:10AB80001E46036885B00D469B6F824691469847E6 +:10AB900003A92846FCF7EAFB04460746002840F0D4 +:10ABA000D6806C7C5CBB2B7C9A0740F1D2806B69B1 +:10ABB0000027DE42009728BFDE43002E00F0BB8056 +:10ABC00003986A698389B2FBF3F103FB1123002B1D +:10ABD00040F08D80B0F80A8008F1FF3818EA0108CB +:10ABE00025D1D2B9A86830B901462846FFF72FFB16 +:10ABF000002800F0A080012811D102246C74DAF83A +:10AC000000305046DB6F9847002C00F0A5802046AE +:10AC100005B0BDE8F04FFCF787BBA969E5E7431C29 +:10AC200001D10124EAE7AB68A86103B9A8600398E1 +:10AC3000EB69026B9A4247D0DDF80CB0A96958461F +:10AC4000FEF7C9FD0028D8D0BBF80C3008EB000295 +:10AC50009E423ED3BBF80A10B6FBF3F308EB0300A9 +:10AC600088429BF8010088BFA1EB08034946CDE963 +:10AC70000023FCF711FB8046DDE900230028D0D13A +:10AC80000398016B891A8B420AD98289406B02FBB7 +:10AC9000019100930DF0ECFD039A009B82F8038074 +:10ACA000039AB2F80C8003FB08F8012300936B6948 +:10ACB000A6EB0806EA6847444344C1446B619A42E4 +:10ACC0002CBFEA60EB6078E7FCF781FB0028B3D08B +:10ACD000A7E76969EB68994208D358460192FCF7E7 +:10ACE00076FB019A00289CD1039B1A63EA610398C2 +:10ACF0006B69B0F80C80E969B3FBF8F208FB12321B +:10AD0000A8EB0208B04528BFB046FEF796FD002824 +:10AD100087D1039A69699089B1FBF0F300FB1313A3 +:10AD2000506B4946424618440DF0A2FD039B4FF07C +:10AD30000102DA70BBE72B7C43F040032B74009BCD +:10AD4000002B3FF45CAF2846FFF7CEFE57E7002705 +:10AD500055E72746072452E7384605B0BDE8F08F8F +:10AD6000036873B50D469B6F064698472846FFF764 +:10AD7000BBFE044630B901A92846FCF7F7FA0446A1 +:10AD800000B9286033683046DB6F984715B1284614 +:10AD90000DF012FD204602B0BDE87040FCF7C4BAC9 +:10ADA000F0B50E4685B090F8201005461446DDE952 +:10ADB0000A7C19B96FF47A6005B0F0BD0168CDE97D +:10ADC000007CC96B88470028F4D029690D486118B8 +:10ADD000039106F0D3FFFFF737FE02F0A7FB02F066 +:10ADE00081FB3A46039930460DF042FD02F068FBC4 +:10ADF00002F08AFB034806F0C1FFFFF705FE0020C2 +:10AE0000DAE700BFA414022410B5044604300AF0A7 +:10AE100014F904F15400FFF717FE0023206C63615E +:10AE2000012384F83D30BDE8104009F089BF0000DF +:10AE30001FB5002304460362074B0093031D6846B9 +:10AE400002931C2303930B2301930AF053F8206011 +:10AE5000204604B010BD00BF02A701080CB41FB506 +:10AE600006AB002453F8042B00940393FDF704F978 +:10AE700004B0BDE8104002B0704700000FB41FB529 +:10AE8000084906AB0020096853F8042B896803932E +:10AE900000916FF00041FDF7EFF805B05DF804EBAD +:10AEA00004B070473C030024F0B50C468BB0064656 +:10AEB00024B93260046130460BB0F0BD10460192F7 +:10AEC0000EF0D8FA043002F071FA3A233034054615 +:10AED00043702F230470033000F8013C374601997A +:10AEE00006AC0EF0BFFA084B002247F8045B05934E +:10AEF000064B029302ABCDE903220FCB84E80F008F +:10AF000087E80F00D7E700BF09720008E97B000857 +:10AF1000F0B506468BB02C200F46019202F046FA9F +:10AF2000019A0546316D05A8FFF7BEFF336830462C +:10AF30009B6F9847059B0393002D3DD0002204A9E9 +:10AF400003A8FEF721FE044680B9049B2846039916 +:10AF50002B60FFF777FB0446002831D195F92B30A1 +:10AF6000002B0CDBAB79DB0603D4052400232B601C +:10AF700010E0049BE9691878FCF7E9F9A860049BE4 +:10AF80002846DB88AB80F7F721FF04280446ECD085 +:10AF90000028EBD133683046DB6F984774B1284600 +:10AFA0000DF00AFC2046FCF7BFF9044605A8FCF7A3 +:10AFB0002EF920460BB0F0BD0924EBE73D60F5E724 +:10AFC0000428D2D0D2E72DE9F047054694B01C46BC +:10AFD00028200E46019202F0E9F9019A296D0746F0 +:10AFE00004A8FFF761FFA10756BF04F001084FF066 +:10AFF000030808F10108A20505D563054CBF48F018 +:10B00000080848F010082B68200728469B6F48BFA7 +:10B0100048F030089847049B029397B909242B689D +:10B020002846DB6F984738460DF0C6FB2046FCF7F4 +:10B030007BF9044604A8FCF7EAF8204614B0BDE802 +:10B04000F087424603A902A8FEF79EFD04460028A9 +:10B0500055D1039B09A802990993FFF7F3FA044617 +:10B0600020B99DF94F30002BB8BF062418F01C0FF3 +:10B0700000F09880002C45D0042C40D109A8FFF79F +:10B08000A5FB044600283AD148F00808FFF7FEFC6B +:10B090000146019010980E30FCF7BBF91098019909 +:10B0A0001630FCF7B6F9039C10992078FCF74FF99D +:10B0B000202300228146CB7220461099FCF73CF9F0 +:10B0C000109B002201211A775A779A77DA77039B2F +:10B0D000D970B9F1000F70D0494609A8D3F830A053 +:10B0E000FFF7AAFB044650B951460398FEF7A5FBAB +:10B0F00009F1FF33039A0446136100285DD0002351 +:10B100003B608CE79DF82A3013F0110F61D118F0E5 +:10B11000080FBBD1039CDDF84090236B4946C7F86C +:10B1200024903B622078FCF712F90146B86009F1DF +:10B130001C00FCF776F9E38818F0200F8146BB80ED +:10B140004FF00003F8603C6087F810807B74FB616F +:10B150007B6120D0F8B16389A48978615C434C4558 +:10B1600031D23868A9EB0409FEF77FFB01280146BC +:10B170002BD9431CF3D10124B961002CBFD1039812 +:10B180008389B9FBF3F203FB129323B1FEF723FB90 +:10B1900008B31044F8612B6828460024DB6F9847F9 +:10B1A000376047E7002CAAD19DF82A30D9060ED483 +:10B1B00018F0020F01D0DA070BD418F0080F18BFEF +:10B1C00048F04008A6E70024D6E70224D4E7042488 +:10B1D00095E7072493E7022491E770B598B00546F8 +:10B1E00016460A46016D02A8FFF75EFE2B68284648 +:10B1F0009B6F98471822002107A80DF047FB029B80 +:10B2000000220DA901A80193FEF7BEFC044650B927 +:10B2100001990DA8FFF716FA044620B99DF95F3091 +:10B22000002B0EDA06242B682846DB6F9847204651 +:10B23000FCF77AF8044602A8FBF7E9FF204618B0AD +:10B2400070BD139B8DF825001BB107A90DA8FCF755 +:10B25000F0F89DF8242040F2FF11079B284612F0D9 +:10B26000100F4FF00004336114BF4FF480434FF4CC +:10B27000004312F0010F40F26D1208BF0A4613435B +:10B2800073602B68DB6F9847D5E7F0B597B005463C +:10B290000A46016D06A8FFF707FE2B6828469B6F3C +:10B2A0009847069B022201A968460093FEF76CFCB2 +:10B2B0000446064600286AD1019B0BA800990B930F +:10B2C000FFF7C0F90446002879D004285FD1019B1C +:10B2D000314602A80293FEF7BAFF0446002864D064 +:10B2E000012864D0431C5F425F41FFF7CFFB064655 +:10B2F000002F5ED121460198FEF778FA002858D138 +:10B30000019B4FF0203210215B6B1A605A60C3F82A +:10B3100007202E22019B5B6B1A70019B5A6BD17226 +:10B320003146586B1630FCF774F801982246416B91 +:10B33000FCF702F80198436B03F12002114653F821 +:10B34000047B934241F8047BF9D1436B2E22012701 +:10B3500083F82120416B0D9A2031FBF7EDFF019B13 +:10B360000BA8DF70FFF732FA18BB1298314616307F +:10B37000FCF74FF8224601981299FBF7DDFF129B6C +:10B3800010220198DA72C770FCF73EFC04462B6865 +:10B390002846DB6F98472046FBF7C6FF044606A801 +:10B3A000FBF735FF204617B0F0BD07279DE70227C2 +:10B3B0009BE70022214602A8FFF73EFAE6E70824B1 +:10B3C000E5E770B5ACB0054614460A46016D09A81C +:10B3D000FFF76AFD2246296D04A8FFF765FD2B687B +:10B3E00028469B6F9847099B02A80193049B0293F0 +:10B3F000FBF7D0FF0028C0F2A680022203A901A813 +:10B40000FEF7C2FB0446002840F08C80039B16A880 +:10B4100001991693FFF716F90446002840F0828040 +:10B420009DF8833013F0A00F40F08F801D9B0EAC71 +:10B4300003F120061868083353F8041C2246B3426F +:10B4400003C21446F6D116AC21AE0FCC0FC60FCCFA +:10B450000FC694E8070086E80700029921A8FFF7C5 +:10B46000F1F8044648B9239A189B9A4203D1259AC9 +:10B470001A9B9A4203D0082454E0042852D121A8F0 +:10B48000FFF7A4F9044600284CD128990DF1450393 +:10B490000DF1550001F10D0253F8044B834242F8BF +:10B4A000044BF9D11888012610809B7893709DF881 +:10B4B0004330039CDA0658BF43F02003CB72E6709A +:10B4C000CB7ADB061ED5189A239B9A421AD0207895 +:10B4D000FBF73DFF01462046FEF77DF901460028B7 +:10B4E00035D02046FEF7A9F90446D8B90398416B38 +:10B4F00091F821302E2B05D1239A2031FBF71CFF28 +:10B50000039BDE70169E1C993046FEF796F90446A2 +:10B5100040B91D9BE5221A700123F3700398FCF7D4 +:10B5200073FB04462B682846DB6F98472046FBF7E1 +:10B53000FBFE044604A8FBF76AFE09A8FBF767FEBA +:10B5400020462CB070BD0B24ECE70624EAE7022469 +:10B55000E8E7F0B59FB005460A46016D03A8FFF77E +:10B56000A3FC2B6828469B6F9847039B022202A9E5 +:10B5700001A80193FEF708FB044680B9029B08A8C6 +:10B5800001990893FFF75EF8044640B99DF94B30E6 +:10B59000002B49DB9DF82670FA0710D507242B688D +:10B5A0002846DB6F9847072C40D02046FBF7BCFEAF +:10B5B000044603A8FBF72BFE20461FB0F0BD029CFB +:10B5C0000F992078FBF7C3FEFB06064612D4089FAE +:10B5D0000E993846FEF731F904460028DFD10F9B5B +:10B5E000E5221A700123FB70AEB90298FCF70CFB40 +:10B5F0000446D4E7159013A81394F7F7E7FB044625 +:10B600000028CCD113A8F7F715FC04460028C5D0B4 +:10B610000428C4D1DBE70246314608A8FFF70CF93D +:10B6200004460028BBD1E0E70624B8E76FF05904D0 +:10B63000BFE700002DE9F34D00F11C03074653E876 +:10B64000002F013243E80026002EF8D1012A40F0F5 +:10B650008680786803689B689847064668BB786868 +:10B6600003685B6A9847422838BF4220044601F0CD +:10B670009DFE80467868C4F5007203684146CDE9B6 +:10B6800000465D693346A847064698B9A4F14203CF +:10B6900008EB030595F84030552B64D195F84130FF +:10B6A000AA2B60D17B7E05EB031313F8102C5206F6 +:10B6B00008D02E4E40460DF07FF8002387F820304A +:10B6C000FB614CE013F80C2C0F2A04D848F221033C +:10B6D000D340DB07EDD478684FF0000A0368DB6ADB +:10B6E00098477B7EB0F5007F03F1FF3338BF4FF4FE +:10B6F000007005EB03131A793A7653F8081F0A0A0B +:10B7000061F3070A62F30F2A0A0C090E62F3174A63 +:10B71000002261F31F6AA0FB0AABC7E902AB5B68BA +:10B72000190A63F3070261F30F22190C1B0E61F370 +:10B73000174263F31F62A0FB024578685246036814 +:10B74000C7E90445CDE90045596C5B4688470028A8 +:10B75000AFD00123404687F820300DF02DF8304659 +:10B7600002B0BDE8F08D024EA4E700BFE2F3FFFF98 +:10B77000E3F3FFFF70B51D4B0546044645F8543B07 +:10B780002846FFF761F9206C666909F0D9FA0023B1 +:10B79000636194F83D306BB9012384F83D304EB1BC +:10B7A000EFF3058333B908F04BFF18B93046DFF8E3 +:10B7B00040C000DF2846FFF727F994F83C302BB152 +:10B7C000A06A08B10CF0F8FF0023A362606D09F0D5 +:10B7D0004DFB256CEFF3058333B908F031FF18B941 +:10B7E0002846DFF810C000DF204670BD18AC010805 +:10B7F000652E0108352F010810B50446FFF7BAFF82 +:10B8000020460CF0D9FF204610BD00002DE9F0477E +:10B8100000238AB0814642F21078DFF85CA0012450 +:10B820000025002600278DF82730EFF305832BB97C +:10B8300008F006FF10B90120D44600DF0DF1270300 +:10B840004FF0FF320521484604930023CDE9064519 +:10B8500000934FF0FF33CDE9026700F084F89DF8C4 +:10B86000273013F0010002D0B8F10108DDD180F0DB +:10B8700001000AB0BDE8F08785340108F0B5002565 +:10B880008BB004468DF82750FFF7C0FF18B94FF072 +:10B89000FF300BB0F0BD0026002704954FF0FF32BB +:10B8A00000954FF0FF3306212046CDE90667CDE92C +:10B8B000026700F058F805460028E8D12046FFF757 +:10B8C000A5FF0028E3D00122002305212046009592 +:10B8D000CDE906230DF127034FF0FF3204934FF01B +:10B8E000FF33CDE9026700F03EF80028CFD19DF884 +:10B8F000270080F0020040F34000CAE770B51D4603 +:10B90000D0F8F43086B00646013317D0140E8DF807 +:10B910001740FFF7B3FF70B901234FF0FF32D6F89D +:10B92000F41000930DF11703CDE90100301DF9F774 +:10B93000BFFE06B070BD4FF0FF30FAE790F8FA3165 +:10B94000032B0ED06B1C08BFB2F1FF3F09D0002DB6 +:10B9500008BFB2F1807F2CBF4FF0FF30002040B213 +:10B96000E7E70020E5E72DE9F7430A9E0446154680 +:10B970000C9FDDF83880DDF840900191FFF7BEFFA5 +:10B9800058B933462A460199201D0A97CDE90B89FB +:10B9900003B0BDE8F043F9F78BBE03B0BDE8F08318 +:10B9A000D0F8E83001332DE9F047054688B08A46E3 +:10B9B0001DD1FFF763FF28B14FF0FF34204608B0D8 +:10B9C000BDE8F0870022002301210490CDF800A0FB +:10B9D000CDE90623D5F8E4304FF0FF32CDE902304F +:10B9E0004FF0FF332846FFF7BEFF0446E6E7FFF7B8 +:10B9F00045FF0028E0D14FF000084FF00009012674 +:10BA0000002704904FF0FF324FF0FF33012128460A +:10BA1000CDF800A0CDE90689CDE90267FFF7A3FFC5 +:10BA200004460028CAD12846FFF728FF0028C3D1C2 +:10BA30000AF101014FF0FF324FF0FF3304940091FF +:10BA4000D5F8E810CDE90689CDE90267CAE7F0B577 +:10BA5000012289B00023002600270C46049105210D +:10BA60000546CDE9062300234FF0FF3200934FF047 +:10BA7000FF33CDE90267FFF776FF98B9D5F8E430D8 +:10BA8000013B0FD0013400904FF0FF32D5F8EC109D +:10BA90000494CDE90630CDE902674FF0FF33284624 +:10BAA000FFF761FF09B0F0BDF0B500F1BC07044637 +:10BAB00089B03846FEF7C8FF94F804522DB93846CD +:10BAC000C4F80052FEF7A0FF09E0D4F80062013E7E +:10BAD000C4F8006236B100253846FEF795FF2846C7 +:10BAE00009B0F0BD002200230421204604960096F0 +:10BAF000CDE90623CDE902234FF0FF334FF0FF32AB +:10BB0000FFF731FF002884F8046238460CBF002597 +:10BB10006FF47A65FEF778FFD4F8B430002BDED1ED +:10BB20001048B4F9B84006F029F9FEF78DFF0E4B26 +:10BB30001B6803F114011A460233B2F90000A04257 +:10BB40000CD14FF6FF731380084A1368002B01DDF8 +:10BB5000013B1360034806F011F9B3E78B42EAD1C9 +:10BB6000F8E700BF78140224D0060024A0140224B1 +:10BB70002DE9F04700F1BC0788B004461546109E39 +:10BB8000384605938946FEF75FFF2A46059B204607 +:10BB9000D4F8E0A00796FFF7B1FEA0BB94F8FD3102 +:10BBA00004F1040894F8F9210393404694F8FE3117 +:10BBB000029394F8FB31CDE9002394F8FA3194F81C +:10BBC000F81106F039FA0646E8B994F8FB0107AB1C +:10BBD0005146B0FA80F04009CDE9009342422B462D +:10BBE0004046F9F7CDFC0546324631464046CDE9A0 +:10BBF0000266CDE9006694F8FA3106F01DFA45EACE +:10BC0000000464B20CB16FF47A643846FEF7FCFEAF +:10BC1000204608B0BDE8F0872DE9F04F92469B46DC +:10BC20008DB00446D0E944239B4508BF924528D2F5 +:10BC3000D0F828C1BCF1000F23D0BCF1010F0CD00B +:10BC400000F5B47E0025AC451BDDFEE80201594538 +:10BC500008BF504502D20135F5E70025611991F87A +:10BC60005411059116991AEB010617994BEB010730 +:10BC7000BB4208BFB24207D2614C20460DB0BDE8BE +:10BC8000F08F4FF0FF35E9E7236852462046196BE5 +:10BC90005B46884702460B46504659460EF0D2FC9A +:10BCA0001343E9D116F1FF3223682046196B47F19F +:10BCB000FF33884702460B46304639460EF0C2FC39 +:10BCC0001343D9D104F5E4730993DDE91623134333 +:10BCD00000F09480D4F81891B9F1FF3F59D11AF1CE +:10BCE000FF334FF008074FF003060A934BF1FF3381 +:10BCF0000B9305F1090304EBC3030893059B3B4237 +:10BD000024D0099B4FF000095046594653F826307D +:10BD10001A4698464B460EF095FC134316D1DDE9C2 +:10BD200016234B4508BF424510D30A9B13EB08036B +:10BD300006930B9B43EB09030793089BDDE9060180 +:10BD4000D3E948238B4208BF824203D2013E4FEA27 +:10BD50005707D3D204EB8606D6F8B891D6F8C86157 +:10BD600004F1BC074FF000083846FEF76DFE204690 +:10BD7000FFF784FD00283DD15B4652462046FFF781 +:10BD8000BDFD034640B16FF47A643846FEF73CFED1 +:10BD900073E74FF48056E3E7CDE901000090524687 +:10BDA0004946201DF9F784FC0028ECD11AEB060A5D +:10BDB000169B4BEB080B9B1B1693179B63EB08031F +:10BDC0001793DDE9162313430CD004EBC503D3E925 +:10BDD0005A235B4508BF52453FBF0135631993F8AD +:10BDE000543105932046FFF711FD28B13846FEF780 +:10BDF0000BFE6AE7034CC8E7034CC6E700243CE7A8 +:10BE00005BF0FFFF5CF0FFFF5DF0FFFF2DE9F04FFF +:10BE10001F4600F1080304460E46154600F1BC0813 +:10BE200000F104092DED028B08EE103A87B0DDE930 +:10BE3000122313437CD0D4F8F0314FF0000B284686 +:10BE400039469A461A4602935B460EF0FBFB12995E +:10BE50005118009113994B410193DDE900015945B7 +:10BE60004FF0000B08BF504540462ABF029B129B73 +:10BE70009B1A0293029B9A46CDE904ABFEF7E4FDC0 +:10BE80002046FFF7FBFC00284ED12A463B462046C1 +:10BE9000FFF734FD50B16FF47A644046FEF7B4FD0D +:10BEA000204607B0BDEC028BBDE8F08F94F89830C7 +:10BEB000002BF0D0002EEED0049B002BEBD0484698 +:10BEC00006F0B0F84FF0FF332A460221484602F050 +:10BED00077F904AB324604F16C0118EE100AF9F759 +:10BEE0007BFB0390484606F093F8039B002BD2D1CE +:10BEF000DDE904239B4508BF9245CCD1029B15EB9D +:10BF00000A0520461E44129B47EB0B07B3EB0A03BE +:10BF10001293139B63EB0B031393FFF777FC28B18A +:10BF20004046FEF771FD82E7024CB6E7024CB4E7EB +:10BF30000024B5E75CF0FFFF5DF0FFFF2DE9F04F57 +:10BF4000D0F8B4A005462DED028BB5B0BAF1000FC4 +:10BF50000CD0CB4ACB4BBAF1FF3F0CBF92469A466E +:10BF6000504635B0BDEC028BBDE8F08F00F1BC034C +:10BF7000184608EE903AFEF767FD2B1D52465146D3 +:10BF800008EE103A95F8FA3118EE100ACDE902AA37 +:10BF9000CDE900AA06F050F830B16FF47A6A18EED5 +:10BFA000900AFEF731FDDBE795F804320BB9C5F8CE +:10BFB00000A2D5F800420134012CC5F80042EED1B0 +:10BFC0000023D5F8F46185F8FB3185F8FD3195F84B +:10BFD0009830002BE1D018EE100A06F023F818EE86 +:10BFE000103A3146C5F89060181DFAF781F90646F7 +:10BFF00018EE100A06F00CF8002ECED12846FFF7F6 +:10C0000005FC002800F02C859F4F03220DF1800BCA +:10C010009F213B782846CDF810B08DF88030002362 +:10C020000096ADF88160CDE9062300220023CDE91A +:10C0300002234FF0FF324FF0FF33FFF794FC0997D4 +:10C040000028AAD19DF880309D2B00F0D98000F205 +:10C05000BE80012B00F0D7801F2B00F0E280002370 +:10C0600010ACDFF82CA229462046082600274FF006 +:10C070005A08B146C5E94233C5E94833CDE920A3A2 +:10C080009BE80C00F6F78CFE94E80F001CAC8BE8E4 +:10C090000F0001230022584603940296CDE9003890 +:10C0A000CDE904670023FBF73AFCB842CDF828A09D +:10C0B000C0F28A800422754920460DF041FF824675 +:10C0C000002840F081809DF87530012B7CD19DF8CF +:10C0D000763032460B933B4637461E460120CDF85C +:10C0E000048000905846CDE90476CDE90294CDE96C +:10C0F0000C32FBF714FC002866DB9DF87230012B34 +:10C10000089361D11D984FEA106CBCF1FF0FDDE977 +:10C110000C3214D19DF87010812900F09080842990 +:10C1200000F0978059B920F07F40C5F808019DF8CC +:10C13000730080005028A8BF5020C5F80C010832B9 +:10C140000B990AF1010043F10003514575DC0A9B8C +:10C1500014AE4FF00008294620933046CDF8848075 +:10C160009BE80C00F6F71CFE96E80F0084E80F0031 +:10C1700095F80231D5F80821002B74D02420002135 +:10C180005A274FF0080901264346CDF80CB0009617 +:10C19000CDE90401CDE901792046FBF7C0FB98B950 +:10C1A0000C220023CDE904232CAB6022CDE90293BD +:10C1B0000023CDE900672046FBF7B1FB824618B9A2 +:10C1C0009DF98730002B67DADFF8C8A0E7E6BF2BC0 +:10C1D00013D0C22B7FF443AF9DF88130202B1FBFBB +:10C1E000012385F800310323C5F8E4301523C5F891 +:10C1F000EC30002385F8F03031E785F803012EE7B5 +:10C20000C5F8E4402BE79DF88130022B7FF427AF7F +:10C210009DF88230202B7FF422AF012385F8013175 +:10C220001DE79DF88130892B7FF419AF3123C5F8C4 +:10C23000E830012385F8023111E782464EE720F00D +:10C240007F40C5F820019DF873008000C5F82401E7 +:10C2500075E720F07F40C5F8D8019DF87300800095 +:10C26000C5F8DC016BE7D5F80C110820CDF80CB04F +:10C27000CDE904135A21CDE90110012100919AE77B +:10C280005AF0FFFF59F0FFFFFCAC0108F7AC0108C2 +:10C29000C37C00085EF0FFFF219B95F8021101337B +:10C2A000DB08C5E94430D5F80C31282B89BF9DF84F +:10C2B000A8304FF480731A11012388BF9340C5F84A +:10C2C000F031002969D09DF8B43013F0080267D02E +:10C2D00000294FF000034FF000014FF000000493DD +:10C2E0004FF0FF3200934FF0FF33CDE90601CDE967 +:10C2F00002010CBFF02199212846FFF734FB0028EA +:10C300007FF462AF2846FFF781FA044600283FF425 +:10C310005BAFD5F80C011C2864D9012305F5DC714D +:10C3200005F5E4774FF0FF3C9E469BF81C2041F852 +:10C3300004CB0EFA02F2012ACA600FD99BF81D60E5 +:10C3400041F8046CD5F86061B24200D30EB9C5F86B +:10C35000602195F854211A4385F854215B008F42DF +:10C360000BF1020BDBB2E0D19DF882309F0640D585 +:10C370009DF88930C5F8E0309DF8883003F01F0241 +:10C380005B119B0085F8FD2185F8FB31022385F8C0 +:10C39000F931002485F8FE3144E09DF8BD3094E782 +:10C3A000DB067FF511AF0026002704924FF0FF3324 +:10C3B000009266214FF0FF322846CDE90667CDE9AD +:10C3C0000267FFF7D0FA00287FF4FEAE4FF0FF328D +:10C3D0004FF0FF33992104900090CDE90667CDE935 +:10C3E000026789E79DF88130FF2BC5F81831BBD172 +:10C3F000EAE610286BDD9DF89020D60667D59DF8FB +:10C400009B30C5F8E0309DF89A3003F01F025B11B5 +:10C410009B0085F8FD2185F8FB31022385F8F93171 +:10C4200085F8FE3195F8003193B3099B002218EE90 +:10C43000100A1B781146ADF861208DF86030022398 +:10C44000CDE90222CDE9002205F0F6FD00BB18A9D6 +:10C450002846FFF7FCFAD8B99DF86230284643F029 +:10C4600002038DF86230FFF709FA88B918A9284647 +:10C47000FFF796FA064658B92846FFF7C7F938B1CC +:10C4800018A92846ADF860608DF86260FFF7DFFA02 +:10C49000099B1A780023ADF83D30ADF8613095F86E +:10C4A00002318DF83C208DF86020002B40F0C080D8 +:10C4B0009DF8BA30C3F30213013B042B00F2FE8057 +:10C4C000DFE813F0B60022012701B600B6005806D7 +:10C4D0000ED59DF88B30C5F8E0309DF88A3003F01A +:10C4E0001F025B1185F8FD2185F8FB31022350E71F +:10C4F0009DF89020D1077DD59DF89730C5F8E030A4 +:10C500009DF8963003F01F025B115B0085F8FD215A +:10C5100085F8FB31012385F8F93185F8FE3195F86E +:10C52000F030BBB1D5F80C313F2B13DD9DF8BF3097 +:10C5300013F0400200F05F8103234FF0000B85F8F9 +:10C54000FA3195F8FA31032B00F0E281BBF1000FCC +:10C550007FF43AAE2846FFF759F900283FF434AE8D +:10C560000A9B18AE4FF0000B0DF18008294620936E +:10C57000CDF884B030461CAC98E80C00F6F710FCFF +:10C58000D5F8209196E80F0084E80F00B9F1000F6C +:10C5900004D0D5F82461002E40F0C8810123C5F8ED +:10C5A0002831D5E94432C5F82C3113F1FF3342F17B +:10C5B000FF32C5E95A32D24B28461B788DF88030BD +:10C5C0000023ADF88130FFF721F900283FF4FCADDE +:10C5D00095F80341002C00F00C82012C00F024821D +:10C5E0002846FFF713F900283FF4EEAD012385F844 +:10C5F0000432D4E4DA0606D59DF88F30C5F8E03071 +:10C600009DF88E307EE7DB070ED59DF88D30C5F89E +:10C61000E0309DF88C3003F01F025B1185F8FD219E +:10C6200085F8FB31012378E70323C5F8E03076E78E +:10C630000123C5F8F830C5F8FC30D5F8F8305F1C98 +:10C6400009D0D5F8FC104E1C05D034AA13440122A1 +:10C650008A4003F8942C18A92846FFF7F8F99DF8AA +:10C6600062309DF83E202846BDF83C101343BDF8CB +:10C6700060209DF83C700A4318A99DF83D60ADF814 +:10C6800060208DF86230FFF78BF92846FFF7BEF87F +:10C6900000283FF499AD002318A92846ADF8603072 +:10C6A0008DF86230FFF7D3F99DF860301F409DF898 +:10C6B00061301E4057EA06033FF486AD002C3FF47C +:10C6C0002EAF9DF8B9309DF8B8201B0103F0100380 +:10C6D00043EA1213082B67D038DC022B24DC002B32 +:10C6E0003FF41DAF0021002300204FF0FF320493E0 +:10C6F00000934FF0FF33CDE90601CDE90201382167 +:10C700002846FFF730F90AE70023C5F8F83006237A +:10C7100091E707234FF0000C4FF03E0EC5E93EC3F2 +:10C720003F23C5E93AE388E7042B7FF4F8AE002104 +:10C73000002300204FF0FF32049300934FF0FF33AB +:10C74000CDE90601CDE902013521D9E7102B7FF4AF +:10C75000E6AE0126002718AC4FF000084FF00009A4 +:10C760004FF0000B4FF0FF324FF0FF3365212846AA +:10C770000494CDF800B0CDE90667CDE90289FFF752 +:10C78000F2F89DF860304FF0FF32612103F07F0333 +:10C790000494CDF800B08DF860304FF0FF33CDE950 +:10C7A0000667CDE90289ABE70126002718AC4FF0F8 +:10C7B00000084FF000094FF0000B524A002365219A +:10C7C00028460494CDF800B0CDE90667CDE902898A +:10C7D000FFF7C9F89DF860304A4A712143F04003E1 +:10C7E0000494CDF800B08DF860300023CDE90667E1 +:10C7F000CDE9028984E7D80711D5002000210492F1 +:10C800000092CDE90601CDE902014FF0FF324FF071 +:10C81000FF33B7212846FFF7A6F860BB8CE613F07C +:10C8200002020DD02846FFF729F8002865D1002222 +:10C83000002304900090CDE90623CDE90223E4E72C +:10C8400013F0100139D00126002718AC4FF0000872 +:10C850004FF000098DF8602000924FF0FF334FF049 +:10C86000FF32B52128460494CDE90667CDE9028957 +:10C87000FFF779F810B1DFF890B062E69DF860300C +:10C88000284643F001038DF86030FEF7F7FF83463A +:10C8900098BB04904FF0FF324FF0FF33B121284690 +:10C8A0000094CDE90689CDE90267FFF75CF800281E +:10C8B000E1D1032385F8FA3143E613F0080013D0E1 +:10C8C00080230022049117218DF860300023CDE9E8 +:10C8D000062301220023CDE9022318AB4FF0FF32DB +:10C8E00000934FF0FF3395E713F0040B4FF0020372 +:10C8F000E0D0C522C5F8F4201FE6DFF810B020E62E +:10C90000FCAC0108030080005EF0FFFF5CF0FFFF5D +:10C91000002218EE100A1146CDE90222CDE90022CC +:10C9200005F08AFB00283FF411AE4DE430460BF0D1 +:10C930003BFF074600283FF447AC5A2308210390E9 +:10C940004A462046CDE901310123CDE9046B00932D +:10C950005B46FAF7E4FF002840DB3E78D5F82491E7 +:10C9600016F0020694E80F0088E80F0040F0BD8042 +:10C97000B9443C460FA90834A1452FD314F8063C0E +:10C980004FF0000C14F8052C4FF0010B03F00F00D2 +:10C990009B09099254F8042C03910290CDE904BC40 +:10C9A00014F8070C0093002301904046FAF7B7FFF4 +:10C9B000002813DB9DF83C307600099A0FA9F6B2E7 +:10C9C0001A4214F8082C237818BF46F00106D20743 +:10C9D00003F0020300F18B80002BCCD04FF0FF342A +:10C9E0007CE0089901334900042BC9B208916AD14F +:10C9F00074E02846FEF742FF00287FF4E5AB0022F2 +:10CA000000230490982100902846CDE90623CDE923 +:10CA100002234FF0FF324FF0FF33FEF7A4FF002850 +:10CA20003FF4DEADFFF7D0BB20A92846FFF70FF893 +:10CA300000287FF4C9ABD5F8F8307BB9D5F8FC30C5 +:10CA40009C4044F00304E4B29DF8803020A92846BD +:10CA50001C408DF88040FEF7A3FFE0E70324F3E7D6 +:10CA6000DFF8C4A0FFF79BBA0CF101030A2BC5F84D +:10CA70002831B3DC6FF4AA79043405F5967805F50E +:10CA8000AA7605F5B47E00210F22A9EB05092368DB +:10CA900014F8040B23F0FF0300F00F0003F580737C +:10CAA000024048F8043B013B06F8010B0B44D91740 +:10CAB0001846EEE80201591C09EB06039C45E6DC2A +:10CAC0000023C5F86031089911EA020489D005EB0A +:10CAD00083030024D3F8C831C5F8603138460BF021 +:10CAE0006BFE01343FF470AB65E53C465E46D5F81D +:10CAF00024213A44217888077FF570AF04F10803B8 +:10CB00009A42FFF46BAF94F802C00CF1020304EBFD +:10CB100083039A42FFF462AF6078B042A4D0C907A1 +:10CB20003FF55CAF1C46E5E75DF0FFFF7047000096 +:10CB3000094B0A485B6870B590248D1804FB030309 +:10CB40008D4207D011F8014B1868C6693606FCD52E +:10CB50008462F5E7104670BD900B0224F40C0224A9 +:10CB6000012070476FF0150070476FF01C00704790 +:10CB700003681B6818476FF0150070471120704755 +:10CB8000BFF35F8F012208498A6001320B69042AD2 +:10CB900023F0010343EA00030B61F5D1BFF34F8F8C +:10CBA000BFF36F8F704700BF90ED00E0BFF35F8F62 +:10CBB000064A00239360136923F0010318431061B0 +:10CBC000BFF34F8FBFF36F8F704700BF90ED00E052 +:10CBD00070472DE9F047466896F8327087BB0368C6 +:10CBE0005B689847346A84422AD03369041B96F9FB +:10CBF00034201C40B3683062A4FB0345CAB1736A99 +:10CC000014EB030845F10009002A1BDBC2F12001E7 +:10CC1000A2F1200328FA02F429FA02F509FA01F137 +:10CC200029FA03F30C431C4304FA02F2A8EB0202B4 +:10CC30007262D6E90A321B1945EB0202C6E90A32D2 +:10CC4000BDE8F087D6F80CA03B4640464946524620 +:10CC50000DF0F8FC04460D460AFB1082E8E72DE9CA +:10CC6000F14F46680546376B27F07F4727F0FF07EF +:10CC7000002F57D1FFF7ADFF7368002B60D0D5F8B8 +:10CC800000A0D3E90001D6E90A238B4208BF824203 +:10CC900005D3DAF8143001B0BDE8F04F18476C68DE +:10CCA000D4E90A32D4F814B0B0EB030861EB0209FE +:10CCB000D4E906234B4508BF424520D3E36894F9E5 +:10CCC00033C0A3FB080103FB0911BCF1000F13D013 +:10CCD000A268531EC01841F10001BCF1000F24DB13 +:10CCE000CCF12002ACF1200320FA0CF001FA02F2A0 +:10CCF00021FA03F310431843834528BF8346236A70 +:10CD00009B4423690BEA030BDAF810305846984726 +:10CD10002B685B689847336A5B450AD258450CD24A +:10CD200083420AD801B0BDE8F08F3B460DF08AFC83 +:10CD3000E2E78342F6D95845F4D32B685B69AAE74A +:10CD40007369306A326918442B6810401B6901B05E +:10CD5000BDE8F04F1847B1F900305A1C01D1184610 +:10CD60007047834201D1886870470C31F3E784B083 +:10CD700001A804B080E80E00704701207047002928 +:10CD80000CBF6FF01800002070476FF0150070475F +:10CD9000036800221B69114618470368012200211D +:10CDA0001B69184730B1036823B11B79052B03D0E9 +:10CDB000062B24D02048704743680020DFF8A4C029 +:10CDC0001E4A1F49C3E902C202F17942DFF898C046 +:10CDD00002F5740202F501621A611A4AC3E90512EA +:10CDE00002F1D14202F5C01202F51E62DA61164A62 +:10CDF000C3E908C20122C3E900009A66704743688C +:10CE000000201249124ADFF864C09866C3E9021292 +:10CE1000104A1149C3E904C2104AC3E90612104A74 +:10CE20001A6202F17452A2F52302A2F69242C3E9F9 +:10CE300000005A62704700BF00AFFFFF07D57C3685 +:10CE400039590EF7310BC0FFA44FFABE67E6096AE5 +:10CE500085AE67BB3AF54FA57F520E518C68059B96 +:10CE6000ABD9831FD89E05C1A78FF96472F36E3CBE +:10CE7000137810B504688C4238BF013B1370036807 +:10CE8000591A016010BD03685918016028BF0123B9 +:10CE9000117838BF00230B4413707047436830B5D6 +:10CEA0002BB94A6862B9181E18BF012028E08268B1 +:10CEB00002EB830252F8042C002AF2D1013BEFE787 +:10CEC0008C6804EB820555F8045C85B9013AE9E702 +:10CED000826852F8231054F82320914205D803F1B8 +:10CEE000FF330AD24FF0FF300AE0012008E00BB117 +:10CEF0009342FAD89342F5D3013B5A1CE8D1002063 +:10CF000030BD0021F0B50A464568954202D10024A3 +:10CF10002046F0BD836853F82260002326FA03F709 +:10CF2000CC18FF07F4D40133202B01EB0304F5D117 +:10CF300001322146E9E7036870B5CD1A002D0DDDF9 +:10CF400093F900601C78002E0BDB5C1C04601B78DE +:10CF500013600368C91A13688B4234D96FF05F00FD +:10CF600070BD04F07F04013C032C29D8DFE804F0F5 +:10CF700002091220012DF1D05C78023314600360A5 +:10CF8000E7E7022DEADDB3F80140033364BAA4B247 +:10CF90001460F4E7032DE1DD9C78043313F8035C9F +:10CFA000240244EA054413F8015C2C431460E6E7CC +:10CFB000042DD3DDD3F80140053324BA1460DEE735 +:10CFC0006FF06300CCE70020CAE70000024B987ABC +:10CFD000003818BF012070471801002408B504F07C +:10CFE00043FDFCE710B504460BF0E6FB204610BD00 +:10CFF00008B5431C03D10346184608BD0C31B1F9EE +:10D0000000305A1C04D09842F8D14B68591CF3D117 +:10D0100001460148F5F700FD30010180884208B55E +:10D0200007D0431C05D00131014602D00248F5F774 +:10D03000F3FC084608BD00BF30010180024B1868B0 +:10D0400008B107F043BF704788270224024B1868D5 +:10D0500008B1FAF77FB8704788270224012008B585 +:10D0600000F0B8FB11F0010010B58CB204D0F5F758 +:10D0700083FE003818BF0120E2060AD5054B5A6826 +:10D0800090235343044AD358DB691B0648BF40F042 +:10D09000100010BD900B0224F40C0224F8B50D46CC +:10D0A00082B3194B194C5F68902303FB07439A68BE +:10D0B000B2F5805F16D11A69BAB940F2FF12A3F82F +:10D0C0006020902202FB0742B2F86060F5F754FE40 +:10D0D0000028FBD0902301207B43E3585B6A1E406D +:10D0E0002E70F8BD1AB91A6932B9FF22E7E7B2F11A +:10D0F000805F05D11A690AB97F22E0E73F22DEE7A7 +:10D100000022DCE71046ECE7900B0224F40C02242A +:10D11000436B30B5054685B053B100F128036C462A +:10D120000FCB84E80F00002320466B6307F085FFD8 +:10D1300005B030BDD0F890302DE9F04F012B0446FA +:10D140002DED088B87B0029307D9002084F8940056 +:10D1500007B0BDEC088BBDE8F08F031DB0F99670E9 +:10D16000B0F9986008EE103AD0F88C30B0F99A50C7 +:10D17000B0F99CA008EE903AB0F99EB0B0F9A0804A +:10D1800038467249FFF734FF714903903046FFF784 +:10D190002FFF704901902846FFF72AFF6E4909EEDC +:10D1A000100A5046FFF724FF6C4909EE900A5846D2 +:10D1B000FFF71EFF6A490AEE100A4046FFF718FF04 +:10D1C000019A039B814611461846FFF727FF19EE87 +:10D1D000901A019019EE100AFFF720FF49460390BC +:10D1E0001AEE100AFFF71AFF019B1A46039B9A4298 +:10D1F000ABD1019B8342A8D154493846FFF7ABFD20 +:10D20000534903903046FFF7A6FD524909EE100A34 +:10D210002846FFF7A0FD504909EE900A5046FFF757 +:10D220009AFD4E490AEE100A5846FFF794FD4C4904 +:10D230000AEE900A4046FFF78EFD4A4A0BEE100AAE +:10D24000039BD2F8D410484841F48041C2F8D4106E +:10D25000D2F8D41001F48041059105994349D0F8E2 +:10D260008CC08C45FBD1D16F4FF0000941F4804157 +:10D27000D167D16F21F48041D1674FF44072012111 +:10D28000C26000223846A4F8547084F84520226118 +:10D2900084F844204FF0004292FAA2F2B2FA82F2ED +:10D2A000013A62614FF48062A261029AE261019ADE +:10D2B000C4E9021162601946C4E90899F8F776FBDF +:10D2C00049463846F8F71CFB19EE101A3046A4F808 +:10D2D0005660F8F76BFB49463046F8F711FB19EE3C +:10D2E000901A2846A4F85850F8F760FB494628469B +:10D2F000F8F706FB1AEE101A5046A4F85AA0F8F7F1 +:10D3000055FB49465046F8F7FBFA1AEE901A584674 +:10D31000A4F85CB0F8F74AFB49465846F8F7F0FA2B +:10D320001BEE101A4046A4F85E80F8F73FFB494612 +:10D330004046F8F7E5FA18EE901A18EE100AF8F7DA +:10D34000D7FFB0FA80F0400900E700BF10AF010836 +:10D3500040AF010870AF010894AF0108C4AF0108E5 +:10D36000E8AF01080044025800640258000300803E +:10D3700039B101F18041013900EB8101814203465D +:10D3800000D270471B680A681BBA12BA40F8042B17 +:10D3900041F80439F2E70000034B596A5A6A521AFD +:10D3A0008242FBD3704700BF000C004007B50190DC +:10D3B0000BF0FAF9019910B90248F5F72DFB03B00B +:10D3C0005DF804FB1F010180037823F0030343F0A1 +:10D3D00001030370FFF732BE10B50446037803F073 +:10D3E0000303012B08D0FFF731FE237803F003027B +:10D3F000012A03D1FFF722FE002003E043F00203DD +:10D400002370012010BD0000014B186807F05EBDBD +:10D4100040270224014B1868F9F79CBE40270224DC +:10D42000014B186807F052BD80270224014B186891 +:10D43000F9F790BE8027022401207047074A084967 +:10D4400013681844884283BF064B0C224FF0FF300C +:10D4500010608CBF1A601846704700BF0C01002492 +:10D4600000FC072454A50224064A136843B1013B7B +:10D4700013602BB9044A1370044B1B7803B162B6D6 +:10D48000704700BF3C2702248C270224382702243F +:10D49000EFF3108372B6074A117831B9DB430649BE +:10D4A00003F001030B7001231370044A1368013366 +:10D4B000136070478C270224382702243C2702245B +:10D4C00008B5FFF7E5FF064A1388013B9BB21380BE +:10D4D00013B90120FFF76AFBBDE80840FFF7C4BF9E +:10D4E0008427022410B5074CFFF7D2FF218811B919 +:10D4F0000846FFF75BFB01312180BDE81040FFF7D4 +:10D50000B3BF00BF8427022408B5FFF7C1FF064A56 +:10D510001388013B9BB2138013B90120FFF730FB46 +:10D52000BDE80840FFF7A0BF8627022410B5064CCF +:10D53000FFF7AEFF208808B9FFF722FB01302080FB +:10D54000BDE81040FFF790BF86270224F0B58FB0EA +:10D5500007460E4615460021142209A801AC0BF01F +:10D5600095F9104B08945B690197DA6B0493059267 +:10D570005A6B1B6B06920793CDE90256FFF788FFA3 +:10D58000094A0A4D1368013313600FCC0FC50FCC45 +:10D590000FC50FCC0FC523682B60FFF765FF002078 +:10D5A0000FB0F0BD18010024442702244C270224A8 +:10D5B000F8B50546FFF76CFFD0E90034DB68984703 +:10D5C00094F832301BB1BDE8F840FFF74DBF01239E +:10D5D00084F831306368ABB12846FFF7FAFA616826 +:10D5E000D4E90A67D1E900239F4208BF964209D3D4 +:10D5F0006B685A68CB6863602368002BEAD0906838 +:10D600009847E7E70023284684F83130FFF727FBE7 +:10D61000D9E72DE9F743044600F1080580699046F3 +:10D6200099460190FFF734FF0198FFF7D2FA01986D +:10D630000021426824615368C4E902892BB96361FF +:10D6400061B95560FFF70BFB0FE0D3E90067B945FF +:10D6500008BFB045F3D31946DB68EFE7D2E90A23E8 +:10D66000CD604B4508BF4245ECD203B0BDE8F04366 +:10D67000FFF7FABE90F83C3030B453B1002380F885 +:10D680003C3090F83E3013B9012380F83D3030BC77 +:10D69000704790F83F30002BF9D0836B4FF08062D9 +:10D6A000013383630B4B5A60D0E90C32013342F1F2 +:10D6B0000002C0E90C32D0E90A2312F57A7543F171 +:10D6C000000412F5FA62C0E90A5443F1000330BCC9 +:10D6D000FFF79FBF00ED00E038B5D0E90825D0E99D +:10D6E00002130446521845EB0303FFF792FF636BE6 +:10D6F0002BB104F12800BDE8384007F09EBC38BDCE +:10D70000094B30B51A46094CD3F89450A542FBD1C9 +:10D71000036829B181680B604FF44073536130BDD9 +:10D72000C1681B04F7E700BF0064025800030080D3 +:10D7300000B58C2589B0FFF7ABFE0820ADF814507A +:10D74000F8F716F84FF47071044628461E4DF8F7A6 +:10D750002DF94FF480531D4A0021019301A8BDF813 +:10D760001430069403F00F0352F82330079304F1AA +:10D77000100318340293CDE90344F8F7F5F80424B4 +:10D78000012101A8FFF7BCFF2846FFF705FE002195 +:10D7900001A8FFF7B5FF2846FFF7FEFD013CEFD1DA +:10D7A00004240B4E012101A8FFF7AAFF3046FFF722 +:10D7B000F3FD002101A8FFF7A3FF3046FFF7ECFDC2 +:10D7C000013CEFD1DBE700BFF04902005CAC01088F +:10D7D000801A060008B508B1FFF7AAFFFEE70000AF +:10D7E00008B50E4B0121D3E84F2FC3E8401FD2B23A +:10D7F0000028F8D12AB1FFF74BFEBFF34F8F20BFAF +:10D80000FDE7EFF305831BB9EFF31083DB0701D5C9 +:10D81000FFF78EFF0120FFF7DDFF00BF482702243E +:10D820000FB4724608B5074B0120D3E84F1FC3E879 +:10D83000440FC9B2002CF8D111B90348FFF786FE96 +:10D84000FFF7CEFF440B02240001FF803F282DE9A3 +:10D85000F04F06468BB000F32B81964F57F820000F +:10D86000411C40F00981022E00F306819248DFF846 +:10D870008C920378BFF35B8F13F0010F40F0F980B7 +:10D88000FFF7AAFD002800F0F4808C4BC9F80030A7 +:10D890008B4B1A689846002A40F0E8808949092095 +:10D8A000FFF7A6FB044688491720FFF7A1FB0146B6 +:10D8B0002046864DFFF7B2FB824904460920FFF758 +:10D8C0004AFA814983461720FFF745FA804B824682 +:10D8D0002C609C4221D17F4AD2F8F01041F0100117 +:10D8E000C2F8F010D2F8F02002F010020992099A62 +:10D8F000794A94424AD1774BD3F8F02042F0200283 +:10D90000C3F8F020D3F8F03003F020030493049B15 +:10D91000724B9C424AD1012487E0704A94421AD04B +:10D9200002F58062944224D06D4A94425CD06D4AE4 +:10D930009442DDD1674AD2F8E81041F48011C2F870 +:10D94000E810D2F8E82002F480120592059A9C4271 +:10D95000DED1002469E05F4AD2F8E81041F40031DA +:10D96000C2F8E810D2F8E82002F400320892089ACF +:10D97000BEE7584AD2F8E81041F48021C2F8E81016 +:10D98000D2F8E82002F480220792079A564A94427D +:10D9900037D1504BD3F8E82042F08042C3F8E8205A +:10D9A000D3F8E83003F080430393039B4F4B9C4232 +:10D9B00074D003F580639C4272D003F580639C426F +:10D9C00070D003F544439C426ED0A3F51C439C42A7 +:10D9D0006CD003F580639C425ED04548844214BFFE +:10D9E0004FF0FF34082420E03A4AD2F8E81041F41E +:10D9F0000021C2F8E810D2F8E82002F400220692D2 +:10DA0000069A3C4A94423AD0394A94429FD1314BCB +:10DA10000824D3F8F42042F00802C3F8F420D3F825 +:10DA2000F43003F008030193019B594609206C6010 +:10DA3000F7F7BCFF01210920F7F762FF51461720D5 +:10DA4000F7F7B4FF01211720F7F75AFF00234FF42F +:10DA5000E132C5E90433C5E90223274BAB61F8F78E +:10DA6000C3FC0123C8F80030F8F75AFF1248FFF74B +:10DA7000ABFC224847F826900BB0BDE8F08F154B61 +:10DA8000D3F8E82042F00042C3F8E820D3F8E830A9 +:10DA900003F000430293029B0724C6E70224C4E775 +:10DAA0000324C2E70424C0E70524BEE70624BCE73C +:10DAB0000020E1E70C00002404260224CCB2010877 +:10DAC0009027022474B1010818B00108900B0224B9 +:10DAD000001001400044025800140140004400407E +:10DAE000004C0040005000400078004000480040DA +:10DAF000000C0058007C0040090017002C2702246D +:10DB000038B50D46FFF7A2FE044630B90AF03CF8DE +:10DB1000092303604FF0FF3038BD0368DB69984785 +:10DB20000028204614BF4FF400534FF400436B60AD +:10DB300023689B6A984728610020EDE713B5CDE97B +:10DB40000021FFF783FEDDE9002140B90AF01CF84F +:10DB5000092303604FF0FF34204602B010BD036874 +:10DB60001B699847041EF7DA64420AF00DF8046056 +:10DB7000F0E710B5FFF76AFE044628B90AF004F88A +:10DB800009230360204610BD0368DB699847041E23 +:10DB9000F8DA644209F0F8FF04600024F2E7FFF7C6 +:10DBA000E8BF13B5CDE90021FFF750FEDDE9002104 +:10DBB00040B909F0E9FF092303604FF0FF34204624 +:10DBC00002B010BD03689B689847041EF7DA6442F0 +:10DBD00009F0DAFF0460F0E77FB5002A04460D463D +:10DBE00006DA09F0D1FF162303604FF0FF3019E089 +:10DBF0000192FFF7BEFF019AE8B1114E01220DF12B +:10DC00000F012046FFF7CDFF0028EEDB0AD09DF87C +:10DC10000F300D2B08D1325D0A2A3355EED00A237E +:10DC200001202B7004B070BD0A2B02D1325D0D2A89 +:10DC3000F3E73355F4E729462046FFF7B2FFF1E753 +:10DC40000826022413B5CDE90021FFF7FFFDDDE929 +:10DC5000002140B909F098FF092303604FF0FF3419 +:10DC6000204602B010BD0368DB689847041EF7DA4F +:10DC7000644209F089FF0460F0E700002DE9F74FE6 +:10DC8000B2F1000805460E4609DA09F07DFF1623B9 +:10DC900003604FF0FF34204603B0BDE8F08FFFF77C +:10DCA00068FF044660B31F4A0027DFF87CA04FF0EE +:10DCB0000D0B535D3C469146B84521DDF25D0A2AC5 +:10DCC0001BD10D2B019318D0BC420CDA3A1B311931 +:10DCD0002846FFF7B7FF0028019BDADB0444A74280 +:10DCE000D9DC09F80530012251462846FFF7AAFF82 +:10DCF0000028CEDBCFD009F805B0F35D0137DBE7B4 +:10DD0000A045C8DDA8EB040231192846FFF79AFFA9 +:10DD10000028BEDB24181FBF3619024B16F8012C51 +:10DD20005A55B8E748260224F8AD010838B505462B +:10DD30000024FFF78BFD0B4B43F8254030B909F069 +:10DD400023FF092303604FF0FF3038BD03685B6990 +:10DD50009847051E04DA6D4209F016FF0560F2E7E8 +:10DD60002046F2E70C000024F0B572B60023264AE4 +:10DD70004FF0FF36254F13604FF0E0221D465168EB +:10DD800001F00F0101319A004FEAC30C02F1604229 +:10DD900002F56142C2F88060C2F88061002202EBA5 +:10DDA0000C0401323C44082A84F80053F7D10133B3 +:10DDB0009942E8DC164B4FF020625A6040F2FA526A +:10DDC0009860DA6000221D6111469C1801320C2A0D +:10DDD0002176FAD14FF0FF3259629A620D4ADA6227 +:10DDE0001F221A63BFF35F8F0B4B5960BFF34F8F36 +:10DDF000BFF36F8FD0E90031002282F314889D4673 +:10DE000082F310880847F0BD10E000E000E100E078 +:10DE100000ED00E0020000C090ED00E00AF03EBD21 +:10DE20000AF04CBD0AF0F4BD0AF098BD406828B174 +:10DE3000037B012B01D1043870470020704700009C +:10DE4000436893F830202DE9F0470646002A74D144 +:10DE500093F83230002B70D103681B689847336801 +:10DE6000DB699847364B0268002A08BF1A461146FC +:10DE70001C46B1FBF3F304FB13132146002BF7D12F +:10DE80002F4B01257768B3FBF4F11F23B960013BE9 +:10DE900003D305FA03FC6145F9D1B2FBF4F287F82C +:10DEA000333001241F23FA6004FA03F5AA4201D09B +:10DEB000013BF9D287F834304468231F1B2B93BFF2 +:10DEC00001234FF0FF332024A340A4F1040498BFA2 +:10DED00003F1FF3312F1FF303B614FF0070303FA08 +:10DEE00004F44FF000034FEAE4797C61A4FB0145A0 +:10DEF0009A4601FB095543F1FF31201845EB01011A +:10DF00000CF0A0FB3368C7E906015B68C7E900AA0B +:10DF1000984773683862002100200122C3F824A0CA +:10DF200083F832A01A86C3E90A013046FEF751FE93 +:10DF30003046BDE8F047FEF792BEBDE8F08700BF6F +:10DF400040420F0010B50446FFF77AFFFFF7A0FA32 +:10DF50002046FEF73EFE6368D3E90A01FFF784FA24 +:10DF600010BD2DE9F8430C4680468869FFF7EAFFAB +:10DF7000D4E90A59461B61EB0907002F08BFB6F523 +:10DF80007A7F2AD3002F08BFB6F5FA6F28D3002E68 +:10DF90004FF47A72304677F101034FF00003B4BFBB +:10DFA000002139460CF04EFB4FF47A760023A36330 +:10DFB000A0FB0623551906FB013343EB0903C4E913 +:10DFC0000A53D4E90C32C318404642EB0101C4E9BC +:10DFD0000C31C8E90031BDE8F88300200146E3E7D1 +:10DFE00001200021E0E700002DE97043154E35685F +:10DFF0002DBB154C4FF0000814484FF00009144B8E +:10E00000A0612360C4E90289C4E90455FFF718FF41 +:10E01000FFF73EFA0F4B104A1A60FFF725FA0F4B35 +:10E02000A0692360FFF78EFF84F840503460C4E994 +:10E030000801C4E90A01C4E90C89C4E90E55306835 +:10E04000BDE8708328270224E0260224A4AC01083E +:10E050005CA90108F00A022471CB000840B3010852 +:10E06000F8B54B6915460C469B1A002BACBFD3186C +:10E07000131C4B6103898B80FFF70AFA0246036881 +:10E080006BB35E696169771A002F24DB8E4226D15B +:10E090009B68A36013B104F108011961136821465C +:10E0A000002641F80C3F9E6019611460836A22616A +:10E0B0006BB190F8242052B10268A24207D1E26805 +:10E0C0002AB96169C06A491B21EAE1719847BDE834 +:10E0D000F840FFF7C9B903F108029B68D0E7A360D5 +:10E0E00013B104F1080119610023E360DDE738B5DD +:10E0F000856900F10804FFF7CBF96A6853689C4210 +:10E1000009D1436928465360FEF7A9FDBDE83840B0 +:10E11000FFF7AAB91346002BF8D0DA689442F9D178 +:10E120004269DA60F2E70000F8B50F4B00260027DD +:10E13000002504460360C0E90267C0E904550B48A6 +:10E14000A061FFF77DFEFFF7A3F9094B094A1A60AA +:10E15000FFF78AF901232046656384F83830064BBF +:10E16000C4E908672360F8BD5CA90108A4AC0108F4 +:10E17000F00A022471CB000834B3010884B0F8B56A +:10E18000044607A8DDE90C6704F1280580E80E00C5 +:10E19000FFF77EF90FC885E80F002046FFF7A7FFBD +:10E1A000A069C4E90867FFF7CDFE8219204641EB5C +:10E1B0000703FFF72EFABDE8F84004B0FFF754B9A3 +:10E1C000F8B504460E4615460021202268301F4649 +:10E1D0000AF05CFB94F86030721C84F8683016BF5B +:10E1E0000023012384F8696084F86A3094F8613070 +:10E1F00084F86C3094F8623084F86D306B1C16BF74 +:10E20000002301232567013784F8743094F86330C4 +:10E2100084F8783094F8643084F8793016BF00239D +:10E220000123E36784F88030D4F8883084F88430A0 +:10E2300094F8653084F88530F8BD0000024B0A463A +:10E2400000211B68184700BF100100242DE9F04F82 +:10E2500000F10803D3B004934AAB059300F12803FF +:10E260000693DDE9043253F8040B42F8040B0698D8 +:10E270009842F8D10AAA01F140004B78043111F814 +:10E28000044C1B0443EA046311F8014C234311F8C6 +:10E29000024C884243EA042342F8043BEDD1509BF0 +:10E2A0000DF1200BA2480093DE46DDF844C1814603 +:10E2B000DDF838A14F9E0190DDE94A72DDE94C316D +:10E2C0004FEAFA25DEF80840D9F800000EF1200EDA +:10E2D00085EABA1509F120092044009C85EA7A658F +:10E2E00005440098704000EA0A00604047EA0204D2 +:10E2F00005444FEA77301C40AC4480EAB70007EA97 +:10E30000020580EAB75061442C4359F81C5C044470 +:10E310005EF8140CA44405448AEA060400980CEA4A +:10E32000070805440C404FEAF120744080EAB11020 +:10E3300025444CEA070480EA7160144028444FEAFF +:10E340007C3544EA080485EABC05034485EABC55EB +:10E35000254459F8184C05445EF8100C04444CEA66 +:10E360000500264481EA0A0438401C4084EA0A0871 +:10E3700006EB08044FEAF3260CEA050886EAB31612 +:10E3800040EA080086EA736626444FEA753484EA58 +:10E39000B504324484EAB554044459F8140C3444A6 +:10E3A0005EF80C6C304445EA0406824481EA0300BE +:10E3B00006EA0C06104080EA01080AEB08004FEA62 +:10E3C000F22A8AEAB21A8AEA726A82444FEA7430FE +:10E3D0000AEB070880EAB40005EA040780EAB450B3 +:10E3E0003E435EF8087C304459F8106C50443E447B +:10E3F00083EA020A31444FEAF8260AEA080A44EAA4 +:10E40000000786EAB8168AEA030A2F4086EA786689 +:10E41000514404EA000A0E444FEA703147EA0A0701 +:10E4200082EA080A81EAB001B44481EAB0510AEAFA +:10E430000C0A39445EF8047C8AEA020A314459F82D +:10E440000C6C3E4400EA010733444FEAFC2686EA9E +:10E45000BC16534486EA7C661E44AB1940EA0105AB +:10E4600000934FEA7133254083EAB1033D4383EAC9 +:10E47000B1532B4459F8085C3344DEF8006035444E +:10E48000009E154488EA0C02324082EA0807EA1925 +:10E490004FEAF62501EA030785EAB61585EA7665AF +:10E4A00015444FEA7332661941EA030482EAB30263 +:10E4B000044082EAB3523C43224459F8044C2A44B3 +:10E4C000DEF804502C444FEA7235A044009C85EAE3 +:10E4D000B2058CEA0404344084EA0C0708EB070414 +:10E4E0004FEAF62843EA020788EAB6180F4088EA9E +:10E4F0007668444485EAB25803EA020500EB040A50 +:10E5000018A83D437045454404EB05077FF4D8AE99 +:10E510000098CDF844C1CDF838A1CDE94F6038A8B6 +:10E52000CDE94A72CDE94C31CDE90845079001E0CB +:10E5300010AE0108DBF840000BF1200B5BF8145C17 +:10E540004FEAF04E5BF8184C4FEAB5488EEA704E31 +:10E5500088EAF5188EEA902EDBF80C0088EAD508D8 +:10E5600020444FEAFA24864484EABA140EEB0800E9 +:10E5700084EA7A6E009C03907440009804EA0A04CE +:10E58000444001987444006C8AEA060E2044039CBF +:10E590002044CBF8284007EA0204844447EA0200FA +:10E5A00001EB0C084FEA7731184081EAB7010EEA17 +:10E5B000080E20435BF8104C81EAB7518EEA060E34 +:10E5C0008AEA08090844DBF8241084444FEAF14041 +:10E5D00080EA714080EA9120DBF8101029444FEA6C +:10E5E000B44585EAF4150144019885EAD405406CE8 +:10E5F0002944009D28444FEAF825CBF82C10084404 +:10E6000085EAB815864485EA786505EB0E004FEA81 +:10E610007C3507EA0C0E034485EABC05009347EA03 +:10E620000C0385EABC55134043EA0E035BF80CEC7F +:10E630001D44039B05444FEAF34080EA734080EA9F +:10E640009320DBF8143023444FEABE44034400987F +:10E6500084EAFE1409EA0009019884EADE04806C69 +:10E6600089EA0A09234430444FEA7536CBF8303042 +:10E67000184486EAB5068144009886EAB5564FEA02 +:10E68000F02484EAB01484EA706404EB09004CEAD4 +:10E69000050402443C4002920CEA050214435BF874 +:10E6A000082C344404444FEAF14080EA714080EA87 +:10E6B0009121DBF818008644029871444FEAB24E6B +:10E6C0008EEAF21E8EEAD20E8E44009988EA01018B +:10E6D00001400198CBF834E0C66C81EA0801029849 +:10E6E00056444FEA743A4FEAF02076448AEAB40A74 +:10E6F0003144029E8AEAB45A80EAB61080EA766013 +:10E70000461845EA040005EA040100EA0C0007EB9C +:10E71000060908434FEAF34181EA7341504481EA14 +:10E720009323DBF81C1030445BF8046C0A44029914 +:10E7300013444FEAB64282EAF61282EAD6021A443B +:10E74000009B83EA01074FEAF921CBF8382007EA5A +:10E75000090781EAB9115F40019B81EA79611B6D6C +:10E760001344434404EA00081F44CB1944EA000759 +:10E770004FEA70312F409C4481EAB00147EA080714 +:10E78000DBF8008081EAB05139444FEAFE47194472 +:10E7900087EA7E47DBF8203087EA9E2E9F194FEAF2 +:10E7A000B843009E83EAF813774483EAD8031F44F2 +:10E7B000029B83EA090ECBF83C700EEA0C0E8EEA3F +:10E7C000030E019B5B6D3B4433449E444FEAFC23A4 +:10E7D00083EABC1383EA7C6303EB0E0600EA010EB6 +:10E7E000AB1940EA010500934FEA7133254083EAF3 +:10E7F000B10345EA0E05DBF804E083EAB1532B448C +:10E80000DBF8245033444FEAF24686EA724686EA41 +:10E81000922205EB080689EA0C0816444FEABE422C +:10E8200082EAFE1282EADE021644009A08EA020830 +:10E83000019ACBF84060956D88EA0908029A354440 +:10E84000009E1544009A4FEAF222454401EA03086B +:10E8500082EAB61282EA766215444FEA733266198A +:10E8600041EA030482EAB302044082EAB35244EA72 +:10E87000080422444FEAF74484EA77442A44DBF848 +:10E88000085084EA9727039CA6444FEAB54484EADB +:10E89000F514774484EAD505009C8CEA040E019CAB +:10E8A0003D44E76D0EEA060E4FEAF624CBF84450DD +:10E8B0002F448EEA0C0E84EAB6144F444FEA7235A8 +:10E8C00084EA7664774485EAB2053C4443EA020769 +:10E8D00085EAB25E03EA020500EB040A01980F40E4 +:10E8E00020303D43019007987544584504EB0507D7 +:10E8F0007FF420AE0098CDF844C1CDF838A1CDE921 +:10E900004F60CDE94A72CDE94C31CDE90845049B11 +:10E9100005991B6851F8042B1344049A059142F899 +:10E92000043B069B04929342F1D108A84FF49471E2 +:10E93000FFF784FC002053B0BDE8F08F2DE9F843C9 +:10E94000036805460E46144603F03F079B18036014 +:10E9500022BF4368013343609FB1C7F1400991452D +:10E960000FD800F128084A4608EB070009F080FF9D +:10E9700041462846FFF76AFCB0B9403C4E443C444F +:10E980000746264404E02846FFF760FC60B9403C97 +:10E990003F2CA6EB0401F6D844B105F1280022462D +:10E9A000384409F065FF0020BDE8F8832046FBE706 +:10E9B00010B458B104684CB12479053C012C05D839 +:10E9C00042B140685DF8044BFFF7B8BF02485DF8FC +:10E9D000044B70471046FAE700AFFFFF38B50368F5 +:10E9E000044663B1856855B1FEF7DCF940B9236888 +:10E9F000294620469A79BDE83840FFF7D9BF01483B +:10EA000038BD00BF00AFFFFF036803F03F035A1C8F +:10EA1000034470B5382A0D4600F128064FF08001F6 +:10EA2000044683F8281006EB020061D8C2F13802D0 +:10EA3000002109F02BFF2046D4E900315A0FDB00FA +:10EA400042EAC10231461BBA12BA63662266FFF778 +:10EA5000FDFB00284BD1E37A2B7063896B70A368B0 +:10EA60001B0AAB70A368EB70E37B2B71E3896B71BE +:10EA7000E3681B0AAB71E368EB71E37C2B72638A7A +:10EA80006B7223691B0AAB722369EB72E37D2B73F4 +:10EA9000E38A6B7363691B0AAB736369EB73E37E91 +:10EAA0002B74638B6B74A3691B0AAB74A369EB743F +:10EAB000E37F2B75E38B6B75E3691B0AAB75E36929 +:10EAC000EB7594F823302B76638C6B76236A1B0AE4 +:10EAD000AB76236AEB76A36E4BB994F827302B778D +:10EAE000E38C6B77636A1B0AAB77636AEB7770BD65 +:10EAF0000021C2F1400209F0C9FE31462046FFF76D +:10EB0000A5FB0028F3D101463822304691E70000EA +:10EB100040B1036833B11B79053B012B02D8406833 +:10EB2000FFF772BF0048704700AFFFFF42F210735B +:10EB300099422DE9F04104460D4603D96FF00F00CC +:10EB4000BDE8F08146688E421AD2042128460BF0B7 +:10EB500041F907460028F1D0D4F80880B8F1000F39 +:10EB60000CD0B6004146324609F082FE1EB1314655 +:10EB70004046FFF763FBA06809F01EFEC4E9015799 +:10EB80000020DDE742F2107399422DE9F04105467D +:10EB90000C4603D96FF00F00BDE8F08146688E4245 +:10EBA00003D8BDE8F041FFF7C1BF731EFBB90133C5 +:10EBB00004219C4238BF1C4620460BF00BF9074647 +:10EBC0000028E7D0D5F80880B8F1000F0BD04146F7 +:10EBD000A20009F04DFEB10002D04046FFF72EFB27 +:10EBE000A86809F0E9FD0020C5E90147D4E7AA6853 +:10EBF00052F82320002ADAD1013BD7E70368F0B5A9 +:10EC0000044689B00D46F3B18668E6B169469F793E +:10EC1000FFF77EFFA8B92046FEF7C4F888B923683D +:10EC2000F11920469A79FFF7C3FE50B92368694667 +:10EC300020465A79FFF7BCFE18B929462046FFF74F +:10EC400067FF09B0F0BD0148FBE700BF00AFFFFF61 +:10EC500010B404682CB183681BB15DF8044BFFF756 +:10EC6000A7BE02485DF8044B704700BF00AFFFFF2E +:10EC70002DE9F0410E4688B017460546002852D0CF +:10EC80000368002B4FD08268002A4CD09B79BB428E +:10EC900013D2FEF787F8044688BB3A463146284629 +:10ECA000FFF786FE044650BB69462846FFF730FF53 +:10ECB000044620BB2B686E465F792B683621D5F859 +:10ECC0000880013E9A794046474408EB020409F067 +:10ECD000DDFD2B685C2120469A7909F0D7FD43467B +:10ECE000601E9F4213D12846FEF75CF8044630B9F7 +:10ECF0002B68414628469A79FFF75AFE04462021A0 +:10ED00006846FFF79BFA204608B0BDE8F08116F888 +:10ED1000011F1A784A4003F8012B10F8012F3178AF +:10ED20004A400270DDE7014CEDE700BF00AFFFFF96 +:10ED300010B50446F0B10368E3B1406848B11B79EF +:10ED4000053B012B02D86C21FFF778FA606809F0C7 +:10ED500033FDA06840B123689B7959000BB1FFF7E0 +:10ED60006DFAA06809F028FD20460C21BDE810408E +:10ED7000FFF764BA10BD2DE9F04705688AB08246F6 +:10ED80000E46174605B16D7976B3002F14BF4FF0CC +:10ED900002084FF0010800230AF10C098DF8043035 +:10EDA0005046FFF71BFE0446B0B92A464946504676 +:10EDB000FFF74EFF044678B9012201A95046FFF73C +:10EDC00047FF044640B9B8F1020F10D002A95046DF +:10EDD000FFF714FF044698B102A82021FFF72EFA8E +:10EDE00020460AB0BDE8F0874FF00108D3E73A4665 +:10EDF00031465046FFF72CFF04460028E6D0EBE7EB +:10EE00002A4602A95046FFF733FF04460028E3D103 +:10EE10002A4649465046FFF71BFF04460028DBD12F +:10EE200049465046FFF7EAFE04460028D4D19DF833 +:10EE300004300133DBB243458DF80430B0D3CBE767 +:10EE40002DE9F843066804460F46154606B1767963 +:10EE5000B5F5806F3BD8E36B63B904F10C09BDB91C +:10EE60002A4629462046FFF786FF78B9E36A013330 +:10EE7000E3620BE0636B012B03D0E26AA36B9A425F +:10EE8000EBDD2046F3F74DFF0028E6D0BDE8F88320 +:10EE9000AE422046B04628BFA846FFF79FFD002897 +:10EEA000F4D1324649462046FFF7D2FE0028EDD184 +:10EEB00049462046FFF7A2FE0028E7D138464246E1 +:10EEC00049464744A5EB080509F0D2FCC7E76FF0B7 +:10EED0000200DBE700230122C0E90433C0E900237C +:10EEE000C0E90232C0E906230362704738B5002446 +:10EEF0000125014604704462C0E90154C0E903459C +:10EF0000C0E90544C0E907542830FFF7E3FFC1E931 +:10EF10001354C1E91544C1E91744C1E91944C1E9D1 +:10EF20001B44C1E91D4438BD036B2BB1C36B002BDF +:10EF30000CBF022001207047184670470246436804 +:10EF400030B523B9486858B9002B38D131E0906802 +:10EF500000EB830050F8040C0028F3D1013BF0E7EC +:10EF60008C6804EB800555F8045C25BB0138EAE7A2 +:10EF70008342096801D2484222E01068002803DD7C +:10EF8000002913DA01201BE000290FDD70B14FF0DA +:10EF9000FF3015E0916851F8235054F823108D424A +:10EFA0000ED803F1FF3302D2404209E0013B591C65 +:10EFB000F0D1002004E0002BDAD08342D8D91068C9 +:10EFC00030BD1FB581EAE173CDF80CD0A3EBE1733E +:10EFD00000934B1C4FF0010318BF012102930191D4 +:10EFE00001A9FFF7ABFF05B05DF804FBF8B50446D7 +:10EFF00008466368B2EB830F4FEA83051CD9521BA6 +:10F000008E18002109F042FC2A4630468118002360 +:10F010009A4213D10020F8BD03F0030123F0030C42 +:10F02000A768CE0057F80C10F14011F0FF0F11D176 +:10F030000133AB42F0D1E9E71346FAE703F00300EE +:10F0400023F00306A7680133C500B859E84001F86A +:10F05000010DDDE76FF00700DDE70000422AF0B5A3 +:10F06000064693B00846154626D801A9FFF7BEFF0D +:10F070000446C8B911493046F3F70CFE044698B966 +:10F0800006F10C07202230463946FFF7F1FD044611 +:10F0900050B920220121384609F0F8FB2A4601A97F +:10F0A0003046FFF768FE04461DB1294601A8FFF768 +:10F0B000C5F8204613B0F0BD014CF6E79CAC010842 +:10F0C00000B3FFFF0246406880B1431E926873B9E7 +:10F0D00052F8231000204FF00042114203D10130BA +:10F0E00052082028F9D10133C0EB4310704752F881 +:10F0F00023100029ECD1013BE9E7000038B5144AA0 +:10F100000125144B0446C26043660823124A8363F8 +:10F110004262124A45644265114AC0E90153C0E99E +:10F120000753C0E91353C0E90A530E4BC0E90F352A +:10F130000D4BC0E90C2583640430FFF7C3FFA065C5 +:10F1400004F14C00FFF7BEFFC4E91705002038BDED +:10F15000DCB3010809FB00085CB30108BCB301087B +:10F160007CB301089CB3010814010024F8B50446DF +:10F170000E464D0901F01F07FFF7A4FF63683044F6 +:10F18000B0EB431F05D81F2E0FD8002F3BD1002016 +:10F190000AE010F01F0118BF012101EB50112046B9 +:10F1A000FFF7C4FC0028EED0F8BD63686FF00300E1 +:10F1B0009A0068431946A942A2F104020BD8AB4257 +:10F1C0004FF0000228BF2B469B00043B191DDCD0EA +:10F1D000A168CA50F9E7A668013906EB020C5CF891 +:10F1E00000C046F802C0E6E7A06850F8251001FA12 +:10F1F00007F3134321FA06F240F82530013563681E +:10F20000AB42F1D8C3E70022C7F12006F7E7436815 +:10F21000B1EB431F3FBF4A09836801F01F0153F858 +:10F2200022003ABF20FA01F101F0010000207047EE +:10F23000F8B507460D46FFF777FE022806461DD1B2 +:10F2400000212846FFF7E3FF60BB01212846FFF7B6 +:10F25000DEFF044630BB2846FFF734FFFB6D013864 +:10F2600098421FD1FE2807D131462846FFF7CFFF2D +:10F270000D4B041E18BF1C462046F8BD01280FD1B7 +:10F2800001462846FFF79DFE00280BDB07F14C01E5 +:10F290002846FFF753FE0028034CB8BF0024EBE7D5 +:10F2A000024CE9E7004CE7E780B3FFFF80B0FFFFC7 +:10F2B00070B50E4601210446FFF738FC054648B9F3 +:10F2C00062680146A068920009F0E0FAA3681E6037 +:10F2D00001232360284670BD10B501210446FFF7C5 +:10F2E000E7FF60B9012104F10C00FFF7E1FF30B93D +:10F2F000014604F11800BDE81040FFF7D9BF10BD6A +:10F30000F0B443684E0901F01F04B34201D304D1A5 +:10F310005CB30021F0BCFFF7CBBF1F2927D804BB8B +:10F320000020F0BC704782685759043542F82170BC +:10F3300001319A1B8A42F6D800219342EFD98568A1 +:10F3400045F822100132F8E7866856F8235025FA6E +:10F3500004F20A4305FA07F146F82320013BF3D2F1 +:10F36000DEE70021C4F12007F8E71F29D8D9B5004E +:10F370000021DEE78842F8B506460D46144601D165 +:10F380000020F8BD4968FFF7D1FB0028F9D171686A +:10F390002846FFF7CBFB0028F3D1624231682243B5 +:10F3A0002C68C2F3C012C2F1010303FB01F7514301 +:10F3B00004FB027434602C6804FB0311296071683B +:10F3C0008842DDD2D6F808C0AF685CF8201057F844 +:10F3D000204003FB01FE514304FB02E44CF82040B3 +:10F3E00057F8204004FB031147F820100130E6E7EE +:10F3F0002DE9F0410D46496806461446FFF796FB95 +:10F40000B8B96242296833682243D5F804E0D5F8D8 +:10F410000880C2F3C0125143C2F1010C03FB0C136C +:10F42000B168336003469E4505D16B6872689A42A5 +:10F430000CD8BDE8F08158F8237051F823405743A9 +:10F4400004FB0C7441F823400133ECE751F823200E +:10F450000CFB02F241F823200133E7E710B5044624 +:10F4600070B1806838B16168890001D0FEF7E6FEAE +:10F47000A06809F0A1F900230122A360C4E90023D8 +:10F4800010BD10B50446FFF7E9FF04F10C00FFF7CB +:10F49000E5FF04F11800BDE81040FFF7DFBF08B139 +:10F4A000FFF7EFBF704770B5044660B3036E012BE2 +:10F4B00012D00430FFF7D2FF04F11000FFF7CEFFA7 +:10F4C00004F11C00FFF7CAFF04F12800FFF7E7FF73 +:10F4D00004F14C00FFF7C2FF636F8BB920467C211B +:10F4E000BDE87040FEF7AABE06FB05000135FFF738 +:10F4F000D6FFD4E91D03AB42F6D809F05DF9EDE77C +:10F5000000252426F5E770BD2DE9F84311F0030628 +:10F5100099464368054618BF01260F46904606EBFC +:10F520009106B34208D100212846FFF7C1FE0446E8 +:10F5300088B12046BDE8F883FFF790FF0023012241 +:10F5400031462846AB60C5E90023FFF7EFFA0446D1 +:10F550000028E8D0EDE7C7EB8603A9683A4648469D +:10F560001944C04704460028E3D13146A868FDF796 +:10F57000FFFEDEE72DE9F04112F003064368044682 +:10F58000884618BF0126174606EB9206B34208D1FB +:10F5900000212046FFF78CFE054688B12846BDE8CD +:10F5A000F081FFF75BFF0023012231462046A36074 +:10F5B000C4E90023FFF7BAFA05460028E8D0EDE7D2 +:10F5C000B8F1000FEAD0A368C7EB860041463A467F +:10F5D000184409F04DF93146A068FDF7C9FEDDE792 +:10F5E0002DE9F84381460D4690461E461BB94D4C09 +:10F5F0002046BDE8F8830430FFF764FDC41D48468B +:10F60000FFF792FC02284FEAD40765D1BE42EED143 +:10F6100016F003016B6818BF012101EB54149C42E2 +:10F620004AD100212846FFF743FE04460028DFD1D7 +:10F63000A968E20018F8043024F00300013402F055 +:10F640001802A74203FA02F20B5843EA02030B50D6 +:10F65000EFD805F10C00FFF701FF99F80030092BF6 +:10F6600012D1FB006A68013BB3EB421F0CD2580970 +:10F67000A968012203F01F0302FA03F351F82020C6 +:10F6800022EA030241F82020012105F11800FFF7CA +:10F690000FFE04460028ABD14846FFF745FC012881 +:10F6A0008146A5D198F80030C3B9012E9FD12846D4 +:10F6B000BDE8F843FFF710BE2846FFF7CFFE002352 +:10F6C000012221462846AB60C5E90023FFF72EFA48 +:10F6D00004460028A5D08BE7134CDDE7042B1FD18F +:10F6E0007B000133B34282D13A4608F1010128463A +:10F6F000FFF740FF044600287FF47AAF791C3A46B2 +:10F7000005F10C004144FFF735FF044600287FF463 +:10F710006FAF494605F11800BDE8F843FFF7C8BDD3 +:10F72000014C65E780B0FFFF80B1FFFF884270B5F4 +:10F7300005460E4603D04C683CB9FFF78FFE00200B +:10F7400011E0B36853F8243013B9013C002CF8D110 +:10F7500001346A683368A2422B6005D221462846EC +:10F76000FFF7E4F940B170BD121BA86800219200B8 +:10F7700000EB840009F08AF8A200B168A86809F0DB +:10F7800077F8DCE738B504460D46FFF7CFFF70B9D0 +:10F7900005F10C0104F10C00FFF7C8FF38B905F1C1 +:10F7A000180104F11800BDE83840FFF7BFBF38BDAD +:10F7B0002DE9F04F002389B0174688424FF001022F +:10F7C0008146884607930493CDE90523CDE90223BA +:10F7D00006D105A8FFF7AAFF064690BB0DF1140855 +:10F7E000B94506D1494602A8FFF7A0FF064640BB2F +:10F7F00002AFD8F804A0BAF1000F2CD17C68ACBBE2 +:10F800000AEB04014846FFF791F90646C8B90146DC +:10F810004846FFF74DFD064698B96FF00F034FEAD3 +:10F820001A1B04F1FF3C03FB0BABABF10803019384 +:10F83000BCF1FF3F23D1D8F800203B685343C9F8FF +:10F84000003002A8FFF70AFE05A8FFF707FE3046C2 +:10F8500009B0BDE8F08FD8F8083003EB8A0353F8FD +:10F86000043C002BCAD10AF1FF3AC4E7BB6803EBA2 +:10F87000840353F8043C002BC2D1013CBFE7BA68B3 +:10F880000024D9F8083052F82CE05246D8F8085035 +:10F8900003EB8C030F2A48D8BBF1070F40F2B78067 +:10F8A00055F8040B1968EEFB601443F8041B55F877 +:10F8B000040B1968EEFB601443F8041B55F8040BA5 +:10F8C0001968EEFB601443F8041B55F8040B196823 +:10F8D000EEFB601443F8041B55F8040B1968EEFBAB +:10F8E000601443F8041B55F8040B1968EEFB601410 +:10F8F00043F8041B55F8040B1968EEFB601443F839 +:10F90000041B55F8040B1968EEFB601443F8041B44 +:10F91000019A002A7DD11A68141943F8044B4FF05C +:10F920000104F8D20CF1FF3C82E7103A55F8040BC1 +:10F930001968EEFB601443F8041B55F8040B1968B2 +:10F94000EEFB601443F8041B55F8040B1968EEFB3A +:10F95000601443F8041B55F8040B1968EEFB60149F +:10F9600043F8041B55F8040B1968EEFB601443F8C8 +:10F97000041B55F8040B1968EEFB601443F8041BD4 +:10F9800055F8040B1968EEFB601443F8041B55F896 +:10F99000040B1968EEFB601443F8041B55F8040BC4 +:10F9A0001968EEFB601443F8041B55F8040B196842 +:10F9B000EEFB601443F8041B55F8040B1968EEFBCA +:10F9C000601443F8041B55F8040B1968EEFB60142F +:10F9D00043F8041B55F8040B1968EEFB601443F858 +:10F9E000041B55F8040B1968EEFB601443F8041B64 +:10F9F00055F8040B1968EEFB601443F8041B55F826 +:10FA0000040B1968EEFB601443F8041B42E75A46E6 +:10FA10007FE7013A55F8040B1968EEFB601443F8D0 +:10FA2000041B76E71FB50123009201AACDF80CD084 +:10FA3000CDE90133FFF7BCFE05B05DF804FB2DE90D +:10FA4000FF411646002301220546B0420F460393AC +:10FA5000CDE9012306D1014601A8FFF767FE044660 +:10FA600020BB01AEBD421AD101232B60D6E901377C +:10FA70001BBBAA680024161F2046984225D1ACB1B2 +:10FA80004FF0FF30696899423AD952F8231099B380 +:10FA900052F823100024013942F8231006E03946B9 +:10FAA0002846FFF743FE04460028DDD001A8FFF7F3 +:10FAB000D5FC204604B0BDE8F08107EB830252F884 +:10FAC000042C002AD5D1013BD2E756F804EFAEEB67 +:10FAD0000401316057F820C001306145A1EB0C01F1 +:10FAE0002CBF4FF000084FF001083160A6452CBF35 +:10FAF000444608F10104C0E742F823000133C1E79E +:10FB0000C6D16FF00904D1E730B58FB009230122C7 +:10FB10000021044605A88DF803100490CDE90223C6 +:10FB2000242208F0B3FE10212046FEF7FFFF054611 +:10FB3000002840F02982A36801A81A68196A019276 +:10FB40000DF10302FDF79FF9A3680DF1030201A86F +:10FB5000596AFDF798F9A3680DF1030201A8D96A63 +:10FB6000FDF786F9A3680DF1030201A8196BFDF7F3 +:10FB70007FF9A3680DF1030201A8596BFDF778F92D +:10FB8000A3680DF1030201A8996BFDF771F9019AC1 +:10FB9000A3681A600DF103029DF903105B68002948 +:10FBA0008DF80350019380F2F281494201A8FDF7DC +:10FBB0005FF9A3680DF1030201A8596AFDF763F923 +:10FBC000A3680DF1030201A8996AFDF75CF9A36827 +:10FBD0000DF1030201A8196BFDF74AF9A3680DF1B5 +:10FBE000030201A8596BFDF743F9A3680DF1030265 +:10FBF00001A8996BFDF73CF9A3680DF1030201A878 +:10FC0000D96BFDF735F9019AA3689DF903105A6085 +:10FC10000DF103029B680193002399428DF8033094 +:10FC200080F2B981494201A8FDF722F9A3680DF1DC +:10FC3000030201A8996AFDF726F9A3680DF10302F2 +:10FC400001A8D96AFDF71FF9A3680DF1030201A805 +:10FC5000596BFDF70DF9A3680DF1030201A8996B2B +:10FC6000FDF706F9A3680DF1030201A8D96BFDF7B2 +:10FC7000FFF8019AA3689DF903109A600DF1030241 +:10FC8000DB680193002399428DF8033080F287816D +:10FC9000494201A8FDF7ECF8A3680DF1030201A8A1 +:10FCA000D96AFDF7F0F8A3680DF1030201A8D96A3B +:10FCB000FDF7E9F8A3680DF1030201A8196BFDF740 +:10FCC000E2F8A3680DF1030201A8196BFDF7DBF858 +:10FCD000A3680DF1030201A8596BFDF7D4F8A368DE +:10FCE0000DF1030201A8D96BFDF7C2F8A3680DF16D +:10FCF000030201A8196AFDF7BBF8A3680DF103021E +:10FD000001A8596AFDF7B4F8019AA3689DF9031098 +:10FD1000DA600DF103021B690193002399428DF80B +:10FD2000033080F24081494201A8FDF7A1F8A368A1 +:10FD30000DF1030201A8196BFDF7A5F8A3680DF1F9 +:10FD4000030201A8196BFDF79EF8A3680DF10302E9 +:10FD500001A8596BFDF797F8A3680DF1030201A8FC +:10FD6000596BFDF790F8A3680DF1030201A8996B98 +:10FD7000FDF789F8A3680DF1030201A8596AFDF7A0 +:10FD800077F8A3680DF1030201A8996AFDF770F8EE +:10FD9000019AA3689DF903101A610DF103025B69D2 +:10FDA0000193002399428DF8033080F2008149428B +:10FDB00001A8FDF75DF8A3680DF1030201A8596BD6 +:10FDC000FDF761F8A3680DF1030201A8596BFDF777 +:10FDD0005AF8A3680DF1030201A8996BFDF753F8D7 +:10FDE000A3680DF1030201A8996BFDF74CF8A36815 +:10FDF0000DF1030201A8D96BFDF745F8A3680DF1D9 +:10FE0000030201A8996AFDF733F8A3680DF1030214 +:10FE100001A8D96AFDF72CF8019AA3689DF903108F +:10FE20005A610DF103029B690193002399428DF8F9 +:10FE3000033080F2C080494201A8FDF719F8A36899 +:10FE40000DF1030201A8996BFDF71DF8A3680DF1F0 +:10FE5000030201A8996BFDF716F8A3680DF10302E0 +:10FE600001A8D96BFDF70FF8A3680DF1030201A8F3 +:10FE7000D96BFDF708F8A3680DF1030201A8996B8F +:10FE8000FDF701F8A3680DF1030201A8596BFCF717 +:10FE9000FAFFA3680DF1030201A8196AFCF7E8FF55 +:10FEA000A3680DF1030201A8596AFCF7E1FF019A6A +:10FEB000A3689DF903109A610DF10302DB690193B8 +:10FEC000002399428DF8033079DA494201A8FCF702 +:10FED000CFFFA3680DF1030201A8D96BFCF7D3FF94 +:10FEE000A3680DF1030201A8D96BFCF7CCFFA3684E +:10FEF0000DF1030201A8D96BFCF7C5FFA3680DF152 +:10FF0000030201A8196AFCF7BEFFA3680DF1030202 +:10FF100001A8996AFCF7ACFFA3680DF1030201A8E0 +:10FF2000D96AFCF7A5FFA3680DF1030201A8196BBC +:10FF3000FCF79EFFA3680DF1030201A8596BFCF7C3 +:10FF400097FF019BA1689DF90320CB6122EAE27330 +:10FF50000B6200230193082301336068984232D872 +:10FF6000002A11DA039B52420499204603F1804390 +:10FF7000013B41F82320224602A9FFF760FD054618 +:10FF800010B94FF0FF33236028460FB030BD01A8F1 +:10FF9000FCF779FF0DE601A8FCF775FF46E601A81E +:10FFA000FCF771FF78E601A8FCF76DFFBFE601A83A +:10FFB000FCF769FFFFE601A8FCF765FF3FE701A832 +:10FFC000FCF761FF85E7019841F82300C4E738B5E5 +:10FFD0000C46051D29462046FEF7B0FF002801DA31 +:10FFE000002006E02A4621462046FFF728FD00288B +:10FFF000F0D038BD90422DE9F04107460D46164637 +:020000040801F1 +:1000000002D0884229D1354601236E683B6066BB29 +:1000100031463846FEF78AFD044618BBA9680546F6 +:10002000BB6886422AD103EB8603DDB17A6806F10C +:100030000108B24208D841463846FEF777FD00284D +:100040002FD1BB6803EB86031A684646551943F85F +:10005000045B2CBF01250025E7E7FFF767FB04469B +:100060000028D0D02046BDE8F081AB6803EB8603C2 +:1000700053F8043C002BCBD1013EC8E753F82020B5 +:1000800012EB050C51F820202CBF012500251CEB9C +:10009000020243F820202CBF012200220130154427 +:1000A000BFE70446DEE7F8B50D68044613680F465F +:1000B00016466B43002B16DD11463846FCF7EEFE64 +:1000C000002806DB324639462046FFF7B8FC40B12F +:1000D000F8BD3A4631462046FFF7B1FC0028F7D17B +:1000E0006D422560F4E7FFF785FFF0E77FB5002359 +:1000F00001F10C0516460122011D01A80393CDE96B +:1001000001232A46FFF7CFFF044668B90146284677 +:10011000FEF757FF01A900280CBF002206F00102DC +:100120002846FFF765F9044601A8FFF797F920462E +:1001300004B070BD2DE9F74F9DF8308006460D469E +:100140001F46C8F3450902F10C044FF0000B01F102 +:100150000C0ABB4508D14FEAD8122946304603B0F5 +:10016000BDE8F04FFFF7C2BF5FFA8BF2A4F10C01BC +:100170002846A2EB09035A425A410192FFF738F987 +:1001800048B92146019A50460BF1010B2434FFF780 +:100190002FF90028DDD003B0BDE8F08FF8B50D6869 +:1001A000044613680F4616466B4316D5114638466B +:1001B000FCF774FE002806DB324639462046FFF77E +:1001C0003EFC40B1F8BD3A4631462046FFF737FCC9 +:1001D0000028F7D16D422560F4E7FFF70BFFF0E749 +:1001E00038B50C46054611461A462046FFF7D6FF9D +:1001F00028B921462846BDE83840FFF7E8BE38BD9B +:1002000070B50C46064611461A462046FFF74BFFCE +:10021000054680B904362368002B0CDA00212046FD +:10022000FEF7CFFE30B1324621462046FFF7B6FF3B +:100230000028F0D00546284670BD2DE9F04F06464F +:100240009BB08946104600219046FEF7BAFE002872 +:10025000C0F29B8105D16FF00B0420461BB0BDE8B6 +:10026000F08F00230125414648461495CDE90853F7 +:10027000CDE90A35CDE90C33CDE90E53CDE9103582 +:10028000CDE912330323159317AB1693FCF706FE43 +:10029000002817DA36B149463046FFF747FA0446D8 +:1002A000002846D100213046FEF78BFE0028C0F220 +:1002B0005B8141463046FEF741FE002880F25B81BB +:1002C0000024CAE7494608A8FFF730FA044680BB75 +:1002D00041460BA8FFF72AFA044650BBD9F8041090 +:1002E0000EA80B9502310895FEF720FC044600BBD2 +:1002F00001460EA8FEF7DCFF0446D0B9022111A882 +:10030000FEF714FC0446A0B90BA8FEF7DBFE00F0D4 +:100310001F001F2820D0C0F11F0708A83946FEF78C +:1003200025FF044628B939460BA8FEF71FFF0446EF +:1003300098B108A8FFF792F80BA8FFF78FF80EA85E +:10034000FFF78CF811A8FFF789F80C2117A8FDF723 +:1003500075FF002CA6D080E72746099D0BA8DDF885 +:1003600030B0A5EB0B034FEA431A01935146FEF759 +:10037000FDFE04460028DCD1019B9B000BA908A8C8 +:100380000193FEF7DBFD0028019B36DA51460BA8EE +:10039000FEF7B6FF04460028CBD10BF1FF3305F181 +:1003A000FF3A05F1804501939B00013D03930BF15A +:1003B0008043A5EB0B05023BAD009B000793019B1F +:1003C000534529D3002EB4D0394608A8FEF798FF2C +:1003D00088B9D9F8003008A930460893FFF7A6F984 +:1003E0000146002840F0BE803046FEF7EAFD0028B6 +:1003F0009FD10123336004469BE710990193CA58AB +:100400000132CA5008A90BAA0846FFF74CFE019B0F +:1004100004460028B2D08CE7DDF828B04FEA8A0302 +:10042000039A04930BEB8A035BF82A1006930D9B47 +:100430009A58049B9142A3F104030593109B03EB8C +:100440000500029075D34FF0FF325A51BAF1010FF7 +:10045000029A16BF069B002353F8083C1793059B8E +:100460005BF803301893049B5BF803301993029BED +:100470001B6801331360109A002111A85359013BE6 +:100480005351FEF715FF0028B5D1019B0D9A002BA3 +:1004900066D0079BD158139B19600399525811A934 +:1004A0005A600846109B5A59FFF7BCFA0028A2D19F +:1004B00014A911A8FEF742FD0028DCDC109B0BA953 +:1004C00011A85A59FFF7AEFA002894D14FEAC50B8C +:1004D00011A85946FEF74AFE00288CD108A911AA96 +:1004E0000846FFF7E0FD014600283BD108A8FEF7CB +:1004F00068FD002819DA0BA911A8FFF717F90028E1 +:100500007FF479AF594611A8FEF730FE00287FF43A +:1005100072AF08A911AA0846FFF740FE00287FF431 +:100520006AAF109A5359013B53510AF1FF3A043D07 +:1005300045E7059B5BF803007AB100230AF082F8D7 +:100540000B46002102464FF0FF30994208BF90420F +:1005500000D20246029B1A6078E74FF0FF32F9E7BB +:10056000019998E70C46E4E6424631463046FFF7EB +:1005700015FE0446EDE6424631463046FFF793FD50 +:10058000044600283FF495AE67E66FF0090464E680 +:10059000F8B50C46064611461A462046FFF708F9FC +:1005A000054650BB776E37B9321D21462046BDE85F +:1005B000F840FFF742BE2368002B04DA01462046CC +:1005C000FEF7FFFC60BB2046FEF77CFDB36DB0EB91 +:1005D000430F25D82046B847054670B9043623682E +:1005E000002B04DA00212046FEF7EBFC38B9314637 +:1005F0002046FEF7A3FC00280ADA2846F8BD32465A +:1006000021462046FFF7CAFD0028E8D00546F4E75A +:10061000324621462046FFF712FA0028E7D0F5E7D8 +:10062000004DEAE780B0FFFF2DE9F0430E468BB0A6 +:100630000546012106F11800FEF7C3FC0446002818 +:1006400040F099802846FEF76FFC022807460FD13C +:100650003046FEF737FDEB6D07300733C008B0EBCF +:10066000D30F474B88BF1C4620460BB0BDE8F08334 +:10067000012840F0828021463046FEF7A2FC002887 +:1006800079DB06F10C0921464846FEF79AFC002862 +:1006900071DB05F1040830464146FEF74FFC0028A7 +:1006A00069DA41464846FEF749FC002863DA4B46C2 +:1006B0004A4601A92846CDE90174CDE90347CDE9B1 +:1006C0000544FFF765FF044600284DD13346324606 +:1006D00004A92846FFF75CFF0446002844D1AB6913 +:1006E000002B37D1032304A907AACDF824D0009307 +:1006F00001230846CDE90733FFF7D5FC044600285F +:1007000032D1049B002B19DB04AA3346284611463C +:10071000FFF73EFF044638BB04AA05F11C03284638 +:100720001146FFF75DFD0446F0B904A901A8FEF7E4 +:1007300005FC134B041E18BF1C4615E0002104A83D +:10074000FEF73FFC0028DFD004A942460846FFF729 +:1007500025FDD3E704AA05F1100328461146FFF74B +:100760003FFD04460028CFD001A8FEF777FE04A87D +:10077000FEF774FE78E7024C76E7024C74E700BFA0 +:1007800080B3FFFF80B0FFFF2DE9F04F876D85B08C +:1007900091469A4607370023012206460D46FF0878 +:1007A0004FF00C0800F1040B0393CDE901235346ED +:1007B0004A46394601A8FEF7A7FE0446F0B9594655 +:1007C00001A8FEF7BBFB00281FDAB8F1010821D011 +:1007D000012101A8FEF7F5FB0028E8DD01AB2A4660 +:1007E00029463046FFF7D4FE044638B905F1180211 +:1007F00001AB30461146FFF7CBFE044601A8FEF7D9 +:100800002DFE204605B0BDE8F08F012101A8FEF7BE +:1008100077FDD2E7004CF1E700B3FFFF2DE9F04F81 +:10082000876D87B091469A46073700230122054617 +:100830000E46FF084FF00C0800F1040B05930293DD +:10084000CDE90323CDE9002353464A46394603A8A0 +:10085000FEF75AFE0446B8BB594603A8FEF76EFBE6 +:1008600000283BDAB8F101083DD0012103A8FEF7CA +:10087000A8FB0028E8DD06F1180203AB2846114664 +:10088000FFF786FE0446F8B903AB694628461A46C8 +:10089000FFF77EFE0446B8B96B463246314628461D +:1008A000FFF776FE044678B903AB6A4669462846E8 +:1008B000FFF76EFE044638B906F10C026B46284677 +:1008C0001146FFF765FE044603A8FEF7C7FD68461C +:1008D000FEF7C4FD204607B0BDE8F08F012103A854 +:1008E000FEF70EFDB6E7014CEEE700BF00B3FFFFD9 +:1008F0002DE9F04100238CB00D4601210B930646F3 +:100900000893174605930293CDE90913CDE9061321 +:10091000CDE90313CDE900138369002B40F0DD809E +:1009200002F1180306A91A46FFF732FE0446002812 +:1009300040F0C38006AB3A4603A93046FFF750FCAF +:100940000446002840F0B98006AB3A466946304676 +:10095000FFF756FC0446002840F0AF806B4603AA20 +:1009600006A93046FFF714FE0446002840F0A58093 +:10097000032206A909A8FFF755F80446002840F00D +:100980009C8006F10408414609A8FEF7D7FA002822 +:1009900080F28A8007F10C0803A93046434642469C +:1009A000FFF7F6FD0446002840F0878003A9304693 +:1009B000F2F760F9044600287FD103AB3A4606A956 +:1009C0003046FFF7E5FD0446002876D106A93046FB +:1009D000F2F750F9044600286FD103AB6946304660 +:1009E0001A46FFF7D5FD0446002866D16946304611 +:1009F000F2F740F9044600285FD109AB03A930465D +:100A00001A46FFF7C5FD0446002856D103AA06ABD7 +:100A100030461146FFF7F4FB044600284DD103AAE7 +:100A200006AB30461146FFF7EBFB0446002844D1E5 +:100A300006AA03AB30461146FFF7E2FB0446002846 +:100A40003BD106AA09AB30461146FFF7A1FD04468B +:100A500098BB06AA6B4630461146FFF7D1FB044609 +:100A600058BB07F11803424669463046FFF790FD30 +:100A7000044610BB69463046F2F7FCF80446E0B97C +:100A800003A92846FEF752FE0446B0B906A905F1AF +:100A90000C00FEF74BFE044678B9694605F11800D4 +:100AA000FEF744FE044608E009A942460846FEF760 +:100AB000C6FF044600283FF466AF09A8FEF7CEFC47 +:100AC00006A8FEF7CBFC03A8FEF7C8FC6846FEF7B5 +:100AD000C5FC20460CB0BDE8F081134606A9FFF71F +:100AE00057FD04460028E8D1032206A909A8FEF70D +:100AF00099FF04460028E0D106F10408414609A800 +:100B0000FEF71CFA00282FDA06F1100800214046F3 +:100B1000FEF757FA00283FF43DAF07F1180306A986 +:100B200030461A46FFF734FD04460028C5D106AB0F +:100B300003A930461A46FFF72BFD04460028BCD116 +:100B4000434603AA06A93046FFF722FD04460028C3 +:100B5000B3D109AA06AB30461146FFF741FB044664 +:100B600000283FF417AFA8E709A942460846FEF758 +:100B700066FF04460028C1D09FE700002DE9F0433E +:100B800002F1180997B006460D46484600219046E6 +:100B90001F46FEF716FA40B939462846FEF7F2FD21 +:100BA0000446204617B0BDE8F0833B6A7BB107F1ED +:100BB000180400212046FEF704FA08B94146ECE784 +:100BC00001212046FEF7FDF9002840F0FF800023B8 +:100BD000012213A93046159312930F930C93099396 +:100BE00006930393CDE91323CDE91023CDE90D231B +:100BF000CDE90A23CDE90723CDE90423CDE901237B +:100C00004B464A46FFF7C4FC044600283AD14B46FF +:100C100013AA10A93046FFF7BBFC044690BB13AAE9 +:100C20003B4630461146FFF7B3FC044650BB10AAC2 +:100C300007F10C0330461146FFF7AAFC044608BB37 +:100C400013AA434630461146FFF7DAFA0446C8B9FC +:100C500010AA08F10C0730463B461146FFF7D0FAC0 +:100C6000044678B9014613A8FEF7ABF920BB21462C +:100C700010A8FEF7A6F9D8B9424629463046FFF734 +:100C800037FE044613A8FEF7E9FB10A8FEF7E6FBC3 +:100C90000DA8FEF7E3FB0AA8FEF7E0FB07A8FEF7A6 +:100CA000DDFB04A8FEF7DAFB01A8FEF7D7FB78E727 +:100CB0002846FEF711FBE4E713AB4A4601A930468C +:100CC000FFF766FC04460028DCD113AB0DA93046C3 +:100CD0001A46FFF75DFC04460028D3D113AB0DAADA +:100CE0000AA93046FFF754FC04460028CAD10DAAD1 +:100CF000434630461146FFF74BFC04460028C1D15D +:100D00000DA913A8FEF712FD04460028BAD113A9B5 +:100D10003046F1F7AFFF04460028B3D110AB07A966 +:100D200030461A46FFF734FC04460028AAD107AA29 +:100D300013AB30461146FFF763FA04460028A1D1F1 +:100D400007AA0AAB30461146FFF75AFA04460028B4 +:100D500098D10DAA07AB30461146FFF751FA044669 +:100D600000288FD10DAA10AB30461146FFF710FCBA +:100D70000446002886D10AAA3B4630461146FFF7B2 +:100D800007FC044600287FF47DAF0AAB0DAA04A936 +:100D90003046FFF735FA044600287FF473AF07A901 +:100DA0002846FEF7C3FC044600287FF46BAF04A975 +:100DB00005F10C00FEF7BAFC044600287FF462AF90 +:100DC00001A905F11800FEF7B1FC5AE7004CE8E66E +:100DD00080B0FFFF2DE9F0430646A3B00F46104652 +:100DE00001211546FEF7EDF8002840F3C4810023E9 +:100DF0004FF0010939461CA81893159312930F93CD +:100E00001B930C93099306930393CDE91693CDE9B5 +:100E10001393CDE91093CDE90D93CDE91993CDE965 +:100E20000A93CDE90793CDE90493CDE90193CDE988 +:100E30001C93CDE91E39CDE92033FEF777FC04463B +:100E400000285AD129461FA8FEF770FC0446002846 +:100E500053D11CA8FCF755F880461FA8FCF751F8A1 +:100E6000804528BF80461CA84146FEF749FA044643 +:100E7000002842D141461FA8FEF742FA0446002846 +:100E80003BD1CDF87C90CDF8709000211CA8FEF7E6 +:100E900098F858B941461FA8FEF768F9044660BBA8 +:100EA0001FA919A8FEF742FC044626E01CA8FCF77F +:100EB00028F801461CA8FEF723FA0446E8B91FA843 +:100EC000FCF71FF801461FA8FEF71AFA0446A0B95E +:100ED0001FA91CA8FEF732F80028C0F29C801CA9AC +:100EE0001FAA0846FEF7ABFD044630B901211CA835 +:100EF000FEF706FA04460028C7D01CA8FEF7AEFA93 +:100F00001FA8FEF7ABFA002C40F0A680012119A81B +:100F1000FEF757F8002840F02B812A46394616A8DC +:100F2000FFF78BF90446002840F0968016A913A815 +:100F3000FEF7FCFB0446002840F08E8029460AA8F4 +:100F4000FEF7F4FB0446002840F08680294607A8F7 +:100F5000FEF7ECFB044600287ED1012110A8FEF725 +:100F6000A7F90446002877D101460DA8FEF7A0F99D +:100F70000446002870D1014604A8FEF799F90446FA +:100F8000002869D1012101A8FEF792F90446002842 +:100F900062D1159B1B68D80749D5099B1B68DB07E5 +:100FA00040F18F8007A913A8FDF7C8FF0028C0F201 +:100FB000B88013A907AA0846FFF775F80446002869 +:100FC0004AD110A904AA0846FFF76DF80446002884 +:100FD00042D101AA0DA90846FFF765F8044600288A +:100FE0003AD1002113A8FDF7ECFF0028D1D1002150 +:100FF00004A8FDF7E6FF0028C0F2A680294604A851 +:10100000FDF79CFF002880F2A98004A93046FEF776 +:101010008DFB044620E01FA91CAA0846FEF70FFD21 +:10102000044600287FF469AF01211FA860E7012171 +:1010300013A8FEF765F9044670B9129B1B68DF0719 +:1010400029D40F9B1B68DC0725D4012110A8FEF7CB +:1010500057F9044600282FD016A8FEF7FFF913A869 +:10106000FEF7FCF910A8FEF7F9F90DA8FEF7F6F95E +:1010700019A8FEF7F3F90AA8FEF7F0F907A8FEF79A +:10108000EDF904A8FEF7EAF901A8FEF7E7F9204612 +:1010900023B0BDE8F08310A90AAA0846FFF77EF83E +:1010A00004460028D8D10DA916AA0846FEF7FBFF72 +:1010B00004460028C9D0CFE701210DA8FEF720F98A +:1010C00064E7012107A8FEF71BF904460028C3D1F5 +:1010D000069B1B68D90713D4039B1B68DA070FD440 +:1010E000012104A8FEF70CF904460028B4D101211F +:1010F00001A8FEF705F9044600283FF44EAFABE720 +:1011000004A90AAA0846FFF749F804460028A3D113 +:1011100001A916AA0846FEF7C6FF04460028DFD03C +:101120009AE707A913AA0846FEF7BDFF0446002860 +:1011300092D104A910AA0846FEF7B5FF044600287C +:101140008AD10DAA01A946E704A92A460846FFF755 +:1011500025F8044600283FF44AAF7DE704A92A4653 +:101160000846FEF7A0FF044600283FF447AF73E7A8 +:101170006FF00D0470E76FF0030488E72DE9F0418C +:1011800001F1180588B00746884628460021FDF77A +:1011900018FF044600283BD0002301263A1D2946AB +:1011A00005A807930493CDE90563CDE90263FFF732 +:1011B00011FE044630BB05AB02A938461A46FFF7BC +:1011C000E7F90446F0B902AB424641463846FFF71C +:1011D000DFF90446B0B908F10C0202AB38461146FB +:1011E0000192FFF7D5F9044660B9019A05AB38467C +:1011F0001146FFF7CDF9044620B931462846FEF7DF +:1012000057F8044605A8FEF729F902A8FEF726F9C3 +:10121000204608B0BDE8F081012A2DE9F04F0646CE +:101220008DB00C46154607D80968FFF7A7FF824620 +:1012300050460DB0BDE8F08F0C21104608F0CAFDF5 +:101240000746002800F0B7804FF00C0881460246A0 +:10125000012108FB05F800EB0803009300239360CD +:101260000098C2E900130C329042F8D138460B9333 +:1012700008930593CDE90913CDE90613CDE90313CE +:1012800021681831FEF752FA824690BB04F1040B34 +:1012900007F10C0104EB85045BF8043BA1F10C029F +:1012A000304601911833FFF773F9824608BB019964 +:1012B0005C4501F10C01EFD1A8F10C01321D09A828 +:1012C0003944FFF787FD824698B9013D4FF00C087D +:1012D000A7F10C0B15BB09A906A8FEF727FA824651 +:1012E00038B906AB03A930461A46FFF751F98246D2 +:1012F00038B309A8FEF7B2F806A8FEF7AFF803A8BE +:10130000FEF7ACF8484609F10C09FEF7A7F8009B78 +:101310004B45F7D1384607F04FFA89E708FB05B38C +:1013200009AA06A93046FFF733F982460028E0D122 +:1013300054F8043C09AA304618331146FFF728F93F +:10134000CDE754F8042C03AB30461146FFF720F9E3 +:1013500082460028CDD154F8042C03AB30460C3221 +:101360001146FFF715F982460028C2D154F8042C23 +:1013700006AB30460C321146FFF70AF982460028C8 +:10138000B7D1B16854F8040CFDF7FCFB8246002885 +:10139000AFD154F8040CB1680C30FDF7F3FB824672 +:1013A0000028A6D154F8040D1830FEF757F8002D88 +:1013B0009FD0013D8EE7DFF804A039E780B2FFFF40 +:1013C00070B404680E1B002E07DD26789E4208D1FB +:1013D0000134046070BCFBF7AEBD6FF05F0070BC01 +:1013E00070476FF06100FAE72DE9F74390461F461A +:1013F00001AA302305468946FFF7E2FF0446F8B903 +:101400002E68A9EB0609B9F1000F35DD01994246B6 +:10141000337828460E4442F8043B06233146FFF752 +:10142000CFFF044660B92A68D8F80410C8F808202D +:101430005318B3422B6007D10C213846FCF7FEFE4F +:10144000204603B0BDE8F083515C01333A4628469C +:1014500042F8041B31462B60FBF76DFD0446002863 +:10146000EED12B687A68BB601344B3422B600CBF8B +:1014700004466FF06504E3E76FF05F04E0E737B51B +:101480000223154601AA0446FFF79AFF40B9019AC4 +:1014900028462168FEF76EF82368019A13442360FA +:1014A00003B030BD2DE9F04F97B002931368209C34 +:1014B0000F2B0193CDE90A0200F2F181219BB54D7A +:1014C0000B44B54EB54F0C93219B0C9A934207D118 +:1014D0000B9B00201A46019B136017B0BDE8F08FEC +:1014E000019B83B1019B2199E35C11F8012B5340CF +:1014F000229A219102F8013B019B2292013303F0D1 +:101500000F030193E0E70A9BDFF898C25A68029B39 +:1015100019680E9113684B400E93029B59680F9106 +:1015200053684B400F93029B9968109193684B400E +:101530001093029BD96802F11003303211910D9380 +:1015400052F8243C4B4011930A9B1B685B10049398 +:10155000013B059303932032DDE90E9ADDE9108308 +:101560005FFA89F0190E55F820005FFA83FE56F8ED +:1015700021105FFA88FB55F82EE04840CAF3072196 +:1015800055F82BB057F821104840C8F307415CF8D4 +:101590002110484052F8401C4140C8B20690080E45 +:1015A0000790C1F307400890C1F3072009904FEA64 +:1015B0001860C8F3072856F820008EEA000EC9F319 +:1015C000072057F820008EEA000ECAF307405CF8A7 +:1015D00020008EEA000E4FEA1A605FFA8AFA56F887 +:1015E000200055F82AA08BEA0000C3F3072BC3F3B1 +:1015F000074357F82BB05CF8233080EA0B00C9F39F +:10160000074B4FEA19695CF82BB056F8299080EA2D +:101610000B008AEA090A57F828908AEA090A8AEA36 +:10162000030A039B002B00F3BF80059B12914FEA36 +:10163000431C049B002B0D9BD8BF4FF0000C634450 +:101640005A689C468AEA020ACDF84CA09968414043 +:1016500053481491DA688EEA020E4FEA1E62CDF802 +:1016600054E010F80290069A10F802801A6988EA8D +:10167000020282EA0968CAF30722825C88EA022829 +:10168000C1F30742825C88EA0248079A10F802B068 +:101690005A69CDF8388082EA0B6B5FFA8AF2825C75 +:1016A0008BEA020BC1F30722825C8BEA022BCEF39A +:1016B0000742825C8BEA024B089A10F802909A6902 +:1016C000099B82EA0942CDF83CB05FFA81F9090E24 +:1016D00010F8099082EA09024FEA1A6910F8099095 +:1016E00082EA0962CEF307295FFA8EFE10F80990AC +:1016F00082EA0922109210F80390CAF30743DCF83B +:101700001CC0C35C8CEA092910F80EC089EA0C09D8 +:1017100010F801C04FEA1821227289EA0C6984F896 +:10172000008061704FEA184189EA034384F804B0ED +:10173000A1704FEA1B214FEA1369237361714FEACD +:101740001B414FEA18680EA8A171110A4FEA1B6BE2 +:1017500084F803806172110C120E84F807B0A17234 +:101760002021E2721A0A84F80F9062731A0C119306 +:10177000A273FCF763FD029B03F1100212F8013D16 +:101780000133DBB21370002B7FF4ACAE029B9A42A4 +:10179000F4D1A7E60415022404210224041902242A +:1017A0003C040024041D0224129152F83C3C8AEAB5 +:1017B0000309069BCDF84C9052F8381C4140149117 +:1017C00052F8340C8EEA000055F823E015904FEAE9 +:1017D000106852F8303C56F8288083EA0E0E079BBA +:1017E0008EEA080EC9F3072857F828808EEA080EFB +:1017F000C1F307485CF828808EEA080E5FFA89F882 +:10180000CDF838E056F823E052F82C3C55F8288003 +:1018100083EA0E0E089B8EEA080EC1F3072857F8DC +:1018200028808EEA080EC0F307485CF828808EEA0C +:10183000080E5CF82380CDF83CE05FFA81FE52F898 +:10184000283C090E55F82EE08EEA080E4FEA19687A +:101850008EEA030E56F82880099B8EEA080EC0F324 +:101860000728C0B257F828808EEA080ECDF840E06D +:1018700055F820E057F82300C9F307438EEA000E1D +:1018800052F8240C56F821108EEA000048405CF80B +:101890002310039B4840013B119003935BE66FF0DC +:1018A00020001AE6F0B5ADF6040D012300220DF577 +:1018B0008060054613F080014DF8232040F8043B7A +:1018C00002F1010218BF1B2183EA4303B2F5807FB6 +:1018D00083EA0103DBB2EDD136480123002213F085 +:1018E000800102F1010240F8043B18BF1B210A2AC3 +:1018F00081EA4303DBB2F2D163232F4C2F4801214D +:101900002370002380F863305DF82130C3F1FF03BA +:1019100055F823E04FEAEE1242EA4E025FFA82FCEB +:10192000C2F3C01242EA4C02D7B2C2F3C01242EA7A +:101930004702D6B2C2F3C01242EA4602D3B283EAE9 +:101940000E0383EA0C037B40734083F0630363540C +:10195000C1540131B1F5807FD6D1DFF85CC0184F9A +:10196000184E194D194C1CF8012B12F0800F4FEA3C +:10197000024314BF1B20002043EA0223013980EAFE +:101980004200C0B282EA000283EA000343EA026333 +:101990004FEA336247F8043B46F8042B4FEA3342E0 +:1019A0004FEA332345F8042B44F8043BDBD10DF612 +:1019B000040DF0BD3C0500243C0400240425022451 +:1019C0000415022404190224041D02240421022403 +:1019D00010B5FCF709FB012380F83F30836B1BB186 +:1019E000064B4FF080625A60D0E90A23BDE81040F0 +:1019F00012F57A7243F10003FBF70BBE00ED00E035 +:101A000008B5EFF3058353B1124B1B689869FCF7D7 +:101A100099FA4FF47A72002308F060FC08BDFBF7D6 +:101A200037FDEFF305836BB10B4BD8680B4B1A688E +:101A30001860824281BF0A490A6801320A60FBF7D6 +:101A400013FDEBE702F0FCFD0028EDD1DFF814C038 +:101A500000DFEBE7282702241801002434270224A2 +:101A600030270224753301082DE9F04F85B0EFF3DC +:101A70000583002B42D00020DFF848A1DAF80040AF +:101A8000FBF706FDD4E90C89FBF7EEFCA36BB8EB82 +:101A9000030869EBE37918EB000449F10005FCF752 +:101AA000A3FA4FF47A73A4FB036703FB05770020C6 +:101AB000FBF78CFA002855D1DAF8003093F83D3066 +:101AC000002B4FD16FF000434FF0FF329D4208BF13 +:101AD0009442ECD0DAF800B09BF83C30002BE6D111 +:101AE000594602A8FCF73DFADDE90223AB4208BFE4 +:101AF000A2420BD301238BF83D30D8E702F0A0FDC2 +:101B00000028B8D1DFF8C0C000DFB5E7FBF7C0FCA4 +:101B1000DBE90C01FBF7A8FC231A4FF0010000934E +:101B200065EB01039BF840100193ABF83C00DBE947 +:101B3000082316EB020C47EB030339B9DBF8182036 +:101B4000116891F8201069BB8BF840004FF000023B +:101B50009BF840008BF83E2010B901208BF8400024 +:101B600062462BE0DAF800402046FCF7C0FA00237A +:101B700094F84020A3870AB184F84030DAF80010C6 +:101B800002A8FCF7EEF9029CEFF305833BB902F0E3 +:101B900057FD20B9A4EB0800DFF830C000DF05B026 +:101BA000BDE8F08FDDE90012002A08BF0529CDD37A +:101BB000BCF57A628BF83E0043F1FF335846FBF7E1 +:101BC00028FD74E7282702243D3C0108D13701088D +:101BD0002DE9F34705460026674FFFF711FF85F80B +:101BE0002460FBF755FC6B6801A91B1A002B2B68BE +:101BF000D8BF686001931BB15A69121A002A3BDDF5 +:101C00002B6003B11D610E60019911B12B89013365 +:101C10002B81FBF729FC01A8002931D1019C05F19A +:101C200018094FF0010A002C37D1FFF7E9FEFBF746 +:101C30002FFC2B68002B7ED05C69241A24EAE47404 +:101C4000FBF712FCD5F83080EFF30583002B75D03D +:101C5000B8F1000F7DD1AB7A002B00F08A80FBF742 +:101C600017FCAB7A002B00F082800023AB7202B02D +:101C7000BDE8F047FBF7F8BB03F108019B68BAE742 +:101C80008C680B4600229A601A46DB68002BFAD15A +:101C9000026001F108002146BEE7236AD4F80880FB +:101CA00013B104F124009847A269002A0BDB636991 +:101CB00013446361FFF7A4FE214602462846FCF761 +:101CC000CFF94446AFE7EB6873B1A3420CD82B6A57 +:101CD000A34209D3A3792A690133DBB213FA02F2D2 +:101CE00014BFA37184F806A0E36913B104F12400C2 +:101CF0009847EB6823B1A34202D82B6AA34201D2D2 +:101D0000A671DEE7FBF7C4FB4846AB6983B11968EF +:101D10002268914208D30BD1E36003689B68A360FB +:101D20000460FBF7A1FBCCE703F108009B68EDE73B +:101D3000E6600368F3E74FF0FF3481E702F080FCD0 +:101D40000246002884D1404601212346BC4600DFDC +:101D500081E798F80030F32B7FF47DAF002C7FF4FF +:101D60007AAF22460121404603F0D6F873E7FBF72D +:101D70007BFBFFF745FE34E7554F010838B50546B4 +:101D8000046854B9FBF762F92C6824B92C1D20466D +:101D9000F9F74EF82C60FBF751F9204638BD0000EA +:101DA0002DE9F0418846002504462349C0E9005545 +:101DB000404608F0C2F98044C4F8008023681A78CD +:101DC0002F2A1CD1013323601C48FFF7D7FFF8F7F7 +:101DD0003BFE1B4B1E68D6B1B768B7B1384607F05B +:101DE00049FB854211D12A464146384608F0A8F8F9 +:101DF00058B91248FFF7C2FFF8F706FE17E0002AAD +:101E0000E2D0013301352360D8E77668E3E7072D98 +:101E1000EFD12A4641460B4808F092F80028E8D155 +:101E20000648FFF7ABFFF8F7EFFD074B1E682046AB +:101E30006660BDE8F08100BFF7A60108D80600245F +:101E4000D4060024FAAD0108D82602242DE9FF4764 +:101E50008A463F49054607F0FBFA044628B9FBF7D6 +:101E6000F5FC204604B0BDE8F0873A49284607F063 +:101E7000EFFA20B901200124FBF7E8FCF1E736492D +:101E8000284607F0E5FA20B902200224FBF7DEFC21 +:101E9000E7E72B78402B02D1D5F80140E1E72F4E40 +:101EA00003242F48B046FFF769FFF8F7CDFD56F839 +:101EB0002490B9F1000F2AD00134402CF7D105F05D +:101EC00063FE182303602648FFF758FFF8F79CFDD0 +:101ED0000AE002A8FBF7AAFF054640B905F054FE48 +:101EE0001323036046F824504FF0FF34B9E703682A +:101EF00001A9029A9D682AF48033A8470546E8B1F3 +:101F00006D4205F041FE056046F82490ECE74FF085 +:101F1000FF37134846F82470FFF730FFF8F774FDD9 +:101F2000294602A8CDF80490FFF73AFF039D002D43 +:101F3000D4D02B7B002BCCD1043D0195019B094AC9 +:101F400048F8243000231355074A135589E700BF8A +:101F50004CB3010853B3010844B301080C0000243A +:101F60008826022408260224482602241D4B70B528 +:101F7000036004461C48FFF701FFF8F765FDA368FE +:101F80002BB11A4962680B68A34224D10A60184B2E +:101F900015481A68A24204BF00221A60FFF7EEFE3D +:101FA000F8F732FD257BA5B91248261FFFF7E6FE9C +:101FB000F8F74AFD104A402352F8041B8E4208BF2E +:101FC00042F8045C013BF7D10A48FFF7D7FEF8F767 +:101FD0001BFD204670BD19465B68A342FBD14A60D9 +:101FE000D5E700BF08AC0108D8060024D4060024B9 +:101FF000D8260224882602240C00002410B50446AA +:10200000FFF7B4FF204606F0D7FB204610BD0000C6 +:1020100008B50348FFF7B2FEBDE80840F8F7F4BC86 +:10202000B026022408B50348FFF7A8FEBDE8084023 +:10203000F8F70ABDB02602242DE9F0479DF820707C +:10204000054689469246022F98469DF8246022D87C +:10205000124BDB5DFBB1B6FBF3F403FB146414F02D +:10206000FF0418D1FFF7DEFF9DF82830284685F8D9 +:10207000609085F865300B9B85F861A085F86280DB +:1020800085F8637085F86460C5F88830FFF7C0FF95 +:102090002046BDE8F0874FF0FF30FAE70DAE0108AB +:1020A000274B10B504460360FFF7BCFF2549626863 +:1020B000136823F0010313600023A36484F8453000 +:1020C000214BD1F88C209A42FBD1204BB4F954001B +:1020D000DA6F42F48042DA67DA6F22F48042DA671C +:1020E0004FF44072CA6040F2C331D3F8D42022F4D6 +:1020F0008042C3F8D420F3F759FCB4F9560040F2FB +:10210000C331F3F753FCB4F9580040F2C331F3F78D +:102110004DFCB4F95A0040F2C331F3F747FCB4F96F +:102120005C0040F2C331F3F741FC40F2C331B4F933 +:102130005E00F3F73BFC2046FFF76AFF204610BD28 +:102140001CB30108006402580003008000440258D8 +:1021500010B50446FFF7A4FF204606F02DFB2046ED +:1021600010BD00002DE9F04F0D46164685B0F0F782 +:102170006FFDAC1900F10060A042C0F01E8109D9CA +:102180002046F0F745FDB4FBF0F303FB10400028B8 +:1021900040F0138190484FF00009DFF858B2FFF784 +:1021A000EDFDF8F751FC002E00F0FE80B9F1000FB4 +:1021B00040F0F88005F17843B5F1016F4FF0100A57 +:1021C0004FEA5343019334BF01230223012B03F051 +:1021D000010803F002070CBF4FF000634FF00163EA +:1021E0000293FBF7A3F9FBF77DF9BBF800304FF63C +:1021F000FD715A1E92B28A4297BF784A4FF002632D +:1022000002EA832303F100639D420ED2B5F1006F11 +:102210000BD3734C734BD4F888209A42FBD1F4F75C +:10222000D9FD60B14FF44073A360FBF749F9FBF7A8 +:102230006BF9BAF1010AD4D14FF0FF396BE0FBF72B +:1022400027F9BBF800204FF6FD71DFF8AC91531E63 +:102250009BB28B4299F8143097BF634C4FF00164E6 +:1022600004EA422404F10064A5422ABF2C1B019C0D +:10227000640C012B00F093800120002389F81400E6 +:10228000C9F81830B8F1000F00F09D80F2F7BAFBE2 +:10229000031E18BF0123002F00F099800220039332 +:1022A000F2F7B0FB039B00283BD001200023C01AAB +:1022B00089F8143018BF0120C0F10009029B03EB1C +:1022C0004444BFF34F8F494B04F50032C3F87042CA +:1022D00020349442FAD1BFF34F8FBFF36F8FBFF317 +:1022E0004F8FBFF36F8F0022C3F85022BFF34F8F81 +:1022F000BFF36F8FFBF7B8F8F4F754FD002894D1C3 +:10230000374B4FF440729A60B9F1000F8DD1FBF753 +:10231000D7F8FBF7F9F82846F0F77AFC361A0544A7 +:1023200041E7002BC1D1B8F1000F0AD0304AD36881 +:1023300023F4E663D360D36843EA042343F0A403A1 +:10234000D36077B12A4AD2F80C3123F4E663C2F89D +:102350000C31D2F80C3143EA042343F0A403C2F851 +:102360000C31B8F1000F2BD00120F2F74BFB204AC3 +:10237000D36823F4E06323F00403D3605FB1022049 +:10238000F2F740FB1A4AD2F80C3123F4E06323F051 +:102390000403C2F80C31002888D1002086E74FF0F2 +:1023A000FF398BE74FF0FF390B48FFF7E7FCF8F7F1 +:1023B0002BFB484605B0BDE8F08F4FF0FF39F8E73A +:1023C000002FEAD0DBE7002FE7D0434666E700287E +:1023D0007FF46BAFAAE700BFA414022400FC3F0007 +:1023E000006402580003008000FE1F0000ED00E0C2 +:1023F0000020005280E8F11F4C0B02242DE9F04F21 +:1024000012F01F0487B082460F461646994640F0E8 +:102410002681002900F02381F0F71AFC09EB06035E +:1024200000F10060834200F21A818E48DFF850B25A +:10243000FFF7A4FCF8F708FBB9F1000F00F00681E4 +:10244000002C40F001813046F0F7E2FBB6FBF0F5DE +:1024500000FB1565451B4D4528BF4D46BB0701D107 +:102460001F2D4BD8202DA8463946DAF8040028BF86 +:102470004FF02008424606F0FBF91F2D07D8DAF886 +:102480000400C8F12002FF21404406F0FFF9DAF809 +:1024900004302025039310230293FBF747F8FBF742 +:1024A00021F8714B19884FF6FD734A1E92B29A4279 +:1024B00097BF6E4B4FF0026303EA812303F1006381 +:1024C0009E4210D2B6F1006F0DD3694C694BD4F81F +:1024D00088209A42FBD1F4F77DFC002800F0AC8004 +:1024E0004FF44073A360FAF7EBFFFBF70DF8029B84 +:1024F000013B0293D1D14FF0FF3487E025F01F0557 +:102500000397A846C7E7012B00F09B8002F17840B3 +:102510000123B0F5801F8BF8143006D3A2F10163BC +:10252000B3F5801F80F0858002230020059204937C +:10253000CBF818001846F2F765FA059A20BB049B01 +:102540004D48012B67D1C16841F00201C160BFF362 +:102550006F8FBFF34F8F002001990958115004303D +:102560002028F9D10592BFF36F8FBFF34F8F184624 +:102570000493F2F747FA049B059A012B3E4B51D185 +:10258000D96821F00201D96000238BF814300028AB +:102590004FD1019B2032203301939BF814307019E6 +:1025A000824203D2002CAED04FF0FF34002D11DD5B +:1025B00006F01F032B44BFF34F8F3048324633449D +:1025C000C0F870222032991A0029F9DCBFF34F8F2E +:1025D000BFF36F8FBFF34F8FBFF36F8F274B002277 +:1025E000C3F85022BFF34F8FBFF36F8FF4F7DAFBBE +:1025F00000287FF478AF1E4B4FF440729A60002C95 +:102600007FF471AFFAF75CFFFAF77EFFA9EB0809D8 +:102610004644474410E7D0F80C1141F00201C0F8DD +:102620000C1194E7D3F80C1121F00201C3F80C113E +:10263000AAE74FF0FF34B0E7039B0446324601930C +:10264000ABE74FF0FF34ABE74FF0FF340548FFF73F +:1026500095FBF8F7D9F9204607B0BDE8F08F4FF0A9 +:10266000FF34F8E7A414022480E8F11F00FC3F00C7 +:1026700000640258000300800020005200ED00E0DA +:102680004C0B022410B504460B48FFF777FBF8F714 +:10269000DBF9FAF74BFFFAF725FFFAF711FFFAF724 +:1026A00033FF606808B106F087F80348FFF766FB60 +:1026B000F8F7AAF9002010BDA414022410B50446AE +:1026C0001248FFF75BFBF8F7BFF9FAF72FFFFAF7AD +:1026D00009FF0F4B0F4AD3F888109142FBD14FF4FA +:1026E0008E010D4A51614FF440729A60FAF7E8FE8C +:1026F000FAF70AFF2020FAF759FE60600348FFF757 +:102700003DFBF8F781F9002010BD00BFA41402249E +:10271000006402580003008000200052014B5869F9 +:10272000704700BF1801002401230A4A90F92010C5 +:1027300043701C32936810B51BB193F920408C4252 +:1027400005DCC0E90232906003B1D86010BD1A46C2 +:102750009B68F1E71801002490F82230826B13F097 +:10276000100F0CBF602020201044704710B5C469C2 +:10277000621CD0E904310CD103B1596142691AB12C +:1027800013610023436101E0074A13630023C3611F +:1027900010BD1BB1DA6959612244DA614269002A2D +:1027A000EED1014AD362F1E718010024C2682AB1D0 +:1027B0008368936003B1DA600023C36070470378D5 +:1027C000F12B00D07047C068F9E783689A6882608F +:1027D00002B1D06000221846DA60704738B51F4C4D +:1027E000237A022B35D1636A002B34D063694A1CEB +:1027F000587016D1226B002172B94FF0FF30C3E937 +:102800000421D86159B10B611548FFF7DEFF02239F +:102810004370A061012038BD11461269ECE72363C3 +:10282000F2E7E26A002012B1D569A9420BD2D96160 +:10283000C3E9042058B10361002AE5D0D06953618F +:10284000411AD161E0E71046491B1269EBE7E362E8 +:10285000F2E70020DFE71846DDE700BF180100249B +:102860003401002491F92020836810B51BB193F93D +:102870002040944205DAC1E90230816003B1D96099 +:1028800010BD18469B68F1E70123014643700148DB +:10289000FFF7E8BF3401002470B5124D04462E7ACC +:1028A000696990B9022E0FD16C6A6CB194F920203D +:1028B00091F920309A4207DD2046FFF777FF08465E +:1028C000FFF732FF6670AC6170BD022E05D190F942 +:1028D000202091F920309A42F1DC2046BDE870407A +:1028E000FFF7D2BF1801002438B504461546FFF79C +:1028F00033FF01602046FFF739FF1DB1BDE83840C6 +:10290000FFF7CABFBDE83840FFF7BEBF10B50446A9 +:10291000806918B100221146FFF7E6FF6378232B88 +:1029200002BFA36800229A6110BD10B5014604469B +:1029300064B12378F12B07D00846FFF737FF204614 +:10294000BDE81040FFF78EBFE468F1E710BD00005E +:1029500038B5254DEC6A002C45D0E369013BE361B5 +:10296000002B40D16378732B06D009D8532B0BD0A2 +:1029700003F0DF03432B29D12046FFF720FF25E09A +:1029800003F0EF03832BF6E72046FFF718FFC37829 +:102990009B071BD5C06890F92120C36AD9788907A5 +:1029A00009D599688C4208BFA16821B191F920101E +:1029B0008A42B8BF0A465B69002BEFD190F92030FC +:1029C000934203D080F82020FFF7AFFF2046FFF7A7 +:1029D000EDFEFFF759FF246924B1E369002BC1D054 +:1029E00000236361EC6238BD1801002410B5034672 +:1029F00053E8000F084203D1BFF32F8F002005E0FA +:102A000020EA010243E8002404B1F1E710BD10B54B +:102A1000034653E8000F00EA01028A4203D0BFF3E5 +:102A20002F8F002005E020EA010243E8002404B1D2 +:102A3000EFE710BD10B543780446332B15D190F85D +:102A40002330416A03F001029B0708D428301AB1F1 +:102A5000FFF7DDFF48B10BE0FFF7C8FFFAE7806A38 +:102A600001EA000312B19942F4D010BD002BFCD052 +:102A7000014600222046BDE81040FFF735BFD0E8F0 +:102A80005F3F13B9BFF32F8F04E05A1EC0E8512FE8 +:102A900001B1F4E798B2704710B5D0E85F3F5A1C17 +:102AA000914200D80022C0E8542F04B1F5E798B253 +:102AB00010BD10B5D0E85F3F994202D8BFF32F8F09 +:102AC00004E05A1CC0E8542F04B1F3E798B210BDDB +:102AD00010B50446B8B10378F62B14D183683BB126 +:102AE000FFF773FE01220021FFF7FEFE002010BD5C +:102AF000C1890C30FFF7DDFFE38983428CBF0020E2 +:102B00006FF00200F3E76FF00300F0E7836810B5A1 +:102B1000044663B10C30FFF7B2FF40B12046FFF727 +:102B200054FE0022BDE810401146FFF7DDBE10BD87 +:102B3000284B5A6970B50446002A41D0002842D07B +:102B40000378F52B3FD1037E002B3FD0C168914223 +:102B50003CD1013BDBB2037613BB43690BB1016986 +:102B600019612169F1B14B6192F92130D56ADDB962 +:102B700082F82030A36883B12046FFF726FE064680 +:102B80002A462946FFF7B0FEF36AC4E9036563618C +:102B900003B11C610123F46223760020FFF77CFE61 +:102BA00000200FE0D362DFE7E978890706D5A9683E +:102BB00021B191F920108B42B8BF0B466D69D6E761 +:102BC0004FF0FF3070BD6FF00300FBE76FF00200C5 +:102BD000F8E700BF18010024224B70B55D69044678 +:102BE0000E46002D35D0002836D00378F52B33D192 +:102BF000037E53B9C0E90353EB6A436103B1186123 +:102C00000123EC620020237670BDC278D10706D57F +:102C1000C168A94203D1FF2B21D00133F2E7F6B1FD +:102C200093070AD5E06895F9203090F920209A4260 +:102C300003DA80F82030FFF778FE31465320FFF7A3 +:102C4000CDFD18B129462046FFF70CFE6FF00100BC +:102C5000DAE74FF0FF30D7E76FF00300D4E76FF00B +:102C60000200D1E7180100242DE9F04104460026B6 +:102C700001270CB9BDE8F081E378D4F814801B0774 +:102C800012D5A36826767BB12046FFF79EFD002271 +:102C900005461146FFF728FEEB6AC4E90356636157 +:102CA00003B11C61EC6227764446E2E7034653E831 +:102CB000000F421C43E8002101B1F8E77047036BA5 +:102CC00030B4BBB1CD780024DA78AA420AD31A46D0 +:102CD000C1E9012462B191607CB16160283030BCEF +:102CE000FFF7E4BF5A681C46002AF1D01346EBE711 +:102CF000C162F1E7C1E90133C1620163EEE730B5BA +:102D0000F0B1C3688B421BD803698B4218D900F11C +:102D100014031A680A60BFF35F8F53E8002F0C6832 +:102D20009442F6D143E8001505B1F2E7043050E8CB +:102D3000003F5A1E40E8002101B1F8E7002030BDF5 +:102D40006FF00300FBE710B590B100F1140353E8F6 +:102D5000004F14B9BFF32F8F04E0226843E800212D +:102D600001B1F4E714B10430FFF7A0FF204610BD15 +:102D70000446FBE730B5C0B189B1C2B1CBB1002484 +:102D80000160C3604361C0E9014202FB01F41D1907 +:102D900005611846013904D1A21A9950012108464B +:102DA00030BD851805602846F4E70146F7E711466F +:102DB000F5E71946F3E730B580B1C9B1A1F10805CF +:102DC00000F108040022A54209D16B6823F0030436 +:102DD00043681B1B43603AB96A60012030BD236819 +:102DE00022463BB11C46EEE751F8083C1360F4E77D +:102DF0000846F3E71846F1E710B5C378044613F028 +:102E0000010322D1038083789A0708D513F0100FAD +:102E1000016B134B0FD0D3F88400FFF770FFA3783A +:102E2000DB071CD50E4B2146D3F8880038B1BDE82E +:102E30001040FFF764BF586FFFF7BDFFEFE7D3F80F +:102E40008000BDE81040FFF7B6BF042343700023A5 +:102E5000C360034B5A6B826002B1D0605C6310BDEB +:102E60001801002410B5044600283AD00378F12B4D +:102E700037D1437803F00F03022B06D0032B27D062 +:102E8000012B22D06FF002001EE0174B1A7A022AA3 +:102E9000F8D15B6A002BF5D0E06AFFF7E5FE20462B +:102EA000FFF734FD6178022917D11048FFF78DFC38 +:102EB0000D4B41709861EFF30982A26300225A61C1 +:102EC0002046FFF799FF002010BDFFF76FFCE3E7F6 +:102ED000FFF76CFCFFF74AFCDEE70020FFF7DCFCA5 +:102EE000EEE76FF00300EFE718010024340100243F +:102EF00070B50F4C267A022E18D1636AB3B165699A +:102F0000E86AFFF7B1FE2846FFF700FD04F11C0058 +:102F1000FFF75BFC4670A061EFF30983AB6300230E +:102F200028466361BDE87040FFF766BF70BD00BF13 +:102F30001801002470B5054638B30378F62B24D168 +:102F4000836863B12846FFF740FC00226FF002015E +:102F5000FFF7CAFCA8680028F4D1FFF79DFCAB7806 +:102F6000002613F001032E7012D00A4B2946D3F825 +:102F7000984024B12046FFF7C2FE304670BDD3F81A +:102F80008000FFF718FF2046F8E76FF00300F5E731 +:102F90001846F3E71801002470B50446002849D00C +:102FA0000378F52B46D1037EBBB16369C0680BB1D2 +:102FB00022691A61226902B3536190F92120C36A20 +:102FC000EBB990F92030934203D080F82020FFF72E +:102FD000ACFCA068F8B9FFF75FFCA078002610F001 +:102FE0000100267008D0154B2146D3F89450DDB16E +:102FF0002846FFF784FE304670BDC362DDE7D9780E +:10300000890706D5996821B191F920108A42B8BF85 +:103010000A465B69D4E72046FFF7D7FB00226FF032 +:103020000201FFF761FCD4E7D3F88000FFF7C3FE8D +:103030002846E1E76FF00300DEE700BF1801002437 +:10304000F0B568B381B10F3100F1080621F0070730 +:10305000334636685C68F11A24F00304091B8F427A +:1030600004D931680029F3D10846F0BD45683A43D8 +:1030700004683D444560204450F8041C08388D42E3 +:1030800088BF4560586818B903F108015A60EBE73A +:1030900020F0030019181E504A6019600831E3E758 +:1030A0000146E1E72DE9F04F85B08146029120B954 +:1030B0000024204605B0BDE8F08F002A00F086808D +:1030C0009468B4B1A007F3D1D368432BF0D99769C2 +:1030D000D2E904658EB17107EAD1002DE8D077B945 +:1030E00018276B07E4D1A5F14801574B99420BD93A +:1030F000DEE7D368002BEAD0DAE7002F64D07B1E2E +:10310000372BD5D8002DECD1D2E900A30193002CA8 +:1031100069D14E4BD3F8880000285DD0FFF713FE2D +:1031200004460028C4D04FF00108A6B9DFF81CB14E +:10313000002D71D1DBF88400002857D0FFF703FE83 +:10314000002870D048F0100806464FF4805548F02B +:103150000208002CACD040F2F113FD226563403D23 +:1031600023807FB2019B35446284E3700023384A98 +:1031700084F80280C4F804A084F8207084F82170D8 +:10318000C4E90E59C4E90233C4E90433C4E906337F +:10319000C4E90933C4E90B363260A26B114602F16F +:1031A000340042F8043B8242FBD12A4B20462A4A93 +:1031B000C1E90D394FF08073CB63029B0B62234B47 +:1031C0001A66FFF769FB74E718279BE792461646D5 +:1031D0001827154601929CE701224421D3F880006C +:1031E000FFF72EFF9CE74FF000089EE72A464FF4BA +:1031F00080554FF48051DBF87400FFF721FFF8B9D8 +:10320000B8F1000F1ED0DBF888207AB121461046B5 +:103210000024FFF774FD9AE732462946DBF8740074 +:10322000FFF70EFFEBE74FF48055E9E72146DBF8A7 +:1032300080000392FFF7BFFD039A1446164686E707 +:10324000064684E7444682E7B7FFFF7F1801002463 +:10325000A52E5AE259460108352A010870B54FF6E5 +:10326000FE731446421E05460E469A4201D90020BE +:1032700070BD8842FBD3CCB1A068226890B110F039 +:103280000303F4D1E1680F29F1D91446F6228370C3 +:1032900000234460027083600D4A0E4B8681C58115 +:1032A0009A66E5E7E368002BE1D11446094BD3F8B1 +:1032B000980028B1FFF747FD0028D8D00123E5E7A3 +:1032C00001221021D3F88000FFF7BAFEF4E700BF17 +:1032D0000D2B01081801002438B5034660B3D0E96E +:1032E00000458068A0B110F0030201D0002038BD75 +:1032F000DB681B2BFAD91346F52283700023C570B7 +:10330000027044600376C0E90233C0E90433EEE79B +:10331000DB68002BEAD10A4BD3F8940030B90122C4 +:103320001C21D3F88000FFF78BFE01E0FFF70BFDB7 +:103330000028DBD00123DFE704460546EBE700BFAA +:103340001801002410B598B140EA010313F00703F7 +:103350000ED117290AD90160083910220C184260D1 +:1033600084600B5081684A60C3600123184610BD19 +:103370000023FBE7014BD868704700BF1801002409 +:1033800038B51C4C257A012D28D07DBB1A4B294617 +:103390002846E3651023A4F8543005232364FFF77F +:1033A000D1FF08B1C4F8805000210846FFF7CAFFDA +:1033B000B0B9D4F88030002163670846FFF7C2FF38 +:1033C00080B9D4F880300021A3670846FFF7BAFF20 +:1033D00050B9D4F88030E36701232372002038BD50 +:1033E0000023E8E70023EEE70023F4E74FF0FF3087 +:1033F000F5E700BF1801002468430224064BDA6A8F +:103400003AB1D0695B6C1BB11B69984228BF184662 +:1034100070474FF0FF30F5E71801002410B504465F +:10342000D0B10268806898B110F0030301D0002089 +:1034300010BDE1680F29FAD91446F32283700023E6 +:10344000446002700D4AC0E902330D4B5A66EFE743 +:10345000E368002BEBD11446094BD3F8900028B158 +:10346000FFF771FC0028E2D00123E6E701221021DA +:10347000D3F88000FFF7E4FDF4E700BF0F50010828 +:1034800018010024014608B538B11320FFF7A6F94A +:1034900080F00100C0B2404208BD6FF00300FBE7BE +:1034A00000F07B43B3F1005F0ED000F07743B3F13F +:1034B000405F09D000F07F40B0F1805F14BF4FF053 +:1034C000FF304FF00160704700487047000004086B +:1034D000BFF34F8F0549064BCA6802F4E0621343FD +:1034E000CB60BFF34F8F00BFFDE700BF00ED00E0F2 +:1034F0000400FA0503681847094B30B51A46094C11 +:10350000D3F89450A542FBD1036829B181680B60C0 +:103510004FF44073536130BDC1681B04F7E700BF2F +:1035200000640258000300800B4808B543681A681D +:1035300003681A420CBF01210021FFF7DDFF074895 +:1035400043681A6803681A42BDE808400CBF0121AD +:103550000021FFF7D1BF00BF04070024740B022431 +:1035600000487047FCB30108D0E904017047D0E976 +:103570000A017047D0E90A017047D0E90801704795 +:10358000D0E90601704730B503995418049A43EB0B +:103590000205D0E90423AB4208BFA2422CBF0120A0 +:1035A000002030BD00207047704700207047D0E9F0 +:1035B00000301847D0E90132016810B401EB620015 +:1035C0005410D20748BF0A595DF8044B48BFD3587E +:1035D00018477047002050709070D07070470000FE +:1035E000B0F1204F73B504460D460DD3114B18684A +:1035F00038B106680023CDE9002304F1C0427669A2 +:10360000B047284602B070BDB0F1104F08D24B1E33 +:1036100002449442F5D014F8011B03F8011FF8E7A7 +:10362000054B186800230668CDE9002304F1E04249 +:103630007669E5E7E80A0224700B022430B5A1F1AF +:103640001004002500F00F02CD7302390009D3B237 +:10365000092ACCBF373330330B748C42F2D130BDE2 +:10366000322310B50A4C0B800A4BA11C1868FFF7D7 +:10367000E5FF094B04F112011868FFF7DFFF074B64 +:1036800004F122011868FFF7D9FF204610BD00BFE2 +:103690008402002400E8F11F04E8F11F08E8F11F8C +:1036A000042301480B807047800200241223014844 +:1036B0000B8070476C02002430B5013800252B4682 +:1036C0000135445D002CFAD1DBB201335B0013807D +:1036D0000B7003234B70022310F8015F05B930BD56 +:1036E0005A1CCD540233D2B2DBB28C54F4E7000042 +:1036F0000A460349034808B5FFF7DEFF084608BD40 +:10370000AC2A022403B401080A460349034808B559 +:10371000FFF7D2FF084608BDAC2A022411B4010805 +:103720000A460349034808B5FFF7C6FF084608BD27 +:10373000AC2A02241CB401080A460349034808B510 +:10374000FFF7BAFF084608BDAC2A022427B40108D7 +:1037500008B5D0F8B4325B689847002008BD08B5BA +:10376000D0F8B4320BB9022008BD1B689847002876 +:10377000FAD0F8E7D0E9003018470000092908B569 +:103780000AD8D0F8BC32063953F8210010B10349E9 +:10379000FFF792FF014800E0002008BDB82B02248B +:1037A0000A2303800048704730030024002070473C +:1037B00000207047002070470020704700207047AD +:1037C000002070477823038000487047B802002427 +:1037D00038B51E4C0546237A042B35D1FFF70EFE73 +:1037E000E26AA842034694BF00F1FF332B4612B1B0 +:1037F000D069C01AD061626C12B11069C01A106130 +:10380000E06803440544E360E368AB4213D102235C +:1038100000202372FFF740F800236372BFF34F8F3D +:10382000A27A22B1A3724FF08052094B5A60BDE8D0 +:103830003840FEF7CDB80133E360FFF789F8236D18 +:10384000002BE1D09847DFE738BD00BF1801002406 +:1038500000ED00E038B50F4C0546B4F8541004F103 +:103860005600FFF726F9814203D802210A48EFF7F4 +:10387000D3F804F15800FFF70FF9E36D43F8205037 +:10388000637A23B9054B4FF080525A6038BD01234B +:10389000A372FBE7180100242601028000ED00E07E +:1038A000F8B59C460D4617460446002872D00278AB +:1038B000FA2A6FD100296DD000F1280252E8001FCA +:1038C00011B9BFF32F8F04E0481E42E8000606B18D +:1038D000F4E711B1E66A01229EB9BCF1000F5CD099 +:1038E00061468320FEF77AFF40B1304B204659698C +:1038F000FEF7B8FFEFF30983C3E902576FF0010049 +:1039000023E0B11CD1E84F0FC1E8432F03B1F9E721 +:1039100010F0FF0F44D0B668DEE79A60B268AAB133 +:103920005360626A06F10C01284604F0A1FF0FB152 +:10393000F3783B70002504F10C07314638463570AA +:10394000FFF7DDF9A3681BB90020F8BD2363E8E7A2 +:103950003846FFF7F8F906460028F5D02046FEF76E +:1039600034FF074629460122FEF7BEFF3846FEF720 +:10397000F3FE626A0746816806F10C0004F078FFE6 +:10398000F923B570314633702046FB68F370FFF7BA +:1039900096F9D9E76FF00300D7E76FF00200D4E79C +:1039A000D6E90132002BB8D1E262B7E71801002452 +:1039B000F8B5817804468568002938D04368C66820 +:1039C0008BB39D60A26882B35360002706F10C059B +:1039D000214628462770FFF792F9B368002B4CD098 +:1039E0002846FFF7B0F90446002846D03046FEF7D7 +:1039F000ECFE05463A463946FEF776FF2846FEF7C6 +:103A0000ABFE726A8168054604F10C0004F030FFD9 +:103A1000F923A770214623703046EB68E370BDE8B8 +:103A2000F840FFF74CB9F562CCE73363CDE7AB68FC +:103A300003B35B78832B1DD12846FEF7C6FE0646EE +:103A40000A46FEF751FF3046FEF786FE06466A6AD2 +:103A500004F10C01806804F00BFFF3680BB1E2780D +:103A60001A700023214605F10C002370BDE8F840D0 +:103A7000FFF745B921462846D1E7F8BD2DE9F041C9 +:103A80000C46174698460546002848D00378FA2B7E +:103A900045D1002943D08368C3B15B78832B15D10E +:103AA000FEF793FE064601220021FEF71DFF304679 +:103AB000FEF752FE06466A6A2146806804F0D8FE88 +:103AC000F06808B107700020BDE8F08105F10C0036 +:103AD000FFF739F9064670B121466A6A0C300024B6 +:103AE00004F0C6FEF923314628463370B470F770EF +:103AF000FFF7E5F8E7E7B8F1000F13D04146932050 +:103B0000FEF76CFE40B1094B28465969FEF7AAFE44 +:103B1000EFF30983C3E902476FF00100D4E76FF0C8 +:103B20000300D1E76FF00200CEE700BF18010024C8 +:103B300038B5274C237A012B03D04FF0FF352846A8 +:103B400038BD244A00212448FFF7ACFAA06200F0F7 +:103B50004FF805460028F0D1204AE16C2048FFF7D5 +:103B6000A1FAA0640028E8D01E4AFF2382F8223080 +:103B700092F82230D26863F0FF03C2F30222DB43E3 +:103B800014BFB3FA83F32023C3F12003934298BFF9 +:103B9000531CFE2202FA03F3124ADBB2D377F0235E +:103BA00082F823309368104ADA63BFF34F8F4FF0E7 +:103BB000FF332361FDF70CFF0C48FEF706FE0223DE +:103BC0004370A06183F31488BFF36F8F2372B6E74D +:103BD00018010024B0BE0108DDCF0008ECBE0108CA +:103BE0009546010800ED00E05F060008340100245E +:103BF00038B50D4CFA230025142223700823042124 +:103C000004F10C00A570C4E90935084BC4E901555D +:103C1000C4E90B55FFF7AEF8054B064A2846DC64AD +:103C20001A67054A1A6538BDA8430224DC430224FA +:103C300018010024B1390108C946010838B5114CF2 +:103C4000237A022B1CD1104B1D682846FAF74FFA35 +:103C500000234FF0007285F83F300C4B5A60012270 +:103C60006272BFF34F8F5968C90003D54FF00061EE +:103C70005960A27204232372BDE83840FFF7BEBB2F +:103C8000002038BD180100242827022400ED00E0A0 +:103C900008B5094B1B6833B1084B1B68503343F818 +:103CA0002010002008BD064B1B7813B1054806F014 +:103CB0000BFA4FF0FF30F5E7F8680224C42702241E +:103CC000E40A02242CB4010808B5094B1B682BB187 +:103CD000084B1B68503353F8200008BD064B1B7877 +:103CE00013B1064806F0F0F94FF0FF30F5E700BFDA +:103CF000F8680224C4270224E40A022440B401081C +:103D000038B5044641F21C0004F04EFDC4F8B80278 +:103D1000E0B1022241F2180300F580510C4DC2526D +:103D200000230B6041F20401435041F20801455069 +:103D300041F20C01435041F21001435041F214038F +:103D4000C252D4F8BC321B69984700B1022038BD7A +:103D5000000004082DE9F0410546406888461146F8 +:103D6000DDE9066738B9104806F0AEF96FF47A64F9 +:103D70002046BDE8F081002204F00AFA044608B1AA +:103D80000A48F1E76B6832460121404604F0F0F939 +:103D900000230246BB4208BFB042E9D0696804482C +:103DA000F7F76CF8E2E700BF54B401086AB4010801 +:103DB00077B40108B0F1204F7FB5044614D3154BFA +:103DC0001D681DB32B6800F1C042DE69196B2846DF +:103DD000002303928847039A0023CDE90001284677 +:103DE000B04780B204B070BDB0F1104F06D30A4B9B +:103DF00000F1E0421D682B68DE69E7E7EEF708FF97 +:103E0000214602460548FEF7ADF9EAE74FF6FF7096 +:103E1000E8E700BFE80A0224700B0224283F0224CE +:103E200010B50224C0E90722C0F89442D0F8C002BD +:103E3000EEF759FE002010BD08B5002204231146FC +:103E4000C0F89432D0F8C002EEF74DFE002008BD55 +:103E5000F0B541F21802D0F8B84289B00746A35C29 +:103E6000042B65D104F5805641F204033168002922 +:103E70004FD12278AAB9E358012B41D1002541F254 +:103E8000040341F21802E55003233560A35441F2C4 +:103E90001102A55441F21202A55241F21402A35498 +:103EA0002BE0212A10D1E358052B29D1E378A27801 +:103EB0001B0403EB022362781344227903EB0263B1 +:103EC00041F20802A350D9E7412A19D1E358052B42 +:103ED00016D1E378A0781B0403EB00236078034439 +:103EE000207903EB006041F20803E050D7F8BC32C0 +:103EF0009B6998470028C1D00225284609B0F0BD2B +:103F0000002341F204023846A3503360EEF7E0FD8F +:103F1000B4E70129B2D941F208020239A058D7F812 +:103F2000BC2200EB01312046D569E258A847E1E701 +:103F3000072B4FF0000313D141F2190163541849C4 +:103F400091F82F5041F2110115F004050AD0062016 +:103F5000A05441F212026354A35241F21402A0543D +:103F60001D46CAE70823A35441F212026554A55224 +:103F700041F21402A354D0F8BC325B699847094B54 +:103F8000094A00210948079206950092CDE90437B5 +:103F900004ABCDE9020106480ECBFAF7EFF8ACE727 +:103FA000B80200241D40010875370108400D0300C8 +:103FB0002006002438B5D0F8B432044601795B6895 +:103FC0009847D4F8C04294F8BC33012B21D025681F +:103FD000012384F8BC332846AB6823F00103AB60AF +:103FE000F1F7ACFE4FF48463226813610A4B013B86 +:103FF00002D011698906FAD4A36A012B06D1A369FC +:10400000012B03D0AB6B23F48033AB63002384F824 +:10401000BC33002038BD00BF410D030008B5FFF7D9 +:10402000C9FFFFF755FA00002DE9F7430D7800238B +:104030000646D0F8B84215F06005ADF8063000F03D +:104040007C81202D40F08F8191F80180B8F1060F1E +:1040500000F28981DFE818F0440107004300B40052 +:104060000B012201270141F21803CA88E05C02B368 +:10407000022801D0052818D1498804F58053196019 +:1040800041F2040341F21801E2500323635441F268 +:10409000140163542146D6F8C002C6F89432C6E92A +:1040A0005722EEF735FD002515E03046EEF710FDFE +:1040B000F9E7052801D00228F7D14FF483720025D3 +:1040C000E25241F211030622E55441F21203E55295 +:1040D00041F21403E254284603B0BDE8F083CA88D5 +:1040E00041F21800002A5FD0205C04F580530228BA +:1040F00001D0092852D14F8841F204091F6041F2D2 +:10410000180344F80920DFB9032A21464FF00302BF +:1041100098BF4FF0090804F8038041F21103E754F7 +:1041200041F21203E75241F2140304F803804FF402 +:10413000045323804123A3703046FFF771FEB2E79A +:10414000012F41F211011BD009200025023FE0544C +:1041500041F2120365542146E55241F21403E05442 +:1041600041F20803E058D6F8BC3200EB07301B6A76 +:10417000984734F8092001463046FFF751FEAAE778 +:104180000F220025E25441F212036554E55241F238 +:104190001403E2543046EEF79BFC9CE7002541F205 +:1041A0000402A5501D60F5E7022341F211012354DA +:1041B000625441F21201625241F21401635472E7F7 +:1041C00041F2180204F58055A35C1035032B04D08E +:1041D000062B2DD006222946AEE741F2040341F218 +:1041E0001100E358EBB1042341F21201A354002261 +:1041F0002254625241F21402A35441F20803E058DF +:1042000004F580531968D6F8BC3231B92278412AB6 +:1042100003D15B6A2A469847DCE75B6A2A4601219C +:10422000F9E70521A154235441F21202A3520DE0F3 +:1042300041F21903E35C012B0CD10721A15441F297 +:104240001102A35441F212030022E25241F214037C +:10425000E154BFE7002BBDD1564991F82F10490713 +:10426000B8D50221A15441F21102A354DCE741F276 +:10427000180341F21001E25C0A2A07D1022200254C +:10428000E25441F214036550E25224E70A22E25458 +:104290000E23635041F21403E25204E704F5805107 +:1042A0000122183148E741F21802A35C092B3FF6BE +:1042B000FAAE4FF41B75DD40ED4315F001057FF4B8 +:1042C000F2AE0223A35441F21002A55041F21402AF +:1042D000A35204F580531D6041F20403E550FAE651 +:1042E00041F21800225C092A14D84FF41B73D34002 +:1042F000DB4313F001030DD10222225441F21000DE +:10430000235041F21400225204F58052136041F20E +:104310000402A350274B93F8305015F0100508D035 +:1043200030464546FFF746FED6F8C002F2F710FDCC +:10433000D1E64888F2F774FDCDE64F780B2F12D8FE +:10434000DFE807F006111111111116111111232CBC +:1043500090F89C32032B06D102220DF106013D4656 +:10436000FFF75EFDB7E630460225EEF7B1FBB2E699 +:104370004B881B12212B05D1CA880F49092A28BF57 +:104380000922F9E600221146F6E690F89C32032B4A +:10439000E9D104F5805101220C31EDE68B78032B35 +:1043A000E1D890F89C22032ADDD141F20C02A350FF +:1043B00091E600BFB8020024E502002410B50C4CC1 +:1043C000F9F766F82046F9F792FE00236363F9F7E0 +:1043D0004BF801210748FFF78FF801210648FFF746 +:1043E0008BF801210548BDE81040FFF785B800BFF4 +:1043F000B00B0224740B0224280B022404070024AF +:1044000043682DE9F347DDE90A45804691461BB92B +:104410001B4805F059FE23E0002600274FF0FF0A55 +:10442000AF42D8F8040008BFA64222D0002209EB10 +:10443000060103F0ADFE08B11248EAE70122D8F800 +:1044400004300DF107008DF807A0114605F06AFD54 +:104450000128024609D0D8F804100B48F6F70EFDE3 +:104460006FF47A6002B0BDE8F087013647F10007CB +:10447000D6E703F0C5FC0028F4D00448C9E700BF24 +:1044800095B40108ACB40108BAB40108D9B4010864 +:1044900070B5044640680D46049E114618B9104890 +:1044A00005F012FE12E0002203F072FE08B10D4882 +:1044B000F6E7012263683146284605F033FD0128FE +:1044C000024606D061680848F6F7D8FC6FF47A60B7 +:1044D00070BD606803F094FC0028F9D00348DFE762 +:1044E000E7B4010800B5010810B5010831B50108AD +:1044F00008B5406803F0BAFB002008BDF7B50446D4 +:10450000D0E9020103F0B8FD606048B9D4E90212B5 +:104510001348F6F7B3FC6FF47A65284603B0F0BD94 +:104520000222002103F034FE054618B10D4805F0C3 +:10453000CBFDF0E76068002703F0E8FED4E9042330 +:104540009F4208BF904206D0A168CDE900230246F1 +:104550000548F6F793FC012384F83030DDE700BF0F +:1045600041B5010868B5010875B5010810B50446E4 +:1045700004F022F9204610BD10B504460168D0E9C8 +:1045800001230548FDF73AFF206804F015F920469D +:10459000BDE8104004F010B9283F022438B5D0F827 +:1045A000B832002541F21801044603F58052156027 +:1045B00041F204029D5002225A5441F210015D540E +:1045C00041F214015A54D0F8B80218B104F0F4F8CA +:1045D000C4F8B852002038BD1FB51648FEF752F88F +:1045E000154B1868F0B10368DB68984701A90120F2 +:1045F000EFF76EFCB0B902A90198EFF795FE0146FE +:1046000068B99DF808300198022B0FD0032B06D112 +:10461000EFF768FE18B902210198EEF787FD0198BF +:10462000EFF742FC002005B05DF804FB8268EEF76E +:1046300097FDF4E7283F0224E80A022401F0FCBFBA +:10464000EFF310832BB9EFF31180003818BF01206E +:10465000704701207047000008B5EFF305834BB1A8 +:10466000084B5869084B1B6803B19847DFF81CC01A +:1046700000DFFEE7FFF7E4FF0028F1D1DFF810C00C +:1046800000DFEFE718010024F4AD0108F12E010866 +:104690001D27010804460B4D07B5EFF30583002BDA +:1046A000FBD1FFF7CDFF02460028F6D12046694630 +:1046B0004FF0FF33AC4600DF0028EED1DDE90030DB +:1046C0009847EAE7A13801082DE9F74F394D6C6C9E +:1046D000002C63D023694FF00008DFF8E0904FF022 +:1046E000F90A013B6F6923612369002B55D1E36807 +:1046F0000BB1A2689A60D5F84CB004F118016B6454 +:10470000EFF3058343B1BBF1000F13D1AB69032174 +:1047100029486B61EEF780F90191FFF791FF01994C +:1047200002460028EFD158461346CC4600DF002849 +:10473000ECD11BE09BF800300191FA2BE6D10BF194 +:104740000C00FEF700FB06460028DFD001990C3074 +:10475000DBF8242004F08CF80199304686F800A09C +:10476000A6F80280C6E9011BFFF774F8E378012B75 +:104770001DD16B6C0021626913B11869824210D29D +:104780002261C4E902131BB118699C60821A1A6184 +:1047900059B1CC606C6C002CA6D16F6103B0BDE840 +:1047A000F08F1946121ADB68E6E76C64F2E7012322 +:1047B0006370EFE718010024270102807D3A0108A9 +:1047C00007B5BFF35F8F7E4B0022196810465A6011 +:1047D000C1F30721914240F0A5801022DA60794AA6 +:1047E0001A611322DA60784A1A611122DA60774A74 +:1047F0001A61774ADA60774A1A6107225A60BFF372 +:104800004F8FBFF36F8F744B744998684FF000530C +:104810001A1802F16042126843F8042B8B42F7D158 +:104820006D4B4FF000529A605A69920315D45A6941 +:1048300012F4003211D1BFF34F8FBFF36F8FC3F863 +:104840005022BFF34F8FBFF36F8F5A6942F400328B +:104850005A61BFF34F8FBFF36F8F5F4B5A69D60317 +:1048600027D45A6912F4803223D1C3F88420BFF3CD +:104870004F8FD3F8802043F6E074C2F3C900C2F32F +:104880004E32520102EA0406014646EA81750139B8 +:10489000C3F86052F9D2203A12F1200FF2D1BFF3DF +:1048A0004F8F5A6942F480325A61BFF34F8FBFF382 +:1048B0006F8F4B4CD4F8E03043F00073C4F8E03015 +:1048C000D4F8E03003F000730193019BF1F760F935 +:1048D0004149444BCA6822F4E0621204120C1343AB +:1048E000CB60F1F74DFCA369A369F2F777F8236F6A +:1048F0009D070AD43C4A136843F4807313603B4B12 +:104900001B68236F23F018032367374CE36803F019 +:104910000703062BE36809D0F2F7FEF8C0B9344864 +:10492000F8F77EFF9A600132186153E723F03F03E6 +:1049300043F00203E360F0F733F805466368980438 +:10494000EAD4F0F72DF8401BB0F57A7FF6D9E3E70B +:10495000F1F71EF9EBF776FFEFF305832BB9FFF7BD +:104960006FFE10B9DFF8A4C000DF224A224B1361AA +:104970004FF4805353614423D360204B936018233A +:1049800093611F4B1360EFF305831BB119491D4859 +:10499000EEF742F8FFF754FE01460028F6D11A4818 +:1049A000DFF86CC000DF0028F0D0EFF305832BB9EF +:1049B000FFF746FE10B9DFF85CC000DF0021E6E734 +:1049C00090ED00E039F00206390702133FF50B13B2 +:1049D000120000803900021300ED00E09802002070 +:1049E000004402580003FA05004802580010005C19 +:1049F000C3B50108D03E0224D02E02242C44022448 +:104A0000D7B501081D010180B17401088133010887 +:104A1000A5300108313B0108B1F1204F2DE9F043E9 +:104A200006468BB00D4614461CD3794F38680028D3 +:104A300000F0EA8003684FF0000990460022196BED +:104A400000238847894505F1C04508BF84423DD30E +:104A500038682A460368CDE900899C6900233146FD +:104A6000A04761E0B1F1104F62D2104603F09CFE06 +:104A700022463146074603F0FBFE0C2003F094FE6D +:104A8000644B00228460059306AE634B0492CDE92B +:104A9000023002ABC0E900750FCB604D86E80F0015 +:104AA000F8F7F6FC2B4653F8184F002C5DD1EB6954 +:104AB000332B40F29F802C6A343B04F13402EB61CB +:104AC00034232A6223600123A37157E0386800224F +:104AD0000368196B0023884703F066FE22463146BF +:104AE000804603F0C5FE386808EB040903685B6B79 +:104AF00098470646386800220368196B00238847E8 +:104B00003146021B484603F0C1FE3C680022236880 +:104B100020469E69196B002388472A460023CDE969 +:104B2000000141462046B04780B20BB0BDE8F0839B +:104B30003B4F01F1E045002238680368196B002300 +:104B4000884700238B4208BF844206D2386800227F +:104B50000368196B002388470446386800230268FD +:104B6000CDE9004394692A4679E72268332A3DD982 +:104B7000E268002A37D01A60A3689360F8F774FCE3 +:104B800000224FF0FF3304F12407C4E9052396E81F +:104B90000F0087E80F00234BE361FCF731FF224B46 +:104BA000024621462362636903441C486361F9F7A6 +:104BB00057FA2A6BEFF3058313B9FFF741FDE8B10C +:104BC000D2B11378F32B17D102F10C03012153E872 +:104BD000004F44EA010043E8000505B1F7E710463D +:104BE000FEF738FE08E0A2681A60C7E704F1080380 +:104BF000A4685AE7F8F738FC002096E71046012130 +:104C0000DFF828C000DFF7E74FF6FF708DE700BF41 +:104C1000E80A0224AF35010879450108241302246B +:104C2000700B0224D33501083F500108A54F01083D +:104C300073B51F4C04F1560504F15A06B4F854102C +:104C400028460191FDF71BFF58B301993046FDF747 +:104C500023FFE36D53F8200018B30378F13B082BD2 +:104C6000ECD801A252F823F08D4C01083D4C01080C +:104C7000934C01083D4C01083D4C0108974C01083C +:104C80009B4C01083D4C01089F4C0108236E98473E +:104C9000D4E7636EFBE7A36EF9E7E36EF7E7236FF4 +:104CA000F5E7002002B0BDE87040FDF7F5BD00BF9C +:104CB000180100241F4B186870B53830EEF728F83B +:104CC00018B11D4B4FF080625A601C4CE3680133F1 +:104CD000E360FDF73DFE0020FDF7DEFD236D03B12F +:104CE0009847226C2AB3A369E16B994203D0D96932 +:104CF000E36301B9DA61DA69BAB9267A022E18D10A +:104D0000656AB5B1E36B95F9202093F920309A429A +:104D10000FD12846FDF74AFDE06BFDF7B5FD6E703B +:104D2000236CE563A561EB6103E0013ADA61002AD7 +:104D3000E3D070BD2827022400ED00E01801002414 +:104D400010B50446EFF305831BB15CB96FF00300A7 +:104D500017E0FFF775FC0028F7D12046DFF82CC0DC +:104D600000DF0EE02378F62BF0D1E18904F10C008E +:104D7000FDF79FFEE389834204D92046FEF76AFDD2 +:104D8000002010BD6FF00200FBE700BFD12A010830 +:104D900010B52C4C2C48F5F757FE636913B994F8FD +:104DA0003D3023B12848F5F72FFE002010BDA36A3F +:104DB00053B1A26A00232549E06AB3EB900F11D2E8 +:104DC00042F823100133F7E7E06A214B984294BF81 +:104DD00020F003004FF0FF3003F0E6FCA062002853 +:104DE000E7D1DFE744231B4A63621B4B2262636007 +:104DF0001A4BA3600023E360194B2361EFF3058393 +:104E00008BB10023636194F83C302BB1A06A08B1E8 +:104E100003F0D2FC0023A3620B48F5F7F5FD206CEC +:104E2000FFF78EFFC1E7FFF70BFC0028E9D1A2F1E5 +:104E300078010C48603ADFF830C000DF606100287C +:104E4000B0D1E0E780130224D4130224A52E5AE245 +:104E5000FBFFFF7FF813022424130224D11B010857 +:104E6000B535010809AE0008A5300108024608B5AD +:104E7000EFF3058313B16FF0050008BDFFF7E0FB0A +:104E80000028F8D11046DFF808C000DFF5E700BFC2 +:104E9000992F0108074B10B504460360F6F704FE8E +:104EA000D4F8BC00FFF7E2FF201DFDF7F9F820461B +:104EB00010BD00BF30BD010810B50446FFF7EAFF82 +:104EC000204603F079FC204610BD0000024608B5DC +:104ED000EFF3058313B16FF0050008BDFFF7B0FBDA +:104EE0000028F8D11046DFF808C000DFF5E700BF62 +:104EF000312B0108024608B5EFF305830BB1002002 +:104F000008BDFFF79DFB0028F9D11046DFF804C06B +:104F100000DFF5E7D932010810B402F0010492076E +:104F200009D40C301CB15DF8044BFDF770BD5DF881 +:104F3000044BFDF75BBDC06801EA00022CB1914251 +:104F400018BF00205DF8044B7047002A08BF0020FE +:104F5000F8E70000F8B50D4617461E460446C0B1F6 +:104F60000378F32B15D1002913DBFFF7D5FF90B998 +:104F700096B131464320FDF731FC38B1084B20464D +:104F80005969FDF76FFC4D6281F823706FF00100E5 +:104F900001E06FF00300F8BD6FF00200FBE700BF17 +:104FA00018010024F8B5064670B30378F32B2BD113 +:104FB000002929DB00F10C0353E8002F42EA010429 +:104FC00043E8004000B1F7E7B56825B92846FDF78A +:104FD00063FC2046F8BD696A304695F82320AF6827 +:104FE000FFF79AFF014668B195F823309B0756BF3B +:104FF0006C6A044620EA04042846FDF7D7FB002229 +:10500000FDF772FC3D46E0E76FF00304E1E770B5A1 +:105010000546846804B970BD616A284694F8232067 +:10502000A668FFF779FF014628B12046FDF7BEFBD1 +:105030000022FDF759FC3446ECE7C3681847FFF738 +:10504000FCBF38B5D0F8C04201F00F0563689D423F +:1050500037D811F0800F4FF01C0234D002FB05430B +:1050600002FB054101223C3381F83D2001221D70E5 +:105070009A7094F8BC13914223D084F8BC231A7818 +:105080005B782068012B4FF020030CBF00F5106106 +:1050900000F5306113FB02131968002904DB1AB113 +:1050A0001A6822F080421A601A6842F400121A60EC +:1050B00025B904F57172217CF0F71AFE002384F8FB +:1050C000BC33002038BD02FB014302FB014100223A +:1050D00003F5FE7381F8FD21C8E770B50446164656 +:1050E0000D4651BBD0F89432032B1FD1D0E9581292 +:1050F00091420ED9891A8A42C0F86011D0F8C002D4 +:1051000088BF8AB2314698BF92B2EDF701FD2846BA +:1051100070BDD0F8B4321B6923B190F89C22032AE9 +:1051200000D198472046FEF787FEF0E7052BEED129 +:10513000C4F89412FFF785FFE9E7D0F8B4329B6911 +:1051400033B190F89C22032A02D100259847DEE76C +:105150000225DCE700212DE980480846BDB0FEF7B6 +:1051600097FDF1F7D9FCF0F713FDFFF727F9AE48EB +:10517000FDF7A4FAAD4B186803689B689847AC4BE1 +:105180001868002800F06E8303689B68984719230D +:10519000A84A3021A848F5F761FEA84ED6F8B432E7 +:1051A00013B10023C6F8B432A54B0622A54CDFF894 +:1051B000A8C2C6F8B0320123C4F8046486F89C3251 +:1051C0000023C6F8C042337023632362E362636244 +:1051D000C4E900C20222C4E9062394F8BD33E260A8 +:1051E00003F0FF07002B48D1974D032084F8BC73D0 +:1051F00007A9D5F8E03043F00103C5F8E030D5F851 +:10520000E030099703F001030693069B4FF4C05367 +:10521000CDE907320A23CDE90A038C48EDF7B2FC49 +:10522000BC2239460DA803F031FB4FF480230CA8B3 +:105230000C934FF440132E93F0F7E8FDE8B9844A3D +:1052400005216520D36843F08073D360D5F8D8304A +:1052500043F00063C5F8D830D5F8D83003F00063C8 +:105260000593059BD5F8003123F00063C5F80031A4 +:10527000EDF766FC774B2022DA600323276884F879 +:10528000BD33754BDB6B13F4807308BF2361BB68C0 +:10529000D4F8108023F00103BB60A369012B40F018 +:1052A000EC82BB6B626B23F48033012ABB63FB6827 +:1052B00023F4840323F04003FB60FB6823F44013D2 +:1052C000FB6003D1FB6843F48013FB603846F0F7C2 +:1052D000F7FC0546B8F1010F10D1FB6D9BB2FB65E1 +:1052E000FB6D43F07B7343F40033FB65BB6843F015 +:1052F0000603BB60BB6843F02003BB60002D00F0D9 +:10530000D182022384F8BD332368A022D6F8C002DC +:105310005A625A6A42F420029A62504BC6F8B4327A +:105320004F4BC6F8BC32F1F713FD4A4B4FF4005215 +:10533000C3F88820BFF34F8FBFF36F8F2022C3F8CD +:105340008C20BFF34F8FBFF36F8F434B5A699B691C +:105350001A4200F01B823B4F3C68B946636913F068 +:105360000103039340F012826269A3691A4200F0BC +:105370000D826369A26913409B0703D5636903F03B +:10538000020363616369A2691340DE0629D5A3693C +:1053900023F01003A361266AC6F3434306F00F050A +:1053A000022B40F09E8347F6F0731E4214D01C235C +:1053B000C6F30A18204603FB05954246D5F80812A5 +:1053C000F0F7CAFCD5F808324344C5F80832D5F8DE +:1053D00014324344C5F814323A68936943F0100319 +:1053E00093613B685A6999690A40150300F19E83ED +:1053F000144E3368B1465A6999690A4012F4802FF5 +:1054000030D0D3F8182803F50063374604F5106B45 +:10541000DB6913409BB2029300230193029B002B94 +:1054200040F0C2861EE000BF283F0224700B022419 +:10543000E80A0224DCB5010894270224E8270224A4 +:10544000BC010024343F02240044025800000258EA +:105450000048025800E100E0000008400802002473 +:10546000440200243068426983691A4210D5D4F896 +:10547000043823F00103C4F8043896F8F433012B00 +:1054800004BF002386F8F433436903F0004343610B +:105490004369826913401A0510D5D4F80838DB0730 +:1054A00008D5D6F8043493F89C2283F89D22042270 +:1054B00083F89C22436903F4006343614369826972 +:1054C00013401F0111D5436903F000634361BA4BD8 +:1054D00093F8F423002A40F08287012283F8F42312 +:1054E000426DC2F38302C3F8F82343698269134013 +:1054F000DD043ED5D4F8043804F5006223F001033E +:1055000053604FF484630361AC4B013B02D00169EB +:105510008906FAD404F51063DFF89CC24FF67F3792 +:10552000DCF804100D460399A942C0F06387D369E3 +:1055300043F00113D361DCF83030002B00F07B879F +:10554000D2F8843043F00B03C2F88430536C43F03C +:105550000B035364D4F80038994A23F4FE63317C7A +:10556000C4F80038F0F7C4FB3268536903F4805381 +:10557000536134686369A26913409F0440F1BE809F +:10558000D4F8003923F4FF6323F00703C4F800398B +:10559000D4F8042842F48072C4F80428D4F8082807 +:1055A00012F0060304D012F0020F14BF02230F23DF +:1055B000F360F0F785FEF768FBB2022B40F05987E5 +:1055C000804B814A0344934240F241877F4B804A9B +:1055D0000344934240F23E87A0F574037D4AA3F54D +:1055E0001053934240F23987A0F183737A4AA3F5AE +:1055F000E7439342C0F03487784B794A034493429F +:1056000040F23187774B784A03449342C0F02E87AB +:10561000764B774A03449342C0F02B87A0F1B773CF +:10562000744AA3F558539342C0F02687724B734ACD +:105630000344934234BF07230623E268003F4FF040 +:10564000000822F4705218BF0127E260E26842EAC3 +:105650008323E3604023D6F80444D4F8C052C5F84D +:10566000043205F5FE7195F8BC33A5F8FC81012BD9 +:1056700085F8FF8107D00123286885F8BC33F0F74F +:105680008EFB85F8BC83D4F8C052402201234FF032 +:105690000008C4F864214FF48070C4F8583105F153 +:1056A0003C016A6495F8BC23A8879A4285F83F803C +:1056B000A5F8428006D0286885F8BC33F0F76FFB68 +:1056C00085F8BC83012300214022A36184F89C3229 +:1056D000D4F8B8326262C4F894126160C4F8A412BB +:1056E00023B1D4F8B43220465B689847D6F8043426 +:1056F00032681F74536903F400535361326853696D +:10570000926913401D070FD5D6F8040490F89C3217 +:10571000032B04D1D0F8B432DB6903B19847326867 +:10572000536903F00803536133685A6999690A4061 +:10573000D40203D55A6902F480125A615A699969F0 +:105740000A40900203D55A6902F400125A615A695C +:1057500099690A40510003D55A6902F080425A61A2 +:105760005A6999690A40520710D55C68630709D5E0 +:10577000D6F80404012380F89C32D0F8B4320179C1 +:105780005B68984733685A6814435C601C4B1A681E +:10579000511C1960282192FBF1F301FB1323002B0C +:1057A0007FF4D3AD174E184D3478002C3CD1174AF6 +:1057B0002B7812782CE000BF343F0224410D030007 +:1057C000F8420224405327FFFF340C00401E1BFF09 +:1057D0003F420F007F4F120020D6130060B6E5FE57 +:1057E0005FE3160000D3CEFE40771B00C05BB3FE24 +:1057F000C091210020753800E05459FEE09C410022 +:10580000B82C0224B72C02243B0300243A030024C2 +:10581000BD4813442B7043681A6803681A420CBFD2 +:1058200001210021FDF768FE2B780134A3F10A0263 +:10583000E4B2D2B23470F02A05D9B4490A785042A1 +:105840009B1A08702B702B78A3427FF47EADAE4874 +:1058500043681A6803681A420CBF01210021FDF752 +:105860004BFE72E51923AA4A3021AA48F5F7F6FA49 +:10587000A949AA4803F0F6FD8FE4FB683846D4F83E +:10588000289043F04003FB60F0F71AFABB6B054623 +:10589000B9F1000F03D143F48033BB631AE523F45D +:1058A0008033FAE723683220DA6822F0C042DA60F7 +:1058B000DA6842F08042DA60F1F7B2FA67682B46A4 +:1058C0004FF01C0C4FF0010E2846D9B25A1C8F42E3 +:1058D00000F2B28000234FF01C0C1946D8B20133FD +:1058E000874200F2B8802368D4F82CC0D4E90312B0 +:1058F0000292D4E906E201920022904602F14000B1 +:10590000013203EB80000F2AC0F80480F6D103F5C2 +:105910000060BCF1000F40F0AB80426842F0020230 +:1059200042609A6B22F400129A631A6842F04002B5 +:105930001A601A6842F080021A600022BEF1010F5C +:10594000C3F8002ED3F80028C3F80028D3F80028A5 +:1059500040F09680002940F09080C3F800284FF472 +:1059600084621A616E4A013A00F08D8019698906D5 +:10597000F9D410221A616A4A013A00F08680196946 +:10598000C906F9D4002203F510614FF090484FF09A +:10599000006996464FF67F3A02614261C2619742C2 +:1059A00075D1002703F530614FF090484FF0006942 +:1059B000BE464FF67F3ABA427ED1026922F4807227 +:1059C000026100229A616FF080425A61029A1AB90C +:1059D0009A6942F010029A619969524A0A439A619F +:1059E000019A1AB19A6942F008029A61BCF1010F5A +:1059F00005D19A6942F0804242F004029A61002D7A +:105A00007FF47FAC012284F8385084F8BD23626AA9 +:105A1000012A0DD184F8F453C4F8FC239A6942F0AA +:105A200000629A615A6D42F0805242F003025A6558 +:105A30001846F0F783F967E40CFB014383F83DE077 +:105A400083F83C10A3F8421083F83F001865C3E9BF +:105A50001100134639E70CFB004282F8FD1182F871 +:105A6000FC0182F8FF11C2F81012C2E9811135E77A +:105A70009A6B42F400129A635FE742F001026CE70E +:105A800042F0030269E7012573E701257AE7D1F8BF +:105A900000B0BBF1000F0CDA42B9C1F80090C1F8B8 +:105AA00010E00132C1F808A0203178E7C1F8008089 +:105AB000F5E7C1F800E0F2E7D1F800B0BBF1000F64 +:105AC0000CDA47B9C1F80090C1F810E00137C1F80D +:105AD00008A020316FE7C1F80080F5E7C1F800E0C9 +:105AE000F2E7062B7FF478AC08220F492046C6F374 +:105AF0000A16F0F731F91C2303FB0595D5F814328B +:105B00001E44C5F8146267E4280B02243A030024FB +:105B100007B601089427022432B60108D8010024F0 +:105B2000410D030000383C80F8420224D3F8187875 +:105B300003F5006304F53069DFF8A0B2DB694FF0CC +:105B400000081F403F0C002F3FF452ACF80740F113 +:105B50007B81A24D5FFA88F6286800F5306C0CEB6B +:105B600046139A68D0F8143802EA030A2B461AF052 +:105B7000010F1BD0296901220CEB481C0129C9F82F +:105B80000820D0F840E0DCF8082040F09E801107A3 +:105B900007D5934B9E4509D9100407D54FF4004310 +:105BA00002E0910670D52023CCF808301AF0080FD7 +:105BB00000F037812B680822C9F808201A6C03F519 +:105BC0003063019203EB481301999A6808468449AF +:105BD000884204D9110402D54FF400429A607F4AEA +:105BE000D2F8045492F8C40305F52A7185F8A80286 +:105BF00092F8C5C385F8A9C292F8C73392F8C66374 +:105C000006EB0326B6B2A5F8AA6292F8C9E392F8A9 +:105C1000C83303EB0E239BB2A5F8AC3292F8CBE36A +:105C200092F8CA2302EB0E224FF0010E92B2C5E9A0 +:105C3000A5E200F01F0EA5F8AE22BEF1010F00F0A4 +:105C4000AF81BEF1020F00F0CA81BEF1000F40F03B +:105C5000A88200F06000202800F0F781402800F0C2 +:105C6000F481002840F08780BCF1090F00F28380A6 +:105C7000DFE81CF06F018901810083018100F200DF +:105C80004900810058011E0112F0280F8ED154499D +:105C90008E4501D9120481D4DCF81020DBF80412FF +:105CA000C2F312028A1ACBF81422DBF8082211443C +:105CB000D5F8102258EA0202CBF8081210D1494A4E +:105CC0000121F0F715F8454B0AE047498E4512D1FE +:105CD00011043FF563AF900602D52022CCF80820CE +:105CE0001C223146D5F8040402FB0633D3F80822FF +:105CF000FFF7F3F95AE7D5F8101258EA0101EFD18E +:105D000005F57172DDE70023ADF83030330A013B51 +:105D1000062B30D8DFE803F00416222F2F4E570051 +:105D2000D5F8B0321B680CA9287C9847BDF8302004 +:105D3000002A64D0B5F8AE32002B57D12846FEF7C2 +:105D40007BF860E02A7CD5F8B4322AB99B6A0CA8AB +:105D5000984702234370E9E7DB6AF8E7F1B20529C7 +:105D60001FD8DFE801F0030A0E12161AD5F8B03278 +:105D70005B68002BD7D12846BDE0D5F8B0329B68D0 +:105D8000F7E7D5F8B032DB68F3E7D5F8B0321B6936 +:105D9000EFE7D5F8B0325B69EBE7D5F8B0329B6935 +:105DA000E7E7D5F8B4329B6B002BE4D00CAA284669 +:105DB0009847BBE72B7C002BDDD1D5F8B4320CA87B +:105DC0005B6B9847B2E72B7C002BD4D1D5F8B4326B +:105DD0000CA81B6B98470723BCE700BF343F022485 +:105DE0000A30544FF84202240A31544F9A42014675 +:105DF000284628BF1A46ADF83020FEF711F8B5F84E +:105E0000AE32002B9AD0019B1A46CC4B9A4208D94D +:105E1000CB4B1969012904D103F571721868EFF7AA +:105E200067FF1AF0100F02D01023C9F808301AF0DB +:105E3000200F02D02023C9F808301AF4005F03D0E5 +:105E40004FF40053C9F8083008F101087F0809F140 +:105E500020090BF11C0B76E61A438CD17F2E8AD8D1 +:105E600095F89C32032B86D0F3B2D5F8C01285F892 +:105E70009E3291F8BC03012810D0086881F83830B0 +:105E8000D0F8003823F4FE63C0F80038D0F80038AA +:105E900043EA0613C0F8003881F8BC232846FDF712 +:105EA000CBFF1EB1022385F89C32ACE70123FAE751 +:105EB000F1B2A44E012931703FF65DAF95F89C32E6 +:105EC000022B09D0032B19D02846ECF701FE3178BC +:105ED0002846FDF73DFC96E700293FF42FAF01214E +:105EE0000323696085F89C322846FDF738FC0228B8 +:105EF00028467FF424AFECF7EBFD84E739B90223A1 +:105F00002846696085F89C32FDF722FC16E769682F +:105F100001293FF413AFC9B22846FDF719FC3178C7 +:105F20006960E1E7012A7FF426AF95F89C32022BE5 +:105F30000AD8002B3FF41FAF2946002341F8083F41 +:105F40002846FDF76DFF5EE7032B7FF414AF291D94 +:105F5000F6E795F89C32013B022B3FF60CAF022A84 +:105F60007FF409AF0123EB60D5F8A4320BB1032312 +:105F7000EB60022205F10C01E2E7012E7FF443AF52 +:105F8000C5F8A462DAE695F89C32013B022B3FF695 +:105F9000F2AE012E7FF437AF0023C5F8A432CDE670 +:105FA00000F06002402A02D042063FF5E4AE95F8C8 +:105FB0009C22013A022A3FF6DEAEDBB2022B3FF60C +:105FC000DAAED5F8B43228469B689847B5F8AE32B9 +:105FD000002B7FF418AF00287FF415AFAEE600F079 +:105FE0006000202831D040282FD000287FF4C3AE95 +:105FF000BCF1010FD9B240D0BCF1030F2BD0BCF1E2 +:10600000000F7FF4B8AE95F89C22022A00F09C8025 +:10601000032A7FF4B0AE5BB201F00F001426002B10 +:1060200006FB005080F29F808269002A3FF4A3AEF5 +:1060300001F07F0202FB06662E4411F07F0240F061 +:106040009E803260022231467AE7D5F8B432284683 +:106050009B689847D7E695F89C32022B5AD0032BC1 +:106060007FF489AE4B063FF469AE56EA02037FF433 +:1060700065AE2846FEF7E5FF60E695F89C22022A09 +:1060800048D0032A7FF477AE002E7FF4BCAE4A06D8 +:106090003FF454AED5F8C02201F00F0150688142A0 +:1060A0003FF64CAEC1EBC10013F0800F4FF01C0364 +:1060B0004FEA800039D03C3003FB01230126104415 +:1060C00083F83D6000230170837092F8BC33012B8C +:1060D0003FF434AE012311684FF0200C82F8BC333A +:1060E00043780678012B0CBF01F5106301F530638E +:1060F0001CFB0633196821F400111960C1780239BC +:10610000012903D8196841F080511960002382F8F1 +:10611000BC3313E64E0628463FF4EDAEFEF791FF82 +:1061200080212846FEF78DFF6DE600F5FE7003FB2B +:1061300001230026104483F8FD61C3E70A30544F61 +:10614000343F0224F83E02244E067FF414AE1806B3 +:106150004FF000034FF002024CBF05F1140105F5AA +:10616000AA710B60ECE6D0F85821002A3FF403AE88 +:1061700001F07F0206FB025606F5AA765DE7002BCA +:10618000D5F8C0024FF01C03B5BF03FB020103FBAF +:10619000010391F83E3093F8FE3103B101233360DF +:1061A00050E700F08001BCE7029BD90740F10C8169 +:1061B000D9F800009DF804A0D0F8101800F510627E +:1061C000D0F834580AF00F0802EB4A1225FA08F802 +:1061D00092684FEAC8185FFA88F848EA010808EAA6 +:1061E000020818F0010F42D0019BD4F8342803F0C4 +:1061F0000F01012303FA01F122EA0102D9F810107C +:106200009942C4F83428CBF808300BD1019BD7E968 +:1062100011522A44BA64D9F85020134302D1984A43 +:10622000EFF766FD974BD3F80454BAF1000F40F036 +:106230009B80D5F89422022A40F08E80D5E9082070 +:10624000824260D9121A996CD5F8C0022A6292B2C1 +:10625000ECF749FC52465146D5F8C002ECF758FC21 +:1062600095F8A022012A02D1002285F8A02218F078 +:10627000080F02D00822CBF8082018F0100F02D027 +:106280001022CBF8082018F0400F02D04022CBF8A3 +:10629000082018F0020F02D00222CBF8082018F0D4 +:1062A000800F00F09180D7E91421914200F28C8098 +:1062B000521A796CD9F800508A42019B05F5106C8E +:1062C00028BF0A4605F580510CEB431C033201EB55 +:1062D0000A339208DCF818E01FFA8EFE9645D7E9DB +:1062E00014016FD3884201D900284CD1019A0121B1 +:1062F000D5F8343802F00F0201FA02F223EA020361 +:10630000C5F8343860E0E969B1FBF0F200FB121225 +:1063100072B988420CD8D5F89822914208D25246D8 +:106320005146D5F8C002ECF7DEFBC5F898A291E71C +:10633000D5F8B422D2682AB195F89C12032901D16C +:106340002846904780212846FEF77BFE0522C5F8A7 +:106350009422002211467FE732F0040380D180218D +:106360002846FEF76EFE7BE7D5F8B4225269002A74 +:106370003FF47DAF95F89C1203297FF478AF514626 +:106380002846904773E7411A7A6C99F810009142B9 +:1063900028BF1146CA1C920830B1B86C0844B864D2 +:1063A000786D0144796595E788B2D7F848E0033005 +:1063B00080080EEB80007045EFD05EF8048BC3F8C8 +:1063C0000080F8E7884291D9019B1C370BF1200B24 +:1063D00001330193029B5B080293FFF71FB8D3F8C8 +:1063E000043493F89C2283F89D22042283F89C2293 +:1063F000FFF77BB89F60203353F8201C21F4001175 +:1064000043F8201C53F8201C41F0006143F8201C85 +:10641000C3F8E871D3F8E01121F40011C3F8E011DA +:10642000D3F8E01141F00061C3F8E01103990131A4 +:106430000391FFF775B8536943F4005343F02B03FE +:106440005361136943F00B031361FFF783B80F2304 +:10645000FFF7F3B80E23FFF7F0B80D23FFF7EDB801 +:106460000C23FFF7EAB80B23FFF7E7B80A23FFF77F +:10647000E4B80923FFF7E1B80823FFF7DEB800BF4F +:10648000F8420224343F0224094B0A4A1978FF29B2 +:106490000BD101339342F9D1074A1978FF2904D16E +:1064A00001339342F9D1012070470020704700BFAB +:1064B0000003000800040008000500085248F8B571 +:1064C0000578BFF35B8F15F0010540F09280F6F779 +:1064D00083FF002800F08D804C4C5C224C4B2946F9 +:1064E00004F108004B4E236001274B4B636002F020 +:1064F000CDF93B23201DC4F8A850A4F89A30474B8F +:10650000A4F86850C4F88C5084F89850C4E9276304 +:106510004FF4003366266366414BA4F8A460C4E9D7 +:106520002437404BC4E92B35F6F704FE04F1BC00D8 +:10653000A4F8B860F4F77CFC3B4B3C48C4F8F43159 +:10654000C4F8005284F80452FBF718FCF4F77CFA04 +:10655000374A1568092D51DC364B1B68981E1946C1 +:1065600003F1120630F9027F662F4AD0B042F9D10A +:10657000143308460231B0F9006001363BD166237E +:1065800003800135156000252848FBF7F7FBF4F779 +:106590003BFA0020002100224FF0FF33C4F8B45032 +:1065A000C4F8602184F8542184F8FD2184F8FE2188 +:1065B0000222C4F81831C4F8E830C4F8FC30C4E949 +:1065C00044014FF400300121C4F8F8010320C4F85D +:1065D000281184F8F010C4E93802C4E93D333522AB +:1065E0004FF080730848C4F8EC20C4F80031F6F787 +:1065F000EBFE0648F8BD9942BBD1C2E76FF001053A +:10660000C2E74FF0FF35BFE7AC2B0224C02C0224B9 +:1066100030BD01083C0042001CB3010856005A007E +:1066200040420F0035D10008005A6202781402245B +:10663000A0140224D00600242DE98048744AA7B093 +:10664000136804AF53B9734B7349196001F50231F4 +:106650000B6843F480730B60012313600720DFF89D +:10666000E8B1FDF731FB10F0010000F0C580012317 +:106670006A488BF8003003F027FD0020684EFDF7D4 +:1066800023FB054667480478BFF35B8F14F00104D1 +:1066900030D1F6F7A1FE68B3634BD3F8D020510098 +:1066A00000F1AD80D3F8D020002AC0F2A880D3F842 +:1066B000D020D20000F1A580D3F8D020500100F105 +:1066C000A080D3F8D020D10100F19D80D3F8D02054 +:1066D00012020BD4D3F8D020900200F19680D3F8A8 +:1066E000D03013F4800F0CBF0B2401244D483470BC +:1066F000F6F76AFE4D4C2378BFF35B8FD9070BD4B6 +:106700002046F6F769FE38B1474B2046D3F8D02033 +:10671000474B1A60F6F758FE434A0820D2F8D030AB +:1067200043F48033C2F8D03034782146FDF7B0FA14 +:10673000012C08D14DF659710020FDF7A9FA4FF44C +:10674000FA70F0F76DFBF0F745FB0A20F0F768FBF5 +:106750004DF659739D4200F02082FFF795FE0446E6 +:10676000002800F03B829BF8003013B1314803F061 +:10677000ABFC40F2AA739D4240F041810120FDF73D +:10678000A3FA0546C4B20220FDF79EFA8046032014 +:10679000FDF79AFA9BF8003078612BB10346424628 +:1067A00021462548F4F76AFB2448FBF787FF14F0DD +:1067B000020F234E61D014F0600A4FF02800DFF87A +:1067C0008C9045D0F6F7F2FD002308F10062C8F581 +:1067D0000011C0F8009080F820304362C0E9042323 +:1067E0000132C0E90133C0E9061301D0002943D1C9 +:1067F00000211448ECF710F98BF800003DE706245F +:1068000074E7042472E7032470E702246EE700BFF4 +:10681000F8680224C4270224004000588DB60108FD +:10682000C82E0224B02B022400440258B42B0224A8 +:10683000CC2E0224ABB60108C8B60108283F0224BA +:10684000F43E02240101FF80E40A022408A90108A1 +:10685000F6F7ACFD4FF000620023C0F808A080F806 +:1068600020A0C0F824A0C0E904234FF400120023A4 +:10687000C0E9009AC0E906233060620702D5FFF73D +:106880001DFE3060230705D59BF8003013B1C448C6 +:1068900003F01AFC280614D528203568F6F786FD83 +:1068A000C04B002280F819803060C0E90035002319 +:1068B000C0E90223C0E9042300230376C36180F802 +:1068C000203014F0400FB84D08D0C820F6F76EFD08 +:1068D0008146B649ECF7CEF8C5F80090A10607D579 +:1068E0005420F6F763FD0446B049ECF7A7F82C6096 +:1068F00028683168002800F0AB8003685B6A98471D +:106900000646002840F0A180A949AA4801F0B4FB3E +:10691000804600286ED003460422012107F12000A2 +:1069200001F026FC32463146404601F031FC386A1F +:10693000FCF7B6FD421C044600F01E819D4907F19C +:106940001800FBF72DFA07F11800F7F76FFA054664 +:1069500000283ED101F018F913237D610360204621 +:106960004FF00009ECF754F9B0F5804F924D28BF75 +:106970004FF48040064601F017FF82467B69994537 +:1069800080F0D480434632460121504601F0F0FBAE +:1069900004EB090120463961ECF73AF939690246FE +:1069A000B1FBF0F300FB13133BB92846FBF7DAFB0E +:1069B00042F21070F6F7F0FC39690A463346514648 +:1069C0002846FBF71BFD4FF47A70B144F6F7E4FC60 +:1069D000D4E7036807F13002B9699B699847051E3F +:1069E00005DA6D4201F0D0F87E610560B7E73B6CD7 +:1069F0007B61B4E76FF002010020FDF749F96F4BAE +:106A00009BF800101A6802F07F42B2F1005F00F0BC +:106A1000B8801A6802F07F42B2F1105F00F0B180D6 +:106A20001A6802F07F42B2F1405F00F0AA801B6852 +:106A300003F07F43B3F1605F00F0A380002900F012 +:106A4000AC805F4803F040FBA7E06FF00101D3E7A3 +:106A500000296BD06B46084608EE903A0B689B689D +:106A600098470546002840F08980306803689B6A93 +:106A70009847102802463068B8BF1022016893007A +:106A8000073323F00703ADEB030DD3170DF1100906 +:106A9000CDE900232B464C6942464946A047D9F828 +:106AA0000000FCF7FDFC431C044662D0ECF7B0F894 +:106AB000B0F5804F28BF4FF48040814601F074FE4E +:106AC00008EE100A7B69AB422DD93068002218EE1F +:106AD000101A0368019208EB0502CDF80090D3F874 +:106AE00014A00023D04704EB050A2046ECF790F8E9 +:106AF0000246BAFBF0F300FB13A33BB951462E4804 +:106B0000FBF730FB42F21070F6F746FC4B4652465C +:106B100018EE101A2848FBF771FC4FF47A704D44B8 +:106B2000F6F73AFCCEE718EE903A9D462248FBF77E +:106B3000A9FD244B00222448FB630021234BC7E915 +:106B40000D223B6307F13003CDE90201FA6B2048C7 +:106B500000920ECBF7F712FB9BF8003013B11D48E3 +:106B600003F0B2FA00210846FDF792F8F0F71AF99F +:106B7000FEE718EE903A9D4621463DE76FF003018F +:106B80003AE719B10D491448F4F778F9002108469D +:106B9000FDF77EF80948F7F7E7F8FEF7DBFA00BFE4 +:106BA000E4B6010884BD0108303F0224FFA60108B5 +:106BB000F9B60108FCB60108283F022400000408C9 +:106BC00037B70108F5340108400D0300D13401083E +:106BD000600600240BB701081CB70108834B07F1BE +:106BE0003005834AFB63834B3B630023C7E90D00F9 +:106BF000CDE90223FB6B8048009395E80E00F7F780 +:106C0000BDFA21462046FDF743F89BF8003013B14A +:106C10007A4803F059FA7A4C4FF4707600213246E4 +:106C2000204601F033FE774B04F12001002063621F +:106C3000A146754B2365754BE365EDF749F904F102 +:106C40004C010120EDF744F904F158010220EDF761 +:106C50003FF9626A7861294600203E63ECF7F8F953 +:106C600088BB3B6B2946226D0120A3623E63ECF793 +:106C7000EFF9F8B109249BF8003023B14FF470719B +:106C80006348F4F7FBF801239C4289F864302CD167 +:106C90005B4C604E94F86430042B87F8373000F278 +:106CA0000483012B00F2078300F09783FF2384F80D +:106CB000643092E33B6B2946E26D022063653E63DC +:106CC000ECF7C6F908B10124D5E73B6B206A2366CF +:106CD000ECF7F2F90446D9F85800ECF7EDF9A042C8 +:106CE0002CBFC9F86800C9F868400020EDF766F9C4 +:106CF000824658B19BF800301BB100214648F4F79A +:106D0000BDF83F4B012283F86420C1E7D9F828E0A1 +:106D1000BEF5707F04D8D9F854C0BCF5707F07D990 +:106D20009BF80030002BECD03C4803F0CDF9E8E7AD +:106D3000D9F858300446D9F824B002469B68014679 +:106D4000064638617B60D9F85030FB6003468E45BB +:106D50000ED894450CD88E452E4C04D1944502D1C2 +:106D60003B699E4262D02378002BCAD02C48DCE7D6 +:106D700083421BD10BEBC108FD680131D8F80480B8 +:106D8000434405EBC2080132D8F8048040448342F2 +:106D9000DDD138691E44184438617868984221D2A0 +:106DA0001C4B1B78002BACD01E48BEE70FD20BEB60 +:106DB000C108022CD8F80480434405D1154B1B7838 +:106DC000002B9ED01848B0E701310124DFE7FD68B1 +:106DD000012C05EBC208D8F804804044EED0013203 +:106DE0000224D4E7002420462346B0E7F534010806 +:106DF00090D0030029350108B00B022449B70108DF +:106E000020070024F84A0224FC860224FC6802249D +:106E10005CB70108E40A02249CB70108C6B7010860 +:106E20005BB8010826B80108F2B701082022FF214B +:106E300007F13C0001F02AFD0123002007F12001A9 +:106E40003B6303F10123F865C7E90D30EDF7E2FA82 +:106E500007F118010220EDF7DDFA23783BB397F82C +:106E60002030012B61D0A74AA749032B18BF0A463F +:106E700097F8231097F82130019197F82210A34832 +:106E80000091A349F3F7FAFF237883B13B7E012BEE +:106E90004DD09C4A9C49032B18BF0A46F97E7B7E45 +:106EA0000191B97E994800919A49F3F7E7FF97F865 +:106EB00022304FF0000B97F820503E7EDFF85882CA +:106EC0003B61294698F80000EDF7E7FA002834D036 +:106ED000314698F80100EDF7E0FA70B398F8022017 +:106EE000042A02D03B699A4227D18B4B03EB8B03D8 +:106EF000DD78237853B1E5B1012D1CD08749884B4B +:106F0000022D18BF19468748F3F7B8FF012DFD651C +:106F100000F0B080022D00F0AF80E5B12378002BA7 +:106F20003FF4EFAE00218048E9E6804AA0E77F4ABF +:106F3000B4E77F49E7E77F49E5E70BF1010B08F18B +:106F40000408BBF1040FBCD123781BB17A4803F0CD +:106F5000BBF80023FB6597F83530012B40F02A8100 +:106F60003B6B012B40F0268197F83400012840F05C +:106F7000218197F83760012E40F08A8107F11801CE +:106F80000020EDF747FA0546002840F0458107F15B +:106F900020013046EDF73EFA012840F03A8123788F +:106FA0001BB129466548F3F769FF654B3B62002337 +:106FB00087F82430FB7E4FF000083D7E3B6197F858 +:106FC000206097F8233097F81AA0DFF880B1FB60B3 +:106FD00029469BF80000EDF760FA002800F02281B6 +:106FE00031469BF80100EDF758FA002800F01A81AD +:106FF0009BF80220042A03D03B699A4240F0128198 +:107000009BF80320042A03D0FB689A4240F00A81CF +:107010009BF80420042A02D0524540F003812378D3 +:107020007BB19BF80530022B00F0F880032B00F0B9 +:10703000F78044493A4A042B18BF11464248F3F7F7 +:107040001DFF9BF80540A31E022B00F2E580022CD9 +:1070500003D0042C0CBF04240324012007F13001C9 +:10706000EDF792F8002800F0EB8001280CBF012416 +:107070000524E5E04FF0020A07F120015FFA8AF0EB +:10708000ECF726FF064600287FF448AFD7F820B07B +:107090005846EDF710FA9BF800303861022B06D005 +:1070A000012B2BD90725386AECF7FEFE35E74FF0A8 +:1070B000030A0025A84638690123D9F8681007F1AA +:1070C000180201FB08015846ECF786F800286FDB30 +:1070D000012207F118015846EDF7D6F8002837D0FD +:1070E00016B1002D08BF454608F10108C245E2D19E +:1070F000002E40D0002D08BF554631E04FF4346AD1 +:10710000D7E700BF60B6010866B6010894B8010869 +:1071100086B80108D3B8010888BE0108E1B90108A2 +:107120006AB60108DBB8010822B901085BB601089C +:10713000FDB8010853B80108EEB8010853B90108B9 +:10714000030103037CB601089CB9010898BE01083D +:1071500066B3002DC8D0237813B1A74802F0B4FF5E +:107160000323B5FBF3F35A1C03EB4303ED1A3A6315 +:10717000013587F83450386A012307F11802816815 +:107180008039ECF729F8054600287FF4C7AE0122C4 +:1071900007F11801386AEDF777F808B101233B765B +:1071A0003B7E03F00F0387F837307CE701269BE72F +:1071B000012578E707F13000904DEDF7C5F997F814 +:1071C000373085F86430033B012B05D8EDF704F91F +:1071D00010B1FF2385F8643097F83730023B022B5B +:1071E0000BD8ECF71FFF40B1FF2385F864302378FC +:1071F0003BB1834802F068FF03E095F86430FF2B51 +:10720000F5D007F13000ECF7D9FE012385F86430A2 +:107210003EE500283FF4CEAEFF2411E079490DE7AA +:1072200079490BE708F101080BF1060BB8F1030FE0 +:107230007FF4CEAE237813B1744802F045FF0124E9 +:107240006E4B83F864406D4B93F86430012B7FF4F0 +:107250001FAD0020ECF78EFE0446002007F1300140 +:10726000ECF792FF14B100283FF412ADD9F82C408E +:10727000012007F13001ECF787FF654B9C427FF45A +:1072800007AD00287FF404AD042389F86430FFE4DF +:1072900007F13001ECF778FF584B08B1052232E5D1 +:1072A00097F8372083F86420CDE7052B7FF4FEACF8 +:1072B000EDF792F87CE00020ECF75CFE054600203C +:1072C00007F13001ECF760FF0DB100287DD0337875 +:1072D0003BB1504802F0F8FE337813B14E4802F04B +:1072E000F3FE07F1180100200025ECF7F1FD07F18E +:1072F00020010120ECF7ECFDA846D4F828B0C345E6 +:107300002ED1236C13F00C0F39D133781BB12946E1 +:107310004248F3F7B3FD00230095B9691A46386A6D +:10732000EBF7E8FF7861002835D1D9F850300146F5 +:10733000386A5A68EBF714FFD9E91423013B52F875 +:10734000331002EBC30013684268C91A386AEBF7BE +:1073500007FFB869ECF7A8FD386AECF7A5FD1AE05D +:10736000D9F824302946B86903EBC80308F10108AD +:10737000D3F804A052465544EBF7F2FEBFE7284984 +:1073800007F130033A6A01F14000ECF795F8002864 +:1073900011DA03237B6194F86430DA1E012A1AD8CB +:1073A000EDF71AF8786100287FF480ACECF73AFE2C +:1073B000786190B17AE4A8D107F13002012119482F +:1073C000ECF7CAFE0028A0D0E3E707F13000EDF7A4 +:1073D000BBF87861DFE7022BE8D094F86430FF2B2C +:1073E00025D1337803BB07F13000ECF7E7FD786176 +:1073F00008B34FF0FF352DE002B901082007002443 +:107400004AB9010883B6010888B60108ADB9010878 +:107410003DB8F396BFB90108EEB9010809BA0108F1 +:107420004C0700248C0700241E4802F04DFE94F8FF +:107430006430012BD7D100210846ECF7A5FE0546A4 +:1074400040B930220146B81801F020FA236A7D6164 +:107450005B68BB60A06DECF727FDE06CECF724FDEA +:10746000206AECF721FD7B69002B08BF2B461D46E7 +:107470004BB13378002B3FF490AB29460A48F3F721 +:10748000FDFCFFF78ABBFCF799FFA468BB682344A7 +:107490001C4633781BB121460448F3F7EFFC204625 +:1074A000F6F762FC4AB9010848BA010877BA010840 +:1074B0001FB5134B6C460B250FCB84E80F002046FD +:1074C0001C24FDF717FD0F4B18600F480F4B45604C +:1074D00003600F4BC4608360FDF70CFD0D4B18601B +:1074E0000D480E4BC460C0E900350D4B8360FDF7BD +:1074F00001FD0C4B186000F0C1FFFFF79DF800BFC5 +:1075000070BC0108882702243C430224AABA01085F +:107510004C43022480270224FC3E0224B7BA01080F +:107520000C3F0224402702248A4A2DE9F84F1368B1 +:1075300053B9894B8949196001F502310B6843F44D +:1075400080730B60012313600020854CFCF7BCFBAB +:1075500040F2AA73834D984263D10120FCF7B4FB3B +:10756000C0B220600120FCF7AFFB00F007002071E3 +:107570000120FCF7A9FBC0F3001060710120FCF7AB +:10758000A3FBC0F3C010A0710220FCF79DFBA0601C +:107590000320FCF799FBE0600420FCF795FBC0B2E8 +:1075A00020620420FCF790FB00F0070084F8240020 +:1075B0000420FCF789FBC0F3001084F825000420A8 +:1075C000FCF782FBC0F3C01084F826000520FCF70E +:1075D0007BFBA0620620FCF777FB2B78E0628BB187 +:1075E000614802F071FD2B7863B1227921685F4810 +:1075F000F3F744FC2B782BB194F82420216A5C48E3 +:10760000F3F73CFC237994F8242003F002019A421A +:1076100040F01481F9B12B784BB3564802F054FD79 +:1076200025E002204FF4F013A4210422A06221607F +:10763000A2802162A284C4E9020301234FF4003036 +:10764000A37184F826302B78E062002BDAD04A4808 +:1076500002F03AFDD6E7130703D52B783BB1474834 +:10766000DCE7570714D5FEF729FF20612063637913 +:10767000002B3AD023799E070FD52B7833B13D48A4 +:1076800002F022FD6379002B00F08980BDE8F88FBD +:107690002B78002BEBD03A48C0E713F0080604D053 +:1076A0002B78002BF2D03548EAE7580718D5282068 +:1076B000344FF5F77BFE216906720676D4E9022382 +:1076C000C0E90071C0E90426C0E908362BB90123DE +:1076D000002203760023C0E9082360616063D1E7DC +:1076E0002B78002BD2D02648CAE7A379002B53D0A1 +:1076F000226A23689A4204D02B7813B1224802F000 +:10770000E3FCA268A36A9A4204D02B7813B11F4805 +:1077100002F0DAFC28201E4EF5F748FE2269002709 +:10772000A168606141766063C0E9006200220026C2 +:107730000276C26180F82020C0E90267C0E90467D0 +:10774000F3F778FF00289DD02B78002B9AD01148B2 +:1077500096E700BFF8680224C427022400400058BE +:10776000B0050024E40A0224C1BA0108D3BA010812 +:10777000EABA010812BB0108FFBA01081DBB0108E3 +:1077800025BB01083CBE01082EBB010837BB010820 +:1077900084BD010841BB01082369636163632368F9 +:1077A000590643D5C820F5F701FE73490646EBF7A5 +:1077B00061F9E661E06961690368E0635B6A9847C3 +:1077C00020B12B7813B16D4802F07EFC38200126E1 +:1077D000F5F7ECFD0027E3680025694A4FF480586F +:1077E000DFF8C4B14FF00009DFF8C0A18260C0F833 +:1077F00000B04561A061C0E903A3C0E90667C0E924 +:107800000867C0E90A893820F5F7D0FDE36A5D4AC8 +:10781000C0F800B0C0E9022AC0E90435C0E9066733 +:10782000C0E90867C0E90A89A0632FE75420F5F78B +:10783000BDFD51490646EBF701F9BAE729B12B78AE +:1078400073B1514802F040FC0AE01A0703D52B78C7 +:1078500033B14E48F6E75F070CD5FEF72FFE2061E7 +:1078600094F824309E070AD52B789BB1484802F043 +:107870002BFC0FE02B78002BF2D04648E2E71807EC +:1078800003D52B7833B14148F1E759070ED5FEF700 +:1078900015FE20636679002E42D023799A070AD517 +:1078A0002B7843B3384802F00FFC24E02B78002BF0 +:1078B000F0D03948DBE713F0080603D02B78D3B1BA +:1078C0003248F0E75F0726D52820344FF5F76EFDE4 +:1078D000216906720676D4E90223C0E90071C0E985 +:1078E0000426C0E908362BB90123002203760023C1 +:1078F000C0E90823606194F82560002E00F0DD8067 +:1079000094F8243098072FD52B78002B69D0204885 +:1079100002F0DAFB65E02B78002BECD01D48C2E7C3 +:10792000A379F3B128204FF00008F5F73FFD4FF0A1 +:1079300000092169A2681A4F06764276C66180F86E +:1079400020606061C0E90071C0E90289C0E9048972 +:10795000F3F770FE0028CED02B78002BCBD0114847 +:10796000A1E723696361C6E713F0080620D02B78EE +:10797000002B36D00548CBE7FFA6010848BB01081D +:1079800050BB010863BB010812BB01081DBB010805 +:107990007EBB010873BB010889BB01083CBE01081E +:1079A00084BD010894BB0108E8BD01085FBB010864 +:1079B00059077DD528205C4FF5F7F8FC216B06723E +:1079C0000676D4E90A23C0E90071C0E90426C0E9BB +:1079D00008362BB90123002203760023C0E90823CF +:1079E00060636379002B2FD123685A0640F18C80A5 +:1079F000C820F5F7DBFC4D490646EBF73BF8E6619E +:107A0000E069616903685B6A984720B12B7813B11C +:107A1000474802F059FB3820F5F7C8FC454AE368AF +:107A20000260454AA0618260444AC0E90323002302 +:107A3000012243610023C0E90623C0E908234FF473 +:107A400080520023C0E90A2394F82530002B7FF4EC +:107A50001DAE236A5B065FD5C820F5F7A7FC384941 +:107A60000646EBF707F8E663E06B616B03685B6A59 +:107A7000984720B12B7813B1324802F025FB38200B +:107A8000F5F794FC2B4AE36A02602F4A82602B4A86 +:107A9000C0E903230023012243610023C0E9062338 +:107AA000C0E908234FF480520023C0E90A23BBE653 +:107AB0002B78002B95D025482AE794F8263003B37D +:107AC00028204FF00008F5F771FC4FF00009216BFA +:107AD000A26A1F4F06764276C66180F82060606316 +:107AE000C0E90071C0E90289C0E90489F3F7A2FD89 +:107AF00000283FF476AF2B78002B3FF472AF154887 +:107B000006E7236B63636CE75420F5F74FFC0749E6 +:107B10000646EAF793FF72E75420F5F747FC084959 +:107B20000646EAF78BFF9EE73CBE0108AEBB0108A4 +:107B3000B2BB0108E8BD0108C3BB01085FBB010877 +:107B4000D3BB0108D7BB0108E8BB010889BB01080A +:107B500084BD0108A1BB010810B5FEF795FC68B90A +:107B6000074C23781BB9FFF7DFFC01232370054B7B +:107B70005A790AB1586910BD9869FCE70020FAE704 +:107B8000A0060024B0050024014B1868704700BF10 +:107B90003C03002470B505460C4611B9002630465A +:107BA00070BD18B183690BB900F094F92C4B9C425D +:107BB00014D16C68636ED80705D4A389990502D4E3 +:107BC000A06D00F08AFDB4F90C308BB9666E16F02A +:107BD0000106E3D1A06D00F082FDE0E7214B9C425D +:107BE00001D1AC68E6E7204B9C4208BFEC68E1E7B6 +:107BF0002146284600F042F8236B064633B1216A3D +:107C0000284698470028B8BF4FF0FF36A3891A06C8 +:107C100003D521692846F6F703F9616B41B104F1F8 +:107C20004403994202D02846F6F7FAF8002363632A +:107C3000A16C21B12846F6F7F3F80023A36400F005 +:107C400031F90023A381636EDB0702D4A06D00F03D +:107C500046FDA06D00F03FFD00F02AF99FE700BF50 +:107C600030BF010850BF010810BF0108024B014698 +:107C70001868FFF78FBF00BF3C0300248A892DE9F5 +:107C8000F041054610070C4658D44B68002B05DC24 +:107C90000B6C002B02DC0020BDE8F081E66A002EB0 +:107CA000F9D0002312F480522F682B6032D0606D1F +:107CB000A3895A0705D56368C01A636B0BB1236C9F +:107CC000C01A00230246E66A216A2846B047431CD0 +:107CD000A38906D129681D292CD82A4ACA40D6076B +:107CE00028D500226260D9042269226004D5421C92 +:107CF00001D12B6803B96065616B2F600029CAD080 +:107D000004F14403994202D02846F6F789F800208E +:107D10006063C1E7216A01232846B047411CC7D1EF +:107D20002B68002BC4D01D2B01D0162B01D12F6046 +:107D3000B1E7A38943F04003A381ADE70F69002FAA +:107D4000A9D093070E6808BF4B690F6018BF0023C6 +:107D5000A6EB07088B60B8F1000F9CDD216AA66ACC +:107D600043463A462846B047002806DCA38943F03C +:107D70004003A3814FF0FF308EE70744A8EB0008D3 +:107D8000E9E700BF0100402038B50B6905460C4605 +:107D900013B90025284638BD18B183690BB900F026 +:107DA00099F8144B9C421BD16C68B4F90C30002B31 +:107DB000EFD0626ED00704D4990502D4A06D00F014 +:107DC0008CFC28462146FFF759FF636EDA0705460B +:107DD000E0D4A3899B05DDD4A06D00F080FCD9E739 +:107DE000054B9C4201D1AC68DFE7044B9C4208BFC5 +:107DF000EC68DAE730BF010850BF010810BF010886 +:107E0000014620B9044B0549186800F018BB044B23 +:107E10001868FFF7B9BF00BF70BF0108897D01086E +:107E20003C030024002310B50446C0E90033C0E938 +:107E30000433836081814366C281836119460822CD +:107E40005C3000F023FD054B6362054BA362054BDC +:107E5000E362054B2462236310BD00BFC98B010898 +:107E6000EF8B0108278C01084B8C0108014900F0B9 +:107E7000E6BA00BF897D010870B54A1E68255543E2 +:107E80000E4605F17401F5F7CFFF044640B100211D +:107E9000C0E900160C30A06005F1680200F0F6FCA5 +:107EA000204670BD014800F018BC00BF4CA502245C +:107EB000014800F014BC00BF4CA50224014800F0AA +:107EC0000CBC00BF4BA50224014800F008BC00BF59 +:107ED0004BA5022410B50446FFF7F0FFA3691BB1C0 +:107EE000BDE81040FFF7F0BFC4E912332365134B20 +:107EF000134A1B68A262A34204BF0123A361204668 +:107F000000F020F86060204600F01CF8A0602046D9 +:107F100000F018F80022E06004216068FFF782FF9B +:107F2000A06801220921FFF77DFFE06802221221EB +:107F3000FFF778FF0123A361D2E700BF70BF0108FC +:107F40006D7E0108F8B50746FFF7ACFF1E4B1E68B3 +:107F5000B36913B93046FFF7BDFF4836D6E901349F +:107F6000013B03D533680BB33668F7E7B4F90C501F +:107F7000D5B9164BE36004F15800656600F0AAFB22 +:107F8000FFF796FFC4E90155C4E904552560A561D2 +:107F90000822294604F15C0000F078FCC4E90D5584 +:107FA000C4E912552046F8BD6834D9E704213846A3 +:107FB000FFF762FF044630600028D5D1FFF778FF55 +:107FC0000C233B60EEE700BF70BF01080100FFFF1C +:107FD000F7B50F46114601AA054601F093F806468B +:107FE00018B90024204603B0F0BD2846FFF7AAFFC9 +:107FF00004460028F5D03946019A4FF4DB73284631 +:1080000000F02CFD071E09DA0025FFF74BFFA06DDD +:10801000A58100F060FBFFF74BFFE2E7636EDB0733 +:1080200005D4A389980502D4A06D00F056FB0E4B31 +:1080300063620E4BA3620E4BE362F1050D4BE781C9 +:10804000A6812462236305D5022300222146284607 +:1080500000F09CF8636EDA07C4D4A3899B05C1D4F1 +:10806000A06D00F03CFBBDE7C98B0108EF8B010858 +:10807000278C01084B8C0108024B0A460146186800 +:10808000FFF7A6BF3C0300242DE9F74F1F46134618 +:108090007B430C9C06468A4691469B465FD018B1AE +:1080A00083690BB9FFF716FF2E4B9C4228D17468E9 +:1080B000636EDB0705D4A3899D0502D4A06D00F093 +:1080C0000CFB6368002B01DA00236360D846D4E917 +:1080D000001545451ED34246504600F0C9FB606876 +:1080E0002168636EA0EB08004144DA0760602160FC +:1080F0002FD4A3899B052CD4A06D00F0F0FA28E0C2 +:10810000194B9C4201D1B468D2E7184B9C4208BF7E +:10811000F468CDE72A46504600F0AAFB23682B44BA +:1081200023602146A8EB05033046019300F0B2FC22 +:10813000AA44019B88B1636ED80705D4A389990529 +:1081400002D4A06D00F0CBFA5D44A5EB0803B3FBAD +:10815000F9F7384603B0BDE8F08F9846B7E71F46F9 +:10816000F7E700BF30BF010850BF010810BF01088A +:1081700007B5009313460A46014603480068FFF717 +:1081800083FF03B05DF804FB3C03002400F00AB851 +:1081900013460A4601460248006800F003B800BFD3 +:1081A0003C0300242DE9F0410C4617461D460646C7 +:1081B00018B183690BB9FFF78DFE514B9C4222D158 +:1081C0007468636ED90705D4A3899A0502D4A06D9B +:1081D00000F083FAA38903F48473B3F5847F03D199 +:1081E00021463046FFF7D0FDD4F82C80B8F1000FBF +:1081F00013D11D233360636ED90778D54FF0FF3557 +:108200002846BDE8F0813F4B9C4201D1B468D8E7D5 +:108210003D4B9C4208BFF468D3E7012D36D035F0C2 +:10822000020362D123691BB92146304600F07CFA73 +:1082300021463046FFF7A8FD0028DCD1216A2B46F5 +:108240003A463046C0470130D5D0616B41B104F1A8 +:108250004403994202D03046F5F7E2FD0023636300 +:1082600023692360A389002623F402636660A38147 +:108270000822314604F15C0000F008FB656E15F041 +:1082800001053BD1A3899B05BAD421E021463046A4 +:10829000FFF77AFDA28912F480520CD0656DA38994 +:1082A0005A0719D56368ED1A636B0BB1236CED1A8D +:1082B0002F440025B6E72B46216A3046C047431CB1 +:1082C0000546ECD1636ED80798D4A389990595D457 +:1082D000A06D00F004FA93E71807E9D52368226936 +:1082E000002BE5D09B1A1D44E2E7162382E7A38901 +:1082F0009A0583D4A06D00F0F2F97FE735467FE759 +:1083000030BF010850BF010810BF0108024B0146F1 +:10831000186800F003B800BF3C03002470B50C4699 +:10832000054618B183690BB9FFF7D4FD324B9C4267 +:1083300014D16C68636EDA0705D4A3899B0502D457 +:10834000A06D00F0CAF9E66ACEB91D232B60636EFA +:10835000DE070DD54FF0FF35284670BD274B9C42F8 +:1083600001D1AC68E6E7264B9C4208BFEC68E1E728 +:10837000A3899D05EED4A06D00F0B1F9EAE7A289CA +:1083800002F00C03082B19D12368BBB121695B1AD9 +:10839000002B13DDD00511D502230022216A2846C7 +:1083A000B047411C05460DD1636EDA07D2D4A389CC +:1083B0009B05CFD4A06D00F092F9CDE712F4805266 +:1083C0000FD0656DA28956070DD56368ED1A636BF2 +:1083D0000BB1236CED1A636ED907BDD49305BBD4E2 +:1083E000E8E70123DAE71007F5D52368002BF2D080 +:1083F00021695B1A1D44EEE730BF010850BF010838 +:1084000010BF01082DE9F0410F4600F14804002695 +:10841000D4E90185B8F1010805D52468002CF7D10D +:108420003046BDE8F081AB89012B06D9B5F90E3095 +:10843000013302D02846B84706436835EAE72DE9FC +:10844000F8430646884600F148040027D4E9019520 +:10845000B9F1010905D52468002CF7D13846BDE8EB +:10846000F883AB89012B07D9B5F90E30013303D05E +:1084700029463046C04707436835E9E770B50D4DDA +:108480000D4C641BA4100026A64209D10B4D0C4CC8 +:1084900002F004F9641BA4100026A64205D170BDA9 +:1084A00055F8043B98470136EEE755F8043B9847EA +:1084B0000136F2E70804002408040024080400241C +:1084C0001004002438B5074B1D68EB6B04461BB93C +:1084D000242000F069F9E863E96B2046BDE83840E4 +:1084E00000F002B83C0300242DE9F3410746019156 +:1084F00000F092FE01998046384600F091FE4369F3 +:108500009A07044603F26C7605D1642296FBF2F3D7 +:1085100002FB13637BBB4FF4C87396FBF3F503FBBD +:108520001565B5FA85F56D09684B302202FB0535F6 +:1085300000F038FC00F042FC654B1B6853B3D8F8E0 +:108540000430B34219D1D8F80010D7E90067D8E950 +:108550000823D1B9964277EB030323DAD8E9122333 +:10856000964277EB0303B4BF0123002323621BDB96 +:10857000D8F828101AE00125D6E7304600F06AFB4B +:108580000028E0D14FF0FF3304E0964277EB03037D +:1085900002DA00232362EBE7D8E91223964277EB55 +:1085A0000303F6DA01232362D8F850104FF4616315 +:1085B0003C2091FBF3F603FB1613616893FBF0F28A +:1085C00000FB12302368891AA26861601B1A921B93 +:1085D0003B2B2360A26035DD013161603C3B2360B1 +:1085E00063683B2B34DD0132A2603C3B6360A368CF +:1085F000172B33DDE2690132E261A2690132062AFA +:10860000C8BF0022A261E268183B0132A36023695F +:10861000E26055F823108A420EDD0B2BA2EB01021B +:10862000E26003F1010209BF6369226100220133A4 +:1086300002BF22616361E26100F0BAFB204602B032 +:10864000BDE8F081002BCBDA013961603C33C6E72D +:10865000002BCCDA013AA2603C33C7E7002BEBDAFF +:10866000E269013AE261A269013A48BF0622A261C9 +:10867000E2681833013AE260A360002ADCD1236982 +:10868000013B05D42361236955F82330E360D3E728 +:108690000B23236163695A1E626103F26B729307B5 +:1086A00005D1642192FBF1F301FB132363B94FF46D +:1086B000C87192FBF1F301FB1323B3FA83F35B0957 +:1086C00003F5B673E361DEE70123F9E774BF010840 +:1086D0003CA5022470477047704770477047704749 +:1086E00070B50E46B1F90E10002996B014461D461D +:1086F00007DA00232B60B3891A0610D44FF4806385 +:108700000EE06A4600F034FD0028F2DB019A02F424 +:108710007042A2F500535A425A412A60EEE74023C4 +:108720000020236016B070BD8B8973B59D07064687 +:108730000C4607D504F147032360236101236361DD +:1087400002B070BD01AB6A46FFF7CAFF009905464B +:108750003046F5F769FB48B9B4F90C309A05EFD407 +:1087600023F0030343F00203A381E3E70D4BB3625D +:10877000A389206043F08003A381009B6361019B78 +:1087800020615BB1B4F90E10304600F0F9FD28B15C +:10879000A38923F0030343F00103A381A0890543C8 +:1087A000A581CDE76D7E0108024B01461868F5F7FB +:1087B0003BBB00BF3C030024024B01461868F5F7A1 +:1087C0002FBB00BF3C03002400000000000000009D +:1087D00001F0FF01102A2BDB10F0070F08D010F872 +:1087E000013B013A8B422DD010F0070F42B3F6D176 +:1087F000F0B441EA012141EA014122F007047FF08F +:1088000000070023F0E80256083C85EA010586EAE5 +:10881000010685FA47F5A3FA87F586FA47F6A5FA21 +:1088200087F68EB9EED1F0BC01F0FF0102F007022D +:1088300032B110F8013B013A83EA010313B1F8D1D8 +:108840000020704701387047002D06BF35460338B9 +:10885000073815F0010F07D1013015F4807F02BFF2 +:10886000013015F4C03F0130F0BC0138704700BF43 +:108870000A44914200F1FF3300D1704710B511F85E +:10888000014B03F8014F9142F9D110BD0244034658 +:10889000934200D1704703F8011BF9E713B54A432F +:1088A00011460192F5F7C0FA044618B1019A002169 +:1088B000FFF7ECFF204602B010BD000037B50029DD +:1088C00048D051F8043C0190002BA1F10404B8BF3A +:1088D000E418F4F7ABFD204A01981368154633B944 +:1088E0006360146003B0BDE83040F4F799BDA34263 +:1088F0000BD921686218934204BF1A685B686360F1 +:1089000004BF521822602C60ECE71A465B680BB17A +:10891000A342FAD911685518A5420BD12468214405 +:108920005418A3421160DDD11C685B685360214478 +:108930001160D7E702D90C230360D3E725686119DA +:108940008B4204BF19685B68636004BF49192160EA +:108950005460C7E703B030BD18A50224F8B5CD1C9C +:1089600025F0030508350C2D38BF0C25002D0646D3 +:1089700001DBA94203D90C2333600020F8BDF4F7D2 +:1089800055FD21490A6814469CB9204F3B6823B91C +:108990002146304600F008F938602946304600F09C +:1089A00003F9431C23D10C2333603046F4F738FD20 +:1089B000E3E723685B1B17D40B2B03D923601C440C +:1089C000256004E06368A2420CBF0B605360304630 +:1089D000F4F726FD04F10B00231D20F00700C21A56 +:1089E000CCD01B1AA350C9E722466468CCE7C41C4C +:1089F00024F00304A042E3D0211A304600F0D4F85A +:108A00000130DDD1CFE700BF18A502241CA5022448 +:108A1000F8B5074614460E4621B9BDE8F8401146A0 +:108A2000F5F702BA22B9F5F7FBF925462846F8BD55 +:108A300000F0C8FCA0420FD221463846F5F7F4F901 +:108A400005460028F2D031462246FFF711FF314695 +:108A50003846F5F7E5F9E9E73546E7E738B5074D74 +:108A600004460846114600222A601A46F9F7EEF934 +:108A7000431C02D12B6803B1236038BD54A50224E6 +:108A8000838903F00903092B01D1FFF7B9B900204D +:108A900070470000F8B50C46054618B183690BB95C +:108AA000FFF718FA3B4B9C420AD16C68B4F90C20D2 +:108AB00000236360A3899E060CD54FF0FF3066E06B +:108AC000354B9C4201D1AC68F0E7344B9C4208BF67 +:108AD000EC68EBE7580748D4D90605D409232B6086 +:108AE00042F04003A381E8E71A070BD52146284648 +:108AF000FFF74AF90028E0D1A389A06023F008031A +:108B0000A381A061A38943F00403A38123691BB956 +:108B100021462846FFF708FEA689B4F90C70B30772 +:108B20000FD00123A3811E4B1E49186806F00906C9 +:108B3000FFF768FC092EA78103D121462846FFF7DD +:108B40009DF82269666A6369216A22602846B047F7 +:108B5000002860601CDCB4F90C3017BF002243F021 +:108B60002003626043F04003BCE7616B0029CDD075 +:108B700004F14403994202D02846F5F751F9236CD9 +:108B8000636000206063002BC0D0E36B2360F8BDFE +:108B90000020FCE730BF010850BF010810BF0108EA +:108BA00070BF0108818A010838B5064D00230446CC +:108BB00008462B60F4F742FC431C02D12B6803B13A +:108BC000236038BD54A5022410B50C46B1F90E102F +:108BD00000F000FC0028ABBF636DA3891B1823F4D1 +:108BE0008053ACBF6365A38110BD002070472DE9A1 +:108BF000F0411F468B89DB0505460C46164605D518 +:108C0000B1F90E100223002200F0CAFBA389B4F9C7 +:108C10000E1023F48053A38132463B462846BDE81C +:108C2000F04100F04DBA10B50C46B1F90E1000F04D +:108C3000B7FB431CA38915BF606523F4805343F43D +:108C40008053A38118BFA38110BDB1F90E1000F0AD +:108C500049BA00002DE9F74F804600F0DDFA40F2F6 +:108C6000B173984540F398806FF4F66343449B10CA +:108C700040F26D12A8F2B27502FB05356FF0630287 +:108C8000A8F26D7393FBF2F31D444FF4C8736FF4B5 +:108C9000C86298FBF3F703FB17874244B7FA87FCD7 +:108CA000B2FBF3F208F0030315446422C0F8048019 +:108CB00098FBF2F64FEA5C1C02FB1686044600F1B4 +:108CC000500B00934FF0070E227A63694A2A28D18D +:108CD0000099EA1801B906B90FBB3B2BD4BF00239A +:108CE000012313445A1EA3692C4901FB0232A36AD3 +:108CF00013441A46DB17C4E908232834A345E3D1FB +:108D0000D0E90845D0E91223944275EB0303B4BFC0 +:108D1000012300230360012003B0BDE8F08F00238E +:108D2000DFE7442A01D1EA18DDE7009A72BB002E82 +:108D30000CBFE0464FF001081949E26801924FF07C +:108D4000300A0AFB08182A464FF00009A8F1040867 +:108D5000019909F10109494558F829A018DC02F1E7 +:108D6000040898FBFEF9C9EBC909A8EB0909B3EBA4 +:108D70000909236903F1FF3348BF09F10709C3EB70 +:108D8000C3034B44534505DA1A44ACE7E046D3E746 +:108D90005244DDE7073BF5E70020BDE780510100C5 +:108DA00074BF01080148FFF797BC00BF4FA502241C +:108DB0000148FFF793BC00BF4FA50224014B186880 +:108DC00000F002B83C0300242DE9F04F8DB00746B7 +:108DD00000F022FAAE49AF4E0546384600F014FACC +:108DE000044670B9AC4BAD4A1860AD4B1860AD4B42 +:108DF0003068C3E90022FFF7DFFC34600DB0BDE846 +:108E0000F08F316800295FD13068FFF7D5FC20462C +:108E100000F030FB411C3846F5F706F830600028BA +:108E200057D12378A04AA1493A2B08BF01340AAE92 +:108E30003346204600F0E0FA0028DFDD0A9BE71801 +:108E4000E35C2D2B49D101374FF0FF340DF1200A9F +:108E50000DF11E0B4FF00008CDE9016A944903960D +:108E6000CDF800B0334607AA3846ADF81E80ADF8FD +:108E7000208000F0C1FA4045C0DDBDF81E30BDF8CD +:108E80002020DFF838923C2101FB0322BDF81C3082 +:108E90004FF4616101FB03235C43AC62814C824B64 +:108EA00023600A9B81491F444A463346384600F0F6 +:108EB000A3FA404516DC23686360774BAA6A1A6000 +:108EC000774BC3F8008099E700F0C2FA00289BD1E5 +:108ED00094E7214600F0C6FAA3E72B2B08BF013721 +:108EE0000124B3E70A9BC4F80490FC18FB5C2D2B0B +:108EF00040F08B8001344FF0FF370023ADF81C3079 +:108F0000ADF81E30ADF820300A93CDE902A6CDE9C8 +:108F100000B66749334607AA204600F06DFA0028DC +:108F200078DCAF6AA7F561670A9B2F651C442F4662 +:108F30004FF0000923782C2B08BF013494F80080EF +:108F4000B8F14D0F78D10DF12603CDE9016309ABDE +:108F500000935849039633460DF12202204600F053 +:108F60004BFA03287FF44AAFBDF822104B1E0B2B9F +:108F70003FF644AFBDF82420531E042B3FF63EAF0E +:108F8000BDF82630062B3FF639AFC7E9031287F844 +:108F900008807B610A9B04EB03080223ADF81C30B8 +:108FA0000023ADF81E30ADF820300A9398F8003059 +:108FB0002F2B09D1CDE902A6CDE900B63E493346B3 +:108FC00007AA404600F018FABDF81E30BDF8202070 +:108FD0003C2101FB0322BDF81C304FF4616101FB11 +:108FE0000323BB610A9C28374444B9F1000F20D009 +:108FF0006868FFF72FFE284BAA6A1A602B6D9B1A30 +:10900000274A18BF01231360F8E62B2B08BF013451 +:10901000012772E7BDF81E30BDF820203C2101FB7E +:109020000322BDF81C304FF4616101FB03235F4351 +:109030007AE74FF001097DE7B8F14A0F06BF013426 +:10904000434644230A220BA92046059300F0AAFABE +:10905000DDF82C80059BADF82600A04514D14D23EA +:10906000B9F1000F07D12B7203210223C5E90313C5 +:10907000C5F8149091E785F830300B220123C5E93B +:109080000D230023EB6388E780B23B72786184E7AD +:10909000D4BF010838A5022440A50224D7BF010887 +:1090A0003CA50224A00300242BA50224DBBF010859 +:1090B000FEBF0108EABF0108FDBF010820A5022488 +:1090C00038B5074D04460846114600222A601A4664 +:1090D000F4F7D4FD431C02D12B6803B1236038BDE3 +:1090E00054A5022438B5064D0023044608462B60DB +:1090F000F4F71CFE431C02D12B6803B1236038BD7A +:1091000054A502240B78722B30B522D0772B24D0B3 +:10911000612B27D016230360002030BD622D12D0B2 +:10912000782D13D02B2D07D120F01C0023F0030342 +:1091300040F0100043F0020311F8015F002DEDD163 +:1091400023431360E9E743F48033F5E743F4006316 +:10915000F2E7002423460420EEE74FF4C064012325 +:109160000820E9E74FF4027401234FF48470E3E729 +:1091700038B5074D00230446084611462B60F4F726 +:10918000BFFC431C02D12B6803B1236038BD00BF74 +:1091900054A502242DE9F84F074689461646F4F7F0 +:1091A00039F9184B1C689A4634B14B46984613F867 +:1091B000011B39B13D29F9D13846F4F725F90020D2 +:1091C000BDE8F88FA8EB0908A34654F8040B002863 +:1091D000F2D04246494600F055F90028F4D154F83F +:1091E000043C03EB080513F808303D2BECD1DAF80A +:1091F0000030ABEB03039B1038463360F4F704F9FF +:10920000681CDDE70004002407B501AAFFF7C2FFD0 +:1092100003B05DF804FB000000487047A803002479 +:109220002DE9F041D0E900670C46514A0023304651 +:10923000394601F053F8394605464D4A3046002379 +:1092400001F04CF8002ABCBF02F5A83202F5C0724A +:109250004FF4616105F52F20B2FBF1F301FB1322FE +:109260004FF03C01ACBF00F66C2000F66B20A36011 +:10927000B2FBF1F301FB132263602260C31C0722DF +:1092800093FBF2F2C2EBC2029B1A48BF07330028DD +:10929000A361B8BFA0F50E333649AEBF90FBF1F124 +:1092A000A3F52C7393FBF1F1334B03FB010048F65C +:1092B000AC62B0FBF2F2024440F2B45CB0FBFCF3EF +:1092C000D21A40F26D172D4BB0FBF3F36426D31A7C +:1092D000B3FBF7F5B3FBFCF3B5FBF6F2D31A03448B +:1092E00007FB1533992003EB830C0CF1020C03F1FF +:1092F000010EBCFBF0F7784302304FF00508B0FBDD +:10930000F8F0AEEB000040F2F95EF44594BF4FF088 +:10931000020C6FF0090C67444FF4C87C0CFB015140 +:10932000012F98BF0131B3F5997F0CD3A3F5997341 +:10933000E361A1F26C710023E060C4E9047123626F +:109340002046BDE8F08115F0030F02D106FB125252 +:109350005AB94FF4C876B5FBF6F206FB1252B2FAD0 +:1093600082F252093B331344E2E70122FAE700BFDD +:1093700080510100B13A02004FC5FDFFB03A020032 +:1093800038B5064D0023044608462B60F4F707FC69 +:10939000431C02D12B6803B1236038BD54A50224BD +:1093A00038B5074D04460846114600222A601A4681 +:1093B000F4F7C4FB431C02D12B6803B1236038BD12 +:1093C00054A5022451F8043C181F002BBCBF0B58B5 +:1093D000C018704738B5074D0446084611460022AC +:1093E0002A601A46F4F7F8FB431C02D12B6803B13C +:1093F000236038BD54A502240EB410B59FB021AC33 +:109400004FF4017154F8042B0192ADF81C10049034 +:10941000089000F02FF80C4B059009900D930B4825 +:10942000019A006803940023119316934FF6FF737B +:10943000ADF81E3004A9234600F018F91FB0BDE8AE +:10944000104003B0704700BFEB8B01083C030024C1 +:1094500010F8012B11F8013B012A28BF9A42F7D0DE +:10946000D01A7047034611F8012B03F8012B002A8C +:10947000F9D17047034613F8012B002AFBD1181AC3 +:109480000138704710B56AB10139841810F8013BF2 +:1094900011F8012F934203D1A04201D0002BF5D146 +:1094A000981A10BD1046FCE72DE9F0433B4E864666 +:1094B0008C4660461CF8014BA55D15F00805F8D1F7 +:1094C0002D2C34D19CF800404FF0010800F1020C23 +:1094D000002B5ED0102B0CD1302C0AD19CF8000050 +:1094E00000F0DF0058284FD19CF8014010230CF108 +:1094F000020C4FF0FF370025B7FBF3F703FB07F92A +:109500006FEA09092846A4F13006092E18D8344616 +:10951000A34224DD002D1FDB87421DD301D1A145CD +:109520001ADB00FB034001251CF8014BEBE72B2C59 +:1095300008BF9CF80040A84608BF00F1020CC7E72E +:10954000A4F14106192E01D8373CE1E7A4F16106E8 +:10955000192E04D8573CDBE74FF0FF35E4E7002D28 +:1095600007DA2223CEF800304FF0FF3042B9BDE8D1 +:10957000F083B8F1000F00D04042002AF7D00DB1BF +:109580000CF1FF311160F2E73024002BB1D1082338 +:10959000AFE7302CA2D00A23ABE700BF11C001080F +:1095A000FFF782BF13460A46014602480068FFF7EC +:1095B0007BBF00BF3C03002438B54B1C144603D1CD +:1095C0004FF0FF35284638BD938923F0200393815F +:1095D000636B5268CDB28BB1A36B934208DD2368F5 +:1095E0005A1E226003F8015C636801336360E9E797 +:1095F000214600F0B5FB0028F1D0E1E7216923689E +:1096000051B1994208D213F8011CA94204D1013B7F +:10961000013223606260D5E7C4E90F3204F14403EC +:1096200063630323A363234603F8465F2360012398 +:10963000DCE710B50C46496B69B104F1440399426B +:1096400001D0F4F7EDFB236C63600020606313B17D +:10965000E36B236010BD2369236000236360A3894B +:1096600043F02003A3814FF0FF30F3E72DE9F04FE3 +:109670000C46ADF5237D0021CDE94411B249A091FE +:109680000DF10408B149B24FDFF8C892CDF8188146 +:109690000646A191009392F800A0BAF1000F00F0E5 +:1096A00051811AF8073013F0080302F1010519D0AF +:1096B0006368002B0FDD23681A78BA5C120701D4A7 +:1096C0002A46E8E7459A0132459262680133013A39 +:1096D00062602360ECE7A19B214630469847002852 +:1096E000E9D0EDE7BAF1250F40F083804193439331 +:1096F00053782A2B02BF1023951C41930A22AB46B4 +:109700001BF8011BA1F13003092B1DD9914803223D +:10971000FFF75EF840B10123A0EB090003FA00F067 +:10972000419B184341905D4615F8013B782B06D8C4 +:10973000572B10D8252B5CD056D8002B74D0032380 +:1097400047930A23429381E0439B02FB0313303B80 +:1097500043935D46D3E7A3F15802202AEFD801A135 +:1097600051F822F0379801083F9701083F97010808 +:10977000959801083F9701083F9701083F97010816 +:109780003F9701083F9701083F9701083F9701085D +:10979000AB98010881980108EF970108EF9701083D +:1097A000EF9701083F970108859801083F97010846 +:1097B0003F9701083F9701083F970108BB980108B0 +:1097C0008D9801082F9801083F9701083F970108DD +:1097D000B79801083F970108819801083F97010851 +:1097E0003F97010837980108453B022BA7D805236E +:1097F0002BE06368002B0DDD23681A78524540F09A +:10980000A180013362682360459B013A01336260A5 +:10981000459355E7A19B2146304698470028EBD059 +:109820004498002840F084804FF0FF3086E0419A51 +:1098300042F020024192419A42F400724192102279 +:109840006F2B429234BF0323042347936368002B9A +:1098500041DD419B590604D423681A78BA5C12078B +:1098600040D4479B022B4FDC6B46224641A9304631 +:1098700000F074F8012865D002287FF421AFCFE70B +:109880000A22DDE7002342930323DEE70823429305 +:109890000423DAE72946404600F0ACF9419B43F047 +:1098A0004003419305460123CFE7419B43F040032A +:1098B00041930023C9E70223C7E74198C3063FF558 +:1098C000FFAE009B459A191D00911B68C0074CBF55 +:1098D0001A801A60F4E6A19B21463046984700287A +:1098E000B7D09DE7459A013245926268013A002A55 +:1098F000626002DD01332360AEE7A19B2146304662 +:1099000098470028A8D08BE7042B06DC6B4622463C +:1099100041A9304600F07AF8ACE70F4B002B3FF43A +:10992000CFAE6B46224641A93046AFF30080A1E797 +:10993000A38913F0400F18BF4FF0FF300DF5237DC2 +:10994000BDE8F08F4498F9E7B9950108339601080E +:1099500011C0010811C10108000000002DE9F84301 +:1099600015468A6880460C4632B98A69002A0CBFBF +:1099700001224FF0FF328A602268DFF88C90D10616 +:109980005FBF1A68111D196016680027A06988B1A9 +:10999000012807D12B681A7863699B5C53B927BBF0 +:1099A000BDE8F883022820D12B681B7813F8093012 +:1099B0001B071AD42368DA065EBF2B681B7806F8EB +:1099C000013B2A686B6801322A60A268013B013AB8 +:1099D0006B600137A26042B1002BD7DCD4F8803134 +:1099E0002946404698470028D0D0236813F010033A +:1099F00005D1E2680132E260A26902B133702369E5 +:109A00001F4427610020CBE711C001082DE9F04F6A +:109A10009846744B0C468246164693E8070087B07A +:109A200003AB83E80700704BA169704A032918BF94 +:109A30001A46A36801925A1EB2F5AE7F88BF6FF432 +:109A4000AE75274682BF03EB050940F25D13A360A4 +:109A500057F81C3B43F4506398BF4FF00009236054 +:109A60003D464FF0000B316803AB097853F82B00EB +:109A70000222FEF7ADFE28B3BBF1010F59D1626897 +:109A80002AB92268082342F40072636022602268C7 +:109A900022F4A0622260A268511EA16092B13268D5 +:109AA000511C3160127805F8012B7268013A002AC6 +:109AB000726007DCD4F88021314650469047002878 +:109AC00040F085800BF1010BBBF1030FCBD1636834 +:109AD0000BB90A236360636845496069C91A00F0DD +:109AE00089F84FF0000BA3682268002B3DD0316845 +:109AF000606991F800C010F80C00002835D0BCF166 +:109B0000300F24D1100522D50BF1010BB9F1000F54 +:109B100003D0013309F1FF39A3607368013B002BC7 +:109B200073601BDD336801333360A368013BA360BE +:109B3000D9E7BBF1020FAED1226802F4C061B1F5E2 +:109B4000007FBFD11023636042F48072A2E722F449 +:109B5000106222600B7805F8013BDEE7D4F8803113 +:109B60003146504698470028DFD02368D9050DD5E7 +:109B7000BD4209D915F8011CD4F87C313246504653 +:109B8000984705F1FF394D46BD4228D0226812F0B2 +:109B9000100213D12A706368019E39465046B047BF +:109BA000D8F8003021681A1DC8F8002011F0200FE5 +:109BB0001B680FD01860E3680133E360ED1BAB4412 +:109BC00025695D442561002007B0BDE8F08F4FF0A6 +:109BD000000BCAE7CA074CBF18801860EBE70120EA +:109BE000F2E700BF30C10108A19501085D9D0108A1 +:109BF0002EC1010870B50B7804465E2B0BBF4B7865 +:109C0000481C881C002208BF0122611E04F1FF05C8 +:109C100001F8012FA942FBD10BB9013870BD82F0C8 +:109C20000101E154421C12F8015C2D2D02F1FF36B6 +:109C3000104606D05D2DF1D00DB93046EEE72B462B +:109C4000EFE716785D2EFAD0B342F8DC1846013003 +:109C500086422154FBDCD84330445D1CB342A8BF8C +:109C600000202B180232DEE72DE9F0473A4E8646F7 +:109C70008C4660461CF8014BA55D15F00805F8D12F +:109C80002D2C33D19CF800404FF0010800F1020C5C +:109C9000002B5CD0102B0CD1302C0AD19CF800008A +:109CA00000F0DF0058284DD19CF8014010230CF142 +:109CB000020C08F10047013F0026B7FBF3F93046DC +:109CC00003FB197AA4F13005092D18D82C46A342BC +:109CD00024DD751C07D081451DD301D1A2451ADBB7 +:109CE00000FB034001261CF8014BEBE72B2C08BFBF +:109CF0009CF80040A84608BF00F1020CC8E7A4F198 +:109D00004105192D01D8373CE1E7A4F16105192D72 +:109D100004D8573CDBE74FF0FF36E4E7731C06D16D +:109D20002223CEF80030384642B9BDE8F087B8F1BA +:109D3000000F00D04042002AF7D00EB10CF1FF31E5 +:109D40001160F2E73024002BB3D10823B1E7302CA7 +:109D5000A4D00A23ADE700BF11C00108FFF784BFFC +:109D60002DE9F0410C46496B04F1440399421DD1A1 +:109D70004FF48061F4F758F818B94FF0FF30BDE8A0 +:109D8000F0814FF48063A36394F84630606380F8F9 +:109D9000FF3394F8453080F8FE3394F8443080F86F +:109DA000FD3300F2FD3020600020E8E7A66B77006D +:109DB0003A46F4F737F805460028DED000EB0608EF +:109DC000014632464046FEF753FDC4E90D57C4F83C +:109DD0000080E9E7024B0A4601461868F4F71EB80E +:109DE0003C03002470B50E461446054618B183693D +:109DF0000BB9FEF76FF8144B9C421AD16C68636E76 +:109E0000D80705D4A389990502D4A06DFEF765FC97 +:109E100022462846314600F0A1F8636EDA0705466F +:109E200005D4A3899B0502D4A06DFEF758FC2846F3 +:109E300070BD064B9C4201D1AC68E0E7044B9C42EC +:109E400008BFEC68DBE700BF30BF010850BF010866 +:109E500010BF0108024B0A4601461868FFF7C2BF4F +:109E60003C0300242DE9F843089C8946174602FB71 +:109E700003F8054618B183690BB9FEF72BF8264B9A +:109E80009C4223D16C68636EDE0705D4A3899805D4 +:109E900002D4A06DFEF721FCA389190720D5236900 +:109EA000F3B10026464529D0A06819F806100138FC +:109EB0000028A06004DAA369984219DB0A2917D0A8 +:109EC00023685A1C226019700136EBE7134B9C4241 +:109ED00001D1AC68D7E7124B9C4208BFEC68D2E7CF +:109EE0002146284600F08CF90028DAD0002605E04B +:109EF0002246284600F032F90130E5D1636EDA07D8 +:109F000005D4A3899B0502D4A06DFEF7E8FBB6FB40 +:109F1000F7F0BDE8F88300BF30BF010850BF01086B +:109F200010BF010807B5009313460A4601460348CF +:109F30000068FFF797FF03B05DF804FB3C030024C3 +:109F400030B501390024A24201D1002005E0035DB3 +:109F500001340D5DAB42F6D0581B30BD70B50D46D7 +:109F60001446064618B183690BB9FDF7B3FF1C4BC5 +:109F70009C4224D17468636ED80705D4A3899905DF +:109F800002D4A06DFEF7A9FBA368013B002BA360E0 +:109F900005DAA26993421CDBEBB20A2B19D02368C5 +:109FA0005A1C22601D70EDB2636EDA0705D4A389D6 +:109FB0009B0502D4A06DFEF792FB284670BD094BAD +:109FC0009C4201D1B468D6E7074B9C4208BFF468B5 +:109FD000D1E729462246304600F0C0F80546E3E7BF +:109FE00030BF010850BF010810BF010870B50E4610 +:109FF000054618B183690BB9FDF76CFFAB69AC6816 +:10A0000013B92846FDF766FF2C4B9C4220D16C68A3 +:10A01000636EDB0705D4A389980502D4A06DFEF713 +:10A020005CFBA38919071DD52369DBB1013EA36839 +:10A0300016F8011F013BA36039BB002B38DA22461A +:10A040000A21284600F08AF8013011D00A2511E0D3 +:10A050001B4B9C4201D1AC68DAE71A4B9C4208BF0B +:10A06000EC68D5E72146284600F0CAF80028DDD084 +:10A070004FF0FF35636EDA0705D4A3899B0502D440 +:10A08000A06DFEF72CFB284670BD002B04DAA269F8 +:10A090009A4206DC0A2904D023685A1C22601970EF +:10A0A000C5E72246284600F059F80130BFD1DFE766 +:10A0B00023680A255A1C22601D70DBE730BF0108A7 +:10A0C00050BF010810BF0108024B01461868FFF796 +:10A0D0008DBF00BF3C030024C9B2034610F8012B1A +:10A0E0001AB18A42F9D118467047002918BF0023D7 +:10A0F000F9E770B503461E4613F8014B44B14A1EFA +:10A1000001E0A54204D012F8015F002DF9D1F2E779 +:10A11000301A70BD10B50139034632B111F8014F44 +:10A1200003F8014B013A002CF7D11A440021934265 +:10A1300000D110BD03F8011BF9E770B503461E46B8 +:10A1400013F8014B3CB14A1E01E0A542F7D012F8CA +:10A15000015F002DF9D1301A70BD0000F8B50E4630 +:10A160001446054618B183690BB9FDF7B3FE214BC0 +:10A170009C422BD16C68A369A360A3891A072FD5D1 +:10A1800023696BB323692068C01A6369F6B28342FE +:10A19000374604DC21462846FDF7F6FD30BBA368B0 +:10A1A000013BA36023685A1C22601E706369013062 +:10A1B000834204D0A389DB0706D50A2E04D12146A9 +:10A1C0002846FDF7E1FD88B93846F8BD0A4B9C42A8 +:10A1D00001D1AC68CFE7094B9C4208BFEC68CAE7E5 +:10A1E0002146284600F00CF80028CBD04FF0FF376E +:10A1F000EAE700BF30BF010850BF010810BF0108E7 +:10A20000324B70B51D6806460C4625B1AB6913B9D3 +:10A210002846FDF75FFE2E4B9C420FD16C68A38948 +:10A22000B4F90C2019072CD4DD0611D409233360AE +:10A2300042F04003A3814FF0FF303EE0254B9C42AB +:10A2400001D1AC68EBE7244B9C4208BFEC68E6E721 +:10A25000580712D5616B41B104F14403994202D011 +:10A260003046F3F7DDFD00236363A38923F0240365 +:10A27000A3810023636023692360A38943F008035B +:10A28000A38123694BB9A38903F42073B3F5007F3D +:10A2900003D021463046FEF747FAA089B4F90C20D6 +:10A2A00010F001030AD00023A36063695B42A3613D +:10A2B000236943B910F08000BAD170BD810758BF3F +:10A2C0006369A360F4E70020F7E700BF3C030024C4 +:10A2D00030BF010850BF010810BF01087BB972B937 +:10A2E0000029BEBF00204FF0004106E008BF002853 +:10A2F0001CBF6FF000414FF0FF3000F0A1B9ADF18D +:10A30000080C6DE904CE002909DB002B1ADB00F0F4 +:10A3100035F8DDF804E0DDE9022304B0704740427F +:10A3200061EB4101002B1BDB00F028F8DDF804E0B5 +:10A33000DDE9022304B0404261EB4101524263EB8C +:10A3400043037047524263EB430300F017F8DDF814 +:10A3500004E0DDE9022304B0404261EB41017047B3 +:10A36000524263EB430300F009F8DDF804E0DDE955 +:10A37000022304B0524263EB430370472DE9F047D8 +:10A38000089D04468C46002B40F083808A42174685 +:10A3900047D9B2FA82F242B1C2F1200024FA00F0A9 +:10A3A0009140974040EA010C94404FEA1748230C33 +:10A3B000BCFBF8F61FFA87FE08FB16C143EA01430F +:10A3C00006FB0EF1994209D9FB1806F1FF3080F027 +:10A3D0001981994240F21681023E3B445B1AA4B2B5 +:10A3E000B3FBF8F008FB103344EA034400FB0EFE15 +:10A3F000A64509D93C1900F1FF3380F00581A64537 +:10A4000040F2028102383C4440EA0640A4EB0E04CC +:10A4100000261DB1D4400023C5E900433146BDE804 +:10A42000F08702B9FFDEB2FA82F2002A50D1CB1BCC +:10A430004FEA174E1FFA87F80126B3FBFEFC210CEA +:10A440000EFB1C3341EA034108FB0CF38B4207D996 +:10A4500079180CF1FF3002D28B4200F2E980844679 +:10A46000C91AA3B2B1FBFEF00EFB101143EA01447E +:10A4700008FB00F8A04507D93C1900F1FF3302D2D0 +:10A48000A04500F2D9801846A4EB080440EA0C402D +:10A49000BFE78B4209D9002D00F0B1800026C5E945 +:10A4A000000130463146BDE8F087B3FA83F6002E4E +:10A4B0004AD18B4202D3824200F2B880841A61EB07 +:10A4C000030101208C46002DA8D0C5E9004CA5E76A +:10A4D000C2F1200320FA03F6974001FA02F04FEA96 +:10A4E000174ED9403043030CB1FBFEF61FFA87F834 +:10A4F0000EFB161143EA014306FB08F1994204FAE8 +:10A5000002F409D9FB1806F1FF3C80F08D809942D6 +:10A5100040F28A80023E3B445B1A81B2B3FBFEF0FC +:10A520000EFB103341EA034100FB08F38B4207D9CD +:10A53000791800F1FF3C73D28B4271D9023839444B +:10A54000CB1A40EA064678E7C6F1200C03FA06F477 +:10A5500022FA0CF31C4320FA0CF701FA06F34FEA37 +:10A56000144E21FA0CF11F433B0CB1FBFEF91FFA0C +:10A5700084F80EFB191143EA014109FB08FA8A45E8 +:10A5800002FA06F200FA06F308D9611809F1FF3061 +:10A5900048D28A4546D9A9F102092144A1EB0A0112 +:10A5A000BFB2B1FBFEF00EFB101147EA014700FB02 +:10A5B00008F8B84507D9E71900F1FF312ED2B845A0 +:10A5C0002CD90238274440EA0940A7EB0807A0FB32 +:10A5D00002894F45C64649461AD317D05DB1B3EB41 +:10A5E0000E0267EB010707FA0CFCF2404CEA02028C +:10A5F000F740C5E9002700263146BDE8F0872E4622 +:10A6000028460BE70646E9E61846FDE64345E5D24F +:10A61000B8EB020E69EB04010138DFE70846D2E728 +:10A6200060468DE78146B9E7664675E730464AE7FA +:10A63000ACF1020C394413E702383C4424E700BF74 +:10A64000704700BF53B94AB9002908BF00281CBF92 +:10A650004FF0FF314FF0FF30FFF7F2BFADF1080CC4 +:10A660006DE904CEFFF78AFEDDF804E0DDE90223A0 +:10A6700004B07047430803F05533C01A830803F051 +:10A68000333300F03330184400EB101000F00F307B +:10A6900000EB002000EB0040000E7047F8B500BF53 +:10A6A000F8BC08BC9E467047F8B500BFF8BC08BCB3 +:10A6B0009E467047436F6D6D616E6420706172617C +:10A6C0006D206572726F723A2077726F6E672061CB +:10A6D0006464726573732073697A650A00496E76E3 +:10A6E000616C696420616C74206279746573207395 +:10A6F000697A65002E2E002F006C6974746C656693 +:10A7000073006170706C69636174696F6E5F756E00 +:10A710006E616D65645F6D75746578006170706CF5 +:10A7200069636174696F6E5F756E6E616D65645F9C +:10A730007468726561640065717565756500452DA5 +:10A74000496E76616C696420726561643A20666165 +:10A750005F6964202564206F6666736574203078B5 +:10A760002578206C656E20307825780A00452D52BA +:10A77000656164206661696C65643A2066615F6941 +:10A7800064202564206F66667365742030782578B0 +:10A79000206C656E20307825780A004D4355426F55 +:10A7A0006F745F45434945535F763100452D666CB4 +:10A7B0006173685F617265615F6F70656E2C207593 +:10A7C0006E6B6E6F776E2069642025640A0070726C +:10A7D000696D617279007365636F6E64617279008F +:10A7E000452D496D61676520696E20746865202577 +:10A7F0007320736C6F74206973206E6F74207661A0 +:10A800006C6964210A00492D537761702073656378 +:10A81000746F72202564206F662025640A00572D0E +:10A820002564207374617475732077726974652070 +:10A830006661696C7320706572666F726D696E67B0 +:10A840002074686520737761700A0050696E6D61CD +:10A8500070206572726F723A2077726F6E67207027 +:10A860006F7274206E756D6265722E0053484132AE +:10A870003536005348413232340001808080808078 +:10A8800080800480808080808080088080808080BC +:10A890008080108080808080808020808080808088 +:10A8A000808040000408102040020408102040006E +:10A8B0000000000102030401020304060708090066 +:10A8C0000000000000000001010000000000000284 +:10A8D0002200000000000004230000000000000827 +:10A8E000FFFF00000000000001000200040006005D +:10A8F00008000A000C001000200040008000000149 +:10A900000000000000000000E1A90008F5A900080F +:10A91000657E00083D7E0008AF7B0008A1AD000801 +:10A92000017E0008CB7D0008AB350108C579000821 +:10A93000DF7A0008B57D00089D7D0008CF7A000809 +:10A94000C97A00084F7B0008EF7A0008337A0008C4 +:10A95000C17A000800000000000000005DD000087F +:10A96000000000000000000061A0000895A00008A1 +:10A97000756E0008396E000853B50008C3B30008AF +:10A98000DBB100088BB200087D9E00086F720008E2 +:10A99000F59F0008AB0C0008C7AF000861AD0008C8 +:10A9A000439900087DAB000857AB0008A10C0008D4 +:10A9B00049A4000855720008B10C00083B72000859 +:10A9C0000DA9000811AF0008B37B0008EBA5000833 +:10A9D000A5A500082172000885A50008B56E00082D +:10A9E00079AA000835AA0008B1A00008FCFFFFFF03 +:10A9F000000000008DA00008A7A0000800000000D3 +:10AA00000000000000000000000000005DD0000811 +:10AA1000A50C0008AB0C0008A50C0008A50C00084C +:10AA2000C30C0008A50C0008FCFFFFFF000000009D +:10AA30000000000000000000000000000000000016 +:10AA400000000000000000005DD00008A50C000818 +:10AA5000AB0C0008A50C0008A50C0008C30C0008EE +:10AA6000A50C0008000000000000000045270008B9 +:10AA700089270008756E0008396E00084921000812 +:10AA8000F9210008C11F000879200008551F00089F +:10AA9000E5250008AD25000885230008936F000810 +:10AAA000C11E00081D1F0008051E0008931E000897 +:10AAB000A10C00083D1E0008DD0F0008B10C0008C5 +:10AAC000AD0F0008672F0008076F00084510000849 +:10AAD000F51C00088F1C00088D0F0008551C00088D +:10AAE000B56E0008FCFFFFFF000000008127000892 +:10AAF0009B27000800000000000000006D0E000809 +:10AB000033100008250F0008170E0008010E00087A +:10AB1000F50D0008E90D0008DD0D0008490E0008DC +:10AB20000000000000000000B10D00082110000826 +:10AB3000470D0008310D0008030D00085D0D0008E9 +:10AB4000250D0008190D0008F70C0008EB0C000893 +:10AB5000DF0C0008C90C00087FCD00087BCD000881 +:10AB600077CB000877CB00087DCB00086FCD0008BD +:10AB70008F0D00080000000000000000D9D600087A +:10AB80000000000000000000850E00080F10000803 +:10AB9000250F0008330E0008010E0008F50D00080F +:10ABA000E90D0008DD0D0008490E00080000000056 +:10ABB00000000000C90D0008FD0F0008470D000847 +:10ABC000310D0008030D0008790D0008250D00085F +:10ABD000190D0008F70C0008EB0C0008DF0C00084A +:10ABE000C90C00087FCD00087BCD000877CB00089A +:10ABF00077CB00087DCB00086FCD00088F0D0008D3 +:10AC000000000000000000006D1F0108FD1F01088A +:10AC1000000000000000000075B70008F9B7000848 +:10AC200077C295F360D2EF7F3552500F2CB6798002 +:10AC30002A8648CE3D0201002A8648CE3D02010008 +:10AC40002A8648CE3D030107002A8648CE3D0301EF +:10AC50000700000040420F0020000000010000003B +:10AC600002000000040000000800000010000000C6 +:10AC700020000000400000008000000000010000F3 +:10AC800000020000000400000008000000100000A6 +:10AC90000020000000400000008000006CA80108B7 +:10ACA00006204000ACAC0108F00A02244508000868 +:10ACB00039080008E9070008D90700081D0800083E +:10ACC000FD070008D1CB0008910800080000000033 +:10ACD000515350494600464C415348494150004663 +:10ACE00041543332202020002A2B2C3A3B3C3D3E5D +:10ACF0005B5D7C223F7F0053464450000000000013 +:10AD0000FBFFFBFEECEAF3EFF7F3EDEDEAFB8CF073 +:10AD1000F4E9EA809A45418E418F8045454549498D +:10AD2000498E8F9092924F994F555559999A9B9C65 +:10AD30009D9E9F41494F55A5A5A6A7A8A9AAABAC22 +:10AD4000ADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBB +:10AD5000BDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCAB +:10AD6000CDCECFD0D1D2D3D4D5D6D7D8D9DADBDC9B +:10AD7000DDDEDFE0E1E2E3E4E5E6E7E8E9EAEBEC8B +:10AD8000EDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFC7B +:10AD9000FDFEFF00000000006410B71DC8206E3BE0 +:10ADA000AC30D9269041DC76F4516B6B5861B24DD2 +:10ADB0003C7105502083B8ED44930FF0E8A3D6D63C +:10ADC0008CB361CBB0C2649BD4D2D38678E20AA0A4 +:10ADD0001CF2BDBD3031323334353637383961621B +:10ADE0006364656630313233343536373839414241 +:10ADF00043444546000000000D0064656661756CC3 +:10AE000074005254582056352E352E33000102045A +:10AE1000982F8A4291443771CFFBC0B5A5DBB5E9C5 +:10AE20005BC25639F111F159A4823F92D55E1CAB39 +:10AE300098AA07D8015B8312BE853124C37D0C55C7 +:10AE4000745DBE72FEB1DE80A706DC9B74F19BC10F +:10AE5000C1699BE48647BEEFC69DC10FCCA10C24FF +:10AE60006F2CE92DAA84744ADCA9B05CDA88F976E3 +:10AE700052513E986DC631A8C82703B0C77F59BF4D +:10AE8000F30BE0C64791A7D55163CA066729291479 +:10AE9000850AB72738211B2EFC6D2C4D130D385316 +:10AEA00054730A65BB0A6A762EC9C281852C7292D8 +:10AEB000A1E8BFA24B661AA8708B4BC2A3516CC706 +:10AEC00019E892D1240699D685350EF470A06A103F +:10AED00016C1A419086C371E4C774827B5BCB0348E +:10AEE000B30C1C394AAAD84E4FCA9C5BF36F2E682C +:10AEF000EE828F746F63A5781478C8840802C78CBB +:10AF0000FAFFBE90EB6C50A4F7A3F9BEF27871C6BD +:10AF10002900000000500052D22700003B00000032 +:10AF200000500052D227000058000000005000528C +:10AF3000D22B0000FFFF0000FFFFFFFF000000001A +:10AF40002A00000000500052D22700003C00000000 +:10AF500000500052D227000059000000005000525B +:10AF6000D22B0000FFFF0000FFFFFFFF00000000EA +:10AF70004200000000500052D2270000570000009D +:10AF800000500052D2270000FFFF0000FFFFFFFF2C +:10AF9000000000000100000000500052D227000015 +:10AFA0003D00000000500052D22700005600000073 +:10AFB00000500052D2270000FFFF0000FFFFFFFFFC +:10AFC000000000001200000000500052D2270000D4 +:10AFD0005A00000000500052D2270000FFFF00007E +:10AFE000FFFFFFFF000000001600000000500052AD +:10AFF000D22B00001A00000000500052D22700009F +:10B000006600000000500052D22B0000FFFF00003D +:10B01000FFFFFFFF0000000001000000004C0040A7 +:10B02000D22300000300000000440040D21F0000B3 +:10B030000800000000780040D22F00000A00000045 +:10B0400000100140D21F00000A010000000C00584F +:10B05000D20F00000B000000004C0040D21B00008B +:10B060001300000000780040D22F000015000000FF +:10B0700000500040D23B00001700000000100140CB +:10B08000D21F000017010000000C0058D22300005E +:10B0900018000000004C0040D22300001B000000FC +:10B0A00000480040D21F00001C000000005000407B +:10B0B000D23B00001F00000000100140D21300002E +:10B0C0002700000000140140D21F00002B000000E8 +:10B0D00000480040D21F00002B010000004C00403F +:10B0E000D223000030000000004C0040D2230000BA +:10B0F0003200000000500040D22300003600000063 +:10B1000000440040D21F0000390000000048004009 +:10B11000D21F000040000000007C0040D22300004D +:10B120004700000000780040D21F000056000000D9 +:10B1300000780040D21F00006900000000140140A8 +:10B14000D21F00007E000000004C0040D22300000F +:10B1500089000000004C0040D2230000990000004C +:10B16000007C0040D2230000FFFF0000FFFFFFFF34 +:10B170000000000000000000004C0040D22300004E +:10B180000200000000440040D21F0000090000003F +:10B1900000100140D21F000009010000000C0058FF +:10B1A000D20F00000C000000004C0040D21B000039 +:10B1B0000F00000000780040D22F000014000000B3 +:10B1C00000780040D22F000016000000001001405F +:10B1D000D21F00001601000000500040D23B0000CA +:10B1E00016020000000C0058D223000019000000D5 +:10B1F000004C0040D22300001A000000004800402C +:10B20000D21F00001D00000000500040D23B000093 +:10B210001E00000000100140D213000026000000B4 +:10B2200000140140D21F00002A0000000048004026 +:10B23000D21F00002A010000004C0040D223000071 +:10B240002C00000000500040D2230000310000001C +:10B25000004C0040D22300003500000000440040B4 +:10B26000D21F00003800000000480040D21F00003C +:10B2700041000000007C0040D22300004800000094 +:10B2800000780040D21F0000570000000078004006 +:10B29000D21F00006E00000000140140D21F000009 +:10B2A0007D000000004C0040D22300009800000008 +:10B2B000007C0040D2230000FFFF0000FFFFFFFFE3 +:10B2C0000000000000000000000000002DCB00087E +:10B2D000E5CF00089DD0000831CB00086BCB0008FB +:10B2E000AF7B0008AF7B000861CB00089BCD000856 +:10B2F00091CD000865CB00088BCD00087FCD0008FC +:10B300007BCD000877CB000877CB000865D000081C +:10B310006FCD00080000000000000000A12001081F +:10B32000512101082520010811200108000000001A +:10B330000000000011D10008000000000000000023 +:10B3400075D600082F737464657272002F7374646D +:10B35000696E002F7374646F757400004B60D227A0 +:10B360003E3CCE3BF6B053CCB0061D65BC8698760D +:10B3700055BDEBB3E7933AAAD835C65A96C298D8CA +:10B380004539A1F4A033EB2D817D0377F240A4630E +:10B39000E5E6BCF847422CE1F2D1176BF551BF3717 +:10B3A0006840B6CBCE5E316B5733CE2B169E0F7CEA +:10B3B0004AEBE78E9B7F1AFEE242E34F512563FC86 +:10B3C000C2CAB9F3849E17A7ADFAE6BCFFFFFFFF20 +:10B3D000FFFFFFFF00000000FFFFFFFFFFFFFFFF79 +:10B3E000FFFFFFFFFFFFFFFF000000000000000065 +:10B3F0000000000001000000FFFFFFFF46494C4530 +:10B4000042440044465520496E7465726661636526 +:10B410000044465520436F6E66696700417264754B +:10B42000696E6F205341004769676100452D525492 +:10B4300043536574424B505265676973746572007B +:10B44000452D525443476574424B505265676973AA +:10B4500074657200452D526561643A696E76616C5F +:10B4600069642068616E646C6500452D5265616495 +:10B470003A667365656B00452D526561643A686193 +:10B480006E646C6520256420636F756E742030785F +:10B49000257A780A00452D45726173653A696E76A2 +:10B4A000616C69642068616E646C6500452D45724D +:10B4B0006173653A667365656B00452D457261730E +:10B4C000653A68616E646C6520256420636F756EF3 +:10B4D00074203078257A780A00452D4572617365AD +:10B4E0003A666C75736800452D50726F6772616DB6 +:10B4F0003A696E76616C69642068616E646C65009F +:10B50000452D50726F6772616D3A667365656B00A9 +:10B51000452D50726F6772616D3A68616E646C653B +:10B5200020256420636F756E74203078257A780A40 +:10B5300000452D50726F6772616D3A666C75736865 +:10B5400000452D43616E6E6F74206F70656E2066CE +:10B55000696C6520626C6F636B20646576696365F6 +:10B560002025732025730A00452D496E69743A66BB +:10B570007365656B00572D46696C652025732073D4 +:10B58000697A6520283078257A78292073686F7564 +:10B590006C64206265207468652073616D65206F3E +:10B5A0006620756E6465726C79696E6720626C6F77 +:10B5B000636B2064657669636520283078257A7826 +:10B5C000290A00536574537973436C6F636B20666B +:10B5D00061696C65640A006D61696E00404D435598 +:10B5E000626F6F742020202020202020762E2530AE +:10B5F00032642020202F30783030303030303030FE +:10B600002F302A344B67004041726475696E6F2099 +:10B6100020626F6F742020762E2530326420202027 +:10B620002F307830303030303030302F302A344BBB +:10B630006700404578742046696C6520466C6173EC +:10B64000682020304D422020202F3078303030309C +:10B65000303030302F302A344B6700676F6F640012 +:10B66000756E73657400626164004255473B2063E8 +:10B67000616E27742068617070656E007265766512 +:10B6800072740074657374007065726D00492D5397 +:10B6900074617274696E672041726475696E6F209F +:10B6A000626F6F746C6F6164657200492D536563DE +:10B6B000757265206B657973206E6F7420636F6E91 +:10B6C0006669677572656400492D537461727420F0 +:10B6D0004F54412030782558203078255820307834 +:10B6E00025580A00452D20205344204E4F54205306 +:10B6F0005550504F52544544007262002F66732FCC +:10B700005550444154452E42494E00492D536B65D6 +:10B71000746368207570646174656400492D426FBC +:10B720006F74696E6720736B657463682061742041 +:10B73000307825780A0A00492D4E6F20736B6574A6 +:10B74000636820666F756E6400492D53746172746E +:10B75000696E67204D4355626F6F7400572D4661C7 +:10B76000696C65642072656164696E6720736563E6 +:10B77000746F72733B20424F4F545F4D41585F4985 +:10B780004D475F534543544F52533D2564202D2070 +:10B79000746F6F20736D616C6C3F0A00572D4661AA +:10B7A000696C65642072656164696E6720696D61AA +:10B7B000676520686561646572733B20496D6167E8 +:10B7C000653D25750A00572D43616E6E6F742075B7 +:10B7D0007067726164653A206D6F7265207365638E +:10B7E000746F7273207468616E20616C6C6F776522 +:10B7F0006400572D43616E6E6F74207570677261BF +:10B8000064653A20736C6F74732068617665206E8E +:10B810006F6E2D636F6D70617469626C6520736506 +:10B8200063746F727300572D43616E6E6F74207571 +:10B830007067726164653A206E6F7420616C6C2071 +:10B84000736563746F72732066697420696E7369BF +:10B850006465207363726174636800572D43616E81 +:10B860006E6F7420757067726164653A20736C6FD7 +:10B87000747320617265206E6F7420636F6D7061E8 +:10B880007469626C65005072696D61727920696DCE +:10B8900061676500492D25733A206D616769633DD5 +:10B8A00025732C20737761705F747970653D3078F3 +:10B8B00025782C20636F70795F646F6E653D3078FA +:10B8C00025782C20696D6167655F6F6B3D30782549 +:10B8D000780A005363726174636800492D426F6F88 +:10B8E0007420736F757263653A2025730A00492DC1 +:10B8F000426F6F7420736F757263653A206E6F6E5E +:10B900006500452D446574656374656420696E63E4 +:10B910006F6E73697374656E74207374617475737C +:10B920002100572D4661696C656420726561646908 +:10B930006E6720626F6F74207374617475733B203F +:10B94000496D6167653D25750A00452D70616E6919 +:10B95000632100492D5365636F6E646172792069BC +:10B960006D616765206F6620696D61676520706134 +:10B970006972202825642E2920697320756E7265EE +:10B9800061636861626C652E205472656174206920 +:10B990007420617320656D7074790A00492D5377A6 +:10B9A000617020747970653A2025730A00492D531F +:10B9B00077617020747970653A206E6F6E6500490A +:10B9C0002D496D61676520757067726164652073CC +:10B9D00065636F6E6461727920736C6F74202D3EA5 +:10B9E000207072696D61727920736C6F7400492DDB +:10B9F00045726173696E6720746865207072696D45 +:10BA000061727920736C6F7400492D436F7079698E +:10BA10006E6720746865207365636F6E6461727908 +:10BA200020736C6F7420746F207468652070726965 +:10BA30006D61727920736C6F743A203078257A7852 +:10BA40002062797465730A00452D4661696C6564EE +:10BA500020746F206C6F63617465206669726D7706 +:10BA600061726520696D6167652C206572726F7205 +:10BA70003A2025640A0A00492D426F6F74696E6787 +:10BA8000206669726D7761726520696D61676520F6 +:10BA9000617420307825780A0A0073696E676C65D6 +:10BAA000746F6E5F6D75746578006D616C6C6F633B +:10BAB0005F6D7574657800656E765F6D7574657819 +:10BAC00000492D437573746F6D204F54412064619C +:10BAD000746100492D5365636F6E64617279205BF8 +:10BAE00025645D205B25645D0A00492D5363726106 +:10BAF000746368205B25645D205B25645D0A0049F2 +:10BB00002D44656661756C74204F544120646174E6 +:10BB10006100452D55206F6E2049415000452D5341 +:10BB2000444D4D4300452D436F6E66696700452DBA +:10BB300042442055215300452D4D4252205521535A +:10BB400000452D496E697400452D4D6F756E74006A +:10BB50002F66732F7570646174652E62696E007252 +:10BB6000622B002F66732F736372617463682E6299 +:10BB7000696E00452D5520636F6E66696700452D1F +:10BB800053206F6E2049415000452D5320636F6E46 +:10BB900066696700452D496E69742055204D4252F3 +:10BBA00000452D496E69742053204D425200736543 +:10BBB0006300452D4D6F756E742055206F6E204CBF +:10BBC0004F47002F7365632F7570646174652E6233 +:10BBD000696E0073637200452D4D6F756E7420534E +:10BBE000206F6E204C4F47002F7363722F73637268 +:10BBF000617463682E62696E007274785F74696D37 +:10BC00006572007274785F69646C650040496E7497 +:10BC100065726E616C20466C6173682020324D4203 +:10BC20002020202F307830383030303030302F30F6 +:10BC3000312A3132384B612C31352A3132384B6759 +:10BC40000040457874205241572020466C6173684B +:10BC50002031364D422020202F307839303030309E +:10BC60003030302F343039362A344B670000000032 +:10BC70009ABA01080B000000FCA402241C0000007A +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB000000000000000000001000000E803000098 +:10BCC000050000006843022410000000000000008E +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000010000023 +:10BD1000B0BE0108ECBE010895460108F13B0108E0 +:10BD2000D4BE010804000000000000000000000074 +:10BD3000954E0108B94E01083DBF0008A9BA000898 +:10BD4000AF7B000871BB00080DBE000819BC0008DD +:10BD5000AB350108C5790008C5790008BD79000830 +:10BD600043790008397900083D7900084F7B0008C5 +:10BD7000EF7A0008CB790008B579000800000000D0 +:10BD800000000000DFA90008FD7B000835B60008B0 +:10BD90009D7C0008C7780008737800081F780008A9 +:10BDA000D9770008AB350108C5770008B1770008DE +:10BDB0009D77000875770008617700085B770008B9 +:10BDC0004F7B0008EF7A0008CB7900082F77000836 +:10BDD00055770008437700083F7700083B77000855 +:10BDE0000000000000000000A93501086D450108B1 +:10BDF000FD440108F1440108A5350108553D01083D +:10BE00009144010801440108AB350108813501085E +:10BE10007B350108753501086F350108397900084F +:10BE2000693501088735010887350108873501081C +:10BE3000613501080000000000000000DDA90008D5 +:10BE4000F17B0008C1760008B9760008B1760008D9 +:10BE5000677600081D760008DD750008AB3501081F +:10BE6000EB740008E3740008CD740008B374000894 +:10BE7000AB740008997400088F75000841750008BC +:10BE8000F374000891740008010501000105030224 +:10BE90000401040103040302040104030402040175 +:10BEA0000401040301030304010400000000000076 +:10BEB00003BC010800000000B44402244400000058 +:10BEC000F84402240003000001000000010000000B +:10BED000000000000000000000000000A843022451 +:10BEE00034000000DC43022450000000F9BB0108CC +:10BEF000000000007044022444000000F8470224BF +:10BF00000003000028000000010000000000000005 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF7000400300241F0000001C0000001F00000000 +:10BF80001E0000001F0000001E0000001F00000037 +:10BF90001F0000001E0000001F0000001E00000027 +:10BFA0001F0000001F0000001D0000001F00000017 +:10BFB0001E0000001F0000001E0000001F00000007 +:10BFC0001F0000001E0000001F0000001E000000F7 +:10BFD0001F000000545A00474D54002531305B5E6D +:10BFE000302D392C2B2D5D256E004D256875256E65 +:10BFF0002E256875256E2E256875256E002F2568FF +:10C0000075256E3A256875256E3A256875256E008A +:10C010000020202020202020202028282828282018 +:10C020002020202020202020202020202020202010 +:10C030002088101010101010101010101010101078 +:10C040001004040404040404040404101010101068 +:10C050001010414141414141010101010101010132 +:10C060000101010101010101010101011010101084 +:10C070001010424242424242020202020202020204 +:10C080000202020202020202020202021010101058 +:10C090002000000000000000000000000000000080 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C1100000686C4C002B2D00303000785800412D09 +:10C1200046612D66383930313233343536375D006B +:10C1300015C1010818C101081BC101080000000059 +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000000000000000000000000000002B +:10C51000000000000000000000000000000000001B +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D000000000000000000000000000000000005B +:10C5E000000000000000000000000000000000004B +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000000000000006 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000000000000000B5 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB0000000000000000000000000000000000075 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000000000000000000000000000035 +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000000000000000000F4 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD400000000000000000000000000000000000E3 +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000000000000000000000038 +:10D8F0000000000000000000000000000000000028 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000000000000000000016 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA600000000000000000000000000000000000B6 +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000000000000000000036 +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000000000000000015 +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000000000000000000000000C5 +:10DB600000000000000000000000000000000000B5 +:10DB700000000000000000000000000000000000A5 +:10DB80000000000000000000000000000000000095 +:10DB90000000000000000000000000000000000085 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000000000000000000000000055 +:10DBD0000000000000000000000000000000000045 +:10DBE0000000000000000000000000000000000035 +:10DBF0000000000000000000000000000000000025 +:10DC00000000000000000000000000000000000014 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000000E4 +:10DC400000000000000000000000000000000000D4 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000000054 +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000000000000000000003 +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000000000000000000000000B3 +:10DD700000000000000000000000000000000000A3 +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD0000000000000000000000000000000000041 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000000000000000000000090 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000000000008C +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000000000000000000001C +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E5200000000000000000000000000000000000EB +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F000000000000000000000000000000000001B +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000000000000000000FA +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000000000000000D9 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000099 +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000000000000000000000019 +:10E800000000000000000000000000000000000008 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000094 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:0BF00000A0190202000108100001101E +:08F00C003415FE7F0100000035 +:10F01400A80600240000000000000000FFFFFFFF1E +:10F02400FFFFFFFFFFFFFFFF0000000000000000E4 +:10F0340000000000000000000000000000000000CC +:10F0440000000000000000000000000000000000BC +:10F0540000000000000000000000000000000000AC +:10F06400000000000000000000000000000000009C +:10F07400000000000000000000000000000000008C +:10F08400000000000000000000000000000000007C +:10F09400000000000000000000000000000000006C +:10F0A400000000000000000000000000000000005C +:10F0B400000000000000000000000000000000004C +:10F0C400000000000000000000000000000000003C +:10F0D400000000000000000000000000000000002C +:10F0E400000000000000000000000000000000001C +:10F0F400000000000000000000000000000000000C +:10F1040000000000000000000000000000000000FB +:10F1140000000000000000000000000058A50224C8 +:10F124008D8801080100000002AE0108D3B3FB0280 +:10F1340000000000000000000000000000000000CB +:10F1440000000000000000000000000000000000BB +:10F1540000000000000000000000000000000000AB +:10F16400000000000000000000000000000000009B +:10F17400000000000000000000000000000000008B +:10F18400000000000000000000000000000000007B +:10F19400000000000000000000000000000000006B +:10F1A400000000000000000000000000000000005B +:10F1B400000000000000000000000000000000004B +:10F1C400000000000000000000000000AD3601084F +:10F1D400A1360108213701083937010861360108D1 +:10F1E40009370108F1360108404578742046696CF6 +:10F1F4006520466C6173682031364D422020202FF3 +:10F20400307841303030303030302F343039362A95 +:10F21400344B670000000000013D01089D450108D2 +:10F2240029400108513E0108BD370108AD370108E6 +:10F23400B1370108C1370108B9370108B5370108EA +:10F24400C5370108C5370108C5370108A1370108CA +:10F254007D3701080CBC010841BC0108D801002419 +:10F2640094270224914D0108D9450108B53D0108B0 +:10F27400194A0108E1350108D535010812010002D7 +:10F284000000004041236603000201020301000064 +:10F294000403090432030000000000000000000021 +:10F2A400000000000000000000000000000000005A +:10F2B400000000000000000000000000000000004A +:10F2C400000000000000000009027800030102C0F1 +:10F2D400FA0904000000FE0102060904000100FE10 +:10F2E4000102070904000200FE01020809040003E8 +:10F2F40000FE01020909210BFF0000101A01080B8E +:10F3040001020202010009040100010202010005D8 +:10F31400240010010524010002042402020524062D +:10F3240001020705830308000909040200020A0018 +:10F3340000000705020240000007058202400000A9 +:10F344000A060002000000400100011440030024EA +:10F354000000000030BF010850BF010810BF0108C1 +:10F364000000000000000000000000000000000099 +:10F374000000000000000000000000000000000089 +:10F384000000000000000000000000000000000079 +:10F394000000000000000000000000000000000069 +:10F3A4000000000000000000000000000000000059 +:10F3B400D7BF0108D7BF010801000000000000000A +:10F3C4004A000000000000000000000000000000EF +:10F3D4000000000000000000000000000000000029 +:10F3E40000000000000000004A00000000000000CF +:10F3F4000000000000000000000000000000000009 +:10F4040000000000000000000000000000000000F8 +:10F4140044A502240000000025050008A5270008D3 +:08F424000105000800000000D2 +:040000050800067D6C +:00000001FF diff --git a/bootloaders/NICLA_VISION/bootloader.hex b/bootloaders/NICLA_VISION/bootloader.hex new file mode 100644 index 000000000..e5908250a --- /dev/null +++ b/bootloaders/NICLA_VISION/bootloader.hex @@ -0,0 +1,8008 @@ +:020000040800F2 +:10000000000008241573010861730108D565000814 +:10001000DB650008E1650008E765000800000000F6 +:10002000000000000000000000000000AD250008F6 +:1000300061730108000000004726000857260008E9 +:10004000617301086173010861730108617301083C +:10005000617301086173010861730108617301082C +:10006000617301086173010861730108617301081C +:10007000617301086173010861730108617301080C +:1000800061730108617301086173010861730108FC +:1000900061730108617301086173010861730108EC +:1000A00061730108617301086173010861730108DC +:1000B00061730108617301086173010861730108CC +:1000C00061730108617301086173010861730108BC +:1000D00061730108617301086173010861730108AC +:1000E0006173010861730108000000006173010879 +:1000F000617301086173010861730108617301088C +:10010000617301086173010861730108617301087B +:10011000617301086173010861730108617301086B +:10012000617301086173010861730108617301085B +:10013000617301086173010861730108617301084B +:1001400061730108617301080000000000000000F5 +:10015000617301086173010861730108617301082B +:10016000617301086173010861730108617301081B +:1001700061730108617301086173010800000000E8 +:1001800061730108617301086173010861730108FB +:1001900061730108617301086173010861730108EB +:1001A00061730108617301086173010861730108DB +:1001B00061730108617301086173010861730108CB +:1001C00061730108617301086173010861730108BB +:1001D00061730108617301086173010861730108AB +:1001E000617301086173010861730108617301089B +:1001F000617301086173010861730108617301088B +:10020000617301086173010861730108617301087A +:10021000617301086173010861730108617301086A +:10022000617301086173010861730108617301085A +:100230005505000811730108617301086173010815 +:10024000617301086173010861730108617301083A +:10025000617301086173010861730108617301082A +:10026000617301086173010861730108617301081A +:10027000617301086173010861730108617301080A +:1002800061730108617301086173010800000000D7 +:10029000617301086173010810B5054C237833B907 +:1002A000044B13B10448AFF300800123237010BD49 +:1002B0002004002400000000F4DD010808B5034B11 +:1002C0001BB103490348AFF3008008BD00000000E4 +:1002D00024040024F4DD0108154B002B08BF134B48 +:1002E0009D46A3F5803A00218B460F461348144AD9 +:1002F000121A1AF039FA0F4B002B00D098470E4B08 +:10030000002B00D098470020002104000D000D486C +:10031000002802D00C4806F0ADFE1AF00FF82000BD +:10032000290004F093F907F061F800BF000008000D +:100330000000082400000000A94500082004002453 +:10034000483F0024757000080000000007B50093C6 +:1003500013460A460146044814F054FA003818BF00 +:10036000012003B05DF804FB1422002407B50093BC +:1003700013460A460146044814F026FB003818BF0D +:10038000012003B05DF804FB142200240A46014654 +:10039000034808B514F0ECFB003818BF012008BD75 +:1003A00014220024F0B5304C8BB008270126D4F875 +:1003B000E0300022032505A943F040032B48C4F890 +:1003C000E030D4F8E03003F040030193019BCDE925 +:1003D0000725CDE9057610F0F7F8002239462348C5 +:1003E00010F0D8F9D4F8DC3005A9214843F40073A3 +:1003F000C4F8DC30D4F8DC3003F400730293029BC1 +:10040000D4F8E03043F00203C4F8E030D4F8E03030 +:1004100003F002030393039BD4F8E0303B43C4F89A +:10042000E030D4F8E03008953B400493049B02236D +:10043000CDE90636092309934CF21803059310F011 +:10044000C3F8C02305A90B4805930B23099310F0AB +:10045000BBF8002205217C200FF0A8FD7C200FF0C6 +:10046000D7FD0BB0F0BD00BF004402580018025881 +:1004700000040258000C025808B57C200FF0D6FD8D +:10048000034AD2F8DC3023F40073C2F8DC3008BD34 +:100490000044025837B5124B0025124C2946236000 +:1004A00004232046256163614FF48043C4E901556C +:1004B000E360FFF777FF01238DF807309DF80730E1 +:1004C000012B06D020462946FFF7D6FF022003B0B5 +:1004D00030BD204614F01AFF003818BF0120F6E79F +:1004E000002402481422002470B5084C084E20460F +:1004F000266014F073F90546002120462660FFF7B8 +:10050000BBFF281E18BF012070BD00BF14220024AD +:1005100000240248014814F051BF00BF14220024F7 +:1005200008B5034814F0DEFE043818BF012008BDEA +:10053000142200240146014814F0F8BD14220024BE +:10054000704708B5FFF7FCFF08BD704708B5FFF717 +:10055000FCFF08BDFFF7DEBF00207047002070479A +:100560000368DB6A18474FF0FF307047D0E902019B +:100570007047D0E904017047D0E906017047D0E91F +:100580000931C26A006A424301FB0323A0FB010157 +:100590001944704700487047F8C201085C3007F002 +:1005A00055BB5C3007F06EBB38B503680546DB6CA5 +:1005B0009847FFF799FF044685F8540038B92B682F +:1005C00085F8800028461B6D9847204638BD0148B5 +:1005D000FCE700BF78ECFFFF074B10B50360044653 +:1005E00090F880300BB1FFF7DFFF04F15C0007F0FB +:1005F00061FB204610BD00BF08C3010810B50446CA +:10060000FFF7EAFF8821204606F02AFF204610BDAA +:100610002DE9F74FDDE90CAB0D460168044617469E +:100620001E46CDE900ABC96B8847002831D023684E +:100630002046DB6C984794F8803043B92368204605 +:10064000154D1B6D9847284603B0BDE8F08FD4E9DF +:1006500008895046594642464B461BF0B1FC82463B +:1006600042464B46384631461BF0AAFCA36D014674 +:1006700052462846094DFFF769FE002808BF0025AD +:10068000FFF74EFF0028FBD1236820461B6D9847DB +:10069000D9E7034DD7E700BF74ECFFFF6DECFFFF18 +:1006A00075ECFFFF2DE9F74FDDE90CAB0D46016856 +:1006B000044617461E46CDE900AB096C8847002862 +:1006C00031D023682046DB6C984794F8803043B9DA +:1006D00023682046154D1B6D9847284603B0BDE89A +:1006E000F08FD4E908895046594642464B461BF0E4 +:1006F00067FC824642464B46384631461BF060FC5A +:10070000A36D014652462846094DFFF72FFE0028EB +:1007100008BF0025FFF704FF0028FBD1236820460F +:100720001B6D9847D9E7034DD7E700BF74ECFFFF77 +:100730006CECFFFF75ECFFFFF0B585B00168044677 +:1007400016460A9D0B9F00950197496C884770B328 +:1007500023682046DB6C984794F880303BB92368C7 +:100760002046144D1B6D9847284605B0F0BDD4E9CE +:1007700008230021A81A3044CDE902321BF020FCE6 +:10078000054600213046DDE902321BF019FC2946FE +:10079000FFF7FCFD0028084D08BF0025FFF7C0FE4D +:1007A0000028FBD1236820461B6D9847DCE7034DEA +:1007B000DAE700BF74ECFFFF6EECFFFF75ECFFFFA4 +:1007C0002DE9F0471E460368154604465B6ADDE9DD +:1007D000087A984702460B46284631461BF0F0FB44 +:1007E000134302D00020BDE8F087236820465B6AEF +:1007F000984702460B46384651461BF0E1FB13432F +:10080000F0D115EB07082368204646EB0A099B6BDD +:100810009847494508BF40452CBF01200020E2E72A +:1008200001682DE9F04717469846096B0646DDE951 +:10083000089A884702460B46384641461BF0C0FBE3 +:10084000134302D00020BDE8F08717EB090433689A +:10085000304648EB0A0514F1FF32196B45F1FF33BE +:10086000884702460B46204629461BF0A9FB134346 +:10087000E8D1336830469B6B9847A94208BFA04235 +:100880002CBF01200020DEE738B503680446DB6C8E +:100890009847FFF7FFFD054684F8540050B12368E0 +:1008A000022D20461B6D02D19847104838BD98474D +:1008B0000F48FBE704F13000FFF73CFE236B2046B6 +:1008C0002371636CC4E90235C4E90435C4E9063513 +:1008D000C4E90835236CC4E90A35012384F8803063 +:1008E00023681B6D98472846E0E700BF73ECFFFFC5 +:1008F00074ECFFFF2DE9F0471E46036815460446D9 +:100900009B6ADDE9087A984702460B46284631463D +:100910001BF056FB134302D00020BDE8F08723688C +:1009200020469B6A984702460B46384651461BF0C4 +:1009300047FB1343F0D115EB07082368204646EB2D +:100940000A099B6B9847494508BF40452CBF0120C9 +:100950000020E2E70D4B4FF4007210B50360002356 +:1009600004465C3040E9152340E9132340E9112394 +:1009700040E90F230022002340E90D2307F05EF930 +:100980004FF47A732046A36510BD00BF08C3010869 +:100990006F23038000487047400000240020704708 +:1009A000002070470A23038000487047B0000024ED +:1009B000BFF34F8F0549064BCA6802F4E062134348 +:1009C000CB60BFF34F8F00BFFDE700BF00ED00E03D +:1009D0000400FA05F0B541F21802D0F8B84289B027 +:1009E0000746A35C042B6BD104F5805641F2040347 +:1009F0003168002955D12278AAB9E358012B41D199 +:100A0000002541F2040341F21802E550032335604A +:100A1000A35441F21102A55441F21202A55241F22F +:100A20001402A3542BE0212A10D1E358052B29D11D +:100A3000E378A2781B0403EB022362781344227943 +:100A400003EB026341F20802A350D9E7412A19D10E +:100A5000E358052B16D1E378A0781B0403EB0023A1 +:100A600060780344207903EB006041F20803E05012 +:100A7000D7F8BC325B6998470028C1D002252846C8 +:100A800009B0F0BD002341F2040204A93846A35086 +:100A900033608DF810300123ADF8163000F0F2FD10 +:100AA000AEE70129ACD941F208020239A058D7F8C3 +:100AB000BC2200EB013120469569E258A847DBE7EC +:100AC000072B4FF0000313D141F219016354184969 +:100AD00091F8265041F2110115F004050AD00620C4 +:100AE000A05441F212026354A35241F21402A054E2 +:100AF0001D46C4E70823A35441F212026554A552CF +:100B000041F21402A354D0F8BC321B699847094B38 +:100B1000094A00210948079206950092CDE9043759 +:100B200004ABCDE9020106480ECB04F060FCA6E759 +:100B300040000024B10900089D0F0008400D03008B +:100B40004004002438B5D0F8B832002541F218012D +:100B5000044603F58052156041F204029D500222C2 +:100B60005A5441F210015D5441F214015A54D0F824 +:100B7000B80218B119F080FDC4F8B852002038BD91 +:100B800038B5044641F21C0019F06EFDC4F8B802F5 +:100B9000E0B1022241F2180300F580510C4DC2521F +:100BA00000230B6041F20401435041F2080145501B +:100BB00041F20C01435041F21001435041F2140341 +:100BC000C252D4F8BC32DB68984700B1022038BD6D +:100BD00000000408054B10B50446036004F0DEFB7A +:100BE000204604F089FC204610BD00BF18C601084D +:100BF000082908B509D88B1FD0F8BC02044950F861 +:100C0000230000F04AFD024808BD0020FCE700BFB9 +:100C1000800400242DE9F7430D7800230646D0F820 +:100C2000B84215F06005ADF8063000F07681202D51 +:100C300040F0898191F80180B8F1060F00F28381BC +:100C4000DFE818F03F0107003E00AF0006011D017C +:100C5000220141F21803CA88E05CDAB1022801D00F +:100C6000052813D1498804F580533046196041F2B4 +:100C7000040341F21801E2500323635441F21401CA +:100C80006354214600F03AFD002515E0304600F09F +:100C9000F9FCF9E7052801D00228F7D14FF4837257 +:100CA0000025E25241F211030622E55441F21203FB +:100CB000E55241F21403E254284603B0BDE8F08344 +:100CC000CA8841F21800002A5FD0205C04F58053E6 +:100CD000022801D0092852D14F8841F204091F602F +:100CE00041F2180344F80920DFB9032A21464FF0E6 +:100CF000030298BF4FF0090804F8038041F2110382 +:100D0000E75441F21203E75241F2140304F803805E +:100D10004FF4045323804123A370304600F0D9FCE4 +:100D2000B2E7012F41F211001BD009210025023F3B +:100D3000E15441F212032554E55241F21403E15407 +:100D400041F208032146E058D6F8BC3200EB0730E8 +:100D5000DB69984734F809200146304600F0B9FCB9 +:100D6000AAE70F220025E25441F212032554E5526E +:100D700041F21403E254304600F084FC9CE7002565 +:100D800041F20402A5501D60F5E7022341F2110172 +:100D90002354625441F21201625241F2140163542D +:100DA00072E741F2180204F58055A35C1035032B5D +:100DB00004D0062B2DD006222946AEE741F20403CB +:100DC00041F21100E358EBB1042341F21201A354A4 +:100DD00000222254625241F21402A35441F2080349 +:100DE000E05804F580531968D6F8BC3231B922783E +:100DF000412A03D11B6A2A469847DCE71B6A2A4628 +:100E00000121F9E70521A154235441F21202A35212 +:100E10000DE041F21903E35C012B0CD10721A15431 +:100E200041F21102A35441F212030022E25241F2B4 +:100E30001403E154BFE7002BBDD1564991F82610A9 +:100E40004907B8D50221A15441F21102A354DCE7AD +:100E500041F2180341F21001E25C0A2A07D1022292 +:100E60000025E25441F214036550E25224E70A22BD +:100E7000E2540E23635041F21403E25204E704F5F6 +:100E800080510122183148E741F21802A35C092B76 +:100E90003FF6FAAE4FF41B75DD40ED4315F001054A +:100EA0007FF4F2AE0223A35441F21002A55041F2A6 +:100EB0001402A35204F580531D6041F20403E5506F +:100EC000FAE641F21800225C092A14D84FF41B7389 +:100ED000D340DB4313F001030DD10222225441F22F +:100EE0001000235041F21400225204F58052136086 +:100EF00041F20402A350274B93F8275015F0100538 +:100F000007D03046454600F08CF8304600F084F8B3 +:100F1000D2E648880EF0B4FFCEE64F780B2F12D8F9 +:100F2000DFE807F006111111111116111111232C10 +:100F300090F89C32032B06D102220DF106013D46AA +:100F400000F0C7FBB8E63046022500F09BFBB3E695 +:100F50004B881B12212B05D1CA880F49092A28BFAB +:100F60000922FAE600221146F7E690F89C32032B9C +:100F7000E9D104F5805101220C31EEE68B78022B89 +:100F8000E1D890F89C22032ADDD141F20C02A35053 +:100F900092E600BF4000002464000024D0E9003045 +:100FA000184700207047002070470020704700203D +:100FB000704709B1C0F8BC120020704710B5054C4D +:100FC000204604F05FFA2046034A0449BDE8104079 +:100FD00006F04EB84004002400000024D50B0008A1 +:100FE00008B580B1D0F8B43213B10023C0F8B432E0 +:100FF00009B1C0F8B0120123027080F89C3201F0F0 +:1010000061F8002008BD0220FCE719B1C0F8B41255 +:10101000002070470220704708B501F07BF80020DF +:1010200008BDD0F8B43201795B6810B50446984722 +:10103000204601F076F8002010BD08B5D0F8B43293 +:101040000BB9022008BD1B6898470028FAD0F8E7C2 +:1010500008B5D0F8B4325B689847002008BD38B5B1 +:1010600000F52A750446284600F0F8FA012394F8A2 +:10107000A812C4F89432B4F8AE32C4F8983201F031 +:101080001F03012B08D0022B0BD07BB92946204629 +:1010900000F004F9002038BD2946204600F030FA5F +:1010A000F8E72946204600F04FFAF3E701F0800107 +:1010B000204601F047F8EDE770B5044616460D46A8 +:1010C00041BBD0F89432032B1DD1D0E95812914284 +:1010D0000CD9891A8A42C0F8601188BF8AB2314699 +:1010E00098BF92B200F017FB284670BDD0F8B4321A +:1010F0001B6923B190F89C22032A00D1984720460F +:1011000000F011FBF0E7052BEED1C4F8941201F0CA +:1011100019F8E9E7D0F8B4329B6933B190F89C2212 +:10112000032A02D100259847DEE70225DCE7F8B55F +:10113000044617460D46002947D1D0F89432022BB9 +:101140003CD1D0E908639E4214D9F31A39469AB2C9 +:10115000036200F0CBFA2B462A462946204601F0CE +:1011600020F894F8A032012B02D1002384F8A03299 +:101170002846F8BDC269B2FBF3F603FB16265EB93A +:10118000934209D8D0F898329A4205D20A4600F024 +:10119000ADFAC4F89852DEE7D4F8B432DB682BB16C +:1011A00094F89C22032A01D12046984780212046AA +:1011B00000F0C8FF204600F0C1FAD2E733F0040384 +:1011C000CFD1802100F0BEFFCBE7D0F8B4325B690D +:1011D00033B190F89C22032A02D100259847C7E733 +:1011E0000225C5E70022402370B5044601254026AC +:1011F000114600F09DFF8021334600222046C4F8AE +:101200005851C4F8646100F093FF0021D4F8B8325B +:10121000A561666284F89C52C4F894126160C4F8B7 +:10122000A41223B1D4F8B43220465B68984700205A +:1012300070BD01740020704790F89C3280F89D3298 +:10124000042380F89C320020704708B590F89C2257 +:10125000032A04D1D0F8B432DB6903B198470020E7 +:1012600008BD002070470020704700207047012211 +:10127000017908B580F89C22D0F8B42252689047D2 +:10128000002008BD10B50446802100F05BFF00215E +:101290002046BDE8104000F055BF000037B50B7880 +:1012A00004460D4603F06003202B12D0402B10D0D3 +:1012B000002B51D14B78092B4ED8DFE813F0F70003 +:1012C00013014D000C014D00900013004D00DF0094 +:1012D000AC00D4F8B432294620469B6898470020D9 +:1012E00003B030BD00234988ADF806300B0A013B3E +:1012F000062B31D8DFE803F00416233030515B00B1 +:10130000D0F8B0321B680DF10601207C9847BDF87B +:101310000620002A5FD0EB88002B53D1204600F036 +:1013200002FADCE7027CD0F8B43232B99B6A0DF1E4 +:101330000600984702234370E9E7DB6AF7E7C9B282 +:10134000052921D8DFE801F0030C1014181CD0F88F +:10135000B0325B68002BD6D12046FFF793FFBEE783 +:10136000D0F8B0329B68F5E7D0F8B032DB68F1E72F +:10137000D0F8B0321B69EDE7D0F8B0325B69E9E72D +:10138000D0F8B0329B69E5E7D0F8B4329B6B002B04 +:10139000E2D00DF106029847B9E7037C002BDBD1C0 +:1013A000D0F8B4320DF106005B6B9847AFE7037CD1 +:1013B000002BD1D1D0F8B4320DF106001B6B984749 +:1013C0000723B8E79A420146204628BF1A46ADF8DF +:1013D000062000F07EF9EB88002B80D19EE78B88F9 +:1013E000002BB9D1CB88002BB6D14D887F2DB3D837 +:1013F00090F89C32032BAFD0E9B280F89E1200F037 +:10140000C2FE204600F08FF91DB1022384F89C3201 +:1014100065E70123FAE78978384D012929709BD8BF +:1014200090F89C32022B08D0032B15D0FFF72AFF2F +:1014300029782046FFF70CFE51E700293FF46EAFF4 +:1014400001210323416080F89C322046FFF7F5FD1F +:1014500002287FF463AF7FE731B90223416080F84F +:101460009C32FFF7F5FD59E7416801293FF456AF7B +:10147000C9B2FFF7EDFD29786160E6E7CA88012A65 +:101480007FF46AAF90F89C32022B0AD8002B3FF40D +:1014900063AF0146002341F8083F204600F019F9E8 +:1014A0001DE7032B7FF458AF011DF6E790F89C323F +:1014B000013B022B3FF650AFCB88022B7FF44CAFA1 +:1014C0000123C360D0F8A4320BB10323C36002220E +:1014D00004F10C01E1E74B88012B7FF400AFC4F865 +:1014E000A4321BE790F89C32013B022B3FF634AF4D +:1014F0004B88012B7FF4F3AE0023F0E77F05002437 +:1015000038B50B7804460D4603F06002402A01D03E +:101510005B0615D494F89C32013B022B10D82B7932 +:10152000022B0DD8D4F8B432294620469B68984740 +:10153000EB881BB910B9204600F0F5F8002038BD43 +:101540002046FFF79FFEF9E738B50A7804460B46B8 +:1015500002F06002202A27D0402A25D092BB5A7878 +:101560008D88012A09793DD0032A25D052BB90F8F5 +:101570009C32022B4DD0032B24D101F00F031422F7 +:1015800015F0800F02FB030354D09B69D3B101F027 +:101590007F05142305FB0333C51811F07F0355D1D4 +:1015A0002B600222294641E0D4F8B4221946204695 +:1015B00092689047002038BD90F89C22022A1FD0E4 +:1015C000032A03D02046FFF75DFEF3E75A882AB9C5 +:1015D0004A0603D0DB880BB900F0B4FD204600F0CA +:1015E000A2F8E7E790F89C22022A09D0032AE9D161 +:1015F0005B88002BDED14D06F0D000F0AAFDEDE7B0 +:101600004B06DFD000F09EFD8021204600F09AFDC1 +:10161000D0E74A06D6D12B064FF002024FF0000366 +:101620004CBF00F1140100F5AA710B60204600F0D8 +:1016300050F8BFE7D3F85831002BC3D001F07F0535 +:10164000142303FB050505F5AA75A6E7204600F05F +:1016500087FD08B10123A3E72860A2E70B78037098 +:101660004B784370CA788B7803EB022343804A7926 +:101670000B7903EB02238380CA798B7903EB022376 +:10168000C380704710B50446802100F05BFD002147 +:101690002046BDE8104000F055BD30B588B10025AA +:1016A00001382B460135445D002CFAD1DBB2013301 +:1016B0005B0013800B7003234B70022310F8015F53 +:1016C00005B930BD5A1CCD540233D2B2DBB28C54B2 +:1016D000F4E710B502241346C0F89442C0E907228B +:1016E0000A46002100F056FD002010BD08B5134643 +:1016F0000A46002100F04EFD002008BD10B503246D +:101700001346C0F89442C0E957220A46002100F06F +:1017100048FD002010BD08B513460A46002100F020 +:1017200040FD002008BD08B50423C0F89432002312 +:101730001A46194600F02EFD002008BD08B5052305 +:10174000C0F8943200231A46194600F02AFD002002 +:1017500008BD0000094B30B51A46094CD3F8945027 +:10176000A542FBD1036829B181680B604FF4407337 +:10177000536130BDC1681B04F7E700BF0064025825 +:1017800000030080024B034A1A6010F0EDBC00BF5A +:1017900080050024004000582DE9F043EBB0FFF72E +:1017A000F1FF0021B84812F090FF054603F0B0FDAC +:1017B000012809D1B4484DF65972002112F080FF7A +:1017C0004FF4FA700EF05CFB1C22002103A818F005 +:1017D000CBFF0022022103A804F071F91C22002192 +:1017E0000AA818F0C1FF00220123962100920AA83E +:1017F00004F07EF90B9B1A680A9B1A4206D00AA8CD +:1018000003F0BDF801210AA8FFF7A4FF1C22002164 +:1018100011A8002418F0A8FF2D2111A804F065F9E3 +:1018200018A803F007FE0EF0D9FC5122502129A878 +:1018300003F048FB48F29C0302AA1021ADF80830DF +:1018400029A80223009403F09FFA42F29E0302AA01 +:101850001021ADF8083029A80223009403F094FA6F +:101860000A200EF00DFB40F2422302AA1021ADF82F +:10187000083029A80223009403F086FA0A200EF00B +:10188000FFFA4AF2940302AA1021ADF8083029A801 +:101890000223009403F078FA0A200EF0F1FA0121F5 +:1018A00003A8FFF757FF0A200EF0EAFA214603A823 +:1018B000FFF750FF0A200EF0E3FA012103A8FFF71B +:1018C00049FF0A200EF0DCFA40F2AA739D421FD1B4 +:1018D00001216D4812F0F9FE022106466A4812F015 +:1018E000F4FE07460321684812F0EFFE394602462F +:1018F000F0B200F01DF9024630B90146624812F01C +:10190000DFFE0EF091FCFEE721465F4812F0D8FEA4 +:101910005E4B1A6802F07F42B2F1005F11D01A6884 +:1019200002F07F42B2F1105F0BD01A6802F07F42E2 +:10193000B2F1405F05D01B6803F07F43B3F1605FF5 +:1019400019D14DF659739D4215D040F2AA739D42AC +:1019500011D000224D4C4C48114612F0B1FE0EF051 +:1019600063FC204604F036FF236883F30888484B65 +:1019700001201B6898470021012015F0EDFB454F21 +:1019800015F044FB444E00F085FD002243493D46DE +:101990004348FFF725FB43494148FFF736FB4249DF +:1019A0003F48FFF706FB3E48FFF736FB4D200EF0A1 +:1019B0003DFB65200EF03AFBDFF8F890DFF8F88089 +:1019C0007269B3691A4202D048460FF0C7FFD8F8CF +:1019D0000020282192FBF1F4531C01FB1424C8F8C9 +:1019E0000030002CECD115F0CFFFB0F5FA7F13D901 +:1019F000DFF8C88098F8003073B12146224812F011 +:101A000064FE4DF65973984206D1224621461E487F +:101A100012F056FE88F800403B78244C83B9244BE2 +:101A200011A81B78227842FA83F3DBB22370129B51 +:101A30001A68119B1A420CBF01210021FFF78AFE90 +:101A40002B780133DBB22B702378FA2B02D8237862 +:101A5000092B0AD8164A13785B425BB213701378CD +:101A6000227842FA83F3DBB223702A7823789A42F1 +:101A7000A2D1129B11A81A68119B1A420CBF012116 +:101A80000021FFF767FE97E78005002400000408A7 +:101A9000040004086C08002400000440C000002476 +:101AA000A40500240400002428010024BC00002414 +:101AB000BB0000249022002468080024BA000024FF +:101AC000BFF34F8F0549064BCA6802F4E062134327 +:101AD000CB60BFF34F8F00BFFDE700BF00ED00E01C +:101AE0000400FA050368184700F07B43B3F1005F78 +:101AF0000ED000F07743B3F1405F09D000F07F4093 +:101B0000B0F1805F14BF4FF0FF304FF001607047BD +:101B1000004870470000040800B597B0694605F01A +:101B200067FA18B9049817B05DF804FB0020FAE7CB +:101B30002DE9F04F2DED028B8BB00446AE48884660 +:101B400004AFAE4E7A6002F04DFF14F0020F0FD0DA +:101B500014F0600F4FF0280000F0A78005F06AFC39 +:101B6000C8F50012054608F1006106F057FB356024 +:101B7000630744BFA24B3360250706D5882005F0D4 +:101B800059FC0546FEF7E6FE356020060AD53168A9 +:101B90002820396005F04EFC05464246396807F0BA +:101BA0006FFE356014F0400F964D0FD0C82005F041 +:101BB00041FC4FF40073814600229349CDE9013383 +:101BC000402300930DF072FEC5F80090A10608D5E1 +:101BD0005C2005F02FFC044600228B490BF01AF91B +:101BE0002C6028683168002873D003685B6A9847C6 +:101BF0000546002861D18549854818F0D9F9804605 +:101C0000002863D003460422012107F1080018F0E0 +:101C10008BFA2A462946404618F096FAB868FFF72C +:101C200063FF421C04464AD07948FFF775FF2146FE +:101C30007860714802F0CDFEB0F5804FDFF8B891C2 +:101C400028BF4FF48040064618F00EFD82467B68A0 +:101C50009D4280F0B38043463246012105EB040BE0 +:101C6000504618F061FA2146484602F0B2FEBBFB2E +:101C7000F0F303FB10B060B92146484602F0A9FE1C +:101C800059460246484602F0B3FF42F2107005F092 +:101C900021FD33465A465146484602F013FF4FF4A1 +:101CA0007A70354405F016FDD1E705F0C3FB4FF41B +:101CB000001205464FF0006157E76FF0010420461F +:101CC0001C37BD46BDEC028BBDE8F08F6FF00204FF +:101CD000F5E7002972D06B46084608EE103A0B680B +:101CE0009B689847054600287FD1306803689B6A47 +:101CF0009847102802463068B8BF10220168930048 +:101D0000073323F00703ADEB030DD31704ACCDE984 +:101D100000232B46D1F8149042462146C84720683C +:101D2000FFF7E2FE431C044661D00146324802F050 +:101D300050FEB0F5804FDFF8C0A028BF4FF48040C0 +:101D4000814618F091FC08EE900A7B689D4232D2E1 +:101D50003068002218EE901A0368019205EB080221 +:101D6000CDF80090D3F814B00023D84705EB040B4E +:101D70002146504602F02DFEBBFBF0F303FB10B0F2 +:101D800060B92146504602F024FE594602465046AC +:101D900002F02EFF42F2107005F09CFC4B465A46B2 +:101DA00018EE901A504602F08DFE4FF47A704D44B2 +:101DB00005F090FCC9E718EE103A9D460E48002445 +:101DC00002F038FE134B144800217B61134BC7E926 +:101DD0000344BB6007F10803CDE902017A691048AA +:101DE00000920ECB03F003FB69E76FF0030418EEDB +:101DF000103A9D4663E700BFEC080024B0080024B9 +:101E0000F8080024B4080024C5D001085CC3010808 +:101E10005FC30108E51A0008400D0300C11A00085D +:101E20007008002410B5054C204603F02BFB20461B +:101E3000034A0449BDE8104005F01AB970080024AF +:101E400000000024D50B00080368774A93422DE96F +:101E5000F043BFB04AD1754C4FF4C05201217448D1 +:101E6000D4F8E03043F00103C4F8E030D4F8E030B7 +:101E700003F001030193019B0223CDE9092303230E +:101E8000CDE90B130A2309A90D930EF09DFBBC228B +:101E900000210FA818F068FC4FF480230EA80E93C1 +:101EA0004FF44013309311F075FA0546D8B910F08D +:101EB000EFF9D4F8D83065202A4643F000630521B5 +:101EC000C4F8D830D4F8D83003F000630293029BF2 +:101ED000D4F8003123F00063C4F800310EF066F846 +:101EE00065200EF095F83FB0BDE8F083514A93426B +:101EF000F9D14E4C002502270A26D4F8E0304FF0E5 +:101F0000030809A94A4843F001034FF00809C4F83F +:101F1000E030D4F8E03003F001030393039BD4F8DE +:101F2000E03043F00203C4F8E030D4F8E03003F0CE +:101F300002030493049BD4F8E03043F00403C4F894 +:101F4000E030D4F8E03003F004030593059BD4F8A7 +:101F5000E03043F08003C4F8E030D4F8E03003F020 +:101F600080030693069BD4F8E03043F48073C4F8F2 +:101F7000E030D4F8E0300D9603F480730793079BAC +:101F80002023CDE90B58CDE909370EF01DFB09A937 +:101F900027480D96CDE90B58CDE909970EF014FBB3 +:101FA00043F6234309A924484FF001080B950D96E9 +:101FB000CDE909370EF008FB09A920480B950D96CD +:101FC000CDE909870EF000FB09A91C480B950D9679 +:101FD000CDE909970EF0F8FA042309A917480B95E3 +:101FE0000D96CDE909370EF0EFFAD4F8D8304D2030 +:101FF0002A4643F080634146C4F8D830D4F8D8303C +:1020000003F080630893089BD4F8D83043F0007342 +:10201000C4F8D830D4F8D83003F000730E930E9B78 +:102020000DF0C4FF4D205CE700000840004402585A +:102030000000025800000440000402580008025842 +:1020400000F57171D0F80404FFF709B81C2303FBF5 +:102050000103D0F80404D3F80822FFF72DB81C239D +:1020600003FB0103D0F804049A6CFFF760B8D0F8C2 +:102070000404FFF7EAB813B5C1680446D0F80404B5 +:10208000003918BF01210191FFF7ACF80199D4F88C +:10209000040402B0BDE81040FFF7CBB8D0F8040448 +:1020A000FFF7CAB8D0F80404FFF7DDB8D0F804048D +:1020B000FFF7D7B8D0F80404FFF7D7B8D0F8040476 +:1020C000FFF7D5B838B5114A0623114C0025C4E9ED +:1020D00000230123C4F80404C0F8C042204625634D +:1020E0002561E560E562C4E90635C4E908550FF0ED +:1020F00067FB4FF40071204610F01EF84FF4007299 +:10210000294620460FF0F8FF284638BD000004405D +:102110009022002408B5D0F8C0020FF0DAFB0020AE +:1021200008BD08B5D0F8C0020FF0F2FB002008BDD2 +:1021300010B51446D0F8C0021A4623460FF0F2FE3E +:10214000002010BD08B5D0F8C0020FF067FF0020D6 +:1021500008BD08B5D0F8C0020FF098FF002008BDF8 +:1021600011F0800FD0F8C0324FF01C0217BF01F001 +:102170007F0102FB013102FB013191F83E0008BFF3 +:1021800091F8FE01704708B5D0F8C0020FF0B6FE16 +:10219000002008BD08B5D0F8C0020FF01FFF0020D6 +:1021A00008BD08B5D0F8C0020FF0F4FE002008BD4D +:1021B000122301480B807047DC00002404230148EF +:1021C0000B807047F000002430B5A1F11004002509 +:1021D00000F00F02CD7302390009D3B2092ACCBF37 +:1021E000373330330B748C42F2D130BD10B5044C10 +:1021F0000A4604482146FFF750FA204610BD00BFAA +:10220000982600246EC3010810B5044C0A46044801 +:102210002146FFF742FA204610BD00BF9826002451 +:1022200079C3010810B5044C0A4604482146FFF75B +:1022300034FA204610BD00BF9826002491C301083F +:1022400010B5044C0A4604482146FFF726FA2046FA +:1022500010BD00BF982600249CC3010810B5044699 +:102260000DF026FE2146FFF7AFFF0DF027FE04F12B +:102270001001FFF7A9FF0DF027FE04F12001FFF781 +:10228000A3FF302010BD0000322310B5034C0B809B +:10229000A01CFFF7E3FF204610BD00BFF4000024A0 +:1022A000002050709070D07070477047C368184716 +:1022B0000A4B01220A4810B51A7086B0094B002457 +:1022C0000293094B04940393084B009302AB0ECB8B +:1022D00005F076FD204606B010BD00BFE8080024DA +:1022E0005C0B0024000B00246755000871240008D3 +:1022F00008B5044802F09EFB034807F0EFF8002001 +:1023000008BD00BFEC080024F808002410B50446FE +:102310000168D0E90123054802F0D4FB206818F0D9 +:10232000ABF92046BDE8104018F0A6B9EC0800242F +:10233000B0F1104F1FB5044610D300F1E042002366 +:102340000B48039206F006F8039A0023CDE900013A +:10235000074806F07BFA80B204B010BD014605487C +:1023600002F037FB21460246024802F041FCF2E748 +:10237000F8080024EC080024B0F1104F13B50C4607 +:1023800008D24B1E024490420CD010F8011B03F8F7 +:10239000011FF8E70023CDE9002300F1E0420348E4 +:1023A00006F09DF9204602B010BD00BFF8080024D9 +:1023B000B1F1104FF0B506468BB00D4614461CD354 +:1023C00000230022244801F1E04505F0C3FF00236B +:1023D0008B4208BF844205D2002200231E4805F02C +:1023E000B9FF044600232A4631461B48CDE9004385 +:1023F00006F0C4F980B20BB0F0BD104618F034F905 +:1024000022463146074618F0A1F90C2018F02CF9A5 +:10241000124B002284600593114B0492CDE90230E7 +:1024200002ABC0E900750FCB06AD85E80F001021A7 +:102430000C4803F013F9044660B195E80F0084E8F6 +:102440000F000949204603F0ACFA22460749054827 +:1024500003F0C4F90020CEE7F80800248F24000818 +:102460000D230008000B0024AB220008AD22000859 +:1024700010B40168D0E90132541001EB6200D207B8 +:1024800048BF0A595DF8044B48BFD3581847D0E9F4 +:102490000030184710B5074802F0A4FA064806F0C5 +:1024A000BDFE1823054A30210548BDE8104005F05F +:1024B00046BB00BFEC080024F8080024AAC30108AA +:1024C000B808002470B5012386B0204A6621204C4C +:1024D0000025204E2046CDE903325A235922CDE96A +:1024E00001313D233B210093422306F073FF324626 +:1024F0001949204604F0BCFD184C194B29462561AA +:1025000004F14000236005F0ECFB04F1540005F0F9 +:1025100095FB2B4620464FF480522821009505F06C +:1025200043FC20460F4C32460F4904F0A1FD2A46D9 +:102530004FF4D061204603F001F832460B492046A3 +:1025400006B0BDE8704004F093BD00BF005A6202BF +:10255000F808002400000024712500085C0B00240A +:10256000ECC90108000B0024DD7E00085B55000863 +:1025700038B5074B0546044645F8BC3B06F0AEFFB0 +:10258000284605F097FB201D02F034FD204638BD9B +:1025900068CA010810B50446FFF7EAFF4FF402715C +:1025A000204604F05DFF204610BD00001EF0040F21 +:1025B0000CBFEFF30880EFF30980816911F8021C6A +:1025C000002932D101B590E80F10E047BDE8005076 +:1025D0008CE80300244B93E80600914208BF704743 +:1025E0001A6041B91EF0100F10D1204B186820F06E +:1025F000010018600AE02CE9F00F1EF0100F08BF70 +:102600002CED108A81F822E0C1F838C0906B92F866 +:10261000221061F0FF0E1EF0100F08BFB0EC108A00 +:10262000B0E8F00F80F309887047114A13689942A7 +:10263000FAD801B552F821C00FC8E047BDE80050F4 +:10264000CCF80000704701B501F000FBBDE8014087 +:10265000EFF3098CBEE701B501F0BCFABDE801401B +:10266000EFF3098CB6E700006001002434EF00E0CE +:10267000F0C40108014608B530B96FF0030000F05E +:10268000F0F96FF0030008BD132001F07FFE30B9B0 +:102690004FF0FF3000F0E5F94FF0FF30F3E7002096 +:1026A000F1E7000008B5EFF305832BB9EFF31083D2 +:1026B00013B9EFF3118333B16FF0050000F0D1F9D6 +:1026C0006FF0050008BDDFF808C000DFFAE700BFC3 +:1026D00075260008EFF310832BB9EFF31180003853 +:1026E00018BF0120704701207047000038B505462B +:1026F000A0B1846802686CB114F0030302D1C16810 +:102700000F2926D800246FF00801002000F0AAF954 +:10271000204638BDC368002BF4D11546104BD3F8C2 +:10272000900078B100F01BFC0446A0B10123F32215 +:10273000A3700023656022700A4AC4E90233084B83 +:102740005A66E5E701221021D3F8800000F08EFBE5 +:10275000EAE71546EBE76FF0040100F083F9D7E7ED +:102760004C010024D1270008930710B502F00104A2 +:1027700022D400F10C0384B153E8000F00EA0102F7 +:102780008A4203D0BFF32F8F002005E020EA010228 +:1027900043E8002404B1EFE710BD53E8000F0842FE +:1027A00003D1BFF32F8F002005E020EA010243E8A8 +:1027B000002404B1F1E7EFE7C06801EA00031CB1AF +:1027C000994218BF0020E7E7002B08BF0020E3E78D +:1027D000F8B50546846804B9F8BD94F82320284666 +:1027E000616AA768FFF7C0FF064638B1204601F0CE +:1027F000A6FB00223146204601F020FD3C46EAE7D8 +:10280000F8B50D4617461E46044620B10378F32B53 +:1028100001D1002907DA20466FF0030100F022F908 +:102820006FF00300F8BDFFF79FFF0028FAD186B1D3 +:102830003146432001F0AAFD40B1074B20465E69B6 +:10284000314601F061FB756286F823706FF001007C +:10285000E8E76FF00200E5E74C01002470B505469B +:1028600010B10378F32B07D028466FF0030100F076 +:10287000F9F86FF0030070BD836863B1284601F07A +:1028800055FB00226FF0020101F0D8FCA868002877 +:10289000F4D101F0B9FBAB78002613F001032E70E0 +:1028A0000FD0094B2946D3F8904024B1204600F0C0 +:1028B00070FB3046DFE7D3F8800000F00CFB2046C9 +:1028C000D9E71846D7E700BF4C0100242DE9F041B5 +:1028D000064620B10378F32B01D1002909DA6FF005 +:1028E00003056FF00301304600F0BCF82846BDE850 +:1028F000F08100F10C0353E8002F42EA010543E8A0 +:10290000005000B1F7E7B4681CB9204601F07CFB29 +:10291000ECE794F823203046616AD4F80880FFF78A +:1029200023FF074678B194F823309B0756BF656AAA +:10293000054620EA0505204601F001FB0022394644 +:10294000204601F07BFC4446DEE70000024608B565 +:10295000EFF3058333B100206FF0050100F082F83A +:10296000002008BDFFF7B6FE0028F4D11046DFF8BE +:1029700008C000DFF5E700BFED260008024638B5C5 +:10298000EFF305834BB192B96FF003046FF00301CD +:10299000104600F067F8204638BDFFF79BFE002880 +:1029A000F1D11046DFF82CC000DF0446F3E71378BE +:1029B000F32BE9D10029E7DB02F10C0353E8000F08 +:1029C00040EA010443E8004505B1F7E7104601F08D +:1029D00085F9E0E7CD28000838B504461D46EFF339 +:1029E000058343B18CB920466FF0030100F03AF83B +:1029F0006FF0030038BDFFF76DFE0028F2D12046CE +:102A00002B46DFF824C000DFF4E72378F32BEAD16C +:102A1000002DE8D10029E6DB2046FFF7A5FE0028BF +:102A200008BF6FF00200E5E701280008024608B57C +:102A3000EFF305833BB110466FF0050100F012F88B +:102A40006FF0050008BDFFF745FE0028F3D11046E2 +:102A5000DFF804C000DFF5E75D2800087047704725 +:102A6000704770477047704770477047EFF31083A7 +:102A70002BB9EFF31180003818BF012070470120F7 +:102A800070470000064BDA6A3AB1D0695B6C1BB143 +:102A90001B69984228BF184670474FF0FF30F5E792 +:102AA0004C010024014BD868704700BF4C01002442 +:102AB00070B5464C237A012B00F0858033B14FF07E +:102AC000FF30FFF7CBFF4FF0FF3070BD404DEB689C +:102AD000E3652B8AD5E90B61A4F85430AB68304626 +:102AE000236400F0ABF908B1C4F88060D5E9056152 +:102AF000304600F0A3F908B9D4F880606667D5E9DC +:102B00000761304600F09AF908B9D4F88060A667EA +:102B1000D5E90961304600F091F908B9D4F8806030 +:102B2000E6676E6B3EB131683046D6E9022300F0AD +:102B3000F5F9C4F88460AE6B3EB131683046D6E931 +:102B4000022300F0EBF9C4F88860EE6B3EB1316807 +:102B50003046D6E9022300F0E1F9C4F88C602E6C0F +:102B60003EB131683046D6E9022300F0D7F9C4F807 +:102B700090606E6C3EB131683046D6E9022300F0B9 +:102B8000CDF9C4F89460AE6C3EB131683046D6E9F8 +:102B9000022300F0C3F9C4F89860EE6C3EB13168CE +:102BA0003046D6E9022300F0B9F9C4F89C602D6DD7 +:102BB0003DB129682846D5E9022300F0AFF9C4F8F1 +:102BC000A0500123237200207FE700BF4C010024A6 +:102BD00080C4010870B5254D2B7A012B07D06FF00A +:102BE00006004FF0FF34FFF739FF204670BD01F0BB +:102BF00001FC10B94FF0FF30F3E71D4AFF231D4ED3 +:102C000082F8223092F82230D26863F0FF031A492A +:102C1000C2F302227068DB4314BFB3FA83F32023AC +:102C2000C3F12003934298BF531CFE2202FA03F320 +:102C30000F4ADBB2D37701F0FBFD04460028D9D15F +:102C400001F038FE286101F021FE0C4801F06EF918 +:102C500001F0D2F93368DB074CBF0223032383F36F +:102C60001488BFF36F8F02232B72BEE74C01002440 +:102C700000ED00E080C40108572600086801002428 +:102C800010B50F4C237A022B13D101F007FE01235C +:102C90006372BFF34F8F0B4A5168C90003D54FF0E1 +:102CA00000615160A37204232372BDE81040FFF756 +:102CB000E9BE6FF00700FFF7D1FE002010BD00BF96 +:102CC0004C01002400ED00E038B51E4C0546237A87 +:102CD000042B35D1FFF7D6FEE26AA842034694BF23 +:102CE00000F1FF332B4612B1D069C01AD061626C7B +:102CF00012B11069C01A1061E06803440544E36032 +:102D0000E368AB4213D102230020237201F07CF967 +:102D100000236372BFF34F8FA27A22B1A3724FF0E8 +:102D20008052094B5A60BDE8384001F0AFBD013315 +:102D3000E36001F027F9236D002BE1D09847DFE72E +:102D400038BD00BF4C01002400ED00E0704738B5ED +:102D500004460D46FFF783FE29462046BDE838406D +:102D600001F00ABD08B5FFF7F1FFEFF3058333B1BA +:102D70006FF00500FFF772FE6FF0050008BDFFF76A +:102D800075FE0028F4D1DFF808C000DFF6E700BFC9 +:102D9000B12A000808B5EFF3058333B16FF00500E1 +:102DA000FFF75CFE6FF0050008BDFFF75FFE00282F +:102DB000F4D1DFF808C000DFF6E700BFD52B00082C +:102DC00008B5EFF305832BB16FF00500FFF746FE62 +:102DD000002008BDFFF74AFE0028F5D1DFF804C047 +:102DE00000DFF6E7812C0008024608B5EFF3058303 +:102DF0002BB16FF00500BDE80840FFF72FBEFFF7CD +:102E000035FE0028F5D11046DFF804C000DF08BD0C +:102E1000C92C000808B5EFF3058313B1054BD8683A +:102E200008BDFFF723FE0028F8D1DFF80CC000DF53 +:102E3000F6E700BF4C010024A52A000810B598B1A0 +:102E400040EA010313F007030ED117290AD90160E4 +:102E5000083910220C18426084600B5081684A6067 +:102E6000C3600123184610BD0023FBE7F0B580B313 +:102E700099B132F003032CD10F3100F1080521F094 +:102E800007072B462D685C68E91A24F00304091B28 +:102E90008F4204D929680029F3D10846F0BD46685D +:102EA0003A4304683E444660204450F8041C083805 +:102EB0008E4288BF4660586818B903F108015A600D +:102EC000EBE720F0030019181D504A601960083123 +:102ED000E3E70021E1E730B590B1D9B1A1F10805F0 +:102EE00000F108040022AC420BD151F8043C23F05D +:102EF000030443681B1B436042B941F8042C0120C2 +:102F000030BD236822463BB11C46ECE751F8083C33 +:102F10001360F4E70846F3E71846F1E730B5C0B1AF +:102F200089B1C2B1CBB100240160C3604361C0E983 +:102F3000014202FB01F41D1905611846013904D153 +:102F4000A21A99500121084630BD8518056028460F +:102F5000F4E70146F7E71146F5E71946F3E70346BC +:102F600010B5A8B100F1140252E8000F10B9BFF378 +:102F70002F8F04E0016842E8001404B1F4E738B18F +:102F8000043353E8002F511C43E8001404B1F8E760 +:102F900010BD30B5F0B1C3688B421BD803698B42BA +:102FA00018D900F114031A680A60BFF35F8F53E861 +:102FB000002F0C689442F6D143E8001505B1F2E702 +:102FC000043050E8003F5A1E40E8002101B1F8E704 +:102FD000002030BD6FF00300FBE7EFF310832BB947 +:102FE000EFF31180003818BF0120704701207047AF +:102FF000036B30B5E3B1CD780024DA78AA420FD361 +:103000001A46C1E901248AB19160A4B161602830F7 +:1030100050E8003F5A1C40E8002101B1F8E730BDFC +:103020005A681C46002AECD01346E6E7C162ECE77A +:10303000C1E90133C1620163E9E7D1E9013223B19A +:103040009A608A681AB153607047C262F9E70363F5 +:103050007047F8B5877804468FB3C56800270146E6 +:1030600005F10C062846FFF7E8FF27703046FFF70A +:1030700090FFAB68002B48D03046FFF770FF044646 +:10308000002842D0284600F051FF06463A4639460D +:1030900001F0D4F8304600F0A5FF6A6A0646816860 +:1030A00004F10C0017F052FBF923A7702370F368AA +:1030B000E37021462846BDE8F840FFF799BF8568D0 +:1030C000AB68002BF5D05B78832BF2D1284600F05B +:1030D0002DFF06463A46394601F0B0F8304600F07A +:1030E00081FF06466A6A04F10C01806817F02EFB26 +:1030F000F3680BB1E2781A700023214605F10C0049 +:103100002370BDE8F840FFF744BFF8BD2DE9F0415A +:103110000C4617469846054618B10378FA2B00D19D +:1031200041B928466FF00301FFF79FFC6FF00300E1 +:10313000BDE8F0818368C3B15B78832B15D100F0C3 +:10314000F5FE06460122002101F078F8304600F035 +:1031500049FF06466A6A2146806817F0F7FAF06868 +:103160000028E5D007700020E2E705F10C00FFF72A +:10317000F6FE064670B121466A6A0C30002417F04C +:10318000E5FAF923314628463370B470F770FFF73B +:103190002FFFE8E7B8F1000F10D04146932001F06F +:1031A000F5F840B1074B2846596900F0ADFEEFF342 +:1031B0000983C3E902476FF00100B9E76FF002002D +:1031C000B6E700BF4C0100242DE9F84F88460746BA +:1031D00038B131B1B0FA80F3B1FA81F10B441F2B51 +:1031E00006DC6FF0030100200024FFF73EFC70E0D6 +:1031F00008F1030626F003060C3606FB00F9F2B1CF +:1032000094683CB1A30702D1D368332B05D86FF083 +:103210000801E8E7D368002BF9D1D2F800A0D2E981 +:1032200004533DB115F0030B01D1994554D96FF00A +:103230000901D8E7002BFAD11CB19B460CE092465D +:103240001546274BD3F8A000D8B1FFF788FE0446F7 +:10325000A0B14FF0010B35BB214B00224946D86F7E +:10326000FFF704FE0546C0B9BBF1000F06D01C4BAA +:103270002146D3F8A00058B1FFF78BFE6FF0040190 +:10328000B1E701223421D3F88000FFF7EFFDDEE73C +:10329000D3F88000FFF71FFEF0E74BF0020B4A4621 +:1032A000002117F061FAFA233246394604F10C0086 +:1032B0002370002384F802B0A360C4F804A0C4E91A +:1032C0000983C4E90B332B46FFF728FE044B054A5C +:1032D0001A672046BDE8F88F002CE4D1B1E700BFA3 +:1032E0004C0100245330000800F1280310B553E8C6 +:1032F000002F12B9BFF32F8F04E0511E43E80014D2 +:1033000004B1F4E70AB9002010BDC06A0123002807 +:10331000F9D0821CD2E84F1FC2E8443F04B1F9E75C +:1033200011F0FF0FF0D08068F1E700002DE9F041C7 +:103330000F4615469846044618B10378FA2B00D17B +:1033400041B920466FF00301FFF78FFB6FF00300D8 +:10335000BDE8F081FFF7C8FF064600283AD00146D5 +:103360002046FFF76AFE626A06F10C01384617F044 +:10337000EDF90DB1F3782B70002504F10C073146FF +:1033800038463570FFF705FEA3680BB90020DFE76C +:103390003846FFF7E4FD06460028F7D0204600F047 +:1033A000C5FD07462946012200F048FF384600F0D7 +:1033B00019FE626A0746816806F10C0017F0C6F92B +:1033C000F923B570314633702046FB68F370FFF780 +:1033D0000FFEDBE7B8F1000F10D04146832000F06C +:1033E000D5FF40B1074B2046596900F08DFDEFF342 +:1033F0000983C3E902756FF00100A9E76FF00200CD +:10340000A6E700BF4C01002408B5064B08219A6EC0 +:10341000D86EFFF7D9FE044BD864B0FA80F04009AB +:10342000404208BD80C401084C0100242DE9F04150 +:1034300006460F4690461C46EFF305834BB196B9FE +:1034400030466FF00301FFF710FB6FF00300BDE89B +:10345000F081FFF7C2FD0028F1D130462346DFF8A6 +:1034600048C000DFF3E73378FA2BE9D1002FE7D02B +:10347000002CE5D106F10C00FFF771FD054680B187 +:10348000726A39460C3017F061F9F9232846AC709E +:103490002B7085F80380C5E9017600F01FFC2046FB +:1034A000D5E76FF00200D2E70D310008F8B5044609 +:1034B0000F4616461D46EFF3058343B18CB92046EF +:1034C0006FF00301FFF7D1FA6FF00300F8BDFFF7CB +:1034D00084FD0028F2D120462B46DFF844C000DFEF +:1034E000F4E72378FA2BEAD1002FE8D0002DE6D1BB +:1034F0002046FFF7F9FE054670B100F10C01626A43 +:10350000384617F023F90EB1EB7833702846EC609B +:1035100000F0E4FB0020D9E76FF00200D6E700BF1F +:103520002D330008EFF310832BB9EFF3118000382F +:1035300018BF0120704701207047000070B5A8B384 +:103540008468D0E900566CB114F0030302D1C2685C +:103550001B2A1AD800246FF008010020FFF783FA15 +:10356000204670BDC368002BF4D1124BD3F89400F1 +:1035700030B901221C21D3F88000FFF777FC01E06D +:10358000FFF7EDFC044660B10123F522A370002390 +:10359000E670227065602376C4E90233C4E904331F +:1035A000DEE76FF00401FFF75EFAD9E7054606464D +:1035B000DBE700BF4C010024284B70B55D69044671 +:1035C0000E4635B96FF00701FFF74DFA4FF0FF30A7 +:1035D00070BD10B10378F52B07D020466FF00301C2 +:1035E000FFF741FA6FF00300F2E7037E53B9C0E939 +:1035F0000353EB6A436103B118610123EC620020BD +:103600002376E5E7C278D1070DD5C168A9420AD172 +:10361000FF2B06D16FF00F01FFF725FA6FF00200C4 +:10362000D6E70133EBE7002EF8D093070AD5E06820 +:1036300095F9203090F920209A4203DA80F8203062 +:1036400000F086FC3146532000F0A0FE18B1294658 +:10365000204600F059FC6FF00100B9E74C0100244E +:103660002E4B5A6970B5044632B96FF00701FFF767 +:10367000FAF94FF0FF3070BD10B10378F52B07D089 +:1036800020466FF00301FFF7EEF96FF00300F2E759 +:10369000037E33B96FF00E01FFF7E5F96FF002001A +:1036A000E9E7C168914202D06FF00D01F4E7013BF8 +:1036B000DBB2037613BB43690BB101691961216960 +:1036C000F1B14B6192F92130D56ADDB982F8203031 +:1036D000A36883B1204600F029FC06462A46294605 +:1036E00000F0ACFDF36AC4E90365636103B11C61DA +:1036F0000123F4622376002000F086FC0020BAE764 +:10370000D362DFE7E978890706D5A96821B191F985 +:1037100020108B42B8BF0B466D69D6E74C010024E0 +:1037200070B5044610B10378F52B07D020466FF032 +:103730000301FFF798F96FF0030070BD037EBBB182 +:103740006369C0680BB122691A61226902B35361CF +:1037500090F92120C36AEBB990F92030934203D04D +:1037600080F8202000F0F4FBA068F8B900F04CFCD1 +:10377000A078002610F001002670DED0134B214601 +:10378000D3F89450DDB12846FFF703FC3046D4E768 +:10379000C362DDE7D978890706D5996821B191F927 +:1037A00020108A42B8BF0A465B69D4E7204600F081 +:1037B000BDFB00226FF0020100F040FDD4E7D3F81A +:1037C0008000FFF788FB2846B7E700BF4C010024C4 +:1037D0002DE9F0410446002601270CB9BDE8F0812F +:1037E000E378D4F814801B0712D5A36826767BB142 +:1037F000204600F09BFB00220546114600F01EFD0E +:10380000EB6AC4E90356636103B11C61EC6227767D +:103810004446E2E710B4C3789B071DD5C06890F911 +:103820002120C36ADC78A40709D59C688C4208BFB4 +:103830008C6824B194F92040A242B8BF22465B694B +:10384000002BEFD190F92030934205D080F8202052 +:103850005DF8044B00F07CBB5DF8044B7047000042 +:10386000024608B5EFF3058333B100206FF0050180 +:10387000FFF7F9F8002008BDFFF754FE0028F4D147 +:103880001046DFF808C000DFF5E700BF3D3500084F +:10389000024608B5EFF305833BB110466FF0050112 +:1038A000FFF7E1F86FF0050008BDFFF73BFE0028C9 +:1038B000F3D11046DFF804C000DFF5E7B9350008A2 +:1038C000024608B5EFF305833BB110466FF00501E2 +:1038D000FFF7C9F86FF0050008BDFFF723FE0028C9 +:1038E000F3D11046DFF804C000DFF5E761360008C9 +:1038F000024608B5EFF305833BB110466FF00501B2 +:10390000FFF7B1F86FF0050008BDFFF70BFE0028C8 +:10391000F3D11046DFF804C000DFF5E721370008D7 +:10392000EFF310832BB9EFF31180003818BF01209B +:103930007047012070470C30D0E85F3F13B9BFF3E8 +:103940002F8F04E05A1EC0E8512F01B1F4E798B25E +:10395000003818BF0120704730B500F10C02C18952 +:10396000D2E85F3F994202D8BFF32F8F04E05C1C7E +:10397000C2E8554F05B1F3E7C0899BB2984294BFA6 +:103980000020012030BD0000F8B515464FF6FE734B +:10399000421E06460F469A4201D8884207D26FF06F +:1039A000030100240020FFF75FF82046F8BD7DB139 +:1039B000AC682A6844B114F0030302D1E9680F2906 +:1039C00022D86FF00801ECE7EB68002BF9D115461F +:1039D000114BD3F8980080B1FFF7C1FA0446A8B1A3 +:1039E0000123F622A370002365602270A3600B4AB6 +:1039F000094BA781E6819A66D7E701221021D3F807 +:103A00008000FFF733FAE9E71546EAE76FF00401B3 +:103A1000FFF72AF8C9E700BF4C010024213A00084B +:103A2000836810B504465BB1FFF785FF40B12046BF +:103A300000F07CFA0022BDE81040114600F0FEBB09 +:103A400010BD38B5054610B10378F62B07D02846CF +:103A50006FF00301FFF708F86FF0030038BD8468CA +:103A60003CB100F063FA0122002100F0E7FB0020E6 +:103A7000F4E7FFF771FF38B928466FF01001FEF741 +:103A8000F3FF6FF00200E9E72046E7E770B505466F +:103A900010B10378F62B07D028466FF00301FEF72C +:103AA000E3FF6FF0030070BD836863B1284600F048 +:103AB0003DFA00226FF0020100F0C0FBA868002868 +:103AC000F4D100F0A1FAAB78002613F001032E70B8 +:103AD0000FD0094B2946D3F8984024B12046FFF770 +:103AE00058FA3046DFE7D3F88000FFF7F4F92046B4 +:103AF000D9E71846D7E700BF4C01002410B50446AB +:103B0000EFF3058333B100206FF00501FEF7ACFF42 +:103B1000002010BDFFF704FF0028F4D12046DFF895 +:103B200008C000DFF5E700BF8939000810B504467A +:103B3000EFF3058343B184B920466FF00301FEF72C +:103B400093FF6FF0030010BDFFF7EAFE0028F2D1EB +:103B50002046DFF830C000DFF5E72378F62BEBD105 +:103B60002046FFF7F9FE20B1204600F0B7F800200C +:103B7000E9E720466FF01001FEF776FF6FF00200D4 +:103B8000E1E700BF433A0008024608B5EFF30583BA +:103B90003BB110466FF00501FEF766FF6FF00500C0 +:103BA00008BDFFF7BDFE0028F3D11046DFF804C0C2 +:103BB00000DFF5E78D3A000810B5D0E85F3F5A1CEA +:103BC000914200D80022C0E8542F04B1F5E798B222 +:103BD00010BD000038B51C4C00F066FEE3680133F0 +:103BE000E36000F0CFF9002000F00EFA236D03B17E +:103BF0009847226C32B3A369E16B994203D0D9692B +:103C0000E36301B9DA61DA69C2B9237A022B19D107 +:103C1000656ABDB1E36B95F9202093F920309A4293 +:103C200010D1284600F08BF9E06B00F0A3F928468C +:103C300000F0E2F9236CE563EB6103E0013ADA613D +:103C4000002AE2D038BD00BF4C01002470B5224CE0 +:103C500004F1560504F15A06B4F85410D5E85F3F54 +:103C600013B9BFF32F8F04E05A1EC5E8502F00B1DF +:103C7000F4E79BB25BB33046FFF79EFFE36D53F86A +:103C8000200020B30378F13B082BE5D801A252F8BD +:103C900023F000BFB93C0008593C0008BF3C0008B5 +:103CA000593C0008593C0008C33C0008C73C0008C8 +:103CB000593C0008CB3C0008236E9847CCE7636E64 +:103CC000FBE7A36EF9E7E36EF7E7236FF5E7002064 +:103CD000BDE8704000F098B94C01002470B5164C56 +:103CE0000546B4F8541004F15602D2E85F3F9942F9 +:103CF00002D8BFF32F8F04E0581CC2E8560F06B15C +:103D0000F3E79BB2994205D829460220BDE87040EE +:103D1000FFF71DB804F15800FFF74EFFE36D43F8BD +:103D20002050637A23B9054B4FF080525A6070BD22 +:103D30000123A372FBE700BF4C01002400ED00E06B +:103D4000EFF310832BB9EFF31180003818BF012077 +:103D50007047012070470378F12B00D07047C0688E +:103D6000F9E7000010B5C469621CD0E904310CD138 +:103D700003B1596142691AB113610023436101E043 +:103D8000074A13630023C36110BD1BB1DA6959618F +:103D90002244DA614269002AEED1014AD362F1E796 +:103DA0004C01002401230A4A90F9201043701C3270 +:103DB000936810B51BB193F920408C4205DCC0E933 +:103DC0000232906003B1D86010BD1A469B68F1E7DB +:103DD0004C010024014B5869704700BF4C0100247E +:103DE00008B500F0FBFCDFF810C000DF4FF0FF313A +:103DF0000020FEF735FEFEE7A5420008930710B548 +:103E000002F0010422D400F1280384B153E8000F2A +:103E100000EA01028A4203D0BFF32F8F002005E0A1 +:103E200020EA010243E8002404B1EFE710BD53E8A3 +:103E3000000F084203D1BFF32F8F002005E020EAD6 +:103E4000010243E8002404B1F1E7EFE7806A01EAE8 +:103E500000031CB1994218BF0020E7E7002B08BF00 +:103E60000020E3E7084A0021136B10B53BB94FF07F +:103E7000FF34C0E90431C46121B1086110BD1946A5 +:103E80001B69F3E71063F9E74C010024002310B528 +:103E90000380044683789A0708D513F0100F016B4E +:103EA0000E4B0FD0D3F88400FFF773F8A378DB072D +:103EB00012D50A4B2146D3F8880038B1BDE810402E +:103EC000FFF767B8586FFFF706F8EFE7D3F8800001 +:103ED000BDE81040FEF7FFBF10BD00BF4C0100243D +:103EE000C2780346D20701D4FFF7D0BF0422427044 +:103EF0000022C260034A516B816001B1C860536304 +:103F0000704700BF4C01002491F92020836810B550 +:103F10001BB193F92040944205DAC1E90230816077 +:103F200003B1D96010BD18469B68F1E783689A68B1 +:103F3000826002B1D06000221846DA607047C26821 +:103F40002AB18368936003B1DA600023C3607047CD +:103F500010B50146044664B12378F12B07D008461A +:103F6000FFF7EDFF2046BDE81040FFF7CDBFE46846 +:103F7000F1E710BD0123014643700148FFF7C4BFBC +:103F80006801002438B5164DEC6A44B3E369013B7F +:103F9000E36123BB6378732B06D009D8532B0BD076 +:103FA00003F0DF03432B0DD12046FFF7D4FE09E0D9 +:103FB00003F0EF03832BF6E72046FFF7CCFE214604 +:103FC000FFF728FC2046FFF7BAFFFFF7D3FF24696D +:103FD00024B1E369002BDDD000236361EC6238BDBE +:103FE0004C01002490F82230826B13F0100F0CBFAC +:103FF000602020201044704702234370014B9861D9 +:10400000704700BF4C01002470B5124D04462E7A53 +:10401000696990B9022E0FD16C6A6CB194F92020B5 +:1040200091F920309A4207DD2046FFF788FF0846C5 +:10403000FFF7B8FE6670AC6170BD022E05D190F935 +:10404000202091F920309A42F1DC2046BDE87040F2 +:10405000FFF790BF4C0100242DE9F04F85B0814659 +:10406000029128B96FF003010024FEF7F9FCBCE0CF +:10407000002A45D0966846B1B40702D1D368432BD5 +:1040800006D86FF008010020EEE7D368002BF8D1C6 +:104090009769D2E904453CB1600702D1002D40F098 +:1040A000B2806FF00A01EEE72FB17B1E372B03D9E8 +:1040B0006FF00B01E7E71827002D40F0A880D2E948 +:1040C00000A301934EBB574BD3F88800F0B1FEF725 +:1040D00046FF064600283AD04FF00108002C44D194 +:1040E000DFF840B1E5B9504ADBF88400556DB8B14E +:1040F000FEF735FF0246E0B148F01008344623E0F1 +:1041000092461446182715460192DCE70122442105 +:10411000D3F88000FEF7AAFEDBE74FF00008DDE7EA +:1041200022462946DBF87400FEF7A0FE024600286E +:10413000E4D1B8F1000F16D0DBF8882052B1104658 +:104140003146FEF726FF002248F002087CB96FF0E6 +:10415000040198E73146DBF880000392FEF7BBFECE +:10416000039A1446F0E74246EEE72246344640F210 +:10417000F1137FB2FD2184F802802380019BC4F8F3 +:1041800004A0E370002384F8207084F82170618417 +:104190006563C4E90233C4E90433C4E90633C4E9FE +:1041A0000933C4E90B32A5F140031344C4E90E39C5 +:1041B0001E4B13601C4B1B685B071AD4A36B0020BB +:1041C0001A4603F1340143F8040B9942FBD1184B12 +:1041D0002046C2E90D394FF08073D363029B13620E +:1041E000104B144A1A66FFF70FFF204605B0BDE8D2 +:1041F000F08FAD084FF0CC33113D002DDED0013DE6 +:1042000042F8043FF9E7002F7FF44FAF1827690702 +:104210007FF447AFA5F14801074B99427FF64FAFB6 +:104220003FE700BF4C01002480C40108A52E5AE2DC +:10423000E13D000861420008B7FFFF7F38B5044642 +:104240001546FFF7CFFE01602046FFF78BFD1DB13D +:10425000BDE83840FFF7D8BEBDE83840FFF78ABE5A +:1042600010B543780446332B0CD1416A90F82320D3 +:10427000FFF7C4FD014628B120460022BDE81040EA +:10428000FFF7DCBF10BD10B50446806918B10022ED +:104290001146FFF7D3FF6378232B02BFA3680022E8 +:1042A0009A6110BD70B50F4C267A022E18D1636A40 +:1042B000B3B16569E86AFFF78BFA2846FFF7E3FFB9 +:1042C00004F11C00FFF732FE4670A061EFF3098392 +:1042D000AB63002328466361BDE87040FFF700BE72 +:1042E00070BD00BF4C01002410B5044610B1037826 +:1042F000F12B07D020466FF00301FEF7B1FB6FF002 +:10430000030010BD437803F00F03022B1ED0032BD4 +:104310002BD0012B2ED1FFF712FEE06AFFF758FADF +:104320002046FFF7B0FF6178022926D11548FFF734 +:10433000FDFD154B41709861EFF30982A2630022E5 +:104340005A612046FFF7CCFD0020DAE70E4B1A7ABF +:10435000022A02D15B6A002BDFD16FF002012046F6 +:10436000FEF77EFB6FF00200CBE7FFF7E8FDFFF7FB +:10437000F9FCD2E76FF00201F2E70020FFF744FEFC +:10438000DFE700BF680100244C01002438B5174C5A +:104390000246237A022B27D1606A60B160694B1C08 +:1043A000427009D1FFF75EFD1148FFF7BFFD022300 +:1043B0004370A061012038BDE36A002213B1DD69BA +:1043C000A9420BD2C161C0E904325AB11061002B7D +:1043D000EAD0DA695861511AD961E5E71A46491BF2 +:1043E0001B69EBE7E062F2E70020E4E74C01002400 +:1043F0006801002438B50D4C00210D48A26DFFF76F +:104400002BFE0C4D636EA8625BB1984758B9E26D04 +:10441000E96C206EFFF720FEA864003818BF012069 +:1044200038BD0120FCE70020FAE700BF80C4010886 +:10443000714700084C01002410B50446EFF30583D2 +:1044400033B100206FF00501FEF70AFB002010BD1C +:10445000FFF776FC0028F4D12046DFF808C000DF23 +:10446000F5E700BF5940000808B5EFF3058313B125 +:10447000054B586908BDFFF763FC0028F8D1DFF849 +:104480000CC000DFF6E700BF4C010024D53D00085A +:1044900010B5044600F0AEF9EFF305833BB12046BA +:1044A0006FF00501FEF7DCFA6FF0050010BDFFF7B5 +:1044B00047FC0028F3D12046DFF804C000DFF5E711 +:1044C000E94200080C4A30B5536C002413B11D6951 +:1044D0008D420AD90161C0E902431BB11D69986090 +:1044E000691A19612CB1E06030BD1C46491BDB68BC +:1044F000ECE75064F8E700BF4C0100242DE9F041DF +:10450000184D6C6C54B3236901276E69013B23611C +:10451000236913BBE3680BB1A2689A606B64002344 +:1045200004F11801E86C1A46FEF780FF58B12146E5 +:104530000320D5E905836B61FEF709FC6B6913B9AC +:10454000B04508BF0026E378012B09D161692046F8 +:10455000FFF7B8FF6C6C002CDAD16E61BDE8F0811A +:104560006770F7E74C01002408B5FEF74DFF18B956 +:10457000034B044A1A6508BD4FF0FF30FBE700BF4C +:104580004C010024FD440008044607B54FF0FF33FA +:10459000002269462046FEF789FF0028F6D1DDE9B2 +:1045A00000309847F2E7000008B5094A094B1A6045 +:1045B000094B9B1A094A1360094A0A4B1A600A4BB5 +:1045C0009B1A0A4A136000F05FF800F091F800BFF0 +:1045D00000FC0724CC13002400000824C813002486 +:1045E000483F0024CC16002400FC0724C8160024F1 +:1045F00038B50E480B250E4B1C24456003600D4B4F +:10460000C4608360FFF72CF90B4B18600B480C4B10 +:10461000C460C0E900350B4B8360FFF721F90A4BFA +:104620001860BDE8384015F089BE00BF981300241B +:1046300054C50108AC130024A813002468130024F7 +:1046400061C501087C13002478130024FDF7A4B889 +:10465000024B4FF0FF311868FFF71AB9A813002476 +:10466000014B1868FFF72CB9A8130024024B4FF038 +:10467000FF311868FFF70CB978130024014B186854 +:10468000FFF71EB97813002408B501F0D3FC0C4BDA +:104690000C4998684FF00053C21802F1604212684A +:1046A00043F8042B8B42F7D1054B4FF000529A6030 +:1046B00014F0B6F815F006FABDE8084000F015B899 +:1046C00000ED00E0980200207047704708B500F048 +:1046D0003DF8FFF7F9FFFFF78BFFFFF7F6FF02F05A +:1046E00011FABDE80840FFF7B1BFFEF73BBB000081 +:1046F000104C114B23614FF4805363614423E360FA +:104700000E4BA3601823A3610D4B07B52246002171 +:104710000C482360FFF790FE034628B9224600901C +:104720001946094802F0F6F9FEF734FB00231A4651 +:104730000093F5E7A0370024A0270024D01300241D +:104740007BC50108CD4600081D0101801FB5064B41 +:104750006C460FCB84E80F002046FFF781F8034B2F +:10476000186004B010BD00BF80C501089827002460 +:1047700008B500F0A3F80000002307B5421E00931F +:104780000023042A19D8DFE802F003080C101400F3 +:10479000012219460B4802F0BDF9022219460A48C7 +:1047A000F9E7032219460948F5E7042219460848A3 +:1047B000F1E7052219460748EDE702461946064883 +:1047C000E9E700BF2501028026010280270102805F +:1047D000280102802A0102800001028010B5FFF743 +:1047E00043FE034B1B6813B1BDE81040184710BDD2 +:1047F00014140024024B1B6803B11847704700BF14 +:1048000014140024024B987A003818BF0120704716 +:104810004C01002408B5FEF7D3FA0022034902F048 +:1048200009FBBDE80840FEF7DFBA00BF05480008F5 +:1048300010B50C4601F08CFD0028124A1ADB00F17D +:104840006043F02103F5614383F80013936800F19E +:10485000100243F82240BFF34F8F002808DB0123EA +:10486000420900F01F0003FA00F0074B43F8220052 +:10487000002010BD00F00F03F021043B1344197613 +:10488000E4E700BF00ED00E000E100E008B502F061 +:1048900059FABDE8084001F05EBE0000014B1868FF +:1048A00001F08EBE10160024014B186801F04ABEBC +:1048B0001016002408B501F04BFD08BD024C08B5E8 +:1048C00023689847FCE700BFF001002403680BB1A0 +:1048D0000846184770470000044B0022C3E9012234 +:1048E0001A611A60024ADA60704700BF1814002487 +:1048F000CD48000810B50022034600F1110403F86A +:10490000012B03F8012B9C42FBD1418210BD00001A +:1049100042F60211024808B5FFF7ECFF08BD00BFE0 +:104920002C140024034B186818B14FF0FF31FEF728 +:10493000AFBF70479827002438B5054604686CB9A6 +:10494000FFF7F0FF2C6824B92C1D204603F076F900 +:104950002C60034B186808B1FEF7B2FF204638BD43 +:10496000982700240368012200211B691847036867 +:1049700000221B69114618476FF01500704707B5F4 +:10498000019002F015F80121019812F0D9FF03B04F +:104990005DF804EB02F016B807B5019002F008F8D4 +:1049A0000021019812F0CCFF03B05DF804EB02F097 +:1049B00009B807B5CDE9001001F0FAFFDDE90010F4 +:1049C00012F0BAFF03B05DF804EB01F0FBBF12F088 +:1049D00009BE12F0E7BD12F007BE12F009BE12F0D8 +:1049E00019BE000070B504461148FFF7A5FF03F09B +:1049F0002DF902F05FF902F081F9204612F0B2FCC5 +:104A0000061E054618BF0126764202F089F902F01B +:104A100063F92DB9204612F0E5FD02F01DFD60603E +:104A20000348FFF789FF03F02DF9304670BD00BF42 +:104A30004014002438B505460F48FFF77DFF03F00A +:104A400005F902F037F902F059F9284612F0A0FCF6 +:104A5000041E18BF012402F063F902F03DF96868F2 +:104A6000644208B102F0FEFC0348FFF765FF03F063 +:104A700009F9204638BD00BF4014002473B5104E1C +:104A80000D4604463046CDE90032FFF755FF03F0EE +:104A9000DDF802F00FF902F031F9009B2A46019986 +:104AA000204600F0D9FF044602F03AF902F014F96A +:104AB0003046FFF741FF03F0E5F8204602B070BD35 +:104AC000401400242DE9F04F0746154699468846C4 +:104AD0002DED028B83B012F085FD0646384612F0AC +:104AE00087FD8246384612F07FFD8346384612F035 +:104AF00091FD08EE100AB5FBF6F306FB1354002CEB +:104B000071D1B8F1000F6ED009EB05030AEB0B0071 +:104B1000834268D83548FFF70FFF03F097F8234624 +:104B2000B9F1000F52D0002B4ED12946384612F071 +:104B300039FDB5FBF0F400FB1454041B4C4528BFB1 +:104B40004C4618F0030F01D1A6422BD9B44241467E +:104B5000786828BF3446224615F0F8FDA64206D9EB +:104B60007868321B18EE101A204415F0FDFDD7F8B6 +:104B700004B0B2461023019302F09CF802F0BEF894 +:104B800053465A462946384612F096FC88B102F040 +:104B9000C7F802F0A1F8019B013B0193ECD14FF063 +:104BA000FF330CE0B4FBF6F406FB04FAC3465446AC +:104BB000E0E7019002F0B4F802F08EF8019BA9EB57 +:104BC00004092544A044ABE74FF0FF3307480193A5 +:104BD000FFF7B2FE03F056F8019B184603B0BDEC98 +:104BE000028BBDE8F08F4FF0FF33F6E7401400244E +:104BF0002DE9F04107460D46164612F0F9FC044631 +:104C0000384612F0F1FC2044AC19A04204D24FF017 +:104C1000FF342046BDE8F0811DD81E480024FFF770 +:104C20008BFE03F013F876B35CBB4FF0100802F074 +:104C300041F802F063F82946384612F0ABFB04460F +:104C4000A0B102F06DF802F047F8B8F10108EED11A +:104C50004FF0FF340EE02146384612F0A3FCB4FBBF +:104C6000F0F101FB10400028D1D1D6E702F058F84E +:104C700002F032F82946384612F094FC361A054400 +:104C8000D1E74FF0FF340348FFF756FE02F0FAFF7A +:104C9000BFE700BF40140024094B30B51A46094C49 +:104CA000D3F89450A542FBD1036829B181680B6009 +:104CB0004FF44073536130BDC1681B04F7E700BF78 +:104CC00000640258000300804168034630B471B1AB +:104CD000D0E9032000F0010402B944B1451001EB12 +:104CE00060000CB149598A58996830BC104730BCF3 +:104CF00070470000044B10B504460360806A08B199 +:104D000001F004FA204610BD98C5010810B504460C +:104D1000FFF7F0FF4FF48271204602F0A1FB20461E +:104D200010BD000070B50A4E0546306818B14FF04E +:104D3000FF31FEF7ADFD2C6824B92C1D204602F092 +:104D40007DFF2C60306808B1FEF7BAFD204670BDCB +:104D50009827002408B50346D0F8D80018B903F105 +:104D6000D800FFF7DFFFBDE8084002F08BBF08B5B1 +:104D70000346D0F8D80018B903F1D800FFF7D2FFE6 +:104D8000BDE8084002F062BF7FB506461D460446F6 +:104D900056F8303BCDE902211B6898479DF820303A +:104DA000304683F00103DDE9022100932B4613F026 +:104DB0009FFA2368064620465B689847A81B18BFE1 +:104DC000012004B070BD70B590B00D4614460021AE +:104DD0001C2202A815F0C8FC01260023294602A8BF +:104DE00000961A4600F084FE1C22002109A815F046 +:104DF000BBFC0023214609A81A46009600F078FE65 +:104E00000A9B1A68099B1A4203D16FF0010010B087 +:104E100070BD039B1968029B194046D109A80A245A +:104E2000FFF7C7FD09A8FFF7AAFD002109A8FFF7B2 +:104E3000C0FD002109A8FFF72FFF052002F04AFC62 +:104E4000012109A8FFF7B5FD012109A8FFF724FFFB +:104E5000052002F03FFC013CE7D102A8FFF78FFDDF +:104E6000214602A8FFF718FF052002F033FC0121BC +:104E700009A8FFF711FF052002F02CFC012102A870 +:104E8000FFF70AFF052002F025FC02A8FFF784FDCA +:104E900009A8FFF781FD0A9B1A68099B1A42B4D042 +:104EA000039B1A68029B1A42AFD00020AFE7002292 +:104EB000034600F1280143F8042B03F8012B994223 +:104EC000FBD17047F8B51A4B0D4600F130070021B1 +:104ED00003600446174B16460161A4228185436195 +:104EE0008061C0E90711C0E90911384615F03CFCA2 +:104EF000114B04F1D800C4F8D430FFF7D8FF204696 +:104F0000FFF735FF324629462046A4F80051A4F8A1 +:104F10000261FFF758FFB4F90221B4F900113846D5 +:104F200013F0ACF92046FFF715FF2046F8BD00BF8F +:104F300098C50108C94C0008A0860100D0F890303F +:104F4000012B10B5044686B004D9002084F89400E3 +:104F500006B010BDDBB204300493D0F88830039360 +:104F6000B0F99C300293B0F99A300193B0F99830BF +:104F70000093B0F99630B0F99420B0F9921013F084 +:104F8000DBFEB0FA80F04009E0E7000070B50A4EA1 +:104F90000546306818B14FF0FF31FEF779FC2C68F8 +:104FA00024B92C1D204602F049FE2C60306808B15F +:104FB000FEF786FC204670BD9827002408B5054BF7 +:104FC000186810B91846FFF7E1FFBDE8084002F085 +:104FD0003DBE00BF6814002408B5054B186810B921 +:104FE0001846FFF7D3FFBDE8084002F04BBE00BFF4 +:104FF0006814002438B5074B0546044645F8043BC1 +:10500000FFF7DCFF284613F02DFE2046FFF7E4FFF4 +:10501000204638BDF4C5010810B50446FFF7EAFF85 +:10502000B021204602F01CFA204610BDF8B51D46FE +:105030001A4B04460F46164600215C2240F8043BFA +:1050400015F092FBBDF918304FF400322046A4F859 +:105050009C302266BDF91C30099AA4F89E30C4F831 +:105060009020BDF920300E4AA4F8A0300023C4F8E7 +:105070008C200C4AA4F89670A4F89860A4F89A5072 +:10508000C4F8A430A4F86430C4F8883084F89430AC +:10509000C4E92A23FFF752FF2046F8BDF4C50108F2 +:1050A00040420F003D4F00082DE9F0479DF8207069 +:1050B000044689469246022F98469DF8246024D8DB +:1050C000134BDB5D0BB3B6FBF3F503FB156515F076 +:1050D000FF051AD103689B6898479DF82830204641 +:1050E00084F8646084F865300B9B84F86090C4F8A1 +:1050F0008830236884F861A0DB6884F8628084F8D3 +:10510000637098472846BDE8F0874FF0FF30FAE714 +:10511000E8C5010838B590F8943004460D4693B1BF +:1051200003689B6898472946C4F88C50201D13F0EB +:10513000E7FD0038236818BF0120DB6845422046A0 +:105140009847284638BD4FF0FF35FAE7F8B50446D2 +:105150000F4616460021202268301D4615F004FB3C +:1051600094F86030791C84F8683016BF002301235E +:1051700084F86970721C84F86A3094F8613018BF42 +:10518000266784F86C3094F8623084F86D3014BF70 +:105190000023012384F8743094F8633084F8783065 +:1051A00094F8643084F879306B1C16BF0023012317 +:1051B000E56784F88030D4F8883084F8843094F837 +:1051C000653084F88530F8BDF7B50093054690F852 +:1051D000943016460191DDE908740BB3ECB1E7B1E8 +:1051E0002368EBB103689B68984733462846DDE99E +:1051F0000021FFF7ABFF23463A4605F16801281D61 +:1052000013F0D4FE041E2B68284618BF0124DB6867 +:1052100064429847204603B0F0BD6FF00104F9E7FF +:105220004FF0FF34F6E7F7B50093054690F8943059 +:1052300016460191DDE908740BB3ECB1E7B12368C0 +:10524000EBB103689B68984733462846DDE90021A7 +:10525000FFF77CFF23463A4605F16801281D13F04D +:1052600083FE041E2B68284618BF0124DB686442B5 +:105270009847204603B0F0BD6FF00104F9E74FF006 +:10528000FF34F6E730B51D4685B090F894300446FB +:10529000CDE90221FBB103689B6898474FF0FF33CB +:1052A0002046DDE90221FFF751FF0A9B2A4604F15F +:1052B00068010193201D099B0093089B13F098FE41 +:1052C0000038236818BF0120DB6845422046984714 +:1052D000284605B030BD4FF0FF35F9E738B50A4C28 +:1052E0000A4D2378BFF35B8F13F0010F09D12046DD +:1052F00001F0D2FE28B113F0E9FE2860204601F04B +:10530000E2FE286838BD00BF941400249C140024D9 +:1053100038B50C4C0C4D2378BFF35B8F13F0010FA5 +:1053200009D1204601F0B8FE28B113F09FFE287085 +:10533000204601F0C8FEFFF7D1FF13F0CDFE28781C +:1053400038BD00BF9014002498140024D0E9021343 +:1053500070B5D0E908250446521845EB030300F068 +:10536000BBF8636B23B104F12800BDE87040184717 +:1053700070BD000038B50446154600F097F8064B9E +:10538000002220462360002384F83850C4E9082313 +:105390000023636338BD00BF18C6010813B5044677 +:1053A00001A800F0BBFE204600F0A0F8636B23B11B +:1053B00094F838300BB101F073FD002301A863634A +:1053C00000F0B4FE02B010BD70B5044615461E468E +:1053D00000F08CF8A069C4E9085600F00AFE2A180B +:1053E000204646EB0103BDE8704000F075B884B07C +:1053F00073B5054607AC01A884E80E0000F08EFEE8 +:105400006B6B23B995F838300BB101F035FD05F120 +:10541000280694E80F0086E80F00DDE90C232846F3 +:10542000FFF7D2FF01A800F081FE02B0BDE8704096 +:1054300004B0704710B5044600F0EEFD01220146AD +:105440002046FFF797FF024B2046236010BD00BFA8 +:105450000CC60108436B30B5044685B07BB100F142 +:1054600028036D460FCB85E80F000023636394F893 +:1054700038300BB101F014FD2846039B984705B066 +:1054800030BD000010B5044600F0C6FD0122014603 +:105490002046FFF76FFF024B2046236010BD00BF80 +:1054A00024C6010803681B681847000010B5084BA4 +:1054B00004460022084623600023A1610549C4E98F +:1054C00002230023C4E9043300F022FD204610BD6E +:1054D00030C60108A554000807B500F10801009086 +:1054E000806900F053FD03B05DF804FB00F1080192 +:1054F000806900F063BD0000034B10B504460360F3 +:10550000FFF7F4FF204610BD30C6010800207047A9 +:1055100000290CBF6FF01800002070470120704771 +:1055200084B001A804B080E80E0070476FF0150049 +:1055300070476FF0150070471120704738B5002391 +:105540000446836519B90A4600F011F803E0002A01 +:10555000FAD100F045F8204638BD10B5044600F0F9 +:1055600052F8204610BD4FF0FF3100F058B9032922 +:1055700038B5044607D9D31C23F003039A1A8A1AB4 +:1055800022F003011A4600230D46E260C4E9043309 +:105590000DBB22622560C4E9065100F005FA00F057 +:1055A00005FA2581606004F13000A57284F824506A +:1055B000C4E90A5500F01AFA00280BDB04F1440094 +:1055C00000F00CFA002805DB04F1480000F006FAB0 +:1055D00000EAE07038BD23696D0801332361D7E725 +:1055E00037B505460846019115F03EF8044638B136 +:1055F000024601992846FFF7BAFF6C6103B030BD3F +:105600004FF0FF30FAE770B504460568B5B9A36AF4 +:105610001BB14FF0FF31E06A984704F1480000F0F9 +:10562000DFF904F1440000F0DBF904F1300000F090 +:10563000E5F96069BDE8704015F01EB8EE6836B94E +:10564000EB6913B105F124009847AD68DEE7F36913 +:1056500013B106F124009847F668F0E773B50646E3 +:105660002731483021F00305019000F0BAF906F126 +:105670001803B46901985CB9F3699D4223D8346A70 +:105680005B1B6219F361012332622560A37107E09D +:105690002268954213D8E26872B11A60A3689360D9 +:1056A00000F0A1F900234FF0FF32E361C4E90532B5 +:1056B0002434204602B070BDA2681A60F0E704F1FD +:1056C0000803A468D7E700F08EF9F2E751F8083C28 +:1056D00073B505460C460BB108469847EB6833B1E5 +:1056E000A4F12406B34202D82B6AB34204D20023A9 +:1056F00004F81E3C02B070BD05F14800019000F0B6 +:1057000070F905F11802AB690198ABB11D6854F846 +:10571000241C8D420CD30FD144F8183C13689B68AD +:1057200044F81C3C166002B0BDE8704000F05BB964 +:1057300003F108029B68E8E7002344F8183C13686B +:10574000EEE7F8B54B6900F1440705460C469B1A95 +:105750001646002BACBFD318131C4B610389384687 +:105760008B8000F03EF9284603687BB35969626973 +:10577000A1EB020CBCF1000F25DB914226D19B6806 +:10578000A36013B104F108021A61036822460021E4 +:1057900042F80C3F99601A61AB6A046020616BB1FA +:1057A00095F8242052B12A68A24207D1E2682AB9AA +:1057B0006169E86A891B21EAE17198473846BDE8CA +:1057C000F84000F010B903F10800CDE7A36013B171 +:1057D00004F108021A610023E360DDE7F8B514461E +:1057E00005460F46A2F1240600F0E0F854F8103CFC +:1057F00002463146034444F8047C284644F8103CF1 +:10580000FFF79FFF296914F81E4C05F130008C400A +:10581000E968761A00F0F4F834432046F8BD2DE923 +:10582000F74F04460F464FF0000800F0BFF804F1B0 +:105830004406054607EB000984F82480304600F052 +:10584000D0F8636801A95B1B002B2368D8BF656093 +:1058500001931BB15A69521B002A37DD236003B143 +:105860001C61C1F80080019D15B12389013323819A +:10587000304600F0B8F801A965BB019D4FF0010A60 +:10588000002D34D100F092F8002F82465CDBA9EBAA +:105890000005002D5ADCA36A9BB1304600F0A1F848 +:1058A000A36A43B1226832B15169E06AA1EB0A01EF +:1058B00021EAE17198470123304684F8243000F052 +:1058C00092F80023A37203B0BDE8F08F03F1080142 +:1058D0009B68BEE7A8682B4600229A601A46DB68E0 +:1058E000002BFAD10A6005F108010546C4E72B6ACE +:1058F000D5F808B013B105F124009847AA69002A29 +:105900000BDB6B6913446B6100F050F829460246CB +:105910002046FFF716FF5D46B2E7E36873B1AB427E +:105920000CD8236AAB4209D3AB7922690133DBB2CD +:1059300013FA02F214BFAB7185F806A005F1240139 +:105940002046FFF7C3FEE6E74FF0FF35304600F094 +:1059500048F823683BB15969A1EB0A0121EAE171DA +:105960008D4228BF0D46304600F03DF8294604F12F +:10597000300000F048F8A37A7BB1304600F031F8EF +:10598000A37A3BB100233046A37203B0BDE8F04FC9 +:1059900000F029B8304600F026F800F007F8054678 +:1059A0004CE740F8081C704701F0CCB907B500F08F +:1059B000F8FF70B1084B6846196800F0E6FC4FF438 +:1059C0007A720023DDE9000116F0AAFA03B05DF84F +:1059D00004FB02F0FFF8F9E71016002400207047DE +:1059E000704700F0E5BF00F0EDBF0000024908B5C8 +:1059F00002F0CAF8002008BD34C6010802F0CDB894 +:105A0000012102F0C7B808B5012341EAE172194645 +:105A100002F0DEF8431E5842584108BDEFF31083F0 +:105A200072B6054A117831B9DB43044903F001032A +:105A30000B70012313707047A1140024A0140024DC +:105A4000034B00221A70034B1B7803B162B67047F8 +:105A5000A1140024A014002410461A4608B514F01E +:105A600075FE002008BD0000094B30B51A46094CF0 +:105A7000D3F89450A542FBD1036829B181680B602B +:105A80004FF44073536130BDC1681B04F7E700BF9A +:105A9000006402580003008070B50E4604461546A7 +:105AA00011F02AFF013609D02046002111F048FFED +:105AB00029462046BDE8704011F03EBF70BD70B56C +:105AC0000E460446154611F017FF01360CD020464D +:105AD0002946FFF7C9FF012111F032FF20460021BE +:105AE000BDE8704011F028BF70BD0022FFF7E7BF8E +:105AF000F8B5069F04460E461D4652B91A46FFF7F2 +:105B0000CBFF013616D039462046BDE8F840FFF7F6 +:105B1000ABBF11F0F1FE01360CD020463946FFF73D +:105B2000A3FF012111F00CFF29462046BDE8F840F3 +:105B300011F002BFF8BD0000004870473CC60108E4 +:105B4000024B1B680BB1024818477047F401002450 +:105B50003CC601081FB5431C10D105B05DF804FB1D +:105B600083420AD18968039012F0FAFE002103985B +:105B700005B05DF804EB12F083BF0C31B1F90030D1 +:105B80005A1CEDD10023024602481946009300F04A +:105B9000C1FF00BF30010180884207B502460AD02C +:105BA000431C08D0013105D0002305481946009355 +:105BB00000F0B0FF0146084603B05DF804FB00BFEB +:105BC00030010180B1F900305A1C01D118467047EC +:105BD000834201D1486870470C31F3E7421C13B58A +:105BE00004460AD0FFF7EEFF431C06D100232246ED +:105BF00003481946009300F08DFF02B010BD00BFAE +:105C000030010180B1F900305A1C01D118467047AB +:105C1000834201D1886870470C31F3E72DE9F047E2 +:105C2000466896F8327087BB03685B689847346AA9 +:105C300084422AD03369041B96F934201C40B3688F +:105C40003062A4FB0345CAB1736A14EB030845F143 +:105C50000009002A1BDBC2F12001A2F1200328FA6F +:105C600002F429FA02F509FA01F129FA03F30C43C7 +:105C70001C4304FA02F2A8EB02027262D6E90A326D +:105C80001B1945EB0202C6E90A32BDE8F087D6F8D7 +:105C90000CA03B4640464946524616F091F9044650 +:105CA0000D460AFB1082E8E7824206D98A420BD9E8 +:105CB000884294BF002001207047884206D98A425A +:105CC0008CBF0020012070470120704700207047E2 +:105CD0002DE9F74F456806462F6B27F07F4727F0E1 +:105CE000FF07002F69D1FFF799FF6B68D6F800A076 +:105CF000002B57D0D3E90001D5E90A238B4208BF16 +:105D0000824205D3DAF8143003B0BDE8F04F1847EB +:105D10007468D4E90A32D4F814B0B0EB030861EB2C +:105D20000209D4E906234B4508BF424520D3E36866 +:105D300094F933C0A3FB080103FB0911BCF1000F68 +:105D400013D0A268531EC01841F10001BCF1000F2E +:105D500024DBCCF12002ACF1200320FA0CF001FA94 +:105D600002F221FA03F310431843834528BF834608 +:105D7000226ADAF81030934422690BEA02021046D4 +:105D80000192984733685B689847019A0146286AF0 +:105D9000FFF78AFF88B133685B69B5E73B4616F0C9 +:105DA0000FF9E2E76B69286A2A691844DAF81030BB +:105DB000104003B0BDE8F04F184703B0BDE8F08FC6 +:105DC000436893F830202DE9F0470646002A74D145 +:105DD00093F83230002B70D103681B689847336802 +:105DE000DB699847364B0268002A08BF1A461146FD +:105DF0001C46B1FBF3F304FB13132146002BF7D130 +:105E00002F4B01257768B3FBF4F11F23B960013BE9 +:105E100003D305FA03FC6145F9D1B2FBF4F287F82C +:105E2000333001241F23FA6004FA03F5AA4201D09B +:105E3000013BF9D287F834304468231F1B2B93BFF2 +:105E400001234FF0FF332024A340A4F1040498BFA2 +:105E500003F1FF3312F1FF303B614FF0070303FA08 +:105E600004F44FF000034FEAE4797C61A4FB0145A0 +:105E70009A4601FB095543F1FF31201845EB01011A +:105E800016F09EF83368C7E906015B68C7E900AA07 +:105E9000984773683862002100200122C3F824A0CB +:105EA00083F832A01A86C3E90A013046FFF7B6FE2E +:105EB0003046BDE8F047FFF70BBFBDE8F08700BFF5 +:105EC00040420F002DE9D00316461F4642680024C9 +:105ED000059B8B605368C1E9006733B9CB606CB92F +:105EE0005160BDE8D003FFF7F3BED3E900894F4509 +:105EF00008BF4645F2D31C46DB68EEE7D2E90A2329 +:105F0000E160BB4208BFB242EBD2BDE8D0037047AC +:105F100038B505460C46FFF753FF00F049FD6B68A6 +:105F20001C60BDE8384000F04DBDF8B5054600F0F6 +:105F30003FFDD5E90034DB68984794F832301BB157 +:105F4000BDE8F84000F03EBD012384F831306368BD +:105F5000ABB12846FFF762FE6168D4E90A67D1E970 +:105F600000239F4208BF964209D36B685A68CB68EA +:105F700063602368002BEAD090689847E7E7002326 +:105F8000284684F83130FFF7A3FED9E710B586B074 +:105F9000CDE904210393089C029000F009FD0298CA +:105FA000FFF73CFE059902980094DDE90332FFF704 +:105FB00089FF06B0BDE8104000F004BD38B50546C5 +:105FC0000C4600F0F5FC6A685368A34209D1DB680F +:105FD00028465360FFF77CFEBDE8384000F0F2BC75 +:105FE0001346002BF8D0DA68A242F9D1E268DA60F1 +:105FF000F2E738B50446FFF7E3FE00F0D9FC20468F +:10600000FFF70CFE6368D3E90A4500F0DBFC20468D +:10601000294638BD704700000048704768C601082F +:10602000024B1B680BB1024818477047F801002467 +:1060300068C60108BFF35F8F114B00221968104634 +:106040005A60C1F307218A4216D11022DA600D4A44 +:106050001A611322DA600C4A1A611122DA600B4AC3 +:106060001A610B4ADA600B4A1A6107225A60BFF3C1 +:106070004F8FBFF36F8F70479A6001321861E2E76C +:1060800090ED00E039F00206390702133FF50B13DB +:106090001200008039000213BFF35F8F034B002210 +:1060A0005A60BFF34F8FBFF36F8F704790ED00E0E2 +:1060B000BFF35F8F064A00239360136923F0010347 +:1060C00018431061BFF34F8FBFF36F8F704700BF4E +:1060D00090ED00E0BFF35F8F012208498A60013232 +:1060E0000B69042A23F0010343EA00030B61F5D195 +:1060F000BFF34F8FBFF36F8F704700BF90ED00E08D +:10610000B1F90C20B1F9041013F034BA024B1B683A +:1061100003B11847704700BF1815002407B5019058 +:1061200000F046FC019803B05DF804FB07B5019050 +:1061300000F048FC019803B05DF804FB80687047EC +:10614000007B704738B50D4B0D4602730446036063 +:106150000023C0E901310A48FEF7EEFB01F076FDAD +:1061600055B1084B1A681C6062600548FEF7E4FBF5 +:1061700001F088FD204638BD6560F6E7A4C6010839 +:10618000201500241C150024144B10B50360044690 +:106190001348FEF7D1FB01F059FDA3682BB111495B +:1061A00062680B68A34212D10A600F4B0C481A6850 +:1061B000A24204BF00221A60FEF7BEFB01F062FD9E +:1061C000237B13B9201F01F04FF9204610BD19465B +:1061D0005B68A342FBD14A60E7E700BFA4C60108A1 +:1061E000201500241C1500244815002410B5044671 +:1061F000FFF7CAFF1021204601F032F9204610BDFA +:10620000F8B5064617480D46FEF796FB01F01EFD51 +:10621000154B1C68A4B1A76887B1384614F0A1FEDD +:10622000A8420BD12A463146384614F081FA28B9E3 +:106230000C48FEF781FB01F025FD11E06468E9E7F9 +:10624000072DF5D12A463146084814F071FA002886 +:10625000EED10448FEF770FB01F014FD044B1C68FE +:106260002046F8BD201500241C15002494C6010802 +:106270004815002470B50D46002604460C49C0E9B7 +:106280000066284614F09AFE3146284420602368B0 +:106290001A782F2A06D101332360FFF7B1FF60601F +:1062A000204670BD002AF8D0013301312360EEE7AB +:1062B000ACC6010800687047406808B520B1FFF718 +:1062C0003FFF431E5842584108BD10B50446FFF732 +:1062D000F3FF10B1606800B1043810BD406808B524 +:1062E00020B1FFF72DFFB0FA80F0400908BD10B5CE +:1062F0000446FFF7F3FF10B1606800B1043810BD29 +:106300004068003818BF012070476FF05700704791 +:106310006FF0570070476FF05700704710B5044694 +:10632000FFF7C4F8094BA0692360FFF762FE002263 +:106330000023C4E90C230023C4E90801C4E90A01CD +:10634000C4E90E33204684F8403010BDE4C601088D +:106350004FF0FF30704710B50446FFF7C7F8002331 +:1063600094F84020A3872AB184F84030BDE810405B +:1063700000F096BD10BD10B5044601F1300000F0EC +:10638000ABFAC4E90001204610BD10B50446886987 +:10639000FFF72FFEC4E90001204610BDD0E90C3202 +:1063A000013342F10002C0E90C32D0E90A3213F5A0 +:1063B0007A7342F10002C0E90A327047D0E90A2339 +:1063C00012F57A7243F10003FFF786B8F8B50D466F +:1063D00004468869FFF70DFED5E90A32C61A61EB5B +:1063E0000207002F08BFB6F57A7F05D200220023EE +:1063F000C4E900232046F8BD002F08BFB6F5FA6FA8 +:1064000001D20122F3E7002E4FF47A72304677F181 +:1064100001034FF00003B4BF0021394615F0D0FD51 +:10642000C4E90001E6E7F7B5054668460C46FFF704 +:10643000CDFF0021DDE90032A1634FF47A71A3FBA7 +:10644000016701FB0277D4E90A10891947EB0000C4 +:10645000C4E90A10D4E90C105B1840EB020228468C +:10646000C4E90C32C5E9003203B0F0BD2DE9F743B1 +:1064700099460446904690F83C3063B90146684618 +:10648000FFF7D1FFDDE900234B4508BF424505D3A7 +:10649000012384F83D3003B0BDE8F083214668460F +:1064A000FFF769FF009B4FF47A71B8EB0306019B7D +:1064B00069EB0307A8FB012301FB0933D4E9085169 +:1064C000551994F8402043EB01080123A38762B9D2 +:1064D000A269126892F8202032BB84F8403000F0A4 +:1064E000CBFC002F08BF052E0DD2002384F83E30D0 +:1064F00094F8403023B9012384F8403000F0BCFC0C +:106500002A4643460AE094F84030002BEDD101239F +:10651000B5F57A6284F83E3048F1FF33204603B087 +:10652000BDE8F043FEF7D8BF002F08BF052EDCD32F +:10653000EDE70000024B4FF080625A60704700BFE9 +:1065400000ED00E008B50121383000F0B3F908B1E2 +:10655000FFF7F0FF08BD012310B580F83F30044677 +:10656000836B0BB1FFF7E6FF2046FFF727FF10BD57 +:1065700090F83C3010B504464BB1002380F83C3015 +:1065800090F83E3013B9012380F83D3010BD90F8EB +:106590003F30002BFAD0836B01338363FFF7CAFFD0 +:1065A0002046FFF7FBFE2046FFF708FFEEE700005E +:1065B000024B4FF000725A60704700BF00ED00E0E0 +:1065C00010B50446FEF792FF002384F83F30FFF732 +:1065D000EFFF10BD102300F007B8202300F004B82F +:1065E000302300F001B840239C46F0B404AE754659 +:1065F000E80801D3EFF309860E4F0FCE0FC70FBC8B +:106600000FC74046494652465B460FC71DCE310074 +:10661000A60A00D304316E0900D248311FC7EFF338 +:1066200009806946EFF3148663C76046014900F0AC +:1066300079F800BFE0370024F0B52C4E85B0002477 +:106640002B4F35462146013456F8042B384600F0CE +:1066500095F90D2CF6D1AB6C264C02936B6C264849 +:1066600001932B6C0093696BD5E90E2300F086F93A +:106670002168224800F082F9E16AA26AA36AA06A4E +:10668000D2B2266BC3F30723E76B000CCDE9016799 +:1066900000901B4800F072F9A36A1E0603D5616BD7 +:1066A000184800F06BF9A36A180403D5A16B1648CB +:1066B00000F064F9EB6C190712D5144800F05EF98C +:1066C0002B6DDA070FD5124800F058F9EB6C5B0719 +:1066D0004CBF1048104805B0BDE8F04000F04EB97E +:1066E0000E4800F04BF90E48EEE700BFE0370024FB +:1066F000E8C6010800ED00E0F6C6010845C701083C +:1067000053C70108A2C70108B0C70108BEC70108E6 +:10671000CDC70108FDC7010809C80108EDC7010878 +:10672000DAC7010807B504460D461A48012100F0F2 +:10673000CAF868BB184800F021F9302C19D0402C59 +:106740001CD0202C1FD1154C154800F017F9154806 +:1067500000F014F9FFF770FF134800F00FF90D4B2C +:1067600000221A7000232A4610492046009300F0A8 +:10677000D1F90F480F4C00F001F9E8E70E480F4C33 +:1067800000F0FCF8E3E70E480E4C00F0F7F8DEE707 +:106790000024E7E73438002415C801083E01FF80D3 +:1067A0003EC801086BC8010876C8010895C80108F1 +:1067B0004DC801083F01FF8056C801084001FF8015 +:1067C00061C801083D01FF8014F026B814F07EB8BE +:1067D00013F0D2BFF8B5044672B60023234A4FF037 +:1067E000FF36234F13604FF0E0221D46516801F041 +:1067F0000F0101319A004FEAC30C02F1604202F529 +:106800006142C2F88060C2F88061002202EB0C0095 +:1068100001323844082A80F80053F7D101339942F5 +:10682000E8DC144B4FF020625A6040F2FA529C6050 +:10683000DA6000221D611146981801320C2A017697 +:10684000FAD14FF0FF3259629A620B4ADA621F2284 +:106850001A63FFF721FCD4E90031002282F3148887 +:106860009D4682F310880847F8BD00BF10E000E0A5 +:1068700000E100E000ED00E0020000C0034601225C +:10688000D3E84F0FC3E8412FC0B20029F8D17047B9 +:10689000D0E85F3F5B18C0E8523F002AF8D198B2B9 +:1068A0007047D0E85F3F5B1AC0E8523F002AF8D13A +:1068B00098B27047034653E8000F401A43E80002BD +:1068C000002AF8D170470346D3E84F0FC3E8421FB0 +:1068D000C0B2002AF8D1704738B5044600F068F815 +:1068E000D4E9004500F06EF82046294638BD08B5C9 +:1068F00000F05EF8FEE773B5002201460446022070 +:1069000000F04CFC0D2600F053F80022254614F848 +:10691000013B1BB900F056F802B070BD0A2B09D13B +:106920000D2A07D001220DF1070102208DF8076022 +:1069300000F034FC01222946022000F02FFC14F85C +:10694000012CE3E700B5A3B002460B46842101A861 +:1069500001F004F9832806D9074B1A681B79CDF892 +:1069600083208DF88730002802DD01A8FFF7C3FFE0 +:1069700023B05DF804FB00BFA5C801080FB407B53C +:1069800004A951F8040B0191FFF7DCFF03B05DF897 +:1069900004EB04B07047EFF31080C04300F0010037 +:1069A0007047EFF30580003818BF012070470000E2 +:1069B00008B5FFF733F8024A13680133136008BDC6 +:1069C0004C150024044A136823B1013B13600BB932 +:1069D000FFF736B8704700BF4C15002408B50B48C8 +:1069E000FFF74CFF28B1FFF7E3FFBFF34F8F20BF46 +:1069F000FDE7FFF7D6FF08B1FFF779FFFFF7CBFF01 +:106A00000028F9D0012000F0F1FC00BF8C15002413 +:106A100070470000F0B5294D8FB00E46174635EA95 +:106A2000200528BF05463022002102A813F09CFE55 +:106A3000234B01AC01952B440396012B05D9214B27 +:106A40009D4202D0033B9D4232D1F36B0293736BA4 +:106A500008931D4B5B69DA6B049305925A6B1B6BB1 +:106A600006920793FFF7A4FF184A13680133012B1E +:106A7000136009D12646164D0FCE0FC50FCE0FC598 +:106A80000FCE0FC533682B60124D0FCC0FC50FCC46 +:106A90000FC50FCC0FC52368A5F130002B600E4B3E +:106AA0001B6843B19847FFF78DFF00200FB0F0BD82 +:106AB00002970894CDE7FFF7ABFFF4E70101FF80F1 +:106AC000C2FE007F4001FF804C01002450150024CD +:106AD0005815002490150024541500240FB407B550 +:106AE00001210648CDF804E0FFF7EDFE019A0146CA +:106AF00010B90348FFF78EFFFFF770FF343800240A +:106B00000001FF8000207047014B1878C0B2704729 +:106B1000343800240446012106487646154608B557 +:106B2000FFF7D1FE20B9324629462046FFF772FF13 +:106B3000FFF754FF3438002409B9C82805D010F0F5 +:106B4000030F0CBF0120002070470846704700006B +:106B50002DE9F04180460C4641B338B34569A5F1B3 +:106B60004607882F22D88168D0E900364FF461604B +:106B700041433C2000FB06161B4928461E44D8F81A +:106B80000C30013B01FB03631146FFF7D5FF0C26D8 +:106B9000D8F81010CE2D06FB0010144951F8201023 +:106BA0000B4409D122B912498B4207D3002019E0C6 +:106BB000012A03D10F49F7E7462D0FD0691E89102E +:106BC000A1F111001AB9C82DC8BFA1F1120040F2FD +:106BD0006D1202FB0707044A02FB07332360012002 +:106BE00000236360BDE8F08180510100ACC801085A +:106BF0008022310000D12F00194670B5002A52D0F2 +:106C00003C24B0FBF4F304FB13001060B3FBF4F07E +:106C100004FB103418235460B0FBF3F403FB14039B +:106C200007209360231DB3FBF0F0C0EBC000181ADF +:106C300046239061536155692846FFF77DFF38B1BF +:106C4000B4F5B77F0DD30135A4F5B7745561F2E7FC +:106C5000B4F5B67F05D901356FF4B67355611C44A0 +:106C6000E9E7124B30251249D4615C430B2305FB45 +:106C700000151361002355F8046BA6420FD9013BA0 +:106C8000136113690C2505FB003051F820300120F9 +:106C9000E41A064BB4FBF3F40134D46070BD013345 +:106CA0000C2BE8D1EDE71046F8E700BF805101005A +:106CB000ACC8010810B5074CFFF77AFE208808B968 +:106CC000FFF708FA238801332380BDE81040FFF75F +:106CD00079BE00BFC615002408B5FFF769FE064A55 +:106CE0001388013B9BB2138013B90120FFF7F2F91F +:106CF000BDE80840FFF766BEC615002410B5074C76 +:106D0000FFF756FE208808B9FFF7D2F92388013330 +:106D10002380BDE81040FFF755BE00BFC415002416 +:106D200008B5FFF745FE064A1388013B9BB2138066 +:106D300013B90120FFF7BCF9BDE80840FFF742BED8 +:106D4000C415002438B5064C23683BB9054DFEF741 +:106D5000F3FE01462846FFF7E1FA2560206838BDBA +:106D600010160024C815002408B5836823B9054B04 +:106D70001B6893F83D0008BDC06898470028F6D00E +:106D8000F9E700BF10160024F7B504464FF0FF36B0 +:106D90006FF00047164D2046FFF7E6FF30BBD4E901 +:106DA0000023BB4208BFB24202D02868FFF75EFB57 +:106DB00001A8FFF7B3F92046FFF7D6FF98B9D4E949 +:106DC0000023BB4208BFB24207D100F08BF801A8F4 +:106DD000FFF7ACF9BFF36F8FDDE72B6893F83C301A +:106DE000002BF2D1F3E701A8FFF7A0F903B0F0BD43 +:106DF0001016002430B587B00D4D0446CDE90223AE +:106E00000A9B04930B9B0593FFF79CFF02A8FFF7D7 +:106E1000BBFF2868FFF79FFA68462968FFF703FB66 +:106E20002046DDE90023C4E9002307B030BD00BFE0 +:106E3000101600242DE9F0410E4D86B006460F468F +:106E400004A829689046FFF796FA2B68DDE904014B +:106E50009B6BC41A02A861EBE375A219CDE9007817 +:106E600045F10003FFF7C6FF0298001B06B0BDE81E +:106E7000F08100BF1016002413B5074C01212046F5 +:106E8000FFF706FD034628B9014600902288034813 +:106E9000FFF740FE02B010BD141600242301048049 +:106EA00013B5094C01212046FFF7FBFC4FF6FF7399 +:106EB000984206D100232288044819460093FFF720 +:106EC00029FE02B010BD00BF141600242401048066 +:106ED000034B188880B2B0FA80F04009704700BFB9 +:106EE0001416002408B5FFF763FDFFF7F1FF28B182 +:106EF00012F0D8FCBDE80840FFF764BD12F0C0FCFA +:106F0000F8E76FF01C0070476FF015007047012024 +:106F10007047002070477047034B186818B14FF056 +:106F2000FF31FCF7B5BC704798270024024B186866 +:106F300008B1FCF7C5BC704798270024F8B5154682 +:106F40000C468F18054EBC4205D014F8011B304684 +:106F500010F0EAFBF7E72846F8BD00BFBC3E00246E +:106F600038B511F001048DB205D0084812F006FAC8 +:106F7000041E18BF0124EB0605D5044812F00EFAD2 +:106F800008B144F01004204638BD00BFBC3E0024C8 +:106F900010B5044613F070FB204610BD10B50C462A +:106FA0002AB1044810F08CFB2070012010BD10465F +:106FB000FCE700BFBC3E002438B5084B044615462C +:106FC0000360074B1B6833B90648FFF799F8294659 +:106FD000044812F039FA204638BD00BF18C901082C +:106FE000E0210024BC3E00240020704700207047B0 +:106FF00073B50D4601466846FFF73CF96846FFF752 +:1070000064F9044638B912F0CFFD132303604FF042 +:10701000FF3002B070BD036868469E69FFF74AF909 +:107020002A4601462046B047041E04DA644212F0A4 +:10703000BBFD0460EBE70020EBE7012008B500F0A2 +:10704000D5F90000074A084913681844884283BFED +:10705000064B0C224FF0FF3010608CBF1A601846B0 +:10706000704700BFFC02002400FC0724443F0024BA +:10707000012070470120704708B5FDF7E9FA08BD07 +:1070800008B5FDF7EDFA08BD08B5FDF7EFFA08BD44 +:1070900008B5FDF7F3FA08BD10B50446037803F010 +:1070A0000303012B08D0FFF737FF237803F0030217 +:1070B000012A03D1FFF73AFF002003E043F0020367 +:1070C0002370012010BD037823F0030343F0010374 +:1070D0000370FFF72BBF00003F2870B504462EDC7D +:1070E000184D55F820305A1C13D1022811DCFFF737 +:1070F0007DFF034658B92046FFF776FF034630B9B7 +:10710000114E3378BFF35B8FDB0704D50F4B45F887 +:107110002430184670BD3046FFF7BEFF0028F5D07A +:107120004FF416520A490948FFF746FF3046FFF769 +:10713000CAFF084A08490548FFF79AFFE6E7002317 +:10714000E7E700BFFC01002418160024C416002441 +:1071500060C9010800000024176F000838B5054613 +:107160000024FFF7B9FF0B4B43F8254030B912F06C +:107170001BFD092303604FF0FF3038BD03685B69D6 +:107180009847051E04DA6D4212F00EFD0560F2E725 +:107190002046F2E7FC010024FFF7E0BF13B5CDE97C +:1071A0000021FFF799FFDDE9002140B912F0FCFC56 +:1071B000092303604FF0FF34204602B010BD03687E +:1071C000DB689847041EF7DA644212F0EDFC0460B5 +:1071D000F0E713B5CDE90021FFF77EFFDDE90021DF +:1071E00040B912F0E1FC092303604FF0FF34204660 +:1071F00002B010BD03689B689847041EF7DA64422A +:1072000012F0D2FC0460F0E710B5FFF765FF04460A +:1072100028B912F0C9FC09230360204610BD036899 +:10722000DB699847041EF8DA644212F0BDFC046082 +:107230000024F2E72DE9F74FB2F1000805460E46AB +:1072400009DA12F0B1FC162303604FF0FF34204638 +:1072500003B0BDE8F08FFFF7D7FF044660B31F4AC5 +:107260000027DFF87CA04FF00D0B535D3C469146A4 +:10727000B84521DDF25D0A2A1BD10D2B019318D0F0 +:10728000BC420CDA3A1B31192846FFF787FF002869 +:10729000019BDADB0444A742D9DC09F8053001225E +:1072A00051462846FFF77AFF0028CEDBCFD009F8F9 +:1072B00005B0F35D0137DBE7A045C8DDA8EB0402AC +:1072C00031192846FFF76AFF0028BEDB24181FBFCC +:1072D0003619024B16F8012C5A55B8E75C160024F3 +:1072E0000CC90108FFF790BF7FB5002A04460D4680 +:1072F00006DA12F059FC162303604FF0FF3019E054 +:107300000192FFF781FF019AE8B1114E01220DF1C0 +:107310000F012046FFF75DFF0028EEDB0AD09DF845 +:107320000F300D2B08D1325D0A2A3355EED00A23D7 +:1073300001202B7004B070BD0A2B02D1325D0D2AE2 +:10734000F3E73355F4E729462046FFF742FFF1E71C +:107350001C16002413B5CDE90021FFF7BDFEDDE9C1 +:10736000002140B912F020FC092303604FF0FF34E4 +:10737000204602B010BD03681B699847041EF7DA67 +:10738000644212F011FC0460F0E7FFF7E3BF10B5B0 +:10739000FFF7A2FE30B912F007FC092303604FF09B +:1073A000FF3010BD03689B699847041E04DA6442ED +:1073B00012F0FAFB0460F2E70020F2E70A4D0446FF +:1073C00008B52B68986812F0B7FC2B68D86812F0E3 +:1073D000B3FC0120FFF7DBFF0220FFF7D8FF0CB161 +:1073E000FFF785FAFEE700BF2403002408B5FFF786 +:1073F000E5FF38B50D46FFF76FFE044630B912F0D1 +:10740000D3FB092303604FF0FF3038BD0368DB690D +:1074100098470028204614BF4FF400534FF4004310 +:107420006B6023689B6A984728610020EDE7FFF7AF +:10743000E0BF00001FB5039013F016F9039A03464E +:1074400020B9014600900348FFF764FB05B05DF8E2 +:1074500004FB00BF1F010180FFF7ECBF13F004B96C +:1074600013F00AB913F008B910B504460B48FDF73C +:1074700063FA00F0EBFB0A4A4023002152F8040BA8 +:10748000A04208BF42F8041C013BF7D10348FDF7B6 +:1074900053FABDE8104000F0F5BB00BF9C16002475 +:1074A000FC01002410B512480324FDF745FA00F052 +:1074B000CDFB104B53F824207AB10134402CF9D184 +:1074C00012F072FB18234FF0FF3403600848FDF7F9 +:1074D00033FA00F0D7FB204610BD4FF0FF320448CE +:1074E00043F82420FDF728FA00F0CCFBF3E700BFB7 +:1074F0009C160024FC0100240EB42DE9F04187B055 +:107500000190FFF7CFFF041E13DB0023019904A8AD +:10751000214E0393FEF7AEFE04A8FEF7F1FE0546EA +:1075200068B912F041FB1323036046F824504FF072 +:10753000FF34204607B0BDE8F04103B0704704A80F +:10754000FEF7CCFE074604A85FB1FEF7D0FE03901D +:10755000039B124A46F8243000231355104A135552 +:10756000E7E7FEF7B2FE05460028DAD0036804A874 +:10757000D3F80880FEF79EFE0D9B024603A928461D +:10758000C04705460028E3D06D4212F00DFB0560B0 +:1075900046F82470CBE700BFFC0100241C16002431 +:1075A0005C16002470B50E461549054613F0B6FC6E +:1075B000044618B9FFF790FD204670BD11492846D2 +:1075C00013F0ACFC20B901200124FFF785FDF3E79F +:1075D0000D49284613F0A2FC20B902200224FFF72F +:1075E0007BFDE9E72B78402B02D1D5F80140E3E79A +:1075F00026F480312846BDE87040FFF77DBF00BF0C +:1076000080C9010887C9010878C9010810B5044676 +:107610000A48FDF791F900F019FB094B1B6803B10B +:107620009847084B1B6813B1D4E9000198470348F9 +:10763000FDF782F900F026FB002010BDD0160024D3 +:1076400008030024000300241FB502460B46002156 +:107650006846CDE90211CDE90023FFF7D7FF05B059 +:107660005DF804FB38B504461048FDF765F900F0F5 +:10767000EDFA0F4B1B682BB1984718B90020002179 +:10768000FFF7E2FF0B4B1B685BB198470025C4E98D +:107690000001A5600548FDF74FF900F0F3FA284610 +:1076A00038BD4FF0FF300146F0E700BFD016002490 +:1076B000040300240C0300241FB50446002168467F +:1076C000FFF7D0FFDDE900010CB1C4E9000104B00F +:1076D00010BD0000034B596A5A6A521A8242FBD30A +:1076E000704700BF000C004070B514466FF00046B4 +:1076F000126805460498B24207D238B101461846CE +:1077000012F096FC431C05D1206070BD15B18A4271 +:1077100038BFAB54236801332360F6E72DE9F04FFF +:107720002DED028B8DB00E46002105469DF8703080 +:10773000174607A814229DF8689004930691DDE986 +:1077400018AB13F011F8049B002B14BF3023202337 +:10775000B9F1010F08EE103A48D1BAF1000F7BF1F0 +:10776000000343DADAF1000ACDF80C906BEB4B0B17 +:10777000A9F102034FF00008DBB20593059B012B32 +:107780005ED8B9F1020F0AF00F030CBF3B4A3C4A26 +:10779000D35C06AA02F808304FEA1A134FEA1B120C +:1077A00043EA0B7393469A465AEA0B0308F1010425 +:1077B00044D1039B23B3049B3BB11D9B3A46314606 +:1077C000284600932D23FFF78FFF08F102041B9B2F +:1077D0009C421ADB049B3BB91D9B3A463146284626 +:1077E00000932D23FFF780FF013C1FE05AEA0B03B3 +:1077F00002D000230393BBE7302301248DF8183017 +:107800001B9B9C4212DA002303931D9B3A46314690 +:107810002846009318EE103AFFF766FF1B9B013BCA +:10782000A3421B93F1DC039B002BD3D10DF118086D +:10783000CCB90DB0BDEC028BBDE8F08FA0469DE742 +:10784000504659460A22002314F0BAFB06AB3032E8 +:107850005046594603F808200A22002314F0B0FBD2 +:1078600082468B46A0E71D9B013C3A463146009379 +:10787000284618F80430FFF737FFD9E78FC9010809 +:107880009FC901082DE9F04F1C468BB00023064626 +:107890000D46DDF8508017460993AAB1994213DBD3 +:1078A0000CBF012301F1FF354FF0000B079317F8D0 +:1078B0000B306BB946B1079B33B9099BAB4295BFFF +:1078C000079A079BF254735509980BB0BDE8F08FE7 +:1078D000252B40F02B810BF1010A17F80A30203BD1 +:1078E000DBB20D2B07D842F6090222FA03F3DB07BD +:1078F00048BF0BF1020A17F80A302A2B46D10021A3 +:107900000AF101020434084617F802C0BB18BCF1A2 +:107910002E0F62D193F801C0BCF12A0F51D0002282 +:10792000C7F10109069209EB030213F801CFACF18C +:10793000300C5FFA8CFEBEF1090F47D9BB5C682B97 +:107940004ED1BB185B78682B0CBF7223112303F058 +:10795000030A924417F80A90B9F1640F02D0B9F102 +:10796000690F62D1822B55D1073424F00704F4E863 +:10797000022303910121CDE90408029129463046F2 +:10798000CDE9002309AAFFF7C9FE87E0302B16D105 +:107990000AF1010A17F80A30302BF9D00120BA4455 +:1079A0000021AAEB07021AF8013B303B5FFA83FC87 +:1079B000BCF1090FA8D80A2202FB0131F1E700202F +:1079C000EDE7023254F8043B0693B7E7069A4FF00E +:1079D0000A0E0EFB02C20692A5E76FF00043F3E722 +:1079E0006C2B06D1BB185B786C2B0CBF8223212338 +:1079F000ADE76A2B08D07A2B08D0742B08D04C2B1B +:107A000014BF00236123A2E73123A0E741239EE7AF +:107A100051239CE7112B54F8042B04D0722B08BF80 +:107A200052B2D317A5E712B2FBE7B9F1750F03D035 +:107A300009F0DF02582A24D1822B0CD1073424F01C +:107A40000704F4E80223B9F1750F0391CDE90408A6 +:107A500011D1002191E7512B54F8042B09D0722B3E +:107A600003D0112B03D00023EDE7D2B2FBE792B293 +:107A7000F9E7D317E7E7B9F1580F0CBF032102214B +:107A80007BE7B9F1630F0CD154F8043B09AA2946EE +:107A90003046DBB2CDF80080FFF726FE0AF1010B7D +:107AA00005E7B9F1730F15D154F804BB0BF1FF3999 +:107AB00019F8013F002BF1D0069AA2EB09021BEB4B +:107AC000020FEBD009AA29463046CDF80080FFF717 +:107AD0000BFEEDE7B9F1700F1BD154F8049B302376 +:107AE00009AA29463046CDF80080FFF7FDFD78232E +:107AF00009AA29463046CDF80080FFF7F5FD00239E +:107B00004A46CDF81480CDE9033303230293D317FB +:107B100034E7252309AA29463046CDF80080B9F17B +:107B2000250F18BFDA46FFF7DFFDB7E709AA294698 +:107B30003046CDF80080DA46FFF7D6FDAEE70CB44C +:107B40001FB506AB002453F8042B00940393FFF7F2 +:107B500099FE04B0BDE8104002B0704713B5002490 +:107B60000094FFF78FFE02B010BD1FB5002304463E +:107B7000CDE90013031D6846029310230393FAF71F +:107B8000E5FE206004B010BD10B50446FFF7EDFF20 +:107B9000204610BD0068FAF7F1BE10B50446006833 +:107BA000FAF744FF204610BD10B49DF804400CB90C +:107BB00042F0020200685DF8044BFAF70DBF07B50A +:107BC000009313460022FFF7EFFF03B05DF804FBBC +:107BD000FFF7F5BF13B5FEF7EBFEFBF71BF9094BFB +:107BE00004461A6818608242074A82BF1168013150 +:107BF000116011680191FEF7E5FE2046019902B07F +:107C000010BD00BFFC160024F81600241FB5002389 +:107C100004460362084B002908BF1946031D684645 +:107C200002931C23009103930B230193FBF718FE8F +:107C3000206004B010BD00BFAFC9010810B50446F4 +:107C40000021FFF7E3FF204610BD000037B50446D2 +:107C50004FF0FF310068FBF71BFE054620B9236A91 +:107C60000133236203B030BDFEF74EFF0346002808 +:107C7000F8D12A46194602480093FEF74BFF00BF91 +:107C800015010280036A013B13B503620068FBF72C +:107C900017FE044648B1FEF737FF034628B90146F0 +:107CA000009022460248FEF735FF02B010BD00BF2B +:107CB0001701028010B504460068FBF719FE204644 +:107CC00010BD1FB50446002310466A46CDE90033B7 +:107CD000231D029310230393FBF710FF206004B0D1 +:107CE00010BD10B504464FF6FF72FFF7EAFF2046BD +:107CF00010BD0068FBF71ABF10B504460068FBF71B +:107D000043FF204610BD08B1FAF7CCBC704710B550 +:107D1000044603690430984704F15400FFF796FFC6 +:107D2000002304F140006361012384F83D30BDE885 +:107D30001040FFF7DEBF00002DE9F047DDE90857EE +:107D4000994604466B07884692464FF0000118BFDB +:107D500025F007064FF0440200F178000CBF2E46D4 +:107D6000083612F001FDB5FA85F300214D442022BA +:107D70005B0904F11C006161AD1B84F83C3084F8A0 +:107D80003D1025F0070512F0EFFC064BC4F830A0BB +:107D9000002F08BF1F46E562A662A761C4F83480C1 +:107DA000BDE8F087C9C9010813B5049CCDE90034CA +:107DB00013460A460021FFF7BFFF02B010BD0000C6 +:107DC00084B0F8B500F15407044607AD384685E89D +:107DD0000E00FFF73BFF636913B994F83D3043B1E0 +:107DE0003846FFF74FFF6FF00300BDE8F84004B0DE +:107DF0007047A36A53B100232349E26AB3EB920FA1 +:107E000018D2A26A42F823100133F6E7E06A1F4B4A +:107E10001F49984294BF20F003004FF0FF30FFF756 +:107E20001DFBA0620028E6D13846FFF72BFF6FF05C +:107E30000400DAE74423261D636204F17803236219 +:107E400095E80F0086E80F0004F11802214611485A +:107E5000FCF7F2FA606190B994F83C302BB1A06A5B +:107E600008B1FFF7FFFA0023A3623846FFF70AFFC5 +:107E700004F14000FFF73DFF6FF00200B5E7384620 +:107E8000FFF700FF0020B0E7A52E5AE2FBFFFF7FBF +:107E9000C4DB01080F7D000870B500F154050446ED +:107EA0002846FFF7D3FE04F140006669FFF721FF83 +:107EB0000023636194F83D302BB100242846FFF77E +:107EC000E1FE204670BD012384F83D30002EF4D041 +:107ED0003046FCF7DDFA0446F0E700000C4B10B525 +:107EE00004460360FFF7D8FF94F83C302BB1A06A3A +:107EF00008B1FFF7B7FA0023A36204F15400FFF7BB +:107F0000D9FE04F14000FFF7F7FE204610BD00BF88 +:107F1000ECC9010810B50446FFF7E0FFBC2120467C +:107F2000FFF79EFA204610BD012000217047D0E9DE +:107F30000601704700487047F4C901082DE9F04F69 +:107F400085B0154604461F46DDE90E6AD0E904896E +:107F50000430FCF740FDAB1983462046009347EB05 +:107F60000A03019323689B6B9847DDE9002399423C +:107F700008BF904203D2002005B0BDE8F08F18EB97 +:107F800005032A462046029349EB0703039323681F +:107F9000DDE90289196B3B46B8EB0B0869F1000972 +:107FA000884702460B464046494614F009F81343F9 +:107FB000E1D1236818EB06062046196B49EB0A0A43 +:107FC000009B13F1FF32019B43F1FF3388470246C8 +:107FD0000B463046514613F0F3FF13430CBF01200C +:107FE0000020C9E7F0B590F8207085B0044615462A +:107FF0000391DDE90A6C7FB10768CDE9006CFF6B86 +:10800000B84748B1226933460399201D2A4405B078 +:10801000BDE8F040FCF732BD6FF47A6005B0F0BD0A +:10802000F0B590F8207085B0044615460391DDE95F +:108030000A6C7FB10768CDE9006C3F6CB84748B166 +:10804000226933460399201D2A4405B0BDE8F0405B +:10805000FCF738BD6FF47A6005B0F0BDF7B590F865 +:10806000201004461546DDE9086771B10168CDE9C5 +:108070000067496C884740B121693246201D294478 +:1080800003B0BDE8F040FCF7B3BD6FF47A6003B015 +:10809000F0BD08B590F8203023B10430FCF797FC10 +:1080A000002108BD1846FBE708B590F820301BB149 +:1080B0000430FCF794FC08BD4FF0FF30FBE708B537 +:1080C00090F820302BB101690430FCF782FC0021CC +:1080D00008BD1846FBE708B590F8203033B10169B8 +:1080E00004301144FCF775FC002108BD1846FBE77D +:1080F00090F820302DE9F347044603B9436204F1B8 +:10810000240959E8001F013149E80015002DF8D174 +:1081100001290BD104F1040801914046FCF762FCEF +:108120000199054630B14846FEF7C4FB284602B027 +:10813000BDE8F087D4E90420A36901919E18E369A2 +:1081400043EB00074046FCF748FC82464046FCF7FC +:1081500042FC002350440199BB4208BFB04205D203 +:1081600048466FF47A65FEF7A5FBDFE740460191CC +:10817000D4E90467FCF72FFC002301999F4208BF54 +:108180008642EDD3D4E90423134304D14046FCF7DF +:1081900022FCC4E90405D4E90623134311D1404667 +:1081A000FCF71BFC06464046FCF715FC0023821931 +:1081B000D4E9041043F10003511A63EB0000C4E951 +:1081C0000610012384F82030B0E790F8203010B575 +:1081D000044613B94362002010BD01212430FEF78C +:1081E00069FB0028F7D184F82000201DBDE810406D +:1081F000FCF720BC034B10B504460360FFF7E5FF16 +:10820000204610BD08CA010810B50446FFF7F2FF6A +:1082100028212046FFF724F9204610BD13B50C4C49 +:1082200004600024C0E90414013180F82040446255 +:10823000C0E90144C0E9062400D032B90023054852 +:1082400000941A461946FEF765FC02B010BD00BF47 +:1082500008CA01080101FF80012000217047D0F801 +:1082600060010021704700000048704754CA0108AF +:10827000D0E944017047FF2070472DE9F04F89B0E5 +:108280009046994605469DF84820C3469DF85030D3 +:1082900090F8FA71DDE915610591032A57D8DFE8F6 +:1082A00002F01B02190302270F2B4FF0000205F109 +:1082B000040A08BF95F8FD31114650460092039319 +:1082C0003B46CDE90122FCF7EFFE044638B109B088 +:1082D000BDE8F08F0327E7E74FF0FF3BE4E7059B9E +:1082E0004FF0FF329DF84C105046079307ABCDE995 +:1082F00000635B46FCF768FF3B4683462246214607 +:108300005046CDE90244CDE90044FCF7CDFE0028FB +:10831000DDD1BBF1000F01D05846D8E795F8010137 +:108320000028D4D0B9F1000F08BFB8F1040F04D170 +:10833000337843F00A033370EEE7B9F1000F08BF5A +:10834000B8F1020FE8D1337823F00403F3E74FF0DC +:10835000FF30BCE710B5044619461046D4F8183172 +:1083600001331AD104F5847201F03AFC431CD4F8AD +:10837000602109D020440121002390F854010842D3 +:1083800005D0723354F823201046D11710BD0133A5 +:108390004900042B49B2F2D1F6E74FF48050002196 +:1083A000F4E72DE9F04705689DF820C09DF824E02A +:1083B0009DF82880DDF82C90D0E90114DDE90C67E8 +:1083C0004FEA640A05EB6400E40744BF55F80A402D +:1083D0006158CDE90C67CDE90A89CDE908CEBDE841 +:1083E000F047084730B5039D00241C702C708C7832 +:1083F00014F0200F15D04A7AC0F8E02001221A703C +:108400000B7A03F01F0380F8FD310B7A5B119B00A0 +:1084100080F8FB31022380F8F93180F8FE3100202A +:1084200030BD102A0FDD0A7CD2060CD5CA7EC0F8FA +:10843000E02001221A702A708B7E03F01F0380F85F +:10844000FD318B7EE2E762060FD5CA7AC0F8E020E4 +:1084500001221A708B7A03F01F0380F8FD318B7AAA +:108460005B1180F8FB310223D7E70B7CDD070ED5CB +:10847000CB7DC0F8E0308B7D03F01F0380F8FD3129 +:108480008B7D5B115B0080F8FB310123C3E7E206C3 +:1084900009D5CB7BC0F8E0308B7B03F01F0380F85D +:1084A000FD318B7BEDE7E3070DD54B7BC0F8E0306A +:1084B0000B7B03F01F0380F8FD310B7B5B1180F811 +:1084C000FB310123A9E70323C0F8E030A7E72DE93A +:1084D000F7430A9E044615460C9FDDF83880DDF808 +:1084E0004090019100F07EF858B933462A46019930 +:1084F000201D0A97CDE90B8903B0BDE8F043FCF7D6 +:10850000C1BE03B0BDE8F0832DE9F04300238BB07A +:10851000814642F2107801240025002600278DF8BC +:1085200027300120FFF7EFFB0DF127034FF0FF325B +:10853000052104930023484600934FF0FF33CDE913 +:108540000645CDE90267FFF7C2FF9DF8273013F01B +:10855000010302D0B8F10108E3D183F001000BB0B0 +:10856000BDE8F083F0B500258BB004468DF82750A8 +:10857000FFF7CAFF18B94FF0FF300BB0F0BD00266F +:10858000002704954FF0FF3200954FF0FF3306218E +:108590002046CDE90667CDE90267FFF798FF05465B +:1085A0000028E8D12046FFF7AFFF0028E3D00122E2 +:1085B0000023052120460095CDE906230DF1270370 +:1085C0004FF0FF3204934FF0FF33CDE90267FFF71E +:1085D0007EFF0028CFD19DF8270080F0020040F3F5 +:1085E0004000CAE770B51D46D0F8F43086B00646A4 +:1085F000013317D0140E8DF81740FFF7B3FF70B991 +:1086000001234FF0FF32D6F8F41000930DF1170359 +:10861000CDE90100301DFCF735FE06B070BD4FF00E +:10862000FF30FAE790F8FA31032B0ED06B1C08BF2D +:10863000B2F1FF3F09D0002D08BFB2F1807F2CBFFF +:108640004FF0FF30002040B2E7E70020E5E72DE9DA +:10865000F04786B0904605460F46109BDDF83890EF +:1086600005934A460F9BFFF7BDFF044698BB95F85C +:10867000FD312E1D95F8F9210393304695F8FE3112 +:1086800095F8F811029395F8FB31CDE9002395F8A0 +:10869000FA31FCF709FD04468246E0B995F8FB2162 +:1086A00005AB39463046B2FA82F25209CDE9008371 +:1086B00052424B46FCF788FD044695F8FA31524683 +:1086C00051463046CDE902AACDE900AAFCF7ECFC00 +:1086D000002818BF0446204606B0BDE8F0872DE903 +:1086E000FF4100F1BC0804460D46174640461E46B1 +:1086F000FFF7ACFA2046DDE90A23CDE90076CDE9A3 +:1087000002232A46D4F8E010FFF7A1FF00284046D4 +:108710000CBF00246FF47A64FFF7B4FA204604B06B +:10872000BDE8F081F7B5089E1546099B0446324620 +:108730000A9F0191FFF756FF58B933464FF0FF32B9 +:108740000199201DCDE9085703B0BDE8F040FCF7C2 +:108750006ABD03B0F0BD30B587B00446154605913B +:10876000FFF740FF40B9034600902A460599CDE93E +:108770000100201DFCF786FD07B030BD2DE9F04F4C +:10878000054689B0884614461E4600F1BC09DDE95D +:108790001223134353D0D5F8F0714FF0000B20464D +:1087A00031463A465B4613F00BFC1299511804917E +:1087B00013994B410593DDE9040159454FF0000B36 +:1087C00008BFB84248462CBFBF1A129FBA46CDE92F +:1087D00006ABFFF73BFA2846FFF7C4FE10BB06AB1B +:1087E0004246022128460293CDE90046FFF79AFF50 +:1087F00000BBDDE906239B4508BF97421AD1E41967 +:10880000129B2846B84446EB0B06DB1B1293139BC6 +:1088100063EB0B031393FFF777FE70B14846FFF746 +:1088200031FAB4E7074C4846FFF72CFA204609B066 +:10883000BDE8F08F6FF47A64F5E7034CF3E70024AA +:10884000F4E700BF5CF0FFFF5DF0FFFF2DE9F04FA4 +:10885000164689B0044600F58472194630461F4614 +:10886000DDE912AB01F0BCF9231816EB0A08054646 +:1088700093F8543147EB0B090593D4E944234B4556 +:1088800008BF424504D2414C204609B0BDE8F08FF4 +:10889000236832462046196B3B46884702460B4602 +:1088A0003046394613F08CFB1343ECD118F1FF32FC +:1088B00023682046196B49F1FF33884702460B466F +:1088C0004046494613F07CFB1343DCD104F590731A +:1088D00004F1BC0906935AEA0B0354D0D4F81811DA +:1088E0004B1C43D1069B52460598CDE90253CDE976 +:1088F00000675B4601F092F904EB8000D0F8B811F4 +:10890000D0F8C831484698460791FFF79FF92046AE +:10891000FFF728FE68BB32463B4607992046CDE963 +:1089200000ABFFF718FF48BB16EB08064FF000033B +:1089300047F10007BAEB080A6BEB030B5AEA0B038B +:108940000CD004EBC503D3E95A23BB4208BFB242A3 +:108950003FBF0135631993F8543105932046FFF763 +:10896000D3FD70B14846FFF78DF9B4E74FF480535B +:10897000C8E7074C4846FFF785F985E76FF47A6446 +:10898000F8E7044CF6E700247EE700BF5BF0FFFF4A +:108990005CF0FFFF5DF0FFFF2DE9F04F91F83930FB +:1089A0008BB091F8382007461B0103F0100343EA0F +:1089B0001213082B54D019DC022B11DC93B10023C5 +:1089C000002400254FF0FF320493382100934FF02C +:1089D000FF33CDE90645CDE90245FFF778FD01E01B +:1089E000042B2ED000200BB0BDE8F08F102BF9D156 +:1089F0004FF001084FF0000909AC4FF0000A4FF0AA +:108A0000000B00254FF0FF324FF0FF336521049437 +:108A10000095CDE90689CDE902ABFFF758FD9DF839 +:108A200024304FF0FF32612103F07F03049400955E +:108A30008DF824304FF0FF33CDE90689CDE902AB44 +:108A400033E00023002400254FF0FF32049335214A +:108A500000934FF0FF33CDE90645CDE90245BCE771 +:108A60004FF001084FF0000909AE002400254FF037 +:108A7000000A0F4A002365210496CDF800A0CDE935 +:108A80000689CDE90245FFF722FD9DF82430084A0A +:108A9000712143F040030496CDF800A08DF82430F6 +:108AA0000023CDE90689CDE90245384695E700BFA8 +:108AB000030080002E4B9F21D0B51B788AB003267F +:108AC000002709AA8DF824300023044604924FF0B1 +:108AD000FF32ADF8253000934FF0FF33CDE9066744 +:108AE00000260027CDE90267FFF7F1FC00283CD102 +:108AF0009DF824309D2B1ED005D8012B1FD01F2B95 +:108B000028D00AB0D0BDBF2B12D0C22BF9D19DF80E +:108B100025300020202B84F8F0001FBF012384F8AB +:108B200000310323C4F8E4301523C4F8EC30E8E73F +:108B300084F80301E5E70123C4F8E430E1E79DF898 +:108B40002520022ADDD19DF82620202AD9D184F8BB +:108B50000131D6E79DF82530892BD2D13123C4F8D5 +:108B6000E830012384F80231CBE74FF0FF30C8E74B +:108B70005ACA01083F2A2DE9F04782468AB040F3DD +:108B8000A78091F83F3013F0400219D0032300254D +:108B90008AF8FA319AF8FA31032B0DD100220AF142 +:108BA00004001146CDE90222CDE90022FCF77CFA4F +:108BB000002818BF6FF47A6528460AB0BDE8F08730 +:108BC000D90710D50024002504924FF0FF330092FE +:108BD000B7214FF0FF32CDE90645CDE90245FFF759 +:108BE00076FC88BBD2E713F0020212D0FFF7BAFC82 +:108BF00000286BD1002200230490B721009050463A +:108C0000CDE90623CDE902234FF0FF324FF0FF33C9 +:108C1000E5E713F0100138D0012600270DF12704F5 +:108C20004FF000084FF000098DF8272000924FF018 +:108C3000FF334FF0FF32B5210494CDE90667CDE94B +:108C40000289FFF744FC08B1224DA3E79DF82730C5 +:108C5000504643F001038DF82730FFF783FC0546AB +:108C6000A0BB04904FF0FF324FF0FF33B1215046CC +:108C70000094CDE90689CDE90267FFF728FC0028BA +:108C8000E2D103238AF8FA3184E713F0080214D002 +:108C900080230022049117218DF827300023CDE98D +:108CA000062301220023CDE902230DF127034FF013 +:108CB000FF3200934FF0FF3391E713F004054FF0BC +:108CC0000203DFD0C521C0F8F41060E7024D61E770 +:108CD000002571E75EF0FFFF5CF0FFFFD0B50446B2 +:108CE00090F8020188B0F0B191F8343013F0080226 +:108CF00024D0002100284FF000034FF000004FF077 +:108D0000FF32049300934FF0FF33CDE90601CDE924 +:108D100002010CBFF02199212046FFF7D8FB28B1B2 +:108D2000164808B0D0BD91F83D30DFE72046FFF788 +:108D3000EBFB0028124818BF0020F2E7DB06EFD556 +:108D40000026002704924FF0FF33009266214FF077 +:108D5000FF322046CDE90667CDE90267FFF7B7FB92 +:108D60000028DDD14FF0FF324FF0FF3399210490FE +:108D70000090CDE90667CDE90267CDE75EF0FFFF21 +:108D80005DF0FFFFF0B5012289B000230026002727 +:108D90000C46049105210546CDE9062300234FF03A +:108DA000FF3200934FF0FF33CDE90267FFF78FFBEF +:108DB00098B9D5F8E430013B0FD0013400904FF062 +:108DC000FF32D5F8EC100494CDE90630CDE9026706 +:108DD0004FF0FF332846FFF77AFB09B0F0BDD0F81B +:108DE000E83001332DE9F047054688B08A461DD1A9 +:108DF000FFF7B8FB28B14FF0FF34204608B0BDE8BC +:108E0000F0870022002301210490CDF800A0CDE9D5 +:108E10000623D5F8E4304FF0FF32CDE902304FF0B1 +:108E2000FF332846FFF753FB0446E6E7FFF79AFBBC +:108E30000028E0D14FF000084FF00009012600277C +:108E400004904FF0FF324FF0FF3301212846CDF858 +:108E500000A0CDE90689CDE90267FFF738FB04469B +:108E60000028CAD12846FFF77DFB0028C3D10AF1AC +:108E700001014FF0FF324FF0FF3304940091D5F819 +:108E8000E810CDE90689CDE90267CAE73B4B1A78BD +:108E9000002373B5ADF801300446ADF8053090F805 +:108EA00002318DF800208DF804205BB991F83A303A +:108EB000C3F30213013B042B5AD8DFE803F0034B42 +:108EC000500303000123C4F8F830C4F8FC30D4F890 +:108ED000F830591C09D0D4F8FC104A1C05D002AA5D +:108EE000134401228A4003F8082C01A92046FFF709 +:108EF00049FF9DF806309DF802202046BDF800107D +:108F00001343BDF804209DF800600A4301A99DF8B1 +:108F10000150ADF804208DF80630FFF760FF2046C1 +:108F2000FFF7F2FA30B3002301A92046ADF8043070 +:108F30008DF80630FFF726FF9DF804301E409DF89F +:108F400005301D4056EA05030CBF4FF0FF300020EE +:108F500002B070BD0023C0F8F8300623B5E7072340 +:108F600000203E25C4E93E033F23C4E93A53AEE75F +:108F70000020EDE74FF0FF30EAE700BF5ACA0108D2 +:108F8000284B30B51B788BB005468DF82430002374 +:108F9000ADF82530FFF7B8FA18B94FF0FF300BB035 +:108FA00030BD95F803414CB1012C1FD02846FFF786 +:108FB000ABFA80F00100C0B24042F0E72846FFF76C +:108FC000D1FA0028E9D100220023049098210090D2 +:108FD0002846CDE90623CDE902234FF0FF324FF0BA +:108FE000FF33FFF774FA0028E0D0D6E709A9284636 +:108FF000FFF7C8FE0028D0D1D5F8F8307BB9D5F8F6 +:10900000FC309C4044F00304E4B29DF8243009A9EC +:1090100028461C408DF82440FFF7E1FEE3E70324D7 +:10902000F3E700BF5ACA0108204B002230B51B7875 +:1090300087B0044611468DF8143004300223ADF891 +:109040001520CDE90222CDE90022FCF72DF818B158 +:109050004FF0FF3007B030BD05A92046FFF792FE64 +:109060000028F5D19DF81630204643F002038DF814 +:109070001630FFF777FA0028EAD105A92046FFF756 +:10908000AEFE05460028E3D12046FFF73DFA002852 +:10909000DED005A92046ADF814508DF81650FFF724 +:1090A00071FE003818BF01204042D3E75ACA0108B8 +:1090B00084B02DE9F0439DB0044625AD299E85E896 +:1090C0000E0090F8023132682899002B7AD04FF0C8 +:1090D00024084FF0000908AB01272846039300231A +:1090E0000097CDE904894FF05A084FF00809CDE9FF +:1090F0000189884730B14FF0FF301DB0BDE8F04323 +:1091000004B070470C22002328462899CDE9042397 +:1091100014AB6022CDE902930023CDE900788847A3 +:1091200005460028E7D104F5847708A8394600F001 +:10913000BFFD0028DFDB394608A800F0B2FD00289B +:10914000D9DB716808A800F00FFD08A9C4F8F00188 +:109150002046FFF7C3FD0028CDD1394608A88DF879 +:109160001E508DF81F5000F00AFD0028C3DB0DF1E2 +:109170001F0308A9204600930DF11E037268FFF734 +:1091800031F99DF81E3093B194F8003113B12046A7 +:10919000FFF74AFF08A92046FFF778FE0028AAD16A +:1091A0009DF81F301BB108A92046FFF7F5FB94F886 +:1091B000F030A3B92046FFF7A7F980F00100C0B254 +:1091C00040429AE770680827CDE9040308A8039095 +:1091D0005A20CDE901070120009028469FE77268D8 +:1091E00008A92046FFF7C6FC0028E3D083E700006B +:1091F00010B586B004466846039180E80C0006A8C6 +:1092000000E90C0010E90700034B84E80700204642 +:10921000E36006B010BD00BFA38300082DE9F04F46 +:10922000D0F8B45093B0044655B1494A494BB5F112 +:10923000FF3F0CBF15461D46284613B0BDE8F08F12 +:1092400000F1BC09261D4846FEF700FD94F8FA31EE +:109250002A4629463046CDE90255CDE90055FBF7AF +:1092600023FF28B16FF47A654846FEF70BFDE3E76C +:1092700094F804320BB9C4F80052D4F800720137E4 +:10928000012FC4F80072EFD10023D4F8F411304656 +:1092900084F8FB3184F8FD31FBF73CFF05460028DC +:1092A000E0D12046FFF730F900284FD02046FFF7E5 +:1092B00001FC0028D6DB0DF11808DFF8A4B00EAED3 +:1092C00004F5847A21464046CDE90EB5C4E94255FD +:1092D00096E80C00C4E94855FFF78AFFCDF800A0D6 +:1092E00098E80F0000F01DFB002801DA1A4DBBE7DB +:1092F0000DF128082146CDE90EB5404696E80C0050 +:10930000FFF776FF0D9BCDF804A02046009398E868 +:109310000E00FFF7CDFE0028E8DB2B465A4621461B +:109320003046CDE904B5FFF763FFCDF800A096E81D +:109330000F0000F043FB0028D8DB2046FFF720FE9B +:1093400005460028D2D184F804728DE7034D8BE7DF +:109350005AF0FFFF59F0FFFF5EF0FFFF5DF0FFFFE7 +:109360007B820008F8B518480D46FBF7E5FAFEF7D2 +:109370006DFC164A1068092820DC154B1B68991EE5 +:109380001C4603F1120631F9027FAF4219D0B142F7 +:10939000F9D1143321460234B1F9006001360AD103 +:1093A0000D800130002410600748FBF7C5FAFEF776 +:1093B00069FC2046F8BD9C42ECD1F2E76FF0010455 +:1093C000F2E74FF0FF34EFE7001700242C170024DA +:1093D000281700247FB5294D0446BDF9286040F8C0 +:1093E000045B0B9DCDE90265BDF924500195BDF9E3 +:1093F000205000950025FBF719FE04F1BC00A4F8ED +:10940000B860FEF71BFC0C9B31462046C4F8F431D3 +:10941000C4F8005284F80452FFF7A4FF0021C4F8F6 +:10942000B40000204FF0FF330122C4F86051C4F8AB +:109430001831C4F8E830C4F8FC30C4F8282184F8A6 +:10944000545184F8FD5184F8FE5184F8F020C4E9A9 +:1094500044014FF400310320C4F8F8110221C4E99B +:109460003D33C4E938014FF0807335212046C4F8FC +:10947000EC10C4F8003104B070BD00BF68CA010828 +:1094800010B513480C46FBF757FAFEF7DFFB114BFC +:109490001B6803F114011A460233B2F90000A0421E +:1094A0000AD14FF6FF7313800B4A1368002B01DDBE +:1094B000013B1360002403E08B42ECD14FF0FF34FA +:1094C0000348FBF739FAFEF7DDFB204610BD00BF6D +:1094D00000170024281700242C170024F0B500F1F1 +:1094E000BC07044689B03846FEF7B0FB94F8045236 +:1094F0003DB93846C4F80052FEF7C4FB284609B00F +:10950000F0BDD4F80062013EC4F8006226B13846CE +:109510000025FEF7B7FBF1E70022002304212046D7 +:1095200004960096CDE90623CDE902234FF0FF33E0 +:109530004FF0FF32FEF7CBFF002884F80462384674 +:109540000CBF00256FF47A65FEF79CFBD4F8B430AD +:10955000002BD3D1B4F9B8102046FFF791FFCDE727 +:1095600008B51420FDF778FF4FF6FF71831E00F158 +:10957000120223F8021F9342FBD1014B186008BD71 +:10958000281700247047704790F820301BB14068BE +:1095900003681B6918476FF47A6070472DE9F04340 +:1095A00090F820C085B00446154698460391DDE941 +:1095B0000C67BCF1000F16D0CDE900670168D1F847 +:1095C0003C90C84778B1E3680399D4E90102046884 +:1095D000AA18CDE90C67646948EB0303A44605B0FB +:1095E000BDE8F04360476FF47A6005B0BDE8F083F2 +:1095F0002DE9F04390F820C085B004461546984602 +:109600000391DDE90C67BCF1000F16D0CDE90067CE +:109610000168D1F84090C84778B1E3680399D4E96C +:1096200001020468AA18CDE90C67A46948EB03039A +:10963000A44605B0BDE8F04360476FF47A6005B01A +:10964000BDE8F0832DE9F34190F82010044615465B +:109650009846DDE9086799B10168CDE90067496C72 +:10966000884768B1E368D4E901020168AA18CDE926 +:10967000086748EB0303C96902B0BDE8F041084739 +:109680006FF47A6002B0BDE8F08190F820301BB131 +:10969000406803685B6B18476FF47A607047D0E9E5 +:1096A00004017047D0E902017047D0E9042110B5E8 +:1096B000D0E90234981844EB010110BD007E7047D8 +:1096C000407E7047406810B103689B6C1847704734 +:1096D00010B504462821FDF7C3FE204610BD90F8C2 +:1096E00020301BB1406803685B6A184700200021E6 +:1096F000704790F820301BB1406803689B6A184798 +:1097000000200021704790F820301BB140680368AA +:10971000DB6A184700200021704790F8201030B411 +:1097200059B1D0E90114C0680D6812192D6B40EBD6 +:1097300003030846294630BC08470020002130BCFE +:10974000704790F820307BB100F11C0353E8002FE4 +:10975000013A43E800210029F8D12AB980F82020F5 +:1097600040680368DB681847002070472DE9F7431D +:1097700000F11C03064653E8002F013243E80025A0 +:10978000002DF8D1012A70D1706803689B68984752 +:10979000054660BB706803685B6A9847422838BF1B +:1097A00042200446FDF758FE07467068C4F5007273 +:1097B00003683946CDE90045D3F814802B46C047ED +:1097C000054688B9423C3C4494F84030552B50D172 +:1097D00094F84130AA2B4CD1737E04EB031313F899 +:1097E000102C520608D0244D3846FDF73BFE0023CE +:1097F00086F82030F36138E013F80C2C0F2A04D8D7 +:1098000048F22103D340DB07EDD470680368DB6ABC +:109810009847737EB0F5007F024603F1FF3338BFEF +:109820004FF4007204EB03131979317653F8080FE3 +:10983000FFF7A9FEA2FB0089C6E902895868FFF775 +:10984000A2FEA2FB002370680168C6E90423CDE9EB +:1098500000234246496C4B4688470028C3D0012369 +:10986000384686F82030FDF7FDFD284603B0BDE8F8 +:10987000F083024DB8E700BFE2F3FFFFE3F3FFFF21 +:1098800030B5084C00254276C0E900410021002493 +:109890000176C16180F82010C0E90245C0E90445A5 +:1098A00030BD00BFBCCA010810B5042206490446F9 +:1098B00010F03EFF28B96379012B02D1A079013065 +:1098C00010BD4FF0FF30FBE718CB01088378012B68 +:1098D00024D14268130EFF2B0ED10378812B0DD0BB +:1098E000842B12D043B922F07F420A60C2789200E2 +:1098F000502AA8BF50224A600020704722F07F42C1 +:109900008A61C3789B00CB61F6E722F07F42C1F801 +:10991000D020C3789B00C1F8D430EDE74FF0FF3082 +:1099200070472DE9F04F8FB0082400254FF05A09F9 +:1099300008AFA34687E80F000CAB002238460B990E +:10994000039301230294CDE90039CDE904450023B6 +:109950008847A84226DB0CA8FFF7A6FF061E23DBDC +:10996000A846AA460794B04522D0079B224638460F +:109970000B99CDF80490CDE9043A0CABCDE902B3D4 +:10998000012300932B468847002813DB18990CA865 +:10999000FFF79CFF002808DB083408F1010845F1B7 +:1099A0000005E0E74FF0FF3630460FB0BDE8F08F1E +:1099B0000020FAE74FF0FF30F7E700002DE9F04F05 +:1099C00091B006AC1A9D84E80F00AB690BB1E86951 +:1099D00078B9012300242B62D5E902326B6213F1BE +:1099E000FF3342F1FF32C5E91832204611B0BDE81D +:1099F000F08F5C49FDF732FD074600285AD0EB692D +:109A00004FF0000A082103902046CDE9043A5A237A +:109A1000CDE901310123099900935346AA6988478A +:109A200050453EDB3E780DF13008D5F81C9016F01D +:109A3000020694E80F0088E80F007AD1B9443C464A +:109A40000DF12F0A22460834A1452AD314F8063C0A +:109A50000120002114F805BC5268CDF80CA0CDE916 +:109A6000040103F00F019B094046029114F8071C02 +:109A70000093002301910F998847002811DB9DF87E +:109A80002F30760014F8082C1BEA030FF6B2237867 +:109A900018BF46F00106D20703F002034BD4002B97 +:109AA000D0D04FF0FF3440E001335200042BD2B24B +:109AB00033D13AE04FF0FF3497E7431C0A2B2B6277 +:109AC000EFDC6FF04C0A043405F1240E05F14C066E +:109AD00005F1600C0F210023AAEB050A226814F897 +:109AE000048B22F0FF0208F00F0802F5807201EAF1 +:109AF00008014EF8042B013A06F8018B13440AEBD7 +:109B0000060298464FEAE379904203F10103ECE83C +:109B10000289E3DC00230122AB6512EA0104C3D011 +:109B20003033002455F82330AB653846FDF79AFCF6 +:109B30005BE73C465646EA693A4421788807B0D547 +:109B400004F108039A42ACD3A078831C04EB83038E +:109B50009A42A6D394F801C0B445AED0C907A0D4A8 +:109B60001C46EAE7C4DB0108282981BF90F82800D9 +:109B700003110120984098BF4FF4807070474B68E4 +:109B80001C2BF0B524D9012301F1B00401F1C0066A +:109B90004FF0FF379C4644F8047B027F0CFA02F238 +:109BA000012AE2600CD9457F44F8045C8D6DAA421D +:109BB00000D305B98A6591F84C201A4381F84C20EE +:109BC0005B00B44200F10200DBB2E4D1002006E009 +:109BD0004078FF2808614FF0FF3018BF0020F0BD2B +:109BE000F0B504460D46D2E902018D4208BF844219 +:109BF00011D2136A7BB1012B0BD06032002083425B +:109C000009DDF2E80267AF4208BFA64202D2013086 +:109C1000F5E70020F0BD4FF0FF30FBE72DE9F04FF6 +:109C200089B003264FF00809159F059007F1A80B8E +:109C3000DDE9128ACDE9002318F1FF3306934AF1DA +:109C4000FF330793149B093307EBC307059B13EA04 +:109C5000090F1ED05BF8264000254046514622469B +:109C60002B4612F0ADF9134313D1DDE90023AB42CB +:109C700008BFA2420DD3069B1B190293079B6B41A1 +:109C80000393DDE90201D7E900238B4208BF82423A +:109C900003D2013E4FEA5909D8D2304609B0BDE897 +:109CA000F08F436800200133DB08C1E902307047C0 +:109CB00090F90700C017704742884378007843EA5C +:109CC000022340EA032070470B0A017043700B0C1B +:109CD000090E8370C1707047036A0239023B8B42E0 +:109CE00083BF4389406B01FB03000020704702469D +:109CF00000F10B01002012F8013B03EBC0138A4274 +:109D000003EB500303F0FF00F5D17047026810B574 +:109D100004465AB1114611F8013B1F2B11D93A2BB9 +:109D2000F9D11378303BD8B2092802D94FF0FF306F +:109D300006E002329142F9D1032B1846F6DC21608D +:109D400010BD014B1878FBE74417002438B50D46C9 +:109D5000044618B9092000232B6038BD0368002B86 +:109D6000F8D01A78002AF5D08188DA889142F1D1AA +:109D7000587802F0A5FF10F00100EBD12368EBE763 +:109D80000328CA7E8B7E08BF487D43EA022302BFB8 +:109D90000A7D42EA002243EA024318467047131242 +:109DA0008A76CB760378032B01BF120C0A75121248 +:109DB0004A75704738B5C378044613B9002528465C +:109DC00038BDD0E90E210123407802F0A5FF0546F9 +:109DD00080B9A16BE36A626ACB1AE0709342EDD25C +:109DE000A378022BEAD10A440123E16B607802F0E8 +:109DF00093FFE4E70125E2E738B5836B05460C469F +:109E00008B420FD0FFF7D6FF58B922460123E96BEA +:109E1000687802F063FF00281CBF4FF0FF34012078 +:109E2000AC6338BD0020FCE738B500230446C3709E +:109E30004FF0FF338363FFF7DFFF002851D1E46B5E +:109E4000237894F8FF5194F8FE01EB2B40EA0525A6 +:109E500003D01833DBB2012B3CD84AF655239D4280 +:109E600007D10822214904F1520010F061FC0028BA +:109E700036D0227BE37A43EA0223A3F50072B2F5DF +:109E8000606F27D8607B28B3591E421E0B400240EA +:109E900013431FD1E27BA37B53EA02231AD0237C16 +:109EA000013B012B16D8A27C637C53EA022311D01C +:109EB000227DE37C43EA02237F2B06D804F12000B5 +:109EC000FFF7FAFEB0F5803F04D3E27DA37D53EAAD +:109ED000022308D14AF6552085420CBF02200320F8 +:109EE00038BD0420FCE70020FAE700BF44CB01089E +:109EF00001292DE9F84304460E46174640F28380B7 +:109F0000036A8B427FD90378022B45D0032B5AD0AA +:109F1000012B78D101EB51098389C16AB9FBF3F3B5 +:109F20001944FFF769FF054660BBA38916F00106D7 +:109F3000E06B09F10108B9FBF3F203FB12920FBFCA +:109F4000FBB2835C03F00F013B011CBF03F0F00385 +:109F50000B4383540123E16A2046E370A389B8FBD5 +:109F6000F3F31944FFF748FF054658B9A389E16B9D +:109F7000B8FBF3F003FB10803EB1C7F307170F5493 +:109F80000123E3702846BDE8F8830B5CC7F3032781 +:109F900023F00F031F43F2E783895B08B1FBF3F360 +:109FA000C16A1944FFF728FF05460028EAD1A289B3 +:109FB0007600B6FBF2F302FB1366E36B9F5598192C +:109FC0003F124770DCE783899B08B1FBF3F3C16A5A +:109FD0001944FFF711FF05460028D3D1A389B60025 +:109FE00027F07047B6FBF3F103FB1161E66B0E44FB +:109FF0003046FFF761FE00F0704047EA000130464E +:10A00000FFF762FEBCE70225BCE70129F8B504466C +:10A010000E4664D9036A994261D20378022B30D08C +:10A02000032B45D0012B5AD101EB51058389C16A1D +:10A03000B5FBF3F31944FFF7DFFE10B14FF0FF302B +:10A04000F8BDA1896F1C2046B5FBF1F301FB135548 +:10A05000E36BB7FBF1F15D5DE36A1944FFF7CCFEFA +:10A060000028EBD1A289B7FBF2F302FB1373E26B7A +:10A07000D05CF30745EA00204CBF0009C0F30B0099 +:10A08000DEE783895B08B1FBF3F3C16A1944FFF78C +:10A09000B3FE0028D2D1A2897600B6FBF2F302FB10 +:10A0A0001366E36B9A19985D527840EA0220C7E77D +:10A0B00083899B08B1FBF3F3C16A1944FFF79CFE47 +:10A0C0000028BBD1A189B600B6FBF1F001FB1066F8 +:10A0D000E06B3044FFF7F0FD20F07040B0E7012066 +:10A0E000AEE7B1F5001FF8B504460D4601D30220D6 +:10A0F000F8BDCA06FBD1826806680161DAB9337817 +:10A10000022B01D9336BABB93389B3EB551FEED9B1 +:10A11000336BA361A3696261002BE8D0B289002090 +:10A12000B5FBF2F10B4402FB1151F56BA36129441D +:10A13000E161DDE71A467389B7895F43BD42114685 +:10A140000CD32068FFF761FF431C02460BD00128A7 +:10A15000CDD9336A8342CAD9ED1BEFE73046FFF70A +:10A16000BBFDA061D6E70120C2E72DE9F0418046A2 +:10A1700005680F4649B96E69C6B12B6AB34298BFEC +:10A180000126AB69A3B9002406E02846FFF73DFF8E +:10A190000128044603D801242046BDE8F081421C72 +:10A1A00051D02B6A8342F7D83E46EAE70126E8E71A +:10A1B000BE4215D12B6A741CD8F80000A34298BF88 +:10A1C00002242146FFF721FF0128E4D0431C3AD0A6 +:10A1D000D8B16B69012B03D92A6A934238BF1E4656 +:10A1E000344601342B6AA34202D8012ECBD9022473 +:10A1F0002146D8F80000FFF708FF40B10128CAD077 +:10A20000013020D0B442ECD1BDE7002CE8D04FF0B3 +:10A21000FF3221462846FFF76BFE90B957B92A6AEC +:10A22000AB69023A6C61934210D92B7943F0010378 +:10A230002B71B1E7224639462846FFF759FE002820 +:10A24000EDD00128A7D14FF0FF34A5E7013BAB616A +:10A25000EBE72DE9F3410C46064611460568012C53 +:10A2600047D92B6AA34244D94AB9A046214630684F +:10A270002746FFF7CAFE044658B9002006E04FF013 +:10A28000FF322846FFF734FE0028EED002B0BDE8CA +:10A29000F08101282DD0431C2DD0002239462846BC +:10A2A000FFF726FE0028F1D12A6AAB69023A9342F1 +:10A2B00005D20133AB612B7943F001032B717B1C79 +:10A2C000A34212D041462846FFF706FD39460090CA +:10A2D0002846FFF701FD6B89A0466A46013B042131 +:10A2E00018440190687802F041FD2B6AA342BDD862 +:10A2F000C3E70220CAE70120C8E770B50446FFF7AC +:10A3000059FD0546002840D12378032B35D1267905 +:10A31000012E32D10146A289E06B10F025FAE36BE1 +:10A3200055224121722083F8FE21AA2283F8FF21C1 +:10A330005223E26B137053706123D1709370E26B00 +:10A3400082F8E73182F8E40182F8E50182F8E6114B +:10A35000E06BA16900F5F470FFF7B6FCE06B616992 +:10A3600000F5F670FFF7B0FCA26A3346E16B0132EC +:10A370006078A26302F0D0FC25710022607811465B +:10A3800002F0F4FC003818BF012070BD2DE9F04741 +:10A390000027D0F8009006460C468F758369002B85 +:10A3A00000F09C80C36A013327D100232E251A4672 +:10A3B00043E002378046D9F81030D85B48B3B8F193 +:10A3C000000F05D100F520539BB2B3F5006FF0D319 +:10A3D00040F2B51140EA084002F018F9FF28C5F133 +:10A3E000FF0A0DD9BAF1010F12D963190212D875FB +:10A3F0009A7502231D440020DBE7B8463D46DAE7A4 +:10A4000030B1BAF1000F0DD0631998750123F1E74F +:10A410000025B8F1000F4FF0000318BF00252544B8 +:10A42000AB75C2E75546F4E70B2B03D81A46531C0D +:10A43000224451720B2814D00246F169501C895CE9 +:10A440002029F7D0052908BFE5210928ECD10B2BDD +:10A45000F2D804EB030703F101027D72E7D1134642 +:10A46000EAE7E21800215172A27D12BBBBB16FF086 +:10A47000080504F1090208202D1BAB1812F8011B76 +:10A4800081B12E298BB22BD0A3F14101192904D817 +:10A49000F169097B084200D020331373EDE73F23B5 +:10A4A000A3750123234400229A75F3691B7B03B92A +:10A4B0006372F369DB7A03F03F032372F16901F100 +:10A4C0001C00FFF7F9FB2060CA7D8B7D43EA022365 +:10A4D000E3804A7E0B7E43EA0223A380BDE8F08737 +:10A4E0001020DAE700232DE9F04F0B6087B00F460C +:10A4F0001646FFF70BFC051EC0F25B81B44B53F808 +:10A500002540002C00F057813C6006F0FE062378C1 +:10A510006BB1607802F0D4FBC10708D41EB110F013 +:10A52000040600D00A26304607B0BDE8F08F0023AD +:10A53000E8B22370607002F0C5FBC20700F13D81F4 +:10A540000EB14307EED404F10C020221607802F050 +:10A550000DFC064608B10126E5E7A089A0F50073C9 +:10A56000B3F5606FF7D8431E0342F4D1E36B002BC1 +:10A5700000F0F58000212046FFF756FC022840F04D +:10A58000FE80E56B02AF05F5E371B84605F20625DE +:10A590000846FFF791FB103148F8040B8D42F7D1C4 +:10A5A000002557F8041B002900F0E1802046FFF742 +:10A5B0003BFC012800F2DC80E56BB4F80C902A7BB0 +:10A5C000EB7A43EA0223994540F0DF80E87DA97DDC +:10A5D00051EA002104D105F12400FFF76DFB01468B +:10A5E000616295F810A0D4F838B00AF1FF3384F80E +:10A5F00002A0012B00F2C9806B7B6381002B00F06D +:10A60000C4805A1E1A4240F0C080AA7C95F811807E +:10A6100048EA02280FFA88F2A4F8088000924FEA6C +:10A620005912B8FBF2F702FB178292B2002A40F0EF +:10A63000AC802A7DE87C50EA022005D105F120009B +:10A640000193FFF739FB019B95F80FC0AA7B52EAF3 +:10A650000C2200F09A8001FB0AFC174407EB0C0E59 +:10A660007045C0F09280A0EB0E009842B0FBF3F76B +:10A67000C0F08B80574B9F4200F287804FF6F573F6 +:10A680009F4240F29C804FF0030A02375A440BEB82 +:10A690000E03BAF1030F2762C4F828B0E2626363C5 +:10A6A00075D195F82B2095F82A3043EA0223009AB9 +:10A6B0001A4313B2002B68D1BF0005F12C00FFF73D +:10A6C000FBFA206309F1FF331F44B7FBF9F9894511 +:10A6D0005BD84FF0FF33BAF1030FC4E905334FF0F5 +:10A6E0008003237130D195F8312095F8303043EA5A +:10A6F0000223012B28D10BF101012046FFF77CFB3F +:10A7000010BBE16B207191F8FF2191F8FE3143EA13 +:10A7100002234AF65522934216D10846FFF7CCFA97 +:10A720002D4B984210D101F5F270FFF7C5FA2B4B73 +:10A73000984209D101F5F470FFF7BEFAA06101F566 +:10A74000F670FFF7B9FA6061254A84F800A0138813 +:10A7500001339BB21380E3800023E361E3E602F060 +:10A76000ABFAE06300287FF405AF1126DBE6032097 +:10A770000135042D7FF415AF042806D1EBE604283B +:10A780003FF4E9AE01287FF617AF0D26CBE6B8F10E +:10A79000000FFAD0BAF1020F4FEA470362441ABF22 +:10A7A000DB1907F001071F46226318BF07EB5307A9 +:10A7B00088E70B26B7E60C26B5E60326B3E640F697 +:10A7C000F57A57458CBF4FF0020A4FF0010A5CE75B +:10A7D00034170024F5FFFF0F52526141727241613C +:10A7E000301700242DE9F34104460191FFF7E2FA06 +:10A7F000054600284DD101992046FFF76DFAA28940 +:10A800002946A0630746E06B0FF0AEFF6289A58979 +:10A810005543B5F5004F28BF4FF40045A389AB421F +:10A8200028D2284602F048FA804608B96D08F5E7B4 +:10A83000A3899D421ED92A4600210FF095FFA389C6 +:10A840000026B5FBF3F56389B34209D8404602F010 +:10A8500035FA6089801B18BF012002B0BDE8F08185 +:10A860002B46BA194146607802F056FA0028EDD11D +:10A870002E44E8E7E56B00266389B342E9D901235A +:10A88000BA192946607802F047FA0028E1D101366A +:10A89000F2E70120E1E72DE9F04107690446884627 +:10A8A00006682037B7F5001F24BF00238361836942 +:10A8B00083B1B289B7FBF2F002FB1072002A38D1E3 +:10A8C00001336169A36139B93389B3EB571F30D8BC +:10A8D0000023A36104200AE07389013B034228D1CD +:10A8E0003046FFF792FB0128054602D80220BDE85A +:10A8F000F081421C01D10120F9E7336A834212D86A +:10A90000B8F1000FE4D061692046FFF72EFC054640 +:10A91000D0B10128EAD0431CEDD001463046FFF704 +:10A9200061FF0028E7D1294630466561FFF7D4F979 +:10A93000A061B28900202761B7FBF2F302FB137319 +:10A94000F76B1F44E761D2E70720D0E7C16A4B1CD1 +:10A950002DE9F04104460568066918D1E5274FF056 +:10A960000108A1692846FFF747FA60B9E3691F703B +:10A9700085F803802369B3420DD201462046FFF7D4 +:10A980008AFF0028EDD0042808BF022003E0FFF76B +:10A99000A8FB0028E2D0BDE8F08100002DE9F04FCF +:10A9A000002185B00446D0F800A0FFF79AFB0746C7 +:10A9B000002840F092804FF0FF094FF0FF33C84667 +:10A9C000E3620093A1695046FFF716FA0746002894 +:10A9D00040F08380E5692E78002E00F08280EA7ACC +:10A9E000E52E02F03F03A37103D0100704D50F2B0F +:10A9F00004D0009BE36253E00F2B59D194F82B3025 +:10AA0000590643D4720649D5236906F0BF0695F866 +:10AA10000D90E3626B7B4B4542D1EA7EAB7E53EAFD +:10AA200002233DD12F780122DAF810B007F03F075A +:10AA30007B1E0D275F432C4B13F8011B681815F87C +:10AA40000180407848EA00286AB3FF2F039327D893 +:10AA5000404601F00FFE791C02903BF8170001916F +:10AA600001F008FE029A82421AD101994246039BE4 +:10AA70000F461E499942DFD12B785B0603D512B1F0 +:10AA80003BF8173063B9013E5FFA86F80021204693 +:10AA9000FFF701FF0746002894D01EE0B045B9D06B +:10AAA0004FF0FF08F2E74FF6FF718845E1D0F7E776 +:10AAB000B8F1000F04D12846FFF719F948450CD02A +:10AAC00094F82B7017F0010793D10B2204F12001A9 +:10AAD00028460FF02DFE00288BD1384605B0BDE882 +:10AAE000F08F0427F9E700BFE1CB0108EECB0108A6 +:10AAF0002DE9F04F036885B00646894600930B7830 +:10AB00002F2B01D05C2B09D14A4613789146013294 +:10AB10002F2BFAD05C2BF8D0002301E0009BDB69DF +:10AB2000B36099F800301F2B00F2138180230021BD +:10AB3000304686F82B3005B0BDE8F04FFFF7D1BAAC +:10AB40002F2811D05C280FD07F2806D80146A348B3 +:10AB500010F0D7F9002840F03D81FF2F00F03A8136 +:10AB60002BF817400137F8E049460B788946013148 +:10AB70002F2BFAD05C2BF8D01F2B8CBF0024042481 +:10AB8000F8E0022F04D1BBF802302E2B00F0F58044 +:10AB9000ABF102013FB131F81730202B01D02E2B41 +:10ABA00001D1013FF6E700232BF81730002F00F00A +:10ABB00011813BF81300194601332028F9D009B957 +:10ABC0002E2801D144F00304ABF1020333F817003F +:10ABD0002E2801D0013FF9D14FF020334FF0000A69 +:10ABE0007362D0463362C6F8273008233BF8115011 +:10ABF0004A1CADB1202D03D02E2D05D1BA4207D06D +:10AC000044F003041146F1E79A4504D2BA423AD11E +:10AC10000B2B2FD101E00B2B27D144F003040B2386 +:10AC200096F82020E52A04BF052286F82020082B6C +:10AC300004BF4FEA88085FFA88F808F00C030C2B71 +:10AC400003D008F00303032B01D144F00204A00752 +:10AC500000F1A88018F0010F18BF44F0100418F09C +:10AC6000040F18BF44F008049CE0BA4202D044F03C +:10AC70000304D5D84FEA88083A460B234FF0080A58 +:10AC80005FFA88F8BEE77F2D15D9284640F2B51146 +:10AC9000CDE9022344F00203019301F0B7FC10F068 +:10ACA000800F0546DDE9022316D000F07F054C49F0 +:10ACB0004D5D019C45B329464A48CDE9012310F07A +:10ACC00020F9DDE90123F8B9A5F1410189B219297B +:10ACD0001ED848F0020810E0FF28EAD9591E8A451C +:10ACE00003D344F003049A468CE706EB0A010012F2 +:10ACF0000AF1010A019C81F8200006EB0A010AF121 +:10AD0000010A81F820507DE744F003045F25F4E751 +:10AD1000A5F1610189B219299EBF203D48F00108C3 +:10AD2000ADB2EAE7002A08BF052050E05A074ED42A +:10AD3000B379DB0650D5009B32699989B2FBF1F3F8 +:10AD400001FB1323009AD16B10781944FFF718F810 +:10AD5000B06033680027D3F810B019F8010B40B188 +:10AD600040F2B51101F072FC044698B31F283FF67B +:10AD7000E7AE0424012F7FF404AFBBF800302E2B84 +:10AD80007FF406AF002306F120022BF817309F4214 +:10AD90008CBF2E21202101330B2B02F8011BF6D191 +:10ADA00044F02004304686F82B40FFF7F7FD96F874 +:10ADB0002B300028BAD0042809D1990603F00402E8 +:10ADC000B0D5002AC5D08023002086F82B3005B0EE +:10ADD000BDE8F08F0620FAE70520F8E71DCB010853 +:10ADE00061CB010826CB01082DE9F04F90F82BB07C +:10ADF00089B004461BF0A00540F0928007683B69CB +:10AE000033F815200AB10135FAE704F120060DF1F7 +:10AE1000140A1BF0010F96E807008AE8070000F00B +:10AE2000868040234FF0010884F82B30B4463B69FC +:10AE3000B8F1050F9AE80700ACE803002CF8022BE4 +:10AE40004FEA12428CF8002015D9991E424631F87B +:10AE5000020F88B14FF0100C00F0010E40080EEB0D +:10AE60004202D30344BF82F4883282F02102BCF153 +:10AE7000010CF1D1EBE742460DF1130C072102F072 +:10AE80000F0E914612090EF13000392888BF0EF1DD +:10AE9000370001390CF8010902D0B9F10F0FEED8D3 +:10AEA00008AB7E205A1802F8140C04F11F0000228F +:10AEB0008446914206D01CF801EF02F10109BEF16F +:10AEC000200F20D1072902F1010297BF08AB4FF0F4 +:10AED000200C03EB010C013198BF1CF814CC072A9D +:10AEE00000F802C0EED92046FFF758FD8146D0B9E0 +:10AEF00008F10108B8F1640F98D14FF007094846EE +:10AF000009B0BDE8F08F4A46D3E7804601212046CC +:10AF1000FFF7C1FC8146F8B1B9F1040FEDD0EEE7BF +:10AF20004FF00609EBE70428E9D184F82BB01BF0B9 +:10AF3000020F4FF000012046D4F800A01BBF0C35D3 +:10AF40000D230125B5FBF3F518BF0135FFF7C9F84F +:10AF500081460028E0D18046A1695046FEF74CFFAB +:10AF600081460028D8D1E3691B78E52B01D0002B5E +:10AF7000CBD108F101084545C8D1013D55D0216923 +:10AF80002046A1EB4511FFF7ACF881460028B6D169 +:10AF90004FF6FF783046FEF7AAFE0190A1693846C9 +:10AFA000FEF72AFF81460028A9D1E369E9B2019A98 +:10AFB0004FF00D0CD7F810E05A734FF00F02DFF886 +:10AFC000A8A0DA724A1E18730CFB02F28446987627 +:10AFD000D87640451AF8019B0CF1010C18BF3EF8D9 +:10AFE000120003EB090B18BF013203F809004FEA06 +:10AFF0002029002808BF4046BCF10D0F8BF80190B6 +:10B00000E7D1404502D03EF812200AB941F0400194 +:10B010001970012300212046FB70FFF73CFC81469C +:10B0200000287FF46CAF013DB8D1A1693846FEF726 +:10B03000E3FE814600287FF462AF20224946E069A2 +:10B040000FF092FBE36903CE18605960B278318843 +:10B050009A72198194F82B30E26903F01803137384 +:10B060000123FB704BE700BFE1CB01082DE9F84F4E +:10B07000FF270646D0F8008004253C464FF6FF79AE +:10B08000B169002972D04046FEF7B6FE0546002899 +:10B0900055D1F0690378002B6BD0C27AE52B02F012 +:10B0A0003F02B27150D02E2B4ED022F02001082941 +:10B0B0004AD00F2A4DD1590644D503F0BF04336955 +:10B0C000477BF362437BBB423ED1C27E837E43EA31 +:10B0D00002230FFA83FCBBBB03780D22D8F8105073 +:10B0E000012123F04003DFF890E0013B53431EF8B9 +:10B0F00001AB00EB0A0292F801B010F80A2042EA14 +:10B100000B2219B3FF2B1FD825F81320114601334A +:10B110000CF1010CBCF10D0FE9D10278520605D5F6 +:10B1200021B1FF2B10D8002225F81320013CE4B2F6 +:10B1300000213046FFF7AFFB05460028A0D00023D2 +:10B14000B3610CE0A342BDD0FF24F1E74A45DFD054 +:10B15000FAE73CB9FEF7CBFDB84203D100252846FB +:10B16000BDE8F88F4FF0FF33F362F8E7002DF5D01C +:10B17000E5E70425E3E700BFE1CB01087FB5CDE9B2 +:10B18000001003A814460391FEF7C0FD051E19DB4D +:10B190000D4E56F8252022B10023D06B137001F01C +:10B1A0008DFD019B13B100221A70DA6346F8253039 +:10B1B0002CB1002201A96846FFF794F90446204605 +:10B1C00004B070BD0B24FAE7341700242DE9F043D6 +:10B1D00091B0164605460191002800F0D58002F096 +:10B1E0003F0703A901A83A46FFF77CF9002840F081 +:10B1F000C980039B4FF40070049301F05DFD80460D +:10B20000002800F0C380039B0199186104A8FFF790 +:10B210006FFC044620B99DF93B30002BB8BF0624D3 +:10B2200016F01C0F75D0002C48D0042C3CD104A87B +:10B23000FFF7DAFD0446002836D147F0080701F091 +:10B240001CFD014600900B980E30FEF73DFD0B985B +:10B2500000991630FEF738FD039C0B992078FEF715 +:10B260008FFD202300220646CB7220460B99FEF765 +:10B2700096FD0B9B002201211A775A779A77DA778D +:10B28000039BD9701EB3314604A8D3F83890FEF75B +:10B29000E0FF044640B949460398FEF7ADFD013E84 +:10B2A000039B04465E6190B1404601F007FD0CB17E +:10B2B00000232B60204611B0BDE8F0839DF81630C6 +:10B2C00013F0110F2FD1700756D43107B7D4039C58 +:10B2D00039070B9EA36B48BF47F0400731466E62AB +:10B2E0002B622078FEF74CFD0146A86006F11C0099 +:10B2F000FEF7E2FCE388BA060646AB804FF0000397 +:10B30000E8602C602F746B74EB616B610DD40024CA +:10B31000CAE7002CC8D19DF81630DA062ED4B4073F +:10B32000D5D5D807D3D50724BEE70028EFD0638949 +:10B33000A48968615C43B4421AD22868361BFEF7C0 +:10B3400064FE0128014615D9431CF4D10124A961EA +:10B35000002CA9D103988389B6FBF3F203FB126694 +:10B36000002ED4D0FEF7B8FC50B11044E8619BE742 +:10B370000024ECE70224EAE7082495E7042493E795 +:10B38000022491E7044693E7092493E7112491E707 +:10B390002DE9F04F994685B00023884603A904465D +:10B3A000C9F800301746FEF7D1FC064618BB667C8C +:10B3B0000EBB94F810A01AF00103019300F08D80E9 +:10B3C000E2686369D21A974228BF17469FB1039873 +:10B3D00062698389B2FBF3F103FB1123002B5ED179 +:10B3E0004389013B0B40009315D142B9A068012865 +:10B3F0000AD802266674304605B0BDE8F08FA16910 +:10B400002068FEF702FEF2E7431C03D10123019EF0 +:10B410006374F0E7A061DDF80CB0A1695846FEF74F +:10B420005BFC0028E5D0009B1D18BBF80C30BB422C +:10B4300034D8BBF80A209BF80100B7FBF3FA009B55 +:10B4400003EB0A019142414688BFA2EB030A2A4658 +:10B45000534601F043FC0028D8D1DDF80CB09BF82E +:10B46000032062B1DBF83800401B504507D2BBF81F +:10B470000C20DBF83C1002FB00800FF067F9BBF8F2 +:10B480000C500AFB05F5D9F800307F1BA8442B446B +:10B49000C9F8003063692B44636197E7E56103985D +:10B4A00063698589E169B3FBF5F205FB1232AD1AD8 +:10B4B000BD4228BF3D46FEF79FFC0028A6D1039A57 +:10B4C00060699189B0FBF1F301FB1303D16B404636 +:10B4D0002A4619440FF03AF9D5E707268BE7F7B566 +:10B4E00001A90546FEF732FC044660BB2C7C14F033 +:10B4F000400428D001F0C1FB296A07460198FEF7F5 +:10B500007BFC0446F8B96E6AF37A314643F02003B7 +:10B51000F372AA682868FEF742FCE96806F11C008D +:10B52000FEF7D2FB394606F11600FEF7CDFB0123EC +:10B530000198B474F474C370FEF7DFFE2B7C0446EC +:10B5400023F040032B74204603B0F0BD2DE9F04FEB +:10B55000994685B00023884603A90446C9F80030FF +:10B560001646FEF7F3FB054648BB657C3DBB237CD6 +:10B570009A0740F1BD8063694FF0000BF34228BF8A +:10B58000DE43002E00F0A880039862698389B2FB35 +:10B59000F3F103FB1123002B7CD14789013F0F40BE +:10B5A0001BD182B9A06830B901462046FEF7DDFD07 +:10B5B000002800F09180012807D1022565742846F3 +:10B5C00005B0BDE8F08FA169EFE7431C01D101256B +:10B5D000F4E7A368A06103B9A0600398E369826BF4 +:10B5E0009A4244D0DDF80CA0A1695046FEF774FBE6 +:10B5F0000028E2D0BAF80C303A18B3423CD89AF896 +:10B6000001000192B6FBF3FBBAF80A3007EB0B011D +:10B610009942414688BFA3EB070B5B4601F07CFBD8 +:10B6200007460028D3D1039B019A996B891A594583 +:10B6300007D29A89D86B02FB01810FF087F8039B30 +:10B64000DF70039B9F890BFB07F74FF0010BD9F8C5 +:10B650000030F61B6269B8443B441744C9F8003017 +:10B66000E3686761BB422CBFE360E76089E7FEF7F0 +:10B67000A1FB0028B6D0AAE76169E368994208D324 +:10B6800050460192FEF796FB0028A0D1039B019A39 +:10B690009A63E261039863698789E169B3FBF7F212 +:10B6A00007FB1232BF1AB74228BF3746FEF7A4FB8A +:10B6B00000288CD1039A61699089B1FBF0F300FBFB +:10B6C0001313D06B41463A4618440FF03FF8039BE2 +:10B6D0004FF00102DA70BAE7237C43F04003237491 +:10B6E000BBF1000F3FF46BAF2046FFF7F8FE66E7B3 +:10B6F000072564E713B50446FFF7F1FE28B901A951 +:10B700002046FEF723FB00B9206002B010BD2DE9F2 +:10B71000F3410D4601A90446FEF718FB0646002832 +:10B7200063D1667C002E60D1E368AB4204D2227CF8 +:10B7300012F0020F08BF1D46002263696261B5B9AD +:10B740000020E2686369934281BF227CE36042F09B +:10B7500040022274019A9189B3FBF1F201FB12338A +:10B76000002B42D0E369834218BFE0613DE0019ABB +:10B77000518997894F4373B3013B6A1EB3FBF7F1BD +:10B78000B2FBF7F28A4226D37A42A1691340ED1A3E +:10B7900063610029D4D0BD4263690CD93B44A5EB59 +:10B7A00007086361237C9A072AD52046FEF7DDFC53 +:10B7B000054648BB0146636901982B446361838950 +:10B7C000B5FBF3F203FB1255002DB9D0FEF784FA56 +:10B7D00048B11044B5E7A16881B92046FEF7C5FC21 +:10B7E0000128014605D102266674304602B0BDE844 +:10B7F000F081481C01D10126F6E7A160A161C8E7EC +:10B800002068FEF702FC05466B1CF4D0012DEAD936 +:10B81000019B1B6AAB42E6D92946A5614546BAE7BA +:10B820007FB50546019100283AD0002203A901A85E +:10B83000FEF758FE044650BB039B4FF400702B608C +:10B8400001F03AFA064668B3039B0199186128464D +:10B85000FFF74EF90446A0B995F92B30002B08DB11 +:10B86000AB79DB0618D5039BE9691878FEF788FAEF +:10B87000A860039B00212846DB88AB80FEF731FCE3 +:10B880000446304601F01AFA042C07D00CB100230C +:10B890002B60204604B070BD0524F2E70524F6E7CE +:10B8A0000924F6E71124F4E713B501A90446FEF7CD +:10B8B0004DFA00B9206002B010BD2DE9F3410F46EA +:10B8C00001A90546FEF742FA044628B947B90146E0 +:10B8D0002846FEF706FC0446204602B0BDE8F0818B +:10B8E0004FF4007001F0E8F90646C0B1019B186101 +:10B8F0002846FFF7BBFB10F0FB0804460BD1394686 +:10B900002846FEF743FD41462846FEF7C4FF0428BB +:10B9100014BF04460024304601F0D0F9DCE71124BE +:10B92000DAE770B58EB00E460022019002A901A898 +:10B93000FEF7D8FD0446C8B94FF4007001F0BCF919 +:10B940000546C0B1029B0199186102A8FFF7D0F823 +:10B95000044640B99DF93330002B0ADB1EB1314655 +:10B9600002A8FEF713FD284601F0A8F920460EB004 +:10B9700070BD0624F7E71124F8E72DE9F04385B000 +:10B980000F4616460022019003A901A8FEF7AAFD62 +:10B99000044648B9039DD5F82080AB69A8F102029E +:10B9A0003560934204D83B60204605B0BDE8F08383 +:10B9B0002B78012B1AD14FF0020806464146284643 +:10B9C000FEF723FB431C40D0012840D000B90136CC +:10B9D000039B08F101081B6A4345EFD8039B3E60B7 +:10B9E0001A799E6142F001021A71DDE7E96A0646A2 +:10B9F000054635B9039801F10109FEF7FDF940BB91 +:10BA00004946DDF80C9099F80020D9F83C30022A1C +:10BA100003EB050010D15B5D0235427853EA022347 +:10BA200008BF0136B9F80C30B8F10108B5FBF3F2E4 +:10BA300003FB1255DDD1D1E7FEF73EF930F070433C +:10BA400005F1040508BF0136ECE70124ACE7022448 +:10BA5000AAE70446A8E773B501A90646FEF776F9FA +:10BA60000446C0B9747CB4B9337C9A072DD5756986 +:10BA7000F3689D420FD28DB92246B1683046FEF779 +:10BA8000E8FB0446B5607369F360337C43F0400320 +:10BA9000337404B17474204602B070BDB16930686B +:10BAA000FEF7B3FA431C01460BD001280BD0019BD3 +:10BAB0001B6A8342E7D9B2693046FEF7CAFB0446E7 +:10BAC000E1E70124DFE70224DDE70724E3E72DE9CE +:10BAD000F0419CB00222019003A901A8FEF702FDEB +:10BAE0000446F8B9039B4FF40070049301F0E4F8A6 +:10BAF000054600284FD0039B0199186104A8FEF762 +:10BB0000F7FF044658B99DF83B309A0641D41B060E +:10BB10003FD49DF8168018F0010F07D0072428465F +:10BB200001F0CCF820461CB0BDE8F081039F0B99D2 +:10BB30003878FEF725F918F0100F06460BD104A847 +:10BB4000FEF704FF04460028E9D1CEB90398FEF7BA +:10BB5000D4FB0446E3E7FB698342DFD02146129021 +:10BB600010A81097FEF7BDFA04460028D7D110A8F8 +:10BB7000FFF77CFA04460028D0D00428CFD1DEE7B6 +:10BB80000246314604A8FEF764FB04460028C6D1ED +:10BB9000DCE70624C3E71124C4E7F0B595B0022220 +:10BBA000019003A901A8FEF79DFC044600287BD163 +:10BBB000039B4FF40070089301F07EF805460028BF +:10BBC00000F08380039B0199186108A8FEF790FF9D +:10BBD0000446002875D0042863D19DF84B1011F05D +:10BBE000200170D1039B04A80493FEF7BEFA04461B +:10BBF00000285CD001285CD0431C5F425F4101F00B +:10BC00003CF80646002F56D121460398FEF7EAFD80 +:10BC1000002850D1039B4FF020321021DB6B1A60BB +:10BC20005A60C3F807202E22039BDB6B1A70039B1C +:10BC3000DA6BD1723146D86B1630FEF745F80398AF +:10BC40002246C16BFEF7ABF80398C36B03F12002E9 +:10BC5000114653F8047B934241F8047BF9D1C36B3E +:10BC60002E22012783F82120C16B0A9A2031FEF78A +:10BC700096F8039B08A8DF70FFF7B6F8D8B90F98BD +:10BC800031461630FEF720F8224603980F99FEF74A +:10BC900086F80F9B10220398DA72C770FEF72DFB0F +:10BCA0000446284601F00AF8204615B0F0BD0727E3 +:10BCB000A5E70227A3E70022214604A8FEF7C9FA58 +:10BCC000EEE70824EDE70624EBE71124ECE770B576 +:10BCD000A4B0CDE900106846FEF718F80028C0F2BD +:10BCE0009F80022203A901A8FEF7FCFB044600285E +:10BCF00040F08F80039B4FF400700C9300F0DCFF4A +:10BD00000546002800F08E80039B019918610CA85D +:10BD1000FEF7EEFE0446002878D19DF85B3013F064 +:10BD2000A00F79D1139B04AC03F1200618680833E7 +:10BD300053F8041C2246B34203C21446F6D10CAE9B +:10BD400018AC0FCE0FC40FCE0FC496E80F0084E8D6 +:10BD50000F00009918A8FEF7CBFE044648B91A9ABE +:10BD60000E9B9A4203D11C9A109B9A4203D008243E +:10BD70004CE004284AD118A8FFF736F804460028FA +:10BD800044D11F990DF11D030DF12D0001F10D029C +:10BD900053F8044B834242F8044BF9D1188801262A +:10BDA00010809B7893709DF81B30039CDA0658BF77 +:10BDB00043F02003CB72E670CB7ADB061DD50E9ADA +:10BDC0001A9B9A4219D02078FDF7DAFF01462046E7 +:10BDD000FDF782FF014608B32046FEF70DF8044642 +:10BDE000A0B90398C16B91F821302E2B05D11A9A76 +:10BDF0002031FDF7D4FF039BDE700CA8FEF7A6FDF3 +:10BE0000044618B90398FEF778FA0446284600F06D +:10BE100055FF204624B070BD0624F7E70224F5E75D +:10BE20000B24F6E71124F4E72DE9F04F2DED028BFA +:10BE300091B00C461F46099009A80092FDF766FFD5 +:10BE40000028C0F26983974B53F820300BB10022D1 +:10BE50001A70C5B2944B2846002C08BF1C4600F04F +:10BE600031FFC20700F15A83430700F15983636829 +:10BE70000B933BB90BAA0321284600F077FF08B1CA +:10BE800001230B930B9A531EB3F5004F01D21A42B4 +:10BE900001D001230B930DF12A020221284600F064 +:10BEA00065FF08B1012532E0BDF82A90A9F50073BD +:10BEB000B3F5606FF6D809F1FF3313EA090FF1D13A +:10BEC0006378D4F808800293013B012B029B88BF62 +:10BED0000123029308F1FF33B3F5004F1DD24FEA5F +:10BEE0005912B8FBF2F302FB1383002B18BF4FF477 +:10BEF0000078E668B6F1807F12D8731E334218BF0F +:10BF00000026B945B7FBF9F306930BD9112528464E +:10BF100011B0BDEC028BBDE8F08F4FF40078E8E77C +:10BF20000026EEE7009B94F800A0B3B9069B03FB44 +:10BF300009F000F0C1FE04460028E7D000230CAA57 +:10BF4000012128460C9300F011FF40B1009B002B0B +:10BF5000A8D1204600F0B2FEA4E7009CEEE71AF05C +:10BF6000080307930FD10C9B3F2B0ED93F3B3F2774 +:10BF70000C930C9B7F2B0AD8009B13B9204600F032 +:10BF80009DFE0E25C3E70746F3E7079FF1E7B6FBE3 +:10BF9000F9F3802B0AF0010628BF80231AF0020271 +:10BFA00019D0C6F10306F6B20392019300F065FEC4 +:10BFB000032EDDF83090019B039A089055D1A3B968 +:10BFC0004FEA59463949012331F8020B70B1B042AA +:10BFD00025D85B00F8E736B9009B13B9204600F07E +:10BFE0006DFE132593E70226DEE71846BDF82AC04A +:10BFF000B9FBF3F10CEB8106A1F57F410736F63969 +:10C00000B6FBFCF603962A4EB142B5D800211E4677 +:10C010004FF0200A03464FF0030B0591ABE20020DE +:10C02000E4E70298B1FBF0FC00FB1C1CBCF1000F24 +:10C0300005D0019801390AF1010A013001900298F6 +:10C04000B1FBF0F1039808440390B3E2BBF1020F97 +:10C0500032D14FF6F5710498884217D9002B40F081 +:10C06000CF827300402B00F25D82002B40F0608293 +:10C070004FEA193C0F49012631F8020B002800F065 +:10C080005882604500F255827600F5E740F6F5717A +:10C090000498884218D8002B7FF46EAF7300802B71 +:10C0A000E3D969E7341700240CCC0108FCCB010864 +:10C0B000FFFFFE0FEECB010840F6F573049A9A429B +:10C0C0003FF65AAF4FF0010B09F1FF330EAA0421DE +:10C0D00028463B440E970F9300F048FEBDF82A20F7 +:10C0E000002120460EF040FBBD4BBBF1030F84F84E +:10C0F0000EA01A684FEA2A2A08BF4FF0000866739C +:10C1000022605A680C9962601A89B1F5803F9B7A67 +:10C1100084F811804FEA2828A372BDF82A302281C2 +:10C12000E3724FEA232384F80FA02373029B84F861 +:10C130001280237480F0C181E17409122175089B7B +:10C140000022394604F11C004B446276E27699469F +:10C15000F82363753F232376FF23A376FDF7B4FD11 +:10C16000BBF1030F494640F0AD8104F14300FDF7F8 +:10C17000ABFD039904F12400FDF7A6FD022384F82A +:10C180002D2084F82C30012384F82E2084F83030C0 +:10C19000062384F82F2084F83230802384F831205D +:10C1A00084F84030292384F8332004F1470284F8CE +:10C1B00042308C4B03F1100153F8040B8B4242F8D0 +:10C1C000040BF9D119884FF0550A9B784FF0AA0952 +:10C1D000118028469370214601233A4684F8FEA137 +:10C1E00084F8FF9100F098FD804600287FF4AEAE01 +:10C1F000BBF1030F3AD10123BA1D2146284600F0B6 +:10C200008BFDBDF82A20414620460EF0ADFA5223A0 +:10C2100041227221237004F5F47063706123E2708F +:10C22000A37084F8E731049B84F8E41184F8E511E5 +:10C23000591E84F8E621FDF747FD0223FA1D214629 +:10C2400084F8EC312846012384F8ED8184F8EE81EE +:10C2500084F8EF8184F8FEA184F8FF9100F05CFD82 +:10C26000012321462846FA1800F056FD069B0021BE +:10C27000BDF82A2020464FF0000AFF275A430EF04F +:10C2800073FABBF1010F584B18BF6FF0070308EEAC +:10C29000103ABBF1030F40F02F816FF00703677076 +:10C2A000A77023704FF00F03E77027716771A771B4 +:10C2B000E77127726772A772E372DDF80C80069B44 +:10C2C0002146019A2846434528BF4346994600F037 +:10C2D00023FD014600287FF439AEBDF82A20204610 +:10C2E0000EF042FA019BB8EB09084B440193E6D1EA +:10C2F0000AF10103029A4FF0010A9A42C9D8059B3C +:10C30000BBF1030F18BF1E46069B2146019A284623 +:10C31000B34228BF33461F4600F0FEFC00287FF4DE +:10C3200015AE019BF61B3B440193EDD1BBF1030F0E +:10C3300000F0E8800C9BB3F5803F80F0E680BBF115 +:10C34000020F0CBF4FF0040A4FF0010A079B002BAD +:10C3500040F0A2800C9B0DAA012128460E93079B5A +:10C360000F9300F003FD00287FF4F0ADDDF834906A +:10C3700005234FF008084FF63E42B9FBF8F1914211 +:10C3800007D94FEA4808013B5FFA88F8F5D14FF02A +:10C39000FF084FF480520021204604F5E3760EF0AA +:10C3A000E3F9642304F5FB72B9FBF3F302923F2235 +:10C3B00001930EAB93464A455FD253F8047B642F3A +:10C3C00003D816BF01994F464F43D0192CBF012106 +:10C3D000002181450AD3002900F09A8006E000BFC1 +:10C3E0002DCB010839CB0108F8FFFF00A9EB0207AC +:10C3F000114630460393FDF767FC3946301DFDF7C3 +:10C4000063FC029B06F804ACB342039BB2FBFBF156 +:10C41000B1FBF8F008FB101CC1EB811106F8050C0C +:10C42000A2EB010106F807CC4FEA900C3A4401F167 +:10C4300001012CF03F0C41EA0C0106F8061C02F148 +:10C44000FF31B1FBFBF7B7FBF8F008FB107CC7EB43 +:10C45000871706F8010CA1EB07014FEA900706F8D1 +:10C4600003CC01F1010127F03F0741EA070106F87B +:10C47000021C02D01036002A9DD1552300222146ED +:10C48000284684F8FE31AA2384F8FF31012300F006 +:10C4900043FC00287FF45AAD00222846114600F0E4 +:10C4A00065FC009B054600287FF451AD002B7FF40E +:10C4B0002EAD204600F002FC29E504F12000FDF736 +:10C4C00003FC3CE604F12700FDF7FEFB039B04F1AF +:10C4D0002B02A3751B12E375802384F824302923D3 +:10C4E00084F82630484B03F1100153F8040B8B42BB +:10C4F00042F8040BF9D165E618EE101A2046FDF754 +:10C50000E3FBDAE64FF00C0A20E74FF0060A1DE7DE +:10C51000002F7FF46DAFB0E70B25F8E40325F6E4B8 +:10C520000A25F4E4002A7FF44BAD802B3FF624ADBE +:10C530001E4640F6F5704FF0010AB9FBF6F1814254 +:10C54000BDF82A0094BF01EB4101023100F1FF3C2C +:10C550008BBF4FF0020B013149004FF0010B9CBF24 +:10C56000490803316144B1FBF0F103914FEA4811EE +:10C57000B1FBF0F105910AEB0701BBF1030F01914B +:10C5800003998C46DDE9011000FB0C100599DDF8DC +:10C590002CC000EB010E0CF1FF31CCF1000C71440A +:10C5A00001EA0C01A1EB0E017FF43BAD01988A4436 +:10C5B00008440190C7EB06110EEB01008145FFF422 +:10C5C000DBAC0599BBF1030F0398A9EB010184468D +:10C5D0000298A1EB0A0100FB1C11B1FBF6F10491DA +:10C5E0007FF434AD4FF6F571049888423FF66CAD98 +:10C5F000002B7FF4C1AC012E7FF6BEAC7308DEE4E5 +:10C60000002A7FF4DCACB7E44DCB01087F2810B5DD +:10C6100001D880B210BDB0F5803F12D240F2B51300 +:10C6200099420ED10849002231F8024B93B284425C +:10C6300003D00132802AF7D1134603F18000C0B243 +:10C64000E8E70020E6E700BF1CCC01087F280DD9F1 +:10C6500040F2B513994208D1FF2806D800F10040F6 +:10C66000034B803833F8100070470020704700BF3C +:10C670001CCC0108B0F5803FF0B522D21F4A83B22E +:10C680001F49B0F5805F28BF0A46141D34F8042CFA +:10C690002146AAB1934213D334F8025C2E12EFB2B2 +:10C6A00052FA85F5A84222DA082E09D8DFE806F00A +:10C6B000050A10121416181A1C00801A34F81030CB +:10C6C0001846F0BD981A00F001001B1A9BB2F7E75C +:10C6D000103BFBE7203BF9E7303BF7E71A3BF5E778 +:10C6E0000833F3E7503BF1E7A3F5E353EEE70434F7 +:10C6F000002ECBD101EB4702C7E700BF1CCD0108DC +:10C700000ECF0108036800229B6F184713289ABFB9 +:10C71000014B18564042704708D0010808B5064B37 +:10C7200053F820000368DB6A984780B2B0F5007FB9 +:10C7300038BF4FF4007008BD701700240368012251 +:10C74000D3F88430184738B5036804460D46DB6FCC +:10C75000984723686D692046D3F88030984728466B +:10C7600038BD38B5036804460D46DB6F984723682B +:10C77000ED682046D3F880309847284638BD38B554 +:10C78000036804460D46DB6F984723682D692046F1 +:10C79000D3F880309847284638BD0000F8B50368C4 +:10C7A0000446DB6F9847A36D013308D123686FF00F +:10C7B00015052046D3F8803098472846F8BD00225A +:10C7C00004F15401104F1046FEF7D8FCA36D064645 +:10C7D00057F823000368DB6898472368054620B1B3 +:10C7E000D3F8803020469847E7E7A26DD3F8803031 +:10C7F00047F822004FF0FF322046A26598473046A6 +:10C80000BDE8F840FFF782BF7017002408B1FAF7BF +:10C8100029BE704773B514460646282200212046DB +:10C820000DF0A2FF33683046DB6F984701A96A46D6 +:10C8300006F15400FFF7A1F83168054648B13046CB +:10C84000D1F880309847284602B0BDE87040FFF725 +:10C850005DBF009A93895089C4E90033136A023B93 +:10C860004343C4E90235019B43433046C4E90435E0 +:10C87000C4E90635FF236362D1F880309847284623 +:10C8800002B070BD036870B50C460546DB6F984773 +:10C890002046FEF72FFF2B6806462846D3F8803047 +:10C8A00098471CB128212046FAF7DAFD3046BDE84A +:10C8B0007040FFF72BBF30B585B00D46044600939E +:10C8C00003680192DB6F984703AB2846DDE900213E +:10C8D000FEF75EFD236805462046D3F88030984772 +:10C8E0002DB1284605B0BDE83040FFF70FBF0398D3 +:10C8F00005B030BD30B585B00D46044600930368E1 +:10C900000192DB6F984703AB2846DDE90021FEF773 +:10C910001DFE236805462046D3F8803098472DB188 +:10C92000284605B0BDE83040FFF7F0BE039805B0DB +:10C9300030BD38B503680D460446DB6F984728467E +:10C94000FEF7CDFD236805462046D3F88030984792 +:10C950002846BDE83840FFF7D9BEF8B51F46036842 +:10C9600006460D46DB6F14469847022F12D1EB683E +:10C970001C4421462846FEF7CAFE3368044630466A +:10C98000D3F880306D69984744B12046BDE8F8403F +:10C99000FFF7BCBE012FECD16B69E9E72846F8BD73 +:10C9A0000368F7B50D46DB6F01920446984701997D +:10C9B00028466F69FEF7ABFE064650B12368204655 +:10C9C000D3F880309847304603B0BDE8F040FFF719 +:10C9D0009DBE2846FFF73FF806460028EED12846C0 +:10C9E0003946FEF794FE054630B123682046D3F859 +:10C9F000803098472846E7E703B0F0BD036870B57C +:10CA00000C460546DB6F98472046FEF74DFF2B6826 +:10CA100006462846D3F8803098471CB1302120467E +:10CA2000FAF71EFD3046BDE87040FFF76FBE0368A1 +:10CA3000F0B516460F69C7B0DB6F05460C46984740 +:10CA4000B7420ADD00212046FEF737FF2B68284653 +:10CA5000D3F88030984747B0F0BDB742F6DA694660 +:10CA60002046FEF72AFF27690028EFD19DF81630EF +:10CA7000002BF2D1EAE7036870B50D460446DB6F80 +:10CA8000984728460021FEF718FF23682046D3F870 +:10CA90008030BDE870401847036870B50E46C6B0D8 +:10CAA0000546DB6F1446984730466946FEF705FF9A +:10CAB0002B6806462846D3F8803098472EB130467A +:10CAC00046B0BDE87040FFF721BE9DF8160088B162 +:10CAD0009DF8083013F0100F14BF0323052384F8CA +:10CAE000003123782BB9FF220DF1160120460EF0FC +:10CAF00052FA012046B070BD036870B50446DB6F82 +:10CB00000D4616469847A36D013307D0236820468B +:10CB1000D3F8803098476FF0150070BD1848002397 +:10CB2000014650F8042BFAB941F82350201DA365A3 +:10CB3000303384F8562084F854303A2384F8553042 +:10CB4000F9F7FCFA324604F1540104F11400FEF73F +:10CB500015FB236805462046D3F8803098472846C1 +:10CB6000BDE87040FFF7D2BD0133042BD9D1236853 +:10CB70002046D3F8803098476FF00B00CDE700BF18 +:10CB8000701700240368084618470000F0B50C46EB +:10CB90008BB0064624B93260046130460BB0F0BD5C +:10CBA000104601920EF0DDF90430FAF755FC3A23F5 +:10CBB0003034054643702F230470033000F8013CE5 +:10CBC0003746019906AC0EF0B3F9084B002247F83E +:10CBD000045B0593064B029302ABCDE903220FCB16 +:10CBE00084E80F0087E80F00D7E700BF85CB000877 +:10CBF0000DC80008054B10B503602C33044640F8FF +:10CC0000043FF9F7C1FA204610BD00BFD4CF010898 +:10CC1000A0F10400EEE700BF074B03F108029833D0 +:10CC200010B5044602604360FFF7B8FD2046FFF7E9 +:10CC3000E1FF204610BD00BF1CD00108A0F1040098 +:10CC4000FFF7EABF10B50446FFF7E6FF5C21204678 +:10CC5000FAF706FC204610BDA0F10400FFF7F2BF72 +:10CC600010B50446FFF7C6FF14212046FAF7F8FB7B +:10CC7000204610BDA0F10400F2E707B56846FAF7B8 +:10CC80001BFD68460DF07EFBD0E90232DB0243EA71 +:10CC90000243426843EA4213026802EBD27243EA5B +:10CCA000620342690069503A013043EA426343EA51 +:10CCB000405003B05DF804FB0DF0D6BC0DF0DCBCB9 +:10CCC0000020704708B5044B53F8200003689B68A8 +:10CCD0009847C0B208BD00BF701700247FB5164644 +:10CCE00005461C460391FFF719FD0A4A03460399BE +:10CCF00052F82500A3FB04450268CDE900455469BC +:10CD0000A3FB0623A047002814BF0420002004B082 +:10CD100070BD00BF701700242DE9FF4716461C4662 +:10CD20008046DFF844900391FFF7F8FCA0FB06670C +:10CD3000A0FB044559F8280032460368CDE90045B8 +:10CD4000D3F81CA03B46D04750B959F828003246CA +:10CD500003990368CDE900459C693B46A04700B1B3 +:10CD6000042004B0BDE8F08770170024F0B5054634 +:10CD700085B00C461646042946D8DFE801F0030CBE +:10CD800021292C00224B53F82030002B3ED00024C8 +:10CD9000204605B0F0BD1E4B53F82000002835D0CA +:10CDA00003689B6B9847044628460391FFF7B6FC3F +:10CDB00000230246039920460FF002F93060E6E7AF +:10CDC000134B53F820300BB3FFF7A8FC3080DEE79D +:10CDD00001231360DBE70E4F57F82030B3B1FFF7A4 +:10CDE0009DFC3268766857F8251001360B68B61A34 +:10CDF000A6FB0067CDE900671D6AA0FB0223084679 +:10CE0000A8470028C3D0C3E70424C1E70324BFE731 +:10CE10007017002438B50446154602F0D7FF0A4BB8 +:10CE2000402200212360903304F1140063600DF070 +:10CE30009BFC4FF0FF33A3651DB129462046FFF749 +:10CE40007DFC204638BD00BF24D00108036910B521 +:10CE5000044613B150F8041B9847204610BD30B566 +:10CE600087B004460A46816D01A8FFF78FFE23684C +:10CE70002046DB6F98470198FEF729FE2368054698 +:10CE80002046D3F880309847072D09D02846FFF771 +:10CE90003DFC044601A8FFF7D9FF204607B030BD8E +:10CEA0006FF05904F6E730B58BB0044615460A46D4 +:10CEB000816D6846FFF76AFE2A46A16D05A8FFF757 +:10CEC00065FE23682046DB6F984705990098FEF7BA +:10CED000FEFE236805462046D3F880309847284652 +:10CEE000FFF714FC044605A8FFF7B0FF6846FFF7FC +:10CEF000ADFF20460BB030BD30B587B004460A46C2 +:10CF0000816D01A8FFF742FE23682046DB6F98473A +:10CF10000198FEF742FE236805462046D3F880308C +:10CF200098472846FFF7F2FB044601A8FFF78EFF5B +:10CF3000204607B030BD70B5CCB0054616460A464F +:10CF4000816D01A8FFF722FE2B682846DB6F98470A +:10CF50004FF48C72002106A80DF006FC06A901987A +:10CF6000FEF7DFFC2968044668B1D1F88030284616 +:10CF700098472046FFF7CAFB044601A8FFF766FF63 +:10CF800020464CB070BD9DF8202040F2FF10069B5B +:10CF900012F0100F336114BF4FF480434FF400437D +:10CFA00012F0010F40F26D1208BF024628461343EB +:10CFB0007360D1F880309847DFE72DE9F04188B001 +:10CFC000054604301E460F460192F9F7B7F82820AF +:10CFD000FAF730FAA96D8046019A03A8FFF7D6FD4B +:10CFE000B00756BF06F0010403240134B10505D58E +:10CFF00072054CBF44F0080444F0100433072B685A +:10D00000284648BF44F03004DB6F98470399224616 +:10D010004046FEF7DBF82B6804462846D3F88030FC +:10D020007CB1984728214046FAF71AFA2046FFF7C4 +:10D030006DFB044603A8FFF709FF204608B0BDE8D2 +:10D04000F0819847C7F80080F4E7F0B5054689B04D +:10D0500030200F460192FAF7EDF9019A0646A96DC4 +:10D0600003A8FFF793FD2B682846DB6F98470399C9 +:10D070003046FEF7D5FB2B6804462846D3F88030AF +:10D0800098476CB130213046FAF7EAF92046FFF7AD +:10D090003DFB044603A8FFF7D9FE204609B0F0BDCA +:10D0A0003E60F7E708B50348F7F746FCBDE80840DF +:10D0B000FAF7CCBD4817002408B50348F7F73CFC45 +:10D0C000BDE80840FAF7DEBD4817002408B503485C +:10D0D000F7F732FCBDE80840FAF7D4BD4817002442 +:10D0E0002DE9F04F9246A1B00022044609A811464E +:10D0F000FFF790FE09A8FFF7D5FF236820469B683D +:10D100009847834610B1FFF7E1FF30E023682046DF +:10D11000DB6A984703182046029341EB010303930F +:10D120002368DDE90212CDE900120022D96900234B +:10D1300088472368834618B1DB6820469847E2E7B2 +:10D140005B6B2046984700283CDA236820469B6AA0 +:10D150009847054689460DF087FA804670B92368DE +:10D160006FF00B0B2046DB689847FFF7AFFF09A86D +:10D17000FFF752FD584621B0BDE8F08F002600278A +:10D180002A46FF210DF0F0FA2368DDE902129742EA +:10D1900008BF8E4213D2324641462046CDE900599F +:10D1A000D3F818B03B46D847834620B140460DF02F +:10D1B00063FA2368C0E7761947EB0907E4E74046BE +:10D1C0000DF05AFA236820461D6A9B6B984700238E +:10D1D0000022CDE900012046A84723688346204667 +:10D1E000DB68BBF1000FA9D19847834600288AD19C +:10D1F0000246214609A8FFF77FFC8346002882D11A +:10D200000F23024605A9CDF820A0ADF814304FF445 +:10D210008053CDE906001EA8FEF706FE044609A8C5 +:10D2200044B1FFF7BBFAFFF751FF2046FFF76EFA54 +:10D2300083469CE7FFF7B2FA834664E7F8B50368D4 +:10D24000044617460E46DB6F9847A36D5A1C0BD059 +:10D2500016B9144A52F82360236820469B6A9847FF +:10D26000054608B1236811E046B923686FF012053E +:10D270002046D3F8803098472846F8BDFB173A4639 +:10D280003046FFF72DFF2368054620B1D3F88030E4 +:10D2900020469847F0E75B6A3146204698470546A6 +:10D2A000E0E700BF7017002403681A6AC36AD31A44 +:10D2B0001944B1FBF2F302FB1311036B8B4210B55F +:10D2C0000BD94C09C26B012301F01F0103FA01F1D4 +:10D2D00052F824300B4342F82430002010BD03687C +:10D2E000013304D04068431C584258417047012024 +:10D2F00070470B6810B504689C4209D040684A68C2 +:10D30000904205D0944203D0181A18BF012010BDD6 +:10D310000020FCE7437982790433C0791344184430 +:10D32000704703689B6A10B5044613B9C0690DF0D5 +:10D33000A3F92368DB6A13B9A06A0DF09DF923688D +:10D340001B6B23B9E06BBDE810400DF095B910BD23 +:10D350002DE9F04F85B00F4691469846109D0390F9 +:10D36000DDE90E460DB9284659E0039B1868B9F16E +:10D37000000F1ED0D9F8003043451AD1D9F8041057 +:10D38000A14216D8826901EB020A544511D2AAEBD8 +:10D39000040A611AD9F80830AA4528BFAA463046BF +:10D3A0005246194456445444A5EB0A050DF0CEF9F3 +:10D3B000D8E73A68436990450ED179688C420BD31F +:10D3C00001EB030A544507D2AAEB040A611ABB68B1 +:10D3D000AA4528BFAA46E2E7B4FBF3F203FB1242D8 +:10D3E000D0F804B08AB99D420FD322464146B5FB1E +:10D3F000F3FA03FB1A5A3346A5EB0A050095D84702 +:10D4000068B92E442C445546ACE7A21A0093414615 +:10D41000BB68C7F800807A60D8470028A2D005B062 +:10D42000BDE8F08F1FB5069C00920022CDE90134C3 +:10D430000B4600F11401FFF78BFF04B010BD10B5CF +:10D440000C468269FF21A0680DF08EF94FF0FF3382 +:10D45000236010BD38B58B6A04460D460160CBB120 +:10D46000C361EB6A13B3A36204F120012846FFF7FE +:10D47000E6FF4FF0FF33636123681A6BEAB1E263A2 +:10D4800000204FF0FF33C4E90300C4E90133A4F8DE +:10D49000400038BD48690DF0E7F8E0610028E0D1B0 +:10D4A0002046FFF73EFF6FF00B00F2E7A8690DF092 +:10D4B000DBF8A0620028D7D1F2E7586AC0080DF067 +:10D4C000D3F8E0630028DBD1EAE7F8B5C5690F4679 +:10D4D0000E68083DAE4213D3B6FBF5F001380EF0EE +:10D4E00087FD841CA6EB8404B4FBF5F420460EF003 +:10D4F0007FFDA6EB800004FB150520463D60F8BDCE +:10D500000020FCE72DE9F04F8BB091460746884696 +:10D51000149A07A900680DF1200B013A0593DDF874 +:10D5200058A00792FFF7D1FF059B054619460593C2 +:10D530005046159B9847024618BB15B305F00106E7 +:10D540004A4600903846C6F10204059BA100CDE989 +:10D5500001B14146FFF7FCFE024690B9013C9442FE +:10D5600007DC0AAB023E03EB8404354454F8083C64 +:10D57000DCE708995046159B984701220028EED019 +:10D58000024610460BB0BDE8F08F2DE9F04F89B090 +:10D5900006468846DDF84C9005924BB94FF0FF32B5 +:10D5A000C9F80020149A0020136009B0BDE8F08F7C +:10D5B000013B07A900684FF0040A0793FFF785FFB6 +:10D5C00012A9054630680DF1140BFFF77EFF0746E0 +:10D5D000AF42059B03D3C9F80030129BE2E7EC1B76 +:10D5E00095FAA5F241463046B4FA84F4B2FA82F2D2 +:10D5F000C4F11F04944228BF1446A200CDE901BA29 +:10D6000000920022FFF7A4FE0028CED1012303FAE6 +:10D6100004F42D1BDCE72DE9F04786B005460F46E4 +:10D62000144600F11409D6184FF0010A0DF117083D +:10D63000A64203D1002006B0BDE8F08700943B4627 +:10D640000022494628460134CDE9018AFFF780FED1 +:10D650000028F0D1012241460E9802F005F9E7E7D3 +:10D660002DE9F04F13688BB00026074604930C4653 +:10D670005368B0460DF1100B06AD4FF0100A05933C +:10D680005BF826902B46002238464946CDF800A08C +:10D69000FFF7C8FE70B110F1340F06D146B1B8F1F2 +:10D6A000000F14BF00206FF033000BB0BDE8F08F07 +:10D6B0000126E5E7B8F1000F04D0E269069B9B1A4A +:10D6C000002BEBDB079B23F00043132BE6D93A68D2 +:10D6D000D2699342E2D84FF0FF3303A810222946C3 +:10D6E000039302F0C1F8079B03A81022494623F0D8 +:10D6F000004300903846103BFFF78DFF0028CAD149 +:10D70000039B002BCAD10AAA86F0010304F11C0C6A +:10D71000C4F8049002EB83034FF0010853F8183C5F +:10D72000C4E9023A95E80F008CE80F00B6E72DE94E +:10D73000F34106460C46154601F124081027226ADB +:10D74000E16822F0004301F10C00043B984217D835 +:10D750000C230A463046616800932B1DFFF762FEDA +:10D76000014690B9E66828462E60FFF7D3FD3044A5 +:10D77000E0602846FFF7CEFDA3691844A06104E0ED +:10D78000002A06DB29606FF00101084602B0BDE8FF +:10D79000F081214642463046FFF762FF01460028ED +:10D7A000F3D1A369E7601433A361C8E770B50546F8 +:10D7B00092B004300E46FFF792FD68BB0123019042 +:10D7C00001AA07A928460293FFF74AFF044618B9A1 +:10D7D00010A8FFF784FD10B1204612B070BD10AA4A +:10D7E00007A92846FFF73CFF38B903AA07A928462E +:10D7F000FFF79DFF18B1831CEAD00446ECE79DF9C2 +:10D800001030002BF1DB0822314605A80CF090FF08 +:10D810000028EAD10124DFE70024DDE72DE9F84301 +:10D8200014461D460022012306460F4604F1240833 +:10D8300005F10809C4E909234046FFF750FD08B186 +:10D8400000200DE0424621463046FFF709FF38B977 +:10D850002A4621463046FFF76AFF18B1831CEBD0F9 +:10D86000BDE8F8832B7903F07003202BF0D1394603 +:10D870004846FFF73EFD0028EAD10120F0E7F7B562 +:10D88000044604300E461546FFF729FD10B100206E +:10D8900003B0F0BD012300906A462946204601935B +:10D8A000FFF7DEFE0028F3D105F124073846FFF725 +:10D8B00016FD0028EBD131463846FFF71AFD38B186 +:10D8C0003A4629462046FFF7CBFE0028EED0DFE798 +:10D8D0000120DDE72DE9F04F87B006468B4617465D +:10D8E0004FF001090DF1170ADDE910452544A3EBBE +:10D8F0000408AC4201D1012011E008EB040300222E +:10D900005946304600933B46CDE901A9FFF720FD7B +:10D9100028B914F8013B9DF817209A42E9D007B0C6 +:10D92000BDE8F08FF7B50C460968064617464B1C54 +:10D9300021D00068836900938568D4E90123A84752 +:10D94000054620B937B921463068FFF778FD2846EB +:10D9500003B0F0BD3368394630469B690193A36834 +:10D960000093D4E90023FFF7B5FF002805DBEAD1D7 +:10D970006FF03305EBE70025E9E70546E7E72DE91A +:10D98000F04F85B080460E4692469946109CDDE9E0 +:10D990000E570CB920462CE03368D8F800004B45F0 +:10D9A000816929D17368AB4226D803EB010BAB45E3 +:10D9B00022D9ABEB050BE81AB3683946A3451844E6 +:10D9C00028BFA3465A465D440CF0C0FED8F800308C +:10D9D0005F44A4EB0B049A69B5FBF2F302FB13530B +:10D9E000002BD6D1524631464046FFF79BFF002818 +:10D9F000CFD005B0BDE8F08FB5FBF1F301FB1353B9 +:10DA000043BB8C4226D32A46B4FBF1F301FB134BF4 +:10DA10004946A4EB0B030393009383681C463B46E3 +:10DA2000A0470028E5D1BAF1000F04D1039B5C4662 +:10DA30001F441D44ADE7039B4A4651464046CDE98D +:10DA400000732B46FFF746FF0028D2DBEED16FF0C4 +:10DA50003300CEE7EB1AC6F80090736099E7000038 +:10DA60002DE9F04F2DED028B85B01F68054608EEBD +:10DA7000101A029340F622031446DFF840915360D7 +:10DA8000436893608368D360494638460DF096FA40 +:10DA900007EB00088346494640460DF051FA01283D +:10DAA000064608EB000A05D117F80B302E2B0AD1D9 +:10DAB0005746E9E7022806D102463F4940460CF0A6 +:10DAC00037FE0028F4D057464FF0010B4946504628 +:10DAD0000DF074FA8244494650460DF031FA024680 +:10DAE00090B102280CD10390504633490CF020FE2F +:10DAF000039A28B9BBF1010B04D10AF10207C3E76D +:10DB00000BF1010B9244E1E798F80000002846D0A1 +:10DB1000029BC3F800802379222B4AD104F1080A22 +:10DB200018EE101A28465246FFF79AFD002836D103 +:10DB300005F1140B224618EE101A2846FFF7F7FDE0 +:10DB400068BB237903F07F03112B01D0222BF1D185 +:10DB5000E379B342EED1236859466279284604330B +:10DB60001344A279134418EE102ACDE900865268B6 +:10DB7000FFF7B0FE002812DBDCD095F84130002B17 +:10DB800082D194F90430002BBFF67EAF514628466F +:10DB9000FFF70CFE002807D001DB6FF0010005B095 +:10DBA000BDEC028BBDE8F08F237903F07F03237176 +:10DBB0006AE76FF01300F2E7BCD00108ACC60108B9 +:10DBC000436830B54B6087B083680546019202AA6E +:10DBD0008B6001AB0C46FFF743FFA0B99DF80C30FA +:10DBE000222B12D104AA21462846FFF739FD50B94D +:10DBF00063682361A36863610E23A3611023E3605C +:10DC00002B6923602C6107B030BD6FF01300FAE779 +:10DC100000F1100203691BB18B4203D11B68136032 +:10DC2000002070471A461B68F5E7000070B51446DF +:10DC30000D4686B006464FF48472002120460CF053 +:10DC400093FDAB690E2B0CD120462223284900F806 +:10DC5000083B0DF06DF9AB6901200133AB6106B0F3 +:10DC600070BD0F2B05D120462223224900F8083B26 +:10DC7000EFE702AA29463046FFF759FD18B1821C8A +:10DC800008BF0020EBE79DF80C3003F07F02112A5B +:10DC900001D0222AEDD11B060CD504A93046FFF78E +:10DCA00085FD0028DBDBE4D19DF80C3003F07F0319 +:10DCB0008DF80C309DF80C303046029A112B2370F1 +:10DCC00002F104029DF80E1004BF059B63609DF8ED +:10DCD0000D301A449DF80F300A440093696804F12E +:10DCE0000803FFF79FFB002808BF0120B7E700BF2C +:10DCF000BDD00108BCD001088869704710B501F19A +:10DD000010020C46FFF7ACFC38B923696360636905 +:10DD1000A3600E23A3611023E36010BD2DE9F04141 +:10DD200007460C461546FFF7E9FF064640B904F1E1 +:10DD30002408A561216A21F00043AB4203D3E560CA +:10DD40003046BDE8F0810029A5EB030508DA42461C +:10DD500021463846FFF784FC0028EBD00646EFE763 +:10DD60006FF01506ECE7086A7047CB6948699B03BA +:10DD700003D50B6A984238BF1846704770B594B007 +:10DD800015460646039103AB05AA09A9FFF768FEED +:10DD90000446C0B901464FF4847228460CF0E4FCF6 +:10DDA0009DF81830311D07A8112B2B7004BF089B5C +:10DDB0006B60FFF79EFA05F10803044630B90C4981 +:10DDC00018460DF0B5F8204614B070BD059A9DF8C0 +:10DDD000191004329DF81B000A449DF81A10009097 +:10DDE00030460A440A99FFF71DFB0446EBE700BFE3 +:10DDF000ACC6010830B599B00546FFF72BFB0446C9 +:10DE000058BB2B6802AA68630DA91B6A0290AB631A +:10DE10000123C5E90B0028460393FFF721FC0446C4 +:10DE200000BB202310220E992846009305ABFFF774 +:10DE3000F9FA0446B0B9069B08220E490BA86B609C +:10DE4000079BAB600CF074FC044648B90A9B1A0CA3 +:10DE5000012A0BD19BB2012B08D8204619B030BD46 +:10DE60006FF033042846FFF75CFAF6E76FF015040D +:10DE7000F8E700BFBFD0010808B5FFF752FA00204D +:10DE800008BD2DE9F043064697B004300F46904692 +:10DE9000FFF725FA00287CD1012305900693059908 +:10DEA0004046B847044610BB06994046B84704466A +:10DEB000E8B905AA0BA93046FFF7D2FB0446B0B972 +:10DEC0000C25139B0E9A23F0004302F10C01043B36 +:10DED000994210D9149B05A80593159B0693FFF74B +:10DEE000FEF90028DBD0F56806F114094DBB204689 +:10DEF00017B0BDE8F0830C9908AB30460095FFF7EA +:10DF000091FA0146002842D107A8FFF703FA0E9BB9 +:10DF100018449DF8203003F070030E90102BD0D1E0 +:10DF20000A9B002BCCD00A46009306F11401099BF2 +:10DF30003046CDE90178FFF7E5FA0028C0D0044665 +:10DF4000D5E7EB69DA0312D4EB699B030DD52B6A95 +:10DF50005BB1009305F12C0249463046CDE90178CA +:10DF60006B6AFFF7CFFA0028E9D12D68BEE76B692D +:10DF7000002BE9D0009305F12C0249463046CDE94B +:10DF800001782B69FFF7BEFA0028DDD0D7E70446F9 +:10DF9000ADE70024ABE70000F8B504460D460127C5 +:10DFA0002B4E226BD4E90D1391421ED1002B4BD086 +:10DFB0002068E16AD0F820C00A44B2FBFCF10CFBF7 +:10DFC00011220021E262426A61639A4294BF226395 +:10DFD0002363D208E06B0CF0C7FB22463146204693 +:10DFE000FFF74FFF0028DCD025E0481C013BD4F8A8 +:10DFF0003CC060634809A36301F01F035CF8200084 +:10E0000007FA03F30342CDD1E36A194423681A6A7D +:10E01000B1FBF2F302FB131129600121256B636B45 +:10E02000AB420FD05A0903F01F005CF8222001FA1E +:10E0300000F0104000D1F8BD01336363A36B013BD6 +:10E04000A363ECE70020F6E76FF01B00F3E700BFE7 +:10E05000A9D2000873B50C4604310646FFF79CFFB1 +:10E060000546F0B904F108013046FFF795FF054673 +:10E07000B8B90423024661683046009304F11C03DA +:10E08000FFF7D0F910B110F1340F0DD1E36914226C +:10E090000133E3614FF0FF33C4E90823A362102387 +:10E0A000E360284602B070BD0546FAE72DE9F04F5F +:10E0B000044687B00E4600F1140A05A92046FFF772 +:10E0C0006BFF054648B920680599C368984705461F +:10E0D00000283BD010F1340FEFD0284607B0BDE840 +:10E0E000F08F0DF11307736A5A4651462046CDF85A +:10E0F0000890CDE90087FFF72BF970B9059B5246D0 +:10E1000004F120012046CDF80080CDE90179FFF728 +:10E1100036FC20B110F1340FCFD00546DDE708F111 +:10E120000108B36A4345DCD82368A16A9A69706B19 +:10E130000CF00CFB236A04F120012068F362636A8F +:10E140003363FFF77CF9059B7362C6E7804606F1EF +:10E150002C0B4FF00109E4E72DE9F04F9B468DB001 +:10E16000CB69054604920C4603F00302012A00F035 +:10E1700020815E0314D4E66932051AD4276A17EBAE +:10E180000B0F00F1198116F4003618D0D946E36957 +:10E19000B9F1000F25D123F400235A46E36104E0CE +:10E1A00000F00DF902460028E5D010460DB0BDE89C +:10E1B000F08F6269216A8A4288BF2262DEE7636962 +:10E1C0009F42E3D923620BAA0123214628468DF8FA +:10E1D0002C60FFF7C1FF021EE7DB236A9F42F2D8E3 +:10E1E000D4E79B0304F12C0620D52B68A26ADB69D7 +:10E1F0009A4242D12B6805F1140A1B6AAB63D4E939 +:10E200000832CDE909230BA92846FFF7C5FE0246CF +:10E21000F8B928680B99C3689847024618B312F1F9 +:10E22000340F16D14FF0FF332B62ECE7236A002B3B +:10E23000E0D004F12802013B31462846029204F165 +:10E24000240200930192D4E90423FFF79EF90246C9 +:10E2500020B1E36943F40023E361A6E7314628686F +:10E26000FFF7EDF8C6E70A9B286843BB0B9A62628A +:10E27000A362E36943F40033E361A84658F8143B12 +:10E28000DF69A36AFF1A4F4528BF4F46049B4246E9 +:10E29000314628460193A36A02970093636AFFF709 +:10E2A0006EFB0246002875D010F1340FD1D1214603 +:10E2B0002846FFF7FBFE02460028E7D0C9E7013BEE +:10E2C0000AA905920A93FFF700F90A9B296801330E +:10E2D000059AC9690A938B424AD10130904609AF29 +:10E2E00090FAA0F3B3FA83F30593013306934FEA50 +:10E2F000880352463146284607930423CDE901732B +:10E30000079B00930B9BFFF73AFB0246002886D140 +:10E31000059B434530D108F10108069B4345E6D8EB +:10E320000B9B6362069B9B00A2E7012300225146E0 +:10E330002846CDF80080CDE90173099BFFF708F866 +:10E340000246002885D10123524631462846CDF8A1 +:10E350000080CDE901730B9BFFF711FB02460028FB +:10E360007FF45DAF08F101080A9B9845DDD37DE796 +:10E3700090460DF12307F7E7042351462846CDE9DF +:10E380000173079B0093099BFEF7E2FF02460028FA +:10E39000C1D05EE7236AA9EB07093B442362A36A65 +:10E3A0003B44A362049B3B4404932B681B6AAB630E +:10E3B000EDE66FF00802F8E66FF01A02F5E6CB69B9 +:10E3C0005A0344BF23F480234FF0FF322DE9F0417C +:10E3D00048BFCB610546CB6990B048BFCA620C46C6 +:10E3E00013F400302CD00F6A2C22002102A80CF06C +:10E3F000BBF9236905F114060693636907930123AA +:10E4000096E80700CDE9093710AB03E907004FF0A4 +:10E41000FF3398466B61226A63699A4213D304F111 +:10E420002C08324641462846FFF77CFA28B310F103 +:10E43000340F05D121462846FFF738FE0028F0D0DA +:10E4400010B0BDE8F08101230DF1070202A92846B2 +:10E4500000F01FF80028F3DB01230DF1070221462D +:10E460002846FFF779FE0028EADB6B6901331CBF01 +:10E47000CDF83480C5F81480CDE7636A2361236A40 +:10E480006361E36923F4003343F48033C4E907375D +:10E49000D6E72DE9F04F1D46CB69904687B003F0D3 +:10E4A000030207460C46022A54D09A0305D4266A72 +:10E4B0006269964208D3002003E0FFF780FF00283E +:10E4C000F5D007B0BDE8F08F961B04F12C0104F1E4 +:10E4D000280A04F1240BAE4228BF2E46B146B9F1FA +:10E4E000000F01D13046ECE7E3695B0304D53B68DC +:10E4F000A26ADB699A4210D1236A384605910093DB +:10E50000CDE901BAD4E90423FFF73FF80028D8D1B8 +:10E51000E369059943F48023E3613A683846A36AC6 +:10E52000D56900220093ED1A636A05914D4528BF15 +:10E530004D46CDE90185FEF70BFF0028C1D1236AC6 +:10E54000A844A9EB050905992B442362A36A2B442F +:10E55000A362C4E76FF00800B3E770B50D46144638 +:10E560001E46FFF72CFF70B93EB1012E2B6A01D178 +:10E570001C4402E0022E07D01C46002CAABF2046F5 +:10E580006FF015002C6270BD6B69F1E7CB6903F089 +:10E590000303012B2DE9F041054686B00C461646D3 +:10E5A00043D0FFF7E2FB90421AD92846FFF707FF56 +:10E5B00098B905AB059004F12C012846029304F1AB +:10E5C0001003CDE90063D4E90423FEF7DEFF20B990 +:10E5D000E369666143F48033E36106B0BDE8F0812E +:10E5E00026D20F6AB8420DD14FF00008236AB34219 +:10E5F00010D300233A4621462846FFF7AEFF00EA33 +:10E60000E070EAE7022300222846FFF7A6FF002871 +:10E61000EADAE2E7012305AA214628468DF81480AC +:10E62000FFF79AFD0028E1DAD7E76FF00800D4E79A +:10E630000020D2E7F0B50127061DA7B0044680F8F8 +:10E6400040703046FEF74BFE0546002840F08180C2 +:10E6500001462C2205A80CF087F84FF00043282231 +:10E66000294610A80D930CF07FF81A9723681B6AAF +:10E670009D4202D36FF033001BE019A8FEF72FFE76 +:10E68000002866D119AA10A92046FEF7E9FF80B933 +:10E690000D9B002B38DB3046FEF721FE58B1199B4D +:10E6A0000E931A9B0F93002305A920461A4600F0EB +:10E6B00052F827B0F0BD01AB1BAA0EA92046FFF708 +:10E6C000ADF80028F5DBEAD0039A0E99049B8A4244 +:10E6D0000F9801D1984217D0824201D1994213D0AC +:10E6E0000E92DFE79DF97030002B0DDA1DA9204650 +:10E6F000FFF75CF80028DCDB1ED01BAA10A920461F +:10E7000000F052FA0028D4D11BAA10A92046FFF726 +:10E710000EF80028E6D0831CCBD10DF1400C05AFDC +:10E720000135BCE80F000FC7BCE80F000FC79CE81D +:10E73000070087E8070099E79DF870301BAA10A929 +:10E7400003F07F038DF870300346204600F04FF948 +:10E75000D8E70020ADE72DE9F04F2DED028B9BB0FF +:10E7600006460D460793CB6907980133059202EBE5 +:10E770000017CB610B1DD1E9011408EE103A1346C6 +:10E78000C5E901419F420FD10023CDE9094106931C +:10E7900030686968C3689847044670B114F1340F53 +:10E7A00000F0F4802046FFE0D86810332A6A024463 +:10E7B00053F80C0C121A2A62E4E705F11C080DF15B +:10E7C0002C094FF0FF3306F1200A10271022414692 +:10E7D00048460B9301F048F8224600946B68514676 +:10E7E0003046CDE90187FFF7CAF804460028D5D1A5 +:10E7F0008346B84608EE909A2AE0079B9B4580F234 +:10E80000A080059A4FEA0B13D35802EB0B1943452E +:10E8100040F0978018EE900AD9E9021201F024F82E +:10E82000D9F80C300022514602933046D9F808300E +:10E83000CDE900736B68FFF7A2F804460028ADD15C +:10E84000D9F804300BF1010B9844D9F80C301F446F +:10E850002B6A23F00043043BBB42CED804230DF1C6 +:10E860002C0800225146029330466B68CDE90078AF +:10E87000FFF785F80446002890D14FF0FF33024699 +:10E88000514630467361FFF74DF80446002885D1A4 +:10E89000306803699847044600287FF47FAF4FF043 +:10E8A000FF330FAF024669680F9330462B6A00971B +:10E8B00023F00043043BFEF7AEFE044600287FF43D +:10E8C00071AF0F9A0B9B9A4260D1069B4BB306F136 +:10E8D00004094846FEF703FD002875D143463A4631 +:10E8E00009A93046FEF79AFF00285DDB6CD06B6803 +:10E8F0004246394630460D93AB680E93002300F034 +:10E9000076F8002850D1494609A8FEF7F2FC18B95C +:10E910006B687360AB68B3603046FFF78BFE00280E +:10E9200042D13469002C3FF43DAF18EE101A201D7F +:10E93000FEF7DFFC18B96B686360AB68A3602468FE +:10E94000F0E7012342460A99304600930FABFEF7E9 +:10E9500069FD044600287FF425AF01220FA918EEB7 +:10E96000900A00F081FF01232246514602930FAB2B +:10E970003046CDE900736B68FFF701F804460028C4 +:10E980007FF40CAF08F10108013761E74FF0FF3366 +:10E9900000220FA909A833620123CDE90F23FEF756 +:10E9A000A8FC30B96FF033001BB0BDEC028BBDE8A2 +:10E9B000F08F18EE101A3046FFF7EEFA0123069397 +:10E9C00000283FF4E5AEEFE73A4609A93046FEF7E6 +:10E9D00056FF0028E8DBA4D06B6839463046189310 +:10E9E000AB68199300231A46FFF7B5FE97E770B599 +:10E9F000154688B00C26D27955F8044B002B0792A7 +:10EA00000094344403960494CDE9052314BF0223F3 +:10EA100001236A46CDE90165FFF79DFE08B070BD90 +:10EA200070B592B006460D46FFF7C9FC044670BBB0 +:10EA3000EB6903F41023B3F5803F28D12A1D10465B +:10EA4000FEF74DFC18BB07A93046FEF709FE044649 +:10EA5000E8B90C23EA680690009304AB0899039286 +:10EA6000CDE904003046FEF7DDFC044678B92B6999 +:10EA700003AA07A905936B69069303463046FFF77F +:10EA8000B6FF044618B9EB6923F48033EB612046E6 +:10EA900012B070BD70B505460C46FFF7C1FF0646C3 +:10EAA00005F10C02EB681BB1A3420DD12368136082 +:10EAB000A3690BB11B682BB92B685B6B13B9606B37 +:10EAC0000BF0DAFD304670BD1A461B68EBE72DE906 +:10EAD000F043074695B00E469046994601F124044E +:10EAE0004046316AFEF716FC3B680844DB699842F1 +:10EAF00018D804394346002243F8041B0991CDE994 +:10EB00000A230C23CDE90C3198F807303146CDE9C2 +:10EB10000E29109309AA02233846FFF71CFE15B0F0 +:10EB2000BDE8F083002937DB354609AC0FCD0FC4B3 +:10EB30000FCD0FC495E8070084E80700314638463A +:10EB4000FFF788FA0028EAD1129B424631467362E9 +:10EB5000139BB362336A043B42F8043B03920C22DA +:10EB6000CDE90130CDE9042398F8073001AACDE9B9 +:10EB70000609089338460223FFF7EDFD0028CED1A1 +:10EB8000119B024609A943F0004311937368129345 +:10EB9000B36813930346BFE7224631463846FEF773 +:10EBA0005FFD00289CD0BAE72DE9F04780468CB085 +:10EBB00010460C461646FEF7ADFB0B6A143023F0E8 +:10EBC000004383421DD101AA04314046FEF757FE9F +:10EBD000051E12DB099A002A13DA236A01A94046AE +:10EBE00063F0004313400993636A0A93A36A0B938B +:10EBF00000231A46FFF7AFFD054628460CB0BDE8D6 +:10EC0000F087336830460193FEF784FB00230290BF +:10EC100001AA21464046CDE903330123FFF79BFDBE +:10EC200005460028E9D1D8F80C70211D4FF0FF3AB5 +:10EC3000CFB9D8F81070211D002FDED0381DFEF797 +:10EC400058FB70B9FC6833689C420AD93046FEF71D +:10EC500061FB201AF8603046FEF75CFBBB69181AAE +:10EC6000B8613F68E8E7381DFEF743FB30B9D7F8D5 +:10EC70000C903368994503D1C7E901AA3F68D7E7EB +:10EC8000FCD93046FEF746FBA9EB0000F860F5E73B +:10EC9000F0B5A5B00546FEF7DDFB044600287ED1A1 +:10ECA0002B680146E86B5A6AD2080BF05DFD2A68B2 +:10ECB000EC620EA92846D2E90832C5E90D439A4212 +:10ECC00094BF2A632B63FFF7C5F90446002863D17C +:10ECD00019A92846FFF7BEF9044600285CD103466F +:10ECE000024619A92846FFF736FD0446002853D1ED +:10ECF00041F22E438DF81A001A9E1027ADF81830F5 +:10ED000008231B9A8DF81B302B686E60D9691B6A2B +:10ED100009910A934FF0011322490B930CAB086839 +:10ED20004968AA600597019703C334230EA92846B2 +:10ED300016932023CDE90762CDE9176206AE029350 +:10ED400001AACDE903630123FFF705FD20B110F10E +:10ED5000340F02D004461FE00124202301AA0EA98B +:10ED6000284604930197CDE902360123FFF7F3FC0F +:10ED700020B110F1340FEDD1002CEBD00022012393 +:10ED80000EA92846CDE9012301AAFEF769FC044635 +:10ED900010B92B681B6AAB632846FEF7C2FA2046FF +:10EDA00025B0F0BDBFD0010830B590F840309DB01F +:10EDB00005460191002B43D001AB02AA06A92846C3 +:10EDC000FEF74EFE831C044642D12F2101980CF021 +:10EDD00098F8002839D12B6811A928461B6AAB6323 +:10EDE000FFF738F9044600282FD10F9B024611A9DE +:10EDF0001A93109B1B9303462846FFF7ACFC04466E +:10EE000018BB40F622038DF80E00ADF80C30019BC4 +:10EE1000184600930CF0A5F81299139A8DF80F007C +:10EE2000284604910592009BCDE90F1202AA06A97B +:10EE3000FFF74DFE044640B92B681B6AAB6304E044 +:10EE4000FFF7F8FB04460028B6D020461DB030BDC1 +:10EE5000002808BF6FF01004F7E72DE9F0471F46C0 +:10EE600003F0030392B00646012B0C46DDF86880E0 +:10EE7000019211D101AB03AA07A93046FEF7F0FDBC +:10EE80000546B0B99DF81030222B00F08880B905F6 +:10EE900034D56FF0100508E090F84030002BE9D130 +:10EEA000FFF7C8FB05460028E4D0284612B0BDE8AD +:10EEB000F087821CF9D1DDF804A02F2150460CF018 +:10EEC00020F881460028F0D1FB05EED540F611036D +:10EED0008DF812005046ADF810300CF042F84FF0AB +:10EEE000FF338DF8130003AA07A93046CDE9053991 +:10EEF0005346FFF7ECFD05460028D6D1089B0022BB +:10EF00007805C4F818806360099BE761A360039BE0 +:10EF10002262E360059B2361069B63610FD44FF07F +:10EF2000FF33E362B8F1000F13D0D8F8003083B19B +:10EF30006363E36903F00303012B1FD029E013B1DE +:10EF400047F48037E7614FF0FF320023C4E9042320 +:10EF5000E5E733685A6B32B1F36813B16FF00B0514 +:10EF6000A3E76263E5E7E26902F00302012A0AD13E +:10EF700058690BF079FB60630028EFD0F368002537 +:10EF80002360F46091E798690BF06EFB60630028E2 +:10EF9000E4D004F12C013068FEF751FAEEE76FF08F +:10EFA000140582E713B500240094FFF756FF02B062 +:10EFB00010BD10B590F840309CB00446019143B1AB +:10EFC00001AB02AA06A92046FEF74AFD30B11CB0EB +:10EFD00010BDFFF72FFB0028F2D0F8E79DF80C30AA +:10EFE000222B1CD002AA06A92046FFF7DDFD00282F +:10EFF000EDD19DF80C30222BE9D106AA12A92046AA +:10F00000FEF73DFC0028E2DB1A9B06A920460F9381 +:10F010001B9B109300231A46FFF79DFBD7E704AA1A +:10F0200011A92046FEF71CFB0028D0D1199B142BF8 +:10F03000D8D06FF02600CAE7F0B590F84030B3B0F2 +:10F040000446CDE90221002B48D0039B05AA11A953 +:10F050002046049304ABFEF703FD002842D19DF83F +:10F06000183005AA11A963F07F038DF81830034604 +:10F070002046FFF7BCFC002834D109AF02AB1CA925 +:10F0800020463A46FEF7ECFC054668B3821C76D172 +:10F090002F2102980BF035FF002870D10DAE97E8B4 +:10F0A0000F0086E80F0006AA0EAB07CA83E8070028 +:10F0B0009DF8383003F07F038DF83830029B1846F6 +:10F0C00001930BF04EFFAB1C8DF83B00019B22D14E +:10F0D00032461CA92046FFF7FAFC21E0FFF7AAFA06 +:10F0E0000028B2D033B0F0BD9DF818309DF828202C +:10F0F00003F07F039A4244D1222ACFD10BAA27A939 +:10F100002046FEF7ADFA0028ECD12F9B142BC5D07A +:10F110006FF02600E6E732461CA92046FFF767FCA1 +:10F120000028DFD1012305AA11A9204684F8413027 +:10F1300003ABFEF795FC0028D4D1064684F84100C5 +:10F1400005AA11A92046FFF72FFD0028CAD10235D4 +:10F15000C8D09DF82830222BC4D11CAA28A920464B +:10F16000FEF78DFB0028BDDB309B32461CA92046F4 +:10F170002593319B26933346FFF7EDFAB2E72846F5 +:10F18000B0E76FF01400ADE7002807DC10F1160FB0 +:10F1900004DA10F1340F08BF6FF089007047F7B53B +:10F1A000089F0E4604681946C06900232568009729 +:10F1B0000027E0FB0623204601976D69A84703B0AE +:10F1C000F0BDF7B5089F0E4604681946C0690023D4 +:10F1D000256800970027E0FB062320460197AD69CC +:10F1E000A84703B0F0BD37B50468C36900202268A2 +:10F1F000009301902046D569A1FB0323A84703B0E3 +:10F2000030BD006803681B69184703680133036059 +:10F21000002070472DE9F04100F1A4070D46044697 +:10F220003846F8F713FD2B682846C4F890509B68C1 +:10F230009847064640B10023C4F890303846F8F7A6 +:10F2400021FD3046BDE8F0812422014604F16C0026 +:10F2500004F158080BF088FA254BA5652846E365AC +:10F26000244B2366244B6366244BA3662B685B6A9E +:10F270009847D4F8943083422CBFE366E066284672 +:10F280002B689B6A9847D4F8983083422CBF236739 +:10F29000206728462B68DB6A9847D4F89C30834265 +:10F2A0002CBF6367606728462B689B6B9847334683 +:10F2B000626F0CF085FEA0671F30D4F8A030414685 +:10F2C00020F01F00834294BFE367E06704F114005D +:10F2D000FEF790FD06460028B0D000233846C4F85B +:10F2E0009030F8F7CFFC3046BDE8F041FFF74CBF57 +:10F2F0009FF10008C3F10008E7F1000803F20008DD +:10F3000070B500F1A40605463046F8F79FFCD5F825 +:10F310009040A4B105F11400FEF7AEFD044610B113 +:10F32000FFF732FF0446D5F890000368DB68984782 +:10F3300010B1002C08BF04460023C5F890303046B9 +:10F34000F8F7A0FC204670BD37B500F1A4050446CF +:10F3500001912846F8F77AFC019904F11400FFF7AF +:10F3600028FE04462846F8F78DFC204603B0BDE889 +:10F370003040FFF709BF37B500F1A4050446284621 +:10F38000CDE90021F8F762FC04F11400DDE9002169 +:10F39000FFF752FE04462846F8F774FC204603B0F7 +:10F3A000BDE83040FFF7F0BE37B500F1A4050446D4 +:10F3B00001912846F8F74AFC019904F11400FFF77F +:10F3C000F3FC04462846F8F75DFC204603B0BDE890 +:10F3D0003040FFF7D9BE70B500F1A406C4B00546B1 +:10F3E000144630460191F8F731FC02AA019905F163 +:10F3F0001400FEF7C3FC05463046F8F743FC039BB8 +:10F4000023619DF80830112B0BD0222B44F2FF13FF +:10F4100018BF00232846636044B0BDE87040FFF782 +:10F42000B3BE48F2FF13F5E7F7B5064614460021D0 +:10F43000282206F1A40720460BF096F9002338464F +:10F440000193F8F703FC01AA0D4906F11400FEF739 +:10F4500018FD05463846F8F715FC6DB9736F019A2B +:10F46000C4E90033B36FC4E902359B1AC4E904351B +:10F47000C4E90635FF236362284603B0F0BD00BF30 +:10F480000BF200082DE9F743814698463820019297 +:10F4900009F1A4070E46F7F7CDFF05463846F8F701 +:10F4A000D5FB18F0030C09F11400019A37D0BCF118 +:10F4B000010F4FF0000334D0BCF1020F9C4601D085 +:10F4C000002100E003214FEA68044FEAA80E04F48B +:10F4D00080740EF4007E44EA0E0408F4806E4FEA55 +:10F4E000082844EA0E0408F4006844EA080444EAE0 +:10F4F0000C0423430B432946FFF754FD04463846CA +:10F50000F8F7C0FB34B93560204603B0BDE8F043DE +:10F51000FFF73ABE38212846F7F7A2FFF4E70123A8 +:10F52000CEE74FF0020CCBE770B500F1A40605461C +:10F530000C463046F8F78AFB05F114002146FFF728 +:10F54000A9FA05463046F8F79DFB1CB13821204644 +:10F55000F7F786FF2846BDE87040FFF715BE30B5C7 +:10F5600000F1A40585B0044628460193CDE90221A7 +:10F57000F8F76CFB039904F11400DDE90132FEF7A2 +:10F5800088FF04462846F8F77DFB204605B0BDE815 +:10F590003040FFF7F9BD30B500F1A40585B0044651 +:10F5A00028460193CDE90221F8F750FB039904F1B5 +:10F5B0001400DDE90132FEF7CFFD04462846F8F7D6 +:10F5C00061FB204605B0BDE83040FFF7DDBD37B533 +:10F5D00000F1A405044601912846F8F737FB01998C +:10F5E00004F11400FFF71CFA04462846F8F74AFB1A +:10F5F000204603B0BDE83040FFF7C6BD30B500F18E +:10F60000A40585B0044628460193CDE90221F8F708 +:10F610001DFB039904F11400DDE90132FEF79DFFA3 +:10F6200004462846F8F72EFB204605B0BDE83040DA +:10F63000FFF7AABD37B500F1A4050446019128469D +:10F64000F8F704FB019904F11400FEF78CFB044663 +:10F650002846F8F717FB204603B0BDE83040FFF717 +:10F6600093BD37B500F1A405044601912846F8F78B +:10F67000EDFA019904F11400FEF777FB04462846E1 +:10F68000F8F700FB204603B0BDE83040FFF77CBD33 +:10F6900037B500F1A40504462846CDE90021F8F766 +:10F6A000D5FA04F11400DDE90021FEF76FFF0446EE +:10F6B0002846F8F7E7FA204603B0BDE83040FFF7E8 +:10F6C00063BDF7B505462C200E46019205F1A4074F +:10F6D000F7F7B0FE04463846F8F7B8FA05F114001B +:10F6E000019A2146FEF76CFA05463846F8F7CAFA41 +:10F6F00035B93460284603B0BDE8F040FFF744BD9B +:10F700002C212046F7F7ACFEF4E770B500F1A40613 +:10F7100005460C463046F8F799FA05F114002146E3 +:10F72000FEF776FA05463046F8F7ACFA1CB12C2104 +:10F730002046F7F795FE2846BDE87040FFF724BD48 +:10F7400070B500F1A406C4B00446154630460191D8 +:10F75000F8F77CFA02AA019904F11400FEF766FAA0 +:10F7600004463046F8F78EFA012C0DD19DF808308A +:10F77000112B0FD0222B14BF0023032304A92846EA +:10F7800085F800310BF0D4FB204644B0BDE8704052 +:10F79000FFF7FABC0523F1E737B500F1A4050446ED +:10F7A0002846CDE90021F8F751FA04F11400DDE90B +:10F7B0000021FEF7B3FA284603B0BDE83040F8F761 +:10F7C00061BA37B500F1A405044601912846F8F75F +:10F7D0003DFA019904F11400FEF78EFA044628461A +:10F7E000F8F750FA204603B0BDE83040FFF7CCBC34 +:10F7F00037B500F1A405044601912846F8F726FA2A +:10F80000019904F11400FEF779FA284603B0BDE827 +:10F810003040F8F737BA0000094B03F1080288338B +:10F8200010B5044602604360FFF76AFD04F1A400CE +:10F83000F8F740FA2046FDF7DDF9204610BD00BF7D +:10F84000C8D00108A0F10400FFF7E6BF10B50446D8 +:10F85000FFF7E2FFC8212046F7F702FE204610BD61 +:10F86000A0F10400FFF7F2BF70B50A440E4E036822 +:10F8700093FAA3F393FAA3F30360914212D011F821 +:10F88000014B84EA030505F00F0556F8255085EA7B +:10F89000131383EA141404F00F0456F8244084EA86 +:10F8A0001313EAE7036070BDA8C5010870B50446EC +:10F8B0001E46154600F08AFA134A002104F114008E +:10F8C00022608032626044220AF04EFF382200211A +:10F8D00004F158000AF048FF002304F1A400C4E931 +:10F8E0002436049BC4F89830059BC4F89C30069BD2 +:10F8F000C4F8A030F8F7A2F91DB129462046FFF759 +:10F9000089FC204670BD00BFD0D001082DE9F04130 +:10F910001D460368A2B004469B6888461746289E89 +:10F9200098470346002846D101462422019008A8A2 +:10F930000AF01AFF224A204603940492214A0592B3 +:10F94000214A0692214A07922268526A9047226809 +:10F9500040452CBF0890CDF820802046926A904701 +:10F960002268B8422CBF099009972046D26A904776 +:10F970002268A8422CBF0A900A952046926B9047B5 +:10F980000A9A019B0CF01CFB0B901F3003A920F07E +:10F990001F00B04294BF0C900C9611A8FFF778F9A5 +:10F9A00020B122B0BDE8F041FFF7EEBB236820464E +:10F9B000DB6898470346184622B0BDE8F08100BFD7 +:10F9C0009FF10008C3F10008E7F1000803F2000806 +:10F9D000F7B500F1A40705460E463846F8F736F9A4 +:10F9E000D5F8903063B1002E08BF1E462B6828461C +:10F9F0009B6A9847044660B13846F8F743F905E03A +:10FA00003EB96FF012043846F8F73CF9204603B0CF +:10FA1000F0BDD5F8A0303046D5F894100093D5E964 +:10FA20002623FFF773FF04460028E5D12B683146F3 +:10FA300028465B6A98470446DEE738B543680446C3 +:10FA40000D4643B90B6800F108012846DB6D984765 +:10FA500000B9656038BD6FF01500FBE710B50446CE +:10FA6000406830B10368A1681B6E9847002363604B +:10FA700010BD6FF01500FBE7044B10B503600446A2 +:10FA800043680BB1FFF7EAFF204610BD60D10108C3 +:10FA900043680A46196810B48C6E8168184623467C +:10FAA0005DF8044B1847436881681A681846D26E9F +:10FAB0001047436881681A681846126F10474368F8 +:10FAC00081681A681846526F104710B50446FFF750 +:10FAD000D3FF0C212046F7F7C3FC204610BD0B4690 +:10FAE00040F20112002170B5044618460AF03CFEAF +:10FAF00003466068A1680268556E1A462B46BDE849 +:10FB000070401847024A02600022C0E90122704793 +:10FB100060D1010870B50D464168044641B92968B5 +:10FB20000E6B00F108012846B04700B9656070BD52 +:10FB30006FF01500FBE710B50446406830B103686C +:10FB4000A1685B6B98470023636010BD6FF01500E0 +:10FB5000FBE70000044B10B50360044643680BB19B +:10FB6000FFF7E9FF204610BD8CD1010830B444688E +:10FB700013462268956B0A4681682046AC4630BC25 +:10FB8000604730B4446813462268D56B0A468168E2 +:10FB90002046AC4630BC6047436881681A68184606 +:10FBA000126C1047436881681A681846526C1047F7 +:10FBB00030B4446813462268956C0A468168204632 +:10FBC000AC4630BC6047436881681A681846D26CFE +:10FBD0001047436881681A681846126D10474368D9 +:10FBE00081681A681846526D104743680A461968BA +:10FBF00010B48C6D8168184623465DF8044B184795 +:10FC000010B50446FFF7A6FF0C212046F7F728FCA5 +:10FC1000204610BD024A02600022C0E9012270475E +:10FC20008CD101086FF0570070476FF05700704794 +:10FC30006FF057007047002070470368002210B42F +:10FC40009C6C0123A4465DF8044B6047036810B424 +:10FC50009C6C0023A4461A465DF8044B6047036879 +:10FC60002DE9F0410446DB6C0D46984723680746B2 +:10FC7000294600229E6C20460223B0472368064690 +:10FC80003A46D3F84880294600232046C0473046EC +:10FC9000BDE8F0816FF05700704770470020704753 +:10FCA000036800229B6E184703682DE9F041DB6E64 +:10FCB00004460D469847804640F20110F7F7BAFB1C +:10FCC0002368002706461B6F29462046984723686D +:10FCD0003246294620465B6E9847002801DD0137F1 +:10FCE000F5E723684246294620469B6E98473046F2 +:10FCF00040F20111F7F7B4FB3846BDE8F08100008F +:10FD0000034B10B504460360FFF724FF204610BDE7 +:10FD1000E0D1010810B50446FFF7F2FF0C212046A0 +:10FD2000F7F79EFB204610BD73B505460C200E4626 +:10FD3000CDE90032F7F77EFB0446FFF76BFF094978 +:10FD4000204621602946DDE90032FFF7E3FE054643 +:10FD500030B1236820465B689847284602B070BDE2 +:10FD60003460FAE7E0D10108034B10B504460360A4 +:10FD7000FFF782FE204610BD34D2010810B50446BC +:10FD8000FFF7F2FF0C212046F7F76AFB204610BD73 +:10FD900073B505460C200E460192F7F74BFB04465F +:10FDA000FFF7B0FE084B2946019A20462360FFF773 +:10FDB00044FE054630B1236820465B6898472846D4 +:10FDC00002B070BD3460FAE734D20108074B01225B +:10FDD00010B5044640F8043BF6F7B4F9044B20464E +:10FDE00003F1080288332260636010BDB8C60108C1 +:10FDF00058D2010838B50446FFF79DFE0546236832 +:10FE000020465B689847284638BD38B50446FFF75A +:10FE100025FE0546236820465B689847284638BD7E +:10FE20007047000010B5032000F0AEF802F010FF9C +:10FE30000F49104A8B69C3F30323D35C03F01F03FC +:10FE4000D8408B6903F00F03D35C0B4A03F01F0308 +:10FE500020FA03F31360094B18600F2007F08EFDA2 +:10FE6000044618B9FFF7DCFF204610BD0124FBE76C +:10FE70000044025836D301081C0300241803002450 +:10FE800038B5044607F080FD0546631C1EBF044BD1 +:10FE90001B78E41807F078FD431BA342FAD338BD62 +:10FEA00010030024014B1868000C70470010005C20 +:10FEB000014B1868704700BF00E8F11F014B18683C +:10FEC000704700BF04E8F11F014B1868704700BF7E +:10FED00008E8F11F024A136A43F0010313627047F6 +:10FEE0000004005830B5CC030DD5430900F01F05C0 +:10FEF000012403F1B063AC4008331B011D68A2B9B3 +:10FF000025EA04041C608B030ED500F01F01400994 +:10FF1000012300018B4000F1B04042B9D0F88420A9 +:10FF200022EA0303C0F8843030BD2C43EAE7D0F85E +:10FF300084201343F6E730B5CC030DD5430900F018 +:10FF40001F05012403F1B063AC400C331B011D6895 +:10FF5000A2B925EA04041C608B030ED500F01F0132 +:10FF60004009012300018B4000F1B04042B9D0F8B4 +:10FF7000C42022EA0303C0F8C43030BD2C43EAE7B2 +:10FF8000D0F8C4201343F6E707490302CA6803F414 +:10FF9000E06322F4E0621204120C134343F0BF63E7 +:10FFA00043F40033CB60704700ED00E0164B30B5F2 +:10FFB000DC68C4F30224C4F10705231D042D28BF07 +:10FFC0000425062B4FF0FF338CBF033C002403FABB +:10FFD00005F5002803FA04F321EA050122EA0302E9 +:10FFE00001FA04F141EA02034FEA0313DBB206DB34 +:10FFF00000F1604000F5614080F8003330BD00F052 +:020000040801F1 +:100000000F00024A1354F9E700ED00E014ED00E0A0 +:10001000002808DB0123420900F01F0003FA00F06A +:10002000014B43F82200704700E100E000280DDB9F +:100030004309012200F01F00203302FA00F0044AB5 +:1000400042F82300BFF34F8FBFF36F8F704700BF9D +:1000500000E100E0044B1B68C3F30313072B0CBF44 +:1000600003200120704700BF00ED00E010B528B16B +:1000700090F83530022B03D08023436501207FE0C8 +:100080000368504A934252D04F498B424FD01831A7 +:100090008B424CD018318B4249D018318B4246D01C +:1000A00018318B4243D018318B4240D018318B42EB +:1000B0003DD001F556718B4239D018318B4236D084 +:1000C00018318B4233D018318B4230D018318B42EB +:1000D0002DD018318B422AD018318B4227D01831BD +:1000E0008B4224D01A6822F00E021A601A6822F09D +:1000F00001021A60354A934243D1026E136823F419 +:1001000080731360D0E9161303F01F02012393409C +:100110004B60D0E919325A60C36E002B46D01A6882 +:1001200022F480721A60D0E91C325A603EE0042149 +:10013000934280F835101ED0234A93421BD01832C8 +:10014000934218D01832934215D01832934212D0ED +:10015000183293420FD0183293420CD01832934287 +:1001600009D002F55672934205D01832934202D05C +:1001700018329342FFD01A6822F001021A60002060 +:1001800010BD134A9342B8D014329342B5D0143202 +:100190009342B2D014329342AFD014329342ACD0D7 +:1001A00014329342A9D014329342A6D001230024E2 +:1001B00080F83530036D80F834400BB19847DEE7A6 +:1001C0001846DDE71000024028000240085402589B +:1001D0001C54025890F8350070470000104BDA6844 +:1001E000D20706D40E4BD3F80C0110F001000AD14F +:1001F00070470C4A5A6002F188325A60DB68DB07AC +:10020000F0D501207047074AC3F8042102F1883273 +:10021000C3F80421D3F80C0100F00100704700BFBF +:1002200000200052230167450A4BDA6842F00102C0 +:10023000DA60DA68D2070BD5D3F80C2142F001025C +:10024000C3F80C21D3F80C01C04300F00100704743 +:1002500001207047002000522DE9F8430E462D4C36 +:100260000546D4F8108007F08FFB022E07462A4B74 +:100270002AD1D4F81041DFF8A8801C4044F0004493 +:10028000DFF89090B8F1040F23D1D9F81000C0F333 +:10029000800070B934F0004128D0204A002C9369C6 +:1002A00043EA040393611B4B1DDB5C610120BDE845 +:1002B000F8836B1CE6D007F067FBC01BA84201D88F +:1002C000002DDFD10320F2E708EA03044FF0040811 +:1002D000D6E7D9F8103128EA030313F0040F0CBF56 +:1002E00001200020D5E7C3F81411DFE7012E094BE8 +:1002F00006D11A69D103DAD54FF480325A61D6E7B4 +:10030000D3F81021D203D2D54FF48032C3F8142190 +:10031000CDE700BF002000520000EE17383800245F +:1003200004000080F8B5284C0E461746237D012BAB +:1003300048D001F178430120B3F5801F207531D3F7 +:10034000A1F10163B3F5801F2BD2022500232946BA +:100350004CF25030A361FFF77FFF00BB012D1B4B18 +:1003600022D1DA6842F00202DA60BFF36F8FBFF386 +:100370004F8F0023FA58F2500433202BFAD1BFF3E9 +:100380006F8FBFF34F8F4CF250302946FFF764FF59 +:10039000012D0E4B0FD1DA6822F00202DA60002341 +:1003A0002375F8BD0546D1E7D3F80C2142F00202CF +:1003B000C3F80C21D9E7D3F80C2122F00202C3F8CC +:1003C0000C21ECE70220ECE7383800240020005232 +:1003D00001F00303032B17D11D4BDA6822F0300222 +:1003E000DA60D3F80C2122F03002C3F80C21DA686D +:1003F0000243DA60D3F80C211043C3F80C019A6968 +:1004000042F010029A617047CA070BD5104BDA68A8 +:1004100022F03002DA60DA680243DA60DA6842F029 +:100420008802DA608B0711D5094BD3F80C2122F032 +:100430003002C3F80C21D3F80C211043C3F80C018F +:10044000D3F80C2142F08802C3F80C21704700BF9A +:100450000020005210B5CC070BD50F4CE36823F4F5 +:10046000E663E360E36843EA0023134343F0840355 +:10047000E3608B070FD50849D1F80C3123F4E6630C +:10048000C1F80C31D1F80C3143EA0020024342F0AC +:100490008402C1F80C2110BD002000522DE9F04764 +:1004A000464E05460F46337D012B00F08480012126 +:1004B000002331754468B3610C4006D04CF25030D3 +:1004C000FFF7CAFE041E18BF01246B68980706D404 +:1004D0006CB10124002333752046BDE8F08702216A +:1004E0004CF25030FFF7B8FE0028F1D0F1E7D5F814 +:1004F0000080B8F1010F26D169682869FFF768FF0D +:100500006B68D9070CD541464CF25030FFF7A4FE7A +:100510002B4A041ED36818BF012423F00803D360BC +:100520006B689A07D6D502214CF25030FFF794FE43 +:10053000234A0028D2F80C3118BF012423F0080305 +:10054000C2F80C31C6E74FF0FF33DFF87480DFF8F4 +:1005500074903B60D5F808A0D5E9022313445345B5 +:10056000B8D950462A696968FFF774FF686810F0C7 +:1005700001000AD001214CF25030FFF76DFED8F88F +:100580000C3003EA0903C8F80C306B689B070AD5E6 +:1005900002214CF25030FFF75FFED8F80C3103EA2D +:1005A0000903C8F80C3118B10446C7F800A091E758 +:1005B0000AF1010AD0E702248EE700BF3838002490 +:1005C00000200052FBF8FFFF2DE9F74F0023DFF872 +:1005D000BC81DFF8BCC14FF0B0490A6832FA03F4BD +:1005E00002D103B0BDE8F08F01279F403A4000F0F0 +:1005F000B6804C684FEA430E032524F0100A05FA32 +:100600000EF50AF1FF36ED43012E10D8866806EA92 +:10061000050BCE6806FA0EF646EA0B0686604668BB +:1006200026EA0707C4F300169E4037434760C768B1 +:10063000BAF1020F8E6807EA050706FA0EF646EAD7 +:100640000706C66014D14FEAD30A03F0070B0F2741 +:1006500000EB8A0A4FEA8B0BDAF8206007FA0BF7F7 +:1006600026EA07070E6906FA0BF63E43CAF8206031 +:100670000668354004F0030606FA0EFE4EEA05054C +:100680000560E5006BD5D8F8F45023F0030603F0BD +:1006900003074FF00F0E45F0020506F1B046BF000C +:1006A000C8F8F45006F58066D8F8F45005F0020555 +:1006B0000195019D0EFA07F5D6F808A02AEA050E65 +:1006C000314DA8424DD005F58065A8424BD005F5C7 +:1006D0008065A84249D005F58065A84247D005F558 +:1006E0008065A84245D005F58065A84243D005F550 +:1006F0008065A84241D005F58065A8423FD005F548 +:100700008065A8423DD005F58065A8420CBF09254B +:100710000A25BD40E70345EA0E05B5606FEA02060B +:10072000DCF8005054BF35401543A703CCF8005007 +:10073000DCF8045054BF35401543E7024FF0B04792 +:10074000CCF80450D9F8005054BF35401543A402EA +:100750003D607D6854BF35401543C9F804500133EE +:100760003BE70025D5E70125D3E70225D1E703259F +:10077000CFE70425CDE70525CBE70625C9E7072503 +:10078000C7E70825C5E700BF00000258004402582B +:10079000800000580AB1816170470904FBE7704787 +:1007A00008B5054BD8681A6822EA00021A6058603A +:1007B000FFF7F5FF08BD00BF0065025803689A699E +:1007C000910701D500229A629A69D20703D49A69E7 +:1007D00042F001029A61704730B5039DC1F30901EF +:1007E000046845EA024260681A43044B43EA5553E1 +:1007F0000A4320EA03000243626030BDFF63FF0347 +:10080000426B0BB210B5164CA24202D0154CA2425C +:1008100011D1002B0DDB10291ED020291ED0002362 +:10082000402901D143F0400301680A6813430B607B +:1008300010BDB823F4E7002BACBF0023B823CC07CE +:1008400048BF43F0F2038A0748BF43F0F40320296E +:10085000EAD143F02003E7E79023E5E76023E3E7ED +:1008600079140108ED12010811F0010307D090F886 +:10087000413003F02803282B0CBF4223F2238A07C0 +:1008800009D590F8412002F02802282A0CBF43F035 +:10089000440343F0F4030A04016848BF43F0B8037B +:1008A0000A6822EA03030B607047C36AAA2B02D1CD +:1008B0000023C3627047C36AB3F52A4FFAD14FF0E1 +:1008C0000073F6E7704710B5044600284AD090F848 +:1008D000413003F0FF021BB980F84020FFF7F2FF20 +:1008E000242384F8413023681A6822F001021A6038 +:1008F000626822F070621A619A6822F400429A607B +:10090000D4E90221012924D142F400429A605A68B4 +:10091000002042F0007242F400425A60DA6822F489 +:100920000042DA60D4E904210A43A16942EA0122C3 +:10093000DA60D4E907210A431A601A6842F001021A +:100940001A602023606484F84130206384F84200F8 +:1009500010BD42F4044202299A60D8D14FF40062DB +:100960005A60D4E70120F3E737B50446069894F8B7 +:100970004150202D43D194F84050012D3FD0012506 +:10098000626284F84050212584F84150102584F893 +:1009900042500025656463851A4BE0626363638D92 +:1009A0009BB2FF2B15D9FF234FF080722385236B59 +:1009B000112B04D1AA2802D0B0F52A4F0DD1204620 +:1009C000FFF773FF638D9BB2FF2B00D8E26A0E4BDB +:1009D00004E0638DE26A2385E9E7002300252046D1 +:1009E0000093134694F82820FFF7F6FE20460121D5 +:1009F00084F84050FFF704FF284603B030BD0220C2 +:100A0000FBE700BFCB1101080020008037B504468A +:100A1000069894F84150202D43D194F84050012D70 +:100A20003FD00125626284F84050222584F841506D +:100A3000102584F842500025656463851A4BE062F6 +:100A40006363638D9BB2FF2B15D9FF234FF0807238 +:100A50002385236B122B04D1AA2802D0B0F52A4F8C +:100A60000DD12046FFF721FF638D9BB2FF2B00D8ED +:100A7000E26A0E4B04E0638DE26A2385E9E7002316 +:100A8000002520460093134694F82820FFF7A4FE83 +:100A90002046022184F84050FFF7B2FE284603B0FA +:100AA00030BD0220FBE700BFCB110108002400800D +:100AB0002DE9F041984690F8413004460F4603F086 +:100AC00028031646282B04D101B122B94FF4007334 +:100AD0006364012044E048F20201FFF7C5FE90F88C +:100AE0004030012B3ED090F841300121292B80F875 +:100AF000401013D1FFF7B8FE03681A6852040DD5F1 +:100B00001A68806B22F480421A6038B1164B036574 +:100B1000FFF7ACFA10B1A06B036D98472A23256844 +:100B2000002084F84130202384F8423060646B68F0 +:100B300023F400436B606685638DC4F82C802385A5 +:100B40000A4B67626363AB69DB0301D40823EB6183 +:100B500084F8400048F202012046FFF751FE0020D1 +:100B6000BDE8F0810220FBE7DF150108C90F01088D +:100B700008B590F84120202A0AD128224FF40041DC +:100B800080F84120034A4263FFF73AFE002008BD87 +:100B90000220FCE7C90F01080268436B91691268E3 +:100BA00003B11847704738B5002580F8425090F8D7 +:100BB0004130212B4FF0200380F841300AD111231E +:100BC000012145630363FFF74FFE80F8405007F0B3 +:100BD0002DF838BD1223022145630363FFF744FE5D +:100BE00080F8405007F041F8F3E708B503680021AA +:100BF0001A6880F84210510415D51A6822F4804210 +:100C00001A6090F84130292B13D12823012180F854 +:100C1000413021230363FFF727FE002380F8403093 +:100C200007F044F808BD1204EBD51A6822F400421C +:100C3000E6E790F841302A2BF4D12823022180F8EE +:100C4000413022230363FFF70FFE002380F840307A +:100C500007F030F8E6E7F8B590F84120044603685D +:100C600002F02802282A37D19E69C2689D69C6F31E +:100C70000046022A99684FEA1545DF6805F0FE052F +:100C800021D185EAD115C1F3090215F006050ED16F +:100C9000816C01318164816C022907D1082185644E +:100CA000D961314680F8405006F0F6FFF8BD4FF4A8 +:100CB0000041FFF7D9FD002307F0FE0280F8403025 +:100CC00031462046F0E74FF40041FFF7CDFD002309 +:100CD0002A4680F84030F3E70822DA61002380F8E2 +:100CE0004030E3E708B5164B2022C36200230363BC +:100CF000436380F8412080F842304B0712D50368E7 +:100D00005A6A436A1A70436A01334362038D4BB1D6 +:100D1000013B0385438D013B9BB24385436C43F00C +:100D20000403436448F20301FFF79EFD10220368A9 +:100D3000DA61002380F8403006F0E2FF08BD00BF12 +:100D40000000FFFF7047704790F84120602A4FF085 +:100D5000000208B508D1202180F8402080F8411019 +:100D6000026306F0D6FF08BD026380F8402007F05A +:100D700011FBF8E770B5354A002590F8413004467C +:100D800080F84250283BC2624585426C022B41EA02 +:100D90000201416429D80321FFF766FD282380F86A +:100DA00041302B4BA06B6363236B80B3112B01D0BD +:100DB000212B2CD123681A68510403D51A6822F418 +:100DC00080421A60FFF706FA01281BD0214BA06B66 +:100DD0000365002384F84030FFF748F9002834D039 +:100DE000A06B036DBDE87040184748F20301FFF7A0 +:100DF0003BFD90F84130602B02D0202380F8413039 +:100E00000023CFE72046BDE87040FFF79DBFE06BB1 +:100E10000028F7D0122B01D0222BF3D123681A68B7 +:100E2000120403D51A6822F400421A60FFF7D2F9BF +:100E30000128E7D0074BE06B0365002384F84030BE +:100E4000FFF714F908B1E06BCBE770BD0000FFFFBE +:100E5000C90F0108DF150108F8B503682022044610 +:100E60000E461F6890F84150DA6105F0F705212D14 +:100E700073D148F20101FFF7F7FC25632368204690 +:100E80005A6842F400425A605A6822F0FF7222F413 +:100E90008B3222F4FF7222F001025A60FFF78EFCBF +:100EA00079045FD52268136823F480431360A36B31 +:100EB0002BB31B68424A93421ED0183293421BD078 +:100EC0001832934218D01832934215D018329342F8 +:100ED00012D0183293420FD0183293420CD01832ED +:100EE000934209D002F55672934205D018329342CC +:100EF00002D018329342FFD05B689BB263857307C0 +:100F000010D5236826F004065A6A636A1A70636A69 +:100F100001336362238D2BB1013B2385638D013B3C +:100F20009BB26385638D9BB21BB1636C43F004037A +:100F30006364002384F84230656C6363DDB1616CE7 +:100F40002046FFF717FF94F84130282B25D1314672 +:100F50002046BDE8F840FFF7C5BE222D8ED148F2ED +:100F6000020188E73A04CAD52268136823F40043D3 +:100F70001360E36B9CE7E36A13F5803F0ED02046D5 +:100F8000FFF733FE0F4B204684F84050E3622023E6 +:100F900084F84130256306F0B3FEF8BD94F8413083 +:100FA000204684F84050222B4FF0200384F8413033 +:100FB000256302D106F07EFEEFE706F077FEECE750 +:100FC000100002400000FFFFF8B590F840300446E2 +:100FD0000D461646012BC76A7DD001238A0680F88C +:100FE000403003D5B30601D5FFF736FFE80634D508 +:100FF000F10632D5638D9BB203BB94F84130282BA8 +:101000000AD1B7F1007F07D129462046FFF76AFED3 +:10101000002084F84000F8BD94F841202368292A74 +:101020004FF01002DA61F3D117F5803FF0D020467F +:10103000FFF7C4FB2046FFF7D8FDE9E7236810223D +:10104000DA61636C43F00403636437F08073DFD1CB +:10105000616C2046FFF78EFEDAE76A071AD5730740 +:1010600018D5638D9BB26BB123685A6A636A1A7094 +:10107000636A01336362238D013B2385638D013BEA +:101080009BB26385638D9BB2002BC1D117F5803F66 +:10109000BED0CFE7280705D5310703D52046FFF797 +:1010A000DAFDB5E7AA07B3D5B307B1D5638D9BB217 +:1010B0006BB1636A226813F8011B91626362638DEE +:1010C000013B9BB26385238D013B2385A0E737F06D +:1010D0008073AFD09CE702209DE737B503682022DC +:1010E00004460D46DA6190F84130212B37D10121B9 +:1010F000FFF7BAFB112323632368E9065A6822F03D +:10110000FF7222F48B3222F4FF7222F001025A6045 +:101110004FF000026263A2F58032E26205D5102230 +:10112000DA61626C42F00402626494F84120602A41 +:1011300005D16A0703D55B6ADBB20193019B2046A8 +:10114000FFF73CFB636C94F84120602A00D07BB130 +:10115000616C204603B0BDE83040FFF70BBE90F84D +:101160004130222BC8D10221FFF77EFB1223C2E7B8 +:1011700094F84120212A12D1202284F8403084F8AA +:101180004120236394F8422084F84230402A03D15E +:10119000FFF7D8FD03B030BD06F048FDFAE794F83C +:1011A0004120222AF6D1202284F8403084F84120C0 +:1011B000236394F8422084F84230402A02D1FFF79A +:1011C000C2FDE7E706F051FDE4E773B590F8403063 +:1011D00004460D461646012B00F086800123CA0600 +:1011E00080F8403017D5F30615D503681022DA6170 +:1011F000436C43F004034364FFF7E0FAAA0605D505 +:10120000B30603D529462046FFF767FF002084F880 +:10121000400002B070BD680712D5710710D5236871 +:1012200025F004055A6A636A1A70636A01336362BF +:10123000238D013B2385638D013B9BB26385DDE7F5 +:10124000AA0707D5B30705D5636A226813F8011BFF +:101250009162ECE7280632D5710630D5638D22689D +:101260009BB203B3208DF0B95168638DC1F30901BE +:101270009BB2FF2B08D9FF224FF08073009022858C +:101280002046FFF7A9FAB9E7628DE36A92B213F537 +:10129000803F2285D2B202D0E36A0090F0E74FF09F +:1012A00000730090ECE753689A0103D42046FFF7DF +:1012B0007AFCA3E740212046FFF75CFD9EE76B0622 +:1012C0009CD570069AD5638D9BB2002BF2D1236812 +:1012D0005A68910192D4E26A12F5803FE6D15A68C9 +:1012E00042F480425A6089E7022092E7F8B590F80C +:1012F000403004460E461546012BC76A00F0B78001 +:1013000001238A0680F8403003D5AB0601D5FFF7EC +:10131000A3FDF20640F1A380EB0640F1A080E90BAB +:10132000A80B41EA9535ED0740F19580E26B52B389 +:1013300011F0010326D013684E4A93421ED0183292 +:1013400093421BD01832934218D01832934215D0D2 +:101350001832934212D0183293420FD0183293426F +:101360000CD01832934209D002F55672934205D040 +:101370001832934202D018329342FFD05B68B3FA1E +:1013800083F35B091A46A36B4BB3C10727D51B68D0 +:1013900038498B421ED018318B421BD018318B42FA +:1013A00018D018318B4215D018318B4212D0183119 +:1013B0008B420FD018318B420CD018318B4209D0A0 +:1013C00001F556718B4205D018318B4202D018318D +:1013D0008B42FFD05B68B3FA83F35B090BB9012A38 +:1013E0001FD194F84130282B0AD1B7F1007F07D1E3 +:1013F00031462046FFF776FC002084F84000F8BD17 +:1014000094F841202368292A4FF01002DA61F3D1C1 +:1014100017F5803FF0D02046FFF7D0F9FFF7E5FB46 +:10142000EAE723681022DA6137F08072636C43F0D8 +:101430000403636494F84130DBB2DDD103F0F703B9 +:10144000212B01D1236301E0222BFBD0616C2046CC +:10145000FFF790FCD0E723681022DA61CCE732076F +:10146000CAD52B07C8D52046FFF7F5FBC4E70220F5 +:10147000C5E700BF1000024013B590F840300446A5 +:10148000012B7AD0012380F84030CB0612D5D30649 +:1014900010D5036810222021DA61436C43F0040365 +:1014A0004364FFF7ADF9FFF789F9002084F84000A5 +:1014B00002B010BD0B0643D5500641D523681A680B +:1014C00022F040021A60628D92B26AB35968638D4D +:1014D000C1F309019BB2FF2B1BD9FF2323854FF0DA +:1014E000807300222046009294F82820FFF774F9B8 +:1014F000638D228D9B1A9BB2638594F84130222B19 +:1015000023681A680CBF42F4004242F480421A6019 +:10151000CBE7638D2385E36A13F5803F01D0E36A4F +:10152000DFE74FF00073DCE75B689A0103D42046E5 +:10153000FFF739FBB9E740212046FFF71BFCB4E772 +:101540004B0612D5500610D5638D9BB2002BF2D1FD +:1015500023685A689201A8D4E26A12F5803FE6D166 +:101560005A6842F480425A609FE788069DD59306E8 +:101570009BD52046FFF7B1FD97E7022098E7036867 +:1015800099691A6810B4CC0508D5140606D5446CC0 +:1015900044F0010444644FF48074DC614C0508D5C8 +:1015A000140606D5446C44F0080444644FF4806487 +:1015B000DC61890508D5120606D5426C42F00202AC +:1015C00042644FF40072DA61416C11F00B0F03D0EA +:1015D0005DF8044BFFF7CEBB5DF8044B7047806BA2 +:1015E000836B0BB100221A65C36B0BB100221A6525 +:1015F000FFF7AABB10B590F84130202BDCB21DD10B +:1016000090F84030012B19D0242380F84130036832 +:101610001A6822F001021A601A6822F480521A60D5 +:101620001A68114319601A6842F001021A60002317 +:1016300080F8414080F84030184610BD0220FCE799 +:10164000094A82B0D2F8F41041F00201C2F8F41055 +:10165000D2F8F42002F002020192044A019B53687E +:101660001843506002B0704700440258000400580C +:101670000A4B44F620621B68B3FBF2F24FF47A7314 +:1016800053430268002010B5013B146808BF0320D3 +:1016900031EA040401D0002BF6D110BD1803002458 +:1016A00070470000F8B50446002858D090F836304E +:1016B00003F0FF021BB980F83520FFF7F1FF6568E2 +:1016C00002232268012D84F83630A66AD06802D041 +:1016D000B6F5000F01D120F01E004FF6FF736169CF +:1016E000204F994245EA06031CBF20F4604020F0D9 +:1016F000C0000740A0680343206A0343606A0343B5 +:101700003B4305BBE069256928430343B6F5000F59 +:101710001BD04FF6FF70814204D0A0690143E069FD +:1017200001430B43D360104B9A4203D003F1C053E3 +:101730009A420FD1D4E90B310B43536201230020AD +:1017400084F83630F8BD012DE0D1D4E903052843F3 +:101750000343DEE7054B9A42F0D1E36AEDE701204F +:10176000F0E700BFFEF119FF0024004000280058F8 +:10177000022310B580F836300446D0E90032012A41 +:1017800007D0826AB2F5000F03D1DA6822F46062F2 +:10179000DA601A69204642F001021A6110225A608A +:1017A00099611146FFF764FF032808D022680020E2 +:1017B000136943F004031361012384F8363010BD2C +:1017C000F0B504468BB060B390F8BD33056803F004 +:1017D000FF021BB980F8BC23F0F736FB03236E46EB +:1017E000271D84F8BD33EB6B254613F4807355F841 +:1017F000100B08BF236104F0CBFF0FCD0FC60FCD38 +:101800000FC695E80300254686E8030097E80E001A +:1018100055F8100B04F0FCFE064620B1022384F8B4 +:10182000BD33012552E00146206804F0B7FF304681 +:10183000D4F804C01C264FF0010E0146C2B201309C +:1018400094451BD800231C261946D8B20133844581 +:1018500022D86E460FCD0FC60FCD0FC695E80300F8 +:1018600086E8030097E80E00206804F0D9FF012302 +:101870000546F0B1022284F8BD23D2E706FB0243FD +:1018800083F83DE083F83C20A3F8422083F83F1022 +:101890001965C3E91111D1E706FB004282F8FD1179 +:1018A00082F8FC0182F8FF11C2F81012C2E981111E +:1018B000CBE784F8380084F8BD33636A012B02D18A +:1018C000204600F03DFC206805F0B9FA28460BB030 +:1018D000F0BD10B50446006894F8BC33012B15D058 +:1018E000012384F8BC33A36A012B06D1A369012B21 +:1018F00003D0836B43F48033836304F043FF206899 +:1019000005F08FFA002084F8BC0310BD0220FCE72C +:1019100038B590F8BC330446012B1BD00123056871 +:1019200080F8BC33284604F033FF206805F087FABE +:101930001021206804F04AFFA36A012B06D1A36995 +:10194000012B03D0AB6B23F48033AB63002084F80E +:10195000BC0338BD0220FCE7704700002DE9F04FC2 +:10196000066887B00446304605F0A6FA02900028C3 +:1019700040F03C81206805F070FA002800F03681C4 +:10198000206805F06AFA820704D52268536903F0DB +:1019900002035361206805F060FAC3062AD5226865 +:1019A000936923F010039361376AC7F3434307F049 +:1019B0000F05022B40F01D8147F6F0731F4214D033 +:1019C0001C23C7F30A18304603FB05454246D5F8E9 +:1019D000081205F09FF9D5F80822D5F814324244D0 +:1019E0004344C5F80822C5F814322268936943F0CD +:1019F00010039361206805F030FA070300F10D81B0 +:101A0000206805F02AFA45030CD5254606F510692D +:101A10004FF00008206805F02CFA0390039B002B80 +:101A200040F0A481206805F018FA002815DAD6F8ED +:101A3000043823F00103C6F8043894F8F433012B7A +:101A400040F025820021204684F8F41300F08BFB3F +:101A50002268536903F000435361206805F0FDF9E3 +:101A600000050BD5D6F80838D90702D52046F0F77F +:101A700015FB2268536903F400635361206805F085 +:101A8000ECF9020114D523685A6902F000625A6128 +:101A900094F8F423002A40F0FE810121204684F8C6 +:101AA000F4135B6DC3F38303C4F8F83300F05BFBFE +:101AB000206805F0D2F9C30436D5D6F804381021D1 +:101AC000206806F5006523F001036B6004F07EFEDC +:101AD00006F510634FF67F3162680298824200F289 +:101AE000DE81EB6943F00113EB61236B002B00F007 +:101AF000F681D5F8843043F00B03C5F884306B6C65 +:101B000043F00B036B64D6F8003804F57172217C46 +:101B100023F4FE632068C6F8003805F0E1F9226876 +:101B2000536903F480535361206805F096F98704E4 +:101B300016D5206805F0C4F9206804F027FF256851 +:101B4000E06001F04BFA227B0146284604F0AAFD32 +:101B50002046F0F790FA2268536903F4005353616A +:101B6000206805F07AF9060707D52046F0F77FFAD6 +:101B70002268536903F008035361206805F06DF98A +:101B8000C50208D500212046F0F790FA2268536973 +:101B900003F480135361206805F05FF9800208D5D3 +:101BA00000212046F0F77EFA2268536903F40013FF +:101BB0005361206805F051F9410007D52046F0F740 +:101BC00079FA2268536903F080435361206805F075 +:101BD00044F942070AD523685D686B0702D52046A1 +:101BE000F0F76CFA226853682B43536007B0BDE8E6 +:101BF000F08F062B7FF4F9AE082204F571713046A0 +:101C0000C7F30A1705F086F81C2303FB0545D5F832 +:101C100014321F44C5F81472E7E606F5306704F580 +:101C2000017A0025DFF8D0B2206805F01AF9039098 +:101C3000039B002B3FF4E4AE039BD80756D55FFA15 +:101C400085F92068494605F01CF910F0010F80461F +:101C50001AD020680122216900F5306CBA60012990 +:101C6000036C0CEB451CDCF8082066D1110706D587 +:101C70005B4509D9100407D54FF4004302E09106F3 +:101C80003CD52023CCF8083018F0080F1ED023686C +:101C90000822BA601A6C03F530635A4503EB45130A +:101CA000996804D9090402D54FF40041996020468F +:101CB0000492F0F7C5F9049A5A4507D92169012918 +:101CC00004D104F57172206805F00AF918F0100FBC +:101CD00001D01023BB6018F0200F01D02023BB607F +:101CE00018F4005F02D04FF40053BB60039B013532 +:101CF00020370AF11C0A5B08039399E712F0280FBA +:101D0000C2D15B4501D91204B6D4DCF81020DAF850 +:101D10000010C2F312028A1ACAF81020DAF804205E +:101D20001144CAF8041095B9D4F810227AB904F510 +:101D30007172012105F0D4F809E06E498B420BD194 +:101D4000130499D4900602D52022CCF808204946E5 +:101D50002046F0F77BF997E7002DF8D1D4F8102250 +:101D6000002AF4D104F571722946E3E7039BDA07F0 +:101D700040F184805FFA88FB2068594605F08AF8B4 +:101D8000C307074621D5012008F00F02D6F83438E2 +:101D900000FA02F2216923EA02038142C6F83438CC +:101DA000C9F808000DD1D5E911231344AB64B8F18B +:101DB000000F06D1236D23B904F57172206805F078 +:101DC0008FF859462046F0F74AF9380702D508231C +:101DD000C9F80830F90602D51023C9F808307A0688 +:101DE00002D54023C9F80830BB0702D50223C9F841 +:101DF00008303F0642D5D5E914329A423ED89B1AA4 +:101E00006A6CD4F800A0934228BF134603339B08A2 +:101E100004930AF5106303EB48130593059B04999B +:101E20009A6992B28A42D5E9147325D39F4200D9A8 +:101E30005FB908F00F020121DAF8343801FA02F232 +:101E400023EA0203CAF8343818E0FF1A6B6C5A46CA +:101E500050469F4228BF1F46FB1C9B080493237CCF +:101E60000093BBB2A96C04F055FEAB6C3B44AB6471 +:101E70006B6D1F446F65D1E79F42DAD9039B08F170 +:101E800001081C3509F120095B080393C6E52046CB +:101E9000FFF762FDDCE52046F0F700F908E69960FF +:101EA000203353F8202C22F4001243F8202C53F84E +:101EB000202C42F0006243F8202CC3F8E811D3F83C +:101EC000E02122F40012C3F8E021D3F8E02142F02F +:101ED0000062C3F8E021029A01320292FCE56B69CC +:101EE00043F4005343F02B036B612B6943F00B0366 +:101EF0002B6108E60A31544F0A30544F10B590F860 +:101F0000BC230446012A0BD0012280F8381080F847 +:101F1000BC23006804F075FF002084F8BC0310BDEA +:101F20000220FCE770B501F00F0611F0800F0546A6 +:101F30004FF01C00C6EBC6044FEA84041FD004F126 +:101F40003C0100FB06500124294480F83D408A6092 +:101F50004A780E70CB7002B1CE80022B04BF0023F2 +:101F60000B7195F8BC33012B12D00123286885F83A +:101F7000BC3304F016FD002085F8BC0370BD04F5E9 +:101F8000FE7100FB06500024294480F8FD41DEE785 +:101F90000220F3E738B501F00F051C2404FB05010E +:101FA00004FB050401F5FE71C4F810320023C4F8E7 +:101FB0000822C4F8143284F8FD3184F8FC51036916 +:101FC0000068012B08BFC4F80C22DAB21DB904F076 +:101FD00027FD002038BD04F0B1FDFAE738B501F067 +:101FE0000F051C2404FB050104FB05043C3123659B +:101FF0000023A2646365012384F83C5084F83D30DB +:1020000003690068012B08BFE264DAB21DB904F06D +:1020100007FD002038BD04F091FDFAE738B501F066 +:102020000F05436804469D422CD811F0800F4FF0F5 +:102030001C001ED000FB0541012300FB05423C3182 +:1020400082F83D3001230D708B7094F8BC239A42C6 +:102050001AD0206884F8BC3304F07FFE2DB904F553 +:102060007172217C206804F03BFF002084F8BC03DF +:1020700038BD00FB01431A4603F5FE71002382F8C8 +:10208000FD31DFE70120F3E70220F1E738B501F089 +:102090000F02436804469A422AD8C2EBC20311F0E9 +:1020A000800F4FF01C004FEA830318D003F13C016E +:1020B00000FB02400123214480F83D3000250A70D6 +:1020C0008D7094F8BC33012B14D00123206884F860 +:1020D000BC3304F06DFE284684F8BC5338BD03F5CC +:1020E000FE7100FB02400023214480F8FD31E5E74A +:1020F0000120F3E70220F1E70068120470B5446A9A +:1021000019B922438262002070BD836A4D1E04EB20 +:10211000134400235E1CDBB29D4205D83F312243AD +:1021200000EB81004260EEE7403300EB83035B6825 +:1021300004EB13443346EDE703680020596270470F +:1021400002680021012380F8F413C0F8FC3308462C +:10215000936943F000639361536D43F0805343F000 +:102160000303536570477047024A136843F4807352 +:102170001360704700480258054A0129136923F08B +:102180000403136101D130BF704720BF704700BF07 +:1021900000ED00E070B51C4D0446EB6803F007034A +:1021A000062B06D0E86800F03F00001B18BF012096 +:1021B00070BDEB6823F03F030343EB6005F0E4FBE5 +:1021C00006466B689A0408D5A4F11D03012B0CD9AF +:1021D0002D3C012C09D90020EAE705F0D5FB801B36 +:1021E000B0F57A7FEDD90120E2E705F0CDFB064D91 +:1021F0000446EB68DB03EED405F0C6FB001BB0F52C +:102200007A7FF6D9EFE700BF0048025838B51E4C78 +:102210000D46236823F0010318432060C2B9FDF77F +:1022200019FF032813D1236923F001032361174BFE +:102230001A6942F004021A61BFF34F8FBFF36F8F28 +:10224000012D10D130BF1A6922F004021A6138BD85 +:10225000012A0AD1FDF7FEFE0128F8D1636923F0B7 +:1022600002036361E3E720BFEDE7FDF7F3FE032818 +:1022700004D1236923F004032361E8E7636923F0B1 +:1022800004036361E3E700BF0048025800ED00E08B +:10229000024AD36843F08073D36070470048025805 +:1022A0002DE9F0474E6A36B1B2F1406F03D08B6A28 +:1022B0000468013B2361D1F818A0D1E9077CBAF189 +:1022C000000F4ED04B6946EA0A0A0568D1F8008033 +:1022D0004FEA834E486B4AEA020AD1E90B49BCF146 +:1022E000000F26D08B684CEA0A0C0E69EB61A7B18F +:1022F00048EA0703234343EA09030343C868334317 +:10230000034343EA0E0343EA0C03B2F1406F6B61EF +:1023100001D04B68AB61BDE8F08748EA040343EAAB +:1023200009030343334343EA0E0343EA0C036B619F +:10233000F1E767B148EA0703234343EA090303438C +:10234000C868034343EA0E0343EA0A03DDE748EAA9 +:10235000040343EA0903034343EA0E0343EA0A037F +:10236000E5E7BCF1000F2CD004688B680869E361D5 +:1023700046EA0C034E6943EA0205D1F834C0B604BC +:10238000D1E90B83A7B13843B2F1406F40EA0800AE +:1023900043EA0003C86843EA0C0343EA000343EA44 +:1023A000060343EA05036361B5D04B68A361B2E756 +:1023B00040EA0800034343EA0C0333432B436361C1 +:1023C000A9E7D7B146EA0703CC6A0068B2F1406FCB +:1023D00043EA020343EA04030C6B43EA04034C6B35 +:1023E00043EA0403CC6843EA04034C6943EA8443A8 +:1023F000436190D04B6883618DE7002E8BD0CB6A10 +:10240000006833430E6B1A434B6932434E6B3243C1 +:1024100042EA834242617EE72DE9F041DDF818800F +:1024200004460E4615461F4622689368334214BF81 +:1024300001230023AB4201D1002012E0B8F1FF3F9D +:10244000F3D005F0A1FAC01B404502D8B8F1000F47 +:10245000EAD10423012084F84130636C43F0010386 +:102460006364BDE8F081704730B5044685B005F07F +:102470008BFA0346002C40D094F841203AB90390DF +:102480002046FFF7F0FF41F28832039BA2642068E8 +:10249000A1680268013922F4706242EA0122202117 +:1024A00002602046A26C00920022FFF7B5FF10BB2D +:1024B0002268E569E36811682B43256A21F07F41B2 +:1024C0002B43656821F0D00143EA05630B43136099 +:1024D0005568D4E905310B43216943EA01430849B2 +:1024E00029400B435360136843F001031360012339 +:1024F000606484F8413005B030BD0120FBE700BFC7 +:10250000FEF8E0FF704710B5044658B10268136842 +:1025100023F001031360FFF7F5FF0020606484F8E7 +:10252000410010BD0120FCE72DE9F043044685B0D1 +:102530001746894605F028FA94F840200346012AF8 +:1025400033D00122022684F8402094F84120012A49 +:102550005FFA82F827D1002203902021204662648E +:10256000009784F84160FFF757FF0546A0B902467F +:1025700049462046FFF794FED9F82420039B4AB928 +:102580004246314620460097FFF746FF054618B9F8 +:102590002368DE6084F84180002384F840302846B8 +:1025A00005B0BDE8F0833546F6E70225F7E7F0B55C +:1025B000044685B016460F4605F0E6F994F840202B +:1025C00003462568012A49D0012284F8402094F866 +:1025D0004120012AD0B23FD100226264002F36D0C0 +:1025E000122284F841202A690132E2622A69676274 +:1025F0000132A2626A6922F040626A61E26A8AB9C3 +:102600000122022120460096FFF706FF10B9236839 +:102610000222DA60012384F84130002384F840303C +:1026200005B0F0BD01220421204600960393FFF778 +:10263000F3FE0028EED1626A039B127885F8202011 +:10264000626A01326262E26A013AE262D6E7636C70 +:1026500043F008036364E0E70220DEE70220DFE7DF +:10266000F0B5044685B016460F4605F08DF925688D +:102670000346D5F818C094F84020012A4DD0012215 +:1026800084F8402094F84120012AD0B243D100229E +:102690006264002F3AD0222284F841202A69013254 +:1026A000A2632A69276301326263696921F040618C +:1026B00041F080616961C5F818C0A26B8AB9012236 +:1026C000022120460096FFF7A7FE10B923680222D8 +:1026D000DA60012384F84130002384F8403005B0EB +:1026E000F0BD01220621204600960393FFF794FED9 +:1026F0000028EED195F82010226B039B1170226BFD +:1027000001322263A26B013AA263D6E7636C43F005 +:1027100008036364E0E70220DEE70220DFE7000051 +:10272000F8B50446002874D00368D8075ED423683F +:10273000990700F1B0802368DA0627D5AA4B1A69F9 +:10274000996A02F03802082A07D0182A40F00E8150 +:1027500001F00302012A40F009811B68DB0502D564 +:10276000E369802B55D1FDF79DFB41F20303216AFC +:1027700098429D4B00F2F3805A68202922F0F842DB +:102780000CBF42F0804242EA81625A602368190716 +:1027900000F12E8123689A0600F14F8123685D07BE +:1027A0001ED5924D2B6843F480732B6005F0ECF836 +:1027B00006462B68DA0540F16581A3688A4D012B36 +:1027C00040F067812B6F43F001032B6741F288379C +:1027D00005F0DAF8844E0546336F9B0740F17F81A0 +:1027E000616A002940F0828100202AE07E4B1A694C +:1027F000996A02F03802102A05D0182A0BD101F08C +:102800000302022A07D11B689A0390D56368002B44 +:102810008DD1012015E06268B2F5803F12D11A68AF +:1028200042F480321A6005F0AFF86F4E0546336807 +:102830009B033FF57CAF05F0A7F8401B6428F6D951 +:102840000320F8BD684D2B689AB923F480332B60C0 +:102850002B6823F480232B6005F096F806462B683E +:102860009F037FF564AF05F08FF8801B6428F6D9CD +:10287000E6E7B2F5A02F07D143F480232B602B6845 +:1028800043F480332B60CEE723F480332B602B6836 +:1028900023F48023F6E7544B1A69996A12F0380240 +:1028A00003D0182A1FD18E071DD11B685D0702D5E2 +:1028B000E368002BADD0FDF7F5FA41F2030321697F +:1028C0009842494B5A6809D822F47C3240290CBFFF +:1028D00042F4003242EA01325A602CE722F0FE4212 +:1028E00042EA0162F8E7E1681A6839B322F0190296 +:1028F0003D4D0A431A6005F047F806462B68580715 +:1029000011D5FDF7CFFA41F20303226998426B68B3 +:102910000FD823F47C33402A0CBF43F4003343EA3E +:1029200002336B6007E705F02FF8801B0228E5D91A +:1029300086E723F0FE4343EA0263F2E722F0010256 +:10294000294E1A6005F020F80546336859077FF5CF +:10295000F2AE05F019F8401B0228F6D970E7DA68E4 +:1029600022F07C5242EA0162DA600FE7E2694AB380 +:102970001A681D4D42F080021A6005F005F80646FF +:102980002B68DF0511D5FDF78DFA41F20303226AAA +:10299000984210D86B68202A23F0F8430CBF43F00C +:1029A000804343EA82636B60F0E604F0EDFF801B36 +:1029B0000228E5D944E7EB6823F07C5343EA02633D +:1029C000EB60E3E61A68084E22F080021A6004F019 +:1029D000DBFF05463368D8057FF5D8AE04F0D4FF99 +:1029E000401B0228F6D92BE7004402580048025841 +:1029F0006369964D83B16B6F43F001036B6704F01D +:102A0000C3FF06466B6F9B073FF5C4AE04F0BCFFE7 +:102A1000801B0228F6D913E76B6F23F001036B6765 +:102A200004F0B2FF06466B6F9F077FF5B3AE04F06C +:102A3000ABFF801B0228F6D902E7A369834D83B15F +:102A40002B6843F480532B6004F09EFF06462B68EE +:102A500098043FF5A3AE04F097FF801B0228F6D937 +:102A6000EEE62B6823F480532B6004F08DFF0646BE +:102A70002B6899047FF592AE04F086FF801B022834 +:102A8000F6D9DDE604F080FF801B64287FF691AE66 +:102A9000D6E6B3B92B6F41F2883723F001032B67D9 +:102AA0002B6F23F004032B6704F06EFF06462B6F99 +:102AB00098077FF595AE04F067FF801BB842F6D902 +:102AC000BEE6052B2B6F03D143F004032B6779E699 +:102AD00023F001032B672B6F23F0040375E604F04A +:102AE00053FF401BB8427FF677AEA9E6574D2B69DE +:102AF00003F03803182B7AD02B68022923F0807357 +:102B00002B6067D104F040FF06462B6899015BD427 +:102B1000AB6AA26A23F47C7323F003031343E26AD3 +:102B200043EA0213AB62636BA26B013B013A5B02A7 +:102B300012049BB202F4FE021343226B013AC2F369 +:102B400008021343E26B013A120602F0FE421343FD +:102B50002B63EB6A23F00103EB626B6BA26C23F433 +:102B60007F4323F0F80343EAC2036B63EB6A226CF2 +:102B700023F00C031343EB62EB6A626C23F0020355 +:102B80001343EB62EB6A43F48033EB62EB6A43F48A +:102B90000033EB62EB6A43F48023EB62EB6A43F0B1 +:102BA0000103EB622B6843F080732B6004F0ECFEB2 +:102BB000264D04462B689A013FF516AE04F0E4FE5C +:102BC000001B0228F6D93BE604F0DEFE801B02283B +:102BD0009BD935E604F0D8FE04462B689B017FF5AF +:102BE00003AE04F0D1FE001B0228F6D928E6012925 +:102BF000AA6A2B6B3FF40DAE02F00301A06A81427A +:102C00007FF407AEC2F30512E16A8A427FF401AE97 +:102C1000226BC3F30801013A91427FF4FAAD626B73 +:102C2000C3F34621013A91427FF4F3ADA26BC3F3A3 +:102C30000641013A91427FF4ECADE26BC3F30663C7 +:102C4000013A93423FF4D0ADE3E500BF004402589F +:102C5000484B1A6902F03802102A30B500F086801D +:102C6000182A0CD0002A40F083801A68424812F0DB +:102C7000200F03D01B68C3F3C103D84030BD996A4D +:102C80009D6ADA6A15F47C7FC5F305105C6BF5D09C +:102C9000C4F3CC0402F0010207EE900A01F0030134 +:102CA0006243B7EE006AF8EEE76A012907EE902A60 +:102CB000FAEEE97A4CD002293CD0002948D11A68B2 +:102CC000920627D519682C4AC1F3C1011B6BCA4073 +:102CD000C3F3080307EE102AF8EEC75A85EEA67A6A +:102CE00006EE903AF8EEE66A76EEA77A77EE867A06 +:102CF000204B67EE877A1B6BC3F34623013307EE45 +:102D0000103AF8EEC76A87EEA67AFCEEC77A17EE9D +:102D1000900AB3E71B6BC3F3080307EE103AB8EE53 +:102D2000C77A77EE277A77EE867A9FED146A86EE79 +:102D3000267ADDE71B6BC3F3080307EE103AB8EE03 +:102D4000C77A77EE277A77EE867A9FED0D6AEEE7FF +:102D50001B6BC3F3080307EE103AB8EEC77A77EEA1 +:102D6000277A77EE867A9FED076AE0E7064885E7DF +:102D7000064883E7004402580090D0030024744CB6 +:102D800020BCBE4B0024744A40787D0100093D0000 +:102D90002DE9F0410D46044610B90120BDE8F0814F +:102DA000884A136803F00F038B42C0F093802368B6 +:102DB0005F0700F19B801E070BD583496669C869D0 +:102DC00000F07000864204D9CA6922F070023243D2 +:102DD000CA61D8060BD57C49A669C86900F4E060D1 +:102DE000864204D9CA6922F4E0623243CA61990674 +:102DF0000BD57549E669086A00F07000864204D96F +:102E00000A6A22F0700232430A629A070BD56E49B1 +:102E1000E668886900F00F00864204D98A6922F0CA +:102E20000F0232438A61DF076ED423689E0700F1E8 +:102E3000A18064490A6802F00F02AA4200F2A88049 +:102E4000580700F1B18019070BD55F496569C8695A +:102E500000F07000854204D2CA6922F070022A4351 +:102E6000CA61DA060BD55849A569C86900F4E06063 +:102E7000854204D2CA6922F4E0622A43CA619B06F1 +:102E80000BD5514AE069116A01F07001884204D201 +:102E9000136A23F0700303431362FFF7D9FE4A4914 +:102EA0004A4A8B69C3F30323D35C03F01F03D84062 +:102EB0008B6903F00F03D35C454A03F01F0320FA2C +:102EC00003F31360434B1860434BBDE8F0411868AF +:102ED00004F054BD136823F00F030B431360136811 +:102EE00003F00F038B427FF458AF60E73649266941 +:102EF000886900F0700086427FF65DAF8A6922F033 +:102F0000700232438A6156E72F4BA1689A6922F416 +:102F100070620A439A6162681B68022A1DD113F429 +:102F2000003F3FF43AAF284E41F28838336923F02E +:102F300007031343336104F027FD074633696268D2 +:102F400003F03803B3EBC20F3FF46FAF04F01CFD86 +:102F5000C01B4045F2D9032020E7032A02D113F019 +:102F6000007FDEE7012A02D113F4807FD9E713F056 +:102F7000040FD6E71449E668886900F00F0086421E +:102F8000BFF457AF8A6922F00F0232438A6150E7DB +:102F90000A6822F00F022A430A600A6802F00F0250 +:102FA000AA427FF4FAAE4BE707492569886900F029 +:102FB00070008542BFF447AF8A6922F070022A434D +:102FC0008A6140E7002000520044025836D30108CD +:102FD0001C030024180300241403002410B50C4C17 +:102FE000FFF736FE0B49A369C3F30323CA5CA36949 +:102FF00002F01F0203F00F0320FA02F2CB5C03F091 +:103000001F0322FA03F0044B1860044B1A6010BD32 +:103010000044025836D301081C030024180300247E +:1030200008B5FFF7DBFF054B054ADB69C3F3021365 +:10303000D35C03F01F03D84008BD00BF0044025812 +:1030400036D3010808B5FFF7C9FF054B054ADB6910 +:10305000C3F30223D35C03F01F03D84008BD00BFB5 +:103060000044025836D3010838B53F2304460360B4 +:103070003A4B1A68510360D54FF4A02262601B6876 +:10308000364D03F08003E361FCF70CFF41F20303CC +:10309000984259D86B68C3F3846323622B6803F0AA +:1030A0000103E360FCF7FEFE41F2030398426B6804 +:1030B00094BFC3F30533C3F306632361274B1A6F31 +:1030C000520745D50522A2605A6F02F001026261E3 +:1030D0001A68C2F30032A2611B6813F0807F14BF2C +:1030E0000223012363621D4B9A6A02F00302A2626B +:1030F0009A6AC2F30512E2621A6BC2F30802013245 +:1031000022631A6BC2F306620132E2631A6BC2F3E6 +:103110004622013262631A6BC2F306420132A26395 +:10312000DA6A02F00C022264DA6AC2F340026264D4 +:103130005B6BC3F3CC03A36438BD1A6812F480320E +:1031400018BF4FF4803299E7EB68C3F30563A4E737 +:103150001A6F12F0010218BF0122B4E700440258AE +:103160003F230360114B1A6902F0070242609A691B +:1031700002F4706282609A6902F00F02C2609A697A +:1031800002F070020261DA6902F070024261DA69EB +:1031900002F4E06282611B6A03F07003C361044BB6 +:1031A0001B6803F00F030B60704700BF0044025818 +:1031B00000200052F8B53A4C06460D46A36A03F0CB +:1031C0000303032B69D0236823F08063236004F09A +:1031D000DBFB074623681A014BD4A36A326823F449 +:1031E0007C3343EA0233A362B368F268013B013ADD +:1031F0005B0212049BB202F4FE0213437268013AAE +:10320000C2F3080213433269013A120602F0FE4289 +:103210001343A363E36A726923F0C0031343E362B9 +:10322000E36AB26923F020031343E362E36A23F005 +:103230001003E362E36BF26923F47F4323F0F803A6 +:1032400043EAC203E363E36A43F01003E362E36A21 +:10325000B5B943F40023E362114C236843F0806363 +:10326000236004F091FB054623681B010FD5002065 +:1032700005E004F089FBC01B0228ABD90320F8BD90 +:10328000012D0CBF43F4801343F40013E3E704F073 +:103290007BFB401B0228E7D9F0E70120EFE700BFE6 +:1032A00000440258F8B53A4C06460D46A36A03F0AE +:1032B0000303032B69D0236823F08053236004F0B9 +:1032C00063FB074623689A004BD4A36A326823F055 +:1032D0007C7343EA0253A362B368F268013B013A8C +:1032E0005B0212049BB202F4FE0213437268013ABD +:1032F000C2F3080213433269013A120602F0FE4299 +:1033000013432364E36A726923F440631343E36263 +:10331000E36AB26923F400731343E362E36A23F4BC +:103320008073E362636CF26923F47F4323F0F80354 +:1033300043EAC2036364E36A43F48073E362E36ACB +:10334000B5B943F48003E362114C236843F0805322 +:10335000236004F019FB054623689B000FD500206D +:1033600005E004F011FBC01B0228ABD90320F8BD17 +:10337000012D0CBF43F4000343F08073E3E704F036 +:1033800003FB401B0228E7D9F0E70120EFE700BF6D +:10339000004402582DE9F8430668054616F0006619 +:1033A00009D0836EB3F5001F2ED013D8F3B1B3F557 +:1033B000801F21D001262B68DB0540F10281AB6D17 +:1033C000042B00F2FD80DFE813F024002B00F50051 +:1033D00029002900B3F5401FECD1B84A0026A96E98 +:1033E000136D23F440130B431365E4E7B34AD36A28 +:1033F00043F40033D362F0E702210430FFF7DAFE32 +:1034000006460028D7D1E8E702212430FFF74AFF1B +:10341000F6E7AA4AD36A43F40033D362344604E0A1 +:103420000021281DFFF7C6FE0446002C40F0CB808B +:10343000A24AA96D136D23F007030B4313652B6894 +:103440009F050DD5EB6D802B00F0DA8000F2BD807A +:10345000002B00F0C980402B00F0CC8001263446C0 +:103460002B68580510D5D5F8A830B3F5800F00F0BB +:10347000EC8000F2CD80002B00F0DB80B3F5001F64 +:1034800000F0DD80012634462B68190510D5D5F8EB +:10349000AC30B3F1007F00F0FD8000F2DE80002B45 +:1034A00000F0EC80B3F1807F00F0EE80012634461E +:1034B0002B689A010DD5AB6C202B00F0078100F230 +:1034C000F180002B00F0F180102B00F0F980012634 +:1034D00034462B68DB040FD52B6EB3F5005F00F08C +:1034E000198100F2FB80002B00F00881B3F5805FAA +:1034F00000F00A81012634462B689F040FD56B6EBD +:10350000B3F5003F00F0268100F20C81002B00F0A3 +:103510001281B3F5803F00F01781012634462B68F5 +:10352000580410D5D5F8B030B3F1005F00F0338106 +:1035300000F21881002B00F01E81B3F1805F00F0D3 +:103540002481012634462B68590114D5EB6C43B114 +:10355000B3F5807F40F027810121281DFFF72AFE67 +:103560000446002C40F02281544AE96CD36C23F4C9 +:1035700080730B43D3642B681A040DD52B6FB3F102 +:10358000805F00F01581B3F1005F00F01F81002B18 +:1035900000F01381012634462B68DB0140F12C81B9 +:1035A0006B6C032B00F26C81DFE813F01D01180136 +:1035B00064011D01002105F12400FFF773FE33E7CC +:1035C000012634463BE7264639E7C02B03D0B3F546 +:1035D000807F7FF443AFCCB9384AE96D136D23F493 +:1035E000E0730B4313653BE7344AD36A43F400337B +:1035F000D362F0E70021281DFFF7DCFD0446EAE76F +:10360000002105F12400FFF74DFEF7E7264627E7E6 +:10361000B3F5C00F03D0B3F5000F7FF433AFD4B9C7 +:10362000264AD5F8A810936D23F460030B439365E5 +:103630002AE7224AD36A43F40033D362EFE700213A +:10364000281DFFF7B7FD0446E9E7002105F1240036 +:10365000FFF728FEF7E7264616E7B3F1407F03D0D1 +:10366000B3F1806F7FF422AFD4B9144AD5F8AC100F +:10367000936D23F0E0630B43936519E70F4AD36A18 +:1036800043F40033D362EFE70021281DFFF792FDDA +:103690000446E9E7002105F12400FFF703FEF7E700 +:1036A000264605E7302B7FF412AFACB9034AA96C6C +:1036B000D36C23F030030B43D3640AE70044025871 +:1036C0009B4AD36A43F40033D362EEE70221281DFC +:1036D000FFF770FD0446E8E72646FAE6B3F5405FDB +:1036E00003D0B3F5804F7FF405AFCCB9904A296E73 +:1036F000136D23F4E0430B431365FDE68C4AD36A54 +:1037000043F40033D362F0E70021281DFFF752FD98 +:103710000446EAE7002105F12400FFF7C3FDF7E7BF +:103720002646E9E623F48032B2F5802F03D0B3F5C4 +:10373000403F7FF4F2AE9CB97D4A696E136D23F46D +:10374000E0230B431365EAE60121281DFFF732FD54 +:103750000446F0E7012105F12400FFF7A3FDF7E798 +:103760002646DCE623F08052B2F1804F03D0B3F15D +:10377000405F7FF4E6AEA4B96D4AD5F8B010936D02 +:1037800023F0E0430B439365DDE60121281DFFF79D +:1037900011FD0446EFE7012105F12400FFF782FD4A +:1037A000F7E72646CFE601263446E4E62646E2E67B +:1037B0005F4AD36A43F40033D3626CB95C4A296F21 +:1037C000136D23F040530B431365E5E60121281DDB +:1037D000FFF7F0FC0446F0E72646DDE6544AD36ADC +:1037E00043F40033D362002C4DD1514A696CD36C41 +:1037F00023F003030B43D3642B685F024DD54D4F79 +:103800003B6843F480733B6004F0BEF880463B683D +:10381000D8053AD5002C6CD1454BD5F8B4001A6FB9 +:10382000424012F4407F0BD01A6F196F22F440729D +:1038300041F480311967196F21F4803119671A67D3 +:10384000B0F5807F40D0D5F8B430394903F44072E8 +:10385000B2F5407F49D10869374A20F47C5002EA2A +:10386000131202430A61C3F30B03314A116F0B4376 +:10387000136712E00221281DFFF79CFC0446B2E703 +:1038800001263446B8E72646B6E704F07DF8A0EBFB +:1038900008006428BBD9032634462B68DA0708D50C +:1038A000EB6F102B3CD026D85BB3082B32D001260F +:1038B00034462B689B074ED5AB6F052B61D8DFE8EC +:1038C00003F0423D5A42424204F05EF8DFF8608065 +:1038D000074641F28839D8F870309907B3D404F01C +:1038E00053F8C01B4845F6D9D5E70A6922F47C5243 +:1038F000B8E72646D1E723F00802202A01D0182B8A +:10390000D5D19CB90A4AE96F536D23F038030B43B4 +:103910005365CEE70121281DFFF74CFC0446F0E774 +:10392000012105F12400FFF7BDFCF7E72646C0E7BB +:103930000044025800480258CFFFFF000121281D13 +:10394000FFF738FC0446FCB9B74AA96F536D23F062 +:1039500007030B4353652B685F0727D5D5F89430D1 +:10396000052B00F23A81DFE813F016001100320156 +:10397000160016001600012105F12400FFF792FC45 +:10398000E0E701263446E6E72646E4E70121281D64 +:10399000FFF710FC0446002C40F02281A24AD5F823 +:1039A0009410936D23F007030B4393652B689806DF +:1039B00010D5D5F89030B3F1005F00F02C8100F203 +:1039C0001181002B00F01781B3F1805F00F01D81A1 +:1039D000012634462B68590610D5D5F89C30B3F52E +:1039E000006F00F03C8100F22181002B00F0278164 +:1039F000B3F5806F00F02D81012634462B681A063E +:103A000010D5D5F8A030B3F5804F00F0498100F211 +:103A10002E81002B00F03481B3F5005F00F03A8175 +:103A2000012634462B681B0714D5D5F88430B3F52E +:103A3000805F07D1022105F12400FFF733FC002845 +:103A400018BF0126784AD5F88410536D23F44053EB +:103A50000B4353652B68DF0614D5D5F89830B3F5C2 +:103A6000807F07D1022105F12400FFF71BFC00280D +:103A700018BF01266C4AD5F89810936D23F4407353 +:103A80000B4393652B6818031AD5D5F8A410B1F52C +:103A9000803F00F00D81B1F5003F06D0002940F0D5 +:103AA0000D81281DFFF786FB0446002C40F009819C +:103AB0005D4AD5F8A410936D23F440330B4393650E +:103AC0002B6859031CD5D5F88830B3F5001F00F0DA +:103AD000FA80B3F5401F08D0B3F5801F40F0FA809C +:103AE000514AD36A43F40033D362002C40F0F5808E +:103AF0004D4AD5F88810536D23F440130B4353659A +:103B00002B68DA0309D52B6D002B00F0E880B3F5A4 +:103B1000803F00F0F280012634462B689B0007D5D9 +:103B2000022105F12400FFF7BDFB002818BF012684 +:103B30002B689F030BD5D5F88010B1F5807F00F07E +:103B4000F28000F2E280002900F0E5800126DC022C +:103B500006D53549686F0A6D22F0004202430A65B6 +:103B6000D80007D53049D5F8B8000A6922F4804258 +:103B700002430A61990206D52B49E86E0A6D22F0CC +:103B8000807202430A655A0009D5274A116921F457 +:103B9000004111611169D5F8BC0001431161002B8E +:103BA00006DA2149686DCA6C22F040520243CA64A9 +:103BB0001B0207D51C4AD5F88C10536D23F4400323 +:103BC0000B435365301E18BF0120BDE8F883012167 +:103BD00005F12400FFF766FBDCE601263446E5E646 +:103BE0002646E3E623F08052B2F1804F03D0B3F1D2 +:103BF000405F7FF4EDAEA4B90B4AD5F89010536D39 +:103C000023F0E0430B435365E4E60021281DFFF752 +:103C1000D1FA0446EFE7022105F12400FFF742FB49 +:103C2000F7E72646D6E600BF0044025823F4806238 +:103C3000B2F5805F03D0B3F5406F7FF4DDAEA4B979 +:103C40003D4AD5F89C10936D23F4E0530B439365E4 +:103C5000D4E60021281DFFF7ADFA0446EFE7022164 +:103C600005F12400FFF71EFBF7E72646C6E623F41E +:103C70000052B2F5004F03D0B3F5C04F7FF4D0AE81 +:103C8000A4B92D4AD5F8A010936D23F460430B43DB +:103C90009365C7E60021281DFFF78CFA0446EFE77D +:103CA000022105F12400FFF7FDFAF7E72646B9E601 +:103CB000022105F12400FFF7F5FAF5E60126344666 +:103CC000FEE62646FCE6012105F12400FFF7EAFAAC +:103CD00004460AE70126344612E7264610E7164A4C +:103CE000D36A43F40033D3626CB9134A296DD36CA1 +:103CF00023F480330B43D3640FE70221281DFFF721 +:103D000059FA0446F0E7264607E721F48072B2F537 +:103D1000007F7FF41BAF64B90748426D22F4407204 +:103D20000A43426513E70448C26A42F40032C262A1 +:103D3000F1E726460BE700BF0044025808B5FFF73D +:103D40004DF9054B054A1B6AC3F30213D35C03F01C +:103D50001F03D84008BD00BF0044025836D30108F5 +:103D60004E4A70B5946A966AD36A16F47C3FC6F3DD +:103D70000531D56B00F08D8007EE901AC3F3001368 +:103D8000C5F3CC0104F00304F8EEE76A4B43012CC1 +:103D9000B7EE006A07EE903AFAEEE97A6BD0022CA1 +:103DA0005BD0002C67D113689B0646D51168936BD6 +:103DB000C1F3C1013A4AC3F30803CA4007EE102A0F +:103DC000F8EEC75A85EEA67A06EE903AF8EEE66A65 +:103DD00076EEA77A77EE867A304A67EE877A936B2B +:103DE000C3F3462307EE103AB8EEC77A37EE067AE9 +:103DF000C7EE876AFCEEE66AC0ED006A936BC3F318 +:103E0000064307EE103AB8EEC77A37EE067AC7EEE9 +:103E1000876AFCEEE66AC0ED016A936BC3F3066342 +:103E200007EE103AB8EEC77A37EE066A87EE867A62 +:103E3000BCEEC77A80ED027A70BD936BDFED195A44 +:103E4000C3F3080307EE103AB8EEC77A77EE277A85 +:103E500077EE867A85EEA67ABEE7936BDFED125A8F +:103E6000C3F3080307EE103AB8EEC77A77EE277A65 +:103E700077EE867AEEE7936BDFED0C5AC3F3080317 +:103E800007EE103AB8EEC77A77EE277A77EE867AA1 +:103E9000E0E7C0E900118160CEE700BF00440258AE +:103EA0000090D0030024744C20BCBE4B0024744A04 +:103EB0004E4A70B5946A966AD36A16F07C7FC6F350 +:103EC0000551556C00F08D8007EE901AC3F3002366 +:103ED000C5F3CC0104F00304F8EEE76A4B43012C70 +:103EE000B7EE006A07EE903AFAEEE97A6BD0022C50 +:103EF0005BD0002C67D113689B0646D51168136C04 +:103F0000C1F3C1013A4AC3F30803CA4007EE102ABD +:103F1000F8EEC75A85EEA67A06EE903AF8EEE66A13 +:103F200076EEA77A77EE867A304A67EE877A136C58 +:103F3000C3F3462307EE103AB8EEC77A37EE067A97 +:103F4000C7EE876AFCEEE66AC0ED006A136CC3F345 +:103F5000064307EE103AB8EEC77A37EE067AC7EE98 +:103F6000876AFCEEE66AC0ED016A136CC3F3066370 +:103F700007EE103AB8EEC77A37EE066A87EE867A11 +:103F8000BCEEC77A80ED027A70BD136CDFED195A72 +:103F9000C3F3080307EE103AB8EEC77A77EE277A34 +:103FA00077EE867A85EEA67ABEE7136CDFED125ABD +:103FB000C3F3080307EE103AB8EEC77A77EE277A14 +:103FC00077EE867AEEE7136CDFED0C5AC3F3080345 +:103FD00007EE103AB8EEC77A77EE277A77EE867A50 +:103FE000E0E7C0E900118160CEE700BF004402585D +:103FF0000090D0030024744C20BCBE4B0024744AB3 +:104000004E4A70B5946A966AD36A16F47C7FC6F3FA +:104010000511556B00F08D8007EE901A03F0010337 +:10402000C5F3CC0104F00304F8EEE76A4B43012C1E +:10403000B7EE006A07EE903AFAEEE97A4DD0022C1C +:104040005BD0002C67D113689B0664D51168136B95 +:10405000C1F3C1013A4AC3F30803CA4007EE102A6C +:10406000F8EEC75A85EEA67A06EE903AF8EEE66AC2 +:1040700076EEA77A77EE867A304A67EE877A136B08 +:10408000C3F3462307EE103AB8EEC77A37EE067A46 +:10409000C7EE876AFCEEE66AC0ED006A136BC3F3F5 +:1040A000064307EE103AB8EEC77A37EE067AC7EE47 +:1040B000876AFCEEE66AC0ED016A136BC3F3066320 +:1040C00007EE103AB8EEC77A37EE066A87EE867AC0 +:1040D000BCEEC77A80ED027A70BD136BDFED195A22 +:1040E000C3F3080307EE103AB8EEC77A77EE277AE3 +:1040F00077EE867A85EEA67ABEE7136BDFED125A6D +:10410000C3F3080307EE103AB8EEC77A77EE277AC2 +:1041100077EE867AEEE7136BDFED0C5AC3F30803F4 +:1041200007EE103AB8EEC77A77EE277A77EE867AFE +:10413000E0E7C0E900118160CEE700BF004402580B +:104140000090D0030024744A20BCBE4B0024744C61 +:10415000B0F5807F1FB531D19E4B1A6D02F007027A +:10416000042A4BD8DFE812F0CC00390005003301F7 +:104170000D00186810F0005037D001A8FFF798FE26 +:1041800032E0DA6C196802F040521B68490705D525 +:1041900022B9C3F3C1039048D84026E0D80502D520 +:1041A000B2F1805F53D08B4B186810F400301CD0F4 +:1041B000B2F1005F894818BF002016E0B0F5007F1B +:1041C00027D1844B1A6D02F4E072802AD1D00FD827 +:1041D000002A00F09580402A10D1186810F0006085 +:1041E00003D001A8FFF7BCFD019805B05DF804FB02 +:1041F000C02A00F0EC80B2F5807F01D00020F4E707 +:10420000DA6C196802F04052490719D5C2B91B6827 +:10421000BFE7B0F5806F1CD16E4B9A6D02F460025F +:10422000B2F5800FA5D004D8002A69D0B2F5001FDE +:10423000D2E7B2F5C00F00F0CA80B2F5000FDCE79C +:10424000644B1968C905AFD5B2F1805FACD1644841 +:10425000CBE7B0F5006F1CD15E4B9A6D02F0E062C7 +:10426000B2F1007F85D004D8002A49D0B2F1807F16 +:10427000B2E7B2F1407F00F0AA80B2F1806FBDD109 +:10428000DA6C196802F040524807DAD5002AD8D112 +:10429000BDE7B0F5805F13D14E4B1A6D02F4E042DA +:1042A000B2F5005F3FF465AF03D84AB3B2F5805F63 +:1042B00092E7B2F5405F00F08A80B2F5804FDEE70A +:1042C000B0F5002F15D1434B9A6D02F44032B2F590 +:1042D000803F05D0B2F5003FD2D0002A8ED17CE7D6 +:1042E000186810F0005080D001A8FFF7E1FD039896 +:1042F0007BE7B0F5803F16D1364BDA6CD20309D498 +:10430000186810F000703FF470AF01A8FFF778FE56 +:1043100002986AE7186810F000603FF466AF01A8E1 +:10432000FFF71EFDE3E7B0F5804F3ED1294B9A6DB4 +:1043300002F0E042B2F1405F2AD00BD8B2F1805FC8 +:1043400014D0B2F1005F1AD0002A7FF457AFFFF704 +:10435000F5FC4AE7B2F1804F20D0B2F1A04F7FF4D4 +:104360004DAF18681D4B10F400301BE0186810F0BA +:1043700000603FF43AAF01A8FFF7F2FCC8E7186805 +:1043800010F000503FF431AF01A8FFF791FDBFE7F7 +:10439000186810F004003FF428AF38E71868104B95 +:1043A00010F4807018BF18461FE7B0F5004F7FF477 +:1043B00025AF084B1A6D02F04052B2F1805F9FD0DA +:1043C000B2F1005FD2D0002A7FF418AFC9E70548E8 +:1043D0000BE700BF004402580090D00340787D01F5 +:1043E00000093D000080BB007047026838B5D36803 +:1043F000044623F0A003D36003F0C6FA0546236801 +:10440000DB689B0601D5002038BD03F0BDFA401BD8 +:10441000B0F57A7FF3D90320F6E7F8B503680546CF +:10442000DC6814F0400416D14FF0FF320327DA6045 +:1044300003F0AAFA06462B68DB685B0601D5204626 +:10444000F8BD03F0A1FA801BB0F57A7FF3D90324FD +:1044500085F82170EFE70024F1E70000104BDA68DF +:1044600022F0400210B5DA6004469A68920606D43B +:10447000FFF7BBFF10B1032084F8210010BD9A683C +:1044800022F020029A60FFF7B0FF10B1032084F8F9 +:104490002100034A936843F020039360EEE700BFD6 +:1044A0000040005838B5044600283FD090F821302D +:1044B00003F0FF021BB980F82020FFF795FF0223CD +:1044C000CA22204684F8213023685A6253225A6255 +:1044D000FFF7A3FF10BB22682069936823F4E00371 +:1044E00023F040039360636891680343A06903432A +:1044F00020460B439360D4E9021343EA014313615E +:10450000FFF7ACFF50B922686569D36C23F0030351 +:10451000D364E369D16C2B430B43D3642368FF223C +:104520005A6210B9012384F8213038BD0120FCE71C +:104530000023092803D840EA0310C0B270470A38A4 +:104540000133C0B2F5E72DE9F04190F8203006467E +:104550000F469046012B4FF0020354D0012280F801 +:104560002130036880F82020CA225A6253225A62FE +:10457000FFF753FF70BB316838787C78BD788A6864 +:10458000B8F1000F32D112F0400208BFFA70FFF705 +:10459000CFFF02462046FFF7CBFF04462846FFF731 +:1045A000C7FFFD7840EA855545EA024242EA042306 +:1045B00003F07F3323F0FE430B608B6823F48023EA +:1045C0008B608A68D7E903300343304613438B601E +:1045D000FFF744FF3368FF225A6210B9012386F8BF +:1045E0002130002386F82030BDE8F081240212F04B +:1045F000400244EA004408BFFA70F87844EA050330 +:1046000043EA8053D4E71846EEE72DE9F04190F8ED +:1046100020300646012B4FF002033FD0012086F8E0 +:10462000213086F820000D78C8784C786D0391F819 +:104630000280AABBE30603D524F010040A344C70B0 +:10464000FFF776FF07464878FFF772FF04464046BB +:10465000FFF76EFF40EA050242EA074545EA0424F7 +:104660003368CA2230465A6253225A62FFF7D5FE97 +:1046700040B924F07F443268304624F0C0045460CE +:10468000FFF7ECFE3368FF225A6210B9012386F867 +:104690002130002386F82030BDE8F0811846FBE782 +:1046A00045EA004545EA080343EA0424D8E703093C +:1046B00000F00F0003EB830300EB4300C0B2704730 +:1046C0000368503343F8212070470368503353F890 +:1046D0002100704790F82030012B4FF0020312D0D8 +:1046E00080F82130CA2203685A6253225A629A68BB +:1046F00042F020029A60FF225A62012380F82130A2 +:10470000002380F820301846704700002DE9F0475C +:10471000054686B0884603F037F9082181462868A7 +:1047200001F0A8FC044648BB696C2868090401F044 +:10473000ACFD044610BB4FF0FF300823302669461D +:104740000494CDE9000302232868CDE90263012324 +:10475000059301F0C0FB286801F0C9FD044668B963 +:104760000746064640F22A5A2868426B12EA0A0FA8 +:10477000426B07D0120719D508248463204606B07F +:10478000BDE8F087110308D43CB901F075FB06467B +:104790002868012401F070FB074603F0F5F8A0EB50 +:1047A00009000130E0D14FF00044E7E7426B930786 +:1047B00001D50224E1E7446B14F0200401D0202449 +:1047C000DBE7044A3FBA36BA8263C8F80070C8F81B +:1047D0000460D3E73A0F00187047704710B50446DD +:1047E00068B1032380F83030006801F053FB2046A5 +:1047F000FFF7F3FF0020606384F8300010BD012054 +:10480000FCE700002DE9F04F0E4687B004469246C3 +:104810001F4603F0B9F8814636B9636B43F0006375 +:104820004FF00108636311E094F83030012B5FFA18 +:1048300083F840F0C1800AEB0703226D0021934208 +:10484000616307D9636B43F000736363404607B04D +:10485000BDE8F08F03230225206884F83030A36B75 +:10486000C1626946012B4FF0FF3300934FEA4723A3 +:1048700018BF4FEA4A2A01939023CDE9023500235D +:10488000CDE9043301F027FB2068012FC36843F012 +:104890004003C36010D95146E56201F01DFC88B1A8 +:1048A0002368474A9A63636B18436063012384F863 +:1048B00030300023E362C9E701235146E36201F08F +:1048C000F2FBECE7019D2068436B13F4957F1BD04E +:1048D000C36823F04003C360436BDB0508D5012F99 +:1048E00006D9A36B032B03D001F08CFC0028D7D191 +:1048F0002368586B10F0080039D0314A9A63636B13 +:1049000043F008036363D1E7436B1A0419D51F2DE5 +:1049100017D906F1040A06F1240B20680AF1040AEB +:1049200001F0AAFA0AF8080C020A0AF8072C020C8D +:104930000AF8062C020E0AF8052CDA45EDD12036CD +:10494000203D03F021F8109BA0EB09009842BAD358 +:1049500023684FF003081A4A9A63636B43F00043DD +:104960006363012384F830300023E3626EE7596B00 +:1049700011F002010AD0124A9A63636B43F00203FA +:104980006363012384F83030E0625FE75A6B12F012 +:1049900020020AD00A4A9A63636B43F020036363E0 +:1049A000012384F83030E16250E70649904699636C +:1049B000012384F8303049E7636B43F000532FE75D +:1049C000FF0FE01F3A0F00182DE9F04F0D4689B098 +:1049D000044692461F4602F0D7FF814635B9636B05 +:1049E00043F000634FF00108636311E094F8303046 +:1049F000012B5FFA83F840F0B3800AEB0703226DC6 +:104A000000219342616307D9636B43F000736363D2 +:104A1000404609B0BDE8F08F0323206884F83030A9 +:104A2000A36BC1629021012B4FF0FF3302934FEA39 +:104A3000472318BF4FEA4A2A03930023CDE9041302 +:104A400002A9CDE9063301F046FA2068012FC368B8 +:104A500043F04003C36011D920235146E36201F0C3 +:104A60006DFB88B12368404A9A63636B18436063A7 +:104A7000012384F830300023E362C9E71023514654 +:104A8000E36201F042FBECE7039E2068436B13F402 +:104A90008D7F1BD0C36823F04003C360436BDB05ED +:104AA00008D5012F06D9A36B032B03D001F0AAFB75 +:104AB0000028D7D12368586B10F008002BD02A4A61 +:104AC0009A63636B43F008036363D1E7436B5A0453 +:104AD0000DD51F2E0BD905F1200B55F8043B01A96C +:104AE0002068019301F0CBF9AB45F6D1203E02F0EE +:104AF0004BFF129BA0EB09009842C6D323684FF0EE +:104B00000308194A9A63636B6363012384F83030A6 +:104B10000023E3627CE7596B11F002010AD0124ACC +:104B20009A63636B43F002036363012384F83030BC +:104B3000E0626DE75A6B12F010020AD00A4A9A63DB +:104B4000636B43F010036363012384F83030E16248 +:104B50005EE7064990469963012384F8303057E7B1 +:104B6000636B43F000533DE7FF0FE01F3A0F00185F +:104B7000F8B590F8303004460E461546012BDFB2EA +:104B800052D100219642416305D9436B43F0006343 +:104B900063633846F8BD036D934203D2436B43F021 +:104BA0000073F5E7032380F83030236C00689A0621 +:104BB00008D41E4B8363636B43F08063636384F8A4 +:104BC0003070E6E701F084F9830106D52368174ABF +:104BD0009A63636B43F40063F0E7A36B012B03D08C +:104BE000032B16D076026D023146206801F0BFFA21 +:104BF00048B123680D4A9A63636B184301236063CD +:104C000084F83030C5E72946206801F0C9FA002849 +:104C1000EFD10021206801F0DCFA0028E9D101235E +:104C2000074684F83030B4E70227B2E7FF0FE01FF1 +:104C300070470000C36D9A0F0A70C3F383624A7015 +:104C4000C3F301628A70C3F30742CA70C3F3072239 +:104C5000DBB20A714B71036E1A0DCA80C3F30342B3 +:104C60000A72C3F3C0324A72C3F380328A72C3F34A +:104C70004032CA72C3F300320A7300224A73826B55 +:104C800010B5002A6BD140F6FC74426E04EA83032F +:104C900043EA92730B61C2F3C2630B75C2F3026302 +:104CA0004B75C2F342538B75C2F38243C2F3C232D7 +:104CB000CB750A760B690A7E013302F007020232D5 +:104CC000934083640A7A02F00F040122A240C26476 +:104CD000520A534303654FF400734365436EC3F3B5 +:104CE00080324A76C3F3C61203F07F038A76CB760E +:104CF000836E0020DA0F0A77C3F341724A77C3F359 +:104D000082628A77C3F38352CA77C3F3405281F831 +:104D10002020C3F3004281F8210081F82220C3F350 +:104D2000C03281F82320C3F3803281F82420C3F3FA +:104D3000403281F82520C3F3003281F82620C3F3E6 +:104D4000812281F82720C3F30122C3F3460381F8AF +:104D5000282081F82930012381F82A3010BD012A4A +:104D60000FD11B04B0F8662003F47C1313430B61CE +:104D70000B6901339B02836403654FF40073C364C2 +:104D8000ABE70368054A9A63436B43F08053436380 +:104D9000012380F830301846E0E700BFFF0FE01F26 +:104DA0002DE9F041002794B004464FF48030CDE95E +:104DB0000477CDE90677FFF7CBF9054648B9012519 +:104DC0004FF0006384F830506363284614B0BDE8A8 +:104DD000F081734E04ABB0FBF6F6079831460896A7 +:104DE00076008DE8030020680ECB01F02BF82068D8 +:104DF00001F04AF86B48B5FBF6F5B0FBF5F0013071 +:104E0000FBF73EF82068039701F078F8064698B95A +:104E1000206801F0CDFB30B12068E66301F06EF848 +:104E200088B1064608E00123E3630021206801F011 +:104E30002CFA58B14FF08056012584F83050606B41 +:104E400006436663C1E7E36B012BEED04FF6FE75B8 +:104E50000021DFF858812F46039BAB4200D8B9B13F +:104E6000039BBB422AD816F0804F4FF0010300D0BD +:104E7000A3632068ADF80A3001F012F808BB4FF0C8 +:104E80008060012584F83050616B084360639CE7C3 +:104E9000206801F0FAF906460028CDD14146206885 +:104EA00001F0E8FA0028C5D13146206801F010F879 +:104EB000039B0646C10F01330393CDE74FF0807685 +:104EC000BAE7A36B032B42D0206801F083FA0028D5 +:104ED000D7D10146206800F0FBFF0421E06620687E +:104EE00000F0F6FF08212067206800F0F1FF0C2198 +:104EF0006067206800F0ECFFA36BA067032B26D04F +:104F00000DF10A01206801F00FFB0028B9D1A36B55 +:104F10002068032B1BD0BDF80A106164090401F05E +:104F20006FFA0028ADD10146206800F0D1FF0421BE +:104F3000E065206800F0CCFF08212066206800F0C2 +:104F4000C7FF0C216066206800F0C2FFA066042144 +:104F5000206800F0BDFF09A9000D20642046FFF77E +:104F600069FE054610B14FF080508AE7616C2068F9 +:104F7000090401F071F9002883D14FF40071206811 +:104F800001F078F800283FF420AF23680125064A95 +:104F90009A63636B1843606384F8305015E700BF71 +:104FA00000350C0010210100FF0FE01F000010C1B0 +:104FB0002DE9F041044696B00D4602F0E5FC0021D3 +:104FC0000646206800F084FF83010BD54FF4006093 +:104FD00023680125534A9A63636B1843606384F81E +:104FE00030508AE04021206801F044F810B1636B32 +:104FF0006363EDE7616C2068090401F046F900285D +:10500000F5D140234FF0FF374FF0600C0490694614 +:105010002068CDE900730223CDE902C30123059383 +:1050200000F059FF206801F094F90028DFD106AFA5 +:1050300023685A6B12F4957F0AD05A6B11076FD40C +:105040005A6B92076AD45B6B9B061ED52020BFE784 +:105050005B6B180408D507F12008206800F00CFFEE +:1050600047F8040BB845F8D102F08EFC801B0130E4 +:10507000DED14FF00040ABE700F0FEFE47F8040B36 +:1050800002F082FC801B0130F3D02068436B13F4E4 +:105090008053F1D10699244A8263C1F381122A70A8 +:1050A000C1F340126A700A0A22F0FF0242EA11625A +:1050B00092B26A80079A12BA6A60089AD1B22972CB +:1050C000C2F307216972C2F30351120CA972099944 +:1050D00022F0FF02C8B20243AA81C1F38522AA735B +:1050E000C1F30122EA73C1F3031201F00F012A7424 +:1050F0009DF82B206974AA741D464FF40071206836 +:1051000000F0B8FF30B123680125064A9A63606356 +:1051100084F83050284616B0BDE8F081022057E7E9 +:10512000082055E7FF0FE01F3A0F0018836B0B6054 +:10513000C36B4B60036C8B60436CCB60836C0B6107 +:10514000C36C4B61036D8B61436D0020CB61704775 +:10515000032330B580F8303089B0836B04460D46A8 +:10516000032B02D0B1F5004F03D1636B43F08053A2 +:1051700053E0B1F5804F2AD100210068CDE9031139 +:1051800000F0A6FE80011CD403A92046FFF7BEFA5A +:1051900060B9049B590317D5616C2068090401F0BC +:1051A00074F818B90221206801F088F8636B18437D +:1051B0006063636B002B32D02368464A9A630125F3 +:1051C0005BE04FF40060F1E74FF08060EEE709BB71 +:1051D0000068CDE9031100F07BFE820114D403A91D +:1051E0002046FFF793FA60B9049BDB030FD5616C8F +:1051F0002068090401F049F818B90146206801F057 +:105200005DF8616B0843D3E74FF40060F9E74FF0B6 +:105210008060F6E7436B43F000636363C9E74FF4D4 +:105220008030FEF795FF00284FD063682A4903932A +:10523000A368B0FBF1F2CDE90435236906936369F5 +:10524000934201D307930DE0A56DB5F5007FF9D02A +:10525000B5F5807F2CD12BBB884221D91F4BB0FBE9 +:10526000F3F0079008AB002513E9030003AB8DE8CA +:10527000030020680ECB00F0E5FD4FF400712068BC +:1052800000F0F8FE30B123680125124A9A63636B7F +:10529000184360630123284684F8303009B030BDDC +:1052A0000023CFE75A00B0FBF2F28A42CAD9D5E711 +:1052B0000B491BB98842F3D90792D3E75D00B0FBD5 +:1052C000F5F0884288BF1346BCE7636B43F0006388 +:1052D000636374E7FF0FE01F80F0FA0200E1F50559 +:1052E00040787D01416C10B509040446006801F066 +:1052F00017F830B90146206800F0EAFDC0F34320FA +:1053000010BD616B084360630020F7E770B5044689 +:1053100086B018B90125284606B070BD90F8303027 +:1053200003F0FF0213B90276FFF756FA0323204673 +:1053300084F83030FFF734FD0028EBD101A9204676 +:10534000FFF736FE0028E5D1A16B9DF81420012956 +:105350009DF81530D2B2DBB21CD1134314BF4FF409 +:1053600000734FF48073A365E1682046FFF7F0FEF9 +:1053700005460028CED102F007FB06462046FFF77F +:10538000B1FF042808D100236363E362012384F89A +:105390003030C0E7A065E7E702F0F6FA801B013085 +:1053A000ECD14FF0004303256363012384F83030D0 +:1053B000B1E770477047704770470000F7B5C56A9E +:1053C00004460068436B1B0420D52F071ED5A36A33 +:1053D0001F2B19D9666A351D06F12407206804358C +:1053E00000F04AFD05F8080C030A05F8073C030C19 +:1053F000000E05F8063C05F8050CBD42EED1A36A87 +:105400002036203B6662A36203B0F0BD436BDE052D +:1054100053D54FF480738363C36B23F4414323F06C +:105420003A03C363C36B23F08053C363C36823F0A1 +:105430004003C36015F008031FD015F0220F08D0F9 +:1054400000F0E0FE28B1636B184360632046FFF76D +:10545000EFFB2368A907694A9A634FF0010384F8B8 +:1054600030304FF00003E36203D02046EBF76EF8D4 +:10547000CAE72046EBF765F8C6E72A06C4D515F05B +:10548000220F8362C362036508D000F0BBFE28B11F +:10549000636B184360632046FFF7CAFB012315F0D6 +:1054A000300F84F830304FF00003E36202D0204622 +:1054B000EBF747F8AF07A7D0D7E7436B5E0427D5D4 +:1054C000290725D5236A1F2B9ED9E669351D06F1CC +:1054D000240715F8043C043501A92068019315F848 +:1054E000072C43EA0223019315F8062C43EA0243F2 +:1054F000019315F8052C43EA0263019300F0BFFC09 +:10550000AF42E6D1236A2036203BE66123627BE787 +:10551000436B13F03A0F436B56D09A0703D5636B76 +:1055200043F002036363436B1B0703D5636B43F0D4 +:1055300008036363436B9F0603D5636B43F020034B +:105540006363436BDE0603D5636B43F01003636351 +:105550002A4B8363C36B23F49D73C363C36823F037 +:105560004003C360C36A43F40053C362C36843F09B +:105570008003C36000F046FE636B15F0080140EA4B +:10558000030023686063DA6822F08002DA604FF477 +:1055900000629A6308D0012384F830300023E3626C +:1055A0002046FFF745FB2FE728067FF52DAF626BFE +:1055B000002A3FF429AFDA6B22F08052DA631965D2 +:1055C000012384F83030EBE7DA007FF51DAF4FF0B0 +:1055D000805305F020058363036D20465B0706D4E6 +:1055E00015B1FFF7E9FE0FE7FFF7E4FE0CE715B191 +:1055F000FFF7E1FE08E7FFF7DCFE05E73A0F0018CA +:1056000070470000304A0368904212D0B0F1804FDA +:105610000FD0A2F57C4290420BD002F580629042FE +:1056200007D002F58062904203D002F578429042A2 +:1056300019D14A6823F070031343234A90421DD0C6 +:10564000B0F1804F1AD0A2F57C42904216D002F5FC +:105650008062904212D002F5806290420ED002F534 +:10566000784290420AD0194A904207D002F58062EF +:10567000904203D002F58062904203D123F440733C +:10568000CA6813434A6923F08003134303608B689D +:10569000C3620B6883620C4B98420FD003F58063A2 +:1056A00098420BD003F57053984207D003F58063FE +:1056B000984203D003F58063984201D10B690363DC +:1056C00001234361704700BF0000014000400140DA +:1056D00010B5044650B390F83D3003F0FF021BB9FB +:1056E00080F83C20FFF78CFF02232068211D84F8FE +:1056F0003D30FFF787FF0123002084F8483084F80D +:105700003E3084F83F3084F8403084F8413084F8EB +:10571000423084F8433084F8443084F8453084F8CB +:10572000463084F8473084F83D3010BD0120FCE756 +:1057300001F01F01036A10B501248A408C4023EA5E +:1057400004030362036A1A43026210BD10B50446E3 +:1057500029B990F83E30012B31D0012010BD042929 +:1057600007D190F83F30012BF7D1022380F83F306A +:1057700028E0082907D190F84030012BEDD1022311 +:1057800080F840301EE00C2907D190F84130012B01 +:10579000E3D1022380F8413014E0102907D190F8BA +:1057A0004230012BD9D1022380F842300AE090F830 +:1057B0004330012BD1D1022380F8433002E0022391 +:1057C00080F83E3001222068FFF7B2FF2368204AAC +:1057D000934219D002F58062934215D002F57052BF +:1057E000934211D002F5806293420DD002F580629F +:1057F000934209D0B3F1804F0ED19968154A0A40FF +:10580000062A21D10020A9E75A6C42F400425A64CA +:105810000F4A9342EED1F0E70F4A9342EDD002F5E2 +:1058200080629342E9D002F580629342E5D002F5AE +:1058300078429342E1D0A2F56C429342DDD01A68DF +:1058400042F001021A60DDE7B2F5803FF7D1D9E7F7 +:105850000000014007000100000400407047000004 +:10586000F0B504460368C06987B02169A2681D6865 +:105870000A4361690A43A449024329400A43E16893 +:105880001A605A6822F440520A43A1695A609F4A3A +:1058900093421CBF226A11439A6822F06E4222F49E +:1058A00030620A43616A9A60DA6A22F00F020A43A0 +:1058B000DA62974A93421BD1964B5B6D03F0380333 +:1058C000282B6CD8944AB0F5004FD35C40F002818D +:1058D000082B00F2BF80082B61D8DFE813F0E70047 +:1058E000EC0060006000EF00600060006000F40009 +:1058F0008A4A934207D1874B5B6D03F00703052B60 +:105900004DD8874ADFE7874A934207D1814B5B6DC9 +:1059100003F00703052B42D8834AD4E7834A934216 +:1059200007D17C4B5B6D03F00703052B37D8804A0A +:10593000C9E7804A934207D1764B5B6D03F00703BA +:10594000052B2CD87C4ABEE77C4A934207D1714B89 +:105950005B6D03F03803282B21D8794AB3E7794AE5 +:10596000934207D16B4B5B6D03F00703052B16D8F1 +:10597000754AA8E7754A934207D1664B5B6D03F001 +:105980000703052B0BD8724A9DE7604A934206D164 +:1059900002F50E32936D03F00703052B01D90120A8 +:1059A0000EE06C49CB5C102B23D011D8042B16D001 +:1059B000082B19D0022BF2D1FEF7C0F910BB002042 +:1059C0004FF00113A3660023C4E91C3307B0F0BDF8 +:1059D000202B3DD0402BE2D14FF4004012E068462E +:1059E000FEF7BEF90198E9E703A8FEF761FA04980B +:1059F000E4E71368584813F0200F03D01368C3F38B +:105A0000C103D840554B626A656833F8122005EB34 +:105A10004501B0FBF2F39942C1D8B3EB053FBED8C4 +:105A20000023002106F0CCFA2A460F0200230602CA +:105A300047EA10676808301847F1000106F0C0FA1D +:105A4000474BA0F540729A42A9D82368D860B6E7C0 +:105A50004448D7E7202B3BD0402B0BD0102B9ED1B6 +:105A60002C4B3D481A6812F0200F03D01B68C3F37B +:105A7000C103D840616A394B626833F81130B0FB1A +:105A8000F3F3500800EB4300B0FBF2F083B24FF6A3 +:105A9000EF72A3F11001914281D820F00F00C3F3FF +:105AA0004203226880B21843D06088E7FDF7B8FA55 +:105AB000002884D0DEE7FDF7C5FAF9E76846FEF76F +:105AC0004FF90198F4E703A8FEF7F2F90498EFE71D +:105AD0002448CFE7082B47D8082B3FF660AF01A238 +:105AE00052F823F0B95B0108C55B01089F59010812 +:105AF0009F590108CB5B01089F5901089F59010874 +:105B00009F590108D55B0108F369FFCF000C0058CD +:105B10000010014000440258E8D20108004400404F +:105B200011D301080048004011D30108004C004087 +:105B300011D301080050004011D3010800140140A6 +:105B4000E8D201080078004011D30108007C004031 +:105B500011D3010817D301080090D0031ED3010808 +:105B6000FFFC0F0000093D00202B38D0402B38D01F +:105B7000102B7FF414AF1D4A136813F0200F1C4B39 +:105B800032D01068C0F3C10023FA00F0616A194BEB +:105B9000626833F81130B0FBF3F303EB5203B3FB4D +:105BA000F2F39BB24FF6EF72A3F1100191423FF670 +:105BB000F6AE2268D36002E7FDF732FA00283FF420 +:105BC000FEAEE3E7FDF73EFAF8E76846FEF7C8F8F1 +:105BD0000198F3E703A8FEF76BF90498EEE706488F +:105BE000D4E74FF40040D1E71846CFE7004402580D +:105BF0000090D0031ED3010800093D00836ADA0734 +:105C000010B506D50168C46A4A6822F400322243FE +:105C10004A609C0706D50168046B4A6822F480320A +:105C200022434A60590706D50168446B4A6822F44A +:105C3000802222434A601A0706D50168846B4A68AD +:105C400022F4004222434A60DC0606D50168C46B98 +:105C50008A6822F4805222438A60990606D5016838 +:105C6000046C8A6822F4005222438A605A0610D5D6 +:105C70000168446C4A68B4F5801F22F4801242EA3D +:105C800004024A6005D14A68846C22F4C0022243AF +:105C90004A601B0606D50268C16C536823F40023D2 +:105CA0000B43536010BD2DE9F041DDF81880044628 +:105CB0000E4615461F462268D36936EA03030CBF19 +:105CC00001230023AB4201D000201CE0B8F1FF3FCC +:105CD000F2D001F059FEC01B40452068036802D88D +:105CE000B8F1000F11D123F4D0730360836823F05F +:105CF000010383602023C4F88430C4F88830002373 +:105D0000032084F88030BDE8F0815A07D3D5C369F9 +:105D10001B05D0D54FF400630362036823F4D073EE +:105D20000360836823F0010383602023C4F8843078 +:105D3000C4F88830C4F88C30E1E730B5002504465B +:105D400085B0C0F88C5001F01FFE2268034612682F +:105D5000110717D422681268520709D56FF07E42E6 +:105D60004FF48001204600920022FFF79CFFB0B95B +:105D700020230020C4F8843084F88000C4F88830E0 +:105D8000E0660DE06FF07E4203904FF40011204674 +:105D900000922A46FFF787FF039B0028DAD00320F2 +:105DA00005B030BD10B5044650B3D0F884301BB9EF +:105DB00080F88030FFF752FD226824232046C4F883 +:105DC0008430136823F001031360FFF749FD0128B5 +:105DD00016D0A36A13B12046FFF710FF23682046B0 +:105DE0005A6822F490425A609A6822F02A029A6015 +:105DF0001A6842F00102BDE810401A60FFF79DBF2B +:105E0000012010BD90F88030012B09D00268136882 +:105E100043F002031360002380F880301846704777 +:105E20000220704790F88030012B09D00268136877 +:105E300023F002031360002380F880301846704777 +:105E40000220704784B010B503AC84E80E00DDE991 +:105E5000033241681343059A1343069A1343079A82 +:105E60001343044A0A40BDE81040134304B04360A2 +:105E700000207047002CC0FFD0F8800070470B68EE +:105E8000C0F8803000207047036843F003030360CC +:105E900000207047036823F003030360002070476D +:105EA000006800F0030070470B6810B58360C46899 +:105EB000D1E901321343CA6813430A691343034A01 +:105EC00022401343C360002010BD00BFC0E0FEFFAE +:105ED0001430405870470B6810B543624B688362BA +:105EE000C26AD1E9023422F0FF0223430C694969F6 +:105EF00023430B431343C362002010BD10B500239E +:105F000086B0044601A9CDE90133CDE903334FF44E +:105F100080530593FFF7C8FF0A4B4FF4FA521B68F2 +:105F2000B3FBF2F241F288335343013B07D3626B78 +:105F30001206FAD5044B0020A36306B010BD4FF043 +:105F40000040FAE718030024C5002000454B10B5B7 +:105F50001B6804464FF4FA50B3FBF0F342485A432F +:105F6000002A48D0636B034207D09B0405D4636BBF +:105F7000580704D50420A06310BD013AF0E7606B18 +:105F800010F0010002D00123A363F5E7374BA363B0 +:105F90002369DBB2994231D1636935481840002842 +:105FA000EAD0002B2CDB5A002DD49C002DD4D90034 +:105FB0002DD41A012ED45C012FD4D90130D41A0269 +:105FC00031D45C0232D4990233D4DA0234D45C0383 +:105FD00035D4990336D4DA0337D41C0438D45904A1 +:105FE00039D49A043AD413F0080F14BF4FF40000C8 +:105FF0004FF48030C0E74FF00040BDE70120BBE721 +:106000004FF00070B8E74020B6E78020B4E74FF4C7 +:106010008070B1E74FF40070AEE74FF48060ABE7FB +:106020004FF40060A8E74FF48050A5E74FF400500C +:10603000A2E74FF480409FE74FF400409CE74FF405 +:10604000003099E74FF4802096E74FF4002093E763 +:106050004FF4801090E74FF400108DE74FF480006C +:106060008AE700BF1803002445002000C500200077 +:1060700008E0FFFD30B54FF4807387B01025002293 +:106080000446019101A9CDE902534FF48053CDE9B3 +:106090000423FFF709FF41F2883229462046FFF723 +:1060A00055FF07B030BD30B54FF4807387B0112570 +:1060B00000220446019101A9CDE902534FF4805317 +:1060C000CDE90423FFF7F0FE41F28832294620464D +:1060D000FFF73CFF07B030BD30B54FF4807387B099 +:1060E000122500220446019101A9CDE902534FF483 +:1060F0008053CDE90423FFF7D7FE41F288322946C9 +:106100002046FFF723FF07B030BD30B54FF4807352 +:1061100087B0182500220446019101A9CDE9025358 +:106120004FF48053CDE90423FFF7BEFE41F28832DD +:1061300029462046FFF70AFF07B030BD30B54FF4BF +:10614000807387B0192500220446019101A9CDE989 +:1061500002534FF48053CDE90423FFF7A5FE41F22B +:10616000883229462046FFF7F1FE07B030BD30B532 +:106170004FF4807387B0202500220446019101A9C5 +:10618000CDE902534FF48053CDE90423FFF78CFE91 +:1061900041F2883229462046FFF7D8FE07B030BDCD +:1061A00030B54FF4807387B0212500220446019159 +:1061B00001A9CDE902534FF48053CDE90423FFF741 +:1061C00073FE41F2883229462046FFF7BFFE07B032 +:1061D00030BD30B54FF4807387B0262500220446C9 +:1061E000019101A9CDE902534FF48053CDE9042375 +:1061F000FFF75AFE4FF2186229462046FFF7A6FE27 +:1062000007B030BD30B5002387B00C254FF4807245 +:10621000044601A9CDE90323CDE901354FF48053AC +:106220000593C36843F08003C360C36823F0400351 +:10623000C360FFF739FE074A29462046FFF786FE6E +:10624000E368B0F1007F08BF002023F08003E36023 +:1062500007B030BD00E1F50530B54FF4807387B06D +:10626000072500220446019101A9CDE902534FF40C +:106270008053CDE90423FFF717FE41F28832294607 +:106280002046FFF763FE07B030BD30B54FF4807392 +:1062900087B0372500220446019101A9CDE90253B8 +:1062A0004FF48053CDE90423FFF7FEFD41F288321D +:1062B00029462046FFF74AFE07B030BD30B54FF4FF +:1062C000807387B0062500220446019101A9CDE91B +:1062D00002534FF48053CDE90423FFF7E5FD41F26B +:1062E000883229462046FFF731FE07B030BD30B571 +:1062F000002387B033254FF48072044601A9CDE90D +:106300000323CDE901354FF480530593FFF7CCFD0E +:1063100041F2883229462046FFF718FE07B030BD0B +:1063200030B54FF4807387B00D25002204460191EB +:1063300001A9CDE902534FF48053CDE90423FFF7BF +:10634000B3FD41F2883229462046FFF7FFFD07B032 +:1063500030BD30B5002387B00D254FF48072044660 +:1063600001A9CDE90323CDE901354FF4805305930D +:10637000FFF79AFD41F2883229462046FFF7E6FDF5 +:1063800007B030BD114B4FF4FA5102461B68B3FB06 +:10639000F1F141F288334B43013B13D3516B11F0C0 +:1063A000450FF9D08904F7D4536B5B0702D504205D +:1063B00090637047506B10F0010014BF0123044B31 +:1063C000936370474FF00040704700BF18030024EC +:1063D000C500200010B5002386B00222044601A9A2 +:1063E000CDE901324FF44072CDE903234FF48053DD +:1063F0000593FFF759FD2046FFF7C4FF06B010BD17 +:1064000010B5092286B04FF4407304460191002173 +:10641000CDE902234FF48053CDE9041301A9FFF71E +:1064200043FD2046FFF7AEFF06B010BD0F4B4FF403 +:10643000FA5102461B68B3FBF1F141F288334B433A +:10644000013B0FD3516B11F0450FF9D08904F7D4FC +:10645000506B10F0040002D0042090637047044B8E +:10646000936370474FF00040704700BF180300244B +:10647000C500200010B5292286B04FF48073044671 +:1064800001910021CDE902234FF48053CDE904139B +:1064900001A9FFF709FD2046FFF7C8FF06B010BDB0 +:1064A0001F4B10B51B6804464FF4FA50B3FBF0F0D5 +:1064B00041F288334343013B29D3606B10F0450F11 +:1064C000F9D08004F7D4636B580702D50420A06389 +:1064D00010BD606B10F0010002D00123A363F7E749 +:1064E0002369DBB2994215D10E4BA363636913F4A0 +:1064F000604002D11B0C1380EAE75A040CD413F459 +:10650000004F14BF4FF480504FF48030E0E74FF05D +:106510000040DDE70120DBE74FF40050D8E700BF83 +:1065200018030024C500200030B589B000230325DE +:10653000044601914FF48071CDE90335CDE905138F +:106540004FF4805303A90793FFF7AEFC019A294645 +:106550002046FFF7A5FF09B030BD0000134B4FF4F4 +:10656000FA5102461B68B3FBF1F141F288334B4309 +:10657000013B17D3516B11F0450FF9D08804F7D4C4 +:10658000536B590702D5042090637047506B10F08D +:10659000010002D0012393637047536B5B0603D560 +:1065A0004023F8E74FF00040704700BF1803002475 +:1065B00010B54FF4D57286B008234FF480710446AD +:1065C000CDE901230023CDE903134FF4805301A942 +:1065D0000593FFF769FC2046FFF7C0FF06B010BD2A +:1065E0000A4B013B0FD00269002AFADA0369074A15 +:1065F00043F001030361013A05D0036913F001037D +:10660000F9D1184670470320704700BF410D0300C1 +:1066100084B038B505AD044685E80E000A9B012B11 +:106620002FD1836B23F480338363C36823F4840303 +:1066300023F04003C360C36823F44013C360119B7D +:10664000012B03D1C36843F48013C3602046FFF7D6 +:10665000C7FF089B012B10D1E36D9BB2E365E36D8F +:1066600043F07B7343F40033E365A36843F0060310 +:10667000A360A36843F02003A360BDE8384004B0E2 +:106680007047C36843F04003C360FFF7A9FF0E9B48 +:1066900023B9A36B43F48033A363DAE7A36B23F43A +:1066A0008033F9E7022A4AD1274B284A0B44934208 +:1066B00039D9274B274A0B44934236D9A1F57403A5 +:1066C000254AA3F51053934231D9A1F18373234A8C +:1066D000A3F5E74393422CD3214B224A0B44934228 +:1066E00029D9214B214A0B44934226D3204B214ADE +:1066F0000B44934223D3A1F1B7731F4AA3F5585318 +:1067000093421ED31D4B1E4A0B44934234BF0723B2 +:106710000623C26822F47052C260C26842EA832330 +:10672000C360002070470F23F3E70E23F1E70D232A +:10673000EFE70C23EDE70B23EBE70A23E9E7092357 +:10674000E7E70823E5E700BF405327FFFF340C00CD +:10675000401E1BFF3F420F007F4F120020D6130048 +:1067600060B6E5FE5FE3160000D3CEFE40771B0067 +:10677000C05BB3FEC091210020753800E05459FE83 +:10678000E09C4100836843F0010383600020704770 +:10679000836823F0010383600020704708B5C36855 +:1067A000012923F0C043C36008D1C36843F00053FC +:1067B000C3603220F9F764FB002008BD19B9C36833 +:1067C00043F08043F4E70120F7E700008901074A1E +:1067D00041F020010161013A05D0036913F0200363 +:1067E000F9D1184670470320704700BF410D0300E0 +:1067F0001023064A0361013A05D0036913F0100320 +:10680000F9D1184670470320704700BF410D0300BF +:10681000D0F800381943C0F8001800207047000075 +:1068200084B02DE9F843044609A80E4680E80E001E +:106830000023139D194603F14002013304EB820249 +:106840000F2B5160F7D104F50067002D6CD17B68E8 +:1068500043F002037B60A36B23F40013A36323685C +:1068600043F040032360236843F080032360002348 +:10687000C4F8003ED4F80038C4F800380E9B012B51 +:1068800059D10B99002954D120464FF67F38FFF794 +:10689000BFFF10212046FFF799FF01462046FFF772 +:1068A000A7FF0843002304F51062C0B24FF0904CDC +:1068B00019464FF0006E00383B617B6118BF012024 +:1068C000FB61B34239D1002204F530634FF0904CA4 +:1068D0004FF0006E11464FF67F38B24240D13B690F +:1068E00023F480733B610023A3616FF080436361F5 +:1068F0000C9B1BB9A36943F01003A361A269224B4F +:106900001343A3610F9B1BB1A36943F00803A36169 +:10691000012D05D1A36943F0804343F00403A36133 +:10692000BDE8F84304B07047A36B43F40013A363BE +:106930009DE71946A8E70321A6E7D2F80090B9F130 +:10694000000F0BDA3BB9C2F800E011610133C2F865 +:1069500008802032B5E7C2F800C0F6E71160F4E71E +:10696000D3F80090B9F1000F0BDA3AB9C3F800E0A0 +:1069700019610132C3F808802033AEE7C3F800C0C4 +:10698000F6E71960F4E700BF00383C80D0F808381B +:1069900013F0060004D013F0020F14BF02200F20E2 +:1069A000704730B50D78012400F5006205F00F0343 +:1069B00000EB45109C404B78012BD36918D11C4348 +:1069C000D461D0F800391A0410D48A68D0F800498C +:1069D000C2F30A03CA78234343EA824343EA855356 +:1069E00043F0805343F40043C0F80039002030BD29 +:1069F00043EA0444D461D0F8003B1B04F6D48B680E +:106A0000D0F8002BC3F30A031343CA7843EA824346 +:106A100043F0805343F40043C0F8003BE6E7000036 +:106A20004B78DFF8ECC0012BF0B50E784D6900EB28 +:106A30004614364F46D104F51063BDB91D692F4089 +:106A40001F611D6945F400251D611D6905EA0C05DE +:106A5000012A1D6123D10A6902B15A61D4F80039B3 +:106A600043F00443C4F800390020F0BDD3F810E02F +:106A70000EEA0C0CC3F810C0D3F810C00CEA0707DC +:106A80001F618F68AF421D6945F4002538BF4F6113 +:106A90001D614D691F69C5F312053D43D8E7D4F860 +:106AA000003943F00443C4F800394B69002BDBD0B4 +:106AB00006F00F060123D0F83428B3401343C0F882 +:106AC0003438D1E7D4F8100B04F5306300EA0C0039 +:106AD0001861186938401861886805B148611D69F6 +:106AE000C0F31200012A45F400251D611D6940EA2A +:106AF0000500186102D1CA6802B15A61D4F8003B9E +:106B000043F00443C4F8003BAEE700BFFFFF07E0DB +:106B10000000F8FF10B59DF8084044B90333013276 +:106B20009B0800EB023001EB83038B4201D1002074 +:106B300010BD51F8042B0260F7E700002DE9F34186 +:106B40004D780F78012D4B6900EB4714CE78DFF8B4 +:106B5000B8C1DFF8B8E140F08E8004F51065D5F8D3 +:106B600010806BBB08EA0C0CC5F810C0D5F810C03B +:106B70004CF4002CC5F810C0D5F810C00CEA0E0E6D +:106B8000C5F810E0012A4ED10B6903B16B61012EEB +:106B90000CD1D0F8083813F4807FD4F800390CBF3A +:106BA00043F0005343F08053C4F80039D4F800395F +:106BB00043F00443C4F80039002002B0BDE8F0817E +:106BC00008EA0E0E012EC5F810E0D5F810E00EEA26 +:106BD0000C0CD1F808E0C5F810C00EEB030CD5F88A +:106BE00010800CF1FF3CBCFBFEFEDFF824C10CEA78 +:106BF000CE4C4CEA080CC5F810C0C3F3120CD5F803 +:106C000010E04CEA0E0CC5F810C0BBD1D5F810C08E +:106C10002CF0C04CC5F810C0D5F810C04CF0005C8A +:106C2000C5F810C0AEE7D4F80059012E45F0044570 +:106C3000C4F800590BD0002BBED007F00F0201277B +:106C4000D0F8343897401F43C0F83478B4E7D0F810 +:106C500008589BB215F4807FD4F800590CBF45F05A +:106C6000005545F08055C4F8005900923A46C9686D +:106C7000FFF750FFA0E7D4F8105B04F5306705EA92 +:106C80000E053D613D6905EA0C053D618D681BBB44 +:106C90003B69C5F312051D433D613B6943F4002385 +:106CA000012A3B6102D1CB6803B17B61012E0CD17B +:106CB000D0F8083813F4807FD4F8003B0CBF43F0C1 +:106CC000005343F08053C4F8003BD4F8003B43F03A +:106CD0000443C4F8003B6FE72B44DFF834C0D7F817 +:106CE00010E0013BB3FBF5F30CEAC34C9BB24CEA5A +:106CF0000E0C6B43C7F810C0D7F810C0C3F31203D3 +:106D000043EA0C03CCE700BFFFFF07E00000F8FFF9 +:106D10000000F81F70B50023940800F5805502F0BC +:106D20000302A34214D301EB84017AB100F5805031 +:106D300000230468D80024FA00F0C854013398B244 +:106D40008242F7D1013A92B201321144084670BD35 +:106D50002E6841F823600133E3E74A780B78012A73 +:106D600000EB431012D1D0F80029002A06DB2BB12A +:106D7000D0F8003923F08043C0F80039D0F800394A +:106D800043F40013C0F8003900207047D0F8002BFE +:106D9000002A06DB2BB1D0F8003B23F08043C0F87B +:106DA000003BD0F8003B43F40013C0F8003BEBE796 +:106DB0000B784A7800EB4310CB78012AA3F1020349 +:106DC000DBB20FD1D0F80029012B22F40012C0F859 +:106DD000002905D8D0F8003943F08053C0F80039B5 +:106DE00000207047D0F8002B012B22F40012C0F8CD +:106DF000002BF5D8D0F8003B43F08053C0F8003B9F +:106E0000EEE7D0F80038090123F4FE6301F4FE61D7 +:106E1000C0F80038D0F800381943C0F80018002036 +:106E20007047D0F8003E23F00303C0F8003ED0F8CE +:106E3000043823F00203C0F8043800207047D0F86B +:106E4000003E23F00303C0F8003ED0F8043843F0BE +:106E50000203C0F80438002070474269806910407E +:106E60007047D0F8183800F50060C0691840000C71 +:106E70007047D0F8183800F50060C069184080B23B +:106E8000704700EB411100F50060D1F8082B406914 +:106E90001040704710B5D0F81048D0F8343800EBE7 +:106EA000411001F00F0100F51060CB408068DB015C +:106EB000DBB22343184010BD406900F00100704769 +:106EC000D0F8003923F4FF6323F00703C0F800393A +:106ED000D0F8043843F48073C0F8043800207047B9 +:106EE00030B5056C00F530630F4CA54203D9D0F8DE +:106EF000004B002C16DB002401291C611C6944F4A2 +:106F000000241C611C6944F018041C611C6944F0D5 +:106F1000C0441C6106D15A61D0F8003B43F0802385 +:106F2000C0F8003B002030BD0A30544F2B4BD3F843 +:106F3000882042F47002C3F888201A6942F01002D7 +:106F40001A61274A136803F00F03062B05D813684C +:106F500023F00F0343F007031360224B1A6842F03B +:106F600001021A6000221A611F4A19680A401C496E +:106F70001A600A68120705D50A6822F00F0242F06B +:106F800007020A60002219499A61DA611A6299625D +:106F90001749D962174919635A639963DA63196407 +:106FA0005A64196821F4802119601A66124A536ADA +:106FB00043F480435362114B1B681B0C1B04B3F159 +:106FC000005F02D20E4B01221A600E4B43F2D20236 +:106FD0001A600D4A014B9A60704700BF00ED00E057 +:106FE00000200052004402587FEDF6EA000202023F +:106FF0000000FF0180020101C00000580010005C89 +:10700000088100510040005200000008494A1369FD +:10701000114603F03803102B30B500F0878006D8F6 +:10702000002B5FD0082B00F083800A685BE0182BF0 +:10703000FBD1906A956AD16A15F47C7FC5F305137C +:10704000546B3BD007EE903AC4F3CC0401F001033B +:1070500000F00300F8EEE76A63430128F7EE005AF8 +:1070600007EE903AFAEEE97A42D0022850D0116841 +:10707000314BC1F3C101126BCB40C2F3080207EEE2 +:10708000103AB8EEC76A86EE267A06EE902AF8EE37 +:10709000E66A76EEA77A77EEA57A264B67EE877AD0 +:1070A0001B6BC3F34623013307EE103AF8EEC76AB1 +:1070B00087EEA67AFCEEC77A17EE903A1D481F4974 +:1070C0008269C2F303228A5CD340826902F00F0214 +:1070D0008A5C1B4902F01F0223FA02F20A60194A75 +:1070E000136030BD1268C2F3C102134BD340E5E711 +:1070F000136B9FED156AC3F3080307EE103AB8EE61 +:10710000C77A77EE277A77EEA57A86EE267AC4E7F5 +:10711000136B9FED0E6AC3F3080307EE103AB8EE47 +:10712000C77A77EE277A77EEA57AEEE7084BC5E7C0 +:10713000084BC3E7004402580090D00336D301083F +:107140001C030024180300240024744A20BCBE4BF6 +:1071500040787D0100093D002DE9F041A4B02022D6 +:1071600005460C4609A8002103F0FEFA4C22002136 +:1071700011A803F0F9FA5C4B9B6A03F00303022B9E +:107180003AD0594B022601274FF00008D3F8E020EF +:1071900004A9564842F08002C3F8E020D3F8E0305A +:1071A000069703F08003CDF81C800093009BCDE987 +:1071B0000467F9F709FA0A20F8F762FE3A46314601 +:1071C0004A48F9F7E7FA3046FAF7E4FF484BFCB9CA +:1071D0000294DA6A22F00102DA62DB6A03F0010348 +:1071E0000293444B9A6942F440429A619B6903F4CA +:1071F00040430293029B21E0012109A8CDE9091136 +:10720000FBF7C6FD0028BCD0002024B0BDE8F0810B +:10721000CDF80480DA6A22F00102DA62DB6A354ACC +:1072200003F001030193936923F4404343F4804343 +:107230009361936903F440430193019B2D4A936941 +:107240009804FCD52123002D4FF005024FF00805CE +:10725000119314BF4FF4A0234FF48033002C1C92E1 +:1072600011A812934FF001030CBFA02228221793FC +:1072700002231D9200221E93209323922292219595 +:10728000CDE91A330A231F93FBF74AFA0146002877 +:10729000BAD13F220323CDE9092340234FF4806272 +:1072A000CDE90B05CDE90E320D931093CCB109A8B1 +:1072B000FBF76EFD0028A7D10B4B1A6842F0800245 +:1072C0001A60D3F8F42042F00202C3F8F420D3F895 +:1072D000F43003F002030393039BF8F7FBFD012056 +:1072E00093E70421E3E700BF00440258001C025862 +:1072F0000004005800480258012108B50846FFF76D +:107300002BFF10B90148EFF7E9FB08BD34D801089D +:10731000F9F746BADFF830D0FFF708FE002103E0A6 +:107320000A4B5B584350043109480A4B42189A42B1 +:10733000F6D3094A02E0002342F8043B074B9A4285 +:10734000F9D3E8F7C9FF70470000082414F00108DA +:10735000000000241804002420040024483F0024D6 +:10736000FEE70000074B084AD3F888109142FBD192 +:10737000064A4FF48E01002051614FF440729A602A +:10738000704700BF006402580003008000200052D4 +:1073900000207047F0B5424D0C46002387B0298885 +:1073A00000934FF6FD734A1E92B29A4297BF3D4B2F +:1073B0004FF0026303EA812303F10063A34204D880 +:1073C0004FF0FF34204607B0F0BDB4F1006FF7D3A3 +:1073D000354F364BD7F888209A42FBD1F8F7FEFE9E +:1073E000064618B14FF44073BB60E9E7EFF7E0FAE7 +:1073F0002988202301A84A1E019605934FF6FD73A4 +:1074000092B29A4296BF2A4B4FF0016303EA41239E +:10741000694698BF03F100639C4234BF04F178438E +:10742000E31AB4F1016F4FEA534303934FF00103A2 +:10743000049328BF02230293F9F730F8029B003827 +:10744000039A18BF0120012B0CBF4FF000634FF0CF +:107450000163444203EB4243BFF34F8F154A03F5E8 +:107460000031C2F8703220338B42FAD1BFF34F8F14 +:10747000BFF36F8FBFF34F8FBFF36F8F0023C2F83F +:107480005032BFF34F8FBFF36F8FEFF79BFAF8F7D0 +:10749000CBFE002894D1044B4FF440729A6091E7E0 +:1074A00080E8F11F00FC3F000064025800030080E8 +:1074B00000FE1F0000ED00E02DE9F8431F46344BAD +:1074C00090460C461A884FF6FD71531E9BB28B42B4 +:1074D00097BF30494FF0026101EA822101F100615A +:1074E000A14204D84FF0FF352846BDE8F883B4F137 +:1074F000006FF7D3284D294BD5F888209A42FBD14D +:10750000F8F76CFE00283DD04FF44073AB60E9E71C +:10751000424631460120F8F705FF80BB203608F1CE +:107520002008B14503D9002DF2D04FF0FF35002FD0 +:1075300010DD04F01F02D319BFF34F8F1849234405 +:10754000C1F8704220341A1B002AF9DCBFF34F8FB8 +:10755000BFF36F8FBFF34F8FBFF36F8F104B0022BE +:10756000C3F85022BFF34F8FBFF36F8FF8F75CFE65 +:107570000028B7D1084B4FF440729A60B4E74FF03F +:10758000FF35CEE72646054607EB0409C9E700BFED +:1075900080E8F11F00FC3F000064025800030080F7 +:1075A00000ED00E00D4B18884FF6FD73421E92B2BD +:1075B0009A4297BF0A4B4FF0026303EA802303F11C +:1075C00000638B4207D9B1F1006F34BF4FF0FF3039 +:1075D0004FF4003070474FF0FF30704780E8F11FE4 +:1075E00000FC3F00202070474FF000607047000013 +:1075F000064B4FF6FD711A88531E9BB28B429ABF01 +:10760000034800EA82204FF40010704780E8F11F21 +:1076100000FC3F00FF2070471FB5204B20F40062A4 +:107620009A421F4B02D01F4A90421CD15B6D03F45B +:107630004053B3F5005F2FD006D853B1B3F5805F48 +:107640000CD01948EFF74AFAB3F5405FF9D1174863 +:1076500001E0FBF7E5FC05B05DF804FB01A8FCF7D1 +:1076600027FC0398F7E7124A904213D19B6D03F46D +:107670004073B3F5007F0FD005D843B1B3F5807FD9 +:10768000ECD00C48DEE7B3F5407FE0D0F9E7FCF73B +:1076900055FBE0E70848D5E70848DCE70054004020 +:1076A000004402580058004048D8010800093D0035 +:1076B000001C005865D8010880D801080090D0034C +:1076C000F8B546689023174C054603FB06439A68B5 +:1076D000B2F5805F15D11A69B2B940F2FF12A3F872 +:1076E0006020902202FB0642B2F86070284601F04A +:1076F00045FE0028FAD090237343E358586A384077 +:10770000F8BD1AB91A6932B9FF22E8E7B2F1805F11 +:1077100005D11A690AB97F22E1E73F22DFE700229B +:10772000DDE700BF5438002470B505460C464668B6 +:10773000284601F033FE0028FAD09023034AC4F310 +:1077400008047343D3589C6270BD00BF54380024B2 +:1077500000B5564B8DB00A2800F2A480DFE800F097 +:1077600006162432404E5C6A78869400D3F8E020F6 +:107770004F4842F00102C3F8E020D3F8E03003F0B4 +:1077800001030193019B0DB05DF804FBD3F8E020E9 +:10779000484842F00202C3F8E020D3F8E03003F09A +:1077A00002030293029BEEE7D3F8E020424842F046 +:1077B0000402C3F8E020D3F8E03003F0040303939D +:1077C000039BE0E7D3F8E0203C4842F00802C3F80E +:1077D000E020D3F8E03003F008030493049BD2E7E1 +:1077E000D3F8E020364842F01002C3F8E020D3F886 +:1077F000E03003F010030593059BC4E7D3F8E020C5 +:10780000304842F02002C3F8E020D3F8E03003F023 +:1078100020030693069BB6E7D3F8E0202A4842F0FF +:107820004002C3F8E020D3F8E03003F040030793B0 +:10783000079BA8E7D3F8E020244842F08002C3F871 +:10784000E020D3F8E03003F080030893089B9AE728 +:10785000D3F8E0201E4842F48072C3F8E020D3F849 +:10786000E03003F480730993099B8CE7D3F8E020A0 +:10787000184842F40072C3F8E020D3F8E03003F473 +:1078800000730A930A9B7EE7D3F8E020124842F483 +:107890008062C3F8E020D3F8E03003F480630B93F8 +:1078A0000B9B70E70D48EFF719F900BF0044025831 +:1078B000000002580004025800080258000C025848 +:1078C000001002580014025800180258001C0258F8 +:1078D00000200258002402580028025896D80108B7 +:1078E00010B504464FF4707101F03AF8012004F02D +:1078F0000F04A04010BD00004B1C70B504460E469E +:10790000018216D0C1F30310FFF722FF054630466F +:10791000FFF7E6FF238A074A03F00F036561206043 +:1079200052F82330A36105F1100318356360C4E9F0 +:10793000025570BDC4D90108B0F9100001F0A0B81B +:1079400010B50C4B0C4CD4F894209A42FBD1D0E9E2 +:107950000542524302EB4203DB4339B9226813402C +:1079600023604FF44072044B5A6110BD21680B40F4 +:107970001343F5E7000300800064025808B502F0E5 +:1079800037F8002008BD000010B5EFF711F8134BD1 +:107990001348144A596A1468038811601B1B0B446E +:1079A0000146B3F5803F16D34FF47A71B3FBF1F281 +:1079B00001FB1233038006E00132A3F57A73B3F5BD +:1079C0007A7FF9D20B80084C23681A442260EEF7C4 +:1079D000F9FF206810BD0022F1E700BF000C004055 +:1079E000801700248417002488170024054B07B54E +:1079F000D8680190F9F7D0F8019803B05DF804EB6E +:107A0000F9F7BDBD90210024054B07B5986801909A +:107A1000F9F7C2F8019803B05DF804EBF9F7AFBDD0 +:107A200090210024054B07B558680190F9F7B4F888 +:107A3000019803B05DF804EBF9F7A1BD9021002493 +:107A4000054B07B518680190F9F7A6F8019803B03F +:107A50005DF804EBF9F793BD9021002470B5B0F9FF +:107A60005C30254C03F11006B0F95E20A56845F89E +:107A70002610BFF34F8FA56802F1100645F82610B7 +:107A8000BFF34F8F90F87010002914BF10212021F0 +:107A9000002B19DB03F1604000F5614080F8001312 +:107AA000002A17DB02F16040002B00F5614080F8EE +:107AB000001315DA0123510902F01F0203FA02F242 +:107AC0000E4B43F8212070BD03F00F00043804442E +:107AD0002176E5E702F00F040948002B0155F2DB9F +:107AE000580903F01F0101238B40044941F820305D +:107AF000002ADFDAE7E700BF00ED00E000E100E088 +:107B000014ED00E010B5B0F95E40B0F95C00F8F794 +:107B10008DFA2046BDE81040F8F788BA90F850304A +:107B2000011D032B0ED8DFE803F00207090B0648FE +:107B3000064A42F8231070470548F9E70548F7E779 +:107B40000548F5E70020F3E7417A01089021002479 +:107B5000257A0108097A0108ED7901082C4A416D5E +:107B600012680368B2FBF1F1142243604A43996939 +:107B7000090401D5013AFAD12648274AD0F88C10D9 +:107B80009142FBD1254A934211D1254BD3F8902045 +:107B900042F40012C3F89020D3F8902022F400128F +:107BA000C3F890201B4B4FF44072DA6070471D4AB7 +:107BB000934214D002F5806293421CD01A4A934239 +:107BC000F0D1174BD3F89C2042F08002C3F89C20E0 +:107BD000D3F89C2022F08002C3F89C20E2E7104BEF +:107BE000D3F8902042F48002C3F89020D3F890207C +:107BF00022F48002D4E70A4BD3F8902042F400022A +:107C0000C3F89020D3F8902022F40002C8E700BF08 +:107C10001803002400640258000300800054004050 +:107C20000044025800580040001C0058D0F884302E +:107C300007B50146ABB1D0F8943093B190F87C20F1 +:107C40009BB2002A14BF4FF000720022C26500925E +:107C5000D0F89020B0F87810F8F7D8FE03B05DF8AF +:107C600004FB082381F86030F8E7082380F86030CF +:107C7000704738B5051D0446C2602846F8F723FE54 +:107C80002046FFF74BFF01462046FFF7E7FE284658 +:107C9000BDE83840F8F76CBF012902D180F86D10BB +:107CA000704711B9012380F86E307047002380F8C7 +:107CB0006D30704710B490F86C200346022A19D139 +:107CC000B0F87620013292B2A0F87620B0F87610A3 +:107CD000B0F8742089B292B291420BD2B0F87640DB +:107CE0004FF08073016F012211FA84F15DF8044BAB +:107CF000F8F7DEBE002283F86E205DF8044B704773 +:107D000090F86C30022B02D1002380F86E30F8F727 +:107D10002FBF10B5044650F80429136823F0FE0362 +:107D20001360FFF7EFFE022384F8603010BD0000FF +:107D30002DE9F04F444C8DB0444A4FF0000C04EB59 +:107D40005003434D4FF0FF3BB3FBF0F02C2359435E +:107D50005318525804EB5201B1FBF2FA59689A6A6F +:107D6000CDF804A04243B4FBF1F107919968B4FB4C +:107D7000F1F1089137490968059102EB4001C2F120 +:107D8000FF22323102F57F020291CE320B92059A28 +:107D9000624503D158460DB0BDE8F08F99694FF0A8 +:107DA000000E2A68049102FB0002029911440E465B +:107DB00003910299AAEB0101891A0A910499CDF85D +:107DC00024E00EF1010EB14235D20B993144B0EBF3 +:107DD000910F30D20A9F4FF00008D3E908410C44BC +:107DE000A1190091009C0399A7EB04092144089F65 +:107DF000CDF8188008F101088F4216D8079F8F42EE +:107E000013D3009C0F1BDC69BC420ED8B8420CD2C5 +:107E1000B1EB0A07019C48BF4F46A74205D2099C17 +:107E2000E34601972C61069CEC60B8F5807F114415 +:107E3000A9EB0209DBD1BEF5807F1644BED10CF15F +:107E4000010C1435A3E700BF00CA9A3BE0D8010833 +:107E50008C1700248C210024304B2C2203EB500380 +:107E6000B3FBF0F02E4B02FB01312DE9F04F4A6AD3 +:107E700085B08B6A4FF01008CC684FF0140A0E6A78 +:107E8000033314440A694343DFF89C90323C921B4D +:107E9000E41AA2F582720344D31A4A690146B21861 +:107EA00023EAE37B1F4B029224EAE47201921A68F0 +:107EB00000239E468C460025029C039501356445AF +:107EC0001ED800242746019EA64215D8A34513D3E9 +:107ED000984511D00AFB02F80132039E09EB080E07 +:107EE0007F2A49F80830CEE9016702D90D4B1A60A4 +:107EF00010E098464FF0010E01370C44102FE2D1EC +:107F0000102D8C44D8D101330144102BD2D1BEF1B5 +:107F1000000FEBD105B0BDE8F08F00BF00CA9A3B5F +:107F2000E0D801088C2100248C17002413B5214BC4 +:107F300000241C6010B9002002B010BD0029FAD046 +:107F4000A1F59C3349F64042803B93420ED9A1F5FE +:107F50009C23194AA3F50073934228D9A1F5432124 +:107F6000164BA1F5A0619942E5D802242146019063 +:107F7000FFF772FF21460198FFF7DAFE7F28DAD873 +:107F800014230F4958430A180B58107C40EA037019 +:107F900053681B0503F47003184393681B0403F430 +:107FA00070231843D3681B029BB21843C4E7012413 +:107FB000DCE700BF8C21002400710200801A06005B +:107FC0008C17002470B50C4616461D46FFF724FB9F +:107FD0000CB1AE420DD00C4B98420CD10B4B9D42D4 +:107FE0000ED00B4B9D420DD00A490B4C8D4218BF51 +:107FF0000024204670BD2946BDE87040FFF796BFBB +:10800000064CF6E7064CF4E7000E2707801A060038 +:1080100040420F00A08601007656E1403414C12092 +:108020003615C300364B426D1B68B3FBF2F21423C6 +:1080300070B5534304460D46061D42689169090414 +:1080400001D5013BFAD12F4B9D421BD122682E4B0B +:108050009A4202D10120F9F7F3FA22682B4B9A4297 +:1080600002D10220F9F7ECFA2268294B9A4202D198 +:108070000420F9F7E5FA2268264B9A4202D108203B +:10808000F9F7DEFA2449254BD1F88C209A42FBD12E +:1080900023681D4A934205D1214A536D23F440536E +:1080A000536509E0194A9342F6D002F58062934283 +:1080B000F2D0184A93421DD0174B4FF44072002162 +:1080C0003046DA60F9F796FA2B46E26EA16820682E +:1080D000FFF778FF00230122A060E5663046E360E9 +:1080E000C4E90423C4E90833C4E90633F8F7EBFB19 +:1080F000656570BD0A4A936D23F440739365DBE7B1 +:108100001803002440420F00005400400058004073 +:10811000005C0040001C005800640258000300800E +:10812000004402581FB500230446C366836039B17A +:108130008B88A0F858308B89A0F85A300B68036000 +:108140002368434A934212D1002384F85030414BB4 +:10815000D3F8E82042F40012C3F8E820D3F8E8305E +:1081600003F400130093009B3B4BE36509E03B4A9B +:10817000934236D002F58062934244D0384A93420B +:1081800053D03849B4F95800EDF7E4FC3649B4F956 +:108190005A00EDF7DFFC0421B4F9580000F070FC40 +:1081A0000421B4F95A0000F06BFC636D0BB92F4B3E +:1081B00063652046FFF7D2FC616D2046FFF732FF72 +:1081C000636D4FF00072E3660023226684F871301D +:1081D00084F8703084F8723084F86430A36604B098 +:1081E00010BD012384F850301A4BD3F8E82042F434 +:1081F0008002C3F8E820D3F8E83003F48003019349 +:10820000019B1B4BB1E7022384F85030114BD3F88C +:10821000E82042F40002C3F8E820D3F8E83003F481 +:1082200000030293029B134B9FE7032384F8503013 +:10823000084BD3F8F42042F08002C3F8F420D3F8BE +:10824000F43003F080030393039B0B4B8DE700BFD7 +:1082500000540040004402581F0020000058004015 +:10826000001C0058E4D3010848D30108A08601008F +:1082700021002200480049005F0060002DE9F0471E +:108280000D46DFF864A086B0144606465146DFF876 +:108290005C902846EDF7A2FC074649462046EDF7DC +:1082A0009DFC01463846EDF777FC5146804628464E +:1082B000EDF7A8FC494607462046EDF7A3FCA422AB +:1082C000059000213046CDF80480ADF808500397A2 +:1082D000ADF8104002F048FA01A93046FFF722FF3E +:1082E00006B0BDE8F08700BFE4D3010848D3010819 +:1082F000F0B51D46036E85B0044633F000730E469C +:1083000000F1040703921CD10A99002918BF4FF00D +:1083100000730366002380F86430FFF7FFFB01461B +:108320002046FFF79BFB236E039AB1B200933846B9 +:10833000ABB2F8F719FB38B16FF00105284605B06C +:10834000F0BD1248EEF7CAFB114B1E68636DB6FB19 +:10835000F3F605FB06631E265E4394F8643013F0C3 +:108360001E0F01D1013E0CD12046FFF7CBFB1EB101 +:1083700094F86430082BE1D000212046FFF7D2FEAC +:10838000DAE70120EFF7A6F9E7E700BFB7D8010861 +:108390001803002473B50546043895F86C6006B1DF +:1083A000AE686C6C0021019014F0040418BF142412 +:1083B000FFF7B8FE01983EB10223324685F86C30D3 +:1083C00000231946FFF755FC44F00204E4B285F897 +:1083D000604002B070BD0000044B054A1878054BA0 +:1083E000002814BF10461846704700BF2003002421 +:1083F000B4D90108BCD90108024BD869DA698242B4 +:10840000FBD17047002C005808B5EEF7D1FA084BA5 +:1084100001221A700022074B1A704FF48052064B4B +:10842000C3F810211A61BDE80840EEF7CBBA00BFCF +:10843000A9210024B021002400E100E010B5EEF7EE +:10844000B7FA134B1A7842B9124A12681168090731 +:10845000FCD50821516001221A700F4C23781BB102 +:10846000EEF71EFD0023237000230C4A13700C4A04 +:1084700013704FF480520B4BC3F89020BFF34F8F13 +:10848000BFF36F8FBDE81040C3F89021EEF79ABAA2 +:10849000AA210024843E0024B2210024B02100241B +:1084A000A921002400E100E05D4B70B51C68C4B058 +:1084B0001CB1FFF7C3FF44B070BD0125C0222146A7 +:1084C00014A8584E1D6002F04FF94C22214601A815 +:1084D00002F04AF9337833B304230A940193052355 +:1084E0000393802314934FF4C0433C934E494F4B66 +:1084F000D1F88C209A42FBD101A8FAF711F9D8B132 +:108500000023082201A833700A93802301920122DC +:1085100014934FF4004306923C93FAF701F958B1D3 +:108520004348EEF7DBFA08220A938023069501926E +:1085300014934FF40043D8E714A8FAF72BFF05462D +:1085400008B13C48EDE73C4B4FF4803134203B4CC4 +:10855000D3F8F4204FF6FF7642F40062C3F8F4201B +:10856000D3F8F42002F400620092009AD3F89C2021 +:1085700042F40062C3F89C20D3F89C2022F40062ED +:10858000C3F89C20D3F8A82042F40062C3F8A820C6 +:108590000122F7F7A7FC2A464FF480313420F7F781 +:1085A000CAFC214B4FF440722046DA60A3F50E332B +:1085B00084F8365023604FF48023E5612563C4E9D5 +:1085C0000155C4E90355C4E90855C4E90A55C4E98D +:1085D0000563F9F767F8054608B11948A1E7194B93 +:1085E000194A9B68C3F87022BFF34F8F2368314646 +:1085F00020469A6842F001029A609A6842F00802A6 +:108600009A60F9F7B5F8236808225A605D611A6824 +:108610001207FCD508225A6001220C4B1A704AE757 +:10862000A4210024200300240064025800030080D9 +:1086300064D901087DD9010800440258843E002411 +:108640009ED9010800ED00E041870108AA2100241D +:1086500008B5EEF7ADF9064B01221B685A604FF4DE +:108660008052044BC3F89021BDE80840EEF7AAB948 +:10867000843E002400E100E070B50446EEF798F96E +:10868000FFF7BAFE264B05461C60264A4FF4805180 +:108690001161254E18463178F1B9611F4FF6F57218 +:1086A000914222490FD94FF6FA7295420BD90634FE +:1086B0000122A4B20A701C601D4B01221A70BDE891 +:1086C0007040EEF77FB900220A700368AB42194B85 +:1086D00028BF01221A70EFE7FFF7BAFF00235A19EB +:1086E000013392B2A24204BF0534A4B2052BF6D1E5 +:1086F000114BAC421B6811D24FF6FA7295420DD85D +:108700004FF0FF325A6100230C4C33702378002B5A +:10871000D5D1EEF7B1FB01232370D0E75C61F2E71E +:10872000AC21002400E100E0AA210024B1210024B2 +:10873000B0210024A8210024843E0024B22100247A +:1087400070B5EEF735F92C4B2C4C1A7832B100226B +:108750001A70012223685A60EDF7F2F923681A684B +:10876000D50706D59A68D00703D501225A60EDF7E0 +:10877000E7F923681A68110724D59A68120721D5EA +:1087800008221F4C5A6001221E4B1A7023781BB11D +:10879000EEF786FB002323701B4C237893B11B4D0F +:1087A0001B492B7803F0FF06B3B1FFF725FE063017 +:1087B0000B6880B2984209D3FFF726FE00232B7086 +:1087C00000232370BDE87040EEF7FCB80868063857 +:1087D00080B2FFF751FFF1E70E4D2B7843B1FFF761 +:1087E0000BFE0B68984203D3FFF70EFE2E70E7E7EF +:1087F0000868FFF741FFE3E7A9210024843E002435 +:10880000B2210024AA210024B0210024B121002497 +:10881000AC210024A8210024FFF710BE70470000FF +:10882000384B5A6973B5910315D45A6912F4003262 +:1088300011D1BFF34F8FBFF36F8FC3F85022BFF337 +:108840004F8FBFF36F8F5A6942F400325A61BFF302 +:108850004F8FBFF36F8F2B4B5A69D20327D45A69BE +:1088600012F4803223D1C3F88420BFF34F8FD3F8A2 +:10887000802043F6E074C2F3C900C2F34E325201C5 +:1088800002EA0406014646EA81750139C3F86052DE +:10889000F9D2203A12F1200FF2D1BFF34F8F5A696B +:1088A00042F480325A61BFF34F8FBFF36F8F164C83 +:1088B000D4F8E03043F00073C4F8E030D4F8E0308E +:1088C00003F000730193019BFEF7A0FBF7F7AAFAF0 +:1088D000236F9B0707D4F9F747FCF7F7E3FA236FF9 +:1088E00023F0180323670220F9F754FCFEF704FD78 +:1088F000FEF78CFBFFF792FF044B01221A6002B0D7 +:1089000070BD00BF00ED00E000440258B421002417 +:1089100030B5114B114DD5F894409C42FBD14943E1 +:10892000012A01EB41034FEA41046FEA030304D03B +:10893000022A0BD0C1680B400BE0C26813401943F8 +:10894000C160064B4FF440725A6130BDC1680B40A4 +:108950002343C360F5E700BF0003008000640258B2 +:108960002DE9F843431C0C4672D000F00F02414B36 +:108970001FFA80F9C0F3031001F00705C1F3831853 +:1089800053F82260FEF7E4FE3B493C4BD1F89420BB +:108990009A42FBD106FB06F2B8F10F0F02EB42033D +:1089A0006FEA030726D181680B4383604FF440715F +:1089B000314B022D596124D101F10041D3F894C00B +:1089C0008C45FBD119F0080FC4F3832842D0330A39 +:1089D000416A5B435B43C3EB031E03FB08F321EADD +:1089E0000E0E4EEA030343624FF44071224B59616D +:1089F00002210EE0836808FB02F83B4043EA0803CB +:108A0000D3E7032D33D005F1FF3CDCF1000141EB4E +:108A10000C01DFF864E0194BDEF894C09C45FBD1F3 +:108A200003684A43013D3B40012D42EA03020260D4 +:108A300005D8436822074CBF3343B3434360C4F3B4 +:108A400001123146FFF764FF0B4B4FF440725A613D +:108A5000BDE8F88302FB02FC016ACCEB0C130CFBB3 +:108A600008FC21EA030141EA0C010162BCE7294646 +:108A7000CFE700BFC4D9010800640258000300809A +:108A800038B5431C0C4629D000F00F021D4BC0F333 +:108A9000031053F82250FEF75BFE1B491B4BD1F825 +:108AA00094209A42FBD105FB05F2016802EB4203D8 +:108AB0000B40B3FBF2F3013B012B19D8E31E022B51 +:108AC00043680CD82B43032C436019D1012229465B +:108AD000FFF71EFF0C4B4FF440725A6138BD23EA7A +:108AE0000503012C4360F1D0022C07D00022EEE7F1 +:108AF00004F0FD03012BE9D0052CF5D10222E6E7B5 +:108B0000052CF2E7C4D90108006402580003008074 +:108B1000F8B5037890F801C0012B057F0279077B37 +:108B2000866844792ED0022B2FD0002B30D14FF401 +:108B300080738B610023C1F800C04D614B63C1E9B4 +:108B40000B333FB3CB61CB60037C012B45D0022BB1 +:108B500048D0002B4BD14FF480430B620123027E9F +:108B6000002A47D000230B620B61437F012B6AD0A0 +:108B7000022B6BD0002B6CD14FF0807300204B6226 +:108B80008862F8BD4FF40073D3E74FF44073D0E729 +:108B90000023CEE7012A4E600BD0022A0CD072B916 +:108BA0004FF48063CB61032C09D8DFE804F00B0D90 +:108BB00010134FF40063F5E74FF44063F2E72748E2 +:108BC000EDF78CFF0023BEE74FF48053BBE74FF473 +:108BD0000053B8E74FF44053B5E74FF400430B623E +:108BE0000223BCE74FF440430B620423B7E70023A2 +:108BF0000B62B4E77BB3427CB2FBF3F403FB1424B7 +:108C000014F0FF0F27D1561EF610741C042C22DC22 +:108C1000C2EBC40212F0FF0210D0B2FBF3F39D428C +:108C200019D3EB1A4B61436903FA02F28A60032EEF +:108C300007D82404A4F580340C6196E743698B605F +:108C4000F5E70748BCE74FF0007397E74FF0407334 +:108C500094E7002392E74FF0FF3092E704DA01082F +:108C60002DDA010810B50446F9F74DFC00283DD176 +:108C70002049214BD1F88C209A42FBD11F4BB4F9EB +:108C80005000DA6F42F48042DA67DA6F22F48042F1 +:108C9000DA674FF44072CA6040F2C331D3F8D4208F +:108CA00022F48042C3F8D420FFF75AFE40F2C331C9 +:108CB000B4F95200FFF754FE40F2C331B4F9540046 +:108CC000FFF74EFE40F2C331B4F95600FFF748FEFD +:108CD00040F2C331B4F95800FFF742FEB4F95A002C +:108CE00040F2C331FFF73CFE002010BD4FF0FF30D3 +:108CF000FBE700BF006402580003008000440258F4 +:108D000070B50D460646FAF769F9B0FBF5F4FF2C8D +:108D100010DCFAF763F9B0FBF5F101FB150505B9B5 +:108D2000013C30467460F9F79FFB003818BF012002 +:108D3000404270BDFF24F4E72DE9F04F2DED068B86 +:108D400087B01D460F461646199B04467D49384696 +:108D50000AEE903A9DF86830BDF958A00293BDF92B +:108D60005CB0BDF96080ECF739FF7749039030467D +:108D7000ECF734FF754901902846ECF72FFF744952 +:108D800008EE100A5046ECF729FF724908EE900AE7 +:108D90005846ECF723FF704909EE100A4046ECF7FD +:108DA0001DFF019A039B814611461846ECF7F4FE1D +:108DB00018EE901A019018EE100AECF7EDFE4946F5 +:108DC000039019EE100AECF7E7FE019B1A46039B8D +:108DD0009A4240F0B080824240F0AD805949384616 +:108DE000ECF710FF584903903046ECF70BFF57495A +:108DF00008EE100A2846ECF705FF554908EE900AE0 +:108E00005046ECF7FFFE534909EE100A5846ECF7BE +:108E1000F9FE514909EE900A4046ECF7F3FE4F4A3D +:108E20000AEE100A039BD2F8D4104D4841F4804159 +:108E3000C2F8D410D2F8D41001F4804105910599FC +:108E40004849D0F88CC08C45FBD1D16F4FF0000958 +:108E500041F48041D167D16F21F48041D1674FF453 +:108E600040720121C26000223846A4F8507084F894 +:108E70004120E26084F840204FF0004292FAA2F2D2 +:108E8000B2FA82F2013A22614FF480626261029A80 +:108E9000B2EB090218BF0122A261019AC4E90111D3 +:108EA00022601946C4E90799FFF75AFD494638463A +:108EB000FFF7E6FD18EE101A3046A4F85260FFF7EF +:108EC0004FFD49463046FFF7DBFD18EE901A284665 +:108ED000A4F85450FFF744FD49462846FFF7D0FD5B +:108EE00019EE101A5046A4F856A0FFF739FD49466E +:108EF0005046FFF7C5FD19EE901A5846A4F858B031 +:108F0000FFF72EFD49465846FFF7BAFD1AEE101A34 +:108F10004046A4F85A80FFF723FD49464046FFF734 +:108F2000AFFD1AEE901A204607B0BDEC068BBDE8E7 +:108F3000F04FFFF7E5BE6FF0010007B0BDEC068B08 +:108F4000BDE8F08F80D40108B0D40108E0D4010856 +:108F500004D5010834D5010858D501080044025849 +:108F6000006402580003008070B58EB004460846C5 +:108F7000154669461E46FFF7CBFD90B9336841F2AE +:108F80008832694620460A93F9F7CEFA58B941F279 +:108F9000883229462046F9F70AFB003818BF01201D +:108FA00040420EB070BD4FF0FF30FAE770B58EB0A2 +:108FB00004460846154669461E46FFF7A9FD90B9C6 +:108FC000336841F28832694620460A93F9F7ACFAD1 +:108FD00058B941F2883229462046F9F741FB00385A +:108FE00018BF012040420EB070BD4FF0FF30FAE7CD +:108FF0002DE9F0418EB005460E46DDE9147802B148 +:10900000E3B917B1B8F1000F16D169463046FFF742 +:109010007FFD044660B9012341F288326946CDE9FB +:1090200009032846F9F780FA002818BF4FF0FF34EB +:1090300020460EB0BDE8F08172B16BB100933146AD +:109040006B462846FFF790FF04460028F0D1002F1A +:10905000EED0B8F1000FEBD06B463A4631462846C9 +:10906000CDF80080FFF7A2FF0446E1E7164BD3F8E6 +:10907000D020510020D4D3F8D020002A1CDBD3F814 +:10908000D020D2001AD4D3F8D020500116D4D3F86F +:10909000D00010F0807013D1D3F8D020110212D478 +:1090A000D3F8D02092020DD4D3F8D03013F4800F2F +:1090B0000CBF0B200120704706207047042070472A +:1090C000032070470220704700440258014BD3F838 +:1090D000D000704700440258034AD2F8D03043F41D +:1090E0008033C2F8D03070470044025801207047E6 +:1090F00010B5C4B04C22002101A801F035FBC022FC +:10910000002114A801F030FB3C4B1A68002A72D1F0 +:1091100001221A60F9F728F839493A4BD1F88C2026 +:109120009A42FBD1FFF7E2FF08B3042301A80193A1 +:1091300000230A9305230393F9F7F2FA10B132489A +:10914000EDF7CCFC314B14A81A6922F47C521A6159 +:109150001A6F42F480721A674FF4800314934FF42D +:1091600080734193FAF716F908B32948E8E7082312 +:109170000A9001A8019301230693F9F7D1FA08B1E7 +:109180002448DDE7214B14A81A6922F47C521A61A5 +:109190001A6F42F400721A674FF4800314934FF46D +:1091A00000734193FAF7F6F808B11B48C8E7144B6F +:1091B0004FF44072194C7F21DA60144A2046136F35 +:1091C00043F400431367FF22154B23600023C4E9D7 +:1091D000021284F82130636023616361C4E90633BD +:1091E000FBF760F908B10F48AAE72046FBF772FACF +:1091F00008B10D48A4E744B010BD00BFB821002459 +:10920000006402580003008044DA01080044025858 +:1092100064DA01088DDA0108ADDA0108BC21002406 +:1092200000400058D6DA0108F1DA0108214B224942 +:10923000224AF0B51C688DB05D681E460C400F4692 +:10924000154018680840A0422CD158681040A84228 +:1092500028D105F03F00FBF72AFA0690C5F3042059 +:10926000FBF725FA01380790280CFBF720FA443069 +:109270000890C4F30540FBF71AFA0590C4F30620E2 +:10928000FBF715FA049004F07F00FBF710FA0122B7 +:109290000390694603A8EDF75BFC40B1DDE90001EE +:1092A0000DB0F0BD346875683C401540C9E700203A +:1092B0000021F5E7004000587F7F7F003FFFFF005F +:1092C000F0B5002491B0142207460E4602A82146AC +:1092D000204D019401F048FAEDF76AFB1E4B07AAF6 +:1092E00038462B6031460123EDF786FC80B30D9B99 +:1092F000224601A92846A3428DF80B4008BF072348 +:109300008DF804300B9B01338DF805300A9B8DF8E6 +:1093100006300C9B443B8DF80730099B8DF80830D4 +:10932000089B8DF80930079BCDE905448DF80A307C +:10933000FBF76BF9024610B10848EDF7CFFB02A925 +:109340002846FBF700F908B10548F6E7EDF73AFBC8 +:1093500011B0F0BDBC210024004000580BDB010817 +:1093600022DB0108024BD868C0F30010704700BF31 +:1093700000400058C069C0F38010704742689023D5 +:109380005343054AD358DA69120701D508221A62F5 +:10939000D869C0F3401070475438002442689023C5 +:1093A0005343034AD358D869C0F3C010704700BF75 +:1093B0005438002438B54268902301685343204A4A +:1093C00099509C1882686260B2F5965FC36838BF96 +:1093D0000725A3600369E36043692361C369A3614F +:1093E0004FF0000328BF1D46A4F85630E361A4F8EF +:1093F0005430A4F85E30A4F85C3023626366C4E99C +:109400000953B0F91A3001330FD1082363610D4BB2 +:10941000994205D1B2F5165F20460DD8FCF7F2FC53 +:109420002046BDE83840FCF7BDBCB0F91830013328 +:109430000CBF04230C23E9E7FCF7F4FCF0E700BFC2 +:1094400054380024000C00580268294B9A4230B569 +:109450000446C5B0816046D10021BC2215A801F0A8 +:1094600083F904231493234B196811F0040116D1D6 +:10947000482202A801F078F902231F4D019301232D +:1094800004930A93402305931C4BD5F88C209A42F1 +:10949000FBD101A8F9F744F94FF44073EB60154B89 +:1094A0001B685B0711D50323134D3993134BD5F874 +:1094B0008C209A42FBD114A8F9F76CFF4FF440734B +:1094C0002046EB60FFF776FF80B100230A4D399309 +:1094D0000A4BD5F88C209A42FBD114A8F9F75AFF11 +:1094E0004FF44073EB602046FFF764FF45B030BD9A +:1094F000000C005800440258006402580003008029 +:109500001A4B984222D0A3F54C43984220D003F541 +:10951000806398421ED003F5806398421CD003F507 +:10952000806398421AD003F54443984218D0A3F5BB +:109530001C43984216D003F58063984214D00C4B1C +:10954000984214BF4FF0FF3008207047002070474A +:1095500001207047022070470320704704207047A5 +:109560000520704706207047072070470010014013 +:10957000000C00582DE9F0470F4616468AB07E4988 +:1095800004463846ECF72AFB80467C493046ECF727 +:1095900025FB01464046ECF7FFFA77490546384679 +:1095A000ECF730FB754982463046ECF72BFB8146E1 +:1095B00040F2091087420AD0B6F5857F07D06E4980 +:1095C000ECF70CFB404526D16D48EDF787FA4FF0DC +:1095D00001086C4B25609D4220D16B4BD3F8F020E5 +:1095E00042F01002C3F8F020D3F8F03003F010037B +:1095F0000193019B654B9D427DD1634BD3F8F020D5 +:1096000042F02002C3F8F020D3F8F03003F020033A +:109610000693069B1CE04FF00008DAE75C4B9D4286 +:109620004ED003F580639D4258D05A4B9D4273D073 +:10963000594B9D42DED1544BD3F8E82042F48012BE +:10964000C3F8E820D3F8E83003F480130593059BB2 +:109650002846FFF755FF514660603846FFF780F90E +:1096600001213846FFF70CFA49463046FFF778F9F2 +:1096700030460121FFF704FA00234FF4165220462A +:10968000E36127836683C4E90223C4E90433FFF757 +:1096900091FEB8F1000F10D0404B012204F12005DB +:1096A0001A603F4B2068083454F8041C1A46AC4238 +:1096B00003C21346F6D1206810600AB0BDE8F087F7 +:1096C000314BD3F8E82042F40032C3F8E820D3F855 +:1096D000E83003F400330293029B8BE72A4BD3F864 +:1096E000E82042F48022C3F8E820D3F8E83003F4FD +:1096F00080230393039B2B4B9D421AD1224BD3F81B +:10970000E82042F08042C3F8E820D3F8E83003F0C4 +:1097100080430793079B9BE71B4BD3F8E82042F459 +:109720000022C3F8E820D3F8E83003F400230493C0 +:10973000049B1D4B9D4210D01C4B9D4288D1124B67 +:10974000D3F8F42042F00802C3F8F420D3F8F43040 +:1097500003F008030993099B7AE70B4BD3F8E82041 +:1097600042F00042C3F8E820D3F8E83003F00043A9 +:109770000893089B6CE700BFE4D6010888D5010870 +:1097800039DB010800100140004402580014014078 +:1097900000440040004C004000500040E021002404 +:1097A000BC3E002400780040007C0040000C0058C3 +:1097B0002A4808B5036813F0010304D0FFF7DAFD67 +:1097C000B0FA80F35B0926480268D10704D5FFF799 +:1097D000D1FD002808BF012322480268D20704D522 +:1097E000FFF7C8FD002808BF01231F480268D10702 +:1097F00004D5FFF7BFFD002808BF01231B480268FE +:10980000D20704D5FFF7B6FD002808BF012318488A +:109810000268D10704D5FFF7ADFD002808BF01237A +:1098200014480268D20704D5FFF7A4FD002808BF3A +:10983000012311480268D10704D5FFF79BFD0028DA +:1098400008BF01230D480268D20704D5FFF792FD37 +:10985000002808BF0123184608BD00BF00100140C2 +:109860000044004000480040004C004000500040D0 +:109870000014014000780040007C0040000C0058BB +:1098800008B5EDF795F8064B0121186810F00100B6 +:1098900018BF0846F8F770FCBDE80840EDF792B82D +:1098A0000048025870B594B0FFF782FF04460028C4 +:1098B00075D1EDF77DF83B4D00F046F9012102220C +:1098C0002E680846F8F7A2FC012122460846F8F760 +:1098D0009DFCF60703D52B6843F001032B600023A2 +:1098E000314D32492B60324BD1F890209A42FBD156 +:1098F0002C4B1A6994063CD55B69980639D52B4EDA +:109900002B4BD6F88C209A42FBD14C22002101A887 +:1099100000F02AFF01A8F9F7A7FB0223012101A803 +:1099200001931023CDE9041300230A93F8F7F8FEFE +:10993000044610B11F48EDF7D1F8014620220090EF +:1099400001A800F011FF694601A8F9F709FC1B23E3 +:10995000009901A801930794029404940694F9F7DE +:1099600017FA08B11448E6E7FDF7C6FC4FF4407358 +:10997000F3600C4A136943F4007313614FF44072AF +:109980000A4B1A610D4B596A5A6A521AB2F5FA7F9C +:10999000FAD300F0F1F801232B60EDF713F814B0BF +:1099A00070BD00BF00480258B42100240064025872 +:1099B000000300806EDB010893DB0108000C00400F +:1099C000074B084A13601A69910707D5DA689207AE +:1099D00004D56FF002021A61ECF722BB704700BF9A +:1099E000000C0040E43E002400487047BCDB010846 +:1099F00030B58BB0694602A8F9F7B2FBF9F710FB56 +:109A0000274B0090D3F8E820264942F00802C3F81B +:109A1000E820D3F8E82002F008020192019A224AD5 +:109A2000D1F88C409442FBD1D3F890201F4C42F0E7 +:109A30000802C3F89020D3F8902022F00802C3F85F +:109A400090204FF44073CB60194B079A23604FF07E +:109A5000FF33E360174B0ABB0025B0FBF3F001387E +:109A60002561A56060601148C4E90555FBF730FE2B +:109A7000114B124A9B68C3F80821BFF34F8F104B5C +:109A80004FF480225A6009482946FBF75FFE22689E +:109A9000D36823F00203D3600BB030BD4000DBE796 +:109AA000004402580064025800030080E43E002491 +:109AB000000C004040420F0000ED00E0C199010899 +:109AC00000E100E0044800210268D36823F00203AB +:109AD000D360FBF73BBE00BFE43E0024014B586A55 +:109AE000704700BF000C0040054B6FF002021B687E +:109AF00058631A61DA6842F00202DA60704700BF08 +:109B0000E43E0024064B6FF002021B681A615A699A +:109B100042F002025A61DA6842F00202DA607047EB +:109B2000E43E0024034B1A68D36823F00203D36099 +:109B3000704700BFE43E0024024B6FF002021B6836 +:109B40001A617047E43E0024064B074A1B68596AB5 +:109B500011605A6B054B1A60054BDA68054B1A60A9 +:109B6000704700BFE43E0024343F0024E03E002460 +:109B7000000C0040303F0024064B074A1B68126867 +:109B80005A62064A12685A63054B1A68054BDA6036 +:109B9000704700BFE43E0024343F0024E03E002430 +:109BA000303F0024000C0040014B1868704700BF94 +:109BB000240300248A892DE9F041054610070C464C +:109BC00058D44B68002B05DC0B6C002B02DC00200A +:109BD000BDE8F081E66A002EF9D0002312F480522D +:109BE0002F682B6032D0606DA3895A0705D5636852 +:109BF000C01A636B0BB1236CC01A00230246E66ADD +:109C0000216A2846B047431CA38906D129681D292B +:109C10002CD82A4ACA40D60728D500226260D90427 +:109C20002269226004D5421C01D12B6803B960650A +:109C3000616B2F600029CAD004F14403994202D01D +:109C40002846ECF7C5FD00206063C1E7216A0123C7 +:109C50002846B047411CC7D12B68002BC4D01D2B10 +:109C600001D0162B01D12F60B1E7A38943F0400347 +:109C7000A381ADE70F69002FA9D093070E6808BF35 +:109C80004B690F6018BF0023A6EB07088B60B8F183 +:109C9000000F9CDD216AA66A43463A462846B04733 +:109CA000002806DCA38943F04003A3814FF0FF3076 +:109CB0008EE70744A8EB0008E9E700BF0100402059 +:109CC00038B50B6905460C4613B90025284638BD42 +:109CD00018B183690BB900F099F8144B9C421BD161 +:109CE0006C68B4F90C30002BEFD0626ED00704D44E +:109CF000990502D4A06D00F050FC28462146FFF7DC +:109D000059FF636EDA070546E0D4A3899B05DDD4CD +:109D1000A06D00F044FCD9E7054B9C4201D1AC6832 +:109D2000DFE7044B9C4208BFEC68DAE7E8DC010897 +:109D300008DD0108C8DC0108014620B9044B0549CB +:109D4000186800F0DCBA044B1868FFF7B9BF00BF11 +:109D500028DD0108C19C010824030024002310B55C +:109D60000446C0E90033C0E904338360818143665F +:109D7000C2818361194608225C3000F0F5FC054B76 +:109D80006362054BA362054BE362054B24622363C8 +:109D900010BD00BF79AE01089FAE0108D7AE010823 +:109DA000FBAE0108014900F0AABA00BFC19C01083E +:109DB00070B54A1E682555430E4605F17401ECF74F +:109DC00003FD044640B10021C0E900160C30A0603C +:109DD00005F1680200F0C8FC204670BD014800F0A3 +:109DE000DCBB00BF3F3F0024014800F0D8BB00BFF0 +:109DF0003F3F0024014800F0D0BB00BF3C3F00249F +:109E0000014800F0CCBB00BF3C3F002410B5044625 +:109E1000FFF7F0FFA3691BB1BDE81040FFF7F0BFEB +:109E2000C4E912332365134B134A1B68A262A34291 +:109E300004BF0123A361204600F020F860602046A3 +:109E400000F01CF8A060204600F018F80022E06046 +:109E500004216068FFF782FFA06801220921FFF753 +:109E60007DFFE06802221221FFF778FF0123A36142 +:109E7000D2E700BF28DD0108A59D0108F8B5074617 +:109E8000FFF7ACFF1E4B1E68B36913B93046FFF7EE +:109E9000BDFF4836D6E90134013B03D533680BB327 +:109EA0003668F7E7B4F90C50D5B9164BE36004F106 +:109EB0005800656600F06EFBFFF796FFC4E9015598 +:109EC000C4E904552560A5610822294604F15C0017 +:109ED00000F04AFCC4E90D55C4E912552046F8BD0E +:109EE0006834D9E704213846FFF762FF0446306042 +:109EF0000028D5D1FFF778FF0C233B60EEE700BFC9 +:109F000028DD01080100FFFFF7B50F46114601AA41 +:109F1000054601F0B9FC064618B90024204603B0F6 +:109F2000F0BD2846FFF7AAFF04460028F5D03946C1 +:109F3000019A4FF4DB73284600F03AFE071E09DA57 +:109F40000025FFF74BFFA06DA58100F024FBFFF774 +:109F50004BFFE2E7636EDB0705D4A389980502D4C3 +:109F6000A06D00F01AFB0E4B63620E4BA3620E4B0A +:109F7000E362F1050D4BE781A6812462236305D5D9 +:109F8000022300222146284600F0DCF8636EDA073F +:109F9000C4D4A3899B05C1D4A06D00F000FBBDE72C +:109FA00079AE01089FAE0108D7AE0108FBAE0108EB +:109FB000024B0A4601461868FFF7A6BF2403002497 +:109FC00070B50E461446054618B183690BB9FFF704 +:109FD0001DFF144B9C421AD16C68636ED80705D4E0 +:109FE000A389990502D4A06D00F0D7FA224628462D +:109FF000314600F0EFFD636EDA07054605D4A3890C +:10A000009B0502D4A06D00F0CAFA284670BD064B2D +:10A010009C4201D1AC68E0E7044B9C4208BFEC686D +:10A02000DBE700BFE8DC010808DD0108C8DC010847 +:10A03000024B0A4601461868FFF7C2BF24030024FA +:10A040002DE9F74F1F4613467B430C9C06468A4674 +:10A0500091469B465FD018B183690BB9FFF7D6FED6 +:10A060002E4B9C4228D17468636EDB0705D4A3890C +:10A070009D0502D4A06D00F090FA6368002B01DA10 +:10A0800000236360D846D4E9001545451ED34246F7 +:10A09000504600F05BFB60682168636EA0EB08002F +:10A0A0004144DA07606021602FD4A3899B052CD43A +:10A0B000A06D00F074FA28E0194B9C4201D1B468FD +:10A0C000D2E7184B9C4208BFF468CDE72A465046B9 +:10A0D00000F03CFB23682B4423602146A8EB0503DA +:10A0E0003046019300F0C8FDAA44019B88B1636E1D +:10A0F000D80705D4A389990502D4A06D00F04FFAC2 +:10A100005D44A5EB0803B3FBF9F7384603B0BDE89F +:10A11000F08F9846B7E71F46F7E700BFE8DC010875 +:10A1200008DD0108C8DC010807B5009313460A469C +:10A13000014603480068FFF783FF03B05DF804FBA6 +:10A140002403002400F00AB813460A4601460248D8 +:10A15000006800F003B800BF240300242DE9F0419B +:10A160000C4617461D46064618B183690BB9FFF722 +:10A170004DFE514B9C4222D17468636ED90705D4C1 +:10A18000A3899A0502D4A06D00F007FAA38903F40D +:10A190008473B3F5847F03D121463046FFF790FDE9 +:10A1A000D4F82C80B8F1000F13D11D233360636EF7 +:10A1B000D90778D54FF0FF352846BDE8F0813F4BF1 +:10A1C0009C4201D1B468D8E73D4B9C4208BFF4687B +:10A1D000D3E7012D36D035F0020362D123691BB9D4 +:10A1E0002146304600F000FA21463046FFF768FD70 +:10A1F0000028DCD1216A2B463A463046C047013060 +:10A20000D5D0616B41B104F14403994202D030468C +:10A21000ECF7DEFA0023636323692360A389002639 +:10A2200023F402636660A3810822314604F15C00D6 +:10A2300000F09AFA656E15F001053BD1A3899B05E4 +:10A24000BAD421E021463046FFF73AFDA28912F444 +:10A2500080520CD0656DA3895A0719D56368ED1A31 +:10A26000636B0BB1236CED1A2F440025B6E72B4628 +:10A27000216A3046C047431C0546ECD1636ED807BF +:10A2800098D4A389990595D4A06D00F088F993E737 +:10A290001807E9D523682269002BE5D09B1A1D44D5 +:10A2A000E2E7162382E7A3899A0583D4A06D00F024 +:10A2B00076F97FE735467FE7E8DC010808DD01082D +:10A2C000C8DC01082DE9F0410F4600F148040026E2 +:10A2D000D4E90185B8F1010805D52468002CF7D12F +:10A2E0003046BDE8F081AB89012B06D9B5F90E30B7 +:10A2F000013302D02846B84706436835EAE72DE91E +:10A30000F8430646884600F148040027D4E9019541 +:10A31000B9F1010905D52468002CF7D13846BDE80C +:10A32000F883AB89012B07D9B5F90E30013303D07F +:10A3300029463046C04707436835E9E770B50D4DFB +:10A340000D4C641BA4100026A64209D10B4D0C4CE9 +:10A3500001F0C6FF641BA4100026A64205D170BD03 +:10A3600055F8043B98470136EEE755F8043B98470B +:10A370000136F2E7F0030024F0030024F003002488 +:10A380000C04002438B5074B1D68EB6B04461BB961 +:10A39000242000F069F9E863E96B2046BDE8384005 +:10A3A00000F002B8240300242DE9F341074601918F +:10A3B00001F0F4FA01998046384601F0F3FA436956 +:10A3C0009A07044603F26C7605D1642296FBF2F3F9 +:10A3D00002FB13637BBB4FF4C87396FBF3F503FBDF +:10A3E0001565B5FA85F56D09684B302202FB053518 +:10A3F00000F0A0FF00F0AAFF654B1B6853B3D8F82C +:10A400000430B34219D1D8F80010D7E90067D8E971 +:10A410000823D1B9964277EB030323DAD8E9122354 +:10A42000964277EB0303B4BF0123002323621BDBB7 +:10A43000D8F828101AE00125D6E7304600F0D2FE01 +:10A440000028E0D14FF0FF3304E0964277EB03039E +:10A4500002DA00232362EBE7D8E91223964277EB76 +:10A460000303F6DA01232362D8F850104FF4616336 +:10A470003C2091FBF3F603FB1613616893FBF0F2AB +:10A4800000FB12302368891AA26861601B1A921BB4 +:10A490003B2B2360A26035DD013161603C3B2360D2 +:10A4A00063683B2B34DD0132A2603C3B6360A368F0 +:10A4B000172B33DDE2690132E261A2690132062A1B +:10A4C000C8BF0022A261E268183B0132A360236981 +:10A4D000E26055F823108A420EDD0B2BA2EB01023D +:10A4E000E26003F1010209BF6369226100220133C6 +:10A4F00002BF22616361E26100F022FF204602B0E8 +:10A50000BDE8F081002BCBDA013961603C33C6E74E +:10A51000002BCCDA013AA2603C33C7E7002BEBDA20 +:10A52000E269013AE261A269013A48BF0622A261EA +:10A53000E2681833013AE260A360002ADCD12369A3 +:10A54000013B05D42361236955F82330E360D3E749 +:10A550000B23236163695A1E626103F26B729307D6 +:10A5600005D1642192FBF1F301FB132363B94FF48E +:10A57000C87192FBF1F301FB1323B3FA83F35B0978 +:10A5800003F5B673E361DEE70123F9E72CDD01088B +:10A590000822002470477047704770477047704723 +:10A5A00070B50E46B1F90E10002996B014461D463E +:10A5B00007DA00232B60B3891A0610D44FF48063A6 +:10A5C0000EE06A4601F096F90028F2DB019A02F4E7 +:10A5D0007042A2F500535A425A412A60EEE74023E6 +:10A5E0000020236016B070BD8B8973B59D070646A9 +:10A5F0000C4607D504F147032360236101236361FF +:10A6000002B070BD01AB6A46FFF7CAFF009905466C +:10A610003046ECF7D9F848B9B4F90C309A05EFD4C4 +:10A6200023F0030343F00203A381E3E70D4BB3627E +:10A63000A389206043F08003A381009B6361019B99 +:10A6400020615BB1B4F90E10304601F05BFA28B11D +:10A65000A38923F0030343F00103A381A0890543E9 +:10A66000A581CDE7A59D0108024B01461868ECF7CE +:10A67000ABB800BF24030024024B01461868ECF776 +:10A68000A7B800BF24030024000000000000000061 +:10A6900001F0FF01102A2BDB10F0070F08D010F893 +:10A6A000013B013A8B422DD010F0070F42B3F6D197 +:10A6B000F0B441EA012141EA014122F007047FF0B0 +:10A6C00000070023F0E80256083C85EA010586EA07 +:10A6D000010685FA47F5A3FA87F586FA47F6A5FA43 +:10A6E00087F68EB9EED1F0BC01F0FF0102F007024F +:10A6F00032B110F8013B013A83EA010313B1F8D1FA +:10A700000020704701387047002D06BF35460338DA +:10A71000073815F0010F07D1013015F4807F02BF13 +:10A72000013015F4C03F0130F0BC0138704700BF64 +:10A7300030B501390024A24201D1002005E0035DBB +:10A7400001340D5DAB42F6D0581B30BD0A44914236 +:10A7500000F1FF3300D1704710B511F8014B03F839 +:10A76000014F9142F9D110BD02440346934200D1FA +:10A77000704703F8011BF9E737B5002948D051F8B5 +:10A78000043C0190002BA1F10404B8BFE418ECF7DD +:10A7900073FC204A01981368154633B9636014604E +:10A7A00003B0BDE83040ECF76BBCA3420BD9216885 +:10A7B0006218934204BF1A685B68636004BF521852 +:10A7C00022602C60ECE71A465B680BB1A342FAD911 +:10A7D00011685518A5420BD1246821445418A3428E +:10A7E0001160DDD11C685B68536021441160D7E7BC +:10A7F00002D90C230360D3E7256861198B4204BF9B +:10A8000019685B68636004BF491921605460C7E739 +:10A8100003B030BDE4210024F8B5CD1C25F00305BC +:10A8200008350C2D38BF0C25002D064601DBA9424A +:10A8300003D90C2333600020F8BDECF71DFC21493F +:10A840000A6814469CB9204F3B6823B9214630461C +:10A8500000F09CFA38602946304600F097FA431C15 +:10A8600023D10C2333603046ECF70AFCE3E723687E +:10A870005B1B17D40B2B03D923601C44256004E019 +:10A880006368A2420CBF0B6053603046ECF7F8FBE4 +:10A8900004F10B00231D20F00700C21ACCD01B1AB4 +:10A8A000A350C9E722466468CCE7C41C24F0030423 +:10A8B000A042E3D0211A304600F068FA0130DDD121 +:10A8C000CFE700BFE4210024E8210024F8B50746C3 +:10A8D00014460E4621B9BDE8F8401146EBF774BFA7 +:10A8E00022B9EBF775FF25462846F8BD01F02CF993 +:10A8F000A0420FD221463846EBF766FF05460028F6 +:10A90000F2D031462246FFF721FF31463846EBF7B9 +:10A910005FFFE9E73546E7E72DE9F84315468A6822 +:10A9200080460C4632B98A69002A0CBF01224FF0DA +:10A93000FF328A602268DFF88C90D1065FBF1A6808 +:10A94000111D196016680027A06988B1012807D178 +:10A950002B681A7863699B5C53B927BBBDE8F88301 +:10A96000022820D12B681B7813F809301B071AD452 +:10A970002368DA065EBF2B681B7806F8013B2A685D +:10A980006B6801322A60A268013B013A6B600137B3 +:10A99000A26042B1002BD7DCD4F880312946404672 +:10A9A00098470028D0D0236813F0100305D1E2683F +:10A9B0000132E260A26902B1337023691F4427614A +:10A9C0000020CBE7C6DB01082DE9F04F9846744B19 +:10A9D0000C468246164693E8070087B003AB83E82F +:10A9E0000700704BA169704A032918BF1A46A36873 +:10A9F00001925A1EB2F5AE7F88BF6FF4AE7527463E +:10AA000082BF03EB050940F25D13A36057F81C3BBE +:10AA100043F4506398BF4FF0000923603D464FF068 +:10AA2000000B316803AB097853F82B000222FFF7C3 +:10AA30002FFE28B3BBF1010F59D162682AB92268F1 +:10AA4000082342F4007263602260226822F4A0624C +:10AA50002260A268511EA16092B13268511C31601F +:10AA6000127805F8012B7268013A002A726007DC3F +:10AA7000D4F88021314650469047002840F0858028 +:10AA80000BF1010BBBF1030FCBD163680BB90A23A8 +:10AA90006360636845496069C91A00F087F94FF03F +:10AAA000000BA3682268002B3DD03168606991F8E3 +:10AAB00000C010F80C00002835D0BCF1300F24D1B4 +:10AAC000100522D50BF1010BB9F1000F03D00133B2 +:10AAD00009F1FF39A3607368013B002B73601BDD34 +:10AAE000336801333360A368013BA360D9E7BBF14E +:10AAF000020FAED1226802F4C061B1F5007FBFD170 +:10AB00001023636042F48072A2E722F41062226094 +:10AB10000B7805F8013BDEE7D4F88031314650462A +:10AB200098470028DFD02368D9050DD5BD4209D943 +:10AB300015F8011CD4F87C3132465046984705F18F +:10AB4000FF394D46BD4228D0226812F0100213D1C1 +:10AB50002A706368019E39465046B047D8F80030E5 +:10AB600021681A1DC8F8002011F0200F1B680FD0B3 +:10AB70001860E3680133E360ED1BAB4425695D4475 +:10AB80002561002007B0BDE8F08F4FF0000BCAE749 +:10AB9000CA074CBF18801860EBE70120F2E700BF3E +:10ABA000A8DD0108CDB10108D1B00108A5DD01087B +:10ABB00038B5074D04460846114600222A601A4659 +:10ABC000ECF7F0FC431C02D12B6803B1236038BDC5 +:10ABD000443F002470B50D461446064618B18369FB +:10ABE0000BB9FFF713F91C4B9C4224D17468636EB8 +:10ABF000D80705D4A389990502D4A06DFFF7CDFC31 +:10AC0000A368013B002BA36005DAA26993421CDB19 +:10AC1000EBB20A2B19D023685A1C22601D70EDB2CA +:10AC2000636EDA0705D4A3899B0502D4A06DFFF7F4 +:10AC3000B6FC284670BD094B9C4201D1B468D6E7EA +:10AC4000074B9C4208BFF468D1E7294622463046AC +:10AC500000F038FD0546E3E7E8DC010808DD0108FF +:10AC6000C8DC0108838903F00903092B01D1FFF730 +:10AC700063B8002070470000F8B50C46054618B1CF +:10AC800083690BB9FFF7C2F83B4B9C420AD16C6851 +:10AC9000B4F90C2000236360A3899E060CD54FF005 +:10ACA000FF3066E0354B9C4201D1AC68F0E7344B95 +:10ACB0009C4208BFEC68EBE7580748D4D90605D496 +:10ACC00009232B6042F04003A381E8E71A070BD564 +:10ACD00021462846FEF7F4FF0028E0D1A389A060B2 +:10ACE00023F00803A381A061A38943F00403A38197 +:10ACF00023691BB921462846FFF776FCA689B4F9DB +:10AD00000C70B3070FD00123A3811E4B1E49186896 +:10AD100006F00906FFF7D6FA092EA78103D12146CE +:10AD20002846FEF747FF2269666A6369216A226046 +:10AD30002846B047002860601CDCB4F90C3017BF0F +:10AD4000002243F02003626043F04003BCE7616BE4 +:10AD50000029CDD004F14403994202D02846EBF7F4 +:10AD600037FD236C636000206063002BC0D0E36B71 +:10AD70002360F8BD0020FCE7E8DC010808DD0108DD +:10AD8000C8DC010828DD010865AC010838B5064DAE +:10AD90000023044608462B60ECF754F9431C02D10B +:10ADA0002B6803B1236038BD443F002470B50B7895 +:10ADB00004465E2B0BBF4B78481C881C002208BF42 +:10ADC0000122611E04F1FF0501F8012FA942FBD108 +:10ADD0000BB9013870BD82F00101E154421C12F838 +:10ADE000015C2D2D02F1FF36104606D05D2DF1D00D +:10ADF0000DB93046EEE72B46EFE716785D2EFAD018 +:10AE0000B342F8DC1846013086422154FBDCD843BB +:10AE100030445D1CB342A8BF00202B180232DEE78D +:10AE20000EB410B59FB021AC4FF4017154F8042B4F +:10AE30000192ADF81C100490089000F092F80C4BB1 +:10AE4000059009900D930B48019A00680394002324 +:10AE5000119316934FF6FF73ADF81E3004A92346E5 +:10AE600000F0D4FE1FB0BDE8104003B0704700BF33 +:10AE70009BAE01082403002410B50C46B1F90E1056 +:10AE800001F03CF80028ABBF636DA3891B1823F4C5 +:10AE90008053ACBF6365A38110BD002070472DE9CE +:10AEA000F0411F468B89DB0505460C46164605D545 +:10AEB000B1F90E100223002200F034FEA389B4F988 +:10AEC0000E1023F48053A38132463B462846BDE84A +:10AED000F04100F049BC10B50C46B1F90E1000F07D +:10AEE00021FE431CA38915BF606523F4805343F4FE +:10AEF0008053A38118BFA38110BDB1F90E1000F0DB +:10AF0000B3BCC9B2034610F8012B1AB18A42F9D179 +:10AF100018467047002918BF0023F9E710F8012BE5 +:10AF200011F8013B012A28BF9A42F7D0D01A704786 +:10AF3000034611F8012B03F8012B002AF9D17047C1 +:10AF400070B503461E4613F8014B44B14A1E01E09A +:10AF5000A54204D012F8015F002DF9D1F2E7301AB2 +:10AF600070BD034613F8012B002AFBD1181A0138D3 +:10AF7000704710B56AB10139841810F8013B11F817 +:10AF8000012F934203D1A04201D0002BF5D1981A92 +:10AF900010BD1046FCE710B50139034632B111F877 +:10AFA000014F03F8014B013A002CF7D11A4400215C +:10AFB000934200D110BD03F8011BF9E770B50346B9 +:10AFC0001E4613F8014B3CB14A1E01E0A542F7D0E2 +:10AFD00012F8015F002DF9D1301A70BD2DE9F0474C +:10AFE0003A4E86468C4660461CF8014BA55D15F02E +:10AFF0000805F8D12D2C33D19CF800404FF0010802 +:10B0000000F1020C002B5CD0102B0CD1302C0AD19B +:10B010009CF8000000F0DF0058284DD19CF801405A +:10B0200010230CF1020C08F10047013F0026B7FB8A +:10B03000F3F9304603FB197AA4F13005092D18D82D +:10B040002C46A34224DD751C07D081451DD301D1B8 +:10B05000A2451ADB00FB034001261CF8014BEBE77D +:10B060002B2C08BF9CF80040A84608BF00F1020C3A +:10B07000C8E7A4F14105192D01D8373CE1E7A4F157 +:10B080006105192D04D8573CDBE74FF0FF36E4E7A4 +:10B09000731C06D12223CEF80030384642B9BDE8F1 +:10B0A000F087B8F1000F00D04042002AF7D00EB16F +:10B0B0000CF1FF311160F2E73024002BB3D10823EB +:10B0C000B1E7302CA4D00A23ADE700BFC6DB0108EE +:10B0D000FFF784BF2DE9F0433B4E86468C46604621 +:10B0E0001CF8014BA55D15F00805F8D12D2C34D1C5 +:10B0F0009CF800404FF0010800F1020C002B5ED0DC +:10B10000102B0CD1302C0AD19CF8000000F0DF008D +:10B1100058284FD19CF8014010230CF1020C4FF03D +:10B12000FF370025B7FBF3F703FB07F96FEA0909BF +:10B130002846A4F13006092E18D83446A34224DD4F +:10B14000002D1FDB87421DD301D1A1451ADB00FB77 +:10B15000034001251CF8014BEBE72B2C08BF9CF8A2 +:10B160000040A84608BF00F1020CC7E7A4F1410661 +:10B17000192E01D8373CE1E7A4F16106192E04D855 +:10B18000573CDBE74FF0FF35E4E7002D07DA2223D9 +:10B19000CEF800304FF0FF3042B9BDE8F083B8F18F +:10B1A000000F00D04042002AF7D00DB10CF1FF3162 +:10B1B0001160F2E73024002BB1D10823AFE7302C27 +:10B1C000A2D00A23ABE700BFC6DB0108FFF782BFAE +:10B1D00013460A46014602480068FFF77BBF00BFDE +:10B1E000240300242DE9F74F804600F0D7FB40F2FE +:10B1F000B173984540F398806FF4F66343449B1015 +:10B2000040F26D12A8F2B27502FB05356FF06302D1 +:10B21000A8F26D7393FBF2F31D444FF4C8736FF4FF +:10B22000C86298FBF3F703FB17874244B7FA87FC21 +:10B23000B2FBF3F208F0030315446422C0F8048063 +:10B2400098FBF2F64FEA5C1C02FB1686044600F1FE +:10B25000500B00934FF0070E227A63694A2A28D1D7 +:10B260000099EA1801B906B90FBB3B2BD4BF0023E4 +:10B27000012313445A1EA3692C4901FB0232A36A1D +:10B2800013441A46DB17C4E908232834A345E3D145 +:10B29000D0E90845D0E91223944275EB0303B4BF0B +:10B2A000012300230360012003B0BDE8F08F0023D9 +:10B2B000DFE7442A01D1EA18DDE7009A72BB002ECD +:10B2C0000CBFE0464FF001081949E26801924FF0C7 +:10B2D000300A0AFB08182A464FF00009A8F10408B2 +:10B2E000019909F10109494558F829A018DC02F132 +:10B2F000040898FBFEF9C9EBC909A8EB0909B3EBEF +:10B300000909236903F1FF3348BF09F10709C3EBBA +:10B31000C3034B44534505DA1A44ACE7E046D3E790 +:10B320005244DDE7073BF5E70020BDE7805101000F +:10B330002CDD01080148FFF72FB900BF3E3F002474 +:10B340000148FFF72BB900BF3E3F0024014B1868AE +:10B3500000F002B8240300242DE9F04F8DB0074619 +:10B3600000F01CFBAE49AF4E0546384600F00EFB20 +:10B37000044670B9AC4BAD4A1860AD4B1860AD4B8C +:10B380003068C3E90022FFF777F934600DB0BDE8FB +:10B39000F08F316800295FD13068FFF76DF92046E2 +:10B3A000FFF7DFFD411C3846EBF70EFA306000284E +:10B3B00057D12378A04AA1493A2B08BF01340AAEDD +:10B3C00033462046FFF72CFD0028DFDD0A9BE718F7 +:10B3D000E35C2D2B49D101374FF0FF340DF1200AEA +:10B3E0000DF11E0B4FF00008CDE9016A9449039658 +:10B3F000CDF800B0334607AA3846ADF81E80ADF848 +:10B400002080FFF70DFD4045C0DDBDF81E30BDF8C2 +:10B410002020DFF838923C2101FB0322BDF81C30CC +:10B420004FF4616101FB03235C43AC62814C824BAE +:10B4300023600A9B81491F444A4633463846FFF73A +:10B44000EFFC404516DC23686360774BAA6A1A60FC +:10B45000774BC3F8008099E7FFF760FD00289BD188 +:10B4600094E72146FFF764FDA3E72B2B08BF0137C4 +:10B470000124B3E70A9BC4F80490FC18FB5C2D2B55 +:10B4800040F08B8001344FF0FF370023ADF81C30C3 +:10B49000ADF81E30ADF820300A93CDE902A6CDE913 +:10B4A00000B66749334607AA2046FFF7B9FC0028D3 +:10B4B00078DCAF6AA7F561670A9B2F651C442F46AD +:10B4C0004FF0000923782C2B08BF013494F800803A +:10B4D000B8F14D0F78D10DF12603CDE9016309AB29 +:10B4E00000935849039633460DF122022046FFF798 +:10B4F00097FC03287FF44AAFBDF822104B1E0B2B9C +:10B500003FF644AFBDF82420531E042B3FF63EAF58 +:10B51000BDF82630062B3FF639AFC7E9031287F88E +:10B5200008807B610A9B04EB03080223ADF81C3002 +:10B530000023ADF81E30ADF820300A9398F80030A3 +:10B540002F2B09D1CDE902A6CDE900B63E493346FD +:10B5500007AA4046FFF764FCBDF81E30BDF8202066 +:10B560003C2101FB0322BDF81C304FF4616101FB5B +:10B570000323BB610A9C28374444B9F1000F20D053 +:10B580006868FFF72FFE284BAA6A1A602B6D9B1A7A +:10B59000274A18BF01231360F8E62B2B08BF01349C +:10B5A000012772E7BDF81E30BDF820203C2101FBC9 +:10B5B0000322BDF81C304FF4616101FB03235F439C +:10B5C0007AE74FF001097DE7B8F14A0F06BF013471 +:10B5D000434644230A220BA920460593FFF7F8FDB2 +:10B5E000DDF82C80059BADF82600A04514D14D2335 +:10B5F000B9F1000F07D12B7203210223C5E9031310 +:10B60000C5F8149091E785F830300B220123C5E985 +:10B610000D230023EB6388E780B23B72786184E7F7 +:10B62000B4DD0108042200240C220024B7DD010847 +:10B630000822002488030024F7210024BBDD010830 +:10B64000DEDD0108CADD0108DDDD0108EC21002492 +:10B650002DE9F0410C46496B04F1440399421DD198 +:10B660004FF48061EBF7B0F818B94FF0FF30BDE848 +:10B67000F0814FF48063A36394F84630606380F8F0 +:10B68000FF3394F8453080F8FE3394F8443080F866 +:10B69000FD3300F2FD3020600020E8E7A66B770064 +:10B6A0003A46EBF793F805460028DED000EB060893 +:10B6B000014632464046FFF749F8C4E90D57C4F841 +:10B6C0000080E9E7F8B50E461446054618B18369CF +:10B6D0000BB9FEF79BFB214B9C422BD16C68A369F5 +:10B6E000A360A3891A072FD523696BB32369206848 +:10B6F000C01A6369F6B28342374604DC2146284605 +:10B70000FEF7DEFA30BBA368013BA36023685A1C36 +:10B7100022601E7063690130834204D0A389DB0775 +:10B7200006D50A2E04D121462846FEF7C9FA88B963 +:10B730003846F8BD0A4B9C4201D1AC68CFE7094BB3 +:10B740009C4208BFEC68CAE72146284600F01EF874 +:10B750000028CBD04FF0FF37EAE700BFE8DC010854 +:10B7600008DD0108C8DC010838B5074D0446084665 +:10B77000114600222A601A46EBF75CFD431C02D1F9 +:10B780002B6803B1236038BD443F0024324B70B5B1 +:10B790001D6806460C4625B1AB6913B92846FEF76D +:10B7A00035FB2E4B9C420FD16C68A389B4F90C2059 +:10B7B00019072CD4DD0611D40923336042F040036D +:10B7C000A3814FF0FF303EE0254B9C4201D1AC6895 +:10B7D000EBE7244B9C4208BFEC68E6E7580712D51C +:10B7E000616B41B104F14403994202D03046EAF75B +:10B7F000EFFF00236363A38923F02403A3810023C5 +:10B80000636023692360A38943F00803A38123694C +:10B810004BB9A38903F42073B3F5007F03D021460D +:10B820003046FEF7E1FEA089B4F90C2010F00103C8 +:10B830000AD00023A36063695B42A361236943B913 +:10B8400010F08000BAD170BD810758BF6369A36052 +:10B85000F4E70020F7E700BF24030024E8DC010838 +:10B8600008DD0108C8DC010838B5064D0023044690 +:10B8700008462B60EBF790FC431C02D12B6803B108 +:10B88000236038BD443F00240B78722B30B522D0A2 +:10B89000772B24D0612B27D016230360002030BDE6 +:10B8A000622D12D0782D13D02B2D07D120F01C0043 +:10B8B00023F0030340F0100043F0020311F8015F8E +:10B8C000002DEDD123431360E9E743F48033F5E71E +:10B8D00043F40063F2E7002423460420EEE74FF42C +:10B8E000C06401230820E9E74FF4027401234FF4F8 +:10B8F0008470E3E738B5074D002304460846114637 +:10B900002B60EBF794FD431C02D12B6803B123603D +:10B9100038BD00BF443F00242DE9F84F0746894653 +:10B920001646EBF7B1FB184B1C689A4634B14B46F0 +:10B93000984613F8011B39B13D29F9D13846EBF788 +:10B94000A7FB0020BDE8F88FA8EB0908A34654F830 +:10B95000040B0028F2D042464946FFF70AFB0028B4 +:10B96000F4D154F8043C03EB080513F808303D2BE0 +:10B97000ECD1DAF80030ABEB03039B1038463360B0 +:10B98000EBF786FB681CDDE7E803002407B501AA96 +:10B99000FFF7C2FF03B05DF804FB000000487047EA +:10B9A000900300242DE9F041D0E900670C46514A8C +:10B9B00000233046394600F0B3FA394605464D4A71 +:10B9C0003046002300F0ACFA002ABCBF02F5A832D2 +:10B9D00002F5C0724FF4616105F52F20B2FBF1F35F +:10B9E00001FB13224FF03C01ACBF00F66C2000F6C7 +:10B9F0006B20A360B2FBF1F301FB132263602260B2 +:10BA0000C31C072293FBF2F2C2EBC2029B1A48BF8F +:10BA100007330028A361B8BFA0F50E333649AEBF87 +:10BA200090FBF1F1A3F52C7393FBF1F1334B03FB86 +:10BA3000010048F6AC62B0FBF2F2024440F2B45CA2 +:10BA4000B0FBFCF3D21A40F26D172D4BB0FBF3F3B1 +:10BA50006426D31AB3FBF7F5B3FBFCF3B5FBF6F2A0 +:10BA6000D31A034407FB1533992003EB830C0CF125 +:10BA7000020C03F1010EBCFBF0F7784302304FF0EB +:10BA80000508B0FBF8F0AEEB000040F2F95EF445BB +:10BA900094BF4FF0020C6FF0090C67444FF4C87C60 +:10BAA0000CFB0151012F98BF0131B3F5997F0CD3E5 +:10BAB000A3F59973E361A1F26C710023E060C4E91E +:10BAC000047123622046BDE8F08115F0030F02D116 +:10BAD00006FB12525AB94FF4C876B5FBF6F206FBD4 +:10BAE0001252B2FA82F252093B331344E2E70122C6 +:10BAF000FAE700BF80510100B13A02004FC5FDFFD7 +:10BB0000B03A020038B5064D0023044608462B60C3 +:10BB1000EBF7E8FB431C02D12B6803B1236038BD6F +:10BB2000443F002438B5074D04460846114600221C +:10BB30002A601A46EBF729FC431C02D12B6803B19B +:10BB4000236038BD443F002451F8043C181F002BEB +:10BB5000BCBF0B58C018704738B54B1C144603D1F6 +:10BB60004FF0FF35284638BD938923F02003938199 +:10BB7000636B5268CDB28BB1A36B934208DD23682F +:10BB80005A1E226003F8015C636801336360E9E7D1 +:10BB90002146FFF75DFD0028F1D0E1E72169236828 +:10BBA00051B1994208D213F8011CA94204D1013BBA +:10BBB000013223606260D5E7C4E90F3204F1440327 +:10BBC00063630323A363234603F8465F23600123D3 +:10BBD000DCE710B50C46496B69B104F144039942A6 +:10BBE00001D0EAF7F5FD236C63600020606313B1B8 +:10BBF000E36B236010BD2369236000236360A38986 +:10BC000043F02003A3814FF0FF30F3E72DE9F04F1D +:10BC10000C46ADF5237D0021CDE94411B249A09138 +:10BC20000DF10408B149B24FDFF8C892CDF8188180 +:10BC30000646A191009392F800A0BAF1000F00F01F +:10BC400051811AF8073013F0080302F1010519D0E9 +:10BC50006368002B0FDD23681A78BA5C120701D4E1 +:10BC60002A46E8E7459A0132459262680133013A73 +:10BC700062602360ECE7A19B21463046984700288C +:10BC8000E9D0EDE7BAF1250F40F08380419343936B +:10BC900053782A2B02BF1023951C41930A22AB46EE +:10BCA0001BF8011BA1F13003092B1DD99148032278 +:10BCB000FEF7EEFC40B10123A0EB090003FA00F00F +:10BCC000419B184341905D4615F8013B782B06D8FF +:10BCD000572B10D8252B5CD056D8002B74D00323BB +:10BCE00047930A23429381E0439B02FB0313303BBB +:10BCF00043935D46D3E7A3F15802202AEFD801A170 +:10BD000051F822F0D7BD0108DFBC0108DFBC0108F3 +:10BD100035BE0108DFBC0108DFBC0108DFBC01083B +:10BD2000DFBC0108DFBC0108DFBC0108DFBC010883 +:10BD30004BBE010821BE01088FBD01088FBD01085F +:10BD40008FBD0108DFBC010825BE0108DFBC01086A +:10BD5000DFBC0108DFBC0108DFBC01085BBE0108D5 +:10BD60002DBE0108CFBD0108DFBC0108DFBC010802 +:10BD700057BE0108DFBC010821BE0108DFBC010875 +:10BD8000DFBC0108D7BD0108453B022BA7D805231E +:10BD90002BE06368002B0DDD23681A78524540F0D4 +:10BDA000A180013362682360459B013A01336260E0 +:10BDB000459355E7A19B2146304698470028EBD094 +:10BDC0004498002840F084804FF0FF3086E0419A8C +:10BDD00042F020024192419A42F4007241921022B4 +:10BDE0006F2B429234BF0323042347936368002BD5 +:10BDF00041DD419B590604D423681A78BA5C1207C6 +:10BE000040D4479B022B4FDC6B46224641A930466B +:10BE1000FEF782FD012865D002287FF421AFCFE72D +:10BE20000A22DDE7002342930323DEE7082342933F +:10BE30000423DAE729464046FEF7B8FF419B43F06A +:10BE40004003419305460123CFE7419B43F0400364 +:10BE500041930023C9E70223C7E74198C3063FF592 +:10BE6000FFAE009B459A191D00911B68C0074CBF8F +:10BE70001A801A60F4E6A19B2146304698470028B4 +:10BE8000B7D09DE7459A013245926268013A002A8F +:10BE9000626002DD01332360AEE7A19B214630469C +:10BEA00098470028A8D08BE7042B06DC6B46224677 +:10BEB00041A93046FEF788FDACE70F4B002B3FF45D +:10BEC000CFAE6B46224641A93046AFF30080A1E7D2 +:10BED000A38913F0400F18BF4FF0FF300DF5237DFD +:10BEE000BDE8F08F4498F9E759BB0108D3BB0108BE +:10BEF000C6DB0108F0DD01080000000038B5074D81 +:10BF000004460846114600222A601A46EBF7ECF96F +:10BF1000431C02D12B6803B1236038BD443F002489 +:10BF20007BB972B90029BEBF00204FF0004106E086 +:10BF300008BF00281CBF6FF000414FF0FF3000F039 +:10BF4000CDB9ADF1080C6DE904CE002909DB002B59 +:10BF50001ADB00F061F8DDF804E0DDE9022304B04B +:10BF60007047404261EB4101002B1BDB00F054F8AD +:10BF7000DDF804E0DDE9022304B0404261EB410159 +:10BF8000524263EB43037047524263EB430300F0BA +:10BF900043F8DDF804E0DDE9022304B0404261EB40 +:10BFA00041017047524263EB430300F035F8DDF87E +:10BFB00004E0DDE9022304B0524263EB430370471F +:10BFC00053B94AB9002908BF00281CBF4FF0FF3100 +:10BFD0004FF0FF3000F082B9ADF1080C6DE904CEEE +:10BFE00000F01AF8DDF804E0DDE9022304B0704740 +:10BFF000430803F05533C01A830803F0333300F0CD +:10C000003330184400EB101000F00F3000EB00202C +:10C0100000EB0040000E70472DE9F047089D0446F4 +:10C020008C46002B40F083808A42174647D9B2FAEB +:10C0300082F242B1C2F1200024FA00F09140974010 +:10C0400040EA010C94404FEA1748230CBCFBF8F679 +:10C050001FFA87FE08FB16C143EA014306FB0EF1F7 +:10C06000994209D9FB1806F1FF3080F019819942F5 +:10C0700040F21681023E3B445B1AA4B2B3FBF8F0D7 +:10C0800008FB103344EA034400FB0EFEA64509D921 +:10C090003C1900F1FF3380F00581A64540F2028192 +:10C0A00002383C4440EA0640A4EB0E0400261DB1D1 +:10C0B000D4400023C5E900433146BDE8F08702B90A +:10C0C000FFDEB2FA82F2002A50D1CB1B4FEA174EA4 +:10C0D0001FFA87F80126B3FBFEFC210C0EFB1C3374 +:10C0E00041EA034108FB0CF38B4207D979180CF1A4 +:10C0F000FF3002D28B4200F2E9808446C91AA3B213 +:10C10000B1FBFEF00EFB101143EA014408FB00F8FE +:10C11000A04507D93C1900F1FF3302D2A04500F237 +:10C12000D9801846A4EB080440EA0C40BFE78B42D4 +:10C1300009D9002D00F0B1800026C5E90001304684 +:10C140003146BDE8F087B3FA83F6002E4AD18B4220 +:10C1500002D3824200F2B880841A61EB030101200D +:10C160008C46002DA8D0C5E9004CA5E7C2F12003FC +:10C1700020FA03F6974001FA02F04FEA174ED94031 +:10C180003043030CB1FBFEF61FFA87F80EFB1611C5 +:10C1900043EA014306FB08F1994204FA02F409D983 +:10C1A000FB1806F1FF3C80F08D80994240F28A80B6 +:10C1B000023E3B445B1A81B2B3FBFEF00EFB103330 +:10C1C00041EA034100FB08F38B4207D9791800F1DB +:10C1D000FF3C73D28B4271D902383944CB1A40EA02 +:10C1E000064678E7C6F1200C03FA06F422FA0CF3AF +:10C1F0001C4320FA0CF701FA06F34FEA144E21FA19 +:10C200000CF11F433B0CB1FBFEF91FFA84F80EFB47 +:10C21000191143EA014109FB08FA8A4502FA06F2BC +:10C2200000FA06F308D9611809F1FF3048D28A45AF +:10C2300046D9A9F102092144A1EB0A01BFB2B1FB21 +:10C24000FEF00EFB101147EA014700FB08F8B84565 +:10C2500007D9E71900F1FF312ED2B8452CD90238A1 +:10C26000274440EA0940A7EB0807A0FB02894F4595 +:10C27000C64649461AD317D05DB1B3EB0E0267EB41 +:10C28000010707FA0CFCF2404CEA0202F740C5E94C +:10C29000002700263146BDE8F0872E4628460BE7EA +:10C2A0000646E9E61846FDE64345E5D2B8EB020E40 +:10C2B00069EB04010138DFE70846D2E760468DE705 +:10C2C0008146B9E7664675E730464AE7ACF1020CAD +:10C2D000394413E702383C4424E700BF704700BFED +:10C2E000F8B500BFF8BC08BC9E467047F8B500BF63 +:10C2F000F8BC08BC9E46704753444341524400007A +:10C300000000000000000000D9050008FD0500083D +:10C3100089080008A9050008590500081106000849 +:10C32000A5060008390700085D0500086D0500082E +:10C330007305000879050008610500086705000815 +:10C340007F050008C1070008F5080008210800085B +:10C35000950500089D050008A30500087262002FDE +:10C3600066732F5550444154452E42494E00417248 +:10C370006475696E6F205341004E69636C6120568D +:10C380006973696F6E20426F6F746C6F6164657260 +:10C390000044465520436F6E666967004446552049 +:10C3A000496E746572666163650040426F6F746CBC +:10C3B0006F616465722076657273696F6E202564A3 +:10C3C000202F307830303030303030302F302A3439 +:10C3D0004B670040496E7465726E616C20466C61FB +:10C3E00073682020202F30783038303030303030B3 +:10C3F0002F30312A3132384B612C31352A313238E5 +:10C400004B67004045787465726E616C20466C61C4 +:10C4100073682020202F3078393030303030303081 +:10C420002F343039362A344B670052545820563551 +:10C430002E352E33007274785F74696D65720072E8 +:10C4400074785F69646C6500000000000000000003 +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800001000000E803000005000000180C002473 +:10C49000100000000000000000000000000000008C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D0000000000000100000F4C4010830C501088D +:10C4E000894500086945000818C5010804000000D6 +:10C4F000000000003FC4010800000000200D0024DF +:10C5000044000000680D002400030000010000004A +:10C51000010000000000000000000000000000001A +:10C52000580C0024340000008C0C00245000000043 +:10C5300035C4010800000000DC0C002444000000A9 +:10C540006810002400030000280000000100000023 +:10C55000000000006D616C6C6F635F6D75746578D1 +:10C5600000656E765F6D757465780073696E676CD3 +:10C5700065746F6E5F6D75746578006D61696E00CE +:10C580006BC501080B000000C43700241C0000002C +:10C5900000000000000000006F4D0008554D00082D +:10C5A000F54C00080D4D0008000000006410B71D98 +:10C5B000C8206E3BAC30D9269041DC76F4516B6BD1 +:10C5C0005861B24D3C7105502083B8ED44930FF093 +:10C5D000E8A3D6D68CB361CBB0C2649BD4D2D38649 +:10C5E00078E20AA01CF2BDBD0102040000000000B8 +:10C5F00000000000F54F000819500008BD4F00086A +:10C60000D94F000800000000000000004D53000852 +:10C6100000000000000000004D5300080000000072 +:10C620000000000055540008000000000000000059 +:10C630003B700008657175657565000044C60108AA +:10C64000A8140024A9840108F98301083D84010885 +:10C6500051860108798601080984010819880108B2 +:10C66000D98301080100000070C60108E01400240D +:10C67000C59A0108DD9A0108259B0108399B01082C +:10C68000E99A0108059B010815600008E99901086D +:10C690000000000064656661756C740000000000B5 +:10C6A0000000000089610008ED6100082F00000013 +:10C6B000000000000000000000000000000000007A +:10C6C0003B7000080B630008116300080B6300084F +:10C6D0000B630008176300080B63000800000000EC +:10C6E00000000000716500080A52252D34643A20CC +:10C6F0002530386C58000A53502020203A2025302D +:10C70000386C580A4C522020203A202530386C587A +:10C710000A50432020203A202530386C580A78509F +:10C720005352203A202530386C580A50535020205C +:10C730003A202530386C580A4D535020203A202595 +:10C7400030386C58000A43505549443A2025303857 +:10C750006C58000A48465352203A202530386C580D +:10C760000A4D4D4653523A202530386C580A4246FD +:10C770005352203A202530386C580A5546535220DF +:10C780003A202530386C580A44465352203A202526 +:10C7900030386C580A41465352203A202530386CC4 +:10C7A00058000A4D4D4641523A202530386C580009 +:10C7B0000A42464152203A202530386C58000A4D32 +:10C7C0006F6465203A20546872656164000A507293 +:10C7D0006976203A2055736572000A507269762096 +:10C7E0003A2050726976696C65676564000A4D6F1E +:10C7F0006465203A2048616E646C6572000A537467 +:10C8000061636B3A20505350000A537461636B3A72 +:10C81000204D5350000A2B2B204D6265644F53204E +:10C820004661756C742048616E646C6572202B2BB8 +:10C830000A0A4661756C74547970653A20004D653A +:10C840006D4D616E6167654661756C74004275730C +:10C850004661756C740055736167654661756C74EB +:10C8600000486172644661756C74000A0A436F6E19 +:10C87000746578743A000A0A2D2D204D6265644F64 +:10C8800053204661756C742048616E646C6572203B +:10C890002D2D0A0A004661756C74206578636570F9 +:10C8A00074696F6E002E2E2E0A000000000000003A +:10C8B00080DE280080C84D0000A7760000349E006E +:10C8C0008012C700809FEE00007E1701805C40014F +:10C8D00080E9670100C890010055B8010000000020 +:10C8E00080DE2800001A4F0080F8770080859F00C6 +:10C8F0000064C80000F1EF0080CF180100AE4101D4 +:10C90000003B69018019920180A6B9010D00000069 +:10C910000000000000000000176F0008916F000881 +:10C920009D6F00083D6F0008036F0008136F00083B +:10C930000D5500080F6F0008654900086F49000891 +:10C94000096F000879490008115500081D550008B5 +:10C950002D55000833550008616F00082155000867 +:10C96000FFFFFFFF09010000FFFFFFFF0A010000BA +:10C97000FFFFFFFF000000002F73746465727200F8 +:10C980002F737464696E002F7374646F7574003054 +:10C990003132333435363738396162636465663035 +:10C9A00031323334353637383941424344454661B4 +:10C9B00070706C69636174696F6E5F756E6E616DC6 +:10C9C00065645F6D75746578006170706C69636132 +:10C9D00074696F6E5F756E6E616D65645F746872A9 +:10C9E000656164000000000000000000DD7E0008BA +:10C9F000157F0008464C4153484941500000000053 +:10CA00000000000000000000F58100080982000815 +:10CA1000F1800008CB81000859050008E57F000877 +:10CA2000218000085D8000085D050008297F00085E +:10CA300093800008BF800008D7800008A980000804 +:10CA40002F7F0008C1070008F50800083D7F000897 +:10CA5000357F000851535049460000000000000097 +:10CA60000000000000000000712500089525000866 +:10CA70001D920008DD94000859050008DF860008B3 +:10CA80007D8700084D8800085D0500085982000870 +:10CA9000598200085F8200085583000877820008E9 +:10CAA00071820008C1070008F50800082108000885 +:10CAB0006982000800000000000000008595000861 +:10CAC000D19600086D9700084397000889950008E3 +:10CAD0009D950008F1950008459600085D05000841 +:10CAE000DF960008F3960008079700081B970008D8 +:10CAF0008B9600089F960008C1070008F5080008FB +:10CB000021080008C5960008A5960008AB96000805 +:10CB1000BD960008C196000853464450002A3A3C8E +:10CB20003E7C223F7F002B2C3B3D5B5D00EBFE906B +:10CB30004D53444F53352E30004E4F204E414D45FE +:10CB4000202020204641543332202020004E4F2008 +:10CB50004E414D45202020204641542020202020B9 +:10CB600000809A45418E418F804545454949498E0F +:10CB70008F9092924F994F555559999A9B9C9D9E93 +:10CB80009F41494F55A5A5A6A7A8A9AAABACADAE94 +:10CB9000AFB0B1B2B3B4B5B6B7B8B9BABBBCBDBE2D +:10CBA000BFC0C1C2C3C4C5C6C7C8C9CACBCCCDCE1D +:10CBB000CFD0D1D2D3D4D5D6D7D8D9DADBDCDDDE0D +:10CBC000DFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEFD +:10CBD000EFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEED +:10CBE000FF01030507090E10121416181C1E010080 +:10CBF00004001000400000010002000001000200DB +:10CC000004000800100020000000000007000000E1 +:10CC1000000000000000000000000000C700FC0051 +:10CC2000E900E200E400E000E500E700EA00EB00D4 +:10CC3000E800EF00EE00EC00C400C500C900E6000B +:10CC4000C600F400F600F200FB00F900FF00D60079 +:10CC5000DC00A200A300A500A7209201E100ED00E6 +:10CC6000F300FA00F100D100AA00BA00BF001023BF +:10CC7000AC00BD00BC00A100AB00BB00912592251B +:10CC800093250225242561256225562555256325F2 +:10CC9000512557255D255C255B2510251425342558 +:10CCA0002C251C2500253C255E255F255A2554256D +:10CCB00069256625602550256C256725682564252E +:10CCC000652559255825522553256B256A25182594 +:10CCD0000C25882584258C2590258025B103DF002F +:10CCE0009303C003A303C303B500C403A6039803BF +:10CCF000A903B4031E22C603B50329226122B10091 +:10CD00006522642220232123F7004822B000192243 +:10CD1000B7001A227F20B200A025A00061001A03EC +:10CD2000E0001703F8000703FF000100780100018D +:10CD3000300132010601390110014A012E01790149 +:10CD4000060180014D0043028101820182018401BC +:10CD5000840186018701870189018A018B018B018A +:10CD60008D018E018F019001910191019301940138 +:10CD7000F60196019701980198013D029B019C01E3 +:10CD80009D0120029F01A001A001A201A201A40116 +:10CD9000A401A601A701A701A901AA01AB01AC0149 +:10CDA000AC01AE01AF01AF01B101B201B301B301FA +:10CDB000B501B501B701B801B801BA01BB01BC01A9 +:10CDC000BC01BE01F701C001C101C201C301C40120 +:10CDD000C501C401C701C801C701CA01CB01CA010D +:10CDE000CD011001DD0101008E01DE011201F30110 +:10CDF0000300F101F401F401F801280122021201FB +:10CE00003A020900652C3B023B023D02662C3F02C0 +:10CE100040024102410246020A01530240008101E0 +:10CE20008601550289018A0158028F015A02900138 +:10CE30005C025D025E025F02930161026202940184 +:10CE40006402650266026702970196016A02622C1B +:10CE50006C026D026E029C01700271029D017302F0 +:10CE600074029F0176027702780279027A027B02CD +:10CE70007C02642C7E027F02A60181028202A9014B +:10CE80008402850286028702AE014402B101B2012A +:10CE900045028D028E028F0290029102B7017B0340 +:10CEA0000300FD03FE03FF03AC03040086038803B5 +:10CEB00089038A03B1031103C2030200A303A3037E +:10CEC000C4030803CC0303008C038E038F03D80331 +:10CED0001801F2030A00F903F303F403F503F60360 +:10CEE000F703F703F903FA03FA03300420035004AD +:10CEF0001007600422018A043601C1040E01CF0428 +:10CF00000100C004D00444016105260400007D1D19 +:10CF10000100632C001E9601A01E5A01001F080686 +:10CF2000101F0606201F0806301F0806401F0606B1 +:10CF3000511F0700591F521F5B1F541F5D1F561FB3 +:10CF40005F1F601F0806701F0E00BA1FBB1FC81F9F +:10CF5000C91FCA1FCB1FDA1FDB1FF81FF91FEA1FEB +:10CF6000EB1FFA1FFB1F801F0806901F0806A01F5B +:10CF70000806B01F0400B81FB91FB21FBC1FCC1F8A +:10CF80000100C31FD01F0206E01F0206E51F0100BB +:10CF9000EC1FF31F0100FC1F4E2101003221702104 +:10CFA0001002842101008321D0241A05302C2F0483 +:10CFB000602C0201672C0601752C0201802C640193 +:10CFC000002D260841FF1A030000000000000000A9 +:10CFD0000000000000000000000000003B7000089E +:10CFE0000B630008116300080B6300080B63000863 +:10CFF000176300080B630008FCFFFFFF0000000040 +:10D00000000000000000000000FBFFFBFEECEAF364 +:10D01000EFF7F3EDEDEAFB8CF0F4E9EA0000000035 +:10D020000000000019CC000845CC000829FD0008CC +:10D0300091FD00085FCE0008A7CE000837CF00089A +:10D04000F9CE000815C800083DC700089DC70008B4 +:10D0500005C70008BBCF000885C80008B7C800088E +:10D06000F5C8000833C9000837FC00085BC9000890 +:10D0700047C700084DFC000863C70008A1C90008A5 +:10D080004BD00008FDC9000899CA00082FCA000843 +:10D090007FC7000877CA0008A9FC00083DD2000835 +:10D0A000A5D00008B9D00008F9CA0008FCFFFFFFAE +:10D0B000000000003DCC000859CC00082E2E006C6A +:10D0C0006974746C65667300000000000000000065 +:10D0D00019F800084DF8000829FD000891FD000826 +:10D0E00049F3000877F30008D7F30008A9F3000814 +:10D0F00029F4000815F2000801F30008D1F900082E +:10D1000085F4000829F500085FF5000897F5000888 +:10D11000CFF5000837FC0008FDF5000835F60008DB +:10D120004DFC000863F6000891F60008C3F60008FD +:10D130000BF7000841F7000899F70008C3F700084B +:10D14000F1F70008A9FC0008FCFFFFFF0000000049 +:10D1500045F8000861F80008000000000000000029 +:10D1600079FA0008CBFA0008DFFA00085DFA000837 +:10D1700091FA0008A7FA0008B3FA0008BFFA0008FD +:10D180003BFA0008000000000000000055FB00080A +:10D1900001FC00086DFB000883FB0008B1FB0008E0 +:10D1A00037FB000899FB0008A5FB0008C7FB000837 +:10D1B000D3FB0008DFFB0008EBFB0008115500085B +:10D1C0001D5500082D550008335500083955000835 +:10D1D0002155000815FB00080000000000000000B9 +:10D1E00001FD000815FD00086DFB000883FB000829 +:10D1F000B1FB0008F5FD000899FB0008A5FB00083D +:10D20000C7FB0008D3FB0008DFFB0008EBFB0008AE +:10D21000115500081D5500082D550008335500080C +:10D22000395500082155000815FB000800000000D2 +:10D230000000000069FD00087DFD0008DFFA00081D +:10D240000BFE000891FA0008A7FA0008B3FA0008DC +:10D25000BFFA00083BFA00080000000000000000D0 +:10D26000000000000000000029FD000891FD0008FA +:10D2700025FC00082BFC00082BFC000831FC0008F2 +:10D280002BFC00083B7000083B70000825FC0008E0 +:10D290003B7000083B7000083B7000083B700008C2 +:10D2A00037FC000837FC00083B7000083BFC000816 +:10D2B0004DFC00085FFC000895FC00082BFC0008F2 +:10D2C00025FC00082BFC00089BFC00089DFC0008C6 +:10D2D000A1FC0008A9FC0008FCFFFFFF0000000003 +:10D2E00000000000000000000180808080808080BD +:10D2F0000480808080808080088080808080808022 +:10D3000010808080808080802080808080808080ED +:10D3100040000408102040020408102040000100D2 +:10D3200002000400060008000A000C0010002000A3 +:10D33000400080000001000000000102030401021F +:10D34000030406070809000008000000005C004014 +:10D35000CA1300001600000000540040CA13000069 +:10D3600016010000001C0058CA1B00001800000035 +:10D3700000540040CA13000018010000001C0058AF +:10D38000CA1B00001A00000000580040CA13000029 +:10D390003C000000001C0058CA13000051000000AF +:10D3A00000580040CA1300005E000000001C005836 +:10D3B000CA1300007400000000580040CA130000A7 +:10D3C00077000000005C0040CA1300007B000000F2 +:10D3D000001C0058CA130000FFFF0000FFFFFFFF02 +:10D3E000000000001700000000540040CA130000B5 +:10D3F00017010000001C0058CA1B000019000000A3 +:10D4000000540040CA13000019010000001C00581D +:10D41000CA1B00001B00000000580040CA13000097 +:10D4200029000000005C0040CA1300003D0000001D +:10D43000001C0058CA1300005000000000580040B3 +:10D44000CA1300005F000000001C0058CA1300004F +:10D450007500000000580040CA130000780000006A +:10D46000005C0040CA1300007C000000001C005853 +:10D47000CA130000FFFF0000FFFFFFFF00000000D5 +:10D480002900000000500052D22700003B0000009D +:10D4900000500052D22700005800000000500052F7 +:10D4A000D22B0000FFFF0000FFFFFFFF0000000085 +:10D4B0002A00000000500052D22700003C0000006B +:10D4C00000500052D22700005900000000500052C6 +:10D4D000D22B0000FFFF0000FFFFFFFF0000000055 +:10D4E0004200000000500052D22700005700000008 +:10D4F00000500052D2270000FFFF0000FFFFFFFF97 +:10D50000000000000100000000500052D22700007F +:10D510003D00000000500052D227000056000000DD +:10D5200000500052D2270000FFFF0000FFFFFFFF66 +:10D53000000000001200000000500052D22700003E +:10D540005A00000000500052D2270000FFFF0000E8 +:10D55000FFFFFFFF00000000160000000050005217 +:10D56000D22B00001A00000000500052D227000009 +:10D570006600000000500052D22B0000FFFF0000A8 +:10D58000FFFFFFFF0000000001000000004C004012 +:10D59000D22300000300000000440040D21F00001E +:10D5A0000800000000780040D22F00000A000000B0 +:10D5B00000100140D21F00000A010000000C0058BA +:10D5C000D20F00000B000000004C0040D21B0000F6 +:10D5D0001300000000780040D22F0000150000006A +:10D5E00000500040D23B0000170000000010014036 +:10D5F000D21F000017010000000C0058D2230000C9 +:10D6000018000000004C0040D22300001B00000066 +:10D6100000480040D21F00001C00000000500040E5 +:10D62000D23B00001F00000000100140D213000098 +:10D630002700000000140140D21F00002B00000052 +:10D6400000480040D21F00002B010000004C0040A9 +:10D65000D223000030000000004C0040D223000024 +:10D660003200000000500040D223000036000000CD +:10D6700000440040D21F0000390000000048004074 +:10D68000D21F000040000000007C0040D2230000B8 +:10D690004700000000780040D21F00005600000044 +:10D6A00000780040D21F0000690000000014014013 +:10D6B000D21F00007E000000004C0040D22300007A +:10D6C00089000000004C0040D223000099000000B7 +:10D6D000007C0040D2230000FFFF0000FFFFFFFF9F +:10D6E0000000000000000000004C0040D2230000B9 +:10D6F0000200000000440040D21F000009000000AA +:10D7000000100140D21F000009010000000C005869 +:10D71000D20F00000C000000004C0040D21B0000A3 +:10D720000F00000000780040D22F0000140000001D +:10D7300000780040D22F00001600000000100140C9 +:10D74000D21F00001601000000500040D23B000034 +:10D7500016020000000C0058D2230000190000003F +:10D76000004C0040D22300001A0000000048004096 +:10D77000D21F00001D00000000500040D23B0000FE +:10D780001E00000000100140D2130000260000001F +:10D7900000140140D21F00002A0000000048004091 +:10D7A000D21F00002A010000004C0040D2230000DC +:10D7B0002C00000000500040D22300003100000087 +:10D7C000004C0040D223000035000000004400401F +:10D7D000D21F00003800000000480040D21F0000A7 +:10D7E00041000000007C0040D223000048000000FF +:10D7F00000780040D21F0000570000000078004071 +:10D80000D21F00006E00000000140140D21F000073 +:10D810007D000000004C0040D22300009800000072 +:10D82000007C0040D2230000FFFF0000FFFFFFFF4D +:10D8300000000000536574537973436C6F636B2071 +:10D840006661696C65640A004932433132333A20BB +:10D85000496E76616C696420636C6F636B20736FD3 +:10D860007572636500493243343A20496E76616CC3 +:10D87000696420636C6F636B20736F7572636500FE +:10D880004932433A20756E6B6E6F776E20696E7306 +:10D8900074616E63650050696E6D617020657272AF +:10D8A0006F723A2077726F6E6720706F7274206E9D +:10D8B000756D6265722E004932433A2061626E6F67 +:10D8C000726D616C20636173652073686F756C6441 +:10D8D000206E6F742068617070656E6400000000D7 +:10D8E000A086010080380100C0D4010000000000C3 +:10D8F0007A0D0000FA0000005C120000A00F00008A +:10D90000800200001400000000000000801A0600E1 +:10D9100000E2040000530700000000008403000040 +:10D92000640000001405000058020000FA00000026 +:10D93000640000000000000040420F0000350C00B1 +:10D94000804F120000000000C20100003200000001 +:10D95000F4010000040100003C000000640000002D +:10D960000000000048414C5F5243435F4F736343E4 +:10D970006F6E666967204552524F520A0048414C0B +:10D980005F52434345785F506572697068434C4B02 +:10D99000436F6E666967204552524F520A004841F4 +:10D9A0004C5F4C5054494D5F496E6974204552524A +:10D9B0004F520A000080000010000000007D0000AF +:10D9C0001000000001000000020000000400000040 +:10D9D00008000000100000002000000040000000CF +:10D9E00080000000000100000002000000040000B0 +:10D9F00000080000001000000020000000400000AF +:10DA000000800000436F6D6D616E64207061726113 +:10DA10006D206572726F723A2077726F6E67206147 +:10DA20006464726573732073697A650A00496E765F +:10DA3000616C696420616C74206279746573207311 +:10DA4000697A650043616E6E6F7420696E697469EE +:10DA5000616C697A65205254432077697468204C60 +:10DA600053450A00506572697068436C6B496E6972 +:10DA70007453747275637420525443206661696CE8 +:10DA800065642077697468204C53450A0043616ED1 +:10DA90006E6F7420696E697469616C697A65205271 +:10DAA00054432077697468204C53490A00506572CA +:10DAB000697068436C6B496E6974537472756374F2 +:10DAC00020525443206661696C65642077697468EC +:10DAD000204C53490A0052544320696E69746961AD +:10DAE0006C697A6174696F6E206661696C65640A3D +:10DAF00000456E61626C6542797061737353686151 +:10DB0000646F77206572726F720A0048414C5F52F1 +:10DB100054435F53657444617465206572726F721B +:10DB20000A0048414C5F5254435F53657454696D19 +:10DB300065206572726F720A004572726F723A20C8 +:10DB40006E65772073657269616C206F626A6563C8 +:10DB500074206973207573696E672073616D652029 +:10DB60005541525420617320535444494F00466F2D +:10DB70007263654F73634F75746F66446565705368 +:10DB80006C65657020636C6F636B2069737375657A +:10DB90000D0A00466F7263655065726970684F7553 +:10DBA000746F6644656570536C65657020636C6F57 +:10DBB000636B2069737375650D0A000040420F00A6 +:10DBC00020000000000020202020202020202028ED +:10DBD0002828282820202020202020202020202025 +:10DBE000202020202020881010101010101010105D +:10DBF000101010101010040404040404040404049D +:10DC0000101010101010104141414141410101011B +:10DC100001010101010101010101010101010101F4 +:10DC20000110101010101042424242424202020201 +:10DC300002020202020202020202020202020202C4 +:10DC40000210101010200000000000000000000072 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000000054 +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000000000000000000003 +:10DD20000000000000000000280300241F00000085 +:10DD30001C0000001F0000001E0000001F0000006B +:10DD40001E0000001F0000001F0000001E00000059 +:10DD50001F0000001E0000001F0000001F00000048 +:10DD60001D0000001F0000001E0000001F0000003A +:10DD70001E0000001F0000001F0000001E00000029 +:10DD80001F0000001E0000001F0000002B2D0030AF +:10DD90003000785800412D46612D663839303132D7 +:10DDA00033343536375D00008CDD01088FDD010826 +:10DDB00092DD0108545A00474D54002531305B5E16 +:10DDC000302D392C2B2D5D256E004D256875256E67 +:10DDD0002E256875256E2E256875256E002F256801 +:10DDE00075256E3A256875256E3A256875256E008D +:10DDF000686C4C0000000000000000000000000003 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD0000000000000000000000000000000000041 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000000000000000000000090 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000000000008C +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000000000000000000001C +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E5200000000000000000000000000000000000EB +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F000000000000000000000000000000000001B +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000000000000000000FA +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000000000000000D9 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000099 +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000000000000000000000019 +:10E800000000000000000000000000000000000008 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000094 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:0BF00000A01808010001001000011919 +:08F00C00CC12FE7F01000000A0 +:10F0140000000000810B0008450B0008150C0008D7 +:10F02400D5090008A10900089D090008A70F0008D8 +:10F03400AF0F0008AB0F0008A30F000891090008E8 +:10F044009109000891090008A5090008F10B0008BE +:10F0540009026F00030102C0FA0904000000FE0166 +:10F0640002060904000100FE01020709040002006F +:10F07400FE01020809210BFF0000101A01080B0110 +:10F084000202020100090401000102020100052438 +:10F0940000100105240100020424020205240601D3 +:10F0A400020705830308000909040200020A00009C +:10F0B40000070502020002000705820200020000A8 +:10F0C4000A060002000000400100010114000000D3 +:10F0D400B1210008BD210008ED2100080922000823 +:10F0E400892200082522000841220008120100029A +:10F0F4000000004041235F030002010203010000FD +:10F1040004030904320300000000000000000000B2 +:10F1140000000000000000000000000000000000EB +:10F1240000000000000000000000000000000000DB +:10F134000000000000000000D3C3010803C401085C +:10F14400B8080024B1220008F12200083123000885 +:10F15400B123000879230008A12200082AC4010869 +:10F16400D3B3FB0200000000000000000000000018 +:10F17400000000000000000000000000000000008B +:10F18400000000000000000000000000000000007B +:10F19400000000000000000000000000000000006B +:10F1A400000000000000000000000000000000005B +:10F1B400000000000000000000000000000000004B +:10F1C400000000000000000000000000000000003B +:10F1D400000000000000000000000000000000002B +:10F1E400000000000000000000000000000000001B +:10F1F400000000000000000000000000000000000B +:10F20400154800082B5F00082B5F0008FFFFFFFF75 +:10F21400FFFFFFFFFFFFFFFF0000000000000000F2 +:10F2240000000000000000000000000000000000DA +:10F2340000000000000000000000000000000000CA +:10F2440000000000000000000000000000000000BA +:10F2540000000000000000000000000000000000AA +:10F26400000000000000000000000000000000009A +:10F27400000000000000000000000000000000008A +:10F28400000000000000000000000000000000007A +:10F29400000000000000000000000000000000006A +:10F2A400000000000000000000000000000000005A +:10F2B400000000000000000000000000000000004A +:10F2C400000000000000000000000000000000003A +:10F2D400000000000000000000000000000000002A +:10F2E400000000000000000000000000000000001A +:10F2F400000000000000000000000000000000000A +:10F30400000000000000000000000000483F00244E +:10F31400C192010865930108F19001082D9201083A +:10F3240001000000100000000090D0030090D00302 +:10F33400010000002803002400000000E8DC0108AC +:10F3440008DD0108C8DC010800000000000000001E +:10F3540000000000000000000000000000000000A9 +:10F364000000000000000000000000000000000099 +:10F374000000000000000000000000000000000089 +:10F384000000000000000000000000000000000079 +:10F394000000000000000000B7DD0108B7DD01082F +:10F3A40001000000000000004A000000000000000E +:10F3B4000000000000000000000000000000000049 +:10F3C4000000000000000000000000000000000039 +:10F3D4004A000000000000000000000000000000DF +:10F3E4000000000000000000000000000000000019 +:10F3F40000000000000000001022002400000000B3 +:10F40400BD020008BD0F0008251E0008C524000821 +:10F41400D94800081149000861950008000000005F +:08F4240099020008000000003D +:040000050801731566 +:00000001FF diff --git a/bootloaders/OPTA/bootloader.hex b/bootloaders/OPTA/bootloader.hex new file mode 100644 index 000000000..1dcac61a9 --- /dev/null +++ b/bootloaders/OPTA/bootloader.hex @@ -0,0 +1,8008 @@ +:020000040800F2 +:10000000000008247D060008C9060008C90600088B +:10001000C9060008C9060008C9060008000000005B +:10002000000000000000000000000000B50500080E +:10003000C9060008000000004F0600085F0600081F +:10004000C9060008C9060008C9060008C906000854 +:10005000C9060008C9060008C9060008C906000844 +:10006000C9060008C9060008C9060008C906000834 +:10007000C9060008C9060008C9060008C906000824 +:10008000C9060008C9060008C9060008C906000814 +:10009000C9060008C9060008C9060008C906000804 +:1000A000C9060008C9060008C9060008C9060008F4 +:1000B000C9060008C9060008C9060008C9060008E4 +:1000C000C9060008C9060008C9060008C9060008D4 +:1000D000C9060008C9060008C9060008C9060008C4 +:1000E000C9060008C906000800000000C90600088B +:1000F000C9060008C9060008C9060008C9060008A4 +:10010000C9060008C9060008C9060008C906000893 +:10011000C9060008C9060008C9060008C906000883 +:10012000C9060008C9060008C9060008C906000873 +:10013000C9060008C9060008C9060008C906000863 +:10014000C9060008C9060008000000000000000001 +:10015000C9060008C9060008C9060008C906000843 +:10016000C9060008C9060008C9060008C906000833 +:10017000C9060008C9060008C906000800000000FA +:10018000C9060008C9060008C9060008C906000813 +:10019000C9060008C9060008C9060008C906000803 +:1001A000C9060008C9060008C9060008C9060008F3 +:1001B000C9060008C9060008C9060008C9060008E3 +:1001C000C9060008C9060008C9060008C9060008D3 +:1001D000C9060008C9060008C9060008C9060008C3 +:1001E000C9060008C9060008C9060008C9060008B3 +:1001F000C9060008C9060008C9060008C9060008A3 +:10020000C9060008C9060008C9060008C906000892 +:10021000C9060008C9060008C9060008C906000882 +:10022000C9060008C9060008C9060008C906000872 +:10023000C906000891550008C9060008C90600084B +:10024000C9060008C9060008C9060008C906000852 +:10025000C9060008C9060008C9060008C906000842 +:10026000C9060008C9060008C9060008C906000832 +:10027000C9060008C9060008C9060008C906000822 +:10028000C9060008C9060008C906000800000000E9 +:10029000C9060008C90600080000000000000000B0 +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F0004D4355626F6F742041726475696E6F0073 +:10030000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:10031000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:10032000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:10033000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:10034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:10035000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:10036000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:10037000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:10038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:10039000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:1003B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:1003C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:1003D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:1003E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:1003F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:10040000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:10041000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:10042000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:10043000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:10044000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:10045000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:10046000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:10047000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:10048000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:10049000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:1004A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:1004B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:1004C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:1004D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:1004E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:1004F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:1005000010B5054C237833B9044B13B10448AFF34D +:1005100000800123237010BD20040024000000008F +:10052000FCC5010808B5034B1BB103490348AFF3F1 +:10053000008008BD0000000024040024FCC5010860 +:10054000154B002B08BF134B9D46A3F5803A0021A5 +:100550008B460F461348144A121A18F0F7FB0F4B3C +:10056000002B00D098470E4B002B00D0984700205E +:10057000002104000D000D48002802D00C480DF0A9 +:1005800077F918F0DBF92000290014F073FA0DF068 +:100590003DFB00BF00000800000008240000000030 +:1005A000F94B01082004002458A5022471D8000842 +:1005B000000000001EF0040F0CBFEFF30880EFF303 +:1005C0000980816911F8021C002932D101B590E837 +:1005D0000F10E047BDE800508CE80300244B93E87F +:1005E0000600914208BF70471A6041B91EF0100F13 +:1005F00010D1204B186820F0010018600AE02CE9A7 +:10060000F00F1EF0100F08BF2CED108A81F822E0C9 +:10061000C1F838C0906B92F8221061F0FF0E1EF006 +:10062000100F08BFB0EC108AB0E8F00F80F3098813 +:100630007047114A13689942FAD801B552F821C09F +:100640000FC8E047BDE80050CCF80000704701B586 +:1006500014F018FDBDE80140EFF3098CBEE701B5C9 +:1006600014F052FDBDE80140EFF3098CB6E700003D +:100670002C01002434EF00E06CC30108DFF830D017 +:1006800004F0B8FF002103E00A4B5B5843500431EB +:1006900009480A4B42189A42F6D3094A02E000235D +:1006A00042F8043B074B9A42F9D3FFF749FF7047E2 +:1006B0000000082414F0010800000024180400249D +:1006C0002004002458A50224FEE70000264B022245 +:1006D00083F83E201B681A6A22F001021A621A6A25 +:1006E00042F001021A62214A934219D002F5806257 +:1006F000934215D002F57052934211D002F58062F8 +:1007000093420DD002F58062934209D0B3F1804F3D +:100710000ED19968164A0A40062A21D10020704756 +:100720005A6C42F400425A64104A9342EED1F0E708 +:10073000104A9342EDD002F580629342E9D002F56F +:1007400080629342E5D002F578429342E1D0A2F56F +:100750006C429342DDD01A6842F001021A60DDE774 +:10076000B2F5803FF7D1D9E76405002400000140CD +:10077000070001000004004008B5044B027853F85C +:10078000220003685B6B9847C0B208BD00000024DC +:1007900073B50E4600781146064A002452F8200030 +:1007A0000268CDE90034234695693246A84702B075 +:1007B00070BD00BF0000002410B5846802EB011278 +:1007C00001312023A03C0C32A4EB4111FFF7E0FFE4 +:1007D000003818BF012010BD024B6FF002021B68E9 +:1007E0001A61704764050024034B1A68D36823F02C +:1007F0000203D360704700BF64050024064B6FF00E +:1008000002021B681A615A6942F002025A61DA68F0 +:1008100042F00202DA60704764050024054B6FF075 +:1008200002021B6858631A61DA6842F00202DA6059 +:10083000704700BF64050024014B586A704700BF31 +:10084000000C0040064A1168CB6823F00203CB601D +:1008500092F83E30012B01D1FFF738BF704700BF3F +:1008600064050024074B084A13601A69910708D5EC +:10087000DA68920705D56FF0020204481A610DF09C +:10088000B3B87047000C00406405002464B101084F +:100890000048704714B101086AB101F00301074B29 +:1008A0000329596808D000F47060B0F5706F03D167 +:1008B00021EA02025A6070470A43FBE7000400582D +:1008C00030B5114B114DD5F894409C42FBD14943B2 +:1008D000012A01EB41034FEA41046FEA030304D00C +:1008E000022A0BD0C26813400BE0C26813401943C0 +:1008F000C160064B4FF440725A6130BDC26813406C +:100900002343C360F5E700BF000300800064025882 +:100910002DE9F04191F800E04B7874464E69012BC7 +:10092000354F4FEA4414DFF8D4C044D100F51065C8 +:100930002B19B6B91E6937401F611E6946F400269F +:100940001E611E6906EA0C06012A1E6122D10A698F +:1009500002B15A612B5943F004432B510020BDE8EA +:10096000F081D3F8108008EA0C0CC3F810C0D3F85B +:1009700010C00CEA07071F618F68BE421E6946F46B +:10098000002688BF4F611E614E691F69C6F31206BB +:100990003E43D9E72B5943F004432B514B69002BBD +:1009A000DCD00EF00F020123D0F8341893400B4333 +:1009B000C0F83438D2E700F5306003191D6905EA44 +:1009C0000C051D611D693D401D618D6806B14D61BD +:1009D0001E69C5F31205012A46F400261E611E6930 +:1009E00045EA06051D6102D1CA6802B15A61035980 +:1009F00043F004430351B1E7FFFF07E00000F8FFB5 +:100A00004E4A70B5946A966AD36A16F07C7FC6F334 +:100A10000551556C00F08D8007EE901AC3F300234A +:100A2000C5F3CC0104F00304F8EEE76A4B43012C54 +:100A3000B7EE006A07EE903AFAEEE97A6BD0022C34 +:100A40005BD0002C67D113689B0646D51168136CE8 +:100A5000C1F3C1013A4AC3F30803CA4007EE102AA2 +:100A6000F8EEC75A85EEA67A06EE903AF8EEE66AF8 +:100A700076EEA77A77EE867A304A67EE877A136C3D +:100A8000C3F3462307EE103AB8EEC77A37EE067A7C +:100A9000C7EE876AFCEEE66AC0ED006A136CC3F32A +:100AA000064307EE103AB8EEC77A37EE067AC7EE7D +:100AB000876AFCEEE66AC0ED016A136CC3F3066355 +:100AC00007EE103AB8EEC77A37EE066A87EE867AF6 +:100AD000BCEEC77A80ED027A70BD136CDFED195A57 +:100AE000C3F3080307EE103AB8EEC77A77EE277A19 +:100AF00077EE867A85EEA67ABEE7136CDFED125AA2 +:100B0000C3F3080307EE103AB8EEC77A77EE277AF8 +:100B100077EE867AEEE7136CDFED0C5AC3F3080329 +:100B200007EE103AB8EEC77A77EE277A77EE867A34 +:100B3000E0E7C0E900118160CEE700BF0044025841 +:100B40000090D0030024744C20BCBE4B0024744A97 +:100B50004E4A70B5946A966AD36A16F47C3FC6F31F +:100B60000531D56B00F08D8007EE901AC3F30013AA +:100B7000C5F3CC0104F00304F8EEE76A4B43012C03 +:100B8000B7EE006A07EE903AFAEEE97A6BD0022CE3 +:100B90005BD0002C67D113689B0646D51168936B18 +:100BA000C1F3C1013A4AC3F30803CA4007EE102A51 +:100BB000F8EEC75A85EEA67A06EE903AF8EEE66AA7 +:100BC00076EEA77A77EE867A304A67EE877A936B6D +:100BD000C3F3462307EE103AB8EEC77A37EE067A2B +:100BE000C7EE876AFCEEE66AC0ED006A936BC3F35A +:100BF000064307EE103AB8EEC77A37EE067AC7EE2C +:100C0000876AFCEEE66AC0ED016A936BC3F3066384 +:100C100007EE103AB8EEC77A37EE066A87EE867AA4 +:100C2000BCEEC77A80ED027A70BD936BDFED195A86 +:100C3000C3F3080307EE103AB8EEC77A77EE277AC7 +:100C400077EE867A85EEA67ABEE7936BDFED125AD1 +:100C5000C3F3080307EE103AB8EEC77A77EE277AA7 +:100C600077EE867AEEE7936BDFED0C5AC3F3080359 +:100C700007EE103AB8EEC77A77EE277A77EE867AE3 +:100C8000E0E7C0E900118160CEE700BF00440258F0 +:100C90000090D0030024744C20BCBE4B0024744A46 +:100CA000002070476FF0570070476FF05700704793 +:100CB000036810B49C6C0023A4461A465DF8044BEC +:100CC00060476FF05700704743680A46196810B4D0 +:100CD0008C6D8168184623465DF8044B18474368BD +:100CE00081681A681846526D1047436881681A680F +:100CF0001846126D1047436881681A681846D26C0E +:100D0000104730B4446813462268956C0A468168DF +:100D10002046AC4630BC6047436881681A68184674 +:100D2000526C1047436881681A681846126C104765 +:100D300030B4446813462268D56B0A468168204661 +:100D4000AC4630BC604730B4446813462268956BAB +:100D50000A4681682046AC4630BC604710B5044660 +:100D6000406830B10368A1685B6B984700236360FB +:100D700010BD6FF01500FBE738B50446FFF7EEFF36 +:100D80000546236820465B689847284638BD70B5FD +:100D90000D464168044641B929680E6B00F108010F +:100DA0002846B04700B9656070BD6FF01500FBE7DD +:100DB000044B10B50360044643680BB1FFF7CEFF48 +:100DC000204610BDE8AF0108034B10B50446036090 +:100DD000FFF7EEFF204610BD74B00108436881683C +:100DE0001A681846526F1047436881681A68184697 +:100DF000126F1047436881681A681846D26E104710 +:100E000043680A46196810B48C6E816818462346F8 +:100E10005DF8044B184710B50446406830B10368CC +:100E2000A1681B6E98470023636010BD6FF015002A +:100E3000FBE738B50446FFF7EEFF0546236820467A +:100E40005B689847284638BD38B5436804460D4668 +:100E500043B90B6800F108012846DB6D984700B9DB +:100E6000656038BD6FF01500FBE70000044B10B55E +:100E70000360044643680BB1FFF7CDFF204610BD69 +:100E8000BCAF0108034B10B504460360FFF7EEFF4B +:100E9000204610BD48B001080368013303600020FC +:100EA0007047F7B5089F0E4604681946C0690023CD +:100EB000256800970027E0FB0623204601976D690F +:100EC000A84703B0F0BDF7B5089F0E460468194661 +:100ED000C0690023256800970027E0FB0623204611 +:100EE0000197AD69A84703B0F0BD37B50468C36981 +:100EF00000202268009301902046D569A1FB0323BE +:100F0000A84703B030BD006803681B691847002874 +:100F100007DC10F1160F04DA10F1340F08BF6FF080 +:100F2000890070470B4640F20112002170B504465B +:100F3000184617F00BFF03466068A1680268556EFB +:100F40001A462B46BDE870401847000010B50CF05B +:100F5000BBFC134B1348144A596A14680388116088 +:100F60001B1B0B440146B3F5803F16D34FF47A7137 +:100F7000B3FBF1F201FB1233038006E00132A3F56B +:100F80007A73B3F57A7FF9D20B80084C23681A4440 +:100F900022600CF085FC206810BD0022F1E700BF44 +:100FA000000C0040680B02246C0B0224F00C02249D +:100FB00070B504460D4616462368DB6935EA03031F +:100FC00001D1002017E0FFF7C1FF801B2368B0F1BB +:100FD000007F1A6810D322F4D0721A609A6822F047 +:100FE00001029A602023C4F88430C4F888300023BA +:100FF000032084F8803070BD5107DDD5DA69120511 +:10100000DAD54FF400621A621A6822F4D0721A60BC +:101010009A6822F001029A602023C4F88430C4F850 +:101020008830C4F88C30E2E7F8B53A4C06460D46F5 +:10103000A36A03F00303032B69D0236823F08053D2 +:101040002360FFF783FF074623689A004BD4A36A07 +:10105000326823F07C7343EA0253A362B368F268F8 +:10106000013B013A5B0212049BB202F4FE021343FD +:101070007268013AC2F3080213433269013A120658 +:1010800002F0FE4213432364E36A726923F440636F +:101090001343E362E36AB26923F400731343E36228 +:1010A000E36A23F48073E362636CF26923F47F43A1 +:1010B00023F0F80343EAC2036364E36A43F48073F2 +:1010C000E362E36AB5B943F48003E362114C236839 +:1010D00043F080532360FFF739FF054623689B00E8 +:1010E0000FD5002005E0FFF731FFC01B0228ABD968 +:1010F0000320F8BD012D0CBF43F4000343F08073BF +:10110000E3E7FFF723FF401B0228E7D9F0E70120C0 +:10111000EFE700BF00440258F8B53A4C06460D46CA +:10112000A36A03F00303032B69D0236823F08063D1 +:101130002360FFF70BFF074623681A014BD4A36A0D +:10114000326823F47C3343EA0233A362B368F26863 +:10115000013B013A5B0212049BB202F4FE0213430C +:101160007268013AC2F3080213433269013A120667 +:1011700002F0FE421343A363E36A726923F0C003E3 +:101180001343E362E36AB26923F020031343E3628B +:10119000E36A23F01003E362E36BF26923F47F4315 +:1011A00023F0F80343EAC203E363E36A43F0100366 +:1011B000E362E36AB5B943F40023E362114C2368A8 +:1011C00043F080632360FFF7C1FE054623681B01DF +:1011D0000FD5002005E0FFF7B9FEC01B0228ABD9F0 +:1011E0000320F8BD012D0CBF43F4801343F400131A +:1011F000E3E7FFF7ABFE401B0228E7D9F0E7012049 +:10120000EFE700BF004402582DE9F041DDF81880F7 +:1012100004460E4615461F4622689368334214BFA3 +:1012200001230023AB4201D1002012E0B8F1FF3FBF +:10123000F3D0FFF78BFEC01B404502D8B8F1000F7A +:10124000EAD10423012084F84130636C43F00103A8 +:101250006364BDE8F0812DE9F04F054685B00C468A +:10126000FFF774FE95F8402007EE900A012A00F07F +:10127000E1800122022085F8402095F84120012AD2 +:1012800040F0BE80002241F2883117EE903ACDED59 +:10129000037A6A640091202185F841002846FFF70F +:1012A000B3FFDDED037A002840F0AA80D4F824C013 +:1012B000BCF1000F03D0A26A2968013A0A61D4F890 +:1012C00018A0D4E90727BAF1000F50D063694CEA9F +:1012D0000A0AD5F800E026684FEA834BD4F8348038 +:1012E000D4E90B1967B3A36847EA0A0A2769CEF85D +:1012F0001C30BAB132431143E26841EA090949EAB4 +:10130000080848EA0707174347EA0B0747EA0A07AE +:10131000CEF814706268CEF81820BCF1000F40F0CF +:10132000818062E0314341EA090949EA080848EA54 +:10133000070747EA0B0747EA0A07CEF81470ECE7FD +:1013400052B142EA06070F4347EA090747EA08088D +:10135000E76848EA0707D7E746EA010747EA0907C7 +:1013600047EA080747EA0B0B4BEA0A07E5E737B3FA +:10137000A1684CEA0707D5F800E02669CEF81C10F2 +:101380006169D4F834808904D4E90BA96AB1324385 +:10139000E36842EA0A0A4AEA090949EA080848EA07 +:1013A000030848EA01010F43B2E746EA0A0646EAA3 +:1013B000090949EA080848EA01010F43BDE78AB173 +:1013C000E16A4CEA02020A43216B0A43616B0A4359 +:1013D000E1680A43616942EA814229684A616268B8 +:1013E0008A619AE7BCF1000F10D141F2883217EE02 +:1013F000903A0221284600920122FFF705FFA8B18A +:10140000002385F8403005B0BDE8F08FE36A226B19 +:101410004CEA03031343626B1343626943EA82435A +:101420002A685361012385F84130E9E72B680222DD +:10143000DA60F7E70220E6E738B50C4B04460C4DBE +:1014400003600023C0E9013101230373284610F033 +:10145000B1FE09F01BFD074B28461A681C6062604C +:1014600010F0A8FE09F0F2FC204638BDC8B0010813 +:10147000D8060024D406002413B50C46A4300190ED +:1014800009F004FDA469019809F0E0FC204602B0CF +:10149000BDE81040FFF73BBD37B50D46A4300190C5 +:1014A00009F0F4FCEB696C6913F4003F019803D078 +:1014B0002B6A9C4238BF1C4609F0C8FC204603B08A +:1014C000BDE83040FFF723BD13B50C46A4300190B2 +:1014D00009F0DCFC246A019809F0B8FC204602B04F +:1014E000BDE81040FFF713BD10B50446FFF76CFCD4 +:1014F000204617F0C1FB204610BD10B50446FFF78B +:10150000C1FC204617F0B8FB204610BD10B50446BC +:10151000FFF74EFC204617F0AFFB204610BD10B57C +:101520000446FFF7A3FC204617F0A6FB204610BD9B +:1015300037B50546A4300C46019009F0A7FC05F12B +:1015400024026B6A01981BB19C420DD12368136081 +:1015500009F07CFC14B1204617F08EFB002003B08C +:10156000BDE83040FFF7D3BC1A461B68EBE700002C +:101570002DE9F04FE9B0054693460F46442200217D +:1015800015A8984617F0E2FBEA6D42F2107359462F +:10159000073215A82393D2080DF07CFF04460028DB +:1015A00040F0D18105F1340108F10C000DF0E2FEAC +:1015B000002840F0A38005F1280140460DF0DAFE36 +:1015C000B0FA80F35B090593EB6DB3F5C07F2CBFD8 +:1015D000052204220392059A12B1039A0132039262 +:1015E000039A934298BF0222013B02F1FF39039212 +:1015F000012202FA09F206929DF818200492039A39 +:101600001344B3FBF2F30293059B13B16E6F002EEC +:101610005ED12421069818F03DFE0646002800F011 +:10162000958100244FF0240A0AFB046001340DF078 +:101630006DFE049AE3B29A42F6D8414630460EF067 +:10164000BDFA044600286ED1029B804603FB09FACE +:101650004FF00109D04553D10DF198090022012323 +:10166000484603EBC30101325B0006EB8101DBB2AC +:1016700040F8041B04999942F3D826A928460FF094 +:10168000E7FF044600284ED14FF0010808EBC803DD +:10169000C24606EB830352460AF1FF3A002A6BD199 +:1016A0004FEA4808049B5FFA88F84345EED82423A4 +:1016B0000132069991426DD14A1E284626A90FF0A3 +:1016C000C7FF044678BB059B13B1069B6E67AB67EB +:1016D000002405F14C0801230DF124092146404660 +:1016E0000E94C9F80840C9E90034CDE90C340DF076 +:1016F000AAFF012853D0A4F59F4414E0059463E7A2 +:10170000029BB8FBF3F009FA00F12423C9B203FBF2 +:101710000162029B03FB1080E8B1114628460FF0DE +:1017200003FB044628B315A80DF01EFD442115A89F +:101730000CF0A0FF42F2107323936B6FB34202D000 +:10174000002E40F0128114B138460EF0C4F8204645 +:1017500069B0BDE8F08F49081046079201EBC1015E +:1017600006EB81010EF02AFA079A04460028D4D02D +:10177000D9E708F101086DE724222846079302FB08 +:101780000AF1721819440FF015FC079B0446002853 +:1017900081D0C8E703FB026149F8041B88E72146B2 +:1017A00058460DF050FFB0FA80FA594648460EF000 +:1017B000D9F904464FEA5A1A00BB5A4641460CA8CA +:1017C0000EF08DFE0446C8B952460CA948460EF0EC +:1017D0002BF8044690B9029B0DF19808014626A803 +:1017E0005A1CA34617F0B2FA4346029A5A454FD103 +:1017F0004FF0000E4FF0010CE34565D20CA80EF03F +:1018000049F809A80EF046F8002C8CD10CA80DF16F +:1018100098080DF07BFD029B3246394618F80330DC +:1018200028460093049B0EF0A1FE044688B90121CE +:1018300007F118000DF058FF044650B915AB4D4A9A +:10184000394628460FF006FA044610B9029B002BD1 +:101850005BD10CA80EF031F8002C7FF464AF524637 +:10186000394628460EF05EFE044600287FF45BAF42 +:1018700015AB404A394628460FF0ECF904460028DB +:101880007FF451AF394628460FF094FE04464AE7EC +:101890005946002248460591CDE906320DF0D3FEA7 +:1018A000079A069B9040029993F800C001324CEAD7 +:1018B0000000187008460599014403989042E9D841 +:1018C0000BF1010B013390E798F801000CF1010CCA +:1018D00098F8002080EA0E0300EA0E00D9435BB2BC +:1018E00001F0010112FB01F252B203EA0209534076 +:1018F00008F8013F49EA000E18F8013C5FFA8EFE35 +:1019000043EAC11108F8011C76E7029B3A463946C2 +:101910002846013B02930FF007FA90B9029B32462A +:101920000CA9284613F808300093049B0EF01EFE05 +:1019300038B90CAB3A46394628460FF03BFB002835 +:1019400084D0044685E700260496ECE60A4CEAE6D5 +:1019500008FB056001350DF0BEFFEBB2049A9A4218 +:10196000F6D8304617F088F9EDE600254FF0240848 +:10197000F3E700BF79F2000880B2FFFF2DE9F04FD6 +:101980002DED028BBBB004460E46914608EE103A90 +:101990000DF0E6FC022840F09D814422002129A898 +:1019A00020AD17F0D3F942F2107328460127379380 +:1019B0000DF0ACFCE26D0023494629A807320493E0 +:1019C000D208CDE902730DF065FD0346002862D10F +:1019D00018EE101A02A80EF0C5F8034600285AD1D6 +:1019E00018EE101A28460EF0E9F80346002852D1E6 +:1019F000394630460DF078FE034600284BD106F1FB +:101A00001807014638460DF06FFE0346002842D104 +:101A100004F1040B06F10C000DF03CFF594628467A +:101A20000DF0A8FC00282EDA29ABB34A294620463F +:101A30000FF0C6F8034670BB48464FF001080DF0A2 +:101A40005DFD431E0093009B01333FD129ABAA4AA1 +:101A5000314620460FF0B4F80346E0B95A463946FD +:101A600038460FF0D3FB0346A8B93B463246314611 +:101A700020460EF0A9FF034668B9012138460DF053 +:101A800033FE034607E05A46294628460EF0F3F98E +:101A900003460028C2D029A800930DF065FB44211D +:101AA00029A80CF0E7FD42F2107220A837920DF041 +:101AB00004FF02A80DF0EEFE009B002B00F00B814E +:101AC00018463BB0BDEC028BBDE8F08F009948464C +:101AD0000DF0B9FD29465FFA80FA304652460DF006 +:101AE00065FE03460028D6D1524626A938460DF099 +:101AF0005DFE03460028CED13B461F90324605A925 +:101B0000CDE90580CDE90708CDE90900CDE90B80D5 +:101B1000CDE90D08CDE90F00CDE91180CDE913081D +:101B2000CDE91500CDE91780CDE91908CDE91B00F5 +:101B3000CDE91D8020460EF06FFD0346002840F0E1 +:101B4000938005AB08A920461A460EF03DFF0346D8 +:101B5000002840F089803B4632460BA920460EF013 +:101B60006BFD034600287FD10BAB0EA920461A4619 +:101B70000EF02AFF0346002876D10EAB08AA11A961 +:101B800020460EF059FD034600286DD126AB2A46AB +:101B900014A920460EF040FD0346002864D126AB70 +:101BA0002A4617A920460EF047FD034600285BD1C0 +:101BB00005AB17AA1AA920460EF006FF0346002817 +:101BC00052D10BAB14AA1DA920460EF0FDFE034610 +:101BD000002849D11DAB1AAA294620460EF01CFD4B +:101BE0000346002840D12B462A46294620460EF0BF +:101BF000EBFE0346002837D11DAB1AAA26A92046C2 +:101C00000EF01AFD034678BB26AB20461A4619464D +:101C10000EF0DAFE034638BB26AB02AA2046194670 +:101C20000EF0D2FE0346F8B90EAB08AA31462046A4 +:101C30000EF0CAFE0346B8B911AB04F110023946E2 +:101C400020460EF0C1FE034670B93B460EAA394647 +:101C500020460EF0E1FC034630B93B4611AA394656 +:101C600020460EF0B1FE034605A801930DF012FECA +:101C700008A80DF00FFE0BA80DF00CFE0EA80DF03D +:101C800009FE11A80DF006FE14A80DF003FE17A81A +:101C90000DF000FE1AA80DF0FDFD1DA80DF0FAFDD7 +:101CA000019B002B7FF4F7AE5246294630460DF0DB +:101CB0007DFD034600287FF4EEAE524626A9384645 +:101CC0000DF074FD009B013B0093034600283FF498 +:101CD000BAAEE0E6094B204600930DF041FB012827 +:101CE000009B7FF4EDAE18EE103A4A46314620468E +:101CF000FFF73EFC0346E3E679F2000880B0FFFF01 +:101D0000F7B505460C461046012116461F460DF054 +:101D100074FB30B93946204603B0BDE8F0400DF001 +:101D20004DBF4FF0FF3130460DF067FBA0B939468B +:101D300020460DF043FF10BB04F10C020146104693 +:101D400001920DF05AFB019AC8B1291D104603B04B +:101D5000BDE8F0400EF0C3BB314628460DF084FCD0 +:101D600068B9394628460EF07BFE40B93B463246FC +:101D70002146284603B0BDE8F040FFF7FFBD03B0A1 +:101D8000F0BD30B58FB00C461946139DFBB1002352 +:101D9000CDE906330893130F8DF82430130D8DF819 +:101DA0002530130B12098DF826308DF827204FF4BB +:101DB0008E72237802FB0300129B05AA05930AABDF +:101DC0000430009306ABCDE901550FF087FD0FB04D +:101DD00030BD37B50223154601AA04460FF00CFDAD +:101DE00018B9019B1BB96FF0630003B030BD2368C5 +:101DF00093F90030002BF6DB019B3BB12268117890 +:101E0000A1B1042BEFD801D10B06ECD400232B6039 +:101E1000019B5A1E0192002BE7D02368296813F812 +:101E2000012B42EA01222A602360F1E70132013BE3 +:101E300022600193E0E70000F8B50A23684E0546EA +:101E40000C46036033681BB90FF048FF0123336071 +:101E500005F108032A46214604F1100042F8043F28 +:101E60008B78043111F8034C1B0443EA042311F866 +:101E7000044C234311F8014C884243EA046342F8BE +:101E8000043FEDD12B680C2B2ED00E2B5DD00A2BEE +:101E900028D128465349544D00F1A006426910301C +:101EA00055F8044B50F8087CC2F307237C40CB5C08 +:101EB0006340140E0C5D83EA0443D4B20C5D83EAE4 +:101EC0000463C2F307440C5D83EA042350F8044C16 +:101ED000836063400468C3606340036153404361AF +:101EE0008642DBD10020F8BD28463F4CC0353D4935 +:101EF000C269183054F8046B50F8107CC2F3072301 +:101F00007E40CB5C7340160E8E5D83EA0643D6B2EC +:101F10008E5D83EA0663C2F307468E5D83EA06237D +:101F200050F80C6C8360734050F8086CC3607340C9 +:101F300050F8046C03617340066843617340836129 +:101F40005340C3618542D3D1CCE728462549264D6D +:101F500000F1E006446A203055F8042B50F8187C54 +:101F6000C4F307237A40CB5C50F8087C5340220E20 +:101F70008A5C83EA0243E2B28A5C83EA0263C4F3C6 +:101F800007428A5C83EA022350F8142C8360534092 +:101F900050F8102CC360534050F80C2C0361534090 +:101FA000DAB243618A5C7A401F0ECF5D82EA076233 +:101FB000C3F30727C3F30743CF5DCB5C82EA072255 +:101FC00082EA034350F8042C836153400268C361E2 +:101FD00053400362634043628642BBD182E700BF45 +:101FE000000700243C0400243C050024F8B50378D5 +:101FF00090F801C0012B057F0279077B8668447940 +:102000002ED0022B2FD0002B30D14FF480738B6158 +:102010000023C1F800C04D614B63C1E90B333FB3EE +:10202000CB61CB60037C012B45D0022B48D0002B29 +:102030004BD14FF480430B620123027E002A47D02C +:1020400000230B620B61437F012B6AD0022B6BD004 +:10205000002B6CD14FF0807300204B628862F8BD7A +:102060004FF40073D3E74FF44073D0E70023CEE77B +:10207000012A4E600BD0022A0CD072B94FF4806353 +:10208000CB61032C09D8DFE804F00B0D10134FF4DB +:102090000063F5E74FF44063F2E727480BF0DCFDFF +:1020A0000023BEE74FF48053BBE74FF40053B8E77B +:1020B0004FF44053B5E74FF400430B620223BCE7F3 +:1020C0004FF440430B620423B7E700230B62B4E7ED +:1020D0007BB3427CB2FBF3F403FB142414F0FF0F38 +:1020E00027D1561EF610741C042C22DCC2EBC4024D +:1020F00012F0FF0210D0B2FBF3F39D4219D3EB1A9A +:102100004B61436903FA02F28A60032E07D8240464 +:10211000A4F580340C6196E743698B60F5E70748C6 +:10212000BCE74FF0007397E74FF0407394E700234C +:1021300092E74FF0FF3092E774AB01089DAB0108C6 +:10214000F0B593B004460846164604A91D46FFF7AD +:102150004DFF48B92B6804A920460E93FFF77BF882 +:10216000074618B14FF0FF3013B0F0BDFEF7EEFE9A +:1021700025680346A96994F84020012AF2D001227B +:1021800084F8402094F84120012AD0B246D16764F7 +:10219000002E3ED0222284F841202A690132A26317 +:1021A0002A69266341F28836013262636A6922F045 +:1021B000406242F080626A61A961A26BA2B9012209 +:1021C000022120460096FFF71FF810B9236802226B +:1021D000DA60012384F841300023C01A84F84030CB +:1021E00018BF01204042BFE7012206212046009689 +:1021F0000393FFF709F80028EBD195F82010226B24 +:10220000039B1170226B01322263A26B013AA2631D +:10221000D3E7636C43F008036364DDE70220DBE788 +:1022200070B500F1A4060C460546304608F02EFEB7 +:1022300004F11002214605F1140006F085FC38B9BE +:10224000236963606369A3600E23A3611023E360C5 +:102250003046BDE8704008F0F9BD2DE9F041064672 +:1022600000F1A4070C4615461436384608F00EFE59 +:1022700004F110022146304606F066FCD0B923690D +:1022800004F12408A56163606369A3601023E3601F +:10229000216A21F000439D4201D8E5600AE000294F +:1022A000A5EB030506DA42462146304606F04CFC13 +:1022B0000028EDD03846BDE8F04108F0C7BD000069 +:1022C0002DE9F04100F1A408C8B00E46054640468D +:1022D000174608F0DBFD4FF48472002106A816F0C3 +:1022E00035FDB36914350E2B22D12223364908A8B7 +:1022F0008DF8183017F016FB0F230124B361404608 +:1023000008F0A4FD012C0DD19DF81830112B59D0E7 +:10231000222B14BF0023032308A9384687F8003175 +:1023200017F000FB204648B0BDE8F041FEF7EFBDD6 +:102330000F2B08D12223254908A88DF8183017F053 +:10234000F1FA1023D9E702AA3146284606F0D0FF59 +:10235000044618B1821C08BF0024D0E79DF80C3059 +:1023600003F07F02112A01D0222AECD11B060CD5E2 +:1023700004A9284607F02CF8041EC0DBE3D19DF821 +:102380000C3003F07F038DF80C309DF80C3028469C +:10239000029A112B8DF8183002F104029DF80E10EC +:1023A00004BF059B07939DF80D301A449DF80F302C +:1023B0000A440093716808AB06F0B9FB041E08BF1D +:1023C00001249CE70523A7E7B5AB0108B4AB0108DE +:1023D00030B500F1A40585B0044628460193CDE947 +:1023E000022108F053FD039904F11400DDE90132E4 +:1023F00006F0BCFD0446284608F028FD204605B03E +:10240000BDE83040FEF783BD2DE9F04100F1A4089E +:1024100005460E46144640461F4608F037FD05F1B6 +:102420001400314606F038FD054670B93FB1012F62 +:10243000336A01D11C4402E0022F0ED01C46002C4E +:10244000AABF25466FF015053462404608F0FEFC31 +:102450002846BDE8F041FEF75ABD7369EAE737B593 +:1024600000F1A40504460191284608F00FFD0199EA +:1024700004F1140007F04EFA0446284608F0E6FC82 +:10248000204603B0BDE83040FEF741BDF8B500F18D +:10249000A40705460C46384608F0F8FC214605F12D +:1024A000140007F037FA05F1200206462B6A1BB12B +:1024B0009C4216D123681360A3690BB11B682BB92A +:1024C0006B695B6B13B9606B16F0D6FB384608F08E +:1024D000BDFC204616F0D0FB3046BDE8F840FEF7C4 +:1024E00016BD1A461B68E2E730B500F1A40585B0B9 +:1024F000044628460193CDE9022108F0C7FC039960 +:1025000004F11400DDE9013206F063FE04462846BA +:1025100008F09CFC204605B0BDE83040FEF7F7BC53 +:102520002DE9F341064614460021282206F1A407AE +:102530002046002516F00AFC384606F114080195DD +:1025400008F0A4FC06F1180006F0E7FA28B901AA81 +:102550000D49404606F05EFB0546384608F076FC1D +:102560006DB9736F019AC4E90033B36FC4E90235E2 +:102570009B1AC4E90435C4E90635FF236362284683 +:1025800002B0BDE8F08100BF990E00082DE9F041CE +:10259000804600F1A406D4B00C4608F1140730467A +:1025A000154608F073FC02AB03AA07A9384602944B +:1025B00007F0EAF90446C0B901464FF4847212A844 +:1025C00016F0C4FB9DF8103008F1180105A8112B76 +:1025D0008DF8483004BF069B139306F08DFA04462D +:1025E000C0B9174914A817F09DF9304608F02EFC21 +:1025F000139B2B619DF84830112B1DD0222B44F2E8 +:10260000FF1318BF002320466B6054B0BDE8F041B3 +:10261000FEF77DBC039B38469DF8111004339DF8EE +:10262000122019449DF813300A440093089914AB02 +:1026300006F07DFA0446D8E748F2FF13E3E700BF4F +:10264000B7AB0108F0B500F1A40605469FB00C46F3 +:10265000304605F1140708F019FC95F8543003943E +:10266000002B43D003AB04AA08A9384607F08CF925 +:10267000831C044649D12F21039817F08DFF0028B1 +:102680003AD16B6913A938461B6AEB6407F02CFA40 +:102690000446002830D1119B024613A91C93129BBB +:1026A0001D930346384606F05CFF044620BB40F607 +:1026B00022038DF81600ADF81430039B18460193E1 +:1026C00017F038F91499159A8DF8170038460691C5 +:1026D0000792019BCDE9111204AA08A907F030FA6C +:1026E000044648B96B691B6AEB6405E0384606F09E +:1026F000A7FE04460028B5D0304608F0A7FB2046C8 +:102700001FB0BDE8F040FEF702BC002808BF6FF024 +:102710001004F1E7F0B500F1A40504469DB00F46A2 +:10272000284604F1140608F0B1FB94F854300197E0 +:1027300083B101AB02AA06A9304607F025F9044689 +:1027400078B1284608F082FB20461DB0BDE8F04075 +:10275000FEF7DDBB304606F073FE04460028E8D0E5 +:10276000EFE79DF80C30222B1ED002AA06A93046B6 +:1027700007F043F804460028E3D19DF80C30222BE3 +:10278000DFD106AA12A9304606F087FD041ED8DB69 +:102790001A9B06A930460F931B9B109300231A46E1 +:1027A00006F0DFFE0446CCE704AA11A9304606F085 +:1027B000CBF904460028C4D1199B142BD5D06FF057 +:1027C0002604BEE72DE9F04300F1A4058046B3B02E +:1027D0000F462846144608F059FB98F8543008F183 +:1027E0001406CDE90274002B4DD0029B05AA11A955 +:1027F0003046049304AB07F0C7F80446002848D1DC +:102800009DF8183005AA11A963F07F038DF81830E0 +:102810000346304607F065F80446002839D10DF12B +:10282000240903AB1CA930464A4607F0ADF8074619 +:10283000002837D0821C40F085802F21039817F0A4 +:10284000ABFE00287ED10DAC99E80F0084E80F00A4 +:1028500006AA0EAB07CA83E807009DF8383003F0DC +:102860007F038DF83830039B1846019317F062F808 +:10287000BB1C8DF83B00019B2CD122461CA9304685 +:1028800007F05EF92BE0304606F0DAFD044600283A +:10289000ABD0284608F0DAFA204633B0BDE8F04362 +:1028A000FEF735BB9DF818309DF8282003F07F0314 +:1028B0009A4249D1222AC6D10BAA27A9304606F04E +:1028C00043F904460028E4D12F9B142BBBD06FF0B2 +:1028D0002604DEE722461CA9304607F002F804462B +:1028E0000028D6D1012305AA11A9304688F8553011 +:1028F00002AB07F049F804460028CAD188F8550011 +:10290000814605AA11A9304606F077FF0446002843 +:10291000BFD10237BDD09DF82830222BB9D11CAAD7 +:1029200028A9304606F0B9FC041EB2DB309B4A46AB +:102930001CA930462593319B26934B4606F011FE89 +:102940000446A6E73C46A4E76FF01404A1E70000A4 +:102950002DE9F04F00F1A4080646C3B00D464046ED +:1029600008F094FAD6F8903063B1002D08BF1D46E8 +:10297000336830469B6A9847044668B1404608F081 +:1029800065FA05E045B96FF01204404608F05EFABA +:10299000204643B0BDE8F08F2B6828469B68D6E9F7 +:1029A00025BAD6E92797984704460028E6D124227D +:1029B000014628A816F0CAF96A4B284623952493A5 +:1029C000694B2593694B2693694B27932B685B6A68 +:1029D00098472B6858452CBF2890CDF8A0B02846C2 +:1029E0009B6A98472B6850452CBF2990CDF8A4A02E +:1029F0002846DB6A98472B6848452CBF2A90CDF8BB +:102A0000A89028469B6B984723462A9A18F07AF894 +:102A10002B901F3023A920F01F00B84294BF2C90A8 +:102A20002C9731A806F02DF80446002840F0868047 +:102A3000319B014640985A6AD20816F087F9319ABC +:102A40000DA931A83C94D2E90832CDE93E439A421F +:102A500094BF3D923D9307F047F80446002869D1A2 +:102A600018A931A807F040F80446002862D10346AF +:102A7000024618A931A806F074FD0446002859D171 +:102A800041F22E438DF816001A9F4FF01009ADF851 +:102A900014300823DDF864C08DF81730319B33976C +:102AA000DA691B6A089209934FF00113314A0A93BD +:102AB0000BAB106851686A46CDF8C8C0CDF81090CD +:102AC000CDF8009003C334230DA931A8159320231A +:102AD000CDE906C7CDE916C705AF0193CDE902736D +:102AE000012306F03EFD4B4620B110F1340F02D019 +:102AF00004461FE00124009320236A460DA9039396 +:102B000031A8CDE90137012306F02BFD20B110F1EA +:102B1000340FEDD1002CEBD0002201230DA931A8F8 +:102B2000CDE900236A4606F00FF8044610B9319B40 +:102B30001B6A3F9331A805F08DFF6CB12046FEF76C +:102B4000E6F9044600287FF419AF33682946304679 +:102B50005B6A9847044611E72B682846DB6898476C +:102B6000EFE700BFA30E0008C70E0008EB0E000839 +:102B7000070F0008B9AB010870B500F1A4060546BF +:102B8000304608F083F9D5F8904064B105F114009F +:102B900005F060FFD5F890000368DB6898470023D4 +:102BA0000446C5F89030304608F050F9204670BD14 +:102BB0002DE9F04300F1A4070D46044699B03846CC +:102BC00008F064F9C4F890502B6828469B68984731 +:102BD000064648B10023C4F89030384608F036F96C +:102BE000304619B0BDE8F0832422014604F16C00A0 +:102BF00004F1580916F0AAF8404BA5652846E3658C +:102C000004F114083E4B23663E4B63663E4BA366BD +:102C10002B685B6A9847D4F8943083422CBFE366F4 +:102C2000E06628462B689B6A9847D4F89830834220 +:102C30002CBF2367206728462B68DB6A9847D4F8A7 +:102C40009C3083422CBF6367606728462B689B6B70 +:102C50009847626F334617F055FFA0671F30D4F8CE +:102C6000A030494620F01F00834294BFE367E0672D +:102C7000404605F006FF0546002833D1636902AAE5 +:102C80000DA940461B6AA664E364012302960393E0 +:102C9000C4E9106605F058FF054600BB202310224A +:102CA0000E994046009305AB05F041FF0546B0B9CB +:102CB000069B082215490BA8A361079BE36117F047 +:102CC0009FFB064648B90A9B1A0C012A02D19BB207 +:102CD000012B82D96FF0150501E06FF033054046F6 +:102CE00005F0B8FE00233846C4F8903008F0AEF87E +:102CF000284619B0BDE8F043FEF709B9A30E000855 +:102D0000C70E0008EB0E0008070F0008B9AB01085A +:102D10000C4B03F10802883310B50446026043608F +:102D2000FFF72AFFD4F8A40012F0CAFA064B204697 +:102D300003F108023433226040F8043F0FF032FB05 +:102D4000204610BD24AF0108BCAE0108A0F104006C +:102D5000FFF7DEBF10B50446FFF7DAFF204615F097 +:102D60008BFF204610BDA0F10400FFF7F3BF000069 +:102D7000F0B57E4D85B015F04FF97D4B00212860F0 +:102D80007C4800247C4A83F820401A605C62C3E9D6 +:102D900004014FF4F0100021C3E90144C3E9060126 +:102DA00013F0CAFD68B9754C23781BB914F01CFEEA +:102DB00001232370724B93F82520002A00F0BB807A +:102DC0005C6B704B14202A68C3E901240AF00AFDE9 +:102DD0004FF6FF71831E00F1120223F8021F934287 +:102DE000FBD1694B0025694C002618600027684814 +:102DF0000BF0B6FB00227B21664812F049FB002253 +:102E00007C21654812F044FB45210022634812F002 +:102E10003FFB6348634BA0612360C4E90267C4E9D8 +:102E200004550BF029FA0AF04FFD5F4A5F4B1A6018 +:102E30000AF036FD0123656384F838305C4BC4E941 +:102E40000867236013F092FD5A4B5B4C186015F035 +:102E5000E3F85A4B25611860594B236004F1440391 +:102E600002931023CDE900550393EFF30583002B64 +:102E700063D00020534B0025534E00931C23206445 +:102E8000684603930B2365670193029612F05CFA80 +:102E900044226065294606F1200015F057FF012302 +:102EA00020222946A387A6F13C00656115F04EFF5C +:102EB0004FF4805328214FF4D060C4E90B31434BC9 +:102EC000A361434CA56515F0CFFE064670B3C21C46 +:102ED00022F00302131A2846E260C3F5D06323F000 +:102EE00003031946C4E904556F1C002931D100B110 +:102EF000256100252262C4E9065325600BF090FA93 +:102F00000EF09AFF334B60600093334B25810293A0 +:102F10001023A57284F8245001950393C4E90A553F +:102F2000EFF30583CBB10020206366612B480BF0E3 +:102F300017FB05B0F0BD9C6B43E711F09DFD01460A +:102F4000002896D14FF6FF706A46DFF894C000DF84 +:102F500090E749083D460120C6E711F08DFD0028A5 +:102F6000E1D16846DFF87CC000DFDDE7480B0224D2 +:102F7000A806002400000208C8AD0108A00600242D +:102F8000B005002400000024D0060024B00B022469 +:102F900060060024740B0224280B0224040700247A +:102FA00064B101081CAE0108A9CF0008F00A022490 +:102FB0003CB00108700B022480130224E80A0224AA +:102FC000D8B00108C2AB0108D8130224DCAB010859 +:102FD00024130224F7AB010858130224200600240E +:102FE000953601085538010808B57246064B01258B +:102FF000D3E84F4FC3E8465FE4B2002EF8D10CB9D6 +:103000000AF0C0FC0AF008FE440B02240B4B10B57A +:10301000044640F8043BFEF70FFA094B002104F187 +:10302000140003F10802943322603822636015F023 +:103030008DFE4FF0FF332046236510BD00AF010821 +:1030400020AE0108144B10B5044640F8043BFEF7CF +:10305000F3F9124B002104F1140003F10802883344 +:1030600022604422636015F071FE0021382204F1D1 +:10307000580015F06BFE0022402304F1A400C4E9BF +:103080002423C4F898304FF40073C4E9273308F0C0 +:10309000F1F8204610BD00BF00AF010824AF0108C1 +:1030A00010B50446802112F025FA00212046BDE823 +:1030B000104012F01FBA08B5026500220B4600F15D +:1030C0003C0142654FF48072836482870269012A61 +:1030D000D2B208BFC3640068FDF71AFC002008BD27 +:1030E00008B5C0F8102200220B4600F5FE71C0F8AA +:1030F0001422A0F8FC210269C0F80832012AD2B2D9 +:1031000008BFC0F80C320068FDF702FC002008BDC3 +:103110000F4B00F16040DB6800F56140C3F3022310 +:1031200010B5C3F107041A1D042C28BF0424062A75 +:103130004FF0FF328CBF033B0023A24021EA020183 +:1031400001FA03F31B01DBB280F8003310BD00BFAE +:1031500000ED00E02DE9F8430546294F3C69FDF7F5 +:10316000F5FE022D0646274B26D1D7F81041264FF3 +:103170001C4044F00044DFF888804CF25039042FA2 +:103180001DD1D8F81000C0F3800070B934F00041B0 +:1031900022D01E4A002C936943EA04039361184B22 +:1031A00017DB5C610120BDE8F883FDF7CFFE801BD3 +:1031B0004845E4D90320F6E71C400427DBE7D8F8AC +:1031C000103127EA030313F0040F0CBF0120002085 +:1031D000DBE7C3F81411E5E7012D094B06D11A69A5 +:1031E000D103E0D54FF480325A61DCE7D3F81021E7 +:1031F000D203D8D54FF48032C3F81421D3E700BFEF +:10320000002000520000EE17040000804C0B022446 +:103210000D4B19884FF6FD734A1E92B29A4297BF22 +:103220000A4B4FF0026303EA812303F100638342F8 +:1032300007D9B0F1006F34BF4FF0FF304FF40030CA +:1032400070474FF0FF30704780E8F11F00FC3F00EF +:10325000064B4FF6FD711A88531E9BB28B429ABFE4 +:10326000034800EA82204FF40010704780E8F11F05 +:1032700000FC3F0038B5114CE36803F00703062B50 +:1032800006D0E06800F03F00163818BF012038BDB6 +:10329000E36823F03F0343F01603E360FDF756FEB7 +:1032A000054663689B0401D50020F0E7FDF74EFE5C +:1032B000401BB0F57A7FF4D90120E8E700480258B6 +:1032C00038B50C460546012120460CF06BF928B9AB +:1032D00021462846BDE838400DF095B838BD0000BD +:1032E00070B505460E4609B9114870BD0028FBD0DF +:1032F00000240160C0E901440B79053B012BF3D8A0 +:103300006C21012016F0C6FF686060B16C22214676 +:1033100015F01CFDB179022016F0BCFFA86020B9A1 +:1033200028460BF021FF0348DFE72046DDE700BF1A +:1033300000AFFFFF80AEFFFF38B50D4606490446DB +:10334000FFF7CEFF30B9294620462022BDE838409D +:103350000BF0AABE38BD00BF5CB10108034653E8BC +:10336000000F013843E80002002AF8D1704770B519 +:10337000056BE0B00446B5F5C07F1DD84FF4C072B0 +:103380000021684615F0E2FCE36B2A466946206C92 +:103390009847A0B9266B6946204632460BF007FFD6 +:1033A000054608B90123E3621EB1314668460BF0B9 +:1033B00061F9284660B070BD6FF00405F9E76FF061 +:1033C0000805F6E7F7B50093054690F894301446E3 +:1033D0000191DDE90867F3B1D6B13B68DBB10FF0CD +:1033E0003DF823462846DDE900210BF005F93B4670 +:1033F000324605F16801281DFEF7A2FE041E28468C +:1034000018BF012464420FF01FF8204603B0F0BD3E +:103410006FF00104F9E74FF0FF34F6E7074B5A6805 +:1034200090235343064AD358DA69120701D508227C +:103430001A62D869C0F34010704700BF900B022495 +:10344000F40C022410B586B004466846039180E867 +:103450000C0006A800E90C0010E90700034B84E803 +:1034600007002046E36006B010BD00BF1F7D0008C6 +:1034700070B5002385680446066803619DB93378FA +:10348000022B01D9B36A6BB933890BB9022070BD25 +:10349000B36AA361A3696561002BF7D0736B002049 +:1034A000E361F4E71D467389B2895A430CD129467A +:1034B000206806F0FCFB431C05460BD00128E5D92B +:1034C000B3699842F3D3E1E72946304606F0A5FBFD +:1034D000A061DFE70120DAE738B50446056804207B +:1034E000A169F9B1284606F0CAFBC0B9E3691A78A8 +:1034F000DAB1DB7AE52A03F03F03A37109D02E2A63 +:1035000007D00F2B05D023F02003082B01D000207B +:1035100038BD0021204607F0DBF90028E0D0002369 +:10352000A361F5E70028F2D0F9E70420F7E72DE9D9 +:10353000F04F87B006468B4617464FF001090DF154 +:10354000170ADDE910452544A3EB0408AC4201D17C +:10355000012011E008EB0403002259463046009395 +:103560003B46CDE901A905F0A3F928B914F8013BC0 +:103570009DF817209A42E9D007B0BDE8F08F2DE9F9 +:10358000F04F89B006468846DDF84C9005924BB95D +:103590004FF0FF32C9F80020149A0020136009B0E0 +:1035A000BDE8F08F013B07A900684FF0040A0793BC +:1035B00005F0B6F812A9054630680DF1140B05F0B8 +:1035C000AFF80746AF42059B03D3C9F80030129B02 +:1035D000E2E7EC1B95FAA5F241463046B4FA84F4D2 +:1035E000B2FA82F2C4F11F04944228BF1446A2002A +:1035F000CDE901BA0092002205F05AF90028CED197 +:10360000012303FA04F42D1BDCE72DE9F04700F158 +:10361000A4060D46814686B03046904607F036FC3B +:10362000EA6909F1140902F00303012B5AD092034D +:103630006B6903D52A6A934238BF1346984524D252 +:103640002946484605F028FC0446A8B905AB059074 +:1036500005F12C014846029305F11003CDE90083E2 +:10366000D5E90423FFF78BFF044628B9EB69C5F8B9 +:10367000148043F48033EB61304607F0E7FB2046CB +:1036800006B0BDE8F047FDF742BC2ED92F6ABB4219 +:1036900009D02946484605F0FFFB041E15D16B6989 +:1036A000002B24DB2B624FF0000A2B6A98450ED8C2 +:1036B0002946484605F0F0FB20B9381EB4BF6FF02C +:1036C0001500286200EAE074D6E7D5DBEBE70123BA +:1036D00005AA294648468DF814A005F047FC041EAB +:1036E000E3DAC9E76FF00804C6E70024C4E76FF027 +:1036F0001504C1E7184B2DE9F74353F82060002368 +:103700000C4617461D4698460B6033683046D3F882 +:103710003C905B6A98472A464346CDE90001304613 +:10372000C847A8B123682A46304647F83350336863 +:10373000196B4346884723682D1807EBC30348EBF2 +:103740000108586021680131B1F5707F2160DCD338 +:10375000002003B0BDE8F0830000002408B5044B4E +:10376000027853F8220003689B6A9847C0B208BDEC +:10377000000000242DE9F0431D4689B006460F469F +:103780006C1E9046FFF7EAFF044440420440E4B256 +:10379000202C1AD83046FCF7EFFF81462A464146D6 +:1037A000684615F0C5FA621B49460DEB050015F099 +:1037B000CDFA23466A4639463046FCF7E9FF003821 +:1037C00018BF012009B0BDE8F0834FF0FF30F9E7E2 +:1037D00007B58DF80710012381680DF107028039C4 +:1037E000FFF7C8FF03B05DF804FB07B5816801234C +:1037F00001AA40398DF80430FFF7BCFF03B05DF833 +:1038000004FB000013B5064B007853F8200000239A +:103810000468CDE900230A46E469A04702B010BD60 +:10382000000000242DE9F843037807460BB1012B73 +:1038300020D1114A2C214FF434664FF0000801FBCF +:103840000323926E9D6A56431C46013DE036636A2F +:10385000384603EBC50253F835101B68013DD2F81A +:103860000490C91AC8444A46FFF7CCFFB045EED3CE +:10387000BDE8F8830120FBE7200700242DE9F04391 +:1038800085B01E461B4B4FF0000803920746027896 +:103890000D4653F822400A4623682046CDE90068C9 +:1038A000D3F83C904346C847039958B9124B1B784C +:1038B0002BB133462A463978104807F001FD4FF006 +:1038C000FF3413E0236820462A46CDE90068D3F888 +:1038D00014904346C847044640B1074B1B782BB1B0 +:1038E00033462A463978064807F0EAFC204605B0F8 +:1038F000BDE8F08300000024E40A0224FEAB0108C6 +:103900002DAC01082DE9F7430446174699460E46AB +:1039100029B94FF0FF38404603B0BDE8F083002AD4 +:10392000F7D00B6938468D681D44042329460DEBFA +:103930000302FFF7A3FF80460028EAD1BDF8041078 +:1039400046F60812F368914222D1BDF8061099425A +:10395000DFD10423294438460DEB0302FFF78EFF25 +:103960000028D6D1BDF8042046F607139A42D0D1DC +:103970000023BDF80620A4F80890A372F3682B4436 +:103980000435E360134425616361C4E90067C2E75D +:10399000002BE7D0BDE700002DE9F04FDFF830B194 +:1039A000074688460026DFF820910BF16C0A2DEDC2 +:1039B000028B85B0CDE90223109BB34201D80020D1 +:1039C00011E0109B3846404A9D1B029BB5F5003F15 +:1039D00006EB030428BF4FF4003521462B46FFF7C2 +:1039E0004DFF28B1012005B0BDEC028BBDE8F08F82 +:1039F0003B78022B039B334408EE103A48D19BF8E6 +:103A0000A432002B3CD198F80030012B25D1039C27 +:103A10005846436913F00C0F1FD0344481688C4220 +:103A200005EB040E49D28E4517D9AEEB0103A1EB8D +:103A3000040C002200690844864503D9844234BF3F +:103A4000031B0023641A09EB0C015046CDE9002149 +:103A500004EB0C023946FEF794F998F80030022B7B +:103A60001DD19BF8A432D3B1002318EE102A414691 +:103A7000504600932B46CDF80490FEF782F90EE0F5 +:103A8000CDE900092B46224639465046FEF779F922 +:103A90003B78012BB7D198F80030012B0AD12B4687 +:103AA0004A4618EE101A4046FCF772FE002899D1DB +:103AB0002E4481E7029C0548ABE7621A2B464FF083 +:103AC000000C02F00F02B5E7E40A00244C070024C2 +:103AD000200700242DE9F74304460F4690461E4672 +:103AE0004FF6FF79D4E904239A4215D22368DB68A4 +:103AF00023B1E368934204BF0433236104232169A3 +:103B000060680DEB0302FFF7B9FE18BBA37A2569C5 +:103B100033B1E368AB4203D8012003B0BDE8F083C2 +:103B20002189BDF80630494503F1040203D0BDF8F0 +:103B300004C08C450BD116B1BDF80410318004359A +:103B40003D60A8F80030236913442361E5E715447C +:103B50002561C7E74FF0FF30DFE700002DE9F04FA8 +:103B6000ADF5557D17780D46144604934FF48E73CA +:103B70007B43C65C00EB030C002E40F00F824FF439 +:103B80008C7231460CF1040015F0E0F83223224625 +:103B9000294611A8FFF7B6FE10B14FF0FF3009E13A +:103BA000119B002BF9D0129B002BF6D033460DF160 +:103BB0001A0207A911A8FFF78DFF002840F0FA802C +:103BC000BDF81A30712BE8D143AA07992046FFF7B8 +:103BD00055FE0028E1D1A64C30232FAA08A808944E +:103BE0008A3421460DF008FE0028D6D108992F9B73 +:103BF0001944A14240F0FA8037AA08A83796FEF788 +:103C0000E8F8379B034340F0EE808EAB60AA214674 +:103C100008A80DF005FE002840F0E280619A072A0E +:103C200040F0DB809349629816F0EAFB002840F0F0 +:103C3000D4808F9A082A40F0CD808F49909816F052 +:103C4000DFFB002840F0C68004232FAA214608A8E5 +:103C50000DF0D2FD002840F0BA8030232FAA214673 +:103C600008A80DF0C9FD002840F0AE80379037AAB3 +:103C7000214608A8FEF7ADF8002840F0A280379B47 +:103C8000012B40F09E8004232FAA214608A80DF0A6 +:103C9000B3FD002840F09280DDF8BC80B8F1200F21 +:103CA00040F08680089B1FAC03F12005186808339C +:103CB00053F8041C2246AB4203C21446F6D100233B +:103CC000012260A8CDE98823CDE98A32CDE98C3381 +:103CD0000BF028FB7FA80BF019FB60A80BF0FFFD91 +:103CE00060A80BF01FFB032360A88DF880310BF058 +:103CF00021FC28B160A80BF0F2FD7FA80BF0DDFDE0 +:103D0000412343AA7FA960A80BF086FE002870D04B +:103D100060A84FF0FF340BF0E2FD7FA80BF0CDFD63 +:103D20008BA80BF0B7FD88A80BF0B4FD60A80BF0D2 +:103D3000D6FD7FA80BF0C1FD002C7FF42EAF0DF156 +:103D40009C09214620220F944846CDE90D4414F0E9 +:103D5000FDFF49460DA8FFF7EFFA28BB202217A95F +:103D60000DA80BF091F9F8B92FA90DA80BF062F985 +:103D7000D0B901233025A246DFF804B18DF82830F0 +:103D80002FA90DA80593CDF83CA0CDE90DAAFFF70A +:103D9000D3FA48B9059B002B62D0102259460DA8D2 +:103DA0000BF072F900286DD00DA80BF0DDF9F4E6E8 +:103DB0006FF00B000DF5557DBDE8F08F6FF00A0038 +:103DC000F8E76FF00900F5E76FF00800F2E76FF031 +:103DD0000700EFE76FF00600ECE76FF00500E9E79A +:103DE0006FF00400E6E76FF00200E3E76FF0010018 +:103DF000E0E77FA960A80CF033FE002888D12022DC +:103E00001FA98BA80BF0D2FD8EA80BF07FFA8BA90F +:103E100060A80BF029FC0446B8B97FA960A80CF093 +:103E20001FFE044688B97FAB8BAA8EA960A8FDF758 +:103E3000A5FD044648B9014694A80BF0DEFA68B126 +:103E40008EA988A80BF08EFE04468EA80BF035FDD7 +:103E5000202217A988A80BF0E5FA61E7074CF4E7E0 +:103E600020228EA90DA80BF00FF9002895D09BE712 +:103E700000040008F0B0010800B1010880B0FFFFA5 +:103E80005BAC010801220AA90DA80BF0FDF800287F +:103E90008AD18EA90DA80BF0CDF80346002883D156 +:103EA00037AA202D02EB040028D90DF50E7C03461D +:103EB0000DF5167E6246083303CA724543F8080CB6 +:103EC00043F8041C9446F5D1203DADB29DF828304E +:103ED00020340133A4B28DF828300023002D7FF464 +:103EE0004FAF0DA80BF040F93BA90AA80C95CDE9FE +:103EF0000A55FFF721FA48B10AA856E72A468EA9C3 +:103F0000059314F015FF059B1D46DFE70DF26D14B8 +:103F100010220AA821460BF0B7F80028ECD12FA9EF +:103F20000AA80BF087F80028E6D12FAB53A913F8A5 +:103F3000012BB8F1010811F8010F82EA000246EAEC +:103F40000206F4D1002ED7D10AA80BF00DF93146A4 +:103F50004FF48C728EA814F0F9FE37A98EA8FDF7E5 +:103F60006BFF00287FF419AE102531460DA82A46B4 +:103F700014F0ECFE049B09AA294605FB07378EA81E +:103F80000DABCDF800900C370996CDE901470DF047 +:103F9000A5FC003818BF012040420BE7012009E7CB +:103FA0002DE9F04F1378ADF50F7D82460D46012BBC +:103FB00093460DD14B6913F00C0F09D090F81C31CA +:103FC00033B94FF0FF3108460DF50F7DBDE8F08F96 +:103FD000402200216DA8DFF8A88214F0B7FEA14AA4 +:103FE000A14B0024AF682E69DFF898923E44DFF8B9 +:103FF00098E2DFF898C29D489D497D94CDE96B23F6 +:10400000EB68F318CDE96598CDE90239CDE9048E66 +:10401000954BDFF864820A93CDE96344CDE967EC00 +:10402000CDE96901CDE906C0CDE90812029BA342A2 +:1040300042D829A963A80AF003FF29464FF6FF7367 +:104040005A4623A8FFF75EFC01460028BBD14FF07B +:10405000FF35884E0746DFF838922C4606F15B089C +:10406000239B002BADD0249B002BAAD00DA90DF1D2 +:1040700032030CAA23A8FFF72DFD011EA3DB40F09D +:104080005682BDF83230102B59D1BDF83070202F38 +:1040900097D10D993B4643AA5846FFF7EFFB0146DF +:1040A000002890D143A93A4629A816F0A9F901465B +:1040B000002888D10127D3E7029BA3EB0409B9F5B7 +:1040C000807F28BF4FF48079A74205D904EB09030C +:1040D0009F4238BFA7EB0409A64205D904EB0903A8 +:1040E0009E4238BFA6EB040921464B46624A584619 +:1040F000FFF7C4FB014600287FF465AF9BF8003052 +:10410000012B12D16B6913F00C0F0ED0A7420CD803 +:10411000A6420AD9E21B59465046CDF8048002F067 +:104120000F0300934B46FDF72CFEB9F1000F04D0AE +:104130004A46414663A80AF01DFE4C4476E7012B2F +:104140003DD1BDF83030202B3FF63BAF0D9943AA4F +:104150005846FFF793FB014600287FF434AF9DF8E3 +:104160003050202D7BD8402202906DA814F0EEFD37 +:10417000039B02995B22659363A8049B7D916693E0 +:10418000059B6793069B6893079B6993089B6A93BB +:10419000099B6B930A9BCDE9631131466C930AF03E +:1041A000E9FD3AA963A80AF04BFE2A4643A93AA8BA +:1041B00016F026F9003818BF0120454250E7222B9F +:1041C0007FF44EAF002D7FF44BAFBDF83030802B25 +:1041D0003FF6F7AE43AC0D9958462246FFF74EFB2B +:1041E000014600287FF4EFAE302331AA41460EA8E5 +:1041F000BDF830A00E960DF0FFFA70BB319B3AAAC5 +:104200000E9D0EA81D4463AB29460DF009FB20BB93 +:104210003B9A072A21D149463C9816F0F1F8E0B9BB +:10422000649A082A19D11549659816F0E9F8A0B9D9 +:10423000032331AA29460EA80DF0DEFA68B9319A97 +:104240005AB1511E0E9B3191187830B9581C134445 +:104250009D420E9001D141291CD04FF0FF344FF008 +:10426000FF35FDE6ABD9831F19CDE05B7F520E51C0 +:104270008C68059B00030008F00B022409B10108BB +:1042800085AE67BB67E6096A72F36E3C3AF54FA5E7 +:10429000F8B0010863A801250BF044F8002385A8B5 +:1042A0008493CDE982530BF031F80E99A24B63A8A9 +:1042B0000B915B1A02930BF012FB63A80BF032F820 +:1042C000032263A88DF88C210BF034F9029B0B9923 +:1042D00058B14FF0FF3463A80BF001FB82A80BF03C +:1042E000D9FA85A80BF0E9FAB9E70A4663A885A9C7 +:1042F0000BF092FB0028ECD185A963A80CF0B0FB71 +:104300000028E6D1A244302310AA0F945146CDE9EB +:104310001150CDE91305CDE915000FA80DF06CFA89 +:1043200060B1A0F59F4411A80BF0B4FA14A80BF0EB +:10433000B1FA201E18BF01204442CCE7DDE90F325C +:1043400013449A4540F0F18011AA51460FA80DF090 +:10435000B2FA044630B914AA51460FA80DF0ABFAD0 +:10436000044610B1A4F59F44DDE731A80AF0CEFF62 +:104370009DF88C31092BCDE91754CDE91945CDE9CC +:104380001B44CDE91D54CDE91F45CDE9214401D1A0 +:104390006A4CC8E7789B002BFAD0012111A80BF0DA +:1043A0002CF8002817DA664C31A80BF086FA17A80B +:1043B0000BF070FA1AA80BF06DFA1DA80BF06AFA50 +:1043C00020A80BF067FA002CADD10F9A5D4B9245F7 +:1043D00018BF1C46A7E776A911A80AF0CBFF002852 +:1043E000E1DA012114A80BF008F80028DBDB76A93C +:1043F00014A80AF0BFFF0028D5DA7A9D29A917A8CA +:104400000735ED08202D28BF20252A460BF0CEFACF +:1044100004460028C8D17A9BE900B3EBC50F3DD311 +:1044200076A917A80AF0A6FF002807DB17A976AA25 +:1044300008460CF054F804460028B5D176AA14A911 +:104440001AA80CF0E3FE04460028ADD11AAA17A959 +:104450001DA80BF0C9FB04460028A5D11DA976AA0A +:1044600008460CF006F9044600289DD11AAA11A9A5 +:1044700020A80BF0B9FB0446002895D120A976AA04 +:1044800008460CF0F6F8044600288DD163A80AF01F +:1044900067FF01280AD0A4F59D4485E7C91A17A82B +:1044A0000BF04AF904460028BAD07DE73AA80AF092 +:1044B0002DFF6DAB1DAA3AA963A8FDF721FC0446A8 +:1044C000A0B985AB20AA31A963A8FDF719FC044661 +:1044D00060B931AB3AAA63A819460CF06BFD0446EB +:1044E00020B931A963A80DF065F804463AA80BF08D +:1044F000E4F9002C7FF458AF214637A80AF07DFF7D +:1045000000283FF450AF31A976AA08460CF0B1F864 +:10451000044600287FF448AF11A931A80AF02AFF09 +:10452000044600283FF440AF3DE7074CFBE6002F70 +:1045300014BF2146012146E55B03000880B0FFFF60 +:1045400000B2FFFF00B4FFFF1AB0FFFF0278074977 +:1045500051F822304BB1013B41F822302BB9044BCA +:1045600053F822000368DB6818477047F005002401 +:1045700000000024224B00EB4002012803EB8202E2 +:104580002DE9F04104460A6025D0022826D048BB18 +:104590001C4A5A601C4F002557F82420013247F866 +:1045A00024200C22624303EB02089C54174B88F82A +:1045B000015053F82460336830469B6B984757F896 +:1045C0002430C8F80800012B17D1336830469B68A7 +:1045D000BDE8F041184700221A61DBE74FF0106296 +:1045E000DA61D7E70A4B1B781BB10146094806F090 +:1045F00067FE4FF0FF30BDE8F0812846FBE700BFC3 +:10460000FC05002400000208F0050024000000243E +:10461000E40A02246CAC010873B5044601A9C0B2D7 +:10462000FFF7A8FF054620B14FF0FF35284602B03E +:1046300070BD0198FCF7A0F806460198FFF786FFC9 +:104640002C23064803FB0404631E0334A342EDD06D +:1046500013F8012FB242F9D0E6E700BF200700248B +:1046600013B5002001A9FFF785FF014610BB2023E9 +:10467000134A0198FFF702F9041E18BF012401989C +:10468000FFF764FFD4B901A90120FFF773FF98B9C0 +:10469000214620230B4A0198FFF7F0F8041E18BFAB +:1046A00001240198FFF752FF0CB184F00104204669 +:1046B00002B010BD0124E2E70124F2E70024F4E790 +:1046C000200700244C07002413B5002001A9FFF7A0 +:1046D00051FF90B9019801236A4681688DF8003036 +:1046E000403921F01F012039FFF744F804460198B2 +:1046F000FFF72CFF204602B010BD0124FAE70000AE +:10470000F7B504460F46C0B26946FFF733FF30B134 +:1047100001250098FFF71AFF284603B0F0BD1B489B +:104720002C2303FB040400982369A6681E44042379 +:1047300031460DEB0302FFF7A1F805460028E7D14B +:10474000BDF8042046F60813E4689A421AD1BDF871 +:1047500006309C4201D00325DBE704233119009881 +:104760000DEB0302FFF78AF80028D1D1BDF8042031 +:1047700046F607139A42EED1BDF80630234433447F +:104780003B60C6E7002CF1D0E5E700BF200700241E +:104790002DE9F04186B002230546002601AFDFF87F +:1047A0005880ADF80430294617F8010BFFF7E2FEF8 +:1047B000044658B92868102302AA81682039FFF7F7 +:1047C0005DF8044640B12868FFF7C0FE204606B0F9 +:1047D000BDE8F0810126E6E71022414602A815F067 +:1047E0000FFE04460028F1D02868FFF7AFFE002E28 +:1047F000F0D04FF0FF34E9E7E0B0010838B54FF4EE +:104800008E7405464C4302EB011120440C310430F8 +:10481000FDF712FB0028034613BF002201220346C6 +:104820004FF0FF332A55184638BD00002DE9F743F5 +:1048300004460F46C0B201A9FFF79CFE002863D1D1 +:104840002046FFF7E9FE30B1314E2C2505FB04650B +:104850006B69DA060DD50CB9012503E025460198F0 +:10486000FEF7E0FF0198FFF771FE284603B0BDE8B0 +:10487000F083DDF8048098F80090B9F1010F2AD098 +:10488000244829464246FFF78BFB05462C23019816 +:104890006343F158F218204B99420AD11369926888 +:1048A000D1438B4205D813448268934201D2002D34 +:1048B000D8D01CB182680021FEF7A4FF174B1B78EB +:1048C000002BC9D0164B17491748002C18BF1946A2 +:1048D00006F0F6FCC0E713F00C0FD1D03B46424681 +:1048E000294606F16C00FFF739F9002802DA4FF08B +:1048F000FF35CBE7C4D13A46494606F16C00FFF7D5 +:104900007DFF0028BCD0F2E74FF0FF35ADE700BFD8 +:10491000200700248C0700243DB8F396E40A022403 +:1049200096AC01088EAC0108A0AC010838B50C4665 +:104930001546FBF721FF2544214611F8013B98421B +:1049400003D1A942F9D1012038BD0020FCE738B5D8 +:104950000C460123114605462246FEF78FFF00282C +:1049600010DB4CB1012221462846FFF7DFFF18B1CA +:1049700003230020237038BD2378012B0CBF0123B3 +:104980000223F6E70120F6E78168F0B589B0A1F1CE +:1049900020060546FBF7F0FE0B4B07466C460FCB97 +:1049A00084E80F00102239460DEB020014F0CEF916 +:1049B0002023224631462846FBF7EAFE003818BF7E +:1049C000012009B0F0BD00BFE0B0010830B5002300 +:1049D00087B00D468168059302AA20390446CDE9C7 +:1049E0000333FF2302931023FEF748FF002811DB57 +:1049F000102202A92046FFF799FF68B103232B700C +:104A00000DF10702A168012320468039FEF736FF29 +:104A100000280BDA01202CE01022174902A815F01B +:104A2000EFFC002814BF02230123E8E79DF80730BC +:104A30000DF10701204603F00F021B096A700122E5 +:104A40002B71FFF773FF10B96B78042B03D9012387 +:104A50006B7000232B71A268A91C2046603AFFF7F7 +:104A600076FF0028D6D1A268E91C2046403AFFF71D +:104A70006EFF07B030BD00BFE0B001081FB50020D9 +:104A800001A9FFF777FDA8B902A90198FFF79EFFDA +:104A9000044668B99DF80B30032B03D10198FEF74B +:104AA000A4FE04460198FFF751FD204604B010BD56 +:104AB0000124F7E70124F8E713B50C46C0B201A9B9 +:104AC000FFF758FD50B921460198FFF77FFF0446D4 +:104AD0000198FFF73BFD204602B010BD0124FAE724 +:104AE00030B585B00D460446012002A9FFF7E4FF6A +:104AF000E979012902D02046FEF76AFE9DF80B30C5 +:104B0000012B02D12046FEF770FEAB682046A1685B +:104B100001930423A0390DEB0302FEF72BFE2A4676 +:104B200000212046FBF748FE2A4601212046FBF7DC +:104B300043FE2046FFF728FF002005B030BD0428C3 +:104B400009D0052803D1481E18BF01207047431A19 +:104B50005842584170470120704710B50446FEF78F +:104B6000FDFD4FF43462A368E03B02FB103010BD42 +:104B700030B583798DB00546002B03A914BF022000 +:104B80000020FFF7F7FC60BB0398FFF7E6FF164B2A +:104B900029799A6E01392B6802EB4204013B4A43A2 +:104BA00004FB03231C180398FEF7D8FD019003981B +:104BB000FBF7E2FD2022014604A814F0C7F82A7989 +:104BC0002146019B8DF8102004AA0398FBF7E0FD15 +:104BD000041E18BF01240398FFF7B8FC20460DB04F +:104BE00030BD0124F7E700BF200700242DE9F04F76 +:104BF00004468DB000206379012BCDE9040040F01C +:104C000093812368012B40F08F812379012B40F0A1 +:104C10008B81B94DB94E2A68B24202D105A9FFF77E +:104C20006FFD6B6913F00C0F00F0B981B249234698 +:104C30002A6A01F16C00FEF791FF014618B922467D +:104C4000AF48FFF7DBFDEB6AB34203D104A90120B3 +:104C5000FFF756FD2B6C13F00C0F00F0A781A9494C +:104C60002346EA6C01F14000FEF778FF20B92246A6 +:104C70000121A348FFF7C2FD95F88831ABB104F1DB +:104C80002C0204F11C03114653F8040B934241F823 +:104C9000040BF9D14FF48C7200219B4814F056F8A4 +:104CA000224602219648FFF7A9FDDDE9043293422E +:104CB00088BF0593059BA3608F4D002305996E6AFD +:104CC0001A462F6D18469A46A846914201D89A4234 +:104CD00005D206EBCA050AF1010A6D682A44994219 +:104CE00002D8934280F08D8107EBC005914200F11C +:104CF00001006D682B44ECD89942E6D89A42E4D181 +:104D0000D1464FF0000B814B5D460BF1010B1B7838 +:104D10002BB10AF1010259467D4806F0D1FAD8F8C4 +:104D20005830D8F8242099680023101D1F4650F8E9 +:104D300039303B44994203D3B9F10109F6D21F46F9 +:104D400021684B1EAB4200F24A8109F10100136851 +:104D5000D8F8685052F83060D8F82800F61A0138B0 +:104D600007EB060C52F83020D31A9C4540F22581FF +:104D70004FF434636FF0DF02012903FB15253D4436 +:104D800040F01C817B1B18BF0123A37106A90020E2 +:104D9000FFF7F0FB07A90120FFF7ECFB08A90220B1 +:104DA000FFF7E8FB2379012B40F00A8108980021E6 +:104DB0008268FEF727FD2368012B13D1214608984E +:104DC000FFF78EFEA3796BB906980393FEF72AFDD1 +:104DD00021460698FFF784FE0898039B82681946CF +:104DE000FEF710FD002332460095DDE90701FEF7CE +:104DF000D3FD2046FFF7BCFE0223237118B1454ABC +:104E00001368013313603A4631460798FEF7FAFCFF +:104E1000334632460095DDE90601FEF7BDFD236805 +:104E2000012B04D1A37913B90798FEF7FBFC2046A8 +:104E3000FFF79EFE0323237118B1364A136801332E +:104E400013603A4631460698FEF7DCFC33460022F2 +:104E5000069908980095FEF79FFDA379002B39D09D +:104E60000898FFF77AFED8F86830024606995B008A +:104E7000089800937319FEF78FFD18B1254A13683F +:104E8000013313600AA90898FFF7A0FD9DF82B30A5 +:104E9000012B02D10698FEF7A8FC9DF829100129E4 +:104EA00002D00698FEF794FC069809AAA3688168C8 +:104EB00009930423A039FEF75DFC224600210698E1 +:104EC000FBF77AFC224601210698FBF775FC069851 +:104ED000FFF75AFD0023A5792046A371FFF748FE8E +:104EE00023680133236001232371A8B1094A1368A1 +:104EF0000133136010E000BF200700243DB8F39693 +:104F00008C0700244C070024C8090024E40A02246A +:104F1000C6AC0108E00A0024002D57D03A46002113 +:104F20000898FEF76FFC51E00AA8FFF731FC50B972 +:104F30000A98042304F108028168A039FEF79EFC58 +:104F40000A98FFF703FB04F11C05A3680026394FFC +:104F5000A94604F12C0805930AA85FFA86FAA5F180 +:104F6000100BFFF715FC68B90A9810235A468168A0 +:104F7000A1F1A00C711CACEB4111FEF77FFC0A986B +:104F8000FFF7E4FA5A4612F8013BFF2B3DD1954258 +:104F9000F9D11035002E7FF48FAE0126DCE7102208 +:104FA000FF2104F10C0013F0D1FE4CE61022FF218A +:104FB00004F11C0013F0CAFE77E63D460023E4E648 +:104FC000022B3FF420AF032B3FF43BAF0698FFF7D3 +:104FD000BDFA0798FFF7BAFA0898FFF7B7FAB9F1E0 +:104FE000FF3F7FF490AE144B1968002905DD134B89 +:104FF0001B7813B1124806F063F900200DB0BDE82C +:10500000F08F91427FF67AAE63E6224651463846EB +:10501000FFF7F4FB002EBCD04B46424653F8041B6E +:10502000434542F8041BF9D1224602213846FFF7D6 +:10503000E5FBAEE78C070024E00A0024E40A022422 +:10504000DEAC0108F0B593B004460846164604A944 +:105050001D46FCF7CBFF48B92B6804A920460E93E8 +:10506000FCF7F9F8074618B14FF0FF3013B0F0BD68 +:10507000FBF76CFF94F8402003462568012AF3D023 +:10508000012284F8402094F84120012AD0B243D173 +:105090006764002E3BD0122284F841202A69013235 +:1050A000E2622A69666241F288360132A2626A6966 +:1050B00022F040626A61E26AA2B90122022120461E +:1050C0000096FCF7A1F810B923680222DA600123E8 +:1050D00084F841300023C01A84F8403018BF012002 +:1050E0004042C3E701220421204600960393FCF7C7 +:1050F0008BF80028EBD1626A039B127885F8202098 +:10510000626A01326262E26A013AE262D3E7636C88 +:1051100043F008036364DDE70220DBE72DE9F04795 +:105120001C4690B090F894300546DDF86890DDE9B3 +:1051300018A8CDE9002163B30DF090F94FF0FF33CB +:1051400028462E1D05F16807DDE9002109F054FA13 +:1051500014B1BAF1000F23D1B8F1000F02D0B9F1A8 +:10516000000F19D102A93846FCF740FF044638B9B0 +:10517000012302A9CDE90B033046FCF76CF808B116 +:105180004FF0FF3428460DF05FF9204610B0BDE81F +:10519000F0874FF0FF34F8E79CB1BAF1000F10D060 +:1051A000224602AB39463046CDF808A0FFF74AFF49 +:1051B00004460028E4D1B8F1000FE3D0B9F1000FA4 +:1051C000E0D002AB424639463046CDF80890FCF7B5 +:1051D000B7FF041E18BF01246442D3E700B5564B45 +:1051E0008DB00A2800F2A480DFE800F00616243211 +:1051F000404E5C6A78869400D3F8E0204F4842F035 +:105200000102C3F8E020D3F8E03003F0010301937A +:10521000019B0DB05DF804FBD3F8E020484842F054 +:105220000202C3F8E020D3F8E03003F00203029357 +:10523000029BEEE7D3F8E020424842F00402C3F8B4 +:10524000E020D3F8E03003F004030393039BE0E78E +:10525000D3F8E0203C4842F00802C3F8E020D3F83D +:10526000E03003F008030493049BD2E7D3F8E02076 +:10527000364842F01002C3F8E020D3F8E03003F0E3 +:1052800010030593059BC4E7D3F8E020304842F0B3 +:105290002002C3F8E020D3F8E03003F020030693A7 +:1052A000069BB6E7D3F8E0202A4842F04002C3F854 +:1052B000E020D3F8E03003F040030793079BA8E712 +:1052C000D3F8E020244842F08002C3F8E020D3F86D +:1052D000E03003F080030893089B9AE7D3F8E020BE +:1052E0001E4842F48072C3F8E020D3F8E03003F4A3 +:1052F00080730993099B8CE7D3F8E020184842F4A7 +:105300000072C3F8E020D3F8E03003F400730A938E +:105310000A9B7EE7D3F8E020124842F48062C3F88B +:10532000E020D3F8E03003F480630B930B9B70E72D +:105330000D4808F091FC00BF0044025800000258DC +:105340000004025800080258000C025800100258CD +:105350000014025800180258001C0258002002587D +:1053600000240258002802580BAD010838B5431C30 +:105370000D4628D000F00F02134BC0F3031053F872 +:105380002240FFF72BFF1149114BD1F894209A428C +:10539000FBD104FB04F2016802EB42030B40B3FBB8 +:1053A000F2F3013B012B03D8436823EA0403436073 +:1053B000012D21460CBF2A460022FBF781FA034B40 +:1053C0004FF440725A6138BD1CB1010800640258A4 +:1053D0000003008038B5044608F0AEFB0C490D4BC5 +:1053E000D1F894209A42FBD1D4E905035B430268CB +:1053F00003EB430522EA0502134303604FF44073B5 +:10540000B4F910004B610021BDE83840FFF7AEBF92 +:1054100000640258000300802DE9F843461C05464D +:105420000C4600F09C801FFA80F9554A40F47061E8 +:10543000B2F90030581C4BD10026524B09F00F0234 +:10544000C5F3031053F82270FFF7C8FE4E494F4BC7 +:10545000D1F894209A42FBD107FB07FCC4F38312D6 +:1054600083680CEB4C0E0F2A6FEA0E0114BF02FB8F +:105470000CF243EA0E034FF4407E1CBF0B40134373 +:1054800004F007028360022A3F4BC3F814E036D1D0 +:105490000EF1004ED3F89480F045FBD119F0080FBF +:1054A000C4F383285DD03B0AD0F824E05B435B4320 +:1054B000C3EB031903FB08F32EEA090E4EEA0303BC +:1054C0004362314B4FF4407EC3F814E002231EE0E8 +:1054D00043F470638B4210D104F003035668032B2E +:1054E000ABD109F47063B3F5706FA6D13246214693 +:1054F0002846BDE8F843FBF7CFB9083298E7032AFE +:105500003CD002F1FF3EDEF1000343EB0E03DFF877 +:105510007890DFF878E0D9F89480F045FBD1D0F8A6 +:1055200000E003FB0CFC013A01EA0E01012A41EA0A +:105530000C01016005D8436822074CBF3B43BB43C5 +:105540004360C4F301123946FBF7BAF932462146EB +:105550002846FBF7A1F90C4B4FF440725A61BDE8A5 +:10556000F8830CFB0CF9036AC9EB091E23EA0E0E43 +:1055700009FB08F34EEA03030362A2E71346C6E7FA +:1055800080AD01081CB101080064025800030080CE +:10559000034BD9681A6822EA01021A605960704701 +:1055A00000650258124B1A69194602F03802102A97 +:1055B0001AD004D8BAB1082A16D00B6814E0182AF9 +:1055C000FBD19A6A996AD86A11F47C7F586B0BD028 +:1055D00002F00302012A02D0022A00D01A681B6BD3 +:1055E000034B1B6B00E01B68014B9A699B6970477A +:1055F000004402582B4BD3F8882042F47002C3F8C1 +:1056000088201A6942F010021A61274A136803F0D1 +:105610000F03062B05D8136823F00F0343F007038D +:105620001360224B1A6842F001021A6000221A61CC +:105630001F4A19680A401C491A600A68120705D5F2 +:105640000A6822F00F0242F007020A60002219499C +:105650009A61DA611A6299621749D9621749196326 +:105660005A639963DA6319645A64196821F48021D2 +:1056700019601A66124A536A43F480435362114B0D +:105680001B681B0C1B04B3F1005F02D20E4B0122FE +:105690001A600E4B43F2D2021A600D4A014B9A6017 +:1056A000704700BF00ED00E00020005200440258A7 +:1056B0007FEDF6EA000202020000FF018002010114 +:1056C000C00000580010005C0881005100400052EA +:1056D000000000080A4B013B0FD00269002AFADAE9 +:1056E0000369074A43F001030361013A05D00369E6 +:1056F00013F00103F9D1184670470320704700BF2B +:10570000410D030030B5056C00F530630F4CA54228 +:1057100003D9D0F8004B002C16DB002401291C61B2 +:105720001C6944F400241C611C6944F018041C61C9 +:105730001C6944F0C0441C6106D15A61D0F8003B9A +:1057400043F08023C0F8003B002030BD0A30544FA6 +:10575000D0F8003E23F00303C0F8003ED0F8043830 +:1057600043F00203C0F804380020704770B50023EE +:10577000940800F5805502F00302A34214D301EB14 +:1057800084017AB100F5805000230468D80024FA1F +:1057900000F0C854013398B28242F7D1013A92B274 +:1057A00001321144084670BD2E6841F82360013370 +:1057B000E3E770B50E78012500F5006206F00F03EF +:1057C00074019D404B78012BD36917D11D4300F51F +:1057D0001060D56103591A040ED48A680559C2F3C2 +:1057E0000A03CA782B4343EA824343EA865343F0D1 +:1057F000805343F400430351002070BD43EA054544 +:1058000000F53060D56103591B04F5D48B6802594B +:10581000C3F30A031343CA7843EA8243E7E700006D +:105820002DE9F8430668054616F0006609D0836E38 +:10583000B3F5001F2ED013D8F3B1B3F5801F21D0DC +:1058400001262B68DB0540F10281AB6D042B00F2D1 +:10585000FD80DFE813F024002B00F500290029006B +:10586000B3F5401FECD1B84A0026A96E136D23F49E +:1058700040130B431365E4E7B34AD36A43F40033A0 +:10588000D362F0E702210430FBF746FC064600280D +:10589000D7D1E8E702212430FBF7C6FBF6E7AA4A96 +:1058A000D36A43F40033D362344604E00021281D58 +:1058B000FBF732FC0446002C40F0CB80A24AA96DD5 +:1058C000136D23F007030B4313652B689F050DD55C +:1058D000EB6D802B00F0DA8000F2BD80002B00F031 +:1058E000C980402B00F0CC80012634462B68580537 +:1058F00010D5D5F8A830B3F5800F00F0EC8000F299 +:10590000CD80002B00F0DB80B3F5001F00F0DD80C0 +:10591000012634462B68190510D5D5F8AC30B3F103 +:10592000007F00F0FD8000F2DE80002B00F0EC80B4 +:10593000B3F1807F00F0EE80012634462B689A0197 +:105940000DD5AB6C202B00F0078100F2F180002B0D +:1059500000F0F180102B00F0F980012634462B680E +:10596000DB040FD52B6EB3F5005F00F0198100F258 +:10597000FB80002B00F00881B3F5805F00F00A8106 +:10598000012634462B689F040FD56B6EB3F5003F9C +:1059900000F0268100F20C81002B00F01281B3F59B +:1059A000803F00F01781012634462B68580410D53B +:1059B000D5F8B030B3F1005F00F0338100F2188108 +:1059C000002B00F01E81B3F1805F00F024810126DE +:1059D00034462B68590114D5EB6C43B1B3F5807F85 +:1059E00040F027810121281DFBF796FB0446002C7F +:1059F00040F02281544AE96CD36C23F480730B434A +:105A0000D3642B681A040DD52B6FB3F1805F00F0BF +:105A10001581B3F1005F00F01F81002B00F01381AE +:105A2000012634462B68DB0140F12C816B6C032B83 +:105A300000F26C81DFE813F01D01180164011D0103 +:105A4000002105F12400FBF7EFFA33E70126344685 +:105A50003BE7264639E7C02B03D0B3F5807F7FF4C0 +:105A600043AFCCB9384AE96D136D23F4E0730B43AF +:105A700013653BE7344AD36A43F40033D362F0E75B +:105A80000021281DFBF748FB0446EAE7002105F149 +:105A90002400FBF7C9FAF7E7264627E7B3F5C00F5E +:105AA00003D0B3F5000F7FF433AFD4B9264AD5F84D +:105AB000A810936D23F460030B4393652AE7224AF1 +:105AC000D36A43F40033D362EFE70021281DFBF7CC +:105AD00023FB0446E9E7002105F12400FBF7A4FAC3 +:105AE000F7E7264616E7B3F1407F03D0B3F1806FA6 +:105AF0007FF422AFD4B9144AD5F8AC10936D23F0DB +:105B0000E0630B43936519E70F4AD36A43F400330C +:105B1000D362EFE70021281DFBF7FEFA0446E9E710 +:105B2000002105F12400FBF77FFAF7E7264605E799 +:105B3000302B7FF412AFACB9034AA96CD36C23F0BD +:105B400030030B43D3640AE7004402589B4AD36AEC +:105B500043F40033D362EEE70221281DFBF7DCFAA1 +:105B60000446E8E72646FAE6B3F5405F03D0B3F50E +:105B7000804F7FF405AFCCB9904A296E136D23F4A2 +:105B8000E0430B431365FDE68C4AD36A43F40033CC +:105B9000D362F0E70021281DFBF7BEFA0446EAE7CE +:105BA000002105F12400FBF73FFAF7E72646E9E676 +:105BB00023F48032B2F5802F03D0B3F5403F7FF459 +:105BC000F2AE9CB97D4A696E136D23F4E0230B435A +:105BD0001365EAE60121281DFBF79EFA0446F0E76B +:105BE000012105F12400FBF71FFAF7E72646DCE662 +:105BF00023F08052B2F1804F03D0B3F1405F7FF4C5 +:105C0000E6AEA4B96D4AD5F8B010936D23F0E04329 +:105C10000B439365DDE60121281DFBF77DFA044661 +:105C2000EFE7012105F12400FBF7FEF9F7E726462F +:105C3000CFE601263446E4E62646E2E65F4AD36A2A +:105C400043F40033D3626CB95C4A296F136D23F0BF +:105C500040530B431365E5E60121281DFBF75CFA71 +:105C60000446F0E72646DDE6544AD36A43F400339F +:105C7000D362002C4DD1514A696CD36C23F00303DD +:105C80000B43D3642B685F024DD54D4F3B6843F403 +:105C900080733B60FBF75AF980463B68D8053AD5DC +:105CA000002C6CD1454BD5F8B4001A6F424012F469 +:105CB000407F0BD01A6F196F22F4407241F480318B +:105CC0001967196F21F4803119671A67B0F5807F61 +:105CD00040D0D5F8B430394903F44072B2F5407F72 +:105CE00049D10869374A20F47C5002EA1312024372 +:105CF0000A61C3F30B03314A116F0B43136712E0C0 +:105D00000221281DFBF708FA0446B2E701263446B3 +:105D1000B8E72646B6E7FBF719F9A0EB08006428B8 +:105D2000BBD9032634462B68DA0708D5EB6F102B56 +:105D30003CD026D85BB3082B32D0012634462B68E2 +:105D40009B074ED5AB6F052B61D8DFE803F0423DD2 +:105D50005A424242FBF7FAF8DFF86080074641F208 +:105D60008839D8F870309907B3D4FBF7EFF8C01B27 +:105D70004845F6D9D5E70A6922F47C52B8E72646A9 +:105D8000D1E723F00802202A01D0182BD5D19CB9E5 +:105D90000A4AE96F536D23F038030B435365CEE78E +:105DA0000121281DFBF7B8F90446F0E7012105F1B0 +:105DB0002400FBF739F9F7E72646C0E7004402580C +:105DC00000480258CFFFFF000121281DFBF7A4F96E +:105DD0000446FCB9B74AA96F536D23F007030B4380 +:105DE00053652B685F0727D5D5F89430052B00F253 +:105DF0003A81DFE813F01600110032011600160098 +:105E00001600012105F12400FBF70EF9E0E7012659 +:105E10003446E6E72646E4E70121281DFBF77CF936 +:105E20000446002C40F02281A24AD5F89410936DCC +:105E300023F007030B4393652B68980610D5D5F81C +:105E40009030B3F1005F00F02C8100F21181002B43 +:105E500000F01781B3F1805F00F01D810126344608 +:105E60002B68590610D5D5F89C30B3F5006F00F0BB +:105E70003C8100F22181002B00F02781B3F5806F77 +:105E800000F02D81012634462B681A0610D5D5F86E +:105E9000A030B3F5804F00F0498100F22E81002B35 +:105EA00000F03481B3F5005F00F03A8101263446FA +:105EB0002B681B0714D5D5F88430B3F5805F07D164 +:105EC000022105F12400FBF7AFF8002818BF0126D6 +:105ED000784AD5F88410536D23F440530B4353652F +:105EE0002B68DF0614D5D5F89830B3F5807F07D13D +:105EF000022105F12400FBF797F8002818BF0126BE +:105F00006C4AD5F89810936D23F440730B43936556 +:105F10002B6818031AD5D5F8A410B1F5803F00F00E +:105F20000D81B1F5003F06D0002940F00D81281DFC +:105F3000FBF7F2F80446002C40F009815D4AD5F8E1 +:105F4000A410936D23F440330B4393652B685903DE +:105F50001CD5D5F88830B3F5001F00F0FA80B3F5F2 +:105F6000401F08D0B3F5801F40F0FA80514AD36A31 +:105F700043F40033D362002C40F0F5804D4AD5F84D +:105F80008810536D23F440130B4353652B68DA03D9 +:105F900009D52B6D002B00F0E880B3F5803F00F0B1 +:105FA000F280012634462B689B0007D5022105F1BB +:105FB0002400FBF739F8002818BF01262B689F033F +:105FC0000BD5D5F88010B1F5807F00F0F28000F29B +:105FD000E280002900F0E5800126DC0206D5354983 +:105FE000686F0A6D22F0004202430A65D80007D5A7 +:105FF0003049D5F8B8000A6922F4804202430A61A8 +:10600000990206D52B49E86E0A6D22F08072024390 +:106010000A655A0009D5274A116921F40041116126 +:106020001169D5F8BC0001431161002B06DA214942 +:10603000686DCA6C22F040520243CA641B0207D545 +:106040001C4AD5F88C10536D23F440030B43536561 +:10605000301E18BF0120BDE8F883012105F124009E +:10606000FAF7E2FFDCE601263446E5E62646E3E6FB +:1060700023F08052B2F1804F03D0B3F1405F7FF440 +:10608000EDAEA4B90B4AD5F89010536D23F0E04360 +:106090000B435365E4E60021281DFBF73DF8044659 +:1060A000EFE7022105F12400FAF7BEFFF7E72646E5 +:1060B000D6E600BF0044025823F48062B2F5805F48 +:1060C00003D0B3F5406F7FF4DDAEA4B93D4AD5F8F7 +:1060D0009C10936D23F4E0530B439365D4E60021A9 +:1060E000281DFBF719F80446EFE7022105F124000B +:1060F000FAF79AFFF7E72646C6E623F40052B2F510 +:10610000004F03D0B3F5C04F7FF4D0AEA4B92D4AF1 +:10611000D5F8A010936D23F460430B439365C7E655 +:106120000021281DFAF7F8FF0446EFE7022105F1E8 +:106130002400FAF779FFF7E72646B9E6022105F1D0 +:106140002400FAF771FFF5E601263446FEE62646FE +:10615000FCE6012105F12400FAF766FF04460AE790 +:106160000126344612E7264610E7164AD36A43F45E +:106170000033D3626CB9134A296DD36C23F4803396 +:106180000B43D3640FE70221281DFAF7C5FF04462D +:10619000F0E7264607E721F48072B2F5007F7FF42E +:1061A0001BAF64B90748426D22F440720A4342654E +:1061B00013E70448C26A42F40032C262F1E726469D +:1061C0000BE700BF00440258484B1A6902F038023E +:1061D000102A30B500F08680182A0CD0002A40F032 +:1061E00083801A68424812F0200F03D01B68C3F363 +:1061F000C103D84030BD996A9D6ADA6A15F47C7F84 +:10620000C5F305105C6BF5D0C4F3CC0402F00102B9 +:1062100007EE900A01F003016243B7EE006AF8EE60 +:10622000E76A012907EE902AFAEEE97A4CD00229B2 +:106230003CD0002948D11A68920627D519682C4A03 +:10624000C1F3C1011B6BCA40C3F3080307EE102A58 +:10625000F8EEC75A85EEA67A06EE903AF8EEE66AB0 +:1062600076EEA77A77EE867A204B67EE877A1B6BFD +:10627000C3F34623013307EE103AF8EEC76A87EE00 +:10628000A67AFCEEC77A17EE900AB3E71B6BC3F34E +:10629000080307EE103AB8EEC77A77EE277A77EE62 +:1062A000867A9FED146A86EE267ADDE71B6BC3F3D0 +:1062B000080307EE103AB8EEC77A77EE277A77EE42 +:1062C000867A9FED0D6AEEE71B6BC3F3080307EEBA +:1062D000103AB8EEC77A77EE277A77EE867A9FED96 +:1062E000076AE0E7064885E7064883E70044025866 +:1062F0000090D0030024744C20BCBE4B0024744A90 +:1063000040787D0100093D0008B5FFF75DFF084BAF +:1063100008499A699B69C2F3032203F00F038A5C60 +:10632000CB5C02F01F0203F01F03D040D84008BD31 +:10633000004402586FAD010873B50E460446FFF7DE +:10634000E3FFB0FBF6F5FF2D47DCFFF7DDFFB0FB09 +:10635000F6F101FB160606B9013D6560FAF7F6FD98 +:1063600094F84120034612B941F28832A2642068B1 +:10637000A1680268013922F4706242EA01222021F8 +:1063800002602046A26C00920022FAF73DFF30BB6B +:106390002268E569E36811682B43256A21F07F4193 +:1063A0002B43656821F0D00143EA05630B4313607A +:1063B0005568D4E905310B43216943EA0143094992 +:1063C00029400B435360136843F00103136001231A +:1063D000606484F8413002B070BDFF25BDE74FF026 +:1063E000FF30F8E7FEF8E0FF08B5FFF78DFF054B3B +:1063F000054ADB69C3F30223D35C03F01F03D840D3 +:1064000008BD00BF004402586FAD010808B5FFF792 +:106410007BFF054B054ADB69C3F30213D35C03F032 +:106420001F03D84008BD00BF004402586FAD0108EB +:10643000DFF86CC290212DE9F043DCE90035834C94 +:1064400089B06943DCF80880DCF80C006218B8F504 +:10645000965F63504FF0000138BF0726DCF81070DC +:1064600028BF0E46A2F85610A2F85410A2F85E10EB +:10647000A2F85C1011625166DCF814E0C2F80480E6 +:106480009060D760C2F810E0C2E90611C2E9096164 +:10649000BCF91A1001315DD1082151616C4A934257 +:1064A00010D19022B8F5165F02FB054292F88010D9 +:1064B00057D8012906D0196841F00201196000215E +:1064C00082F88010902202FB0541D1F884C0BCF113 +:1064D000000F01D181F880C002FB0542242140EA6F +:1064E0000E00C2F884101968526921F001011043AE +:1064F000584A196019680A40104318605A6822F413 +:10650000405217435F609A6822F06E4222F4306274 +:106510009A60DA6A22F00F0216434F4A9342DE6213 +:1065200025D14E4B5B6D03F03803282B00F284809D +:106530004B4AD35C082B00F2BB81082B7CD8DFE8E8 +:1065400013F0E001E6017B007B00E9017B007B00AA +:106550007B00EE01BCF9181001310CBF04210C21A5 +:106560009BE70129AED0196821F00201A6E73D4A58 +:10657000934207D1394B5B6D03F00703052B5BD8C2 +:10658000394AD6E7394A934207D1344B5B6D03F061 +:106590000703052B50D8364ACBE7364A934207D13A +:1065A0002E4B5B6D03F00703052B45D8324AC0E73D +:1065B000324A934207D1294B5B6D03F00703052B49 +:1065C0003AD82F4AB5E72F4A934207D1234B5B6D48 +:1065D00003F03803282B2FD82B4AAAE72B4A9342E3 +:1065E00007D11E4B5B6D03F00703052B24D8284A07 +:1065F0009FE7284A934207D1184B5B6D03F00703CE +:10660000052B19D8244A94E7114A934214D102F574 +:106610000E32936D03F00703052B0DD81F49CB5C99 +:10662000102B00F0088109D8042B00F0FA80082B09 +:1066300000F0FC80022B35D0012642E0202B00F038 +:106640003581402BF8D14FF40040FDE0F40C0224DA +:10665000000C0058F369FFCF0010014000440258BD +:106660003AAD01080044004063AD01080048004015 +:1066700063AD0108004C004063AD010800500040CC +:1066800063AD0108001401403AAD010800780040F4 +:1066900063AD0108007C004063AD010869AD0108ED +:1066A000900B0224FFF730FEA94BAA4A1B6AC3F3E2 +:1066B0000213D35C03F01F03D840002840F0C480CD +:1066C000002690224FF00113012E02FB05F204EB8D +:1066D00002018B664FF00003C1E91C3300F03481E6 +:1066E0008B6A002B66D0D80706D5A058C96A4268C5 +:1066F00022F400320A4342609A0709D590226A4385 +:10670000A158A0184A68006B22F4803202434A6004 +:106710005F0709D590226A43A158A0184A68406BC8 +:1067200022F4802202434A60180709D590226A4366 +:10673000A158A0184A68806B22F4004202434A60C4 +:10674000D90609D590226A43A158A0188A68C06B5F +:1067500022F4805202438A609A0609D590226A4345 +:10676000A158A0188A68006C22F4005202438A6083 +:106770005F0613D590226A43A158A0184A68476C57 +:1067800022F48012B7F5801F42EA07024A6005D161 +:106790004A68806C22F4C00202434A60180609D598 +:1067A00090236B43E258E1185368C96C23F400232B +:1067B0000B43536090276F43E35904EB07085A6873 +:1067C00022F490425A609A6822F02A029A601A686B +:1067D00042F001021A600023C8F88C30FAF7B6FBC9 +:1067E000E35902461B68190700F1A38090236B430D +:1067F000E3581B685B0707D54FF480014046FAF762 +:10680000D7FB002840F09F80902303FB0544202302 +:10681000C4F88430C4F888300023E36684F88030FC +:1068200092E002A8FAF794F9039846E705A8FAF768 +:10683000E7F8069841E71368474813F0200F03D0A4 +:106840001368C3F3C103D8404FF09009434B09FBD1 +:1068500005F904EB09014A6AD1F8048033F81220E3 +:1068600008EB4801B0FBF2F38B42FFF4E5AEB3EB6B +:10687000083F3FF6E1AE0023002114F043F9424601 +:106880000F020023060247EA10674FEA580030184B +:1068900047F1000114F036F9314BA0F540729A42ED +:1068A0003FF6CAAE54F80930D86009E72D48CBE767 +:1068B000202B39D0402B39D0102B7FF4BDAE244B88 +:1068C00025481A6812F0200F03D01B68C3F3C103D8 +:1068D000D84090236B43E1184A684E6A1F4931F84B +:1068E0001610B0FBF1F000EB5200B0FBF2F080B2FA +:1068F0004FF6EF72A0F1100191423FF69DAEE358C2 +:10690000D2E7FFF783FD00283FF4DAAEE1E7FFF7B7 +:106910006BFDF8E702A8FAF71BF90398F3E705A85F +:10692000FAF76EF80698EEE70E48D2E74FF400400B +:10693000CFE701904FF400114046FAF739FB019A76 +:1069400000283FF453AF0326304609B0BDE8F0837A +:10695000004402586FAD01080090D003A8AD0108B3 +:10696000FFFC0F0000093D00154B4FF4E13210B55C +:106970009A60B0B01A68134B9A421CD1BC22002115 +:1069800001A812F0E3F9042368460093012325933C +:10699000FEF746FFFFF74CFD78B100230A4C259324 +:1069A0000A4BD4F88C209A42FBD16846FEF738FF98 +:1069B0004FF44073E360FFF73BFD30B010BD00BF04 +:1069C000900B0224000C0058006402580003008061 +:1069D00037B5444C2369A369A369A369E569E369F1 +:1069E000236A05F07005404B1B68FFF70FFDD4F8D4 +:1069F000E8303E4A43F00803C4F8E830D4F8E83001 +:106A000003F008030193019B394BD2F88C10994293 +:106A1000FBD1D4F8903043F00803C4F89030D4F898 +:106A2000903023F00803C4F890304FF44073314C99 +:106A3000D360314B23604FF0FF33E3602F4B002DC9 +:106A40004DD1B0FBF3F0002301382361A3606060F7 +:106A5000C4E9053394F83D3003F0FF020BB984F824 +:106A60003C20254A022384F83D30136823F47C73CC +:106A700013604FF0FF33D36201239062536184F8B7 +:106A8000483084F83E3084F83F3084F8403084F851 +:106A9000413084F8423084F8433084F8443084F83C +:106AA000453084F8463084F8473084F83D30144B44 +:106AB000144A9B68C3F80821BFF34F8F124B4FF461 +:106AC00080225A6094F83E30012B01D1F9F7FEFD87 +:106AD0002268D36823F00203D36003B030BD4000C6 +:106AE000AFE700BF00440258002000520064025883 +:106AF0000003008064050024000C004040420F00A9 +:106B000000ED00E06508000800E100E07F4A13683E +:106B100003F00F038B422DE9F04104460D467ED36E +:106B200023685F0700F189801E070BD578496669E5 +:106B3000C86900F07000864204D9CA6922F0700268 +:106B40003243CA61D8060BD57149A669C86900F4F9 +:106B5000E060864204D9CA6922F4E0623243CA6125 +:106B600099060BD56A49E669086A00F0700086420A +:106B700004D90A6A22F0700232430A629A070BD5DE +:106B80006349E668886900F00F00864204D98A6983 +:106B900022F00F0232438A61DF075CD423689E072C +:106BA00000F18D8059490A6802F00F029542C0F049 +:106BB0009480580700F19C8019070BD554496569EA +:106BC000C86900F07000854204D2CA6922F07002E0 +:106BD0002A43CA61DA060BD54D49A569C86900F494 +:106BE000E060854204D2CA6922F4E0622A43CA61A5 +:106BF0009B060BD5464AE069116A01F07001884294 +:106C000004D2136A23F0700303431362FFF7DCFA24 +:106C10003F4B9A699B69FFF7DBFE00200BE013688E +:106C200023F00F030B431360136803F00F038B4231 +:106C30003FF476AF0120BDE8F081354926698869C7 +:106C400000F0700086427FF66FAF8A6922F0700212 +:106C500032438A6168E72E4BA1689A6922F4706218 +:106C60000A439A6162681B68022A1BD113F4003F31 +:106C7000E0D0274E41F28838336923F007031343ED +:106C80003361FAF763F907463369626803F0380342 +:106C9000B3EBC20F82D0FAF759F9C01B4045F3D9C4 +:106CA0000320C8E7032A02D113F0007FE0E7012A9E +:106CB00002D113F4807FDBE713F0040FD8E7144907 +:106CC000E668886900F00F008642BFF46BAF8A69FE +:106CD00022F00F0232438A6164E70A6822F00F0251 +:106CE0002A430A600A6802F00F029542A2D160E7C7 +:106CF00007492569886900F070008542BFF45CAFE0 +:106D00008A6922F070022A438A6155E70020005206 +:106D10000044025890F8BC230368012A21D00122C4 +:106D200080F8BC23826A012A06D18269012A03D035 +:106D30009A6B42F480329A639A6842F001029A6038 +:106D4000D3F8002E22F00302C3F8002ED3F8042853 +:106D500022F00202C3F80428002380F8BC3318464E +:106D600070470220704700002DE9F74F0023DFF83D +:106D7000BC81DFF8BCC14FF0B0490A6832FA03F4B5 +:106D800002D103B0BDE8F08F01279F403A4000F0E8 +:106D9000B6804C684FEA430E032524F0100A05FA2A +:106DA0000EF50AF1FF36ED43012E10D8866806EA8B +:106DB000050BCE6806FA0EF646EA0B0686604668B4 +:106DC00026EA0707C4F300169E4037434760C768AA +:106DD000BAF1020F8E6807EA050706FA0EF646EAD0 +:106DE0000706C66014D14FEAD30A03F0070B0F273A +:106DF00000EB8A0A4FEA8B0BDAF8206007FA0BF7F0 +:106E000026EA07070E6906FA0BF63E43CAF8206029 +:106E10000668354004F0030606FA0EFE4EEA050544 +:106E20000560E5006BD5D8F8F45023F0030603F0B5 +:106E300003074FF00F0E45F0020506F1B046BF0004 +:106E4000C8F8F45006F58066D8F8F45005F002054D +:106E50000195019D0EFA07F5D6F808A02AEA050E5D +:106E6000314DA8424DD005F58065A8424BD005F5BF +:106E70008065A84249D005F58065A84247D005F550 +:106E80008065A84245D005F58065A84243D005F548 +:106E90008065A84241D005F58065A8423FD005F540 +:106EA0008065A8423DD005F58065A8420CBF092544 +:106EB0000A25BD40E70345EA0E05B5606FEA020604 +:106EC000DCF8005054BF35401543A703CCF8005000 +:106ED000DCF8045054BF35401543E7024FF0B0478B +:106EE000CCF80450D9F8005054BF35401543A402E3 +:106EF0003D607D6854BF35401543C9F804500133E7 +:106F00003BE70025D5E70125D3E70225D1E7032597 +:106F1000CFE70425CDE70525CBE70625C9E70725FB +:106F2000C7E70825C5E700BF000002580044025823 +:106F3000800000580A4BDA6842F00102DA60DA6831 +:106F4000D2070BD5D3F80C2142F00102C3F80C2173 +:106F5000D3F80C01C04300F00100704701207047D6 +:106F600000200052104BDA68D20706D40E4BD3F83B +:106F70000C0110F001000AD170470C4A5A6002F16E +:106F800088325A60DB68DB07F0D501207047074A7A +:106F9000C3F8042102F18832C3F80421D3F80C01AC +:106FA00000F00100704700BF002000522301674538 +:106FB00038B50446F9F7CAFF05460134F9F7C6FFAC +:106FC000431BA342FAD338BDF0B593B00646202246 +:106FD00000210AA811F0BAFEA44B9B6A03F0030338 +:106FE000022B34D0A14B0227A14D0024D3F8E0207E +:106FF00005A9284642F08002C3F8E020D3F8E0302B +:10700000089403F080030493049B0123CDE90573E6 +:107010000793FFF7A9FE0A20FFF7CAFFAF61FCF74D +:1070200029F9944BF6B90296DA6A22F00102DA6283 +:10703000DB6A03F0010302938F4B9A6942F44042EA +:107040009A619B6903F440430293029B1FE0012174 +:107050000AA8CDE90A11FFF759FD0028C2D0002087 +:1070600013B0F0BD0394DA6A22F00102DA62DB6A3F +:10707000814A03F001030393936923F4404343F4EB +:1070800080439361936903F440430393039B7A4ADB +:1070900093699904FCD5754B002E1A690CBFA02585 +:1070A0002825996A02F03802102A07D0182A40F0E1 +:1070B000908001F00302022A40F08B801B686B4C29 +:1070C000236843F480532360F9F740FF07462368A1 +:1070D0009B0440F19480236903F03803182B00F0DF +:1070E000A280236823F080732360F9F72FFF5F4CA1 +:1070F00007462368980100F18980A36A013D23F4C3 +:107100007C7345F0847523F0030345F4813543F027 +:107110005203A3622563E36A544D23F00103E36243 +:10712000636B23F47F4323F0F8036363E36A23F084 +:107130000C0343F00803E362E36A23F00203E36213 +:10714000E36A43F48033E362E36A43F40033E362C7 +:10715000E36A43F48023E362E36A43F00103E362FA +:10716000236843F080732360F9F7F0FE04462B6830 +:10717000990152D53F2203230021CDE90A23082398 +:107180004FF48062CDE90C134023CDE90F320E930A +:10719000119306B904210AA8FFF7B8FC00287FF470 +:1071A0005EAF324B01201A6842F080021A60D3F8B9 +:1071B000F42042F00202C3F8F420D3F8F4302D4A50 +:1071C00003F002030193019B136A43F0010313626E +:1071D00046E71A68254F42F480221A601A6842F482 +:1071E00080321A60F9F7B2FE04463B689A033FF515 +:1071F00066AFF9F7ABFE001B6428F6D92FE7F9F765 +:10720000A5FEC01B02287FF662AF28E7F9F79EFEB5 +:10721000C01B02287FF66DAF21E7F9F797FE001B30 +:107220000228A4D91BE7A26A236B02F003010229FA +:107230007FF415AFC2F30512052A7FF410AFC3F334 +:107240000802013DAA427FF40AAFC3F34622012A95 +:107250007FF405AFC3F30642092A7FF400AFC3F3FE +:107260000663012B7FF4FBAE84E700BF00440258A5 +:10727000001C0258000400580048025873B5054627 +:107280000C200E46019206F0ADFA00232946019A21 +:107290000446C0E90133074B0360F9F7D5FD054605 +:1072A00030B1236820465B689847284602B070BD1D +:1072B0003460FAE748B0010873B505460C200E4665 +:1072C000CDE9003206F08EFA00210446C0E9011132 +:1072D0000849DDE9003201602946F9F758FD054605 +:1072E00030B1236820465B689847284602B070BDDD +:1072F0003460FAE774B0010803682DE9F041DB6EF1 +:1073000004460D469847804640F2011006F06AFA9E +:107310002368002706461B6F2946204698472368A6 +:107320003246294620465B6E9847002801DD01372A +:10733000F5E723684246294620469B6E984730462B +:1073400011F09AFC3846BDE8F0812DE9F04306467D +:1073500087B02C20154606F1A4080F4606F042FA25 +:107360000446404606F1140903F090FDB36902AAF1 +:10737000214663604846F3690195A36001AB02F0C2 +:1073800003FB0546A8B99DF80C30222B1CD104AA9A +:107390002146484601F0D8FB054650B96368236191 +:1073A000A36863610E23A3611023E360736A7462B0 +:1073B0002360404603F04AFD4DB93C60284607B0C3 +:1073C000BDE8F043F9F7A3BD6FF01305F1E72046E0 +:1073D00011F052FCF2E72DE9F04F07469B4693B0BF +:1073E000382007F1A4098846164606F0FBF9044642 +:1073F000484603F04BFD1BF0030C07F1140A00F0A4 +:10740000C580BCF1010F4FF0000000F0C180BCF15D +:10741000020F844601D0002100E003214FEA6B02F5 +:1074200002964FEAAB0502F4807205F400752A4318 +:107430000BF480652A434FEA0B2505F400651543DC +:1074400045EA0C0505430D4305F00303012B11D15B +:1074500002AB03AA07A9504602F096FA064600BB03 +:107460009DF81030222B00F08A80A9053FD56FF0DF +:10747000100609E097F85430002BE9D1504601F08E +:10748000DFFF06460028E3D0484603F0DFFC002E6D +:1074900078D1C8F80040304613B0BDE8F04FF9F796 +:1074A00036BD821CF0D1029B2F211846019313F0A8 +:1074B00073F883460028E7D1EB05E5D5019B40F63C +:1074C00011028DF812001846ADF8102012F032FAB1 +:1074D0004FF0FF328DF8130007A9019B5046CDE90C +:1074E000052B03AA02F02CFB06460028CCD1089BF2 +:1074F000002268056360099BA261A360039BE360AF +:10750000059B2361069BC4E9075263610AD44FF0CF +:10751000FF337D69E3626B6BF3B13A6A62B16FF07E +:107520000B06B1E713B145F48035E5614FF0FF324A +:107530000023C4E90423EAE76363E36903F0030378 +:10754000012B04D004F12C01284601F006F93B6A16 +:1075500000263C62236097E7E36903F00303012BF5 +:1075600006D1686911F080FB60630028EFD1D6E78F +:10757000A86911F079FB60630028E3D1CFE76FF0D1 +:10758000140681E7204611F077FB84E7012042E7EB +:107590004FF0020C3FE7000010B50446EFF30583FF +:1075A00013B16FF0050010BD0DF066FA0028F8D198 +:1075B00020464FF0FF31DFF808C000DFF3E700BFDF +:1075C0001130010870B50A440E4E036893FAA3F314 +:1075D00093FAA3F30360914212D011F8014B84EAAD +:1075E000030505F00F0556F8255085EA131383EAC5 +:1075F000141404F00F0456F8244084EA1313EAE745 +:10760000036070BD54B20108437982790433C079B4 +:1076100013441844704703681A6AC36AD31A19449A +:10762000B1FBF2F302FB1311036B8B4210B50BD9C4 +:107630004C09C26B012301F01F0103FA01F152F85A +:1076400024300B4342F82430002010BD0368084664 +:107650001847036910B5044613B150F8041B984746 +:10766000204610BD38B5036804460D469B6F984709 +:1076700023682D692046DB6F9847284638BD38B50A +:10768000036804460D469B6F98472368ED682046C3 +:10769000DB6F9847284638BD38B5036804460D4669 +:1076A0009B6F984723686D692046DB6F9847284693 +:1076B00038BD03680122D3F88030184708B5064B5F +:1076C00053F820000368DB6A984780B2B0F5007F6A +:1076D00038BF4FF4007008BDF41402242DE9FF47B1 +:1076E00016461C468046DFF844900391FFF7E6FFFC +:1076F000A0FB0667A0FB044559F828003246036842 +:10770000CDE90045D3F81CA03B46D04750B959F805 +:107710002800324603990368CDE900459C693B4641 +:10772000A04700B1042004B0BDE8F087F41402249F +:107730007FB5164605461C460391FFF7BFFF0A4A70 +:107740000346039952F82500A3FB04450268CDE9DE +:1077500000455469A3FB0623A047002814BF04205A +:10776000002004B070BD00BFF414022413289ABF97 +:10777000014B185640427047BFB1010813128A7678 +:10778000CB760378032B01BF120C0A7512124A75CF +:1077900070470328CA7E8B7E08BF487D43EA0223D8 +:1077A00002BF0A7D42EA002243EA024318467047BC +:1077B00060B103685BB11A785AB18088DA88904268 +:1077C00016BF0920002000230B60704703460920E4 +:1077D000FAE709201346F7E7026810B504465AB1E4 +:1077E000114611F8013B202B11D93A2BF9D113780E +:1077F000303BD8B2092802D94FF0FF3006E0023200 +:107800009142F9D1032B1846F6DC216010BD00200F +:10781000FCE738B5C378044613B90025284638BDBF +:10782000D0E90C2101234078FFF758FF054680B9C5 +:10783000216B636AE269CB1AE0709342EDD2A378C0 +:10784000022BEAD10A440123616B6078FFF746FFFF +:10785000E4E70125E2E70B0A017043700B0C090E07 +:107860008370C170704742884378007843EA0223EE +:1078700040EA03207047002370B51C462E26C569D8 +:107880002A5D0134202A0AD0052A08BFE522092CE6 +:1078900002BFCD1801336E72CD1801336A720B2C02 +:1078A000EDD10B4400225A72C369DB7A03F03F0327 +:1078B0000B72C46904F11C00FFF7D5FF0860E27D7C +:1078C000A37D43EA0223CB80627E237E43EA022328 +:1078D0008B8070BD406803689B6C1847D0E9043109 +:1078E00010B5D0E90824D01A64EB010110BD40683E +:1078F00003685B6B1847416830B4D0E904400D68F9 +:1079000012192D6B40EB03030846294630BC08478B +:1079100041680B6810B41C6BD0E90423084621466B +:107920005DF8044B0847406803689B6A1847406845 +:1079300003685B6A18472DE9F347054614469846E5 +:107940004068D5E904230168A218DDE90AA948EBDB +:107950000303CDE900A9496C884780B114EB0A0400 +:10796000D5E9043248EB0908E61848EB0207D5E9E7 +:107970000823BB4208BFB2422CBF0120002002B046 +:10798000BDE8F0872DE9F347054614469846406860 +:10799000D5E904230168A218DDE90AA948EB03032D +:1079A000CDE900A9096C884780B114EB0A04D5E938 +:1079B000043248EB0908E61848EB0207D5E908232A +:1079C000BB4208BFB2422CBF0120002002B0BDE87C +:1079D000F0872DE9F3470546144698464068D5E9F7 +:1079E00004230168A218DDE90AA948EB0303CDE9E5 +:1079F00000A9C96B884780B114EB0A04D5E90432A9 +:107A000048EB0908E61848EB0207D5E90823BB4212 +:107A100008BFB2422CBF0120002002B0BDE8F087B1 +:107A20002DE9F341DDE908670168044615469846EB +:107A3000CDE90067496C884768B16068D4E90423E0 +:107A40000168AA18CDE9086748EB0303C96902B0C9 +:107A5000BDE8F04108476FF47A6002B0BDE8F081FC +:107A60002DE9F04385B00446154698460391DDE9BB +:107A70000C67CDE900670168D1F84090C84778B13C +:107A800060680399D4E904230468AA18CDE90C6757 +:107A9000A46948EB0303A44605B0BDE8F043604782 +:107AA0006FF47A6005B0BDE8F0832DE9F04385B04E +:107AB0000446154698460391DDE90C67CDE9006759 +:107AC0000168D1F83C90C84778B160680399D4E95F +:107AD00004230468AA18CDE90C67646948EB030322 +:107AE000A44605B0BDE8F04360476FF47A6005B086 +:107AF000BDE8F083406803681B6918474068036865 +:107B0000DB68184773B50446406803689B6898476C +:107B1000054658BB606803689B6B9847237A3BB166 +:107B20002572D4E90432C31A61EB0202C4E90432BB +:107B3000237E43B10026D4E908322676C31A61EBCE +:107B40000201C4E90831D4E90416D4E908322068F6 +:107B50005B1A62EB0602CDE900320022416C002381 +:107B600020468847002808BF6FF47A65284602B08F +:107B700070BD406810B103689B6C18477047407E29 +:107B80007047007E7047D0E9042110B5D0E9023477 +:107B9000981844EB010110BDD0E902017047D0E90B +:107BA0000401704790F820301BB1406803685B6B9C +:107BB00018476FF47A60704790F8201030B459B1CC +:107BC000D0E90114C0680D6812192D6B40EB030356 +:107BD0000846294630BC08470020002130BC7047C9 +:107BE00090F820301BB140680368DB6A184700201A +:107BF0000021704790F820301BB1406803689B6AF1 +:107C0000184700200021704790F820301BB14068D1 +:107C100003685B6A18470020002170472DE9F34193 +:107C200090F82010044615469846DDE9086799B19A +:107C30000168CDE90067496C884768B1E368D4E919 +:107C400001020168AA18CDE9086748EB0303C96976 +:107C500002B0BDE8F04108476FF47A6002B0BDE8B9 +:107C6000F0812DE9F04390F820C085B00446154618 +:107C700098460391DDE90C67BCF1000F16D0CDE901 +:107C800000670168D1F84090C84778B1E36803996C +:107C9000D4E901020468AA18CDE90C67A46948EB8D +:107CA0000303A44605B0BDE8F04360476FF47A6073 +:107CB00005B0BDE8F0832DE9F04390F820C085B011 +:107CC0000446154698460391DDE90C67BCF1000FA8 +:107CD00016D0CDE900670168D1F83C90C84778B16B +:107CE000E3680399D4E901020468AA18CDE90C6796 +:107CF000646948EB0303A44605B0BDE8F043604760 +:107D00006FF47A6005B0BDE8F08390F820301BB1C5 +:107D1000406803681B6918476FF47A6070472DE963 +:107D2000F047D0E9011405684FEA640A9DF820C0C5 +:107D300005EB6400E4079DF824E048BF55F80A40CD +:107D40009DF82880DDF82C9048BF6158DDE90C676C +:107D5000CDE90A89CDE90C67CDE908CEBDE8F04749 +:107D6000084730B49DF808109DF80C409DF810505D +:107D70000291CDE9034530BCC1680847FF20704738 +:107D8000D0E944017047F0B51F46D0F818311646C7 +:107D900001332DD1D0F86021D0E94445AF4208BF6E +:107DA000A6421CD2D0F82811C9B101290CD000F587 +:107DB000B47C0023994212DDFCE80245BD4208BFB5 +:107DC000B44202D20133F5E700230344012193F8C2 +:107DD000544100230C4205D0723350F82320104642 +:107DE000D117F0BD01334900042B49B2F2D1F6E7B7 +:107DF0004FF480500021F4E70048704790B101082B +:107E0000D0F860010021704701200021704701680F +:107E10002DE9F04717469846096B0646DDE9089AB2 +:107E2000884702460B463846414612F06BFE134324 +:107E300002D00020BDE8F08717EB09043368304614 +:107E400048EB0A0514F1FF32196B45F1FF338847FF +:107E500002460B462046294612F054FE1343E8D151 +:107E6000336830469B6B9847A94208BFA0422CBF9D +:107E700001200020DEE72DE9F74F16460168026970 +:107E8000054600930192896B4769DDE90CAB16EB5F +:107E90000A0843EB0B098847494508BF4045DDE91F +:107EA000003203D2002003B0BDE8F08F16F1784411 +:107EB000284643F1FF31A4182A6841EB0707116BEC +:107EC0003246884702460B462046394612F01AFED3 +:107ED0001343E7D114EB0A042B68284647EB0B0742 +:107EE00018F1FF32196B49F1FF33884702460B4600 +:107EF0002046394612F006FE13430CBF0120002035 +:107F0000D1E700000048704796B10108D0E90601AA +:107F1000704790F82030002B0CBF4FF0FF30FF204F +:107F2000704790F8203013B12020002170470020C6 +:107F3000FBE72DE9F0471E460368154604469B6A99 +:107F4000DDE9087A984702460B462846314612F08A +:107F5000D9FD134302D00020BDE8F08723682046F6 +:107F60009B6A984702460B463846514612F0CAFDB6 +:107F70001343F0D115EB07082368204646EB0A09A6 +:107F80009B6B9847494508BF40452CBF0120002006 +:107F9000E2E72DE9F0471E460368154604465B6A92 +:107FA000DDE9087A984702460B462846314612F02A +:107FB000A9FD134302D00020BDE8F08723682046C6 +:107FC0005B6A984702460B463846514612F09AFDC6 +:107FD0001343F0D115EB07082368204646EB0A0946 +:107FE0009B6B9847494508BF40452CBF01200020A6 +:107FF000E2E700207047036873B50C469B6F0646A6 +:10800000984701A92046FFF7D3FB054600B9206039 +:1080100033683046DB6F984714B1204610F02CFED1 +:10802000284602B0BDE87040FFF7A0BB08B110F0D1 +:1080300023BE704710B5044610F01EFE204610BD4A +:1080400010B5044610F018FE204610BD70B5044669 +:10805000FFF7DFFB054600283FD12378032B35D1FE +:108060002679012E32D10146A289606B10F06EFE96 +:10807000636B55224121722083F8FE21AA2283F8E6 +:10808000FF215223626B137053706123D170937080 +:10809000626B82F8E73182F8E40182F8E50182F848 +:1080A000E611606B616900F5F470FFF7D4FB606B5B +:1080B000216900F5F670FFF7CEFB226A3346616B4B +:1080C000013260782263FFF709FB25716278034B68 +:1080D00053F82200B0FA80F0400970BDF414022475 +:1080E00090F8203010B504465BB11C30FBF736F930 +:1080F00038B984F8200060680368BDE81040DB6888 +:108100001847002010BD2DE9F04F89B090469946E0 +:1081100005469DF84820C3469DF8503090F8FA7106 +:10812000DDE915610591032A57D8DFE802F01B024B +:10813000190302270F2B4FF0000205F1040A08BFB4 +:1081400095F8FD3111465046009203933B46CDE928 +:1081500001220AF08DF9044638B109B0BDE8F08F6C +:108160000327E7E74FF0FF3BE4E7059B4FF0FF32C3 +:108170009DF84C105046079307ABCDE900635B4672 +:10818000FBF720F93B468346224621465046CDE97F +:108190000244CDE900440AF06BF90028DDD1BBF1BF +:1081A000000F01D05846D8E795F801010028D4D037 +:1081B000B9F1000F08BFB8F1040F04D1337843F0D0 +:1081C0000A033370EEE7B9F1000F08BFB8F1020FF0 +:1081D000E8D1337823F00403F3E74FF0FF30BCE736 +:1081E00008B590F820302BB100691044FBF710F867 +:1081F000002108BD1846FBE708B590F8203023B1F0 +:108200000069FBF705F8002108BD1846FBE7F7B544 +:1082100090F8201004461546DDE9086771B1016841 +:10822000CDE90067496C884740B121693246201D7D +:10823000294403B0BDE8F0400AF0B0B96FF47A60A9 +:1082400003B0F0BDF0B590F8207085B00446154637 +:108250000391DDE90A6C7FB10768CDE9006C3F6CE2 +:10826000B84748B1226933460399201D2A4405B016 +:10827000BDE8F0400AF0DEBA6FF47A6005B0F0BDF8 +:1082800090F8203010B5044613B94362002010BDA9 +:108290002430FBF763F80028F8D184F82000201D73 +:1082A000BDE810400AF00ABC90F820302DE9F04FEC +:1082B000814685B003B9436209F1240656E8000FF0 +:1082C000013046E80003002BF8D1012843D109F121 +:1082D00004000AF00FFC804630B13046FBF73EF850 +:1082E000404605B0BDE8F08FD9E906ABD9E90445B1 +:1082F0001AEB040300934BEB05030193FAF7A8FF75 +:10830000002300F1006C8646DDE900018B4208BFC6 +:10831000844505D230466FF47A68FBF71FF8DFE733 +:10832000002D08BFB4F1006FF4D35AEA0B030ED14D +:108330004FF000610B1B029365EB45030393DDE9EE +:10834000026716EB0E0647F10007C9E9066701212F +:1083500089F82010C4E79846C2E770B514466FF05C +:108360000046126805460498B24207D238B1014669 +:10837000184611F0CFFF431C05D1206070BD15B128 +:108380008A4238BFAB54236801332360F6E700000C +:108390002DE9F04F89B0002405469DF850A09DF8C6 +:1083A0004800A245DDF85480079414BF4FF0300B0D +:1083B0004FF0200B0128CDE905443FD1A3423DDA1F +:1083C0005B428146841E00270DF1140C4FF00A0E0B +:1083D000E4B20294029C012C56D8022803F00F0448 +:1083E0004FEA13130CBF334E334E345D0CF8074085 +:1083F0007C1C002B46D1B9F1000F27D0BAF1000F39 +:1084000009D02D232846CDF80080CDE90212FFF7D0 +:10841000A4FFDDE90212BC1C139B9C421BDBBAF1DA +:10842000000F09D12D232846CDF80080CDE9021296 +:10843000FFF793FFDDE90212013C1EE013B14FF09C +:108440000009BFE7302301248DF81430139B9C42B0 +:1084500013DA4FF000095B462846CDF80080CDE9DD +:108460000212FFF77AFF139B013BA3421393DDE94E +:108470000212F0DCB9F1000FD1D105AE6CB909B030 +:10848000BDE8F08F2746A5E7B3FBFEF40EFB1433DF +:1084900030330CF807302346AAE7013CCDF80080C2 +:1084A0002846335DCDE90212FFF757FFDDE90212DE +:1084B000E4E700BF94B20108A4B201082DE9F04F2F +:1084C0001C4689B000238946129E15460793B2B117 +:1084D000994214DB0CBF012301F1FF394FF0000B6F +:1084E000049315F80B3073B948B1049B3BB9079B53 +:1084F0004B4595BF049A049BC25400F80930079875 +:1085000009B0BDE8F08F252B40F002810BF1010886 +:1085100015F80830203BDBB20D2B07D842F60902D4 +:1085200022FA03F3DB0748BF0BF1020815F8083005 +:108530002A2B1DD1002108F1010204348E46AF5CC4 +:10854000AB182E2F51D15F782A2F2CD04FF0000A74 +:10855000C5F1010C0CEB030213F8017F303F5FFA09 +:1085600087F8B8F1090F21D80A2202FB0A7AF1E74D +:10857000302B15D108F1010815F80830302BF9D04F +:108580004FF0010EA8440021A8EB050218F8013BAA +:10859000303BDFB2092FD2D80A2202FB0131F3E7C8 +:1085A0004FF0000EEEE7023254F804ABAB5C682BE0 +:1085B0001ED1AB185B78682B0CBF7223112303F01C +:1085C0000308904415F80870642F01D0692F3FD13B +:1085D000822B27D1252307AA494600960590252FEF +:1085E00018BFD846FFF7B9FE2EE06FF0004ADDE76E +:1085F0006C2B06D1AB185B786C2B0CBF822321232C +:10860000DDE76A2B08D07A2B08D0742B08D04C2BCE +:1086100014BF00236123D2E73123D0E74123CEE703 +:108620005123CCE7112B54F8042B0FD0722B00D11F +:1086300052B201230191CDE902E600934946134667 +:1086400007AA0590FFF7A4FE059838E012B2F0E7FC +:10865000752F03D007F0DF02582A16D1822BB9D02C +:10866000112B54F8042B09D0722B00D1D2B2752FE4 +:108670000191CDE902E603D10023DEE792B2F6E7ED +:10868000582F0CBF03230223D7E7632F09D154F8D7 +:10869000043B07AA49460096DBB20590FFF75DFE52 +:1086A000D2E7732F16D154F804BB0BF1FF3717F83C +:1086B000013F23B1AAEB07021BEB020F02D108F125 +:1086C000010B0EE707AA494600960590FFF745FE05 +:1086D0000598ECE7702F7FF47DAF54F8047B3023CE +:1086E00007AA494600960590FFF737FE782307AAA8 +:1086F000494605980096FFF730FE002307AA494631 +:1087000005980396CDE90133032300933B4699E78F +:1087100007AA49460096D8460590FFF71EFE93E744 +:10872000F8B5C5690F460E68083DAE4213D3B6FBD7 +:10873000F5F0013812F0FEF9841CA6EB8404B4FBBA +:10874000F5F4204612F0F6F9A6EB800004FB1505BF +:1087500020463D60F8BD0020FCE710B50C4682695C +:10876000FF21A06810F0F2FA4FF0FF33236010BD34 +:10877000F7B50C460968064617464B1C21D0006821 +:10878000836900938568D4E90123A847054620B989 +:1087900037B921463068FFF7E0FF284603B0F0BD47 +:1087A0003368394630469B690193A3680093D4E946 +:1087B0000023FAF7BCFE002805DBEAD16FF0330591 +:1087C000EBE70025E9E70546E7E72DE9F74F0C9CC5 +:1087D00007460D4691469846DDF838A0BAF1000FDD +:1087E00003D1504603B0BDE8F08F2B68386843458D +:1087F000826928D16B68A34225D803EB020BA345FD +:1088000021D9ABEB040BE01AAB68D3450D991844A2 +:1088100028BFD3465A465C4410F08AFA0D9B5B444D +:10882000AAEB0B0B0D933B689A69B4FBF2F302FBC6 +:10883000134333B94A4629463846FFF799FF0028C3 +:10884000D0D1DA46CAE7B4FBF2F302FB13434BBBC9 +:10885000924527D34146BAFBF2F302FB13AB224603 +:10886000AAEB0B0ACDF800A083681E460D9BB0470B +:108870000028B7D1B9F1000F04D10D9B54445344E3 +:108880000D93DEE70D9B424649463846009323464A +:10889000CDF804A0FAF74BFE0028A3DBEDD16FF072 +:1088A00033009FE7E31AD346C5F800806B60C8E742 +:1088B0002DE9F04F85B00F4691469846109D0390E4 +:1088C000DDE90E460DB9284659E0039B1868B9F159 +:1088D000000F1ED0D9F8003043451AD1D9F8041042 +:1088E000A14216D8826901EB020A544511D2AAEBC3 +:1088F000040A611AD9F80830AA4528BFAA463046AA +:108900005246194456445444A5EB0A0510F010FA97 +:10891000D8E73A68436990450ED179688C420BD309 +:1089200001EB030A544507D2AAEB040A611ABB689B +:10893000AA4528BFAA46E2E7B4FBF3F203FB1242C2 +:10894000D0F804B08AB99D420FD322464146B5FB08 +:10895000F3FA03FB1A5A3346A5EB0A050095D847EC +:1089600068B92E442C445546ACE7A21A0093414600 +:10897000BB68C7F800807A60D8470028A2D005B04D +:10898000BDE8F08F2DE9F04F8BB091460746884641 +:10899000149A07A900680DF1200B013A0593DDF840 +:1089A00058A00792FFF7BCFE059B054619460593A4 +:1089B0005046159B9847024618BB15B305F00106B3 +:1089C0004A4600903846C6F10204059BA100CDE955 +:1089D00001B14146FFF76CFF024690B9013C944259 +:1089E00007DC0AAB023E03EB8404354454F8083C30 +:1089F000DCE708995046159B984701220028EED0E5 +:108A0000024610460BB0BDE8F08F2DE9F04786B066 +:108A100005460F46144600F11409D6184FF0010A16 +:108A20000DF11708B44203D1002006B0BDE8F0876D +:108A300000943B460022494628460134CDE9018A8C +:108A4000FFF736FF0028F0D1012241460E98FEF7CD +:108A5000B9FDE7E703689B6A10B5044613B9C0691E +:108A600010F00AF92368DB6A13B9A06A10F004F960 +:108A700023681B6B23B9E06BBDE8104010F0FCB815 +:108A800010BD38B58B6A04460D460160CBB1C36199 +:108A9000EB6A13B3A36204F120012846FFF75DFEE1 +:108AA0004FF0FF33636123681A6BEAB1E263002081 +:108AB0004FF0FF33C4E90300C4E90133A4F84000D8 +:108AC00038BD486910F0D0F8E0610028E0D12046B8 +:108AD000FFF7C0FF6FF00B00F2E7A86910F0C4F8D1 +:108AE000A0620028D7D1F2E7586AC00810F0BCF89D +:108AF000E0630028DBD1EAE70B6810B504689C420C +:108B000009D040684A68904205D0944203D0181AB0 +:108B100018BF012010BD0020FCE70368013304D01A +:108B20004068431C584258417047012070471FB5A8 +:108B3000069C00920022CDE901340B4600F114019D +:108B4000FFF7B6FE04B010BD2DE9F04F13688BB0EF +:108B50000026074604930C465368B0460DF1100BEF +:108B600006AD4FF0100A05935BF826902B460022C5 +:108B700038464946CDF800A0FFF7D9FF70B110F193 +:108B8000340F06D146B1B8F1000F14BF00206FF0CA +:108B900033000BB0BDE8F08F0126E5E7B8F1000F18 +:108BA00004D0E269069B9B1A002BEBDB079B23F0AA +:108BB0000043132BE6D93A68D2699342E2D84FF0CA +:108BC000FF3303A8102229460393FEF7FBFC079B03 +:108BD00010220090494623F000433846103BFFF72F +:108BE00014FF0028CBD1039B002BCBD10AAA86F01F +:108BF000010304F11C0CC4F8049002EB83034FF052 +:108C0000010853F8183CC4E9023A95E80F008CE8D3 +:108C10000F00B7E72DE9F043012397B00F46064652 +:108C200000219046CDE9051305994046B847044612 +:108C300010BB06994046B8470446E8B905AA0BA9F7 +:108C40003046FFF781FF0446B0B90C25139B0E9AFE +:108C500023F0004302F10C01043B994210D9149B0C +:108C600005A80593159B0693FFF757FF0028DBD057 +:108C7000F56806F114094DBB204617B0BDE8F08336 +:108C80000C9908AB30460095FFF751FF01460028CC +:108C900042D107A8FEF7B8FC0E9B18449DF820307F +:108CA00003F070030E90102BD0D10A9B002BCCD078 +:108CB0000A46009306F11401099B3046CDE901787C +:108CC000FFF760FE0028C0D00446D5E7EB69DA0361 +:108CD00012D4EB699B030DD52B6A5BB1009305F1B0 +:108CE0002C0249463046CDE901786B6AFFF74AFE0F +:108CF0000028E9D12D68BEE76B69002BE9D000930D +:108D000005F12C0249463046CDE901782B69FFF781 +:108D100039FE0028DDD0D7E70446ADE72DE9F04164 +:108D200004460D460127304E4FF00008226BD4E96F +:108D30000D13914224D1002B52D02068E16AD0F863 +:108D400020C00A44B2FBFCF10CFB11220021E262BC +:108D5000426AE06B934294BF23632263D208C4F853 +:108D600034800FF0F3FF201DFFF7D7FE0028DDD180 +:108D7000224631462046FFF74DFF0028D4D025E09B +:108D8000481C013BD4F83CC060634809A36301F070 +:108D90001F035CF8200007FA03F30342C7D1E36A1C +:108DA000194423681A6AB1FBF2F302FB131129601C +:108DB0000121256B636BAB4210D05A0903F01F00F1 +:108DC0005CF8222001FA00F0104001D1BDE8F081EA +:108DD00001336363A36B013BA363EBE70020F5E77B +:108DE0006FF01B00F2E700BF177600082DE9F04F87 +:108DF000044687B00E4600F1140A05A92046FFF785 +:108E00008DFF054648B920680599C368984705460F +:108E100000283BD010F1340FEFD0284607B0BDE852 +:108E2000F08F0DF11307736A5A4651462046CDF86C +:108E30000890CDE90087FFF73BFD70B9059B5246CE +:108E400004F120012046CDF80080CDE90179FFF73B +:108E5000BCFC20B110F1340FCFD00546DDE708F19E +:108E60000108B36A4345DCD82368A16A9A69706B2C +:108E70000FF05EFF236A04F120012068F362636A49 +:108E80003363FFF76AFC059B7362C6E7804606F111 +:108E90002C0B4FF00109E4E7CB695A0344BF23F4DC +:108EA00080234FF0FF322DE9F04148BFCB610546EA +:108EB000CB6990B048BFCA620C4613F400302CD086 +:108EC0000F6A2C22002102A80FF040FF236905F150 +:108ED0001406069363690793012396E80700CDE91A +:108EE000093710AB03E907004FF0FF3398466B6179 +:108EF000226A63699A4213D304F12C083246414630 +:108F00002846FFF735FC28B310F1340F05D1214670 +:108F10002846FFF76BFF0028F0D010B0BDE8F081C5 +:108F200001230DF1070202A9284600F052F900289A +:108F3000F3DB01230DF107022146284600F016F865 +:108F40000028EADB6B6901331CBFCDF83480C5F81B +:108F50001480CDE7636A2361236A6361E36923F4C4 +:108F6000003343F48033C4E90737D6E72DE9F04FE7 +:108F70009B468DB0CB69054604920C4603F0030274 +:108F8000012A00F020815E0314D4E66932051AD468 +:108F9000276A17EB0B0F00F1198116F4003618D071 +:108FA000D946E369B9F1000F25D123F400235A46CD +:108FB000E36104E0FFF770FF02460028E5D01046A9 +:108FC0000DB0BDE8F08F6269216A8A4288BF2262D3 +:108FD000DEE763699F42E3D923620BAA012321469E +:108FE00028468DF82C60FFF7C1FF021EE7DB236ADD +:108FF0009F42F2D8D4E79B0304F12C0620D52B68BE +:10900000A26ADB699A4242D12B6805F1140A1B6AF5 +:10901000AB63D4E90832CDE909230BA92846FFF751 +:109020007DFE0246F8B928680B99C3689847024646 +:1090300018B312F1340F16D14FF0FF332B62ECE767 +:10904000236A002BE0D004F12802013B3146284678 +:10905000029204F1240200930192D4E90423FAF766 +:109060008EFA024620B1E36943F40023E361A6E7E8 +:1090700031462868FFF771FBC6E70A9B286843BBA7 +:109080000B9A6262A362E36943F40033E361A8468A +:1090900058F8143BDF69A36AFF1A4F4528BF4F46B3 +:1090A000049B4246314628460193A36A02970093E7 +:1090B000636AFFF78AFB0246002875D010F1340F6F +:1090C000D1D121462846FFF791FE02460028E7D07D +:1090D000C9E7013B0AA905920A93FFF721FB0A9B06 +:1090E00029680133059AC9690A938B424AD1013034 +:1090F000904609AF90FAA0F3B3FA83F305930133D6 +:1091000006934FEA880352463146284607930423C4 +:10911000CDE90173079B00930B9BFFF756FB0246BB +:10912000002886D1059B434530D108F10108069BF4 +:109130004345E6D80B9B6362069B9B00A2E7012395 +:10914000002251462846CDF80080CDE90173099BE5 +:10915000FFF7AEFB0246002885D101235246314677 +:109160002846CDF80080CDE901730B9BFFF72DFB5E +:10917000024600287FF45DAF08F101080A9B98457C +:10918000DDD37DE790460DF12307F7E70423514631 +:109190002846CDE90173079B0093099BFFF788FBE5 +:1091A00002460028C1D05EE7236AA9EB07093B44C9 +:1091B0002362A36A3B44A362049B3B4404932B6851 +:1091C0001B6AAB63EDE66FF00802F8E66FF01A0277 +:1091D000F5E62DE9F04F1D46CB69904687B003F0C8 +:1091E000030207460C46022A54D09A0305D4266A85 +:1091F0006269964208D3002003E0FFF74DFE002885 +:10920000F5D007B0BDE8F08F961B04F12C0104F1F6 +:10921000280A04F1240BAE4228BF2E46B146B9F10C +:10922000000F01D13046ECE7E3695B0304D53B68EE +:10923000A26ADB699A4210D1236A384605910093ED +:10924000CDE901BAD4E90423FAF799F90028D8D175 +:10925000E369059943F48023E3613A683846A36AD9 +:10926000D56900220093ED1A636A05914D4528BF28 +:109270004D46CDE90185FFF71BFB0028C1D1236ACC +:10928000A844A9EB050905992B442362A36A2B4442 +:10929000A362C4E76FF00800B3E7F7B504460430F3 +:1092A0000E461546FFF739FC10B1002003B0F0BDA3 +:1092B000012300906A46294620460193FFF744FCAB +:1092C0000028F3D105F124073846FFF726FC0028D3 +:1092D000EBD131463846FFF70FFC38B13A46294604 +:1092E0002046FFF731FC0028EED0DFE70120DDE764 +:1092F0002DE9F34106460C46154601F124081027D6 +:10930000226AE16822F0004301F10C00043B98421C +:1093100017D80C230A463046616800932B1DFFF7CF +:1093200006FC014690B9E66828462E60FEF76CF907 +:109330003044E0602846FEF767F9A3691844A0614D +:1093400004E0002A06DB29606FF00101084602B044 +:10935000BDE8F081214642463046FFF7F5FB014665 +:109360000028F3D1A369E7601433A361C8E72DE9AE +:10937000F84314461D460022012306460F4604F119 +:10938000240805F10809C4E909234046FFF7C5FB95 +:1093900008B100200DE0424621463046FFF7D4FBDD +:1093A00038B92A4621463046FFF7A2FF18B1831C80 +:1093B000EBD0BDE8F8832B7903F07003202BF0D1BC +:1093C00039464846FFF798FB0028EAD10120F0E72C +:1093D00070B5054692B004300E46FFF79EFB68BBA1 +:1093E0000123019001AA07A928460293FFF7ACFBCD +:1093F000044618B910A8FFF790FB10B1204612B030 +:1094000070BD10AA07A92846FFF79EFB38B903AA2A +:1094100007A92846FFF76CFF18B1831CEAD0044661 +:10942000ECE79DF91030002BF1DB0822314605A84E +:1094300010F0E6FF0028EAD10124DFE70024DDE791 +:10944000F0B50127061DA7B0044680F840703046ED +:10945000FFF763FB0546002840F0818001462C227F +:1094600005A80FF073FC4FF000432822294610A8EE +:109470000D930FF06BFC1A9723681B6A9D4202D371 +:109480006FF033001BE019A8FFF747FB002866D1F7 +:1094900019AA10A92046FFF757FB80B90D9B002B96 +:1094A00038DB3046FFF739FB58B1199B0E931A9BF6 +:1094B0000F93002305A920461A4600F052F827B062 +:1094C000F0BD01AB1BAA0EA92046FFF750FF0028F4 +:1094D000F5DBEAD0039A0E99049B8A420F9801D1DA +:1094E000984217D0824201D1994213D00E92DFE701 +:1094F0009DF97030002B0DDA1DA92046FFF768FF9B +:109500000028DCDB1ED01BAA10A9204600F075F94C +:109510000028D4D11BAA10A92046FFF7E9FE002895 +:10952000E6D0831CCBD10DF1400C05AF0135BCE872 +:109530000F000FC7BCE80F000FC79CE8070087E8C3 +:10954000070099E79DF870301BAA10A903F07F036C +:109550008DF870300346204600F0C3F9D8E70020AC +:10956000ADE72DE9F04F2DED028B9BB006460D4681 +:109570000793CB6907980133059202EB0017CB6183 +:109580000B1DD1E9011408EE103A1346C5E901415B +:109590009F420FD10023CDE90941069330686968E5 +:1095A000C3689847044670B114F1340F00F0F4809A +:1095B0002046FFE0D86810332A6A024453F80C0CA6 +:1095C000121A2A62E4E705F11C080DF12C094FF08C +:1095D000FF3306F1200A10271022414648460B931C +:1095E000FDF7F0FF224600946B6851463046CDE906 +:1095F0000187FFF7EAF804460028D5D18346B8462C +:1096000008EE909A2AE0079B9B4580F2A080059A7D +:109610004FEA0B13D35802EB0B19434540F09780E8 +:1096200018EE900AD9E90212FDF7CCFFD9F80C30F8 +:109630000022514602933046D9F80830CDE9007334 +:109640006B68FFF7C2F804460028ADD1D9F80430A2 +:109650000BF1010B9844D9F80C301F442B6A23F00E +:109660000043043BBB42CED804230DF12C0800225A +:109670005146029330466B68CDE90078FFF7A5F8B4 +:109680000446002890D14FF0FF3302465146304641 +:109690007361FFF76DF80446002885D130680369CF +:1096A0009847044600287FF47FAF4FF0FF330FAF99 +:1096B000024669680F9330462B6A009723F00043F7 +:1096C000043BFFF7A2F9044600287FF471AF0F9A1C +:1096D0000B9B9A4260D1069B4BB306F104094846A6 +:1096E000FFF71BFA002875D143463A4609A93046D0 +:1096F000FFF73DFE00285DDB6CD06B6842463946C3 +:1097000030460D93AB680E93002300F0EAF8002872 +:1097100050D1494609A8FFF7EFF918B96B68736093 +:10972000AB68B3603046FFF78BFE002842D1346946 +:10973000002C3FF43DAF18EE101A201DFFF7DCF9A6 +:1097400018B96B686360AB68A3602468F0E7012315 +:1097500042460A99304600930FABFFF7E8F90446FA +:1097600000287FF425AF01220FA918EE900AFDF71B +:1097700029FF01232246514602930FAB3046CDE923 +:1097800000736B68FFF721F8044600287FF40CAFE4 +:1097900008F10108013761E74FF0FF3300220FA9FC +:1097A00009A833620123CDE90F23FFF7A5F930B9EA +:1097B0006FF033001BB0BDEC028BBDE8F08F18EEEC +:1097C000101A3046FFF7AAFA0123069300283FF447 +:1097D000E5AEEFE73A4609A93046FFF75EFD0028FF +:1097E000E8DBA4D06B68394630461893AB68199310 +:1097F00000231A46FFF7B5FE97E72DE9F0478046AC +:109800008CB010460C461646FDF7FEFE0B6A14306F +:1098100023F0004383421DD101AA04314046FFF7E3 +:109820003CFD051E12DB099A002A13DA236A01A9FE +:10983000404663F0004313400993636A0A93A36AA6 +:109840000B9300231A46FFF78CFE054628460CB002 +:10985000BDE8F087336830460193FDF7D5FE00235D +:10986000029001AA21464046CDE903330123FFF7C8 +:1098700078FE05460028E9D1D8F80C70211D4FF07C +:10988000FF3ACFB9D8F81070211D002FDED0381D57 +:10989000FFF732F970B9FC6833689C420AD9304648 +:1098A000FDF7B2FE201AF8603046FDF7ADFEBB6949 +:1098B000181AB8613F68E8E7381DFFF71DF930B99D +:1098C000D7F80C903368994503D1C7E901AA3F68DE +:1098D000D7E7FCD93046FDF797FEA9EB0000F8600A +:1098E000F5E770B5154688B00C26D27955F8044BCB +:1098F000002B07920094344403960494CDE9052389 +:1099000014BF022301236A46CDE90165FFF729FE52 +:1099100008B070BD70B592B006460D46FFF7BCFAB0 +:10992000044670BBEB6903F41023B3F5803F28D1E4 +:109930002A1D1046FFF7F1F818BB07A93046FFF7BC +:1099400003F90446E8B90C23EA680690009304ABD7 +:1099500008990392CDE904003046FFF7E8F8044681 +:1099600078B92B6903AA07A905936B690693034687 +:109970003046FFF7B6FF044618B9EB6923F480338D +:10998000EB61204612B070BD2DE9F04F2DED028B3A +:1099900085B01F68054608EE101A029340F62203B0 +:1099A0001446DFF840915360436893608368D36046 +:1099B0004946384610F021FE07EB00088346494629 +:1099C000404610F0F6FD0128064608EB000A05D1D6 +:1099D00017F80B302E2B0AD15746E9E7022806D19B +:1099E00002463F49404610F00BFD0028F4D0574690 +:1099F0004FF0010B4946504610F0FFFD82444946A6 +:109A0000504610F0D6FD024690B102280CD10390CA +:109A10005046334910F0F4FC039A28B9BBF1010B0E +:109A200004D10AF10207C3E70BF1010B9244E1E70D +:109A300098F80000002846D0029BC3F800802379E4 +:109A4000222B4AD104F1080A18EE101A2846524671 +:109A5000FFF77AF8002836D105F1140B224618EEEC +:109A6000101A2846FFF744FC68BB237903F07F03F4 +:109A7000112B01D0222BF1D1E379B342EED123682F +:109A800059466279284604331344A279134418EEE8 +:109A9000102ACDE900865268F9F749FD002812DB4B +:109AA000DCD095F84130002B82D194F90430002BA2 +:109AB000BFF67EAF51462846FFF78AFC002807D044 +:109AC00001DB6FF0010005B0BDEC028BBDE8F08F4B +:109AD000237903F07F0323716AE76FF01300F2E745 +:109AE000B4AB0108B7AB010873B50C4604310646A8 +:109AF000FFF714F90546F0B904F108013046FFF705 +:109B00000DF90546B8B90423024661683046009352 +:109B100004F11C03FFF70BF810B110F1340F0DD155 +:109B2000E36914220133E3614FF0FF33C4E90823F2 +:109B3000A3621023E360284602B070BD0546FAE731 +:109B40002DE9F043074695B00E469046994601F13F +:109B500024044046316AFDF757FD3B680844DB6941 +:109B6000984218D804394346002243F8041B09914F +:109B7000CDE90A230C23CDE90C3198F807303146A2 +:109B8000CDE90E29109309AA02233846FFF7E9FC14 +:109B900015B0BDE8F083002937DB354609AC0FCDA1 +:109BA0000FC40FCD0FC495E8070084E807003146C5 +:109BB0003846FFF799FF0028EAD1129B424631460A +:109BC0007362139BB362336A043B42F8043B039213 +:109BD0000C22CDE90130CDE9042398F8073001AA21 +:109BE000CDE90609089338460223FFF7BAFC00289E +:109BF000CED1119B024609A943F00043119373682B +:109C00001293B36813930346BFE7224631463846A2 +:109C1000FEF79AFF00289CD0BAE783690239023B1D +:109C20008B4283BF4389C06A01FB03000020704759 +:109C3000F7B505460191FDF7ECFD0446E8B9019939 +:109C40002846FFF7EAFFAA89286306462146686B83 +:109C50000FF07CF86F6B6B89A34208D9012332198E +:109C600039466878FDF73AFD08B90134F3E76889A9 +:109C7000001B18BF012003B0F0BD0120FBE738B581 +:109C8000036B05460C468B420FD0FDF7C2FD58B959 +:109C900022460123696B6878FDF74AFD00281CBF46 +:109CA0004FF0FF3401202C6338BD0020FCE7012970 +:109CB000F8B504460E4664D98369994261D20378A7 +:109CC000022B30D0032B45D0012B5AD101EB51058B +:109CD0008389416AB5FBF3F31944FFF7D0FF10B154 +:109CE0004FF0FF30F8BDA1896F1C2046B5FBF1F3A2 +:109CF00001FB1355636BB7FBF1F15D5D636A1944BA +:109D0000FFF7BDFF0028EBD1A289B7FBF2F302FBFE +:109D10001373626BD05CF30745EA00204CBF000967 +:109D2000C0F30B00DEE783895B08B1FBF3F3416A04 +:109D30001944FFF7A4FF0028D2D1A2897600B6FB10 +:109D4000F2F302FB1366636B9A19985D527840EA4E +:109D50000220C7E783899B08B1FBF3F3416A1944EA +:109D6000FFF78DFF0028BBD1A189B600B6FBF1F04B +:109D700001FB1066606B3044FDF775FD20F070400C +:109D8000B0E70120AEE72DE9F04F1E46036885B02D +:109D90000C469B6F82469146984703A92046FDF7E3 +:109DA00007FD05460746002840F0A380657C0DBBF3 +:109DB000237C13F00103009300F09D80E3682F469D +:109DC00062699B1A9E4228BF1E469EB10398626933 +:109DD0008389B2FBF3F103FB1123002B69D1438983 +:109DE000013B0B4001931ED18AB9A068012813D80A +:109DF00002256574DAF800305046DB6F9847002D75 +:109E00007CD0284605B0BDE8F04FFDF7AFBCA16996 +:109E10002068FFF74CFFE9E7431C03D10123009DB5 +:109E20006374E7E7A061DDF80CB0A1695846FFF75D +:109E3000F4FE0028DCD0019B03EB0008BBF80C30DB +:109E40009E4234D30199BBF80A209BF80100B6FB6F +:109E5000F3F319449142494684BF019BD31A424609 +:109E60000193FDF765FC019B0028D7D1DDF80CB00C +:109E70009BF803207AB1DBF83000A0EB08008342A6 +:109E800009D9BBF80C20DBF8341000FB02900193D9 +:109E90000EF04EFF019BBBF80C8003FB08F86369D2 +:109EA000A6EB08064744C144434463618DE7C4F808 +:109EB0001C80039862698389E169B2FBF3F803FBB4 +:109EC0001828A3EB0803B34228BF33469846FFF790 +:109ED000D6FE0028A2D1039A60699189B0FBF1F304 +:109EE00001FB1303516B4846424619440EF020FF14 +:109EF000D5E700277EE72F4607257BE7384605B0E4 +:109F0000BDE8F08F38B500230446C3704FF0FF332F +:109F10000363FFF7B4FE002851D1646B237894F8F3 +:109F2000FF5194F8FE01EB2B40EA052503D01833CE +:109F3000DBB2012B3CD84AF655239D4207D10822BB +:109F4000214904F1520010F05BFA002836D0227B40 +:109F5000E37A43EA0223A3F50072B2F5606F27D8D3 +:109F6000607B28B3591E421E0B40024013431FD191 +:109F7000E27BA37B53EA02231AD0237C013B012B13 +:109F800016D8A27C637C53EA022311D0227DE37CA5 +:109F900043EA02237F2B06D804F12000FDF763FC7F +:109FA000B0F5803F04D3E27DA37D53EA022308D1BC +:109FB0004AF6552085420CBF0220032038BD0420FC +:109FC000FCE70020FAE700BF9FB101082DE9F04F40 +:109FD000002687B00D4617460E60FDF7FDFB0028F2 +:109FE000C0F25181B04B53F82040002C00F04D815D +:109FF0002C602378BBB96070C0B2AC4D55F820001E +:10A0000003689B68984710F00106C3B240F03F8197 +:10A0100017F0FE0F02D05B0700F13B81607855F826 +:10A02000203023B90126304607B0BDE8F08FFDF798 +:10A0300045FBA0F50072A081B2F5606FF2D8421E18 +:10A040000242EFD1636B002B00F0F280002120462A +:10A05000FFF758FF022840F0FD80656B02AF05F561 +:10A06000E371B84605F206250846FDF7FCFB103102 +:10A0700048F8040B8D42F7D1002557F8041B00293E +:10A0800000F0DE802046FFF73DFF012800F2D98076 +:10A09000656BB4F80C902A7BEB7A43EA022399456E +:10A0A00040F0D680E87DA97D51EA002104D105F178 +:10A0B0002400FDF7D8FB0146E16195F810A0D4F823 +:10A0C00030B00AF1FF3384F802A0012B00F2C08007 +:10A0D0006B7B6381002B00F0BB805A1E1A4240F05C +:10A0E000B780AA7C95F8118048EA02280FFA88F216 +:10A0F000A4F8088000924FEA5912B8FBF2F702FB6D +:10A10000178292B2002A40F0A3802A7DE87C50EAB0 +:10A11000022005D105F120000193FDF7A4FB019B6E +:10A1200095F80FC0AA7B52EA0C2200F0918001FB47 +:10A130000AFC174407EB0C0E7045C0F08980A0EBB9 +:10A140000E009842B0FBF3F7C0F08280584B9F425C +:10A150007ED84FF6F5739F4240F29D804FF0030A80 +:10A1600002375A440BEB0E03BAF1030FA761C4F890 +:10A1700020B06262E36274D195F82B2095F82A3002 +:10A1800043EA0223009A1A4313B2002B60D1BF00A6 +:10A1900005F12C00FDF767FBA06209F1FF331F44B6 +:10A1A000B7FBF9F9894553D84FF0FF33BAF1030FE4 +:10A1B000C4E904334FF08003237130D195F8312086 +:10A1C00095F8303043EA0223012B28D10BF101012D +:10A1D0002046FFF754FD10BB616B207191F8FF2101 +:10A1E00091F8FE3143EA02234AF65522934216D1F2 +:10A1F0000846FDF738FB2F4B984210D101F5F2705D +:10A20000FDF731FB2C4B984209D101F5F470FDF7B5 +:10A210002AFB606101F5F670FDF725FB2061274AF6 +:10A2200084F800A0138801339BB21380E380FAE620 +:10A230000EF01AFD606300287FF408AF1126F2E6E5 +:10A2400003200135042D7FF418AF04283FF4EAAE53 +:10A250000D26E8E604283FF4E5AE01287FF618AFA6 +:10A26000F6E7B8F1000FF3D0BAF1020F4FEA470357 +:10A2700062441ABFDB1907F001071F46A26218BF2C +:10A2800007EB530789E70B26CDE60C26CBE6032622 +:10A29000C9E60A26C7E640F6F57A57458CBF4FF067 +:10A2A000020A4FF0010A5BE740140224F41402246E +:10A2B000F5FFFF0F52526141727241613C1402245A +:10A2C0002DE9F74F154680462822002128460EF03A +:10A2D0003DFDD8F8003040469B6F984708F14C038D +:10A2E000002201A968460093FFF770FE0646044667 +:10A2F00000286ED1DDF80490D9E9057AAAF10203AD +:10A300009F421CD999F80060012E35D14FF0020A06 +:10A31000074651464846FFF7CAFC431C59D001285E +:10A3200056D000B90137019B0AF1010A9B699A4591 +:10A33000EFD3019B1A795F6142F001021A71B9F8FB +:10A340000C300024D9F818204046C5E90033023A01 +:10A35000B9F80A305A435F430C236B62D8F80030D7 +:10A36000C5E90224DB6FC5E90474C5E906749847A2 +:10A37000204603B0BDE8F08FD9F8241007463CB959 +:10A38000019801F1010BFFF77AFC064608BB59461C +:10A39000019E3278736B022A03EB04000FD11B5D20 +:10A3A0000234427853EA022308BF0137B389BAF175 +:10A3B000010AB4FBF3F203FB1244E0D1B9E7FDF765 +:10A3C00052FA30F0704304F1040408BF0137EDE79E +:10A3D0000226D8F800304046DB6F9847304603B07D +:10A3E000BDE8F04FFDF7C2B97FB5CDE9001003A875 +:10A3F00014460391FDF7F0F9051E19DB0D4E56F8D2 +:10A40000252022B10023506B13700EF035FC019B08 +:10A4100013B100221A705A6346F825302CB100227D +:10A4200001A96846FFF7D2FD0446204604B070BD7E +:10A430000B24FAE740140224F8B5036804469B6F26 +:10A440009847236D013307D123686FF01505204627 +:10A45000DB6F98472846F8BD002204F14C01104FED +:10A460001046FFF7C1FF236D064657F82300036827 +:10A47000DB6898472368054618B1DB6F204698478C +:10A48000E8E7226DDB6F47F822004FF0FF322046ED +:10A49000226598473046BDE8F840FDF767B900BF30 +:10A4A000F4140224084B10B503608C330446436057 +:10A4B000FFF7C2FF054B204623602C3340F8043FD2 +:10A4C00007F070FF204610BD28AE0108C4AE010899 +:10A4D000A0F10400FFF7E6BF10B50446FFF7E2FF66 +:10A4E00020460EF0C9FB204610BDA0F10400FFF786 +:10A4F000F3BF0000036873B504469B6F01920D46DD +:10A500009847236D019A013307D023682046DB6FFB +:10A5100098476FF0150002B070BD1648002306463C +:10A5200050F8041BD9B946F8235004F114002365F0 +:10A53000303384F84E1004F14C0184F84C303A2347 +:10A5400084F84D30FFF750FF236805462046DB6F47 +:10A550009847284602B0BDE87040FDF707B90133BF +:10A56000042BDDD123682046DB6F98476FF00B008A +:10A57000D1E700BFF414022401292DE9F843044671 +:10A580000E46174640F2838083698B427FD9037859 +:10A59000022B45D0032B5AD0012B78D101EB510966 +:10A5A0008389416AB9FBF3F31944FFF768FB054659 +:10A5B00060BBA38916F00106606B09F10108B9FBC5 +:10A5C000F3F203FB12920FBFFBB2835C03F00F01A7 +:10A5D0003B011CBF03F0F0030B4383540123616A6A +:10A5E0002046E370A389B8FBF3F31944FFF747FB58 +:10A5F000054658B9A389616BB8FBF3F003FB1080E3 +:10A600003EB1C7F307170F540123E3702846BDE896 +:10A61000F8830B5CC7F3032723F00F031F43F2E714 +:10A6200083895B08B1FBF3F3416A1944FFF727FB09 +:10A6300005460028EAD1A2897600B6FBF2F302FBB8 +:10A640001366636B9F5598193F124770DCE7838947 +:10A650009B08B1FBF3F3416A1944FFF710FB054671 +:10A660000028D3D1A389B60027F07047B6FBF3F1D9 +:10A6700003FB1161666B0E443046FDF7F4F800F001 +:10A68000704047EA00013046FDF7E5F8BCE70225D7 +:10A69000BCE72DE9F041804605680F4649B92E69AF +:10A6A000C6B1AB69B34298BF01266B69A3B9002458 +:10A6B00006E02846FFF7FBFA0128044603D80124E8 +:10A6C0002046BDE8F081421C51D0AB698342F7D8E7 +:10A6D0003E46EAE70126E8E7BE4215D1AB69741CA5 +:10A6E000D8F80000A34298BF02242146FFF7DFFA02 +:10A6F0000128E4D0431C3AD0D8B12B69012B03D9EF +:10A70000AA69934238BF1E4634460134AB69A3425E +:10A7100002D8012ECBD902242146D8F80000FFF739 +:10A72000C6FA40B10128CAD0013020D0B442ECD1E1 +:10A73000BDE7002CE8D04FF0FF3221462846FFF756 +:10A740001BFF90B957B92C61D5E90532023A934203 +:10A7500010D92B7943F001032B71B1E7224639461A +:10A760002846FFF709FF0028EDD00128A7D14FF0B8 +:10A77000FF34A5E7013B6B61EBE72DE9F3410D46A3 +:10A7800001A90446FDF714F80646002863D1667C4B +:10A79000002E60D1E368AB4204D2227C12F0020F9B +:10A7A00008BF1D46002263696261B5B90020E268F6 +:10A7B0006369934281BF227CE36042F040022274CD +:10A7C000019A9189B3FBF1F201FB1233002B42D0C5 +:10A7D000E369834218BFE0613DE0019A518997899E +:10A7E0004F4373B3013B6A1EB3FBF7F1B2FBF7F2C1 +:10A7F0008A4226D37A42A1691340ED1A6361002987 +:10A80000D4D0BD4263690CD93B44A5EB0708636112 +:10A81000237C9A072AD52046FFF73BFF054648BB15 +:10A820000146636901982B4463618389B5FBF3F2A8 +:10A8300003FB1255002DB9D0FFF7EFF948B11044D2 +:10A84000B5E7A16881B92046FFF723FF012801463B +:10A8500005D102266674304602B0BDE8F081481C7E +:10A8600001D10126F6E7A160A161C8E72068FFF7E2 +:10A870001EFA05466B1CF4D0012DEAD9019B9B6999 +:10A88000AB42E6D92946A5614546BAE7F8B51F4669 +:10A89000036806460D469B6F14469847022F11D158 +:10A8A000EB681C4421462846FFF767FF33680446DF +:10A8B0003046DB6F6D69984744B12046BDE8F840EB +:10A8C000FCF754BF012FEDD16B69EAE72846F8BDCC +:10A8D0002DE9F04107690446884606682037B7F538 +:10A8E000001F24BF00238361836983B1B289B7FB52 +:10A8F000F2F002FB1072002A38D101336169A361C2 +:10A9000039B93389B3EB571F30D80023A361042032 +:10A910000AE07389013B034228D13046FFF7C7F9AB +:10A920000128054602D80220BDE8F081421C01D171 +:10A930000120F9E7B369834212D8B8F1000FE4D0DF +:10A9400061692046FFF7A5FE0546D0B10128EAD08F +:10A95000431CEDD001463046FFF76AF90028E7D1E5 +:10A96000294630466561FFF758F9A061B289002099 +:10A970002761B7FBF2F302FB1373776B1F44E761A8 +:10A98000D2E70720D0E737B50D4601A90446FCF70A +:10A990000FFF18B920461DB9F8F76AFD03B030BDA6 +:10A9A000F8F79AFD10F0FB03F8D16B72A3691BB1A5 +:10A9B00029462046FCF75FFF00212046FFF788FF6D +:10A9C000042808BF0020E9E7036870B50D46044677 +:10A9D0009B6F984728460021FFF7D5FF2368204644 +:10A9E000DB6FBDE8704018470368F0B516460F6985 +:10A9F00087B09B6F05460C469847B74209DD00219A +:10AA00002046FFF7C0FF2B682846DB6F984707B04A +:10AA1000F0BDB742F7DA69462046FFF7B4FF276971 +:10AA20000028F0D19DF80930002BF2D1EBE7036844 +:10AA300070B50E4686B004469B6F15469847304663 +:10AA40006946FFF7A0FF236806462046DB6F98475C +:10AA50002EB1304606B0BDE87040FCF787BE9DF8C9 +:10AA6000090078B19DF808300C220DF10901284643 +:10AA700013F0100F14BF0323052385F800310FF0E6 +:10AA8000A9FD012006B070BD2DE9F74F0446D0F8AE +:10AA900000900D4611F8013B2F2BFAD05C2BF8D01B +:10AAA0000023A3602B781F2B25D904F120074FF03A +:10AAB000203BC5F1020305F1FF3A00264FF00808DC +:10AAC0000093514A514BC7F804B0C7F800B0C7F81B +:10AAD00007B0009901EB0A001AF8011F20292ED9AE +:10AAE0002F2901D05C290FD12B5C2F2B01D05C2B9F +:10AAF00025D10130F8E78023204684F82B3003B0BD +:10AB0000BDE8F04FF8F7B4BC2E2976D0B04572D925 +:10AB10000806184644BF01F07F01515C01910FF017 +:10AB20003BFD002867D10199384BA1F16100364AFD +:10AB300019289CBF2039C9B2B9550136C9E7054467 +:10AB4000002E58D094F82030E52B04BF052384F85C +:10AB50002030202928D92B78212B34BF042300232F +:10AB6000204684F82B30D4F80080F8F781FC0646A4 +:10AB7000E8B9A1694046FFF782F80646B8B9E0692E +:10AB800003789BB1C37A03F03F03A371C67A16F032 +:10AB9000080604D10B2239460FF032FC38B10021EF +:10ABA0002046FFF795FEE2E70423D9E7042694F850 +:10ABB0002B304EB1042E03D113F0040F08BF05262D +:10ABC000304603B0BDE8F08F5A07F9D4A379DB060D +:10ABD0000FD5B9F80C10226999F80000B2FBF1F317 +:10ABE00001FB1323D9F834101944FCF7D2FDA060FF +:10ABF0005FE70526E4E70626E2E7B8F10B0FFAD097 +:10AC000008264FF00B0864E7D3B10108A8B101088A +:10AC100070B505460668F8F72BFC044648BBA969E1 +:10AC20003046FFF72CF8044618BBEB691B78E52B80 +:10AC300018D1A9693046FFF722F8044680B92022CE +:10AC40000146E8690EF082F8EB6955F8202F1A608A +:10AC50006A685A602A891A81AA7A9A720123F37063 +:10AC6000204670BD002BE4D001212846FFF730FEBE +:10AC7000D3E7042C08BF0724F2E700002DE9F74FC3 +:10AC80000C46804611460568012C5AD9AB69A3428F +:10AC900057D962B92746DFF8B4902146D8F80000AA +:10ACA0002646FFF704F8044658B9002006E04FF0A6 +:10ACB000FF322846FFF760FC0028EBD003B0BDE868 +:10ACC000F08F01283DD0431C3DD00022314628465C +:10ACD000FFF752FC0028F1D1D5E90532023A934240 +:10ACE00005D201336B612B7943F001032B71731C87 +:10ACF000A34222D095F801B059F82B30E3B1394680 +:10AD00002846FEF78AFF314682462846FEF785FF31 +:10AD10006F8906465846FCF7D1FC02463E4459F876 +:10AD20002B00A6EB0A060368A6FB0267CDE90067C5 +:10AD3000196AA2FB0A2388472746AB69A342ACD80D +:10AD4000B3E70220BAE70120B8E700BFF4140224F9 +:10AD50002DE9FF4103680C46019206469B6F984718 +:10AD6000019920466769FFF708FD054648B1336839 +:10AD70003046DB6F9847284604B0BDE8F041FCF749 +:10AD8000F5BC03A92046FCF713FD05460028EED1CB +:10AD9000657C002DEBD1237C9A0701D40725E6E7DB +:10ADA000D4F81480E368984508D320463946FFF765 +:10ADB000E4FC044670BB04B0BDE8F081B8F1000FBC +:10ADC00011D12A46A1682046FFF758FF0546C4F86E +:10ADD00008806369E360237C43F040032374002D03 +:10ADE000E3D06574C3E7A1692068FEF760FF431CE8 +:10ADF00001460BD001280BD0039B9B699842E8D2F7 +:10AE0000A2692046FFF73AFF0546E2E70125E0E7A1 +:10AE10000225DEE733683046DB6F98472046ABE714 +:10AE200070477047034B10B504460360FDF728FADE +:10AE3000204610BDC8AD010810B50446FFF7F2FF6B +:10AE400020460DF019FF204610BD000008B5036A2A +:10AE5000013B036200680AF063FA014630B1044B1B +:10AE60001B78DBB213B90348F8F7BEF808BD00BF82 +:10AE7000440B02241701028008B5034807F09AF931 +:10AE8000BDE80840FFF7E2BFCC14022410B5044629 +:10AE90000068FCF781FB014618B9236A013323627D +:10AEA00010BD044B1B78DBB2002BF9D10248F8F738 +:10AEB0009BF800BF440B02241501028008B503482B +:10AEC00007F078F9BDE80840FFF7E0BFCC14022492 +:10AED00013B5154C204607F06DF9FFF7D7FF204654 +:10AEE00007F068F9FFF7B2FF4FF0FF324FF0FF3382 +:10AEF0006846CDE900230DF045FDD0E90232DB02C2 +:10AF000043EA0243426843EA4213026802EBD27208 +:10AF100043EA620342690069503A013043EA4263FE +:10AF200043EA405002B010BD50140224F7B501A905 +:10AF30000546FCF73DFC044660BB2C7C14F0400445 +:10AF400028D0FFF7C5FF296A07460198FEF797FE4C +:10AF50000446F8B96E6AF37A314643F02003F3727F +:10AF6000AA682868FCF70AFCE96806F11C00FCF7EF +:10AF700072FC394606F11600FCF76DFC01230198BE +:10AF8000B474F474C370FDF761F82B7C044623F0AD +:10AF900040032B74204603B0F0BD38B503680D465E +:10AFA00004469B6F98472846FFF7C0FF2368054675 +:10AFB0002046DB6F98472846BDE83840FCF7D6BBF3 +:10AFC0002DE9F04F1E46036885B00D469B6F824603 +:10AFD0009146984703A92846FCF7EAFB0446074632 +:10AFE000002840F0D6806C7C5CBB2B7C9A0740F13B +:10AFF000D2806B690027DE42009728BFDE43002E17 +:10B0000000F0BB8003986A698389B2FBF3F103FB0C +:10B010001123002B40F08D80B0F80A8008F1FF3832 +:10B0200018EA010825D1D2B9A86830B901462846E6 +:10B03000FFF72FFB002800F0A080012811D1022487 +:10B040006C74DAF800305046DB6F9847002C00F043 +:10B05000A580204605B0BDE8F04FFCF787BBA96985 +:10B06000E5E7431C01D10124EAE7AB68A86103B915 +:10B07000A8600398EB69026B9A4247D0DDF80CB0E8 +:10B08000A9695846FEF7C9FD0028D8D0BBF80C3096 +:10B0900008EB00029E423ED3BBF80A10B6FBF3F366 +:10B0A00008EB030088429BF8010088BFA1EB08036E +:10B0B0004946CDE90023FCF711FB8046DDE900237A +:10B0C0000028D0D10398016B891A8B420AD9828952 +:10B0D000406B02FB019100930DF02AFE039A009B46 +:10B0E00082F80380039AB2F80C8003FB08F801236E +:10B0F00000936B69A6EB0806EA6847444344C144E1 +:10B100006B619A422CBFEA60EB6078E7FCF781FB49 +:10B110000028B3D0A7E76969EB68994208D358467D +:10B120000192FCF776FB019A00289CD1039B1A63DD +:10B13000EA6103986B69B0F80C80E969B3FBF8F237 +:10B1400008FB1232A8EB0208B04528BFB046FEF754 +:10B1500096FD002887D1039A69699089B1FBF0F3C5 +:10B1600000FB1313506B4946424618440DF0E0FDB6 +:10B17000039B4FF00102DA70BBE72B7C43F04003E6 +:10B180002B74009B002B3FF45CAF2846FFF7CEFEEC +:10B1900057E7002755E72746072452E7384605B00A +:10B1A000BDE8F08F036873B50D469B6F0646984760 +:10B1B0002846FFF7BBFE044630B901A92846FCF734 +:10B1C000F7FA044600B9286033683046DB6F9847C9 +:10B1D00015B128460DF050FD204602B0BDE8704084 +:10B1E000FCF7C4BAF0B50E4685B090F820100546BD +:10B1F0001446DDE90A7C19B96FF47A6005B0F0BD38 +:10B200000168CDE9007CC96B88470028F4D0296922 +:10B210000D486118039106F0CDFFFFF737FE02F0ED +:10B22000A1FB02F07BFB3A46039930460DF080FD0E +:10B2300002F062FB02F084FB034806F0BBFFFFF75D +:10B2400005FE0020DAE700BFA414022410B504466E +:10B2500004300AF04BF904F15400FFF717FE002305 +:10B26000206C6361012384F83D30BDE8104009F093 +:10B2700091BF00001FB5002304460362074B0093F3 +:10B28000031D684602931C2303930B2301930AF0CA +:10B290005BF82060204604B010BD00BFC2AB0108BF +:10B2A0000CB41FB506AB002453F8042B0094039391 +:10B2B000FDF704F904B0BDE8104002B0704700008B +:10B2C0000FB41FB5084906AB0020096853F8042BDA +:10B2D0008968039300916FF00041FDF7EFF805B026 +:10B2E0005DF804EB04B070473C030024F0B50C4655 +:10B2F0008BB0064624B93260046130460BB0F0BD15 +:10B30000104601920EF016FB043002F06BFA3A235D +:10B310003034054643702F230470033000F8013C9D +:10B320003746019906AC0EF0FDFA084B002247F8AB +:10B33000045B0593064B029302ABCDE903220FCBCE +:10B3400084E80F0087E80F00D7E700BF4D760008BC +:10B350002D800008F0B506468BB02C200F460192D8 +:10B3600002F040FA019A0546316D05A8FFF7BEFFCD +:10B37000336830469B6F9847059B0393002D3DD063 +:10B38000002204A903A8FEF721FE044680B9049B0D +:10B39000284603992B60FFF777FB0446002831D13C +:10B3A00095F92B30002B0CDBAB79DB0603D405249D +:10B3B00000232B6010E0049BE9691878FCF7E9F999 +:10B3C000A860049B2846DB88AB80F8F751F8042876 +:10B3D0000446ECD00028EBD133683046DB6F984749 +:10B3E00074B128460DF048FC2046FCF7BFF904462E +:10B3F00005A8FCF72EF920460BB0F0BD0924EBE7B9 +:10B400003D60F5E70428D2D0D2E72DE9F0470546A4 +:10B4100094B01C4628200E46019202F0E3F9019AEE +:10B42000296D074604A8FFF761FFA10756BF04F086 +:10B4300001084FF0030808F10108A20505D56305CE +:10B440004CBF48F0080848F010082B682007284631 +:10B450009B6F48BF48F030089847049B029397B908 +:10B4600009242B682846DB6F984738460DF004FC0A +:10B470002046FCF77BF9044604A8FCF7EAF82046CE +:10B4800014B0BDE8F087424603A902A8FEF79EFD6E +:10B490000446002855D1039B09A802990993FFF798 +:10B4A000F3FA044620B99DF94F30002BB8BF0624AB +:10B4B00018F01C0F00F09880002C45D0042C40D1CF +:10B4C00009A8FFF7A5FB044600283AD148F0080870 +:10B4D000FFF7FEFC0146019010980E30FCF7BBF917 +:10B4E000109801991630FCF7B6F9039C1099207852 +:10B4F000FCF74FF9202300228146CB722046109999 +:10B50000FCF73CF9109B002201211A775A779A77B1 +:10B51000DA77039BD970B9F1000F70D0494609A8BA +:10B52000D3F830A0FFF7AAFB044650B95146039860 +:10B53000FEF7A5FB09F1FF33039A044613610028C7 +:10B540005DD000233B608CE79DF82A3013F0110F8B +:10B5500061D118F0080FBBD1039CDDF84090236B3C +:10B560004946C7F824903B622078FCF712F901465F +:10B57000B86009F11C00FCF776F9E38818F0200F99 +:10B580008146BB804FF00003F8603C6087F8108074 +:10B590007B74FB617B6120D0F8B16389A4897861F9 +:10B5A0005C434C4531D23868A9EB0409FEF77FFBB8 +:10B5B000012801462BD9431CF3D10124B961002C89 +:10B5C000BFD103988389B9FBF3F203FB129323B134 +:10B5D000FEF723FB08B31044F8612B6828460024CB +:10B5E000DB6F9847376047E7002CAAD19DF82A30D7 +:10B5F000D9060ED418F0020F01D0DA070BD418F0D8 +:10B60000080F18BF48F04008A6E70024D6E7022438 +:10B61000D4E7042495E7072493E7022491E770B563 +:10B6200098B0054616460A46016D02A8FFF75EFE71 +:10B630002B6828469B6F98471822002107A80DF019 +:10B6400085FB029B00220DA901A80193FEF7BEFC19 +:10B65000044650B901990DA8FFF716FA044620B91F +:10B660009DF95F30002B0EDA06242B682846DB6F2D +:10B6700098472046FCF77AF8044602A8FBF7E9FF52 +:10B68000204618B070BD139B8DF825001BB107A98B +:10B690000DA8FCF7F0F89DF8242040F2FF11079B5D +:10B6A000284612F0100F4FF00004336114BF4FF41E +:10B6B00080434FF4004312F0010F40F26D1208BFB7 +:10B6C0000A46134373602B68DB6F9847D5E7F0B5E4 +:10B6D00097B005460A46016D06A8FFF707FE2B68DE +:10B6E00028469B6F9847069B022201A96846009353 +:10B6F000FEF76CFC0446064600286AD1019B0BA8A5 +:10B7000000990B93FFF7C0F90446002879D004286C +:10B710005FD1019B314602A80293FEF7BAFF0446AF +:10B72000002864D0012864D0431C5F425F41FFF7CA +:10B73000CFFB0646002F5ED121460198FEF778FA2E +:10B74000002858D1019B4FF0203210215B6B1A600A +:10B750005A60C3F807202E22019B5B6B1A70019B75 +:10B760005A6BD1723146586B1630FCF774F8019859 +:10B770002246416BFCF702F80198436B03F120026B +:10B78000114653F8047B934241F8047BF9D1436B93 +:10B790002E22012783F82120416B0D9A2031FBF7DF +:10B7A000EDFF019B0BA8DF70FFF732FA18BB129870 +:10B7B00031461630FCF74FF8224601981299FBF7F4 +:10B7C000DDFF129B10220198DA72C770FCF73EFC75 +:10B7D00004462B682846DB6F98472046FBF7C6FFD8 +:10B7E000044606A8FBF735FF204617B0F0BD072733 +:10B7F0009DE702279BE70022214602A8FFF73EFAB9 +:10B80000E6E70824E5E770B5ACB0054614460A46FD +:10B81000016D09A8FFF76AFD2246296D04A8FFF70C +:10B8200065FD2B6828469B6F9847099B02A80193EA +:10B83000049B0293FBF7D0FF0028C0F2A6800222EF +:10B8400003A901A8FEF7C2FB0446002840F08C8043 +:10B85000039B16A801991693FFF716F904460028D2 +:10B8600040F082809DF8833013F0A00F40F08F806D +:10B870001D9B0EAC03F120061868083353F8041C16 +:10B880002246B34203C21446F6D116AC21AE0FCC09 +:10B890000FC60FCC0FC694E8070086E80700029990 +:10B8A00021A8FFF7F1F8044648B9239A189B9A4259 +:10B8B00003D1259A1A9B9A4203D0082454E0042805 +:10B8C00052D121A8FFF7A4F9044600284CD12899A9 +:10B8D0000DF145030DF1550001F10D0253F8044B34 +:10B8E000834242F8044BF9D11888012610809B78D6 +:10B8F00093709DF84330039CDA0658BF43F0200351 +:10B90000CB72E670CB7ADB061ED5189A239B9A423F +:10B910001AD02078FBF73DFF01462046FEF77DF95F +:10B920000146002835D02046FEF7A9F90446D8B9CB +:10B930000398416B91F821302E2B05D1239A2031A9 +:10B94000FBF71CFF039BDE70169E1C993046FEF72A +:10B9500096F9044640B91D9BE5221A700123F37045 +:10B960000398FCF773FB04462B682846DB6F984767 +:10B970002046FBF7FBFE044604A8FBF76AFE09A875 +:10B98000FBF767FE20462CB070BD0B24ECE70624C5 +:10B99000EAE70224E8E7F0B59FB005460A46016DE4 +:10B9A00003A8FFF7A3FC2B6828469B6F9847039BCF +:10B9B000022202A901A80193FEF708FB044680B900 +:10B9C000029B08A801990893FFF75EF8044640B966 +:10B9D0009DF94B30002B49DB9DF82670FA0710D5F6 +:10B9E00007242B682846DB6F9847072C40D0204659 +:10B9F000FBF7BCFE044603A8FBF72BFE20461FB056 +:10BA0000F0BD029C0F992078FBF7C3FEFB060646AB +:10BA100012D4089F0E993846FEF731F904460028E3 +:10BA2000DFD10F9BE5221A700123FB70AEB902989B +:10BA3000FCF70CFB0446D4E7159013A81394F7F712 +:10BA400017FD04460028CCD113A8F7F745FD04469E +:10BA50000028C5D00428C4D1DBE70246314608A837 +:10BA6000FFF70CF904460028BBD1E0E70624B8E74D +:10BA70006FF05904BFE700002DE9F34D00F11C03FE +:10BA8000074653E8002F013243E80026002EF8D184 +:10BA9000012A40F08680786803689B6898470646CC +:10BAA00068BB786803685B6A9847422838BF4220C1 +:10BAB000044601F097FE80467868C4F5007203687A +:10BAC0004146CDE900465D693346A847064698B928 +:10BAD000A4F1420308EB030595F84030552B64D1DF +:10BAE00095F84130AA2B60D17B7E05EB031313F848 +:10BAF000102C520608D02E4E40460DF0BDF8002303 +:10BB000087F82030FB614CE013F80C2C0F2A04D886 +:10BB100048F22103D340DB07EDD478684FF0000AE8 +:10BB20000368DB6A98477B7EB0F5007F03F1FF3343 +:10BB300038BF4FF4007005EB03131A793A7653F8C7 +:10BB4000081F0A0A61F3070A62F30F2A0A0C090E9A +:10BB500062F3174A002261F31F6AA0FB0AABC7E930 +:10BB600002AB5B68190A63F3070261F30F22190C39 +:10BB70001B0E61F3174263F31F62A0FB0245786856 +:10BB800052460368C7E90445CDE90045596C5B4658 +:10BB900088470028AFD00123404687F820300DF0B9 +:10BBA0006BF8304602B0BDE8F08D024EA4E700BF4E +:10BBB000E2F3FFFFE3F3FFFF70B51D4B05460446BC +:10BBC00045F8543B2846FFF761F9206C666909F097 +:10BBD000E1FA0023636194F83D306BB9012384F8E6 +:10BBE0003D304EB1EFF3058333B908F045FF18B986 +:10BBF0003046DFF840C000DF2846FFF727F994F809 +:10BC00003C302BB1A06A08B10DF036F80023A362D6 +:10BC1000606D09F055FB256CEFF3058333B908F02F +:10BC20002BFF18B92846DFF810C000DF204670BD92 +:10BC3000D8B001089D3201086D33010810B50446E3 +:10BC4000FFF7BAFF20460DF017F8204610BD0000A0 +:10BC50002DE9F04700238AB0814642F21078DFF8E0 +:10BC60005CA001240025002600278DF82730EFF383 +:10BC700005832BB908F000FF10B90120D44600DF7E +:10BC80000DF127034FF0FF320521484604930023AE +:10BC9000CDE9064500934FF0FF33CDE9026700F090 +:10BCA00084F89DF8273013F0010002D0B8F10108A4 +:10BCB000DDD180F001000AB0BDE8F087BD38010891 +:10BCC000F0B500258BB004468DF82750FFF7C0FF74 +:10BCD00018B94FF0FF300BB0F0BD002600270495D7 +:10BCE0004FF0FF3200954FF0FF3306212046CDE99B +:10BCF0000667CDE9026700F058F805460028E8D14C +:10BD00002046FFF7A5FF0028E3D0012200230521EC +:10BD100020460095CDE906230DF127034FF0FF32B1 +:10BD200004934FF0FF33CDE9026700F03EF800289E +:10BD3000CFD19DF8270080F0020040F34000CAE711 +:10BD400070B51D46D0F8F43086B00646013317D0E2 +:10BD5000140E8DF81740FFF7B3FF70B901234FF0B1 +:10BD6000FF32D6F8F41000930DF11703CDE901006E +:10BD7000301DF9F7D3F906B070BD4FF0FF30FAE788 +:10BD800090F8FA31032B0ED06B1C08BFB2F1FF3FC5 +:10BD900009D0002D08BFB2F1807F2CBF4FF0FF30DB +:10BDA000002040B2E7E70020E5E72DE9F7430A9ECF +:10BDB000044615460C9FDDF83880DDF8409001916F +:10BDC000FFF7BEFF58B933462A460199201D0A974E +:10BDD000CDE90B8903B0BDE8F043F9F79FB903B093 +:10BDE000BDE8F083D0F8E83001332DE9F04705468F +:10BDF00088B08A461DD1FFF763FF28B14FF0FF34AA +:10BE0000204608B0BDE8F0870022002301210490FD +:10BE1000CDF800A0CDE90623D5F8E4304FF0FF328D +:10BE2000CDE902304FF0FF332846FFF7BEFF04464E +:10BE3000E6E7FFF745FF0028E0D14FF000084FF09C +:10BE400000090126002704904FF0FF324FF0FF3326 +:10BE500001212846CDF800A0CDE90689CDE9026789 +:10BE6000FFF7A3FF04460028CAD12846FFF728FFA2 +:10BE70000028C3D10AF101014FF0FF324FF0FF3328 +:10BE800004940091D5F8E810CDE90689CDE9026760 +:10BE9000CAE7F0B5012289B00023002600270C462E +:10BEA000049105210546CDE9062300234FF0FF321A +:10BEB00000934FF0FF33CDE90267FFF776FF98B9A3 +:10BEC000D5F8E430013B0FD0013400904FF0FF3241 +:10BED000D5F8EC100494CDE90630CDE902674FF0B7 +:10BEE000FF332846FFF761FF09B0F0BDF0B500F160 +:10BEF000BC07044689B03846FEF7C8FF94F80452E0 +:10BF00002DB93846C4F80052FEF7A0FF09E0D4F876 +:10BF10000062013EC4F8006236B100253846FEF7E3 +:10BF200095FF284609B0F0BD0022002304212046D9 +:10BF300004960096CDE90623CDE902234FF0FF33A6 +:10BF40004FF0FF32FFF731FF002884F804623846D3 +:10BF50000CBF00256FF47A65FEF778FFD4F8B43093 +:10BF6000002BDED11048B4F9B84006F023F9FEF7F3 +:10BF70008DFF0E4B1B6803F114011A460233B2F910 +:10BF80000000A0420CD14FF6FF731380084A1368DB +:10BF9000002B01DD013B1360034806F00BF9B3E70A +:10BFA0008B42EAD1F8E700BF78140224D0060024BF +:10BFB000A01402242DE9F04700F1BC0788B0044624 +:10BFC0001546109E384605938946FEF75FFF2A46C0 +:10BFD000059B2046D4F8E0A00796FFF7B1FEA0BB72 +:10BFE00094F8FD3104F1040894F8F92103934046D4 +:10BFF00094F8FE31029394F8FB31CDE9002394F8D4 +:10C00000FA3194F8F81106F033FA0646E8B994F8D4 +:10C01000FB0107AB5146B0FA80F04009CDE900932F +:10C0200042422B464046F7F7CDF9054632463146A7 +:10C030004046CDE90266CDE9006694F8FA3106F093 +:10C0400017FA45EA000464B20CB16FF47A6438461A +:10C05000FEF7FCFE204608B0BDE8F0872DE9F04F62 +:10C0600092469B468DB00446D0E944239B4508BFC9 +:10C07000924528D2D0F828C1BCF1000F23D0BCF1E2 +:10C08000010F0CD000F5B47E0025AC451BDDFEE8A9 +:10C090000201594508BF504502D20135F5E7002598 +:10C0A000611991F85411059116991AEB0106179927 +:10C0B0004BEB0107BB4208BFB24207D2614C20469E +:10C0C0000DB0BDE8F08F4FF0FF35E9E72368524629 +:10C0D0002046196B5B46884702460B465046594638 +:10C0E0000EF010FD1343E9D116F1FF32236820460C +:10C0F000196B47F1FF33884702460B4630463946F5 +:10C100000EF000FD1343D9D104F5E4730993DDE982 +:10C110001623134300F09480D4F81891B9F1FF3F2F +:10C1200059D11AF1FF334FF008074FF003060A9375 +:10C130004BF1FF330B9305F1090304EBC3030893A1 +:10C14000059B3B4224D0099B4FF0000950465946BD +:10C1500053F826301A4698464B460EF0D3FC13434C +:10C1600016D1DDE916234B4508BF424510D30A9B83 +:10C1700013EB080306930B9B43EB09030793089B00 +:10C18000DDE90601D3E948238B4208BF824203D28E +:10C19000013E4FEA5707D3D204EB8606D6F8B89192 +:10C1A000D6F8C86104F1BC074FF000083846FEF726 +:10C1B0006DFE2046FFF784FD00283DD15B465246C8 +:10C1C0002046FFF7BDFD034640B16FF47A64384660 +:10C1D000FEF73CFE73E74FF48056E3E7CDE901003C +:10C1E000009052464946201DF8F798FF0028ECD1F0 +:10C1F0001AEB060A169B4BEB080B9B1B1693179B1F +:10C2000063EB08031793DDE9162313430CD004EB0B +:10C21000C503D3E95A235B4508BF52453FBF0135EB +:10C22000631993F8543105932046FFF711FD28B1A7 +:10C230003846FEF70BFE6AE7034CC8E7034CC6E737 +:10C2400000243CE75BF0FFFF5CF0FFFF5DF0FFFFC9 +:10C250002DE9F04F1F4600F1080304460E4615462F +:10C2600000F1BC0800F104092DED028B08EE103A34 +:10C2700087B0DDE9122313437CD0D4F8F0314FF0BE +:10C28000000B284639469A461A4602935B460EF042 +:10C2900039FC12995118009113994B410193DDE932 +:10C2A000000159454FF0000B08BF504540462ABFDA +:10C2B000029B129B9B1A0293029B9A46CDE904AB08 +:10C2C000FEF7E4FD2046FFF7FBFC00284ED12A468E +:10C2D0003B462046FFF734FD50B16FF47A64404688 +:10C2E000FEF7B4FD204607B0BDEC028BBDE8F08F31 +:10C2F00094F89830002BF0D0002EEED0049B002B49 +:10C30000EBD0484606F0AAF84FF0FF332A46022148 +:10C31000484602F071F904AB324604F16C0118EEA4 +:10C32000100AF8F78FFE0390484606F08DF8039B3D +:10C33000002BD2D1DDE904239B4508BF9245CCD127 +:10C34000029B15EB0A0520461E44129B47EB0B0788 +:10C35000B3EB0A031293139B63EB0B031393FFF7E7 +:10C3600077FC28B14046FEF771FD82E7024CB6E744 +:10C37000024CB4E70024B5E75CF0FFFF5DF0FFFF7F +:10C380002DE9F04FD0F8B4A005462DED028BB5B0E5 +:10C39000BAF1000F0CD0C84AC84BBAF1FF3F0CBF2E +:10C3A00092469A46504635B0BDEC028BBDE8F08F00 +:10C3B00000F1BC03184608EE903AFEF767FD2B1D0E +:10C3C0005246514608EE103A95F8FA3118EE100A26 +:10C3D000CDE902AACDE900AA06F04AF830B16FF41F +:10C3E0007A6A18EE900AFEF731FDDBE795F8043221 +:10C3F0000BB9C5F800A2D5F800420134012CC5F8EC +:10C400000042EED10023D5F8F46185F8FB3185F8C0 +:10C41000FD3195F89830002BE1D018EE100A06F0A7 +:10C420001DF818EE103A3146C5F89060181DF9F75E +:10C4300083FF064618EE100A06F006F8002ECED14D +:10C440002846FFF705FC002800F026859C4F0322B4 +:10C450000DF1800B9F213B782846CDF810B08DF868 +:10C46000803000230096ADF88160CDE906230022DC +:10C470000023CDE902234FF0FF324FF0FF33FFF7E7 +:10C4800094FC09970028AAD19DF880309D2B00F0DC +:10C49000D98000F2BE80012B00F0D7801F2B00F066 +:10C4A000E280002310ACDFF820A2294620460826AF +:10C4B00000274FF05A08B146C5E94233C5E9483371 +:10C4C000CDE920A39BE80C00F6F7BCFF94E80F0031 +:10C4D0001CAC8BE80F0001230022584603940296FF +:10C4E000CDE90038CDE904670023FBF73AFCB842F8 +:10C4F000CDF828A0C0F28A800422724920460DF0AF +:10C500007FFF8246002840F081809DF87530012B26 +:10C510007CD19DF8763032460B933B4637461E461B +:10C520000120CDF8048000905846CDE90476CDE98D +:10C530000294CDE90C32FBF714FC002866DB9DF871 +:10C540007230012B089361D11D984FEA106CBCF139 +:10C55000FF0FDDE90C3214D19DF87010812900F035 +:10C560008A80842900F0918059B920F07F40C5F875 +:10C5700008019DF8730080005028A8BF5020C5F81E +:10C580000C0108320B990AF1010043F100035145F7 +:10C590006FDC0A9B14AE4FF000082946209330460A +:10C5A000CDF884809BE80C00F6F74CFF96E80F006E +:10C5B00084E80F0095F80231D5F80821002B6ED0E1 +:10C5C000242000215A274FF0080901264346CDF8C0 +:10C5D0000CB00096CDE90401CDE901792046FBF7C6 +:10C5E000C0FB98B90C220023CDE904232CAB6022B8 +:10C5F000CDE902930023CDE900672046FBF7B1FBAC +:10C60000824618B99DF98730002B61DADFF8BCA0AB +:10C61000E7E6BF2B13D0C22B7FF443AF9DF88130E8 +:10C62000202B1FBF012385F800310323C5F8E43018 +:10C630001523C5F8EC30002385F8F03031E785F894 +:10C6400003012EE7C5F8E4402BE79DF88130022B6B +:10C650007FF427AF9DF88230202B7FF422AF012397 +:10C6600085F801311DE7312385F80241C5F8E8302E +:10C6700017E7824654E720F07F40C5F820019DF877 +:10C6800073008000C5F824017BE720F07F40C5F8E7 +:10C69000D8019DF873008000C5F8DC0171E7D5F87A +:10C6A0000C110820CDF80CB0CDE904135A21CDE9C6 +:10C6B000011001210091A0E75AF0FFFF59F0FFFFA0 +:10C6C000BCB10108B7B10108078100085EF0FFFFA7 +:10C6D000219B95F802110133DB08C5E94430D5F8F8 +:10C6E0000C31282B89BF9DF8A8304FF480731A11A4 +:10C6F000012388BF9340C5F8F031002969D09DF827 +:10C70000B43013F0080267D000294FF000034FF057 +:10C7100000014FF0000004934FF0FF3200934FF000 +:10C72000FF33CDE90601CDE902010CBFF0219921CB +:10C730002846FFF73AFB00287FF468AF2846FFF74A +:10C7400087FA044600283FF461AFD5F80C011C2895 +:10C7500064D9012305F5DC7105F5E4774FF0FF3C62 +:10C760009E469BF81C2041F804CB0EFA02F2012AE7 +:10C77000CA600FD99BF81D6041F8046CD5F8606160 +:10C78000B24200D30EB9C5F8602195F854211A437E +:10C7900085F854215B008F420BF1020BDBB2E0D134 +:10C7A0009DF882309F0640D59DF88930C5F8E0306D +:10C7B0009DF8883003F01F025B119B0085F8FD2176 +:10C7C00085F8FB31022385F8F931002485F8FE3124 +:10C7D00044E09DF8BD3094E7DB067FF517AF0026F7 +:10C7E000002704924FF0FF33009266214FF0FF3292 +:10C7F0002846CDE90667CDE90267FFF7D6FA00289B +:10C800007FF404AF4FF0FF324FF0FF3399210490D3 +:10C810000090CDE90667CDE9026789E79DF8813090 +:10C82000FF2BC5F81831BBD1F0E610286BDD9DF861 +:10C830009020D60667D59DF89B30C5F8E0309DF86E +:10C840009A3003F01F025B119B0085F8FD2185F8EB +:10C85000FB31022385F8F93185F8FE3195F8003176 +:10C8600093B3099B002218EE100A1B781146ADF80D +:10C8700061208DF860300223CDE90222CDE900224B +:10C8800005F0F6FD00BB18A92846FFF702FBD8B952 +:10C890009DF86230284643F002038DF86230FFF7BE +:10C8A0000FFA88B918A92846FFF79CFA064658B926 +:10C8B0002846FFF7CDF938B118A92846ADF86060D1 +:10C8C0008DF86260FFF7E5FA099B1A780023ADF84E +:10C8D0003D30ADF8613095F802318DF83C208DF88F +:10C8E0006020002B40F0C0809DF8BA30C3F30213E3 +:10C8F000013B042B00F2FE80DFE813F0B6002201BA +:10C900002701B600B60058060ED59DF88B30C5F845 +:10C91000E0309DF88A3003F01F025B1185F8FD219D +:10C9200085F8FB31022350E79DF89020D1077DD593 +:10C930009DF89730C5F8E0309DF8963003F01F025F +:10C940005B115B0085F8FD2185F8FB31012385F83B +:10C95000F93185F8FE3195F8F030BBB1D5F80C31DE +:10C960003F2B13DD9DF8BF3013F0400200F05F81D4 +:10C9700003234FF0000B85F8FA3195F8FA31032BB9 +:10C9800000F0E281BBF1000F7FF440AE2846FFF7D4 +:10C990005FF900283FF43AAE0A9B18AE4FF0000B47 +:10C9A0000DF1800829462093CDF884B030461CACA8 +:10C9B00098E80C00F6F746FDD5F8209196E80F00B0 +:10C9C00084E80F00B9F1000F04D0D5F82461002EDF +:10C9D00040F0C8810123C5F82831D5E94432C5F8B3 +:10C9E0002C3113F1FF3342F1FF32C5E95A32D24BF9 +:10C9F00028461B788DF880300023ADF88130FFF792 +:10CA000027F900283FF402AE95F80341002C00F00E +:10CA10000C82012C00F024822846FFF719F9002827 +:10CA20003FF4F4AD012385F80432DAE4DA0606D5E2 +:10CA30009DF88F30C5F8E0309DF88E307EE7DB073B +:10CA40000ED59DF88D30C5F8E0309DF88C3003F0A0 +:10CA50001F025B1185F8FD2185F8FB31012378E782 +:10CA60000323C5F8E03076E70123C5F8F830C5F8B0 +:10CA7000FC30D5F8F8305F1C09D0D5F8FC104E1CFE +:10CA800005D034AA134401228A4003F8942C18A933 +:10CA90002846FFF7FEF99DF862309DF83E202846B3 +:10CAA000BDF83C101343BDF860209DF83C700A436C +:10CAB00018A99DF83D60ADF860208DF86230FFF751 +:10CAC00091F92846FFF7C4F800283FF49FAD0023F2 +:10CAD00018A92846ADF860308DF86230FFF7D9F913 +:10CAE0009DF860301F409DF861301E4057EA0603F4 +:10CAF0003FF48CAD002C3FF42EAF9DF8B9309DF87B +:10CB0000B8201B0103F0100343EA1213082B67D06F +:10CB100038DC022B24DC002B3FF41DAF0021002366 +:10CB200000204FF0FF32049300934FF0FF33CDE924 +:10CB30000601CDE9020138212846FFF736F90AE758 +:10CB40000023C5F8F830062391E707234FF0000CC7 +:10CB50004FF03E0EC5E93EC33F23C5E93AE388E7FF +:10CB6000042B7FF4F8AE0021002300204FF0FF32A9 +:10CB7000049300934FF0FF33CDE90601CDE90201A4 +:10CB80003521D9E7102B7FF4E6AE0126002718AC3B +:10CB90004FF000084FF000094FF0000B4FF0FF324C +:10CBA0004FF0FF33652128460494CDF800B0CDE95D +:10CBB0000667CDE90289FFF7F8F89DF860304FF07D +:10CBC000FF32612103F07F030494CDF800B08DF8AB +:10CBD00060304FF0FF33CDE90667CDE90289ABE75E +:10CBE0000126002718AC4FF000084FF000094FF065 +:10CBF000000B524A0023652128460494CDF800B06A +:10CC0000CDE90667CDE90289FFF7CFF89DF86030DE +:10CC10004A4A712143F040030494CDF800B08DF8E6 +:10CC200060300023CDE90667CDE9028984E7D807A3 +:10CC300011D50020002104920092CDE90601CDE932 +:10CC400002014FF0FF324FF0FF33B7212846FFF7C4 +:10CC5000ACF860BB8CE613F002020DD02846FFF75B +:10CC60002FF8002865D10022002304900090CDE920 +:10CC70000623CDE90223E4E713F0100139D00126A1 +:10CC8000002718AC4FF000084FF000098DF8602025 +:10CC900000924FF0FF334FF0FF32B5212846049445 +:10CCA000CDE90667CDE90289FFF77FF810B1DFF81B +:10CCB00090B062E69DF86030284643F001038DF89D +:10CCC0006030FEF7FDFF834698BB04904FF0FF32C3 +:10CCD0004FF0FF33B12128460094CDE90689CDE914 +:10CCE0000267FFF762F80028E1D1032385F8FA31E3 +:10CCF00043E613F0080013D080230022049117218B +:10CD00008DF860300023CDE9062301220023CDE910 +:10CD1000022318AB4FF0FF3200934FF0FF3395E73B +:10CD200013F0040B4FF00203E0D0C522C5F8F42045 +:10CD30001FE6DFF810B020E6BCB101080300800058 +:10CD40005EF0FFFF5CF0FFFF002218EE100A1146B4 +:10CD5000CDE90222CDE9002205F08AFB00283FF44C +:10CD600011AE53E430460BF07FFF074600283FF436 +:10CD70004DAC5A23082103904A462046CDE90131A3 +:10CD80000123CDE9046B00935B46FAF7EAFF002824 +:10CD900040DB3E78D5F8249116F0020694E80F00A7 +:10CDA00088E80F0040F0BD80B9443C460FA9083424 +:10CDB000A1452FD314F8063C4FF0000C14F8052CB5 +:10CDC0004FF0010B03F00F009B09099254F8042C5B +:10CDD00003910290CDE904BC14F8070C00930023E2 +:10CDE00001904046FAF7BDFF002813DB9DF83C3068 +:10CDF0007600099A0FA9F6B21A4214F8082C237883 +:10CE000018BF46F00106D20703F0020300F18B8041 +:10CE1000002BCCD04FF0FF347CE00899013349005F +:10CE2000042BC9B208916AD174E02846FEF748FF86 +:10CE300000287FF4EBAB002200230490982100909F +:10CE40002846CDE90623CDE902234FF0FF324FF00B +:10CE5000FF33FEF7AAFF00283FF4DEADFFF7D6BB95 +:10CE600020A92846FFF715F800287FF4CFABD5F8A6 +:10CE7000F8307BB9D5F8FC309C4044F00304E4B2B0 +:10CE80009DF8803020A928461C408DF88040FEF790 +:10CE9000A9FFE0E70324F3E7DFF8C4A0FFF7A1BA96 +:10CEA0000CF101030A2BC5F82831B3DC6FF4AA7921 +:10CEB000043405F5967805F5AA7605F5B47E0021CB +:10CEC0000F22A9EB0509236814F8040B23F0FF03D4 +:10CED00000F00F0003F58073024048F8043B013B6B +:10CEE00006F8010B0B44D9171846EEE80201591C4D +:10CEF00009EB06039C45E6DC0023C5F86031089980 +:10CF000011EA020489D005EB83030024D3F8C83169 +:10CF1000C5F8603138460BF0AFFE01343FF476AB14 +:10CF200065E53C465E46D5F824213A4421788807D9 +:10CF30007FF570AF04F108039A42FFF46BAF94F8E9 +:10CF400002C00CF1020304EB83039A42FFF462AFC8 +:10CF50006078B042A4D0C9073FF55CAF1C46E5E756 +:10CF60005DF0FFFF70470000094B0A485B6870B531 +:10CF700090248D1804FB03038D4207D011F8014B58 +:10CF80001868C6693606FCD58462F5E7104670BDA0 +:10CF9000900B0224F40C0224012070476FF015005E +:10CFA00070476FF01C00704703681B6818476FF0EC +:10CFB0001500704711207047BFF35F8F01220849A9 +:10CFC0008A6001320B69042A23F0010343EA00035B +:10CFD0000B61F5D1BFF34F8FBFF36F8F704700BF69 +:10CFE00090ED00E0BFF35F8F064A00239360136962 +:10CFF00023F0010318431061BFF34F8FBFF36F8F0E +:10D00000704700BF90ED00E070472DE9F04746689B +:10D0100096F8327087BB03685B689847346A84422D +:10D020002AD03369041B96F934201C40B36830625F +:10D03000A4FB0345CAB1736A14EB030845F1000968 +:10D04000002A1BDBC2F12001A2F1200328FA02F41E +:10D0500029FA02F509FA01F129FA03F30C431C43FA +:10D0600004FA02F2A8EB02027262D6E90A321B1934 +:10D0700045EB0202C6E90A32BDE8F087D6F80CA0FB +:10D080003B464046494652460DF03CFD04460D469F +:10D090000AFB1082E8E72DE9F14F46680546376B39 +:10D0A00027F07F4727F0FF07002F57D1FFF7ADFF8D +:10D0B0007368002B60D0D5F800A0D3E90001D6E951 +:10D0C0000A238B4208BF824205D3DAF8143001B03C +:10D0D000BDE8F04F18476C68D4E90A32D4F814B0B0 +:10D0E000B0EB030861EB0209D4E906234B4508BF06 +:10D0F000424520D3E36894F933C0A3FB080103FB46 +:10D100000911BCF1000F13D0A268531EC01841F1E1 +:10D110000001BCF1000F24DBCCF12002ACF12003B4 +:10D1200020FA0CF001FA02F221FA03F3104318433B +:10D13000834528BF8346236A9B4423690BEA030B7C +:10D14000DAF81030584698472B685B689847336A7E +:10D150005B450AD258450CD283420AD801B0BDE8DB +:10D16000F08F3B460DF0CEFCE2E78342F6D95845FE +:10D17000F4D32B685B69AAE77369306A3269184493 +:10D180002B6810401B6901B0BDE8F04F1847B1F99A +:10D1900000305A1C01D118467047834201D188687B +:10D1A00070470C31F3E784B001A804B080E80E00AA +:10D1B00070470120704700290CBF6FF01800002055 +:10D1C00070476FF015007047036800221B69114615 +:10D1D00018470368012200211B69184730B1036812 +:10D1E00023B11B79052B03D0062B24D02048704790 +:10D1F00043680020DFF8A4C01E4A1F49C3E902C2E9 +:10D2000002F17942DFF898C002F5740202F501627A +:10D210001A611A4AC3E9051202F1D14202F5C0129D +:10D2200002F51E62DA61164AC3E908C20122C3E9A7 +:10D2300000009A667047436800201249124ADFF8DE +:10D2400064C09866C3E90212104A1149C3E904C2D6 +:10D25000104AC3E90612104A1A6202F17452A2F58A +:10D260002302A2F69242C3E900005A62704700BF4F +:10D2700000AFFFFF07D57C3639590EF7310BC0FFE1 +:10D28000A44FFABE67E6096A85AE67BB3AF54FA5BB +:10D290007F520E518C68059BABD9831FD89E05C168 +:10D2A000A78FF96472F36E3C137810B504688C4252 +:10D2B00038BF013B13700368591A016010BD036841 +:10D2C0005918016028BF0123117838BF00230B448F +:10D2D00013707047436830B52BB94A6862B9181E9D +:10D2E00018BF012028E0826802EB830252F8042C68 +:10D2F000002AF2D1013BEFE78C6804EB820555F878 +:10D30000045C85B9013AE9E7826852F8231054F8C1 +:10D310002320914205D803F1FF330AD24FF0FF30AA +:10D320000AE0012008E00BB19342FAD89342F5D30A +:10D33000013B5A1CE8D1002030BD0021F0B50A465F +:10D340004568954202D100242046F0BD836853F819 +:10D350002260002326FA03F7CC18FF07F4D4013328 +:10D36000202B01EB0304F5D101322146E9E70368E4 +:10D3700070B5CD1A002D0DDD93F900601C78002EDC +:10D380000BDB5C1C04601B7813600368C91A13680C +:10D390008B4234D96FF05F0070BD04F07F04013C14 +:10D3A000032C29D8DFE804F002091220012DF1D066 +:10D3B0005C78023314600360E7E7022DEADDB3F81E +:10D3C0000140033364BAA4B21460F4E7032DE1DD35 +:10D3D0009C78043313F8035C240244EA054413F8F0 +:10D3E000015C2C431460E6E7042DD3DDD3F8014043 +:10D3F000053324BA1460DEE76FF06300CCE7002049 +:10D40000CAE70000024B987A003818BF0120704725 +:10D410001801002408B504F043FDFCE710B50446EC +:10D420000BF02AFC204610BD08B5431C03D103466F +:10D43000184608BD0C31B1F900305A1C04D098428E +:10D44000F8D14B68591CF3D101460148F5F7CCFDE2 +:10D4500030010180884208B507D0431C05D0013156 +:10D46000014602D00248F5F7BFFD084608BD00BFDF +:10D4700030010180024B186808B107F051BF7047B6 +:10D4800088270224024B186808B1FAF785B870475C +:10D4900088270224012008B500F0B8FB11F0010034 +:10D4A00010B58CB204D0F5F7B9FF003818BF0120D1 +:10D4B000E2060AD5054B5A6890235343044AD358D1 +:10D4C000DB691B0648BF40F0100010BD900B022422 +:10D4D000F40C0224F8B50D4682B3194B194C5F6861 +:10D4E000902303FB07439A68B2F5805F16D11A694F +:10D4F000BAB940F2FF12A3F86020902202FB074263 +:10D50000B2F86060F5F78AFF0028FBD09023012075 +:10D510007B43E3585B6A1E402E70F8BD1AB91A6946 +:10D5200032B9FF22E7E7B2F1805F05D11A690AB983 +:10D530007F22E0E73F22DEE70022DCE71046ECE74F +:10D54000900B0224F40C0224436B30B5054685B0E1 +:10D5500053B100F128036C460FCB84E80F00002381 +:10D5600020466B6307F0C2FF05B030BDD0F89030A5 +:10D570002DE9F04F012B04462DED088B87B0029367 +:10D5800007D9002084F8940007B0BDEC088BBDE8F3 +:10D59000F08F031DB0F99670B0F9986008EE103A5C +:10D5A000D0F88C30B0F99A50B0F99CA008EE903ABF +:10D5B000B0F99EB0B0F9A08038467249FFF734FF49 +:10D5C000714903903046FFF72FFF704901902846BC +:10D5D000FFF72AFF6E4909EE100A5046FFF724FFB5 +:10D5E0006C4909EE900A5846FFF71EFF6A490AEE99 +:10D5F000100A4046FFF718FF019A039B8146114627 +:10D600001846FFF727FF19EE901A019019EE100A3D +:10D61000FFF720FF494603901AEE100AFFF71AFFA2 +:10D62000019B1A46039B9A42ABD1019B8342A8D12E +:10D6300054493846FFF7ABFD534903903046FFF796 +:10D64000A6FD524909EE100A2846FFF7A0FD5049F1 +:10D6500009EE900A5046FFF79AFD4E490AEE100A6D +:10D660005846FFF794FD4C490AEE900A4046FFF7F2 +:10D670008EFD4A4A0BEE100A039BD2F8D41048489C +:10D6800041F48041C2F8D410D2F8D41001F48041A2 +:10D69000059105994349D0F88CC08C45FBD1D16FD9 +:10D6A0004FF0000941F48041D167D16F21F48041EE +:10D6B000D1674FF440720121C26000223846A4F8BD +:10D6C000547084F84520226184F844204FF00042D1 +:10D6D00092FAA2F2B2FA82F2013A62614FF48062E7 +:10D6E000A261029AE261019AC4E9021162601946DC +:10D6F000C4E90899F7F790FE49463846F7F736FE31 +:10D7000019EE101A3046A4F85660F7F785FE494620 +:10D710003046F7F72BFE19EE901A2846A4F8585019 +:10D72000F7F77AFE49462846F7F720FE1AEE101A58 +:10D730005046A4F85AA0F7F76FFE49465046F7F74F +:10D7400015FE1AEE901A5846A4F85CB0F7F764FE7E +:10D7500049465846F7F70AFE1BEE101A4046A4F851 +:10D760005E80F7F759FE49464046F7F7FFFD18EE91 +:10D77000901A18EE100AF8F7DFFDB0FA80F04009B1 +:10D7800000E700BFD0B3010800B4010830B40108BD +:10D7900054B4010884B40108A8B401080044025834 +:10D7A000006402580003008039B101F18041013961 +:10D7B00000EB81018142034600D270471B680A6872 +:10D7C0001BBA12BA40F8042B41F80439F2E7000002 +:10D7D000034B596A5A6A521A8242FBD3704700BF00 +:10D7E000000C004007B501900BF03EFA019910B90A +:10D7F0000248F5F7F9FB03B05DF804FB1F01018057 +:10D80000037823F0030343F001030370FFF732BEF4 +:10D8100010B50446037803F00303012B08D0FFF78B +:10D8200031FE237803F00302012A03D1FFF722FE21 +:10D83000002003E043F002032370012010BD00002C +:10D84000014B186807F06CBD40270224014B186893 +:10D85000F9F7A2BE40270224014B186807F060BD0B +:10D8600080270224014B1868F9F796BE802702240E +:10D8700001207047074A084913681844884283BF4B +:10D88000064B0C224FF0FF3010608CBF1A60184618 +:10D89000704700BF0C01002400FC072454A502249B +:10D8A000064A136843B1013B13602BB9044A137055 +:10D8B000044B1B7803B162B6704700BF3C270224BB +:10D8C0008C27022438270224EFF3108372B6074A0C +:10D8D000117831B9DB43064903F001030B700123D2 +:10D8E0001370044A13680133136070478C270224B5 +:10D8F000382702243C27022408B5FFF7E5FF064A33 +:10D900001388013B9BB2138013B90120FFF76AFB18 +:10D91000BDE80840FFF7C4BF8427022410B5074CB8 +:10D92000FFF7D2FF218811B90846FFF75BFB0131F1 +:10D930002180BDE81040FFF7B3BF00BF8427022459 +:10D9400008B5FFF7C1FF064A1388013B9BB213805D +:10D9500013B90120FFF730FBBDE80840FFF7A0BF77 +:10D960008627022410B5064CFFF7AEFF208808B9C1 +:10D97000FFF722FB01302080BDE81040FFF790BF89 +:10D9800086270224F0B58FB007460E4615460021C3 +:10D99000142209A801AC0BF0D9F9104B08945B696B +:10D9A0000197DA6B049305925A6B1B6B06920793EF +:10D9B000CDE90256FFF788FF094A0A4D1368013383 +:10D9C00013600FCC0FC50FCC0FC50FCC0FC523684C +:10D9D0002B60FFF765FF00200FB0F0BD1801002499 +:10D9E000442702244C270224F8B50546FFF76CFFB4 +:10D9F000D0E90034DB68984794F832301BB1BDE8B9 +:10DA0000F840FFF74DBF012384F831306368ABB1B4 +:10DA10002846FFF7FAFA6168D4E90A67D1E90023DA +:10DA20009F4208BF964209D36B685A68CB6863600F +:10DA30002368002BEAD090689847E7E70023284640 +:10DA400084F83130FFF727FBD9E72DE9F743044687 +:10DA500000F108058069904699460190FFF734FF70 +:10DA60000198FFF7D2FA01980021426824615368B7 +:10DA7000C4E902892BB9636161B95560FFF70BFBFB +:10DA80000FE0D3E90067B94508BFB045F3D31946A5 +:10DA9000DB68EFE7D2E90A23CD604B4508BF42457A +:10DAA000ECD203B0BDE8F043FFF7FABE90F83C308B +:10DAB00030B453B1002380F83C3090F83E3013B9B5 +:10DAC000012380F83D3030BC704790F83F30002B88 +:10DAD000F9D0836B4FF08062013383630B4B5A6044 +:10DAE000D0E90C32013342F10002C0E90C32D0E936 +:10DAF0000A2312F57A7543F1000412F5FA62C0E9BF +:10DB00000A5443F1000330BCFFF79FBF00ED00E073 +:10DB100038B5D0E90825D0E902130446521845EB80 +:10DB20000303FFF792FF636B2BB104F12800BDE8FC +:10DB3000384007F0DBBC38BD094B30B51A46094CFC +:10DB4000D3F89450A542FBD1036829B181680B60DA +:10DB50004FF44073536130BDC1681B04F7E700BF49 +:10DB6000006402580003008000B57B2589B0FFF7F0 +:10DB7000ABFE0720ADF81450F7F730FB4FF470718F +:10DB8000044628461E4DF7F747FC4FF400631D4A34 +:10DB90000021019301A8BDF81430069403F00F038F +:10DBA00052F82330079304F1100318340293CDE99F +:10DBB0000344F7F70FFC0424012101A8FFF7BCFF81 +:10DBC0002846FFF705FE002101A8FFF7B5FF28460C +:10DBD000FFF7FEFD013CEFD104240B4E012101A80B +:10DBE000FFF7AAFF3046FFF7F3FD002101A8FFF77A +:10DBF000A3FF3046FFF7ECFD013CEFD1DBE700BFB0 +:10DC0000F04902001CB10108801A060008B508B1ED +:10DC1000FFF7AAFFFEE7000008B50E4B0121D3E88D +:10DC20004F2FC3E8401FD2B20028F8D12AB1FFF726 +:10DC30004BFEBFF34F8F20BFFDE7EFF305831BB90A +:10DC4000EFF31083DB0701D5FFF78EFF0120FFF70D +:10DC5000DDFF00BF482702240FB4724608B5074B0A +:10DC60000120D3E84F1FC3E8440FC9B2002CF8D1FC +:10DC700011B90348FFF786FEFFF7CEFF440B0224DD +:10DC80000001FF803F282DE9F04F06468BB000F3DE +:10DC90002B81964F57F82000411C40F00981022E3D +:10DCA00000F306819248DFF88C920378BFF35B8F14 +:10DCB00013F0010F40F0F980FFF7AAFD002800F0F3 +:10DCC000F4808C4BC9F800308B4B1A689846002AB8 +:10DCD00040F0E88089496E20FFF7A6FB044688499A +:10DCE0006920FFF7A1FB01462046864DFFF7B2FBF6 +:10DCF000824904466E20FFF74AFA8149834669202B +:10DD0000FFF745FA804B82462C609C4221D17F4A26 +:10DD1000D2F8F01041F01001C2F8F010D2F8F02063 +:10DD200002F010020992099A794A94424AD1774B3B +:10DD3000D3F8F02042F02002C3F8F020D3F8F030FE +:10DD400003F020030493049B724B9C424AD10124AC +:10DD500087E0704A94421AD002F58062944224D03F +:10DD60006D4A94425CD06D4A9442DDD1674AD2F844 +:10DD7000E81041F48011C2F8E810D2F8E82002F46B +:10DD800080120592059A9C42DED1002469E05F4A28 +:10DD9000D2F8E81041F40031C2F8E810D2F8E820D7 +:10DDA00002F400320892089ABEE7584AD2F8E81006 +:10DDB00041F48021C2F8E810D2F8E82002F4802271 +:10DDC0000792079A564A944237D1504BD3F8E8202D +:10DDD00042F08042C3F8E820D3F8E83003F08043F3 +:10DDE0000393039B4F4B9C4274D003F580639C428A +:10DDF00072D003F580639C4270D003F544439C428B +:10DE00006ED0A3F51C439C426CD003F580639C420A +:10DE10005ED04548844214BF4FF0FF34082420E010 +:10DE20003A4AD2F8E81041F40021C2F8E810D2F8DA +:10DE3000E82002F400220692069A3C4A94423AD024 +:10DE4000394A94429FD1314B0824D3F8F42042F050 +:10DE50000802C3F8F420D3F8F43003F00803019368 +:10DE6000019B59466E206C60F7F7D6FA01216E20AF +:10DE7000F7F77CFA51466920F7F7CEFA01216920BD +:10DE8000F7F774FA00234FF4E132C5E90433C5E92A +:10DE90000223274BAB61F8F7CBFA0123C8F8003017 +:10DEA000F8F762FD1248FFF7ABFC224847F82690CE +:10DEB0000BB0BDE8F08F154BD3F8E82042F00042DC +:10DEC000C3F8E820D3F8E83003F000430293029B44 +:10DED0000724C6E70224C4E70324C2E70424C0E7FA +:10DEE0000524BEE70624BCE70020E1E70C0000247F +:10DEF000042602248CB701089027022434B60108B6 +:10DF0000D8B40108900B02240010014000440258CC +:10DF10000014014000440040004C0040005000400C +:10DF20000078004000480040000C0058007C004091 +:10DF30006E0069002C27022438B50D46FFF7A2FEBB +:10DF4000044630B90AF080F8092303604FF0FF302F +:10DF500038BD0368DB6998470028204614BF4FF49A +:10DF600000534FF400436B6023689B6A9847286115 +:10DF70000020EDE713B5CDE90021FFF783FEDDE9D1 +:10DF8000002140B90AF060F8092303604FF0FF3424 +:10DF9000204602B010BD03681B699847041EF7DADB +:10DFA00064420AF051F80460F0E710B5FFF76AFE2A +:10DFB000044628B90AF048F809230360204610BD3A +:10DFC0000368DB699847041EF8DA64420AF03CF8FB +:10DFD00004600024F2E7FFF7E8BF13B5CDE90021A4 +:10DFE000FFF750FEDDE9002140B90AF02DF80923C2 +:10DFF00003604FF0FF34204602B010BD03689B68F9 +:10E000009847041EF7DA64420AF01EF80460F0E74D +:10E010007FB5002A04460D4606DA0AF015F81623E5 +:10E0200003604FF0FF3019E00192FFF7BEFF019A45 +:10E03000E8B1114E01220DF10F012046FFF7CDFF8F +:10E040000028EEDB0AD09DF80F300D2B08D1325D91 +:10E050000A2A3355EED00A2301202B7004B070BD7C +:10E060000A2B02D1325D0D2AF3E73355F4E7294636 +:10E070002046FFF7B2FFF1E70826022413B5CDE9E9 +:10E080000021FFF7FFFDDDE9002140B909F0DCFFC9 +:10E09000092303604FF0FF34204602B010BD03682F +:10E0A000DB689847041EF7DA644209F0CDFF04608C +:10E0B000F0E700002DE9F74FB2F1000805460E46E3 +:10E0C00009DA09F0C1FF162303604FF0FF34204640 +:10E0D00003B0BDE8F08FFFF768FF044660B31F4A46 +:10E0E0000027DFF87CA04FF00D0B535D3C469146B6 +:10E0F000B84521DDF25D0A2A1BD10D2B019318D002 +:10E10000BC420CDA3A1B31192846FFF7B7FF00284A +:10E11000019BDADB0444A742D9DC09F8053001226F +:10E1200051462846FFF7AAFF0028CEDBCFD009F8DA +:10E1300005B0F35D0137DBE7A045C8DDA8EB0402BD +:10E1400031192846FFF79AFF0028BEDB24181FBFAD +:10E150003619024B16F8012C5A55B8E74826022406 +:10E16000B8B2010838B505460024FFF78BFD0B4B0C +:10E1700043F8254030B909F067FF092303604FF0E9 +:10E18000FF3038BD03685B699847051E04DA6D42AD +:10E1900009F05AFF0560F2E72046F2E70C00002480 +:10E1A000F0B572B60023264A4FF0FF36254F1360B4 +:10E1B0004FF0E0221D46516801F00F0101319A0035 +:10E1C0004FEAC30C02F1604202F56142C2F880607E +:10E1D000C2F88061002202EB0C0401323C44082AA0 +:10E1E00084F80053F7D101339942E8DC164B4FF025 +:10E1F00020625A6040F2FA529860DA6000221D6193 +:10E2000011469C1801320C2A2176FAD14FF0FF32C8 +:10E2100059629A620D4ADA621F221A63BFF35F8F56 +:10E220000B4B5960BFF34F8FBFF36F8FD0E90031B5 +:10E23000002282F314889D4682F310880847F0BDBF +:10E2400010E000E000E100E000ED00E0020000C0AE +:10E2500090ED00E00AF082BD0AF090BD0AF038BEF1 +:10E260000AF0DCBD406828B1037B012B01D10438E2 +:10E270007047002070470000436893F830202DE974 +:10E28000F0470646002A74D193F83230002B70D143 +:10E2900003681B6898473368DB699847364B026808 +:10E2A000002A08BF1A4611461C46B1FBF3F304FBD3 +:10E2B00013132146002BF7D12F4B01257768B3FBB1 +:10E2C000F4F11F23B960013B03D305FA03FC614558 +:10E2D000F9D1B2FBF4F287F8333001241F23FA603E +:10E2E00004FA03F5AA4201D0013BF9D287F8343091 +:10E2F0004468231F1B2B93BF01234FF0FF332024BF +:10E30000A340A4F1040498BF03F1FF3312F1FF30DE +:10E310003B614FF0070303FA04F44FF000034FEAA8 +:10E32000E4797C61A4FB01459A4601FB095543F160 +:10E33000FF31201845EB01010CF0E4FB3368C7E91D +:10E3400006015B68C7E900AA984773683862002134 +:10E3500000200122C3F824A083F832A01A86C3E962 +:10E360000A013046FEF751FE3046BDE8F047FEF7A1 +:10E3700092BEBDE8F08700BF40420F0010B50446D2 +:10E38000FFF77AFFFFF7A0FA2046FEF73EFE63682C +:10E39000D3E90A01FFF784FA10BD2DE9F8430C46D2 +:10E3A00080468869FFF7EAFFD4E90A59461B61EB0A +:10E3B0000907002F08BFB6F57A7F2AD3002F08BFC0 +:10E3C000B6F5FA6F28D3002E4FF47A72304677F103 +:10E3D00001034FF00003B4BF002139460CF092FB5B +:10E3E0004FF47A760023A363A0FB0623551906FB9E +:10E3F000013343EB0903C4E90A53D4E90C32C318CF +:10E40000404642EB0101C4E90C31C8E90031BDE8E6 +:10E41000F88300200146E3E701200021E0E7000047 +:10E420002DE97043154E35682DBB154C4FF0000893 +:10E4300014484FF00009144BA0612360C4E902891D +:10E44000C4E90455FFF718FFFFF73EFA0F4B104AD7 +:10E450001A60FFF725FA0F4BA0692360FFF78EFFC4 +:10E4600084F840503460C4E90801C4E90A01C4E9F1 +:10E470000C89C4E90E553068BDE870832827022452 +:10E48000E026022464B101081CAE0108F00A02244F +:10E49000A9CF000800B80108F8B54B6915460C462D +:10E4A0009B1A002BACBFD318131C4B6103898B80C4 +:10E4B000FFF70AFA024603686BB35E696169771A6F +:10E4C000002F24DB8E4226D19B68A36013B104F198 +:10E4D0000801196113682146002641F80C3F9E602F +:10E4E00019611460836A22616BB190F8242052B1E3 +:10E4F0000268A24207D1E2682AB96169C06A491B71 +:10E5000021EAE1719847BDE8F840FFF7C9B903F186 +:10E5100008029B68D0E7A36013B104F108011961F8 +:10E520000023E360DDE738B5856900F10804FFF7F3 +:10E53000CBF96A6853689C4209D143692846536005 +:10E54000FEF7A9FDBDE83840FFF7AAB91346002B36 +:10E55000F8D0DA689442F9D14269DA60F2E7000053 +:10E56000F8B50F4B00260027002504460360C0E9DC +:10E570000267C0E904550B48A061FFF77DFEFFF775 +:10E58000A3F9094B094A1A60FFF78AF901232046CB +:10E59000656384F83830064BC4E908672360F8BD2A +:10E5A0001CAE010864B10108F00A0224A9CF0008DA +:10E5B000F4B7010884B0F8B5044607A8DDE90C6794 +:10E5C00004F1280580E80E00FFF77EF90FC885E802 +:10E5D0000F002046FFF7A7FFA069C4E90867FFF70F +:10E5E000CDFE8219204641EB0703FFF72EFABDE866 +:10E5F000F84004B0FFF754B9F8B504460E46154686 +:10E600000021202268301F460AF0A0FB94F86030F9 +:10E61000721C84F8683016BF0023012384F86960F7 +:10E6200084F86A3094F8613084F86C3094F8623081 +:10E6300084F86D306B1C16BF00230123256701375A +:10E6400084F8743094F8633084F8783094F8643047 +:10E6500084F8793016BF00230123E36784F8803003 +:10E66000D4F8883084F8843094F8653084F88530A4 +:10E67000F8BD0000024B0A4600211B68184700BF86 +:10E68000100100242DE9F04F00F10803D3B00493EA +:10E690004AAB059300F128030693DDE9043253F8F1 +:10E6A000040B42F8040B06989842F8D10AAA01F12B +:10E6B00040004B78043111F8044C1B0443EA046316 +:10E6C00011F8014C234311F8024C884243EA042319 +:10E6D00042F8043BEDD1509B0DF1200BA248009372 +:10E6E000DE46DDF844C18146DDF838A14F9E019039 +:10E6F000DDE94A72DDE94C314FEAFA25DEF80840DF +:10E70000D9F800000EF1200E85EABA1509F12009AA +:10E710002044009C85EA7A6505440098704000EA30 +:10E720000A00604047EA020405444FEA77301C4083 +:10E73000AC4480EAB70007EA020580EAB7506144BA +:10E740002C4359F81C5C04445EF8140CA4440544A2 +:10E750008AEA060400980CEA070805440C404FEAD0 +:10E76000F120744080EAB11025444CEA070480EAA5 +:10E770007160144028444FEA7C3544EA080485EA75 +:10E78000BC05034485EABC55254459F8184C05449A +:10E790005EF8100C04444CEA0500264481EA0A04A1 +:10E7A00038401C4084EA0A0806EB08044FEAF326C6 +:10E7B0000CEA050886EAB31640EA080086EA7366A2 +:10E7C00026444FEA753484EAB504324484EAB554E9 +:10E7D000044459F8140C34445EF80C6C304445EA97 +:10E7E0000406824481EA030006EA0C06104080EA2F +:10E7F00001080AEB08004FEAF22A8AEAB21A8AEA0A +:10E80000726A82444FEA74300AEB070880EAB40067 +:10E8100005EA040780EAB4503E435EF8087C3044C1 +:10E8200059F8106C50443E4483EA020A31444FEADE +:10E83000F8260AEA080A44EA000786EAB8168AEACD +:10E84000030A2F4086EA7866514404EA000A0E441F +:10E850004FEA703147EA0A0782EA080A81EAB00102 +:10E86000B44481EAB0510AEA0C0A39445EF8047CE7 +:10E870008AEA020A314459F80C6C3E4400EA010766 +:10E8800033444FEAFC2686EABC16534486EA7C668B +:10E890001E44AB1940EA010500934FEA713325404D +:10E8A00083EAB1033D4383EAB1532B4459F8085C32 +:10E8B0003344DEF800603544009E154488EA0C02BB +:10E8C000324082EA0807EA194FEAF62501EA03070F +:10E8D00085EAB61585EA766515444FEA73326619FE +:10E8E00041EA030482EAB302044082EAB3523C43A1 +:10E8F000224459F8044C2A44DEF804502C444FEAD0 +:10E900007235A044009C85EAB2058CEA04043440C8 +:10E9100084EA0C0708EB07044FEAF62843EA0207EB +:10E9200088EAB6180F4088EA7668444485EAB25807 +:10E9300003EA020500EB040A18A83D43704545446C +:10E9400004EB05077FF4D8AE0098CDF844C1CDF8AC +:10E9500038A1CDE94F6038A8CDE94A72CDE94C31F4 +:10E96000CDE90845079001E0D0B20108DBF840008E +:10E970000BF1200B5BF8145C4FEAF04E5BF8184C7F +:10E980004FEAB5488EEA704E88EAF5188EEA902E66 +:10E99000DBF80C0088EAD50820444FEAFA248644C4 +:10E9A00084EABA140EEB080084EA7A6E009C0390A5 +:10E9B0007440009804EA0A04444001987444006CCE +:10E9C0008AEA060E2044039C2044CBF8284007EA3C +:10E9D0000204844447EA020001EB0C084FEA773155 +:10E9E000184081EAB7010EEA080E20435BF8104C8C +:10E9F00081EAB7518EEA060E8AEA08090844DBF874 +:10EA0000241084444FEAF14080EA714080EA91206A +:10EA1000DBF8101029444FEAB44585EAF4150144A7 +:10EA2000019885EAD405406C2944009D28444FEAAA +:10EA3000F825CBF82C10084485EAB815864485EAF9 +:10EA4000786505EB0E004FEA7C3507EA0C0E0344AF +:10EA500085EABC05009347EA0C0385EABC551340E0 +:10EA600043EA0E035BF80CEC1D44039B05444FEA9C +:10EA7000F34080EA734080EA9320DBF814302344AB +:10EA80004FEABE440344009884EAFE1409EA0009F0 +:10EA9000019884EADE04806C89EA0A092344304440 +:10EAA0004FEA7536CBF83030184486EAB506814413 +:10EAB000009886EAB5564FEAF02484EAB01484EA56 +:10EAC000706404EB09004CEA050402443C400292E5 +:10EAD0000CEA050214435BF8082C344404444FEA62 +:10EAE000F14080EA714080EA9121DBF81800864409 +:10EAF000029871444FEAB24E8EEAF21E8EEAD20EAE +:10EB00008E44009988EA010101400198CBF834E075 +:10EB1000C66C81EA0801029856444FEA743A4FEAFB +:10EB2000F02076448AEAB40A3144029E8AEAB45A52 +:10EB300080EAB61080EA7660461845EA040005EAE5 +:10EB4000040100EA0C0007EB060908434FEAF34111 +:10EB500081EA7341504481EA9323DBF81C1030446E +:10EB60005BF8046C0A44029913444FEAB64282EA05 +:10EB7000F61282EAD6021A44009B83EA01074FEAA2 +:10EB8000F921CBF8382007EA090781EAB9115F407B +:10EB9000019B81EA79611B6D1344434404EA000838 +:10EBA0001F44CB1944EA00074FEA70312F409C44C0 +:10EBB00081EAB00147EA0807DBF8008081EAB0513A +:10EBC00039444FEAFE47194487EA7E47DBF8203094 +:10EBD00087EA9E2E9F194FEAB843009E83EAF813F6 +:10EBE000774483EAD8031F44029B83EA090ECBF8DB +:10EBF0003C700EEA0C0E8EEA030E019B5B6D3B44EB +:10EC000033449E444FEAFC2383EABC1383EA7C63CB +:10EC100003EB0E0600EA010EAB1940EA0105009372 +:10EC20004FEA7133254083EAB10345EA0E05DBF86C +:10EC300004E083EAB1532B44DBF8245033444FEA19 +:10EC4000F24686EA724686EA922205EB080689EACF +:10EC50000C0816444FEABE4282EAFE1282EADE0245 +:10EC60001644009A08EA0208019ACBF84060956DB4 +:10EC700088EA0908029A3544009E1544009A4FEA32 +:10EC8000F222454401EA030882EAB61282EA766279 +:10EC900015444FEA7332661941EA030482EAB3026B +:10ECA000044082EAB35244EA080422444FEAF7449B +:10ECB00084EA77442A44DBF8085084EA9727039CC7 +:10ECC000A6444FEAB54484EAF514774484EAD505AE +:10ECD000009C8CEA040E019C3D44E76D0EEA060E92 +:10ECE0004FEAF624CBF844502F448EEA0C0E84EA07 +:10ECF000B6144F444FEA723584EA7664774485EA65 +:10ED0000B2053C4443EA020785EAB25E03EA020523 +:10ED100000EB040A01980F4020303D430190079812 +:10ED20007544584504EB05077FF420AE0098CDF8F4 +:10ED300044C1CDF838A1CDE94F60CDE94A72CDE9A3 +:10ED40004C31CDE90845049B05991B6851F8042B0B +:10ED50001344049A059142F8043B069B04929342A3 +:10ED6000F1D108A84FF49471FFF784FC002053B050 +:10ED7000BDE8F08F2DE9F843036805460E461446BA +:10ED800003F03F079B18036022BF436801334360D1 +:10ED90009FB1C7F1400991450FD800F128084A46B4 +:10EDA00008EB070009F0C4FF41462846FFF76AFC5C +:10EDB000B0B9403C4E443C440746264404E0284653 +:10EDC000FFF760FC60B9403C3F2CA6EB0401F6D88D +:10EDD00044B105F128002246384409F0A9FF00207B +:10EDE000BDE8F8832046FBE710B458B104684CB185 +:10EDF0002479053C012C05D842B140685DF8044BEC +:10EE0000FFF7B8BF02485DF8044B70471046FAE7B9 +:10EE100000AFFFFF38B50368044663B1856855B19C +:10EE2000FEF7DCF940B92368294620469A79BDE807 +:10EE30003840FFF7D9BF014838BD00BF00AFFFFF22 +:10EE4000036803F03F035A1C034470B5382A0D468B +:10EE500000F128064FF08001044683F8281006EBE5 +:10EE6000020061D8C2F13802002109F06FFF20468C +:10EE7000D4E900315A0FDB0042EAC10231461BBA25 +:10EE800012BA63662266FFF7FDFB00284BD1E37AD6 +:10EE90002B7063896B70A3681B0AAB70A368EB705F +:10EEA000E37B2B71E3896B71E3681B0AAB71E36849 +:10EEB000EB71E37C2B72638A6B7223691B0AAB7262 +:10EEC0002369EB72E37D2B73E38A6B7363691B0A1F +:10EED000AB736369EB73E37E2B74638B6B74A36911 +:10EEE0001B0AAB74A369EB74E37F2B75E38B6B7523 +:10EEF000E3691B0AAB75E369EB7594F823302B7655 +:10EF0000638C6B76236A1B0AAB76236AEB76A36E5F +:10EF10004BB994F827302B77E38C6B77636A1B0A25 +:10EF2000AB77636AEB7770BD0021C2F1400209F054 +:10EF30000DFF31462046FFF7A5FB0028F3D101461F +:10EF40003822304691E7000040B1036833B11B79A5 +:10EF5000053B012B02D84068FFF772BF004870479D +:10EF600000AFFFFF42F2107399422DE9F0410446D1 +:10EF70000D4603D96FF00F00BDE8F08146688E4260 +:10EF80001AD2042128460BF085F907460028F1D053 +:10EF9000D4F80880B8F1000F0CD0B60041463246D4 +:10EFA00009F0C6FE1EB131464046FFF763FBA0687C +:10EFB00009F062FEC4E901570020DDE742F2107358 +:10EFC00099422DE9F04105460C4603D96FF00F0038 +:10EFD000BDE8F08146688E4203D8BDE8F041FFF7F6 +:10EFE000C1BF731EFBB9013304219C4238BF1C46CC +:10EFF00020460BF04FF907460028E7D0D5F80880E7 +:10F00000B8F1000F0BD04146A20009F091FEB1000B +:10F0100002D04046FFF72EFBA86809F02DFE002025 +:10F02000C5E90147D4E7AA6852F82320002ADAD1BB +:10F03000013BD7E70368F0B5044689B00D46F3B14C +:10F040008668E6B169469F79FFF77EFFA8B920463A +:10F05000FEF7C4F888B92368F11920469A79FFF7BA +:10F06000C3FE50B92368694620465A79FFF7BCFEB3 +:10F0700018B929462046FFF767FF09B0F0BD0148DF +:10F08000FBE700BF00AFFFFF10B404682CB183683A +:10F090001BB15DF8044BFFF7A7BE02485DF8044BB7 +:10F0A000704700BF00AFFFFF2DE9F0410E4688B06A +:10F0B00017460546002852D00368002B4FD08268BF +:10F0C000002A4CD09B79BB4213D2FEF787F8044646 +:10F0D00088BB3A4631462846FFF786FE044650BBB9 +:10F0E00069462846FFF730FF044620BB2B686E4672 +:10F0F0005F792B683621D5F80880013E9A79404621 +:10F10000474408EB020409F021FE2B685C212046ED +:10F110009A7909F01BFE4346601E9F4213D1284690 +:10F12000FEF75CF8044630B92B68414628469A79C8 +:10F13000FFF75AFE044620216846FFF79BFA204657 +:10F1400008B0BDE8F08116F8011F1A784A4003F8AC +:10F15000012B10F8012F31784A400270DDE7014C95 +:10F16000EDE700BF00AFFFFF10B50446F0B1036844 +:10F17000E3B1406848B11B79053B012B02D86C21F3 +:10F18000FFF778FA606809F077FDA06840B123685E +:10F190009B7959000BB1FFF76DFAA06809F06CFD7F +:10F1A00020460C21BDE81040FFF764BA10BD2DE9E0 +:10F1B000F04705688AB082460E46174605B16D795C +:10F1C00076B3002F14BF4FF002084FF00108002360 +:10F1D0000AF10C098DF804305046FFF71BFE044677 +:10F1E000B0B92A4649465046FFF74EFF044678B963 +:10F1F000012201A95046FFF747FF044640B9B8F184 +:10F20000020F10D002A95046FFF714FF044698B130 +:10F2100002A82021FFF72EFA20460AB0BDE8F087A9 +:10F220004FF00108D3E73A4631465046FFF72CFF2E +:10F2300004460028E6D0EBE72A4602A95046FFF72D +:10F2400033FF04460028E3D12A4649465046FFF7DB +:10F250001BFF04460028DBD149465046FFF7EAFE73 +:10F2600004460028D4D19DF804300133DBB2434575 +:10F270008DF80430B0D3CBE72DE9F8430668044697 +:10F280000F46154606B17679B5F5806F3BD8E36B2E +:10F2900063B904F10C09BDB92A4629462046FFF797 +:10F2A00086FF78B9E36A0133E3620BE0636B012BFD +:10F2B00003D0E26AA36B9A42EBDD2046F4F757F8DD +:10F2C0000028E6D0BDE8F883AE422046B04628BF0D +:10F2D000A846FFF79FFD0028F4D132464946204654 +:10F2E000FFF7D2FE0028EDD149462046FFF7A2FEE7 +:10F2F0000028E7D13846424649464744A5EB080571 +:10F3000009F016FDC7E76FF00200DBE700230122DA +:10F31000C0E90433C0E90023C0E90232C0E9062392 +:10F320000362704738B50024012501460470446229 +:10F33000C0E90154C0E90345C0E90544C0E90754E8 +:10F340002830FFF7E3FFC1E91354C1E91544C1E9CF +:10F350001744C1E91944C1E91B44C1E91D4438BD42 +:10F36000036B2BB1C36B002B0CBF02200120704735 +:10F37000184670470246436830B523B9486858B903 +:10F38000002B38D131E0906800EB830050F8040C7A +:10F390000028F3D1013BF0E78C6804EB800555F8B9 +:10F3A000045C25BB0138EAE78342096801D2484280 +:10F3B00022E01068002803DD002913DA01201BE099 +:10F3C00000290FDD70B14FF0FF3015E0916851F862 +:10F3D000235054F823108D420ED803F1FF3302D28C +:10F3E000404209E0013B591CF0D1002004E0002B11 +:10F3F000DAD08342D8D9106830BD1FB581EAE173F5 +:10F40000CDF80CD0A3EBE17300934B1C4FF001033C +:10F4100018BF01210293019101A9FFF7ABFF05B0CD +:10F420005DF804FBF8B5044608466368B2EB830F49 +:10F430004FEA83051CD9521B8E18002109F086FC67 +:10F440002A463046811800239A4213D10020F8BD85 +:10F4500003F0030123F0030CA768CE0057F80C104B +:10F46000F14011F0FF0F11D10133AB42F0D1E9E7C8 +:10F470001346FAE703F0030023F00306A7680133FD +:10F48000C500B859E84001F8010DDDE76FF007004D +:10F49000DDE70000422AF0B5064693B0084615465F +:10F4A00026D801A9FFF7BEFF0446C8B91149304666 +:10F4B000F3F716FF044698B906F10C0720223046F0 +:10F4C0003946FFF7F1FD044650B9202201213846A4 +:10F4D00009F03CFC2A4601A93046FFF768FE0446C5 +:10F4E0001DB1294601A8FFF7C5F8204613B0F0BDAD +:10F4F000014CF6E75CB1010800B3FFFF024640682B +:10F5000080B1431E926873B952F8231000204FF067 +:10F510000042114203D1013052082028F9D10133B1 +:10F52000C0EB4310704752F823100029ECD1013B87 +:10F53000E9E7000038B5144A0125144B0446C260BF +:10F5400043660823124A83634262124A4564426555 +:10F55000114AC0E90153C0E90753C0E91353C0E998 +:10F560000A530E4BC0E90F350D4BC0E90C258364DF +:10F570000430FFF7C3FFA06504F14C00FFF7BEFFA6 +:10F58000C4E91705002038BD9CB8010841FF0008F8 +:10F590001CB801087CB801083CB801085CB8010837 +:10F5A00014010024F8B504460E464D0901F01F076A +:10F5B000FFF7A4FF63683044B0EB431F05D81F2E4C +:10F5C0000FD8002F3BD100200AE010F01F0118BF18 +:10F5D000012101EB50112046FFF7C4FC0028EED0BA +:10F5E000F8BD63686FF003009A0068431946A942AA +:10F5F000A2F104020BD8AB424FF0000228BF2B4609 +:10F600009B00043B191DDCD0A168CA50F9E7A6682D +:10F61000013906EB020C5CF800C046F802C0E6E7D0 +:10F62000A06850F8251001FA07F3134321FA06F2F7 +:10F6300040F8253001356368AB42F1D8C3E70022BA +:10F64000C7F12006F7E74368B1EB431F3FBF4A0904 +:10F65000836801F01F0153F822003ABF20FA01F13C +:10F6600001F0010000207047F8B507460D46FFF78E +:10F6700077FE022806461DD100212846FFF7E3FF4A +:10F6800060BB01212846FFF7DEFF044630BB284659 +:10F69000FFF734FFFB6D013898421FD1FE2807D1D8 +:10F6A00031462846FFF7CFFF0D4B041E18BF1C46FE +:10F6B0002046F8BD01280FD101462846FFF79DFEE0 +:10F6C00000280BDB07F14C012846FFF753FE00280A +:10F6D000034CB8BF0024EBE7024CE9E7004CE7E736 +:10F6E00080B3FFFF80B0FFFF70B50E4601210446D6 +:10F6F000FFF738FC054648B962680146A0689200E9 +:10F7000009F024FBA3681E6001232360284670BD16 +:10F7100010B501210446FFF7E7FF60B9012104F1AC +:10F720000C00FFF7E1FF30B9014604F11800BDE815 +:10F730001040FFF7D9BF10BDF0B443684E0901F087 +:10F740001F04B34201D304D15CB30021F0BCFFF726 +:10F75000CBBF1F2927D804BB0020F0BC70478268AC +:10F760005759043542F8217001319A1B8A42F6D864 +:10F7700000219342EFD9856845F822100132F8E75D +:10F78000866856F8235025FA04F20A4305FA07F171 +:10F7900046F82320013BF3D2DEE70021C4F1200725 +:10F7A000F8E71F29D8D9B5000021DEE78842F8B56F +:10F7B00006460D46144601D10020F8BD4968FFF702 +:10F7C000D1FB0028F9D171682846FFF7CBFB002850 +:10F7D000F3D16242316822432C68C2F3C012C2F1F5 +:10F7E000010303FB01F7514304FB027434602C68EE +:10F7F00004FB0311296071688842DDD2D6F808C085 +:10F80000AF685CF8201057F8204003FB01FE51431D +:10F8100004FB02E44CF8204057F8204004FB03119D +:10F8200047F820100130E6E72DE9F0410D46496820 +:10F8300006461446FFF796FBB8B96242296833685A +:10F840002243D5F804E0D5F80880C2F3C012514332 +:10F85000C2F1010C03FB0C13B168336003469E45F3 +:10F8600005D16B6872689A420CD8BDE8F08158F8EF +:10F87000237051F82340574304FB0C7441F8234094 +:10F880000133ECE751F823200CFB02F241F823206E +:10F890000133E7E710B5044670B1806838B161689C +:10F8A000890001D0FEF7E6FEA06809F0E5F9002323 +:10F8B0000122A360C4E9002310BD10B50446FFF780 +:10F8C000E9FF04F10C00FFF7E5FF04F11800BDE8C3 +:10F8D0001040FFF7DFBF08B1FFF7EFBF704770B50B +:10F8E000044660B3036E012B12D00430FFF7D2FF41 +:10F8F00004F11000FFF7CEFF04F11C00FFF7CAFF70 +:10F9000004F12800FFF7E7FF04F14C00FFF7C2FF06 +:10F91000636F8BB920467C21BDE87040FEF7AABE1C +:10F9200006FB05000135FFF7D6FFD4E91D03AB4206 +:10F93000F6D809F0A1F9EDE700252426F5E770BD1A +:10F940002DE9F84311F0030699464368054618BFB0 +:10F9500001260F46904606EB9106B34208D10021DE +:10F960002846FFF7C1FE044688B12046BDE8F8836B +:10F97000FFF790FF0023012231462846AB60C5E91E +:10F980000023FFF7EFFA04460028E8D0EDE7C7EBC5 +:10F990008603A9683A4648461944C04704460028E9 +:10F9A000E3D13146A868FDF7FFFEDEE72DE9F0411F +:10F9B00012F0030643680446884618BF012617461E +:10F9C00006EB9206B34208D100212046FFF78CFED9 +:10F9D000054688B12846BDE8F081FFF75BFF0023AC +:10F9E000012231462046A360C4E90023FFF7BAFA9A +:10F9F00005460028E8D0EDE7B8F1000FEAD0A3688B +:10FA0000C7EB860041463A46184409F091F9314661 +:10FA1000A068FDF7C9FEDDE72DE9F84381460D46F4 +:10FA200090461E461BB94D4C2046BDE8F883043075 +:10FA3000FFF764FDC41D4846FFF792FC02284FEA19 +:10FA4000D40765D1BE42EED116F003016B6818BF32 +:10FA5000012101EB54149C424AD100212846FFF7B2 +:10FA600043FE04460028DFD1A968E20018F80430FC +:10FA700024F00300013402F01802A74203FA02F254 +:10FA80000B5843EA02030B50EFD805F10C00FFF7C7 +:10FA900001FF99F80030092B12D1FB006A68013B85 +:10FAA000B3EB421F0CD25809A968012203F01F03CF +:10FAB00002FA03F351F8202022EA030241F8202041 +:10FAC000012105F11800FFF70FFE04460028ABD115 +:10FAD0004846FFF745FC01288146A5D198F800303B +:10FAE000C3B9012E9FD12846BDE8F843FFF710BEE9 +:10FAF0002846FFF7CFFE0023012221462846AB60AF +:10FB0000C5E90023FFF72EFA04460028A5D08BE7AD +:10FB1000134CDDE7042B1FD17B000133B34282D1AC +:10FB20003A4608F101012846FFF740FF0446002845 +:10FB30007FF47AAF791C3A4605F10C004144FFF797 +:10FB400035FF044600287FF46FAF494605F11800E1 +:10FB5000BDE8F843FFF7C8BD014C65E780B0FFFF83 +:10FB600080B1FFFF884270B505460E4603D04C6851 +:10FB70003CB9FFF78FFE002011E0B36853F8243042 +:10FB800013B9013C002CF8D101346A683368A242F1 +:10FB90002B6005D221462846FFF7E4F940B170BD3D +:10FBA000121BA8680021920000EB840009F0CEF837 +:10FBB000A200B168A86809F0BBF8DCE738B50446D4 +:10FBC0000D46FFF7CFFF70B905F10C0104F10C00F1 +:10FBD000FFF7C8FF38B905F1180104F11800BDE8B6 +:10FBE0003840FFF7BFBF38BD2DE9F04F002389B083 +:10FBF000174688424FF001028146884607930493D6 +:10FC0000CDE90523CDE9022306D105A8FFF7AAFF18 +:10FC1000064690BB0DF11408B94506D1494602A825 +:10FC2000FFF7A0FF064640BB02AFD8F804A0BAF128 +:10FC3000000F2CD17C68ACBB0AEB04014846FFF7EF +:10FC400091F90646C8B901464846FFF74DFD0646FC +:10FC500098B96FF00F034FEA1A1B04F1FF3C03FB46 +:10FC60000BABABF108030193BCF1FF3F23D1D8F8F4 +:10FC700000203B685343C9F8003002A8FFF70AFE92 +:10FC800005A8FFF707FE304609B0BDE8F08FD8F8A9 +:10FC9000083003EB8A0353F8043C002BCAD10AF165 +:10FCA000FF3AC4E7BB6803EB840353F8043C002B22 +:10FCB000C2D1013CBFE7BA680024D9F8083052F835 +:10FCC0002CE05246D8F8085003EB8C030F2A48D892 +:10FCD000BBF1070F40F2B78055F8040B1968EEFB33 +:10FCE000601443F8041B55F8040B1968EEFB60140C +:10FCF00043F8041B55F8040B1968EEFB601443F835 +:10FD0000041B55F8040B1968EEFB601443F8041B40 +:10FD100055F8040B1968EEFB601443F8041B55F802 +:10FD2000040B1968EEFB601443F8041B55F8040B30 +:10FD30001968EEFB601443F8041B55F8040B1968AE +:10FD4000EEFB601443F8041B019A002A7DD11A6867 +:10FD5000141943F8044B4FF00104F8D20CF1FF3CA6 +:10FD600082E7103A55F8040B1968EEFB601443F86B +:10FD7000041B55F8040B1968EEFB601443F8041BD0 +:10FD800055F8040B1968EEFB601443F8041B55F892 +:10FD9000040B1968EEFB601443F8041B55F8040BC0 +:10FDA0001968EEFB601443F8041B55F8040B19683E +:10FDB000EEFB601443F8041B55F8040B1968EEFBC6 +:10FDC000601443F8041B55F8040B1968EEFB60142B +:10FDD00043F8041B55F8040B1968EEFB601443F854 +:10FDE000041B55F8040B1968EEFB601443F8041B60 +:10FDF00055F8040B1968EEFB601443F8041B55F822 +:10FE0000040B1968EEFB601443F8041B55F8040B4F +:10FE10001968EEFB601443F8041B55F8040B1968CD +:10FE2000EEFB601443F8041B55F8040B1968EEFB55 +:10FE3000601443F8041B55F8040B1968EEFB6014BA +:10FE400043F8041B42E75A467FE7013A55F8040B92 +:10FE50001968EEFB601443F8041B76E71FB5012315 +:10FE6000009201AACDF80CD0CDE90133FFF7BCFE1A +:10FE700005B05DF804FB2DE9FF4116460023012281 +:10FE80000546B0420F460393CDE9012306D1014652 +:10FE900001A8FFF767FE044620BB01AEBD421AD1A0 +:10FEA00001232B60D6E901371BBBAA680024161F6B +:10FEB0002046984225D1ACB14FF0FF306968994295 +:10FEC0003AD952F8231099B352F82310002401397B +:10FED00042F8231006E039462846FFF743FE044661 +:10FEE0000028DDD001A8FFF7D5FC204604B0BDE80E +:10FEF000F08107EB830252F8042C002AD5D1013B94 +:10FF0000D2E756F804EFAEEB0401316057F820C099 +:10FF100001306145A1EB0C012CBF4FF000084FF000 +:10FF200001083160A6452CBF444608F10104C0E732 +:10FF300042F823000133C1E7C6D16FF00904D1E7CD +:10FF400030B58FB0092301220021044605A88DF8A1 +:10FF500003100490CDE90223242208F0F7FE1021BB +:10FF60002046FEF7FFFF0546002840F02982A368DF +:10FF700001A81A68196A01920DF10302FDF79FF9B1 +:10FF8000A3680DF1030201A8596AFDF798F9A36867 +:10FF90000DF1030201A8D96AFDF786F9A3680DF1F6 +:10FFA000030201A8196BFDF77FF9A3680DF10302A5 +:10FFB00001A8596BFDF778F9A3680DF1030201A8B8 +:10FFC000996BFDF771F9019AA3681A600DF10302AC +:10FFD0009DF903105B6800298DF80350019380F2AE +:10FFE000F281494201A8FDF75FF9A3680DF1030210 +:10FFF00001A8596AFDF763F9A3680DF1030201A88E +:020000040801F1 +:10000000996AFDF75CF9A3680DF1030201A8196B69 +:10001000FDF74AF9A3680DF1030201A8596BFDF73A +:1000200043F9A3680DF1030201A8996BFDF73CF9B0 +:10003000A3680DF1030201A8D96BFDF735F9019A08 +:10004000A3689DF903105A600DF103029B680193A8 +:10005000002399428DF8033080F2B981494201A80A +:10006000FDF722F9A3680DF1030201A8996AFDF7D3 +:1000700026F9A3680DF1030201A8D96AFDF71FF95B +:10008000A3680DF1030201A8596BFDF70DF9A368F0 +:100090000DF1030201A8996BFDF706F9A3680DF1B4 +:1000A000030201A8D96BFDF7FFF8019AA3689DF937 +:1000B00003109A600DF10302DB680193002399425B +:1000C0008DF8033080F28781494201A8FDF7ECF8F2 +:1000D000A3680DF1030201A8D96AFDF7F0F8A3683F +:1000E0000DF1030201A8D96AFDF7E9F8A3680DF143 +:1000F000030201A8196BFDF7E2F8A3680DF10302F2 +:1001000001A8196BFDF7DBF8A3680DF1030201A844 +:10011000596BFDF7D4F8A3680DF1030201A8D96B60 +:10012000FDF7C2F8A3680DF1030201A8196AFDF7F3 +:10013000BBF8A3680DF1030201A8596AFDF7B4F8F2 +:10014000019AA3689DF90310DA600DF103021B699F +:100150000193002399428DF8033080F24081494297 +:1001600001A8FDF7A1F8A3680DF1030201A8196B1E +:10017000FDF7A5F8A3680DF1030201A8196BFDF7BF +:100180009EF8A3680DF1030201A8596BFDF797F8DB +:10019000A3680DF1030201A8596BFDF790F8A3685D +:1001A0000DF1030201A8996BFDF789F8A3680DF121 +:1001B000030201A8596AFDF777F8A3680DF103025D +:1001C00001A8996AFDF770F8019AA3689DF90310D8 +:1001D0001A610DF103025B690193002399428DF8C6 +:1001E000033080F20081494201A8FDF75DF8A36861 +:1001F0000DF1030201A8596BFDF761F8A3680DF139 +:10020000030201A8596BFDF75AF8A3680DF1030228 +:1002100001A8996BFDF753F8A3680DF1030201A83B +:10022000996BFDF74CF8A3680DF1030201A8D96B97 +:10023000FDF745F8A3680DF1030201A8996AFDF7DF +:1002400033F8A3680DF1030201A8D96AFDF72CF871 +:10025000019AA3689DF903105A610DF103029B698D +:100260000193002399428DF8033080F2C080494207 +:1002700001A8FDF719F8A3680DF1030201A8996B15 +:10028000FDF71DF8A3680DF1030201A8996BFDF7B6 +:1002900016F8A3680DF1030201A8D96BFDF70FF85A +:1002A000A3680DF1030201A8D96BFDF708F8A36854 +:1002B0000DF1030201A8996BFDF701F8A3680DF198 +:1002C000030201A8596BFCF7FAFFA3680DF10302C2 +:1002D00001A8196AFCF7E8FFA3680DF1030201A861 +:1002E000596AFCF7E1FF019AA3689DF903109A612E +:1002F0000DF10302DB690193002399428DF803306D +:1003000079DA494201A8FCF7CFFFA3680DF1030297 +:1003100001A8D96BFCF7D3FFA3680DF1030201A874 +:10032000D96BFCF7CCFFA3680DF1030201A8D96BD0 +:10033000FCF7C5FFA3680DF1030201A8196AFCF7D9 +:10034000BEFFA3680DF1030201A8996AFCF7ACFF98 +:10035000A3680DF1030201A8D96AFCF7A5FFA36801 +:100360000DF1030201A8196BFCF79EFFA3680DF1C4 +:10037000030201A8596BFCF797FF019BA1689DF947 +:100380000320CB6122EAE2730B620023019308236E +:1003900001336068984232D8002A11DA039B524236 +:1003A0000499204603F18043013B41F82320224673 +:1003B00002A9FFF760FD054610B94FF0FF33236037 +:1003C00028460FB030BD01A8FCF779FF0DE601A863 +:1003D000FCF775FF46E601A8FCF771FF78E601A877 +:1003E000FCF76DFFBFE601A8FCF769FFFFE601A877 +:1003F000FCF765FF3FE701A8FCF761FF85E701987F +:1004000041F82300C4E738B50C46051D29462046AF +:10041000FEF7B0FF002801DA002006E02A46214658 +:100420002046FFF728FD0028F0D038BD90422DE986 +:10043000F04107460D46164602D0884229D135467E +:1004400001236E683B6066BB31463846FEF78AFD85 +:10045000044618BBA9680546BB6886422AD103EB4F +:100460008603DDB17A6806F10108B24208D8414638 +:100470003846FEF777FD00282FD1BB6803EB8603D3 +:100480001A684646551943F8045B2CBF0125002520 +:10049000E7E7FFF767FB04460028D0D02046BDE819 +:1004A000F081AB6803EB860353F8043C002BCBD1FF +:1004B000013EC8E753F8202012EB050C51F820202C +:1004C0002CBF012500251CEB020243F820202CBF85 +:1004D0000122002201301544BFE70446DEE7F8B5EB +:1004E0000D68044613680F4616466B43002B16DD55 +:1004F00011463846FCF7EEFE002806DB3246394648 +:100500002046FFF7B8FC40B1F8BD3A4631462046D8 +:10051000FFF7B1FC0028F7D16D422560F4E7FFF743 +:1005200085FFF0E77FB5002301F10C051646012297 +:10053000011D01A80393CDE901232A46FFF7CFFF50 +:10054000044668B901462846FEF757FF01A900286E +:100550000CBF002206F001022846FFF765F90446A9 +:1005600001A8FFF797F9204604B070BD2DE9F74FB9 +:100570009DF8308006460D461F46C8F3450902F136 +:100580000C044FF0000B01F10C0ABB4508D14FEAF7 +:10059000D8122946304603B0BDE8F04FFFF7C2BF7E +:1005A0005FFA8BF2A4F10C012846A2EB09035A4230 +:1005B0005A410192FFF738F948B92146019A50464D +:1005C0000BF1010B2434FFF72FF90028DDD003B025 +:1005D000BDE8F08FF8B50D68044613680F4616465F +:1005E0006B4316D511463846FCF774FE002806DB2F +:1005F000324639462046FFF73EFC40B1F8BD3A4648 +:1006000031462046FFF737FC0028F7D16D422560C0 +:10061000F4E7FFF70BFFF0E738B50C460546114647 +:100620001A462046FFF7D6FF28B921462846BDE8DE +:100630003840FFF7E8BE38BD70B50C460646114697 +:100640001A462046FFF74BFF054680B9043623685B +:10065000002B0CDA00212046FEF7CFFE30B13246E7 +:1006600021462046FFF7B6FF0028F0D00546284671 +:1006700070BD2DE9F04F06469BB08946104600211B +:100680009046FEF7BAFE0028C0F29B8105D16FF0BC +:100690000B0420461BB0BDE8F08F00230125414626 +:1006A00048461495CDE90853CDE90A35CDE90C3318 +:1006B000CDE90E53CDE91035CDE91233032315935F +:1006C00017AB1693FCF706FE002817DA36B1494639 +:1006D0003046FFF747FA0446002846D1002130464D +:1006E000FEF78BFE0028C0F25B8141463046FEF7E4 +:1006F00041FE002880F25B810024CAE7494608A831 +:10070000FFF730FA044680BB41460BA8FFF72AFAF0 +:10071000044650BBD9F804100EA80B950231089579 +:10072000FEF720FC044600BB01460EA8FEF7DCFFE6 +:100730000446D0B9022111A8FEF714FC0446A0B962 +:100740000BA8FEF7DBFE00F01F001F2820D0C0F131 +:100750001F0708A83946FEF725FF044628B9394681 +:100760000BA8FEF71FFF044698B108A8FFF792F800 +:100770000BA8FFF78FF80EA8FFF78CF811A8FFF76A +:1007800089F80C2117A8FDF775FF002CA6D080E78B +:100790002746099D0BA8DDF830B0A5EB0B034FEA07 +:1007A000431A01935146FEF7FDFE04460028DCD1B2 +:1007B000019B9B000BA908A80193FEF7DBFD002815 +:1007C000019B36DA51460BA8FEF7B6FF0446002817 +:1007D000CBD10BF1FF3305F1FF3A05F180450193D1 +:1007E0009B00013D03930BF18043A5EB0B05023BFE +:1007F000AD009B000793019B534529D3002EB4D035 +:10080000394608A8FEF798FF88B9D9F8003008A93A +:1008100030460893FFF7A6F90146002840F0BE8055 +:100820003046FEF7EAFD00289FD1012333600446DD +:100830009BE710990193CA580132CA5008A90BAA24 +:100840000846FFF74CFE019B04460028B2D08CE717 +:10085000DDF828B04FEA8A03039A04930BEB8A036E +:100860005BF82A1006930D9B9A58049B9142A3F1C2 +:1008700004030593109B03EB0500029075D34FF022 +:10088000FF325A51BAF1010F029A16BF069B00239C +:1008900053F8083C1793059B5BF803301893049BAF +:1008A0005BF803301993029B1B6801331360109AA5 +:1008B000002111A85359013B5351FEF715FF0028A1 +:1008C000B5D1019B0D9A002B66D0079BD158139B85 +:1008D00019600399525811A95A600846109B5A5939 +:1008E000FFF7BCFA0028A2D114A911A8FEF742FD17 +:1008F0000028DCDC109B0BA911A85A59FFF7AEFAAF +:10090000002894D14FEAC50B11A85946FEF74AFEBC +:1009100000288CD108A911AA0846FFF7E0FD01467E +:1009200000283BD108A8FEF768FD002819DA0BA9BA +:1009300011A8FFF717F900287FF479AF594611A8DD +:10094000FEF730FE00287FF472AF08A911AA08460E +:10095000FFF740FE00287FF46AAF109A5359013B1D +:1009600053510AF1FF3A043D45E7059B5BF803004C +:100970007AB100230AF0C6F80B46002102464FF078 +:10098000FF30994208BF904200D20246029B1A6093 +:1009900078E74FF0FF32F9E7019998E70C46E4E673 +:1009A000424631463046FFF715FE0446EDE6424624 +:1009B00031463046FFF793FD044600283FF495AEDC +:1009C00067E66FF0090464E6F8B50C460646114682 +:1009D0001A462046FFF708F9054650BB776E37B92F +:1009E000321D21462046BDE8F840FFF742BE23688D +:1009F000002B04DA01462046FEF7FFFC60BB2046D0 +:100A0000FEF77CFDB36DB0EB430F25D82046B84709 +:100A1000054670B904362368002B04DA002120460D +:100A2000FEF7EBFC38B931462046FEF7A3FC002860 +:100A30000ADA2846F8BD324621462046FFF7CAFDAD +:100A40000028E8D00546F4E7324621462046FFF765 +:100A500012FA0028E7D0F5E7004DEAE780B0FFFF83 +:100A60002DE9F0430E468BB00546012106F1180032 +:100A7000FEF7C3FC0446002840F099802846FEF7A4 +:100A80006FFC022807460FD13046FEF737FDEB6DAD +:100A900007300733C008B0EBD30F474B88BF1C4665 +:100AA00020460BB0BDE8F083012840F0828021464B +:100AB0003046FEF7A2FC002879DB06F10C0921463E +:100AC0004846FEF79AFC002871DB05F10408304621 +:100AD0004146FEF74FFC002869DA41464846FEF7DA +:100AE00049FC002863DA4B464A4601A92846CDE96D +:100AF0000174CDE90347CDE90544FFF765FF0446DE +:100B000000284DD13346324604A92846FFF75CFF42 +:100B10000446002844D1AB69002B37D1032304A934 +:100B200007AACDF824D0009301230846CDE9073366 +:100B3000FFF7D5FC0446002832D1049B002B19DBBB +:100B400004AA334628461146FFF73EFF044638BB49 +:100B500004AA05F11C0328461146FFF75DFD044673 +:100B6000F0B904A901A8FEF705FC134B041E18BF39 +:100B70001C4615E0002104A8FEF73FFC0028DFD04A +:100B800004A942460846FFF725FDD3E704AA05F16C +:100B9000100328461146FFF73FFD04460028CFD03A +:100BA00001A8FEF777FE04A8FEF774FE78E7024C72 +:100BB00076E7024C74E700BF80B3FFFF80B0FFFF11 +:100BC0002DE9F04F876D85B091469A46073700238F +:100BD000012206460D46FF084FF00C0800F1040BF9 +:100BE0000393CDE9012353464A46394601A8FEF74F +:100BF000A7FE0446F0B9594601A8FEF7BBFB002842 +:100C00001FDAB8F1010821D0012101A8FEF7F5FB98 +:100C10000028E8DD01AB2A4629463046FFF7D4FE1E +:100C2000044638B905F1180201AB30461146FFF70A +:100C3000CBFE044601A8FEF72DFE204605B0BDE818 +:100C4000F08F012101A8FEF777FDD2E7004CF1E714 +:100C500000B3FFFF2DE9F04F876D87B091469A46AC +:100C600007370023012205460E46FF084FF00C0807 +:100C700000F1040B05930293CDE90323CDE9002392 +:100C800053464A46394603A8FEF75AFE0446B8BB07 +:100C9000594603A8FEF76EFB00283BDAB8F10108BD +:100CA0003DD0012103A8FEF7A8FB0028E8DD06F1EE +:100CB000180203AB28461146FFF786FE0446F8B932 +:100CC00003AB694628461A46FFF77EFE0446B8B9CC +:100CD0006B46324631462846FFF776FE044678B921 +:100CE00003AB6A4669462846FFF76EFE044638B9EC +:100CF00006F10C026B4628461146FFF765FE0446D6 +:100D000003A8FEF7C7FD6846FEF7C4FD204607B0FE +:100D1000BDE8F08F012103A8FEF70EFDB6E7014CF8 +:100D2000EEE700BF00B3FFFF2DE9F04100238CB0D8 +:100D30000D4601210B93064608931746059302932F +:100D4000CDE90913CDE90613CDE90313CDE900136D +:100D50008369002B40F0DD8002F1180306A91A46D2 +:100D6000FFF732FE0446002840F0C38006AB3A4647 +:100D700003A93046FFF750FC0446002840F0B98034 +:100D800006AB3A4669463046FFF756FC0446002853 +:100D900040F0AF806B4603AA06A93046FFF714FE69 +:100DA0000446002840F0A580032206A909A8FFF701 +:100DB00055F80446002840F09C8006F1040841469E +:100DC00009A8FEF7D7FA002880F28A8007F10C08FC +:100DD00003A9304643464246FFF7F6FD0446002885 +:100DE00040F0878003A93046F2F76AFA04460028EB +:100DF0007FD103AB3A4606A93046FFF7E5FD04462E +:100E0000002876D106A93046F2F75AFA044600289F +:100E10006FD103AB694630461A46FFF7D5FD04464D +:100E2000002866D169463046F2F74AFA044600289F +:100E30005FD109AB03A930461A46FFF7C5FD04464A +:100E4000002856D103AA06AB30461146FFF7F4FB43 +:100E5000044600284DD103AA06AB30461146FFF7E1 +:100E6000EBFB0446002844D106AA03AB30461146EA +:100E7000FFF7E2FB044600283BD106AA09AB304647 +:100E80001146FFF7A1FD044698BB06AA6B46304603 +:100E90001146FFF7D1FB044658BB07F11803424641 +:100EA00069463046FFF790FD044610BB6946304660 +:100EB000F2F706FA0446E0B903A92846FEF752FE07 +:100EC0000446B0B906A905F10C00FEF74BFE044636 +:100ED00078B9694605F11800FEF744FE044608E0BB +:100EE00009A942460846FEF7C6FF044600283FF41B +:100EF00066AF09A8FEF7CEFC06A8FEF7CBFC03A858 +:100F0000FEF7C8FC6846FEF7C5FC20460CB0BDE8FD +:100F1000F081134606A9FFF757FD04460028E8D1E3 +:100F2000032206A909A8FEF799FF04460028E0D18C +:100F300006F10408414609A8FEF71CFA00282FDA3A +:100F400006F1100800214046FEF757FA00283FF44A +:100F50003DAF07F1180306A930461A46FFF734FDE6 +:100F600004460028C5D106AB03A930461A46FFF750 +:100F70002BFD04460028BCD1434603AA06A93046EF +:100F8000FFF722FD04460028B3D109AA06AB30467C +:100F90001146FFF741FB044600283FF417AFA8E7CE +:100FA00009A942460846FEF766FF04460028C1D05C +:100FB0009FE700002DE9F04302F1180997B00646BB +:100FC0000D464846002190461F46FEF716FA40B9E6 +:100FD00039462846FEF7F2FD0446204617B0BDE824 +:100FE000F0833B6A7BB107F1180400212046FEF72D +:100FF00004FA08B94146ECE701212046FEF7FDF965 +:10100000002840F0FF800023012213A930461593E9 +:1010100012930F930C93099306930393CDE9132333 +:10102000CDE91023CDE90D23CDE90A23CDE907232E +:10103000CDE90423CDE901234B464A46FFF7C4FC22 +:10104000044600283AD14B4613AA10A93046FFF7B0 +:10105000BBFC044690BB13AA3B4630461146FFF743 +:10106000B3FC044650BB10AA07F10C0330461146EE +:10107000FFF7AAFC044608BB13AA434630461146B4 +:10108000FFF7DAFA0446C8B910AA08F10C0730468F +:101090003B461146FFF7D0FA044678B9014613A83B +:1010A000FEF7ABF920BB214610A8FEF7A6F9D8B988 +:1010B000424629463046FFF737FE044613A8FEF79E +:1010C000E9FB10A8FEF7E6FB0DA8FEF7E3FB0AA874 +:1010D000FEF7E0FB07A8FEF7DDFB04A8FEF7DAFB4E +:1010E00001A8FEF7D7FB78E72846FEF711FBE4E7F7 +:1010F00013AB4A4601A93046FFF766FC04460028B8 +:10110000DCD113AB0DA930461A46FFF75DFC04464F +:101110000028D3D113AB0DAA0AA93046FFF754FC1F +:1011200004460028CAD10DAA434630461146FFF7AF +:101130004BFC04460028C1D10DA913A8FEF712FDEF +:1011400004460028BAD113A93046F2F7B9F804468C +:101150000028B3D110AB07A930461A46FFF734FC7C +:1011600004460028AAD107AA13AB30461146FFF760 +:1011700063FA04460028A1D107AA0AAB30461146FB +:10118000FFF75AFA0446002898D10DAA07AB30465B +:101190001146FFF751FA044600288FD10DAA10AB73 +:1011A00030461146FFF710FC0446002886D10AAAF3 +:1011B0003B4630461146FFF707FC044600287FF403 +:1011C0007DAF0AAB0DAA04A93046FFF735FA0446F5 +:1011D00000287FF473AF07A92846FEF7C3FC044636 +:1011E00000287FF46BAF04A905F10C00FEF7BAFCF0 +:1011F000044600287FF462AF01A905F11800FEF74C +:10120000B1FC5AE7004CE8E680B0FFFF2DE9F0435F +:101210000646A3B00F46104601211546FEF7EDF82D +:10122000002840F3C48100234FF0010939461CA86F +:101230001893159312930F931B930C930993069392 +:101240000393CDE91693CDE91393CDE91093CDE93E +:101250000D93CDE91993CDE90A93CDE90793CDE933 +:101260000493CDE90193CDE91C93CDE91E39CDE975 +:101270002033FEF777FC044600285AD129461FA8E0 +:10128000FEF770FC0446002853D11CA8FCF755F863 +:1012900080461FA8FCF751F8804528BF80461CA84F +:1012A0004146FEF749FA0446002842D141461FA8AC +:1012B000FEF742FA044600283BD1CDF87C90CDF8E9 +:1012C000709000211CA8FEF798F858B941461FA855 +:1012D000FEF768F9044660BB1FA919A8FEF742FC97 +:1012E000044626E01CA8FCF728F801461CA8FEF7D7 +:1012F00023FA0446E8B91FA8FCF71FF801461FA807 +:10130000FEF71AFA0446A0B91FA91CA8FEF732F886 +:101310000028C0F29C801CA91FAA0846FEF7ABFD5E +:10132000044630B901211CA8FEF706FA044600283D +:10133000C7D01CA8FEF7AEFA1FA8FEF7ABFA002C28 +:1013400040F0A680012119A8FEF757F8002840F0C8 +:101350002B812A46394616A8FFF78BF90446002848 +:1013600040F0968016A913A8FEF7FCFB044600285F +:1013700040F08E8029460AA8FEF7F4FB04460028B8 +:1013800040F08680294607A8FEF7ECFB04460028BB +:101390007ED1012110A8FEF7A7F90446002877D1D5 +:1013A00001460DA8FEF7A0F90446002870D10146B9 +:1013B00004A8FEF799F90446002869D1012101A883 +:1013C000FEF792F90446002862D1159B1B68D807E6 +:1013D00049D5099B1B68DB0740F18F8007A913A83B +:1013E000FDF7C8FF0028C0F2B88013A907AA084675 +:1013F000FFF775F8044600284AD110A904AA084648 +:10140000FFF76DF80446002842D101AA0DA908464D +:10141000FFF765F8044600283AD1002113A8FDF72C +:10142000ECFF0028D1D1002104A8FDF7E6FF002839 +:10143000C0F2A680294604A8FDF79CFF002880F290 +:10144000A98004A93046FEF78DFB044620E01FA9C1 +:101450001CAA0846FEF70FFD044600287FF469AF7A +:1014600001211FA860E7012113A8FEF765F90446D2 +:1014700070B9129B1B68DF0729D40F9B1B68DC0720 +:1014800025D4012110A8FEF757F9044600282FD0D3 +:1014900016A8FEF7FFF913A8FEF7FCF910A8FEF74F +:1014A000F9F90DA8FEF7F6F919A8FEF7F3F90AA85D +:1014B000FEF7F0F907A8FEF7EDF904A8FEF7EAF940 +:1014C00001A8FEF7E7F9204623B0BDE8F08310A994 +:1014D0000AAA0846FFF77EF804460028D8D10DA9CD +:1014E00016AA0846FEF7FBFF04460028C9D0CFE73E +:1014F00001210DA8FEF720F964E7012107A8FEF7F6 +:101500001BF904460028C3D1069B1B68D90713D4D6 +:10151000039B1B68DA070FD4012104A8FEF70CF91E +:1015200004460028B4D1012101A8FEF705F90446BC +:1015300000283FF44EAFABE704A90AAA0846FFF71C +:1015400049F804460028A3D101A916AA0846FEF7C7 +:10155000C6FF04460028DFD09AE707A913AA084669 +:10156000FEF7BDFF0446002892D104A910AA084640 +:10157000FEF7B5FF044600288AD10DAA01A946E767 +:1015800004A92A460846FFF725F8044600283FF438 +:101590004AAF7DE704A92A460846FEF7A0FF0446A5 +:1015A00000283FF447AF73E76FF00D0470E76FF06A +:1015B000030488E72DE9F04101F1180588B00746DA +:1015C000884628460021FDF718FF044600283BD036 +:1015D000002301263A1D294605A807930493CDE967 +:1015E0000563CDE90263FFF711FE044630BB05AB8E +:1015F00002A938461A46FFF7E7F90446F0B902ABEC +:10160000424641463846FFF7DFF90446B0B908F1D3 +:101610000C0202AB384611460192FFF7D5F9044699 +:1016200060B9019A05AB38461146FFF7CDF904467B +:1016300020B931462846FEF757F8044605A8FEF7BC +:1016400029F902A8FEF726F9204608B0BDE8F08186 +:10165000012A2DE9F04F06468DB00C46154607D8F5 +:101660000968FFF7A7FF824650460DB0BDE8F08F2E +:101670000C21104608F00EFE0746002800F0B78047 +:101680004FF00C0881460246012108FB05F800EBEB +:1016900008030093002393600098C2E900130C3202 +:1016A0009042F8D138460B9308930593CDE909137E +:1016B000CDE90613CDE9031321681831FEF752FA7C +:1016C000824690BB04F1040B07F10C0104EB850486 +:1016D0005BF8043BA1F10C02304601911833FFF78F +:1016E00073F9824608BB01995C4501F10C01EFD109 +:1016F000A8F10C01321D09A83944FFF787FD824685 +:1017000098B9013D4FF00C08A7F10C0B15BB09A9C6 +:1017100006A8FEF727FA824638B906AB03A9304679 +:101720001A46FFF751F9824638B309A8FEF7B2F816 +:1017300006A8FEF7AFF803A8FEF7ACF8484609F193 +:101740000C09FEF7A7F8009B4B45F7D1384607F088 +:1017500093FA89E708FB05B309AA06A93046FFF703 +:1017600033F982460028E0D154F8043C09AA3046F7 +:1017700018331146FFF728F9CDE754F8042C03ABD2 +:1017800030461146FFF720F982460028CDD154F8A3 +:10179000042C03AB30460C321146FFF715F9824694 +:1017A0000028C2D154F8042C06AB30460C32114646 +:1017B000FFF70AF982460028B7D1B16854F8040C43 +:1017C000FDF7FCFB82460028AFD154F8040CB16849 +:1017D0000C30FDF7F3FB82460028A6D154F8040D27 +:1017E0001830FEF757F8002D9FD0013D8EE7DFF847 +:1017F00004A039E780B2FFFF70B404680E1B002E0E +:1018000007DD26789E4208D10134046070BCFBF7E6 +:10181000AEBD6FF05F0070BC70476FF06100FAE71B +:101820002DE9F74390461F4601AA30230546894615 +:10183000FFF7E2FF0446F8B92E68A9EB0609B9F1F3 +:10184000000F35DD01994246337828460E4442F8B0 +:10185000043B06233146FFF7CFFF044660B92A68F0 +:10186000D8F80410C8F808205318B3422B6007D1E9 +:101870000C213846FCF7FEFE204603B0BDE8F0839D +:10188000515C01333A46284642F8041B31462B602E +:10189000FBF76DFD04460028EED12B687A68BB602B +:1018A0001344B3422B600CBF04466FF06504E3E7BA +:1018B0006FF05F04E0E737B50223154601AA04463E +:1018C000FFF79AFF40B9019A28462168FEF76EF8A3 +:1018D0002368019A1344236003B030BD2DE9F04F13 +:1018E00097B002931368209C0F2B0193CDE90A0255 +:1018F00000F2F181219BB54D0B44B54EB54F0C93D1 +:10190000219B0C9A934207D10B9B00201A46019B06 +:10191000136017B0BDE8F08F019B83B1019B219943 +:10192000E35C11F8012B5340229A219102F8013B0C +:10193000019B2292013303F00F030193E0E70A9B1E +:10194000DFF898C25A68029B19680E9113684B40E1 +:101950000E93029B59680F9153684B400F93029B63 +:101960009968109193684B401093029BD96802F1DB +:101970001003303211910D9352F8243C4B401193D7 +:101980000A9B1B685B100493013B05930393203271 +:10199000DDE90E9ADDE910835FFA89F0190E55F83A +:1019A00020005FFA83FE56F821105FFA88FB55F895 +:1019B0002EE04840CAF3072155F82BB057F8211004 +:1019C0004840C8F307415CF82110484052F8401CD9 +:1019D0004140C8B20690080E0790C1F30740089036 +:1019E000C1F3072009904FEA1860C8F3072856F89A +:1019F00020008EEA000EC9F3072057F820008EEA77 +:101A0000000ECAF307405CF820008EEA000E4FEA91 +:101A10001A605FFA8AFA56F8200055F82AA08BEA75 +:101A20000000C3F3072BC3F3074357F82BB05CF850 +:101A3000233080EA0B00C9F3074B4FEA19695CF8C1 +:101A40002BB056F8299080EA0B008AEA090A57F869 +:101A500028908AEA090A8AEA030A039B002B00F30A +:101A6000BF80059B12914FEA431C049B002B0D9BEA +:101A7000D8BF4FF0000C63445A689C468AEA020AB9 +:101A8000CDF84CA09968414053481491DA688EEA29 +:101A9000020E4FEA1E62CDF854E010F80290069A4A +:101AA00010F802801A6988EA020282EA0968CAF319 +:101AB0000722825C88EA0228C1F30742825C88EA36 +:101AC0000248079A10F802B05A69CDF8388082EAC5 +:101AD0000B6B5FFA8AF2825C8BEA020BC1F307227E +:101AE000825C8BEA022BCEF30742825C8BEA024BCC +:101AF000089A10F802909A69099B82EA0942CDF887 +:101B00003CB05FFA81F9090E10F8099082EA0902E7 +:101B10004FEA1A6910F8099082EA0962CEF30729A0 +:101B20005FFA8EFE10F8099082EA0922109210F8EE +:101B30000390CAF30743DCF81CC0C35C8CEA092994 +:101B400010F80EC089EA0C0910F801C04FEA1821FC +:101B5000227289EA0C6984F8008061704FEA1841AA +:101B600089EA034384F804B0A1704FEA1B214FEACD +:101B70001369237361714FEA1B414FEA18680EA87D +:101B8000A171110A4FEA1B6B84F803806172110C7A +:101B9000120E84F807B0A1722021E2721A0A84F8AA +:101BA0000F9062731A0C1193A273FCF763FD029BF2 +:101BB00003F1100212F8013D0133DBB21370002B68 +:101BC0007FF4ACAE029B9A42F4D1A7E6041502243E +:101BD00004210224041902243C040024041D0224CC +:101BE000129152F83C3C8AEA0309069BCDF84C90CE +:101BF00052F8381C4140149152F8340C8EEA00001F +:101C000055F823E015904FEA106852F8303C56F82A +:101C1000288083EA0E0E079B8EEA080EC9F3072878 +:101C200057F828808EEA080EC1F307485CF8288030 +:101C30008EEA080E5FFA89F8CDF838E056F823E00E +:101C400052F82C3C55F8288083EA0E0E089B8EEA49 +:101C5000080EC1F3072857F828808EEA080EC0F353 +:101C600007485CF828808EEA080E5CF82380CDF8DF +:101C70003CE05FFA81FE52F8283C090E55F82EE050 +:101C80008EEA080E4FEA19688EEA030E56F828808D +:101C9000099B8EEA080EC0F30728C0B257F82880C7 +:101CA0008EEA080ECDF840E055F820E057F8230002 +:101CB000C9F307438EEA000E52F8240C56F821109F +:101CC0008EEA000048405CF82310039B4840013B2B +:101CD000119003935BE66FF020001AE6F0B5ADF6C5 +:101CE000040D012300220DF58060054613F08001EC +:101CF0004DF8232040F8043B02F1010218BF1B21DC +:101D000083EA4303B2F5807F83EA0103DBB2EDD1BE +:101D100036480123002213F0800102F1010240F84D +:101D2000043B18BF1B210A2A81EA4303DBB2F2D12C +:101D300063232F4C2F4801212370002380F8633048 +:101D40005DF82130C3F1FF0355F823E04FEAEE12AE +:101D500042EA4E025FFA82FCC2F3C01242EA4C022F +:101D6000D7B2C2F3C01242EA4702D6B2C2F3C012DF +:101D700042EA4602D3B283EA0E0383EA0C037B40B5 +:101D8000734083F063036354C1540131B1F5807F24 +:101D9000D6D1DFF85CC0184F184E194D194C1CF8FD +:101DA000012B12F0800F4FEA024314BF1B200020CA +:101DB00043EA0223013980EA4200C0B282EA00020B +:101DC00083EA000343EA02634FEA336247F8043BC5 +:101DD00046F8042B4FEA33424FEA332345F8042BED +:101DE00044F8043BDBD10DF6040DF0BD3C050024A6 +:101DF0003C040024042502240415022404190224AE +:101E0000041D02240421022410B5FCF709FB012360 +:101E100080F83F30836B1BB1064B4FF080625A60F5 +:101E2000D0E90A23BDE8104012F57A7243F10003AD +:101E3000FBF70BBE00ED00E008B5EFF3058353B1EF +:101E4000124B1B689869FCF799FA4FF47A720023D9 +:101E500008F0A4FC08BDFBF737FDEFF305836BB179 +:101E60000B4BD8680B4B1A681860824281BF0A4935 +:101E70000A6801320A60FBF713FDEBE702F0FCFD94 +:101E80000028EDD1DFF814C000DFEBE7282702249B +:101E9000180100243427022430270224AD3701081A +:101EA0002DE9F04F85B0EFF30583002B42D00020E1 +:101EB000DFF848A1DAF80040FBF706FDD4E90C8909 +:101EC000FBF7EEFCA36BB8EB030869EBE37918EBC7 +:101ED000000449F10005FCF7A3FA4FF47A73A4FB60 +:101EE000036703FB05770020FBF78CFA002855D128 +:101EF000DAF8003093F83D30002B4FD16FF00043FB +:101F00004FF0FF329D4208BF9442ECD0DAF800B0A7 +:101F10009BF83C30002BE6D1594602A8FCF73DFA6D +:101F2000DDE90223AB4208BFA2420BD301238BF8A9 +:101F30003D30D8E702F0A0FD0028B8D1DFF8C0C0DE +:101F400000DFB5E7FBF7C0FCDBE90C01FBF7A8FC01 +:101F5000231A4FF00100009365EB01039BF840103A +:101F60000193ABF83C00DBE9082316EB020C47EBCE +:101F7000030339B9DBF81820116891F8201069BB08 +:101F80008BF840004FF000029BF840008BF83E2099 +:101F900010B901208BF8400062462BE0DAF80040CF +:101FA0002046FCF7C0FA002394F84020A3870AB12A +:101FB00084F84030DAF8001002A8FCF7EEF9029C31 +:101FC000EFF305833BB902F057FD20B9A4EB0800FD +:101FD000DFF830C000DF05B0BDE8F08FDDE90012AA +:101FE000002A08BF0529CDD3BCF57A628BF83E00E4 +:101FF00043F1FF335846FBF728FD74E728270224F6 +:1020000075400108093C01082DE9F3470546002603 +:10201000674FFFF711FF85F82460FBF755FC6B68ED +:1020200001A91B1A002B2B68D8BF686001931BB154 +:102030005A69121A002A3BDD2B6003B11D610E6044 +:10204000019911B12B8901332B81FBF729FC01A8E0 +:10205000002931D1019C05F118094FF0010A002C2B +:1020600037D1FFF7E9FEFBF72FFC2B68002B7ED062 +:102070005C69241A24EAE474FBF712FCD5F830807A +:10208000EFF30583002B75D0B8F1000F7DD1AB7A4B +:10209000002B00F08A80FBF717FCAB7A002B00F0D6 +:1020A00082800023AB7202B0BDE8F047FBF7F8BBBB +:1020B00003F108019B68BAE78C680B4600229A601E +:1020C0001A46DB68002BFAD1026001F108002146B4 +:1020D000BEE7236AD4F8088013B104F124009847BE +:1020E000A269002A0BDB636913446361FFF7A4FE56 +:1020F000214602462846FCF7CFF94446AFE7EB6895 +:1021000073B1A3420CD82B6AA34209D3A3792A69DD +:102110000133DBB213FA02F214BFA37184F806A0F4 +:10212000E36913B104F124009847EB6823B1A3429B +:1021300002D82B6AA34201D2A671DEE7FBF7C4FBEB +:102140004846AB6983B119682268914208D30BD124 +:10215000E36003689B68A3600460FBF7A1FBCCE726 +:1021600003F108009B68EDE7E6600368F3E74FF0D2 +:10217000FF3481E702F080FC0246002884D140460B +:1021800001212346BC4600DF81E798F80030F32B9D +:102190007FF47DAF002C7FF47AAF224601214046C8 +:1021A00003F0E4F873E7FBF77BFBFFF745FE34E74A +:1021B000A953010838B50546046854B9FBF762F91C +:1021C0002C6824B92C1D2046F9F754F82C60FBF735 +:1021D00051F9204638BD00002DE9F0418846002520 +:1021E00004462349C0E90055404608F006FA8044F9 +:1021F000C4F8008023681A782F2A1CD10133236089 +:102200001C48FFF7D7FFF8F741FE1B4B1E68D6B1FD +:10221000B768B7B1384607F08DFB854211D12A4621 +:102220004146384608F0ECF858B91248FFF7C2FFAB +:10223000F8F70CFE17E0002AE2D0013301352360E5 +:10224000D8E77668E3E7072DEFD12A4641460B48E9 +:1022500008F0D6F80028E8D10648FFF7ABFFF8F7FA +:10226000F5FD074B1E6820466660BDE8F08100BFA3 +:10227000B7AB0108D8060024D4060024BAB201087E +:10228000D82602242DE9FF478A463F49054607F034 +:102290003FFB044628B9FBF7F5FC204604B0BDE837 +:1022A000F0873A49284607F033FB20B90120012482 +:1022B000FBF7E8FCF1E73649284607F029FB20B98F +:1022C00002200224FBF7DEFCE7E72B78402B02D14B +:1022D000D5F80140E1E72F4E03242F48B046FFF721 +:1022E00069FFF8F7D3FD56F82490B9F1000F2AD012 +:1022F0000134402CF7D105F0A7FE182303602648CF +:10230000FFF758FFF8F7A2FD0AE002A8FBF7AAFFC3 +:10231000054640B905F098FE1323036046F82450A3 +:102320004FF0FF34B9E7036801A9029A9D682AF4C7 +:102330008033A8470546E8B16D4205F085FE05608B +:1023400046F82490ECE74FF0FF37134846F8247026 +:10235000FFF730FFF8F77AFD294602A8CDF8049080 +:10236000FFF73AFF039D002DD4D02B7B002BCCD15F +:10237000043D0195019B094A48F824300023135578 +:10238000074A135589E700BF0CB8010813B80108C4 +:1023900004B801080C000024882602240826022420 +:1023A000482602241D4B70B5036004461C48FFF705 +:1023B00001FFF8F76BFDA3682BB11A4962680B683F +:1023C000A34224D10A60184B15481A68A24204BFE0 +:1023D00000221A60FFF7EEFEF8F738FD257BA5B95D +:1023E0001248261FFFF7E6FEF8F750FD104A40237B +:1023F00052F8041B8E4208BF42F8045C013BF7D13F +:102400000A48FFF7D7FEF8F721FD204670BD1946B0 +:102410005B68A342FBD14A60D5E700BFC8B00108A2 +:10242000D8060024D4060024D826022488260224B4 +:102430000C00002410B50446FFF7B4FF204606F058 +:102440001BFC204610BD000008B50348FFF7B2FE94 +:10245000BDE80840F8F7FABCB026022408B50348E6 +:10246000FFF7A8FEBDE80840F8F710BDB02602242B +:102470002DE9F0479DF82070054689469246022FC7 +:1024800098469DF8246022D8124BDB5DFBB1B6FB69 +:10249000F3F403FB146414F0FF0418D1FFF7DEFF1C +:1024A0009DF82830284685F8609085F865300B9BAC +:1024B00085F861A085F8628085F8637085F86460AE +:1024C000C5F88830FFF7C0FF2046BDE8F0874FF021 +:1024D000FF30FAE7CDB20108274B10B50446036080 +:1024E000FFF7BCFF25496268136823F001031360FE +:1024F0000023A36484F84530214BD1F88C209A4204 +:10250000FBD1204BB4F95400DA6F42F48042DA6711 +:10251000DA6F22F48042DA674FF44072CA6040F208 +:10252000C331D3F8D42022F48042C3F8D420F2F788 +:1025300073FFB4F9560040F2C331F2F76DFFB4F9FE +:10254000580040F2C331F2F767FFB4F95A0040F285 +:10255000C331F2F761FFB4F95C0040F2C331F2F726 +:102560005BFF40F2C331B4F95E00F2F755FF20463D +:10257000FFF76AFF204610BDDCB70108006402586F +:10258000000300800044025810B50446FFF7A4FF82 +:10259000204606F071FB204610BD00002DE9F04FEB +:1025A0000D46164685B0F0F753FEAC1900F10060F9 +:1025B000A042C0F01E8109D92046F0F729FEB4FBE5 +:1025C000F0F303FB1040002840F0138190484FF0D7 +:1025D0000009DFF858B2FFF7EDFDF8F757FC002EC1 +:1025E00000F0FE80B9F1000F40F0F88005F178436B +:1025F000B5F1016F4FF0100A4FEA5343019334BF16 +:1026000001230223012B03F0010803F002070CBF92 +:102610004FF000634FF001630293FBF7A3F9FBF760 +:102620007DF9BBF800304FF6FD715A1E92B28A4216 +:1026300097BF784A4FF0026302EA832303F10063F5 +:102640009D420ED2B5F1006F0BD3734C734BD4F88F +:1026500088209A42FBD1F4F785FC60B14FF44073B7 +:10266000A360FBF749F9FBF76BF9BAF1010AD4D182 +:102670004FF0FF396BE0FBF727F9BBF800204FF66E +:10268000FD71DFF8AC91531E9BB28B4299F8143068 +:1026900097BF634C4FF0016404EA422404F10064E4 +:1026A000A5422ABF2C1B019C640C012B00F09380D7 +:1026B0000120002389F81400C9F81830B8F1000F80 +:1026C00000F09D80F0F746FD031E18BF0123002F88 +:1026D00000F0998002200393F0F73CFD039B002853 +:1026E0003BD001200023C01A89F8143018BF012004 +:1026F000C0F10009029B03EB4444BFF34F8F494BE9 +:1027000004F50032C3F8704220349442FAD1BFF38A +:102710004F8FBFF36F8FBFF34F8FBFF36F8F0022C9 +:10272000C3F85022BFF34F8FBFF36F8FFBF7B8F89A +:10273000F4F700FC002894D1374B4FF440729A60B4 +:10274000B9F1000F8DD1FBF7D7F8FBF7F9F8284660 +:10275000F0F75EFD361A054441E7002BC1D1B8F110 +:10276000000F0AD0304AD36823F4E663D360D368FD +:1027700043EA042343F0A403D36077B12A4AD2F892 +:102780000C3123F4E663C2F80C31D2F80C3143EA81 +:10279000042343F0A403C2F80C31B8F1000F2BD08E +:1027A0000120F0F7D7FC204AD36823F4E06323F03C +:1027B0000403D3605FB10220F0F7CCFC1A4AD2F8D0 +:1027C0000C3123F4E06323F00403C2F80C31002839 +:1027D00088D1002086E74FF0FF398BE74FF0FF39B3 +:1027E0000B48FFF7E7FCF8F731FB484605B0BDE8BA +:1027F000F08F4FF0FF39F8E7002FEAD0DBE7002F2A +:10280000E7D0434666E700287FF46BAFAAE700BF36 +:10281000A414022400FC3F0000640258000300805E +:1028200000FE1F0000ED00E00020005280E8F11FD4 +:102830004C0B02242DE9F04F12F01F0487B08246A2 +:102840000F461646994640F02681002900F0238164 +:10285000F0F7FEFC09EB060300F10060834200F292 +:102860001A818E48DFF850B2FFF7A4FCF8F70EFB90 +:10287000B9F1000F00F00681002C40F001813046D4 +:10288000F0F7C6FCB6FBF0F500FB1565451B4D45A2 +:1028900028BF4D46BB0701D11F2D4BD8202DA84680 +:1028A0003946DAF8040028BF4FF02008424606F007 +:1028B0003FFA1F2D07D8DAF80400C8F12002FF21E3 +:1028C000404406F043FADAF804302025039310233D +:1028D0000293FBF747F8FBF721F8714B19884FF685 +:1028E000FD734A1E92B29A4297BF6E4B4FF002633D +:1028F00003EA812303F100639E4210D2B6F1006F18 +:102900000DD3694C694BD4F888209A42FBD1F4F777 +:1029100029FB002800F0AC804FF44073A360FAF765 +:10292000EBFFFBF70DF8029B013B0293D1D14FF077 +:10293000FF3487E025F01F050397A846C7E7012B62 +:1029400000F09B8002F178400123B0F5801F8BF8E6 +:10295000143006D3A2F10163B3F5801F80F08580A7 +:102960000223002005920493CBF818001846F0F7D4 +:10297000F1FB059A20BB049B4D48012B67D1C16830 +:1029800041F00201C160BFF36F8FBFF34F8F002092 +:1029900001990958115004302028F9D10592BFF34C +:1029A0006F8FBFF34F8F18460493F0F7D3FB049B50 +:1029B000059A012B3E4B51D1D96821F00201D96013 +:1029C00000238BF8143000284FD1019B2032203394 +:1029D00001939BF814307019824203D2002CAED0C0 +:1029E0004FF0FF34002D11DD06F01F032B44BFF321 +:1029F0004F8F304832463344C0F870222032991A43 +:102A00000029F9DCBFF34F8FBFF36F8FBFF34F8FF8 +:102A1000BFF36F8F274B0022C3F85022BFF34F8FB5 +:102A2000BFF36F8FF4F786FA00287FF478AF1E4B60 +:102A30004FF440729A60002C7FF471AFFAF75CFF9C +:102A4000FAF77EFFA9EB08094644474410E7D0F89F +:102A50000C1141F00201C0F80C1194E7D3F80C11ED +:102A600021F00201C3F80C11AAE74FF0FF34B0E7E0 +:102A7000039B044632460193ABE74FF0FF34ABE7CC +:102A80004FF0FF340548FFF795FBF8F7DFF92046D4 +:102A900007B0BDE8F08F4FF0FF34F8E7A41402242C +:102AA00080E8F11F00FC3F00006402580003008032 +:102AB0000020005200ED00E04C0B022410B504464B +:102AC0000B48FFF777FBF8F7E1F9FAF74BFFFAF756 +:102AD00025FFFAF711FFFAF733FF606808B106F037 +:102AE000CBF80348FFF766FBF8F7B0F9002010BDFC +:102AF000A414022410B504461248FFF75BFBF8F754 +:102B0000C5F9FAF72FFFFAF709FF0F4B0F4AD3F871 +:102B100088109142FBD14FF48E010D4A51614FF460 +:102B200040729A60FAF7E8FEFAF70AFF2020FAF7F7 +:102B300059FE60600348FFF73DFBF8F787F9002076 +:102B400010BD00BFA41402240064025800030080DA +:102B500000200052014B5869704700BF1801002443 +:102B600001230A4A90F9201043701C32936810B573 +:102B70001BB193F920408C4205DCC0E90232906021 +:102B800003B1D86010BD1A469B68F1E71801002414 +:102B900090F82230826B13F0100F0CBF60202020C1 +:102BA0001044704710B5C469621CD0E904310CD1DF +:102BB00003B1596142691AB113610023436101E015 +:102BC000074A13630023C36110BD1BB1DA69596161 +:102BD0002244DA614269002AEED1014AD362F1E768 +:102BE00018010024C2682AB18368936003B1DA60D7 +:102BF0000023C36070470378F12B00D07047C06892 +:102C0000F9E783689A68826002B1D06000221846B2 +:102C1000DA60704738B51F4C237A022B35D1636ACE +:102C2000002B34D063694A1C587016D1226B0021E6 +:102C300072B94FF0FF30C3E90421D86159B10B617B +:102C40001548FFF7DEFF02234370A061012038BD65 +:102C500011461269ECE72363F2E7E26A002012B141 +:102C6000D569A9420BD2D961C3E9042058B10361E7 +:102C7000002AE5D0D0695361411AD161E0E71046DE +:102C8000491B1269EBE7E362F2E70020DFE7184631 +:102C9000DDE700BF180100243401002491F9202051 +:102CA000836810B51BB193F92040944205DAC1E95D +:102CB0000230816003B1D96010BD18469B68F1E70E +:102CC0000123014643700148FFF7E8BF34010024A7 +:102CD00070B5124D04462E7A696990B9022E0FD153 +:102CE0006C6A6CB194F9202091F920309A4207DD8A +:102CF0002046FFF777FF0846FFF732FF6670AC61AA +:102D000070BD022E05D190F9202091F920309A4211 +:102D1000F1DC2046BDE87040FFF7D2BF1801002467 +:102D200038B504461546FFF733FF01602046FFF72C +:102D300039FF1DB1BDE83840FFF7CABFBDE83840D4 +:102D4000FFF7BEBF10B50446806918B100221146D6 +:102D5000FFF7E6FF6378232B02BFA36800229A6186 +:102D600010BD10B50146044664B12378F12B07D09D +:102D70000846FFF737FF2046BDE81040FFF78EBF3B +:102D8000E468F1E710BD000038B5254DEC6A002C71 +:102D900045D0E369013BE361002B40D16378732B9D +:102DA00006D009D8532B0BD003F0DF03432B29D1D6 +:102DB0002046FFF720FF25E003F0EF03832BF6E723 +:102DC0002046FFF718FFC3789B071BD5C06890F912 +:102DD0002120C36AD978890709D599688C4208BF30 +:102DE000A16821B191F920108A42B8BF0A465B69F7 +:102DF000002BEFD190F92030934203D080F82020AF +:102E0000FFF7AFFF2046FFF7EDFEFFF759FF2469FC +:102E100024B1E369002BC1D000236361EC6238BDAB +:102E20001801002410B5034653E8000F084203D1EF +:102E3000BFF32F8F002005E020EA010243E80024C1 +:102E400004B1F1E710BD10B5034653E8000F00EAE6 +:102E500001028A4203D0BFF32F8F002005E020EA51 +:102E6000010243E8002404B1EFE710BD10B5437838 +:102E70000446332B15D190F82330416A03F0010248 +:102E80009B0708D428301AB1FFF7DDFF48B10BE0EB +:102E9000FFF7C8FFFAE7806A01EA000312B199421E +:102EA000F4D010BD002BFCD0014600222046BDE826 +:102EB0001040FFF735BFD0E85F3F13B9BFF32F8F46 +:102EC00004E05A1EC0E8512F01B1F4E798B27047F0 +:102ED00010B5D0E85F3F5A1C914200D80022C0E8EC +:102EE000542F04B1F5E798B210BD10B5D0E85F3F9C +:102EF000994202D8BFF32F8F04E05A1CC0E8542F28 +:102F000004B1F3E798B210BD10B50446B8B1037828 +:102F1000F62B14D183683BB1FFF773FE0122002129 +:102F2000FFF7FEFE002010BDC1890C30FFF7DDFF6A +:102F3000E38983428CBF00206FF00200F3E76FF05B +:102F40000300F0E7836810B5044663B10C30FFF767 +:102F5000B2FF40B12046FFF754FE0022BDE810400A +:102F60001146FFF7DDBE10BD284B5A6970B5044607 +:102F7000002A41D0002842D00378F52B3FD1037EB0 +:102F8000002B3FD0C16891423CD1013BDBB20376BC +:102F900013BB43690BB1016919612169F1B14B613F +:102FA00092F92130D56ADDB982F82030A36883B167 +:102FB0002046FFF726FE06462A462946FFF7B0FEC2 +:102FC000F36AC4E90365636103B11C610123F46220 +:102FD00023760020FFF77CFE00200FE0D362DFE7BE +:102FE000E978890706D5A96821B191F920108B42AB +:102FF000B8BF0B466D69D6E74FF0FF3070BD6FF07C +:103000000300FBE76FF00200F8E700BF180100249F +:10301000224B70B55D6904460E46002D35D0002860 +:1030200036D00378F52B33D1037E53B9C0E903536F +:10303000EB6A436103B118610123EC62002023763F +:1030400070BDC278D10706D5C168A94203D1FF2B54 +:1030500021D00133F2E7F6B193070AD5E06895F97C +:10306000203090F920209A4203DA80F82030FFF7D0 +:1030700078FE31465320FFF7CDFD18B12946204692 +:10308000FFF70CFE6FF00100DAE74FF0FF30D7E7F3 +:103090006FF00300D4E76FF00200D1E718010024BD +:1030A0002DE9F0410446002601270CB9BDE8F08166 +:1030B000E378D4F814801B0712D5A36826767BB179 +:1030C0002046FFF79EFD002205461146FFF728FE29 +:1030D000EB6AC4E90356636103B11C61EC622776B5 +:1030E0004446E2E7034653E8000F421C43E8002150 +:1030F00001B1F8E77047036B30B4BBB1CD78002461 +:10310000DA78AA420AD31A46C1E9012462B1916071 +:103110007CB16160283030BCFFF7E4BF5A681C46C0 +:10312000002AF1D01346EBE7C162F1E7C1E90133B0 +:10313000C1620163EEE730B5F0B1C3688B421BD8C2 +:1031400003698B4218D900F114031A680A60BFF3AF +:103150005F8F53E8002F0C689442F6D143E80015C6 +:1031600005B1F2E7043050E8003F5A1E40E8002164 +:1031700001B1F8E7002030BD6FF00300FBE710B5A8 +:1031800090B100F1140353E8004F14B9BFF32F8F2F +:1031900004E0226843E8002101B1F4E714B10430EF +:1031A000FFF7A0FF204610BD0446FBE730B5C0B1D5 +:1031B00089B1C2B1CBB100240160C3604361C0E9F1 +:1031C000014202FB01F41D1905611846013904D1C1 +:1031D000A21A99500121084630BD8518056028467D +:1031E000F4E70146F7E71146F5E71946F3E730B58E +:1031F00080B1C9B1A1F1080500F108040022A5427F +:1032000009D16B6823F0030443681B1B43603AB980 +:103210006A60012030BD236822463BB11C46EEE7C0 +:1032200051F8083C1360F4E70846F3E71846F1E765 +:1032300010B5C378044613F0010322D103808378CC +:103240009A0708D513F0100F016B134B0FD0D3F86A +:103250008400FFF770FFA378DB071CD50E4B2146D7 +:10326000D3F8880038B1BDE81040FFF764BF586F4D +:10327000FFF7BDFFEFE7D3F88000BDE81040FFF790 +:10328000B6BF042343700023C360034B5A6B8260B4 +:1032900002B1D0605C6310BD1801002410B5044673 +:1032A00000283AD00378F12B37D1437803F00F038D +:1032B000022B06D0032B27D0012B22D06FF0020067 +:1032C0001EE0174B1A7A022AF8D15B6A002BF5D060 +:1032D000E06AFFF7E5FE2046FFF734FD617802293A +:1032E00017D11048FFF78DFC0D4B41709861EFF33B +:1032F0000982A26300225A612046FFF799FF00204D +:1033000010BDFFF76FFCE3E7FFF76CFCFFF74AFC2B +:10331000DEE70020FFF7DCFCEEE76FF00300EFE7ED +:10332000180100243401002470B50F4C267A022EB7 +:1033300018D1636AB3B16569E86AFFF7B1FE284640 +:10334000FFF700FD04F11C00FFF75BFC4670A06175 +:10335000EFF30983AB63002328466361BDE8704047 +:10336000FFF766BF70BD00BF1801002470B50546A9 +:1033700038B30378F62B24D1836863B12846FFF76E +:1033800040FC00226FF00201FFF7CAFCA868002889 +:10339000F4D1FFF79DFCAB78002613F001032E70EB +:1033A00012D00A4B2946D3F8984024B12046FFF7A3 +:1033B000C2FE304670BDD3F88000FFF718FF2046EC +:1033C000F8E76FF00300F5E71846F3E7180100246B +:1033D00070B50446002849D00378F52B46D1037E0A +:1033E000BBB16369C0680BB122691A61226902B37B +:1033F000536190F92120C36AEBB990F920309342D0 +:1034000003D080F82020FFF7ACFCA068F8B9FFF7E4 +:103410005FFCA078002610F00100267008D0154B44 +:103420002146D3F89450DDB12846FFF784FE30469C +:1034300070BDC362DDE7D978890706D5996821B1E7 +:1034400091F920108A42B8BF0A465B69D4E720464A +:10345000FFF7D7FB00226FF00201FFF761FCD4E712 +:10346000D3F88000FFF7C3FE2846E1E76FF00300C2 +:10347000DEE700BF18010024F0B568B381B10F3159 +:1034800000F1080621F00707334636685C68F11A38 +:1034900024F00304091B8F4204D931680029F3D1B9 +:1034A0000846F0BD45683A4304683D444560204401 +:1034B00050F8041C08388D4288BF4560586818B918 +:1034C00003F108015A60EBE720F0030019181E50C1 +:1034D0004A6019600831E3E70146E1E72DE9F04F62 +:1034E00085B08146029120B90024204605B0BDE890 +:1034F000F08F002A00F086809468B4B1A007F3D161 +:10350000D368432BF0D99769D2E904658EB171076E +:10351000EAD1002DE8D077B918276B07E4D1A5F1DF +:103520004801574B99420BD9DEE7D368002BEAD00C +:10353000DAE7002F64D07B1E372BD5D8002DECD1D5 +:10354000D2E900A30193002C69D14E4BD3F8880037 +:1035500000285DD0FFF713FE04460028C4D04FF0CA +:103560000108A6B9DFF81CB1002D71D1DBF8840089 +:10357000002857D0FFF703FE002870D048F010084D +:1035800006464FF4805548F00208002CACD040F2BB +:10359000F113FD226563403D23807FB2019B3544DA +:1035A0006284E3700023384A84F80280C4F804A0DF +:1035B00084F8207084F82170C4E90E59C4E90233FC +:1035C000C4E90433C4E90633C4E90933C4E90B365A +:1035D0003260A26B114602F1340042F8043B824291 +:1035E000FBD12A4B20462A4AC1E90D394FF080739E +:1035F000CB63029B0B62234B1A66FFF769FB74E7F0 +:1036000018279BE7924616461827154601929CE715 +:1036100001224421D3F88000FFF72EFF9CE74FF0F2 +:1036200000089EE72A464FF480554FF48051DBF89E +:103630007400FFF721FFF8B9B8F1000F1ED0DBF8D6 +:1036400088207AB1214610460024FFF774FD9AE7DE +:1036500032462946DBF87400FFF70EFFEBE74FF424 +:103660008055E9E72146DBF880000392FFF7BFFDB4 +:10367000039A1446164686E7064684E7444682E7E0 +:10368000B7FFFF7F18010024A52E5AE2914A0108D6 +:103690006D2E010870B54FF6FE731446421E0546A6 +:1036A0000E469A4201D9002070BD8842FBD3CCB1AE +:1036B000A068226890B110F00303F4D1E1680F29EB +:1036C000F1D91446F62283700023446002708360AF +:1036D0000D4A0E4B8681C5819A66E5E7E368002BAB +:1036E000E1D11446094BD3F8980028B1FFF747FD04 +:1036F0000028D8D00123E5E701221021D3F880006B +:10370000FFF7BAFEF4E700BF452F010818010024B7 +:1037100038B5034660B3D0E900458068A0B110F029 +:10372000030201D0002038BDDB681B2BFAD91346F9 +:10373000F52283700023C570027044600376C0E9EF +:103740000233C0E90433EEE7DB68002BEAD10A4B11 +:10375000D3F8940030B901221C21D3F88000FFF780 +:103760008BFE01E0FFF70BFD0028DBD00123DFE734 +:1037700004460546EBE700BF1801002410B598B1D8 +:1037800040EA010313F007030ED117290AD901609B +:10379000083910220C18426084600B5081684A601E +:1037A000C3600123184610BD0023FBE7014BD86816 +:1037B000704700BF1801002438B51C4C257A012D34 +:1037C00028D07DBB1A4B29462846E3651023A4F870 +:1037D000543005232364FFF7D1FF08B1C4F88050AB +:1037E00000210846FFF7CAFFB0B9D4F880300021A5 +:1037F00063670846FFF7C2FF80B9D4F88030002124 +:10380000A3670846FFF7BAFF50B9D4F88030E367E2 +:1038100001232372002038BD0023E8E70023EEE7F0 +:103820000023F4E74FF0FF30F5E700BF1801002454 +:1038300068430224064BDA6A3AB1D0695B6C1BB16B +:103840001B69984228BF184670474FF0FF30F5E7D4 +:103850001801002410B50446D0B10268806898B100 +:1038600010F0030301D0002010BDE1680F29FAD940 +:103870001446F32283700023446002700D4AC0E9AD +:1038800002330D4B5A66EFE7E368002BEBD1144689 +:10389000094BD3F8900028B1FFF771FC0028E2D063 +:1038A0000123E6E701221021D3F88000FFF7E4FDB1 +:1038B000F4E700BF6354010818010024014608B56D +:1038C00038B11320FFF7A6F980F00100C0B24042E2 +:1038D00008BD6FF00300FBE700F07B43B3F1005F2E +:1038E0000ED000F07743B3F1405F09D000F07F4085 +:1038F000B0F1805F14BF4FF0FF304FF001607047B0 +:103900000048704700000408BFF34F8F0549064B7D +:10391000CA6802F4E0621343CB60BFF34F8F00BF6D +:10392000FDE700BF00ED00E00400FA05036818475A +:10393000094B30B51A46094CD3F89450A542FBD137 +:10394000036829B181680B604FF44073536130BD47 +:10395000C1681B04F7E700BF006402580003008041 +:103960000B4808B543681A6803681A420CBF012166 +:103970000021FFF7DDFF074843681A6803681A4211 +:10398000BDE808400CBF01210021FFF7D1BF00BFF7 +:1039900004070024740B022400487047BCB80108D7 +:1039A000D0E904017047D0E90A017047D0E90A0163 +:1039B0007047D0E908017047D0E90601704730B57B +:1039C00003995418049A43EB0205D0E90423AB424F +:1039D00008BFA2422CBF0120002030BD002070474C +:1039E000704700207047D0E900301847D0E9013215 +:1039F000016810B401EB62005410D20748BF0A59A5 +:103A00005DF8044B48BFD3581847704700205070EA +:103A10009070D07070470000B0F1204F73B504462D +:103A20000D460DD3114B186838B106680023CDE957 +:103A3000002304F1C0427669B047284602B070BD49 +:103A4000B0F1104F08D24B1E02449442F5D014F846 +:103A5000011B03F8011FF8E7054B186800230668EF +:103A6000CDE9002304F1E0427669E5E7E80A0224A3 +:103A7000700B022430B5A1F11004002500F00F02F4 +:103A8000CD7302390009D3B2092ACCBF37333033A2 +:103A90000B748C42F2D130BD322310B50A4C0B802E +:103AA0000A4BA11C1868FFF7E5FF094B04F112014E +:103AB0001868FFF7DFFF074B04F122011868FFF7D2 +:103AC000D9FF204610BD00BF8402002400E8F11F8A +:103AD00004E8F11F08E8F11F042301480B80704738 +:103AE00080020024122301480B8070476C020024DE +:103AF00030B5013800252B460135445D002CFAD144 +:103B0000DBB201335B0013800B7003234B70022385 +:103B100010F8015F05B930BD5A1CCD540233D2B242 +:103B2000DBB28C54F4E700000A460349034808B5A9 +:103B3000FFF7DEFF084608BDAC2A0224C3B801081F +:103B40000A460349034808B5FFF7D2FF084608BDF7 +:103B5000AC2A0224D1B801080A460349034808B533 +:103B6000FFF7C6FF084608BDAC2A0224DCB80108EE +:103B70000A460349034808B5FFF7BAFF084608BDDF +:103B8000AC2A0224E7B8010808B5D0F8B4325B6863 +:103B90009847002008BD08B5D0F8B4320BB9022010 +:103BA00008BD1B6898470028FAD0F8E7D0E9003034 +:103BB00018470000092908B50AD8D0F8BC320639E0 +:103BC00053F8210010B10349FFF792FF014800E0CC +:103BD000002008BDB82B02240A2303800048704748 +:103BE00030030024002070470020704700207047F9 +:103BF0000020704700207047002070477823038022 +:103C000000487047B802002438B51E4C0546237A98 +:103C1000042B35D1FFF70EFEE26AA842034694BF9B +:103C200000F1FF332B4612B1D069C01AD061626C2B +:103C300012B11069C01A1061E06803440544E360E2 +:103C4000E368AB4213D1022300202372FFF740F850 +:103C500000236372BFF34F8FA27A22B1A3724FF099 +:103C60008052094B5A60BDE83840FEF7CDB80133A9 +:103C7000E360FFF789F8236D002BE1D09847DFE779 +:103C800038BD00BF1801002400ED00E038B50F4C2E +:103C90000546B4F8541004F15600FFF726F98142A6 +:103CA00003D802210A48EFF79FF904F15800FFF703 +:103CB0000FF9E36D43F82050637A23B9054B4FF0B9 +:103CC00080525A6038BD0123A372FBE7180100241B +:103CD0002601028000ED00E0F8B59C460D4617462F +:103CE0000446002872D00278FA2A6FD100296DD0DC +:103CF00000F1280252E8001F11B9BFF32F8F04E032 +:103D0000481E42E8000606B1F4E711B1E66A012256 +:103D10009EB9BCF1000F5CD061468320FEF77AFFAC +:103D200040B1304B20465969FEF7B8FFEFF30983E5 +:103D3000C3E902576FF0010023E0B11CD1E84F0F37 +:103D4000C1E8432F03B1F9E710F0FF0F44D0B66884 +:103D5000DEE79A60B268AAB15360626A06F10C01AC +:103D6000284604F0E5FF0FB1F3783B70002504F11D +:103D70000C07314638463570FFF7DDF9A3681BB9EB +:103D80000020F8BD2363E8E73846FFF7F8F9064658 +:103D90000028F5D02046FEF734FF074629460122C9 +:103DA000FEF7BEFF3846FEF7F3FE626A07468168FB +:103DB00006F10C0004F0BCFFF923B57031463370F6 +:103DC0002046FB68F370FFF796F9D9E76FF0030020 +:103DD000D7E76FF00200D4E7D6E90132002BB8D163 +:103DE000E262B7E718010024F8B5817804468568D7 +:103DF000002938D04368C6688BB39D60A26882B33F +:103E00005360002706F10C05214628462770FFF76E +:103E100092F9B368002B4CD02846FFF7B0F904465E +:103E2000002846D03046FEF7ECFE05463A463946B5 +:103E3000FEF776FF2846FEF7ABFE726A81680546FC +:103E400004F10C0004F074FFF923A77021462370DD +:103E50003046EB68E370BDE8F840FFF74CB9F56217 +:103E6000CCE73363CDE7AB6803B35B78832B1DD11D +:103E70002846FEF7C6FE06460A46FEF751FF3046C4 +:103E8000FEF786FE06466A6A04F10C01806804F0BB +:103E90004FFFF3680BB1E2781A700023214605F159 +:103EA0000C002370BDE8F840FFF745B921462846CD +:103EB000D1E7F8BD2DE9F0410C4617469846054676 +:103EC000002848D00378FA2B45D1002943D08368D5 +:103ED000C3B15B78832B15D1FEF793FE0646012212 +:103EE0000021FEF71DFF3046FEF752FE06466A6AC5 +:103EF0002146806804F01CFFF06808B107700020BC +:103F0000BDE8F08105F10C00FFF739F9064670B104 +:103F100021466A6A0C30002404F00AFFF923314676 +:103F200028463370B470F770FFF7E5F8E7E7B8F1AB +:103F3000000F13D041469320FEF76CFE40B1094BB1 +:103F400028465969FEF7AAFEEFF30983C3E9024741 +:103F50006FF00100D4E76FF00300D1E76FF00200CB +:103F6000CEE700BF1801002438B5274C237A012B77 +:103F700003D04FF0FF35284638BD244A002124489D +:103F8000FFF7ACFAA06200F04FF805460028F0D128 +:103F9000204AE16C2048FFF7A1FAA0640028E8D08D +:103FA0001E4AFF2382F8223092F82230D26863F052 +:103FB000FF03C2F30222DB4314BFB3FA83F32023CF +:103FC000C3F12003934298BF531CFE2202FA03F36D +:103FD000124ADBB2D377F02382F823309368104A79 +:103FE000DA63BFF34F8F4FF0FF332361FDF70CFF10 +:103FF0000C48FEF706FE02234370A06183F3148889 +:10400000BFF36F8F2372B6E71801002470C3010855 +:1040100015D40008ACC30108CD4A010800ED00E04A +:104020005F0600083401002438B50D4CFA23002542 +:10403000142223700823042104F10C00A570C4E9A4 +:104040000935084BC4E90155C4E90B55FFF7AEF833 +:10405000054B064A2846DC641A67054A1A6538BDCE +:10406000A8430224DC43022418010024E93D01088E +:10407000014B010838B5114C237A022B1CD1104B8F +:104080001D682846FAF74FFA00234FF0007285F8B2 +:104090003F300C4B5A6001226272BFF34F8F596858 +:1040A000C90003D54FF000615960A2720423237246 +:1040B000BDE83840FFF7BEBB002038BD1801002422 +:1040C0002827022400ED00E008B5094B1B6833B136 +:1040D000084B1B68503343F82010002008BD064BE6 +:1040E0001B7813B1054806F04FFA4FF0FF30F5E7A3 +:1040F000F8680224C4270224E40A0224ECB8010868 +:1041000008B5094B1B682BB1084B1B68503353F89B +:10411000200008BD064B1B7813B1064806F034FAA0 +:104120004FF0FF30F5E700BFF8680224C4270224EF +:10413000E40A022400B9010838B5044641F21C0023 +:1041400004F092FDC4F8B802E0B1022241F2180373 +:1041500000F580510C4DC25200230B6041F2040166 +:10416000435041F20801455041F20C01435041F2E5 +:104170001001435041F21403C252D4F8BC321B69FF +:10418000984700B1022038BD000004082DE9F04135 +:104190000546406888461146DDE9066738B910488B +:1041A00006F0F2F96FF47A642046BDE8F08100224F +:1041B00004F04EFA044608B10A48F1E76B6832464B +:1041C0000121404604F034FA00230246BB4208BFF6 +:1041D000B042E9D069680448F7F772F8E2E700BF37 +:1041E00014B901082AB9010837B90108B0F1204F04 +:1041F0007FB5044614D3154B1D681DB32B6800F121 +:10420000C042DE69196B2846002303928847039A4F +:104210000023CDE900012846B04780B204B070BD4C +:10422000B0F1104F06D30A4B00F1E0421D682B6835 +:10423000DE69E7E7EEF7ECFF214602460548FEF7A8 +:10424000ADF9EAE74FF6FF70E8E700BFE80A02249D +:10425000700B0224283F022410B50224C0E9072273 +:10426000C0F89442D0F8C002EEF725FF002010BD40 +:1042700008B5002204231146C0F89432D0F8C002D9 +:10428000EEF719FF002008BDF0B541F21802D0F892 +:10429000B84289B00746A35C042B65D104F580566B +:1042A00041F20403316800294FD12278AAB9E358BA +:1042B000012B41D1002541F2040341F21802E550DF +:1042C00003233560A35441F21102A55441F21202B6 +:1042D000A55241F21402A3542BE0212A10D1E35835 +:1042E000052B29D1E378A2781B0403EB0223627823 +:1042F0001344227903EB026341F20802A350D9E789 +:10430000412A19D1E358052B16D1E378A0781B0474 +:1043100003EB002360780344207903EB006041F253 +:104320000803E050D7F8BC329B6998470028C1D0F9 +:104330000225284609B0F0BD002341F204023846A8 +:10434000A3503360EEF7ACFEB4E70129B2D941F2D5 +:1043500008020239A058D7F8BC2200EB01312046F0 +:10436000D569E258A847E1E7072B4FF0000313D1C6 +:1043700041F219016354184991F82F5041F211018B +:1043800015F004050AD00620A05441F2120263542D +:10439000A35241F21402A0541D46CAE70823A354B5 +:1043A00041F212026554A55241F21402A354D0F80E +:1043B000BC325B699847094B094A002109480792BA +:1043C00006950092CDE9043704ABCDE90201064819 +:1043D0000ECBFAF7EFF8ACE7B80200245544010819 +:1043E000AD3B0108400D03002006002438B5D0F88D +:1043F000B432044601795B689847D4F8C04294F817 +:10440000BC33012B21D02568012384F8BC33284616 +:10441000AB6823F00103AB60F1F79AF94FF48463C2 +:10442000226813610A4B013B02D011698906FAD454 +:10443000A36A012B06D1A369012B03D0AB6B23F434 +:104440008033AB63002384F8BC33002038BD00BF49 +:10445000410D030008B5FFF7C9FFFFF755FA00004B +:104460002DE9F7430D7800230646D0F8B84215F041 +:104470006005ADF8063000F07C81202D40F08F8182 +:1044800091F80180B8F1060F00F28981DFE818F099 +:10449000440107004300B4000B012201270141F24F +:1044A0001803CA88E05C02B3022801D0052818D19D +:1044B000498804F58053196041F2040341F2180160 +:1044C000E2500323635441F2140163542146D6F8A9 +:1044D000C002C6F89432C6E95722EEF701FE002565 +:1044E00015E03046EEF7DCFDF9E7052801D002289B +:1044F000F7D14FF483720025E25241F211030622F4 +:10450000E55441F21203E55241F21403E254284605 +:1045100003B0BDE8F083CA8841F21800002A5FD0DA +:10452000205C04F58053022801D0092852D14F881D +:1045300041F204091F6041F2180344F80920DFB971 +:10454000032A21464FF0030298BF4FF0090804F8F0 +:10455000038041F21103E75441F21203E75241F2A2 +:10456000140304F803804FF4045323804123A37001 +:104570003046FFF771FEB2E7012F41F211011BD067 +:1045800009200025023FE05441F212036554214600 +:10459000E55241F21403E05441F20803E058D6F822 +:1045A000BC3200EB07301B6A984734F809200146FB +:1045B0003046FFF751FEAAE70F220025E25441F2F0 +:1045C00012036554E55241F21403E2543046EEF70B +:1045D00067FD9CE7002541F20402A5501D60F5E748 +:1045E000022341F211012354625441F2120162523A +:1045F00041F21401635472E741F2180204F5805548 +:10460000A35C1035032B04D0062B2DD0062229469F +:10461000AEE741F2040341F21100E358EBB1042389 +:1046200041F21201A35400222254625241F21402B8 +:10463000A35441F20803E05804F580531968D6F8F2 +:10464000BC3231B92278412A03D15B6A2A469847A5 +:10465000DCE75B6A2A460121F9E70521A1542354CE +:1046600041F21202A3520DE041F21903E35C012B67 +:104670000CD10721A15441F21102A35441F21203BB +:104680000022E25241F21403E154BFE7002BBDD1F6 +:10469000564991F82F104907B8D50221A15441F28B +:1046A0001102A354DCE741F2180341F21001E25C6D +:1046B0000A2A07D102220025E25441F21403655070 +:1046C000E25224E70A22E2540E23635041F214031B +:1046D000E25204E704F580510122183148E741F223 +:1046E0001802A35C092B3FF6FAAE4FF41B75DD40B0 +:1046F000ED4315F001057FF4F2AE0223A35441F21D +:104700001002A55041F21402A35204F580531D601B +:1047100041F20403E550FAE641F21800225C092A4E +:1047200014D84FF41B73D340DB4313F001030DD1B6 +:104730000222225441F21000235041F2140022526E +:1047400004F58052136041F20402A350274B93F802 +:10475000305015F0100508D030464546FFF746FEAC +:10476000D6F8C002F2F7D6FAD1E64888F2F720FC74 +:10477000CDE64F780B2F12D8DFE807F006111111A4 +:10478000111116111111232C90F89C32032B06D114 +:1047900002220DF106013D46FFF75EFDB7E6304609 +:1047A0000225EEF77DFCB2E64B881B12212B05D1CA +:1047B000CA880F49092A28BF0922F9E600221146B2 +:1047C000F6E690F89C32032BE9D104F580510122E2 +:1047D0000C31EDE68B78032BE1D890F89C22032A6C +:1047E000DDD141F20C02A35091E600BFB8020024D3 +:1047F000E502002410B50C4CF9F766F82046F9F7ED +:1048000092FE00216163F9F74BF800210748FFF79A +:104810008FF800210648FFF78BF800210548BDE816 +:104820001040FFF785B800BFB00B0224740B0224C0 +:10483000280B02240407002443682DE9F347DDE92F +:104840000A45804691461BB91B4805F09DFE23E0B2 +:10485000002600274FF0FF0AAF42D8F8040008BF37 +:10486000A64222D0002209EB060103F0F1FE08B1B6 +:104870001248EAE70122D8F804300DF107008DF85C +:1048800007A0114605F0AEFD0128024609D0D8F870 +:1048900004100B48F6F714FD6FF47A6002B0BDE81F +:1048A000F087013647F10007D6E703F009FD00283D +:1048B000F4D00448C9E700BF55B901086CB9010834 +:1048C0007AB9010899B9010870B5044640680D46E7 +:1048D000049E114618B9104805F056FE12E0002259 +:1048E00003F0B6FE08B10D48F6E7012263683146D1 +:1048F000284605F077FD0128024606D06168084881 +:10490000F6F7DEFC6FF47A6070BD606803F0D8FCE7 +:104910000028F9D00348DFE7A7B90108C0B90108AA +:10492000D0B90108F1B9010808B5406803F0FEFBF1 +:10493000002008BDF7B50446D0E9020103F0FCFDF4 +:10494000606048B9D4E902121348F6F7B9FC6FF475 +:104950007A65284603B0F0BD0222002103F078FEFC +:10496000054618B10D4805F00FFEF0E76068002716 +:1049700003F02CFFD4E904239F4208BF904206D0E5 +:10498000A168CDE9002302460548F6F799FC01230A +:1049900084F83030DDE700BF01BA010828BA010809 +:1049A00035BA010810B5044604F066F9204610BD7A +:1049B00010B504460168D0E901230548FDF73AFF28 +:1049C000206804F059F92046BDE8104004F054B9BD +:1049D000283F022438B5D0F8B832002541F218013A +:1049E000044603F58052156041F204029D500222F4 +:1049F0005A5441F210015D5441F214015A54D0F856 +:104A0000B80218B104F038F9C4F8B852002038BD23 +:104A10001FB51648FEF752F8154B1868F0B1036839 +:104A2000DB68984701A90120EFF7A4FDB0B902A9FE +:104A30000198EFF7CBFF014668B99DF8083001985F +:104A4000022B0FD0032B06D1EFF79EFF18B90221DE +:104A50000198EEF7BDFE0198EFF778FD002005B054 +:104A60005DF804FB8268EEF7CDFEF4E7283F0224F0 +:104A7000E80A022402F038B8EFF310832BB9EFF301 +:104A80001180003818BF01207047012070470000D6 +:104A900008B5EFF305834BB1084B5869084B1B6809 +:104AA00003B19847DFF81CC000DFFEE7FFF7E4FF23 +:104AB0000028F1D1DFF810C000DFEFE71801002473 +:104AC000B4B2010829330108552B010804460B4DE7 +:104AD00007B5EFF30583002BFBD1FFF7CDFF0246AF +:104AE0000028F6D1204669464FF0FF33AC4600DF80 +:104AF0000028EED1DDE900309847EAE7D93C01080B +:104B00002DE9F74F394D6C6C002C63D023694FF0C1 +:104B10000008DFF8E0904FF0F90A013B6F6923616C +:104B20002369002B55D1E3680BB1A2689A60D5F8D0 +:104B30004CB004F118016B64EFF3058343B1BBF192 +:104B4000000F13D1AB69032129486B61EEF74CFAD2 +:104B50000191FFF791FF019902460028EFD15846D5 +:104B60001346CC4600DF0028ECD11BE09BF8003058 +:104B70000191FA2BE6D10BF10C00FEF700FB064683 +:104B80000028DFD001990C30DBF8242004F0D0F8A5 +:104B90000199304686F800A0A6F80280C6E9011BFC +:104BA000FFF774F8E378012B1DD16B6C002162696B +:104BB00013B11869824210D22261C4E902131BB1F9 +:104BC00018699C60821A1A6159B1CC606C6C002C17 +:104BD000A6D16F6103B0BDE8F08F1946121ADB68E9 +:104BE000E6E76C64F2E701236370EFE71801002445 +:104BF00027010280B53E010800B589B0BFF35F8F81 +:104C0000834B0022196810465A60C1F30721914274 +:104C100040F0A1801022DA607E4A1A611322DA6025 +:104C20007D4A1A611122DA607C4A1A617C4ADA6094 +:104C30007C4A1A6107225A60BFF34F8FBFF36F8F10 +:104C4000794B7A4998684FF000531A1802F1604284 +:104C5000126843F8042B8B42F7D1734B4FF000528C +:104C60009A605A69910315D45A6912F4003211D12D +:104C7000BFF34F8FBFF36F8FC3F85022BFF34F8F37 +:104C8000BFF36F8F5A6942F400325A61BFF34F8FFE +:104C9000BFF36F8F644B5A69D20327D45A6912F459 +:104CA000803223D1C3F88420BFF34F8FD3F8802004 +:104CB00043F6E074C2F3C900C2F34E32520102EA75 +:104CC0000406014646EA81750139C3F86052F9D2FB +:104CD000203A12F1200FF2D1BFF34F8F5A6942F4FC +:104CE00080325A61BFF34F8FBFF36F8F504CD4F8AF +:104CF000E03043F00073C4F8E030D4F8E03003F063 +:104D000000730193019BF0F74DFC4749494BCA687A +:104D100022F4E0621204120C1343CB60F1F754FA50 +:104D2000A369A369F1F754FE236F9E070AD4424A90 +:104D3000136843F480731360404B1B68236F23F0A8 +:104D400018032367EEF796FA0120F2F73DF930B920 +:104D50003B48F8F781FF9A600132186157E7344CFD +:104D60004FF48070032503A9D4F8E03043F0010329 +:104D7000C4F8E030D4F8E03003F001030293029B62 +:104D80000223CDE9030300232E48CDE9053507931F +:104D9000F1F7EAFF236923F0FE7343F488032361EC +:104DA000F0F700FCEBF74EFDEFF305832BB9FFF7AF +:104DB00063FE10B9DFF8A8C000DF234A234B13615C +:104DC0004FF4805353614423D360214B93601823E5 +:104DD0009361204B1360EFF305831BB11A491E4802 +:104DE000EEF702F9FFF748FE01460028F6D11B480E +:104DF000DFF870C000DF0028F0D0EFF305832BB997 +:104E0000FFF73AFE10B9DFF860C000DF0021E6E7E7 +:104E100090ED00E039F00206390702133FF50B135D +:104E2000120000803900021300ED00E0980200201B +:104E3000004402580003FA05004802580010005CC4 +:104E400083BA010800000258D03E0224D02E02246A +:104E50002C44022497BA01081D01018071790108D0 +:104E6000B9370108DD340108693F0108B1F1204F6D +:104E70002DE9F04306468BB00D4614461CD3794FFE +:104E80003868002800F0EA8003684FF00009904677 +:104E90000022196B00238847894505F1C04508BFEA +:104EA00084423DD338682A460368CDE900899C696D +:104EB00000233146A04761E0B1F1104F62D21046A5 +:104EC00003F0D2FE22463146074603F031FF0C20A4 +:104ED00003F0CAFE644B00228460059306AE634B68 +:104EE0000492CDE9023002ABC0E900750FCB604DF2 +:104EF00086E80F00F8F7E8FC2B4653F8184F002C13 +:104F00005DD1EB69332B40F29F802C6A343B04F176 +:104F10003402EB6134232A6223600123A37157E03A +:104F2000386800220368196B0023884703F09CFE51 +:104F300022463146804603F0FBFE386808EB040940 +:104F400003685B6B98470646386800220368196B54 +:104F5000002388473146021B484603F0F7FE3C68B1 +:104F60000022236820469E69196B002388472A4641 +:104F70000023CDE9000141462046B04780B20BB086 +:104F8000BDE8F0833B4F01F1E0450022386803683B +:104F9000196B0023884700238B4208BF844206D246 +:104FA000386800220368196B002388470446386874 +:104FB00000230268CDE9004394692A4679E7226814 +:104FC000332A3DD9E268002A37D01A60A36893607B +:104FD000F8F766FC00224FF0FF3304F12407C4E920 +:104FE000052396E80F0087E80F00234BE361FCF7E9 +:104FF00023FF224B024621462362636903441C4877 +:105000006361F9F749FA2A6BEFF3058313B9FFF7E8 +:1050100033FDE8B1D2B11378F32B17D102F10C03B1 +:10502000012153E8004F44EA010043E8000505B1BF +:10503000F7E71046FEF72AFE08E0A2681A60C7E705 +:1050400004F10803A4685AE7F8F72AFC002096E761 +:1050500010460121DFF828C000DFF7E74FF6FF70A8 +:105060008DE700BFE80A0224E7390108B1490108C9 +:1050700024130224700B02240B3A0108F154010896 +:10508000F953010873B51F4C04F1560504F15A0693 +:10509000B4F8541028460191FDF70DFF58B301995B +:1050A0003046FDF715FFE36D53F8200018B3037881 +:1050B000F13B082BECD801A252F823F0E150010893 +:1050C00091500108E75001089150010891500108E2 +:1050D000EB500108EF50010891500108F35001080E +:1050E000236E9847D4E7636EFBE7A36EF9E7E36EA0 +:1050F000F7E7236FF5E7002002B0BDE87040FDF749 +:10510000E7BD00BF180100241F4B186870B5383088 +:10511000EEF724F918B11D4B4FF080625A601C4C19 +:10512000E3680133E360FDF72FFE0020FDF7D0FDBB +:10513000236D03B19847226C2AB3A369E16B9942AE +:1051400003D0D969E36301B9DA61DA69BAB9267AB9 +:10515000022E18D1656AB5B1E36B95F9202093F959 +:1051600020309A420FD12846FDF73CFDE06BFDF759 +:10517000A7FD6E70236CE563A561EB6103E0013A66 +:10518000DA61002AE3D070BD2827022400ED00E098 +:105190001801002410B50446EFF305831BB15CB978 +:1051A0006FF0030017E0FFF767FC0028F7D12046F7 +:1051B000DFF82CC000DF0EE02378F62BF0D1E18978 +:1051C00004F10C00FDF791FEE389834204D92046E7 +:1051D000FEF75CFD002010BD6FF00200FBE700BF92 +:1051E000092F010810B52C4C2C48F5F74FFE6369C8 +:1051F00013B994F83D3023B12848F5F727FE002075 +:1052000010BDA36A53B1A26A00232549E06AB3EB3B +:10521000900F11D242F823100133F7E7E06A214BD7 +:10522000984294BF20F003004FF0FF3003F01CFDC4 +:10523000A0620028E7D1DFE744231B4A63621B4BCF +:10524000226263601A4BA3600023E360194B236161 +:10525000EFF305838BB10023636194F83C302BB1ED +:10526000A06A08B103F008FD0023A3620B48F5F71C +:10527000EDFD206CFFF78EFFC1E7FFF7FDFB002877 +:10528000E9D1A2F178010C48603ADFF830C000DFC4 +:1052900060610028B0D1E0E780130224D413022417 +:1052A000A52E5AE2FBFFFF7FF813022424130224E9 +:1052B00009200108ED3901084DB20008DD3401086C +:1052C000024608B5EFF3058313B16FF0050008BD82 +:1052D000FFF7D2FB0028F8D11046DFF808C000DF46 +:1052E000F5E700BFD1330108074B10B50446036052 +:1052F000F6F7FCFDD4F8BC00FFF7E2FF201DFDF738 +:10530000EBF8204610BD00BFF0C1010810B50446FF +:10531000FFF7EAFF204603F0AFFC204610BD000077 +:10532000024608B5EFF3058313B16FF0050008BD21 +:10533000FFF7A2FB0028F8D11046DFF808C000DF15 +:10534000F5E700BF692F0108024608B5EFF30583B2 +:105350000BB1002008BDFFF78FFB0028F9D11046E4 +:10536000DFF804C000DFF5E71137010810B402F0E0 +:105370000104920709D40C301CB15DF8044BFDF711 +:1053800062BD5DF8044BFDF74DBDC06801EA000247 +:105390002CB1914218BF00205DF8044B7047002AE1 +:1053A00008BF0020F8E70000F8B50D4617461E4676 +:1053B0000446C0B10378F32B15D1002913DBFFF7A6 +:1053C000D5FF90B996B131464320FDF723FC38B1A3 +:1053D000084B20465969FDF761FC4D6281F8237046 +:1053E0006FF0010001E06FF00300F8BD6FF0020004 +:1053F000FBE700BF18010024F8B5064670B3037838 +:10540000F32B2BD1002929DB00F10C0353E8002FEB +:1054100042EA010443E8004000B1F7E7B56825B966 +:105420002846FDF755FC2046F8BD696A304695F8D8 +:105430002320AF68FFF79AFF014668B195F8233043 +:105440009B0756BF6C6A044620EA04042846FDF711 +:10545000C9FB0022FDF764FC3D46E0E76FF0030462 +:10546000E1E770B50546846804B970BD616A2846F5 +:1054700094F82320A668FFF779FF014628B120465B +:10548000FDF7B0FB0022FDF74BFC3446ECE70000D3 +:10549000F8B504460E46174600211C2203F056FCC0 +:1054A00026823009EFF79AFE4FF4707105463046B8 +:1054B000EFF7B2FF238A0C4A012103F00F0306F035 +:1054C0000F066561204652F8233001FA06F6394688 +:1054D000A36105F11003183526606360C4E9025525 +:1054E000EFF778FF2046F8BD1CB10108C3681847E4 +:1054F000FFF7FCBF38B5D0F8C04201F00F05636874 +:105500009D4237D811F0800F4FF01C0234D002FBBF +:10551000054302FB054101223C3381F83D20012275 +:105520001D709A7094F8BC13914223D084F8BC2368 +:105530001A785B782068012B4FF020030CBF00F530 +:10554000106100F5306113FB02131968002904DBB8 +:105550001AB11A6822F080421A601A6842F40012E6 +:105560001A6025B904F57172217CF0F7CBF800239D +:1055700084F8BC33002038BD02FB014302FB01412B +:10558000002203F5FE7381F8FD21C8E770B50446DB +:1055900016460D4651BBD0F89432032B1FD1D0E9EB +:1055A000581291420ED9891A8A42C0F86011D0F877 +:1055B000C00288BF8AB2314698BF92B2EDF790FD23 +:1055C000284670BDD0F8B4321B6923B190F89C22F4 +:1055D000032A00D198472046FEF74AFEF0E7052B44 +:1055E000EED1C4F89412FFF785FFE9E7D0F8B432A2 +:1055F0009B6933B190F89C22032A02D10025984779 +:10560000DEE70225DCE7000000212DE9804808469E +:10561000BDB0FEF759FD0020F1F7D6FCEFF7C2FF51 +:10562000FFF7E8F8AC48FDF765FAAC4B186803687B +:105630009B689847AA4B1868002800F06B830368A2 +:105640009B6898471923A74A3021A748F5F728FEF9 +:10565000A64ED6F8B43213B10023C6F8B432A44C27 +:105660000622A44B0121DFF8A0C2C6F8B032002305 +:1056700086F89C12337023632362E3626362C4F88A +:105680000464C6F8C042C4E900C20222C4E9062389 +:1056900094F8BD33E26003F0FF07002B46D1964D2E +:1056A000032084F8BC73D5F8E0300B43C5F8E03034 +:1056B000D5F8E03009910B4007A90693069B4FF4FB +:1056C000C053CDE907320A23CDE90A038B48F1F72D +:1056D0004BFBBC2239460DA803F038FB4FF4802366 +:1056E0000CA80C934FF440132E93F0F799F8E8B9F7 +:1056F000834A05216520D36843F08073D360D5F8D1 +:10570000D83043F00063C5F8D830D5F8D83003F06E +:1057100000630593059BD5F8003123F00063C5F8BD +:105720000031EDF7F5FC774B2022DA600323276880 +:1057300084F8BD33744BDB6B13F4807308BF2361B3 +:10574000BB68D4F8108023F00103BB60A369012B70 +:1057500040F0EB82BB6B626B23F48033012ABB63A6 +:10576000FB6823F4840323F04003FB60FB6823F40D +:105770004013FB6003D1FB6843F48013FB603846A1 +:10578000EFF7A8FF0546B8F1010F10D1FB6D9BB2F2 +:10579000FB65FB6D43F07B7343F40033FB65BB6833 +:1057A00043F00603BB60BB6843F02003BB60002DE1 +:1057B00000F0D082022384F8BD332368A022D6F8FB +:1057C000C0025A625A6A42F420029A624F4BC6F8EB +:1057D000B4324F4BC6F8BC32F1F79CFA494B4FF448 +:1057E0000052C3F88820BFF34F8FBFF36F8F202282 +:1057F000C3F88C20BFF34F8FBFF36F8F424B5A69B2 +:105800009B691A4200F01A82394F3C68B9466369B5 +:1058100013F00103039340F011826269A3691A42F5 +:1058200000F00C826369A26913409B0703D563698A +:1058300003F0020363616369A2691340DE0629D5A0 +:10584000A36923F01003A361266AC6F3434306F05D +:105850000F05022B40F09D8347F6F0731E4214D0D3 +:105860001C23C6F30A18204603FB05954246D5F8CB +:105870000812EFF77BFFD5F808324344C5F8083229 +:10588000D5F814324344C5F814323A68936943F0AA +:10589000100393613B685A6999690A40150300F146 +:1058A0009D83134E3368B1465A6999690A4012F4D0 +:1058B000802F2FD0D3F8182803F50063374604F55E +:1058C000106BDB6913409BB2029300230193029B90 +:1058D000002B40F0C1861DE0283F0224700B0224FB +:1058E000E80A02249CBA010894270224E82702242B +:1058F000343F0224BC010024004402580000025836 +:105900000048025800E100E00000084008020024BE +:10591000440200243068426983691A4210D5D4F8E1 +:10592000043823F00103C4F8043896F8F433012B4B +:1059300004BF002386F8F433436903F00043436156 +:105940004369826913401A0510D5D4F80838DB077B +:1059500008D5D6F8043493F89C2283F89D220422BB +:1059600083F89C22436903F40063436143698269BD +:1059700013401F0111D5436903F000634361BA4B23 +:1059800093F8F423002A40F08287012283F8F4235D +:10599000426DC2F38302C3F8F8234369826913405E +:1059A000DD043ED5D4F8043804F5006223F0010389 +:1059B00053604FF484630361AC4B013B02D0016937 +:1059C0008906FAD404F51063DFF89CC24FF67F37DE +:1059D000DCF804100D460399A942C0F06387D3692F +:1059E00043F00113D361DCF83030002B00F07B87EB +:1059F000D2F8843043F00B03C2F88430536C43F088 +:105A00000B035364D4F80038994A23F4FE63317CC5 +:105A1000C4F80038EFF776FE3268536903F4805318 +:105A2000536134686369A26913409F0440F1BE80EA +:105A3000D4F8003923F4FF6323F00703C4F80039D6 +:105A4000D4F8042842F48072C4F80428D4F8082852 +:105A500012F0060304D012F0020F14BF02230F232A +:105A6000F360F0F751FCF768FBB2022B40F0598766 +:105A7000804B814A0344934240F241877F4B804AE6 +:105A80000344934240F23E87A0F574037D4AA3F598 +:105A90001053934240F23987A0F183737A4AA3F5F9 +:105AA000E7439342C0F03487784B794A03449342EA +:105AB00040F23187774B784A03449342C0F02E87F7 +:105AC000764B774A03449342C0F02B87A0F1B7731B +:105AD000744AA3F558539342C0F02687724B734A19 +:105AE0000344934234BF07230623E268003F4FF08C +:105AF000000822F4705218BF0127E260E26842EA0F +:105B00008323E3604023D6F80444D4F8C052C5F898 +:105B1000043205F5FE7195F8BC33A5F8FC81012B24 +:105B200085F8FF8107D00123286885F8BC33EFF79B +:105B300040FE85F8BC83D4F8C052402201234FF0C8 +:105B40000008C4F864214FF48070C4F8583105F19E +:105B50003C016A6495F8BC23A8879A4285F83F8087 +:105B6000A5F8428006D0286885F8BC33EFF721FEFF +:105B700085F8BC83012300214022A36184F89C3274 +:105B8000D4F8B8326262C4F894126160C4F8A41206 +:105B900023B1D4F8B43220465B689847D6F8043471 +:105BA00032681F74536903F40053536132685369B8 +:105BB000926913401D070FD5D6F8040490F89C3263 +:105BC000032B04D1D0F8B432DB6903B198473268B3 +:105BD000536903F00803536133685A6999690A40AD +:105BE000D40203D55A6902F480125A615A6999693C +:105BF0000A40900203D55A6902F400125A615A69A8 +:105C000099690A40510003D55A6902F080425A61ED +:105C10005A6999690A40520710D55C68630709D52B +:105C2000D6F80404012380F89C32D0F8B43201790C +:105C30005B68984733685A6814435C601C4B1A6869 +:105C4000511C1960282192FBF1F301FB1323002B57 +:105C50007FF4D4AD174E184D3478002C3CD1174A40 +:105C60002B7812782CE000BF343F0224410D030052 +:105C7000F8420224405327FFFF340C00401E1BFF54 +:105C80003F420F007F4F120020D6130060B6E5FEA2 +:105C90005FE3160000D3CEFE40771B00C05BB3FE6F +:105CA000C091210020753800E05459FEE09C41006D +:105CB000B82C0224B72C02243B0300243A0300240E +:105CC000BD4813442B7043681A6803681A420CBF1E +:105CD00001210021FDF72CFE2B780134A3F10A02EB +:105CE000E4B2D2B23470F02A05D9B4490A785042ED +:105CF0009B1A08702B702B78A3427FF47FADAE48BF +:105D000043681A6803681A420CBF01210021FDF79D +:105D10000FFE73E51923AA4A3021AA48F5F7C0FA05 +:105D2000A949AA4803F0FEFD92E4FB683846D4F87E +:105D3000289043F04003FB60EFF7CCFCBB6B0546BB +:105D4000B9F1000F03D143F48033BB631BE523F4A7 +:105D50008033FAE723683220DA6822F0C042DA6042 +:105D6000DA6842F08042DA60F1F722F967682B4680 +:105D70004FF01C0C4FF0010E2846D9B25A1C8F422E +:105D800000F2B28000234FF01C0C1946D8B2013348 +:105D9000874200F2B8802368D4F82CC0D4E90312FB +:105DA0000292D4E906E201920022904602F14000FC +:105DB000013203EB80000F2AC0F80480F6D103F50E +:105DC0000060BCF1000F40F0AB80426842F002027C +:105DD00042609A6B22F400129A631A6842F0400201 +:105DE0001A601A6842F080021A600022BEF1010FA8 +:105DF000C3F8002ED3F80028C3F80028D3F80028F1 +:105E000040F09680002940F09080C3F800284FF4BD +:105E100084621A616E4A013A00F08D801969890620 +:105E2000F9D410221A616A4A013A00F08680196991 +:105E3000C906F9D4002203F510614FF090484FF0E5 +:105E4000006996464FF67F3A02614261C26197420D +:105E500075D1002703F530614FF090484FF000698D +:105E6000BE464FF67F3ABA427ED1026922F4807272 +:105E7000026100229A616FF080425A61029A1AB957 +:105E80009A6942F010029A619969524A0A439A61EA +:105E9000019A1AB19A6942F008029A61BCF1010FA5 +:105EA00005D19A6942F0804242F004029A61002DC5 +:105EB0007FF480AC012284F8385084F8BD23626AF4 +:105EC000012A0DD184F8F453C4F8FC239A6942F0F6 +:105ED00000629A615A6D42F0805242F003025A65A4 +:105EE0001846EFF735FC68E40CFB014383F83DE00E +:105EF00083F83C10A3F8421083F83F001865C3E90B +:105F00001100134639E70CFB004282F8FD1182F8BC +:105F1000FC0182F8FF11C2F81012C2E9811135E7C5 +:105F20009A6B42F400129A635FE742F001026CE759 +:105F300042F0030269E7012573E701257AE7D1F80A +:105F400000B0BBF1000F0CDA42B9C1F80090C1F803 +:105F500010E00132C1F808A0203178E7C1F80080D4 +:105F6000F5E7C1F800E0F2E7D1F800B0BBF1000FAF +:105F70000CDA47B9C1F80090C1F810E00137C1F858 +:105F800008A020316FE7C1F80080F5E7C1F800E014 +:105F9000F2E7062B7FF479AC08220F492046C6F3BE +:105FA0000A16EFF7E3FB1C2303FB0595D5F8143223 +:105FB0001E44C5F8146268E4280B02243A03002446 +:105FC000C7BA010894270224F2BA0108D8010024B4 +:105FD000410D030000383C80F8420224D3F81878C1 +:105FE00003F5006304F53069DFF8A0B2DB694FF018 +:105FF00000081F403F0C002F3FF453ACF80740F15E +:106000007B81A24D5FFA88F6286800F5306C0CEBB6 +:1060100046139A68D0F8143802EA030A2B461AF09D +:10602000010F1BD0296901220CEB481C0129C9F87A +:106030000820D0F840E0DCF8082040F09E801107EE +:1060400007D5934B9E4509D9100407D54FF400435B +:1060500002E0910670D52023CCF808301AF0080F22 +:1060600000F037812B680822C9F808201A6C03F564 +:106070003063019203EB481301999A6808468449FA +:10608000884204D9110402D54FF400429A607F4A35 +:10609000D2F8045492F8C40305F52A7185F8A802D1 +:1060A00092F8C5C385F8A9C292F8C73392F8C663BF +:1060B00006EB0326B6B2A5F8AA6292F8C9E392F8F5 +:1060C000C83303EB0E239BB2A5F8AC3292F8CBE3B6 +:1060D00092F8CA2302EB0E224FF0010E92B2C5E9EC +:1060E000A5E200F01F0EA5F8AE22BEF1010F00F0F0 +:1060F000AF81BEF1020F00F0CA81BEF1000F40F087 +:10610000A88200F06000202800F0F781402800F00D +:10611000F481002840F08780BCF1090F00F28380F1 +:10612000DFE81CF06F018901810083018100F2002A +:106130004900810058011E0112F0280F8ED15449E8 +:106140008E4501D9120481D4DCF81020DBF804124A +:10615000C2F312028A1ACBF81422DBF80822114487 +:10616000D5F8102258EA0202CBF8081210D1494A99 +:106170000121EFF7C7FA454B0AE047498E4512D196 +:1061800011043FF563AF900602D52022CCF8082019 +:106190001C223146D5F8040402FB0633D3F808224A +:1061A000FFF7F4F95AE7D5F8101258EA0101EFD1D8 +:1061B00005F57172DDE70023ADF83030330A013B9D +:1061C000062B30D8DFE803F00416222F2F4E57009D +:1061D000D5F8B0321B680CA9287C9847BDF8302050 +:1061E000002A64D0B5F8AE32002B57D12846FEF70E +:1061F0003FF860E02A7CD5F8B4322AB99B6A0CA833 +:10620000984702234370E9E7DB6AF8E7F1B2052912 +:106210001FD8DFE801F0030A0E12161AD5F8B032C3 +:106220005B68002BD7D12846BDE0D5F8B0329B681B +:10623000F7E7D5F8B032DB68F3E7D5F8B0321B6981 +:10624000EFE7D5F8B0325B69EBE7D5F8B0329B6980 +:10625000E7E7D5F8B4329B6B002BE4D00CAA2846B4 +:106260009847BBE72B7C002BDDD1D5F8B4320CA8C6 +:106270005B6B9847B2E72B7C002BD4D1D5F8B432B6 +:106280000CA81B6B98470723BCE700BF343F0224D0 +:106290000A30544FF84202240A31544F9A420146C0 +:1062A000284628BF1A46ADF83020FDF7D5FFB5F8CF +:1062B000AE32002B9AD0019B1A46CC4B9A4208D999 +:1062C000CB4B1969012904D103F571721868EFF7F6 +:1062D00019FA1AF0100F02D01023C9F808301AF07A +:1062E000200F02D02023C9F808301AF4005F03D031 +:1062F0004FF40053C9F8083008F101087F0809F18C +:1063000020090BF11C0B76E61A438CD17F2E8AD81C +:1063100095F89C32032B86D0F3B2D5F8C01285F8DD +:106320009E3291F8BC03012810D0086881F83830FB +:10633000D0F8003823F4FE63C0F80038D0F80038F5 +:1063400043EA0613C0F8003881F8BC232846FDF75D +:106350008FFF1EB1022385F89C32ACE70123FAE7D8 +:10636000F1B2A44E012931703FF65DAF95F89C3231 +:10637000022B09D0032B19D02846ECF791FE317877 +:106380002846FDF701FC96E700293FF42FAF0121D5 +:106390000323696085F89C322846FDF7FCFB022840 +:1063A00028467FF424AFECF77BFE84E739B902235B +:1063B0002846696085F89C32FDF7E6FB16E76968B8 +:1063C00001293FF413AFC9B22846FDF7DDFB317850 +:1063D0006960E1E7012A7FF426AF95F89C32022B31 +:1063E0000AD8002B3FF41FAF2946002341F8083F8D +:1063F0002846FDF731FF5EE7032B7FF414AF291D1C +:10640000F6E795F89C32013B022B3FF60CAF022ACF +:106410007FF409AF0123EB60D5F8A4320BB103235D +:10642000EB60022205F10C01E2E7012E7FF443AF9D +:10643000C5F8A462DAE695F89C32013B022B3FF6E0 +:10644000F2AE012E7FF437AF0023C5F8A432CDE6BB +:1064500000F06002402A02D042063FF5E4AE95F813 +:106460009C22013A022A3FF6DEAEDBB2022B3FF657 +:10647000DAAED5F8B43228469B689847B5F8AE3204 +:10648000002B7FF418AF00287FF415AFAEE600F0C4 +:106490006000202831D040282FD000287FF4C3AEE0 +:1064A000BCF1010FD9B240D0BCF1030F2BD0BCF12D +:1064B000000F7FF4B8AE95F89C22022A00F09C8071 +:1064C000032A7FF4B0AE5BB201F00F001426002B5C +:1064D00006FB005080F29F808269002A3FF4A3AE41 +:1064E00001F07F0202FB06662E4411F07F0240F0AD +:1064F0009E803260022231467AE7D5F8B4322846CF +:106500009B689847D7E695F89C32022B5AD0032B0C +:106510007FF489AE4B063FF469AE56EA02037FF47E +:1065200065AE2846FEF7E6FF60E695F89C22022A53 +:1065300048D0032A7FF477AE002E7FF4BCAE4A0623 +:106540003FF454AED5F8C02201F00F0150688142EB +:106550003FF64CAEC1EBC10013F0800F4FF01C03AF +:106560004FEA800039D03C3003FB01230126104460 +:1065700083F83D6000230170837092F8BC33012BD7 +:106580003FF434AE012311684FF0200C82F8BC3385 +:1065900043780678012B0CBF01F5106301F53063D9 +:1065A0001CFB0633196821F400111960C178023907 +:1065B000012903D8196841F080511960002382F83D +:1065C000BC3313E64E0628463FF4EDAEFEF792FFCD +:1065D00080212846FEF78EFF6DE600F5FE7003FB76 +:1065E00001230026104483F8FD61C3E70A30544FAD +:1065F000343F0224F83E02244E067FF414AE1806FF +:106600004FF000034FF002024CBF05F1140105F5F5 +:10661000AA710B60ECE6D0F85821002A3FF403AED3 +:1066200001F07F0206FB025606F5AA765DE7002B15 +:10663000D5F8C0024FF01C03B5BF03FB020103FBFA +:10664000010391F83E3093F8FE3103B1012333602A +:1066500050E700F08001BCE7029BD90740F10C81B4 +:10666000D9F800009DF804A0D0F8101800F51062C9 +:10667000D0F834580AF00F0802EB4A1225FA08F84D +:1066800092684FEAC8185FFA88F848EA010808EAF1 +:10669000020818F0010F42D0019BD4F8342803F00F +:1066A0000F01012303FA01F122EA0102D9F81010C7 +:1066B0009942C4F83428CBF808300BD1019BD7E9B4 +:1066C00011522A44BA64D9F85020134302D1984A8F +:1066D000EFF718F8974BD3F80454BAF1000F40F0D5 +:1066E0009B80D5F89422022A40F08E80D5E90820BC +:1066F000824260D9121A996CD5F8C0022A6292B20D +:10670000ECF7D9FC52465146D5F8C002ECF7E8FC4C +:1067100095F8A022012A02D1002285F8A02218F0C3 +:10672000080F02D00822CBF8082018F0100F02D072 +:106730001022CBF8082018F0400F02D04022CBF8EE +:10674000082018F0020F02D00222CBF8082018F01F +:10675000800F00F09180D7E91421914200F28C80E3 +:10676000521A796CD9F800508A42019B05F5106CD9 +:1067700028BF0A4605F580510CEB431C033201EBA0 +:106780000A339208DCF818E01FFA8EFE9645D7E926 +:1067900014016FD3884201D900284CD1019A0121FC +:1067A000D5F8343802F00F0201FA02F223EA0203AC +:1067B000C5F8343860E0E969B1FBF0F200FB121271 +:1067C00072B988420CD8D5F89822914208D2524624 +:1067D0005146D5F8C002ECF76EFCC5F898A291E7D7 +:1067E000D5F8B422D2682AB195F89C12032901D1B8 +:1067F0002846904780212846FEF77CFE0522C5F8F2 +:106800009422002211467FE732F0040380D18021D8 +:106810002846FEF76FFE7BE7D5F8B4225269002ABE +:106820003FF47DAF95F89C1203297FF478AF514671 +:106830002846904773E7411A7A6C99F81000914204 +:1068400028BF1146CA1C920830B1B86C0844B8641D +:10685000786D0144796595E788B2D7F848E0033050 +:1068600080080EEB80007045EFD05EF8048BC3F813 +:106870000080F8E7884291D9019B1C370BF1200B6F +:1068800001330193029B5B080293FFF720B8D3F812 +:10689000043493F89C2283F89D22042283F89C22DE +:1068A000FFF77BB89F60203353F8201C21F40011C0 +:1068B00043F8201C53F8201C41F0006143F8201CD1 +:1068C000C3F8E871D3F8E01121F40011C3F8E01126 +:1068D000D3F8E01141F00061C3F8E01103990131F0 +:1068E0000391FFF775B8536943F4005343F02B034A +:1068F0005361136943F00B031361FFF783B80F2350 +:10690000FFF7F3B80E23FFF7F0B80D23FFF7EDB84C +:106910000C23FFF7EAB80B23FFF7E7B80A23FFF7CA +:10692000E4B80923FFF7E1B80823FFF7DEB800BF9A +:10693000F8420224343F0224094B0A4A1978FF29FD +:106940000BD101339342F9D1074A1978FF2904D1B9 +:1069500001339342F9D1012070470020704700BFF6 +:106960000003000800040008000500085248F8B5BC +:106970000578BFF35B8F15F0010540F09280F6F7C4 +:1069800047FF002800F08D804C4C5C224C4B294680 +:1069900004F108004B4E236001274B4B636002F06B +:1069A000D5F93B23201DC4F8A850A4F89A30474BD2 +:1069B000A4F86850C4F88C5084F89850C4E9276350 +:1069C0004FF4003366266366414BA4F8A460C4E923 +:1069D0002437404BC4E92B35F6F7C8FD04F1BC0061 +:1069E000A4F8B860F4F746FC3B4B3C48C4F8F431DB +:1069F000C4F8005284F80452FBF7DCFBF4F746FAC3 +:106A0000374A1568092D51DC364B1B68981E19460C +:106A100003F1120630F9027F662F4AD0B042F9D155 +:106A2000143308460231B0F9006001363BD16623C9 +:106A300003800135156000252848FBF7BBFBF4F700 +:106A400005FA0020002100224FF0FF33C4F8B450B3 +:106A5000C4F8602184F8542184F8FD2184F8FE21D3 +:106A60000222C4F81831C4F8E830C4F8FC30C4E994 +:106A700044014FF400300121C4F8F8010320C4F8A8 +:106A8000281184F8F010C4E93802C4E93D333522F6 +:106A90004FF080730848C4F8EC20C4F80031F6F7D2 +:106AA000AFFE0648F8BD9942BBD1C2E76FF00105C1 +:106AB000C2E74FF0FF35BFE7AC2B0224C02C022405 +:106AC000F0C101083C004200DCB701083D001200A3 +:106AD00040420F006DD50008005A6202781402246B +:106AE000A0140224D00600242DE98048774AAFB0D4 +:106AF000136804AF53B9764B7649196001F502313A +:106B00000B6843F480730B60012313600720DFF8E8 +:106B1000F4B1FDF7F5FA10F0010000F0CB8001238D +:106B20006D488BF8003003F02FFD00206B4EFDF711 +:106B3000E7FA05466A480478BFF35B8F14F0010456 +:106B400030D1F6F765FE68B3664BD3F8D02051001C +:106B500000F1B380D3F8D020002AC0F2AE80D3F881 +:106B6000D020D20000F1AB80D3F8D020500100F14A +:106B7000A680D3F8D020D10100F1A380D3F8D02093 +:106B800012020BD4D3F8D020900200F19C80D3F8ED +:106B9000D03013F4800F0CBF0B2401245048347004 +:106BA000F6F72EFE504C2378BFF35B8FD9070BD43A +:106BB0002046F6F72DFE38B14A4B2046D3F8D020B8 +:106BC0004A4B1A60F6F71CFE464A0820D2F8D0302D +:106BD00043F48033C2F8D03034782146FDF774FA9C +:106BE000012C08D14DF659710020FDF76DFA4FF4D4 +:106BF000FA70F0F7DDF901229F2107F13400FEF76A +:106C000047FCF0F7AFF90A20F0F7D2F94DF65973C7 +:106C10009D4200F02082FFF78FFE0446002800F01E +:106C20003B829BF8003013B1314803F0ADFC40F2D9 +:106C3000AA739D4240F041810120FDF761FA0546AB +:106C4000C4B20220FDF75CFA80460320FDF758FA33 +:106C50009BF8003078612BB1034642462146254817 +:106C6000F4F72EFB2448FBF745FF14F0020F234EE8 +:106C700061D014F0600A4FF02800DFF88C9045D006 +:106C8000F6F7B0FD002308F10062C8F50011C0F866 +:106C9000009080F820304362C0E904230132C0E94B +:106CA0000133C0E9061301D0002943D10021144863 +:106CB000ECF79AF98BF8000037E706246EE7042416 +:106CC0006CE703246AE7022468E700BFF86802243F +:106CD000C4270224004000584DBB0108C82E0224DE +:106CE000B02B022400440258B42B0224CC2E0224E0 +:106CF0006BBB010888BB0108283F0224F43E022434 +:106D00000101FF80E40A0224C8AD0108F6F76AFD1C +:106D10004FF000620023C0F808A080F820A0C0F85F +:106D200024A0C0E904234FF400120023C0E9009A14 +:106D3000C0E906233060620702D5FFF717FE306016 +:106D4000230705D59BF8003013B1C44803F01CFCA1 +:106D5000280614D528203568F6F744FDC04B0022DC +:106D600080F819803060C0E900350023C0E90223B3 +:106D7000C0E9042300230376C36180F8203014F0B7 +:106D8000400FB84D08D0C820F6F72CFD8146B64913 +:106D9000ECF758F9C5F80090A10607D55420F6F78E +:106DA00021FD0446B049ECF731F92C6028683168C0 +:106DB000002800F0AB8003685B6A9847064600280D +:106DC00040F0A180A949AA4801F0B6FB80460028FE +:106DD0006ED003460422012107F1240001F028FCB3 +:106DE00032463146404601F033FC786AFCF774FDC8 +:106DF000421C044600F01E819D4907F11C00FBF770 +:106E0000EBF907F11C00F7F72DFA054600283ED1F3 +:106E100001F01AF913237D61036020464FF0000949 +:106E2000ECF7F6F9B0F5804F924D28BF4FF4804053 +:106E3000064601F019FF82467B69994580F0D480AF +:106E4000434632460121504601F0F2FB04EB0901B2 +:106E500020463961ECF7DCF939690246B1FBF0F301 +:106E600000FB13133BB92846FBF798FB42F2107066 +:106E7000F6F7AEFC39690A46334651462846FBF719 +:106E8000D9FC4FF47A70B144F6F7A2FCD4E703685A +:106E900007F15002F9699B699847051E05DA6D42B2 +:106EA00001F0D2F87E610560B7E73B6E7B61B4E725 +:106EB0006FF002010020FDF707F96F4B9BF80010FF +:106EC0001A6802F07F42B2F1005F00F0B8801A68E1 +:106ED00002F07F42B2F1105F00F0B1801A6802F058 +:106EE0007F42B2F1405F00F0AA801B6803F07F434D +:106EF000B3F1605F00F0A380002900F0AC805F4830 +:106F000003F042FBA7E06FF00101D3E700296BD04B +:106F10006B46084608EE903A0B689B689847054612 +:106F2000002840F08980306803689B6A98471028E1 +:106F300002463068B8BF102201689300073323F07F +:106F40000703ADEB030DD3170DF11009CDE90023B5 +:106F50002B464C6942464946A047D9F80000FCF749 +:106F6000BBFC431C044662D0ECF752F9B0F5804FED +:106F700028BF4FF48040814601F076FE08EE100AEB +:106F80007B69AB422DD93068002218EE101A0368D5 +:106F9000019208EB0502CDF80090D3F814A000236D +:106FA000D04704EB050A2046ECF732F90246BAFB5B +:106FB000F0F300FB13A33BB951462E48FBF7EEFA62 +:106FC00042F21070F6F704FC4B46524618EE101AC7 +:106FD0002848FBF72FFC4FF47A704D44F6F7F8FB86 +:106FE000CEE718EE903A9D462248FBF767FD244B0A +:106FF00000222448FB650021234BC7E915223B658D +:1070000007F15003CDE90201FA6D204800920ECB42 +:10701000F7F7D0FA9BF8003013B11D4803F0B4FA2B +:1070200000210846FDF750F8EFF784FFFEE718EE61 +:10703000903A9D4621463DE76FF003013AE719B1CA +:107040000D491448F4F73CF900210846FDF73CF8D7 +:107050000948F7F7A5F8FEF7D7FA00BFA4BB010867 +:1070600044C20108303F0224BFAB0108B9BB01088C +:10707000BCBB0108283F022400000408F7BB01083C +:107080002D390108400D030009390108600600246C +:10709000CBBB0108DCBB0108834B07F15005834AD9 +:1070A000FB65834B3B650023C7E91500CDE902234F +:1070B000FB6D8048009395E80E00F7F77BFA2146B8 +:1070C0002046FDF701F89BF8003013B17A4803F031 +:1070D0005BFA7A4C4FF4707600213246204601F07C +:1070E00035FE774B04F1200100206362A146754B09 +:1070F0002365754BE365EDF73DFA04F14C01012082 +:10710000EDF738FA04F158010220EDF733FA626A1C +:107110007861294600203E65ECF7ECFA88BB3B6DB0 +:107120002946226D0120A3623E65ECF7E3FAF8B12F +:1071300009249BF8003023B14FF470716348F4F7D1 +:10714000BFF801239C4289F864302CD15B4C604E1F +:1071500094F86430042B87F8573000F20483012B35 +:1071600000F2078300F09783FF2384F8643092E3F2 +:107170003B6D2946E26D022063653E65ECF7BAFA85 +:1071800008B10124D5E73B6D206A2366ECF7E6FAE7 +:107190000446D9F85800ECF7E1FAA0422CBFC9F830 +:1071A0006800C9F868400020EDF75AFA824658B1E5 +:1071B0009BF800301BB100214648F4F781F83F4BA3 +:1071C000012283F86420C1E7D9F828E0BEF5707F7A +:1071D00004D8D9F854C0BCF5707F07D99BF80030AB +:1071E000002BECD03C4803F0CFF9E8E7D9F8583051 +:1071F0000446D9F824B002469B6801460646386129 +:107200007B60D9F85030FB6003468E450ED894451C +:107210000CD88E452E4C04D1944502D13B699E4238 +:1072200062D02378002BCAD02C48DCE783421BD1E4 +:107230000BEBC108FD680131D8F80480434405EB2D +:10724000C2080132D8F8048040448342DDD1386955 +:107250001E44184438617868984221D21C4B1B7830 +:10726000002BACD01E48BEE70FD20BEBC108022C9E +:10727000D8F80480434405D1154B1B78002B9ED0D1 +:107280001848B0E701310124DFE7FD68012C05EB68 +:10729000C208D8F804804044EED001320224D4E77A +:1072A000002420462346B0E72D39010890D0030082 +:1072B00061390108B00B022409BC01082007002431 +:1072C000F84A0224FC860224FC6802241CBC010843 +:1072D000E40A02245CBC010886BC01081BBD01084D +:1072E000E6BC0108B2BC01082022FF2107F15C00C6 +:1072F00001F02CFD0123002007F124013B6503F17F +:107300000123F867C7E91530EDF7D6FB07F11C013B +:107310000220EDF7D1FB23783BB397F82430012B03 +:1073200061D0A74AA749032B18BF0A4697F8271030 +:1073300097F82530019197F82610A3480091A349AA +:10734000F3F7BEFF237883B13B7F012B4DD09C4ADE +:107350009C49032B18BF0A46F97F7B7F0191B97FB7 +:10736000994800919A49F3F7ABFF97F826304FF010 +:10737000000B97F824503E7FDFF858823B61294686 +:1073800098F80000EDF7DBFB002834D0314698F880 +:107390000100EDF7D4FB70B398F80220042A02D064 +:1073A0003B699A4227D18B4B03EB8B03DD78237823 +:1073B00053B1E5B1012D1CD08749884B022D18BF70 +:1073C00019468748F3F77CFF012DFD6700F0B08078 +:1073D000022D00F0AF80E5B12378002B3FF4EFAE33 +:1073E00000218048E9E6804AA0E77F4AB4E77F4968 +:1073F000E7E77F49E5E70BF1010B08F10408BBF172 +:10740000040FBCD123781BB17A4803F0BDF80023E8 +:10741000FB6797F85530012B40F02A813B6D012B1B +:1074200040F0268197F85400012840F0218197F818 +:107430005760012E40F08A8107F11C010020EDF712 +:107440003BFB0546002840F0458107F1240130460A +:10745000EDF732FB012840F03A8123781BB1294631 +:107460006548F3F72DFF654B7B62002387F82830D2 +:10747000FB7F4FF000083D7F3B6197F8246097F851 +:10748000273097F81EA0DFF880B1FB6029469BF8F3 +:107490000000EDF754FB002800F0228131469BF8F4 +:1074A0000100EDF74CFB002800F01A819BF8022048 +:1074B000042A03D03B699A4240F012819BF80320D2 +:1074C000042A03D0FB689A4240F00A819BF804200A +:1074D000042A02D0524540F0038123787BB19BF807 +:1074E0000530022B00F0F880032B00F0F7804449B0 +:1074F0003A4A042B18BF11464248F3F7E1FE9BF8C5 +:107500000540A31E022B00F2E580022C03D0042CC0 +:107510000CBF04240324012007F15001EDF786F984 +:10752000002800F0EB8001280CBF01240524E5E0D1 +:107530004FF0020A07F124015FFA8AF0EDF71AF81A +:10754000064600287FF448AFD7F824B05846EDF738 +:1075500004FB9BF800303861022B06D0012B2BD99D +:107560000725786AECF7F2FF35E74FF0030A0025AC +:10757000A84638690123D9F8681007F11C0201FBFD +:1075800008015846ECF77AF900286FDB012207F171 +:107590001C015846EDF7CAF9002837D016B1002D66 +:1075A00008BF454608F10108C245E2D1002E40D08F +:1075B000002D08BF554631E04FF4346AD7E700BFCD +:1075C00020BB010826BB010854BD010846BD0108C7 +:1075D00093BD010848C30108A1BE01082ABB0108E8 +:1075E0009BBD0108E2BD01081BBB0108BDBD010830 +:1075F00013BD0108AEBD010813BE0108030103035A +:107600003CBB01085CBE010858C3010866B3002DED +:10761000C8D0237813B1A74802F0B6FF0323B5FB07 +:10762000F3F35A1C03EB4303ED1A3A65013587F86F +:107630005450786A012307F11C0281688039ECF705 +:107640001DF9054600287FF4C7AE012207F11C0191 +:10765000786AEDF76BF908B101233B773B7F03F0C4 +:107660000F0387F857307CE701269BE7012578E771 +:1076700007F15000904DEDF7B9FA97F8573085F8BB +:107680006430033B012B05D8EDF7F8F910B1FF2367 +:1076900085F8643097F85730023B022B0BD8EDF792 +:1076A00013F840B1FF2385F8643023783BB1834859 +:1076B00002F06AFF03E095F86430FF2BF5D007F184 +:1076C0005000ECF7CDFF012385F864303EE500283B +:1076D0003FF4CEAEFF2411E079490DE779490BE77D +:1076E00008F101080BF1060BB8F1030F7FF4CEAEE1 +:1076F000237813B1744802F047FF01246E4B83F8DE +:1077000064406D4B93F86430012B7FF41FAD002073 +:10771000ECF782FF0446002007F15001EDF786F8F0 +:1077200014B100283FF412ADD9F82C40012007F124 +:107730005001EDF77BF8654B9C427FF407AD0028C4 +:107740007FF404AD042389F86430FFE407F15001AD +:10775000EDF76CF8584B08B1052232E597F8572041 +:1077600083F86420CDE7052B7FF4FEACEDF786F9B6 +:107770007CE00020ECF750FF0546002007F15001A7 +:10778000EDF754F80DB100287DD033783BB1504867 +:1077900002F0FAFE337813B14E4802F0F5FE07F11D +:1077A0001C0100200025ECF7E5FE07F12401012073 +:1077B000ECF7E0FEA846D4F828B0C3452ED1236CE0 +:1077C00013F00C0F39D133781BB129464248F3F737 +:1077D00077FD00230095F9691A46786AECF7DCF822 +:1077E0007861002835D1D9F850300146786A5A6856 +:1077F000ECF708F8D9E91423013B52F8331002EBF7 +:10780000C30013684268C91A786AEBF7FBFFF8698E +:10781000ECF79CFE786AECF799FE1AE0D9F8243070 +:107820002946F86903EBC80308F10108D3F804A05E +:1078300052465544EBF7E6FFBFE7284907F15003EE +:107840007A6A01F14000ECF789F9002811DA032384 +:107850007B6194F86430DA1E012A1AD8EDF70EF92C +:10786000786100287FF480ACECF72EFF786190B14E +:107870007AE4A8D107F1500201211948ECF7BEFFC4 +:107880000028A0D0E3E707F15000EDF7AFF97861E9 +:10789000DFE7022BE8D094F86430FF2B25D1337852 +:1078A00003BB07F15000ECF7DBFE786108B34FF043 +:1078B000FF352EE0C2BD0108200700240ABE0108E2 +:1078C00043BB010848BB01086DBE01083DB8F396F3 +:1078D0007FBE0108AEBE0108C9BE01084C070024E6 +:1078E0008C0700241F4802F04FFE94F86430012BEF +:1078F000D7D100210846ECF799FF054648B9014663 +:10790000302207F1500001F021FA236A7D615B68A3 +:10791000BB60A06DECF71AFEE06CECF717FE206A76 +:10792000ECF714FE7B69002B08BF2B461D464BB1BC +:107930003378002B3FF48FAB29460B48F3F7C0FC9C +:10794000FFF789BBFCF756FFA468BB6823441C46BD +:1079500033781BB121460548F3F7B2FC2046F6F711 +:107960001FFC00BF0ABE010808BF010837BF01089D +:107970001FB5134B6C460B250FCB84E80F00204638 +:107980001C24FDF7E1FC0F4B18600F480F4B4560BE +:1079900003600F4BC4608360FDF7D6FC0D4B18608D +:1079A0000D480E4BC460C0E900350D4B8360FDF7F8 +:1079B000CBFC0C4B186000F0C1FFFFF795F800BF3F +:1079C00030C10108882702243C4302246ABF010811 +:1079D0004C43022480270224FC3E022477BF010886 +:1079E0000C3F0224402702248A4A2DE9F84F1368ED +:1079F00053B9894B8949196001F502310B6843F489 +:107A000080730B60012313600020854CFCF778FB2A +:107A100040F2AA73834D984263D10120FCF770FBBA +:107A2000C0B220600120FCF76BFB00F00700207162 +:107A30000120FCF765FBC0F3001060710120FCF72A +:107A40005FFBC0F3C010A0710220FCF759FBA060DF +:107A50000320FCF755FBE0600420FCF751FBC0B2AB +:107A600020620420FCF74CFB00F0070084F824009F +:107A70000420FCF745FBC0F3001084F82500042027 +:107A8000FCF73EFBC0F3C01084F826000520FCF78D +:107A900037FBA0620620FCF733FB2B78E0628BB14A +:107AA000614802F071FD2B7863B1227921685F484B +:107AB000F3F706FC2B782BB194F82420216A5C485C +:107AC000F3F7FEFB237994F8242003F002019A4295 +:107AD00040F01481F9B12B784BB3564802F054FDB5 +:107AE00025E002204FF4F013A4210422A0622160BB +:107AF000A2802162A284C4E9020301234FF4003072 +:107B0000A37184F826302B78E062002BDAD04A4843 +:107B100002F03AFDD6E7130703D52B783BB147486F +:107B2000DCE7570714D5FEF721FF20612063637956 +:107B3000002B3AD023799E070FD52B7833B13D48DF +:107B400002F022FD6379002B00F08980BDE8F88FF8 +:107B50002B78002BEBD03A48C0E713F0080604D08E +:107B60002B78002BF2D03548EAE7580718D52820A3 +:107B7000344FF5F737FE216906720676D4E9022301 +:107B8000C0E90071C0E90426C0E908362BB9012319 +:107B9000002203760023C0E9082360616063D1E717 +:107BA0002B78002BD2D02648CAE7A379002B53D0DC +:107BB000226A23689A4204D02B7813B1224802F03B +:107BC000E3FCA268A36A9A4204D02B7813B11F4841 +:107BD00002F0DAFC28201E4EF5F704FE2269002789 +:107BE000A168606141766063C0E9006200220026FE +:107BF0000276C26180F82020C0E90267C0E904670C +:107C0000F3F73AFF00289DD02B78002B9AD011482B +:107C100096E700BFF8680224C427022400400058F9 +:107C2000B0050024E40A022481BF010893BF0108C3 +:107C3000AABF0108D2BF0108BFBF0108DDBF01080C +:107C4000E5BF0108FCC20108EEBF0108F7BF01084B +:107C500044C2010801C001082369636163632368AA +:107C6000590643D5C820F5F7BDFD73490646EBF725 +:107C7000E9F9E661E06961690368E0635B6A984776 +:107C800020B12B7813B16D4802F07EFC382001261C +:107C9000F5F7A8FD0027E3680025694A4FF48058EE +:107CA000DFF8C4B14FF00009DFF8C0A18260C0F86E +:107CB00000B04561A061C0E903A3C0E90667C0E95F +:107CC0000867C0E90A893820F5F78CFDE36A5D4A48 +:107CD000C0F800B0C0E9022AC0E90435C0E906676F +:107CE000C0E90867C0E90A89A0632FE75420F5F7C7 +:107CF00079FD51490646EBF789F9BAE729B12B78A6 +:107D000073B1514802F040FC0AE01A0703D52B7802 +:107D100033B14E48F6E75F070CD5FEF727FE20612A +:107D200094F824309E070AD52B789BB1484802F07E +:107D30002BFC0FE02B78002BF2D04648E2E7180727 +:107D400003D52B7833B14148F1E759070ED5FEF73B +:107D50000DFE20636679002E42D023799A070AD55A +:107D60002B7843B3384802F00FFC24E02B78002B2B +:107D7000F0D03948DBE713F0080603D02B78D3B1F5 +:107D80003248F0E75F0726D52820344FF5F72AFD63 +:107D9000216906720676D4E90223C0E90071C0E9C0 +:107DA0000426C0E908362BB90123002203760023FC +:107DB000C0E90823606194F82560002E00F0DD80A2 +:107DC00094F8243098072FD52B78002B69D02048C1 +:107DD00002F0DAFB65E02B78002BECD01D48C2E7FF +:107DE000A379F3B128204FF00008F5F7FBFC4FF022 +:107DF00000092169A2681A4F06764276C66180F8AA +:107E000020606061C0E90071C0E90289C0E90489AD +:107E1000F3F732FE0028CED02B78002BCBD01148C0 +:107E2000A1E723696361C6E713F0080620D02B7829 +:107E3000002B36D00548CBE7BFAB010808C00108CE +:107E400010C0010823C00108D2BF0108DDBF01082E +:107E50003EC0010833C0010849C00108FCC2010846 +:107E600044C2010854C00108A8C201081FC001088B +:107E700059077DD528205C4FF5F7B4FC216B0672BD +:107E80000676D4E90A23C0E90071C0E90426C0E9F6 +:107E900008362BB90123002203760023C0E908230A +:107EA00060636379002B2FD123685A0640F18C80E0 +:107EB000C820F5F797FC4D490646EBF7C3F8E66195 +:107EC000E069616903685B6A984720B12B7813B158 +:107ED000474802F059FB3820F5F784FC454AE3682F +:107EE0000260454AA0618260444AC0E9032300233E +:107EF000012243610023C0E90623C0E908234FF4AF +:107F000080520023C0E90A2394F82530002B7FF427 +:107F10001DAE236A5B065FD5C820F5F763FC3849C0 +:107F20000646EBF78FF8E663E06B616B03685B6A0C +:107F3000984720B12B7813B1324802F025FB382046 +:107F4000F5F750FC2B4AE36A02602F4A82602B4A05 +:107F5000C0E903230023012243610023C0E9062373 +:107F6000C0E908234FF480520023C0E90A23BBE68E +:107F70002B78002B95D025482AE794F8263003B3B8 +:107F800028204FF00008F5F72DFC4FF00009216B79 +:107F9000A26A1F4F06764276C66180F82060606351 +:107FA000C0E90071C0E90289C0E90489F3F764FD02 +:107FB00000283FF476AF2B78002B3FF472AF1548C2 +:107FC00006E7236B63636CE75420F5F70BFC074966 +:107FD0000646EBF71BF872E75420F5F703FC084957 +:107FE0000646EBF713F89EE7FCC201086EC00108D5 +:107FF00072C00108A8C2010883C001081FC001089F +:1080000093C0010897C00108A8C0010849C0010831 +:1080100044C2010861C0010810B5FEF78DFC68B9C3 +:10802000074C23781BB9FFF7DFFC01232370054BB6 +:108030005A790AB1586910BD9869FCE70020FAE73F +:10804000A0060024B0050024014B1868704700BF4B +:108050003C03002470B505460C4611B90026304695 +:1080600070BD18B183690BB900F094F92C4B9C4298 +:1080700014D16C68636ED80705D4A389990502D41E +:10808000A06D00F08AFDB4F90C308BB9666E16F065 +:108090000106E3D1A06D00F082FDE0E7214B9C4298 +:1080A00001D1AC68E6E7204B9C4208BFEC68E1E7F1 +:1080B0002146284600F042F8236B064633B1216A78 +:1080C000284698470028B8BF4FF0FF36A3891A0604 +:1080D00003D521692846F6F7BFF8616B41B104F179 +:1080E0004403994202D02846F6F7B6F800236363AA +:1080F000A16C21B12846F6F7AFF80023A36400F085 +:1081000031F90023A381636EDB0702D4A06D00F078 +:1081100046FDA06D00F03FFD00F02AF99FE700BF8B +:10812000F0C3010810C40108D0C30108024B014686 +:108130001868FFF78FBF00BF3C0300248A892DE930 +:10814000F041054610070C4658D44B68002B05DC5F +:108150000B6C002B02DC0020BDE8F081E66A002EEB +:10816000F9D0002312F480522F682B6032D0606D5A +:10817000A3895A0705D56368C01A636B0BB1236CDA +:10818000C01A00230246E66A216A2846B047431C0B +:10819000A38906D129681D292CD82A4ACA40D607A6 +:1081A00028D500226260D9042269226004D5421CCD +:1081B00001D12B6803B96065616B2F600029CAD0BB +:1081C00004F14403994202D02846F6F745F800200E +:1081D0006063C1E7216A01232846B047411CC7D12B +:1081E0002B68002BC4D01D2B01D0162B01D12F6082 +:1081F000B1E7A38943F04003A381ADE70F69002FE6 +:10820000A9D093070E6808BF4B690F6018BF002301 +:10821000A6EB07088B60B8F1000F9CDD216AA66A07 +:1082200043463A462846B047002806DCA38943F077 +:108230004003A3814FF0FF308EE70744A8EB00080E +:10824000E9E700BF0100402038B50B6905460C4640 +:1082500013B90025284638BD18B183690BB900F061 +:1082600099F8144B9C421BD16C68B4F90C30002B6C +:10827000EFD0626ED00704D4990502D4A06D00F04F +:108280008CFC28462146FFF759FF636EDA07054646 +:10829000E0D4A3899B05DDD4A06D00F080FCD9E774 +:1082A000054B9C4201D1AC68DFE7044B9C4208BF00 +:1082B000EC68DAE7F0C3010810C40108D0C3010874 +:1082C000014620B9044B0549186800F018BB044B5F +:1082D0001868FFF7B9BF00BF30C401084982010820 +:1082E0003C030024002310B50446C0E90033C0E974 +:1082F0000433836081814366C28183611946082209 +:108300005C3000F023FD054B6362054BA362054B17 +:10831000E362054B2462236310BD00BF899001080E +:10832000AF900108E79001080B910108014900F0A6 +:10833000E6BA00BF4982010870B54A1E6825554358 +:108340000E4605F17401F5F78BFF044640B100219C +:10835000C0E900160C30A06005F1680200F0F6FCE0 +:10836000204670BD014800F018BC00BF4CA5022497 +:10837000014800F014BC00BF4CA50224014800F0E5 +:108380000CBC00BF4BA50224014800F008BC00BF94 +:108390004BA5022410B50446FFF7F0FFA3691BB1FB +:1083A000BDE81040FFF7F0BFC4E912332365134B5B +:1083B000134A1B68A262A34204BF0123A3612046A3 +:1083C00000F020F86060204600F01CF8A060204615 +:1083D00000F018F80022E06004216068FFF782FFD7 +:1083E000A06801220921FFF77DFFE0680222122127 +:1083F000FFF778FF0123A361D2E700BF30C4010873 +:108400002D830108F8B50746FFF7ACFF1E4B1E6829 +:10841000B36913B93046FFF7BDFF4836D6E90134DA +:10842000013B03D533680BB33668F7E7B4F90C505A +:10843000D5B9164BE36004F15800656600F0AAFB5D +:10844000FFF796FFC4E90155C4E904552560A5610D +:108450000822294604F15C0000F078FCC4E90D55BF +:10846000C4E912552046F8BD6834D9E704213846DE +:10847000FFF762FF044630600028D5D1FFF778FF90 +:108480000C233B60EEE700BF30C401080100FFFF92 +:10849000F7B50F46114601AA054601F093F80646C6 +:1084A00018B90024204603B0F0BD2846FFF7AAFF04 +:1084B00004460028F5D03946019A4FF4DB7328466C +:1084C00000F02CFD071E09DA0025FFF74BFFA06D19 +:1084D000A58100F060FBFFF74BFFE2E7636EDB076F +:1084E00005D4A389980502D4A06D00F056FB0E4B6D +:1084F00063620E4BA3620E4BE362F1050D4BE78105 +:10850000A6812462236305D5022300222146284642 +:1085100000F09CF8636EDA07C4D4A3899B05C1D42C +:10852000A06D00F03CFBBDE789900108AF90010809 +:10853000E79001080B910108024B0A4601461868B2 +:10854000FFF7A6BF3C0300242DE9F74F1F46134653 +:108550007B430C9C06468A4691469B465FD018B1E9 +:1085600083690BB9FFF716FF2E4B9C4228D1746824 +:10857000636EDB0705D4A3899D0502D4A06D00F0CE +:108580000CFB6368002B01DA00236360D846D4E952 +:10859000001545451ED34246504600F0C9FB6068B1 +:1085A0002168636EA0EB08004144DA076060216037 +:1085B0002FD4A3899B052CD4A06D00F0F0FA28E0FD +:1085C000194B9C4201D1B468D2E7184B9C4208BFBA +:1085D000F468CDE72A46504600F0AAFB23682B44F6 +:1085E00023602146A8EB05033046019300F0B2FC5E +:1085F000AA44019B88B1636ED80705D4A389990565 +:1086000002D4A06D00F0CBFA5D44A5EB0803B3FBE8 +:10861000F9F7384603B0BDE8F08F9846B7E71F4634 +:10862000F7E700BFF0C3010810C40108D0C3010878 +:1086300007B5009313460A46014603480068FFF752 +:1086400083FF03B05DF804FB3C03002400F00AB88C +:1086500013460A4601460248006800F003B800BF0E +:108660003C0300242DE9F0410C4617461D46064602 +:1086700018B183690BB9FFF78DFE514B9C4222D193 +:108680007468636ED90705D4A3899A0502D4A06DD6 +:1086900000F083FAA38903F48473B3F5847F03D1D4 +:1086A00021463046FFF7D0FDD4F82C80B8F1000FFA +:1086B00013D11D233360636ED90778D54FF0FF3592 +:1086C0002846BDE8F0813F4B9C4201D1B468D8E711 +:1086D0003D4B9C4208BFF468D3E7012D36D035F0FE +:1086E000020362D123691BB92146304600F07CFAAF +:1086F00021463046FFF7A8FD0028DCD1216A2B4631 +:108700003A463046C0470130D5D0616B41B104F1E3 +:108710004403994202D03046F5F79EFD002363637F +:1087200023692360A389002623F402636660A38182 +:108730000822314604F15C0000F008FB656E15F07C +:1087400001053BD1A3899B05BAD421E021463046DF +:10875000FFF77AFDA28912F480520CD0656DA389CF +:108760005A0719D56368ED1A636B0BB1236CED1AC8 +:108770002F440025B6E72B46216A3046C047431CEC +:108780000546ECD1636ED80798D4A389990595D492 +:10879000A06D00F004FA93E71807E9D52368226971 +:1087A000002BE5D09B1A1D44E2E7162382E7A3893C +:1087B0009A0583D4A06D00F0F2F97FE735467FE794 +:1087C000F0C3010810C40108D0C30108024B0146E0 +:1087D000186800F003B800BF3C03002470B50C46D5 +:1087E000054618B183690BB9FFF7D4FD324B9C42A3 +:1087F00014D16C68636EDA0705D4A3899B0502D493 +:10880000A06D00F0CAF9E66ACEB91D232B60636E35 +:10881000DE070DD54FF0FF35284670BD274B9C4233 +:1088200001D1AC68E6E7264B9C4208BFEC68E1E763 +:10883000A3899D05EED4A06D00F0B1F9EAE7A28905 +:1088400002F00C03082B19D12368BBB121695B1A14 +:10885000002B13DDD00511D502230022216A284602 +:10886000B047411C05460DD1636EDA07D2D4A38907 +:108870009B05CFD4A06D00F092F9CDE712F48052A1 +:108880000FD0656DA28956070DD56368ED1A636B2D +:108890000BB1236CED1A636ED907BDD49305BBD41D +:1088A000E8E70123DAE71007F5D52368002BF2D0BB +:1088B00021695B1A1D44EEE7F0C3010810C40108EA +:1088C000D0C301082DE9F0410F4600F1480400260D +:1088D000D4E90185B8F1010805D52468002CF7D149 +:1088E0003046BDE8F081AB89012B06D9B5F90E30D1 +:1088F000013302D02846B84706436835EAE72DE938 +:10890000F8430646884600F148040027D4E901955B +:10891000B9F1010905D52468002CF7D13846BDE826 +:10892000F883AB89012B07D9B5F90E30013303D099 +:1089300029463046C04707436835E9E770B50D4D15 +:108940000D4C641BA4100026A64209D10B4D0C4C03 +:1089500002F004F9641BA4100026A64205D170BDE4 +:1089600055F8043B98470136EEE755F8043B984725 +:108970000136F2E708040024080400240804002457 +:108980001004002438B5074B1D68EB6B04461BB977 +:10899000242000F069F9E863E96B2046BDE838401F +:1089A00000F002B83C0300242DE9F3410746019191 +:1089B00000F092FE01998046384600F091FE43692E +:1089C0009A07044603F26C7605D1642296FBF2F313 +:1089D00002FB13637BBB4FF4C87396FBF3F503FBF9 +:1089E0001565B5FA85F56D09684B302202FB053532 +:1089F00000F038FC00F042FC654B1B6853B3D8F81C +:108A00000430B34219D1D8F80010D7E90067D8E98B +:108A10000823D1B9964277EB030323DAD8E912236E +:108A2000964277EB0303B4BF0123002323621BDBD1 +:108A3000D8F828101AE00125D6E7304600F06AFB86 +:108A40000028E0D14FF0FF3304E0964277EB0303B8 +:108A500002DA00232362EBE7D8E91223964277EB90 +:108A60000303F6DA01232362D8F850104FF4616350 +:108A70003C2091FBF3F603FB1613616893FBF0F2C5 +:108A800000FB12302368891AA26861601B1A921BCE +:108A90003B2B2360A26035DD013161603C3B2360EC +:108AA00063683B2B34DD0132A2603C3B6360A3680A +:108AB000172B33DDE2690132E261A2690132062A35 +:108AC000C8BF0022A261E268183B0132A36023699B +:108AD000E26055F823108A420EDD0B2BA2EB010257 +:108AE000E26003F1010209BF6369226100220133E0 +:108AF00002BF22616361E26100F0BAFB204602B06E +:108B0000BDE8F081002BCBDA013961603C33C6E768 +:108B1000002BCCDA013AA2603C33C7E7002BEBDA3A +:108B2000E269013AE261A269013A48BF0622A26104 +:108B3000E2681833013AE260A360002ADCD12369BD +:108B4000013B05D42361236955F82330E360D3E763 +:108B50000B23236163695A1E626103F26B729307F0 +:108B600005D1642192FBF1F301FB132363B94FF4A8 +:108B7000C87192FBF1F301FB1323B3FA83F35B0992 +:108B800003F5B673E361DEE70123F9E734C40108B6 +:108B90003CA5022470477047704770477047704784 +:108BA00070B50E46B1F90E10002996B014461D4658 +:108BB00007DA00232B60B3891A0610D44FF48063C0 +:108BC0000EE06A4600F034FD0028F2DB019A02F460 +:108BD0007042A2F500535A425A412A60EEE7402300 +:108BE0000020236016B070BD8B8973B59D070646C3 +:108BF0000C4607D504F14703236023610123636119 +:108C000002B070BD01AB6A46FFF7CAFF0099054686 +:108C10003046F5F725FB48B9B4F90C309A05EFD486 +:108C200023F0030343F00203A381E3E70D4BB36298 +:108C3000A389206043F08003A381009B6361019BB3 +:108C400020615BB1B4F90E10304600F0F9FD28B197 +:108C5000A38923F0030343F00103A381A089054303 +:108C6000A581CDE72D830108024B01461868F5F771 +:108C7000F7BA00BF3C030024024B01461868F5F721 +:108C8000EBBA00BF3C03002400000000000000001D +:108C900001F0FF01102A2BDB10F0070F08D010F8AD +:108CA000013B013A8B422DD010F0070F42B3F6D1B1 +:108CB000F0B441EA012141EA014122F007047FF0CA +:108CC00000070023F0E80256083C85EA010586EA21 +:108CD000010685FA47F5A3FA87F586FA47F6A5FA5D +:108CE00087F68EB9EED1F0BC01F0FF0102F0070269 +:108CF00032B110F8013B013A83EA010313B1F8D114 +:108D00000020704701387047002D06BF35460338F4 +:108D1000073815F0010F07D1013015F4807F02BF2D +:108D2000013015F4C03F0130F0BC0138704700BF7E +:108D30000A44914200F1FF3300D1704710B511F899 +:108D4000014B03F8014F9142F9D110BD0244034693 +:108D5000934200D1704703F8011BF9E713B54A436A +:108D600011460192F5F77CFA044618B1019A0021E8 +:108D7000FFF7ECFF204602B010BD000037B5002918 +:108D800048D051F8043C0190002BA1F10404B8BF75 +:108D9000E418F4F767FD204A01981368154633B9C3 +:108DA0006360146003B0BDE83040F4F755BDA342E2 +:108DB0000BD921686218934204BF1A685B6863602C +:108DC00004BF521822602C60ECE71A465B680BB1B6 +:108DD000A342FAD911685518A5420BD12468214441 +:108DE0005418A3421160DDD11C685B6853602144B4 +:108DF0001160D7E702D90C230360D3E72568611916 +:108E00008B4204BF19685B68636004BF4919216025 +:108E10005460C7E703B030BD18A50224F8B5CD1CD7 +:108E200025F0030508350C2D38BF0C25002D06460E +:108E300001DBA94203D90C2333600020F8BDF4F70D +:108E400011FD21490A6814469CB9204F3B6823B99B +:108E50002146304600F008F938602946304600F0D7 +:108E600003F9431C23D10C2333603046F4F7F4FCA0 +:108E7000E3E723685B1B17D40B2B03D923601C4447 +:108E8000256004E06368A2420CBF0B60536030466B +:108E9000F4F7E2FC04F10B00231D20F00700C21AD6 +:108EA000CCD01B1AA350C9E722466468CCE7C41C87 +:108EB00024F00304A042E3D0211A304600F0D4F895 +:108EC0000130DDD1CFE700BF18A502241CA5022484 +:108ED000F8B5074614460E4621B9BDE8F8401146DC +:108EE000F5F7BEB922B9F5F7B7F925462846F8BD1A +:108EF00000F0C8FCA0420FD221463846F5F7B0F981 +:108F000005460028F2D031462246FFF711FF3146D0 +:108F10003846F5F7A1F9E9E73546E7E738B5074DF3 +:108F200004460846114600222A601A46F9F7AAF9B3 +:108F3000431C02D12B6803B1236038BD54A5022421 +:108F4000838903F00903092B01D1FFF7B9B9002088 +:108F500070470000F8B50C46054618B183690BB997 +:108F6000FFF718FA3B4B9C420AD16C68B4F90C200D +:108F700000236360A3899E060CD54FF0FF3066E0A6 +:108F8000354B9C4201D1AC68F0E7344B9C4208BFA2 +:108F9000EC68EBE7580748D4D90605D409232B60C1 +:108FA00042F04003A381E8E71A070BD52146284683 +:108FB000FFF74AF90028E0D1A389A06023F0080355 +:108FC000A381A061A38943F00403A38123691BB992 +:108FD00021462846FFF708FEA689B4F90C70B307AE +:108FE0000FD00123A3811E4B1E49186806F0090605 +:108FF000FFF768FC092EA78103D121462846FFF719 +:109000009DF82269666A6369216A22602846B04732 +:10901000002860601CDCB4F90C3017BF002243F05C +:109020002003626043F04003BCE7616B0029CDD0B0 +:1090300004F14403994202D02846F5F70DF9236C58 +:10904000636000206063002BC0D0E36B2360F8BD39 +:109050000020FCE7F0C3010810C40108D0C30108D8 +:1090600030C40108418F010838B5064D002304467D +:1090700008462B60F4F7FEFB431C02D12B6803B1BA +:10908000236038BD54A5022410B50C46B1F90E106A +:1090900000F000FC0028ABBF636DA3891B1823F40C +:1090A0008053ACBF6365A38110BD002070472DE9DC +:1090B000F0411F468B89DB0505460C46164605D553 +:1090C000B1F90E100223002200F0CAFBA389B4F903 +:1090D0000E1023F48053A38132463B462846BDE858 +:1090E000F04100F04DBA10B50C46B1F90E1000F089 +:1090F000B7FB431CA38915BF606523F4805343F479 +:109100008053A38118BFA38110BDB1F90E1000F0E8 +:1091100049BA00002DE9F74F804600F0DDFA40F231 +:10912000B173984540F398806FF4F66343449B1005 +:1091300040F26D12A8F2B27502FB05356FF06302C2 +:10914000A8F26D7393FBF2F31D444FF4C8736FF4F0 +:10915000C86298FBF3F703FB17874244B7FA87FC12 +:10916000B2FBF3F208F0030315446422C0F8048054 +:1091700098FBF2F64FEA5C1C02FB1686044600F1EF +:10918000500B00934FF0070E227A63694A2A28D1C8 +:109190000099EA1801B906B90FBB3B2BD4BF0023D5 +:1091A000012313445A1EA3692C4901FB0232A36A0E +:1091B00013441A46DB17C4E908232834A345E3D136 +:1091C000D0E90845D0E91223944275EB0303B4BFFC +:1091D000012300230360012003B0BDE8F08F0023CA +:1091E000DFE7442A01D1EA18DDE7009A72BB002EBE +:1091F0000CBFE0464FF001081949E26801924FF0B8 +:10920000300A0AFB08182A464FF00009A8F10408A2 +:10921000019909F10109494558F829A018DC02F122 +:10922000040898FBFEF9C9EBC909A8EB0909B3EBDF +:109230000909236903F1FF3348BF09F10709C3EBAB +:10924000C3034B44534505DA1A44ACE7E046D3E781 +:109250005244DDE7073BF5E70020BDE78051010000 +:1092600034C401080148FFF797BC00BF4FA5022492 +:109270000148FFF793BC00BF4FA50224014B1868BB +:1092800000F002B83C0300242DE9F04F8DB00746F2 +:1092900000F022FAAE49AF4E0546384600F014FA07 +:1092A000044670B9AC4BAD4A1860AD4B1860AD4B7D +:1092B0003068C3E90022FFF7DFFC34600DB0BDE881 +:1092C000F08F316800295FD13068FFF7D5FC204668 +:1092D00000F030FB411C3846F4F7C2FF3060002834 +:1092E00057D12378A04AA1493A2B08BF01340AAECE +:1092F0003346204600F0E0FA0028DFDD0A9BE7183D +:10930000E35C2D2B49D101374FF0FF340DF1200ADA +:109310000DF11E0B4FF00008CDE9016A9449039648 +:10932000CDF800B0334607AA3846ADF81E80ADF838 +:10933000208000F0C1FA4045C0DDBDF81E30BDF808 +:109340002020DFF838923C2101FB0322BDF81C30BD +:109350004FF4616101FB03235C43AC62814C824B9F +:1093600023600A9B81491F444A463346384600F031 +:10937000A3FA404516DC23686360774BAA6A1A603B +:10938000774BC3F8008099E700F0C2FA00289BD120 +:1093900094E7214600F0C6FAA3E72B2B08BF01375C +:1093A0000124B3E70A9BC4F80490FC18FB5C2D2B46 +:1093B00040F08B8001344FF0FF370023ADF81C30B4 +:1093C000ADF81E30ADF820300A93CDE902A6CDE904 +:1093D00000B66749334607AA204600F06DFA002818 +:1093E00078DCAF6AA7F561670A9B2F651C442F469E +:1093F0004FF0000923782C2B08BF013494F800802B +:10940000B8F14D0F78D10DF12603CDE9016309AB19 +:1094100000935849039633460DF12202204600F08E +:109420004BFA03287FF44AAFBDF822104B1E0B2BDA +:109430003FF644AFBDF82420531E042B3FF63EAF49 +:10944000BDF82630062B3FF639AFC7E9031287F87F +:1094500008807B610A9B04EB03080223ADF81C30F3 +:109460000023ADF81E30ADF820300A9398F8003094 +:109470002F2B09D1CDE902A6CDE900B63E493346EE +:1094800007AA404600F018FABDF81E30BDF82020AB +:109490003C2101FB0322BDF81C304FF4616101FB4C +:1094A0000323BB610A9C28374444B9F1000F20D044 +:1094B0006868FFF72FFE284BAA6A1A602B6D9B1A6B +:1094C000274A18BF01231360F8E62B2B08BF01348D +:1094D000012772E7BDF81E30BDF820203C2101FBBA +:1094E0000322BDF81C304FF4616101FB03235F438D +:1094F0007AE74FF001097DE7B8F14A0F06BF013462 +:10950000434644230A220BA92046059300F0AAFAF9 +:10951000DDF82C80059BADF82600A04514D14D2325 +:10952000B9F1000F07D12B7203210223C5E9031300 +:10953000C5F8149091E785F830300B220123C5E976 +:109540000D230023EB6388E780B23B72786184E7E8 +:1095500094C4010838A5022440A5022497C4010838 +:109560003CA50224A00300242BA502249BC40108CF +:10957000BEC40108AAC40108BDC4010820A5022474 +:1095800038B5074D04460846114600222A601A469F +:10959000F4F790FD431C02D12B6803B1236038BD62 +:1095A00054A5022438B5064D0023044608462B6016 +:1095B000F4F7D8FD431C02D12B6803B1236038BDFA +:1095C00054A502240B78722B30B522D0772B24D0EF +:1095D000612B27D016230360002030BD622D12D0EE +:1095E000782D13D02B2D07D120F01C0023F003037E +:1095F00040F0100043F0020311F8015F002DEDD19F +:1096000023431360E9E743F48033F5E743F4006351 +:10961000F2E7002423460420EEE74FF4C064012360 +:109620000820E9E74FF4027401234FF48470E3E764 +:1096300038B5074D00230446084611462B60F4F761 +:109640007BFC431C02D12B6803B1236038BD00BFF3 +:1096500054A502242DE9F84F074689461646F4F72B +:10966000F5F8184B1C689A4634B14B46984613F8E7 +:10967000011B39B13D29F9D13846F4F7E1F8002052 +:10968000BDE8F88FA8EB0908A34654F8040B00289E +:10969000F2D04246494600F055F90028F4D154F87A +:1096A000043C03EB080513F808303D2BECD1DAF845 +:1096B0000030ABEB03039B1038463360F4F7C0F87F +:1096C000681CDDE70004002407B501AAFFF7C2FF0C +:1096D00003B05DF804FB000000487047A8030024B5 +:1096E0002DE9F041D0E900670C46514A002330468D +:1096F000394601F053F8394605464D4A30460023B5 +:1097000001F04CF8002ABCBF02F5A83202F5C07285 +:109710004FF4616105F52F20B2FBF1F301FB132239 +:109720004FF03C01ACBF00F66C2000F66B20A3604C +:10973000B2FBF1F301FB132263602260C31C07221A +:1097400093FBF2F2C2EBC2029B1A48BF0733002818 +:10975000A361B8BFA0F50E333649AEBF90FBF1F15F +:10976000A3F52C7393FBF1F1334B03FB010048F697 +:10977000AC62B0FBF2F2024440F2B45CB0FBFCF32A +:10978000D21A40F26D172D4BB0FBF3F36426D31AB7 +:10979000B3FBF7F5B3FBFCF3B5FBF6F2D31A0344C6 +:1097A00007FB1533992003EB830C0CF1020C03F13A +:1097B000010EBCFBF0F7784302304FF00508B0FB18 +:1097C000F8F0AEEB000040F2F95EF44594BF4FF0C4 +:1097D000020C6FF0090C67444FF4C87C0CFB01517C +:1097E000012F98BF0131B3F5997F0CD3A3F599737D +:1097F000E361A1F26C710023E060C4E904712362AB +:109800002046BDE8F08115F0030F02D106FB12528D +:109810005AB94FF4C876B5FBF6F206FB1252B2FA0B +:1098200082F252093B331344E2E70122FAE700BF18 +:1098300080510100B13A02004FC5FDFFB03A02006D +:1098400038B5064D0023044608462B60F4F7C3FBE9 +:10985000431C02D12B6803B1236038BD54A50224F8 +:1098600038B5074D04460846114600222A601A46BC +:10987000F4F780FB431C02D12B6803B1236038BD91 +:1098800054A5022451F8043C181F002BBCBF0B58F0 +:10989000C018704738B5074D0446084611460022E7 +:1098A0002A601A46F4F7B4FB431C02D12B6803B1BB +:1098B000236038BD54A502240EB410B59FB021AC6E +:1098C0004FF4017154F8042B0192ADF81C10049070 +:1098D000089000F02FF80C4B059009900D930B4861 +:1098E000019A006803940023119316934FF6FF73B7 +:1098F000ADF81E3004A9234600F018F91FB0BDE8EA +:10990000104003B0704700BFAB9001083C03002437 +:1099100010F8012B11F8013B012A28BF9A42F7D019 +:10992000D01A7047034611F8012B03F8012B002AC7 +:10993000F9D17047034613F8012B002AFBD1181AFE +:109940000138704710B56AB10139841810F8013B2D +:1099500011F8012F934203D1A04201D0002BF5D181 +:10996000981A10BD1046FCE72DE9F0433B4E8646A1 +:109970008C4660461CF8014BA55D15F00805F8D132 +:109980002D2C34D19CF800404FF0010800F1020C5E +:10999000002B5ED0102B0CD1302C0AD19CF800008B +:1099A00000F0DF0058284FD19CF8014010230CF143 +:1099B000020C4FF0FF370025B7FBF3F703FB07F965 +:1099C0006FEA09092846A4F13006092E18D8344652 +:1099D000A34224DD002D1FDB87421DD301D1A14509 +:1099E0001ADB00FB034001251CF8014BEBE72B2C95 +:1099F00008BF9CF80040A84608BF00F1020CC7E76A +:109A0000A4F14106192E01D8373CE1E7A4F1610623 +:109A1000192E04D8573CDBE74FF0FF35E4E7002D63 +:109A200007DA2223CEF800304FF0FF3042B9BDE80C +:109A3000F083B8F1000F00D04042002AF7D00DB1FA +:109A40000CF1FF311160F2E73024002BB1D1082373 +:109A5000AFE7302CA2D00A23ABE700BFD1C4010886 +:109A6000FFF782BF13460A46014602480068FFF727 +:109A70007BBF00BF3C03002438B54B1C144603D108 +:109A80004FF0FF35284638BD938923F0200393819A +:109A9000636B5268CDB28BB1A36B934208DD236830 +:109AA0005A1E226003F8015C636801336360E9E7D2 +:109AB000214600F0B5FB0028F1D0E1E721692368D9 +:109AC00051B1994208D213F8011CA94204D1013BBB +:109AD000013223606260D5E7C4E90F3204F1440328 +:109AE00063630323A363234603F8465F23600123D4 +:109AF000DCE710B50C46496B69B104F144039942A7 +:109B000001D0F4F7A9FB236C63600020606313B1FC +:109B1000E36B236010BD2369236000236360A38986 +:109B200043F02003A3814FF0FF30F3E72DE9F04F1E +:109B30000C46ADF5237D0021CDE94411B249A09139 +:109B40000DF10408B149B24FDFF8C892CDF8188181 +:109B50000646A191009392F800A0BAF1000F00F020 +:109B600051811AF8073013F0080302F1010519D0EA +:109B70006368002B0FDD23681A78BA5C120701D4E2 +:109B80002A46E8E7459A0132459262680133013A74 +:109B900062602360ECE7A19B21463046984700288D +:109BA000E9D0EDE7BAF1250F40F08380419343936C +:109BB00053782A2B02BF1023951C41930A22AB46EF +:109BC0001BF8011BA1F13003092B1DD99148032279 +:109BD000FFF75EF840B10123A0EB090003FA00F0A3 +:109BE000419B184341905D4615F8013B782B06D800 +:109BF000572B10D8252B5CD056D8002B74D00323BC +:109C000047930A23429381E0439B02FB0313303BBB +:109C100043935D46D3E7A3F15802202AEFD801A170 +:109C200051F822F0F79C0108FF9B0108FF9B0108F7 +:109C3000559D0108FF9B0108FF9B0108FF9B010840 +:109C4000FF9B0108FF9B0108FF9B0108FF9B010888 +:109C50006B9D0108419D0108AF9C0108AF9C010864 +:109C6000AF9C0108FF9B0108459D0108FF9B01086F +:109C7000FF9B0108FF9B0108FF9B01087B9D0108DA +:109C80004D9D0108EF9C0108FF9B0108FF9B010807 +:109C9000779D0108FF9B0108419D0108FF9B01087A +:109CA000FF9B0108F79C0108453B022BA7D8052321 +:109CB0002BE06368002B0DDD23681A78524540F0D5 +:109CC000A180013362682360459B013A01336260E1 +:109CD000459355E7A19B2146304698470028EBD095 +:109CE0004498002840F084804FF0FF3086E0419A8D +:109CF00042F020024192419A42F4007241921022B5 +:109D00006F2B429234BF0323042347936368002BD5 +:109D100041DD419B590604D423681A78BA5C1207C6 +:109D200040D4479B022B4FDC6B46224641A930466C +:109D300000F074F8012865D002287FF421AFCFE746 +:109D40000A22DDE7002342930323DEE70823429340 +:109D50000423DAE72946404600F0ACF9419B43F082 +:109D60004003419305460123CFE7419B43F0400365 +:109D700041930023C9E70223C7E74198C3063FF593 +:109D8000FFAE009B459A191D00911B68C0074CBF90 +:109D90001A801A60F4E6A19B2146304698470028B5 +:109DA000B7D09DE7459A013245926268013A002A90 +:109DB000626002DD01332360AEE7A19B214630469D +:109DC00098470028A8D08BE7042B06DC6B46224678 +:109DD00041A9304600F07AF8ACE70F4B002B3FF476 +:109DE000CFAE6B46224641A93046AFF30080A1E7D3 +:109DF000A38913F0400F18BF4FF0FF300DF5237DFE +:109E0000BDE8F08F4498F9E7799A0108F39A0108C0 +:109E1000D1C40108D1C50108000000002DE9F843B4 +:109E200015468A6880460C4632B98A69002A0CBFFA +:109E300001224FF0FF328A602268DFF88C90D10651 +:109E40005FBF1A68111D196016680027A06988B1E4 +:109E5000012807D12B681A7863699B5C53B927BB2B +:109E6000BDE8F883022820D12B681B7813F809304D +:109E70001B071AD42368DA065EBF2B681B7806F826 +:109E8000013B2A686B6801322A60A268013B013AF3 +:109E90006B600137A26042B1002BD7DCD4F880316F +:109EA0002946404698470028D0D0236813F0100375 +:109EB00005D1E2680132E260A26902B13370236920 +:109EC0001F4427610020CBE7D1C401082DE9F04FE2 +:109ED0009846744B0C468246164693E8070087B0B6 +:109EE00003AB83E80700704BA169704A032918BFD0 +:109EF0001A46A36801925A1EB2F5AE7F88BF6FF46E +:109F0000AE75274682BF03EB050940F25D13A360DF +:109F100057F81C3B43F4506398BF4FF0000923608F +:109F20003D464FF0000B316803AB097853F82B0026 +:109F30000222FEF7ADFE28B3BBF1010F59D16268D2 +:109F40002AB92268082342F4007263602260226802 +:109F500022F4A0622260A268511EA16092B1326810 +:109F6000511C3160127805F8012B7268013A002A01 +:109F7000726007DCD4F880213146504690470028B3 +:109F800040F085800BF1010BBBF1030FCBD163686F +:109F90000BB90A236360636845496069C91A00F018 +:109FA00089F84FF0000BA3682268002B3DD0316880 +:109FB000606991F800C010F80C00002835D0BCF1A1 +:109FC000300F24D1100522D50BF1010BB9F1000F90 +:109FD00003D0013309F1FF39A3607368013B002B03 +:109FE00073601BDD336801333360A368013BA360FA +:109FF000D9E7BBF1020FAED1226802F4C061B1F51E +:10A00000007FBFD11023636042F48072A2E722F484 +:10A01000106222600B7805F8013BDEE7D4F880314E +:10A020003146504698470028DFD02368D9050DD522 +:10A03000BD4209D915F8011CD4F87C31324650468E +:10A04000984705F1FF394D46BD4228D0226812F0ED +:10A05000100213D12A706368019E39465046B047FA +:10A06000D8F8003021681A1DC8F8002011F0200F20 +:10A070001B680FD01860E3680133E360ED1BAB444D +:10A0800025695D442561002007B0BDE8F08F4FF0E1 +:10A09000000BCAE7CA074CBF18801860EBE7012025 +:10A0A000F2E700BFF0C50108619A01081DA201088E +:10A0B000EEC5010870B50B7804465E2B0BBF4B78DC +:10A0C000481C881C002208BF0122611E04F1FF0504 +:10A0D00001F8012FA942FBD10BB9013870BD82F004 +:10A0E0000101E154421C12F8015C2D2D02F1FF36F2 +:10A0F000104606D05D2DF1D00DB93046EEE72B4667 +:10A10000EFE716785D2EFAD0B342F8DC184601303E +:10A1100086422154FBDCD84330445D1CB342A8BFC7 +:10A1200000202B180232DEE72DE9F0473A4E864632 +:10A130008C4660461CF8014BA55D15F00805F8D16A +:10A140002D2C33D19CF800404FF0010800F1020C97 +:10A15000002B5CD0102B0CD1302C0AD19CF80000C5 +:10A1600000F0DF0058284DD19CF8014010230CF17D +:10A17000020C08F10047013F0026B7FBF3F9304617 +:10A1800003FB197AA4F13005092D18D82C46A342F7 +:10A1900024DD751C07D081451DD301D1A2451ADBF2 +:10A1A00000FB034001261CF8014BEBE72B2C08BFFA +:10A1B0009CF80040A84608BF00F1020CC8E7A4F1D3 +:10A1C0004105192D01D8373CE1E7A4F16105192DAE +:10A1D00004D8573CDBE74FF0FF36E4E7731C06D1A9 +:10A1E0002223CEF80030384642B9BDE8F087B8F1F6 +:10A1F000000F00D04042002AF7D00EB10CF1FF3121 +:10A200001160F2E73024002BB3D10823B1E7302CE2 +:10A21000A4D00A23ADE700BFD1C40108FFF784BF73 +:10A220002DE9F0410C46496B04F1440399421DD1DC +:10A230004FF48061F4F714F818B94FF0FF30BDE81F +:10A24000F0814FF48063A36394F84630606380F834 +:10A25000FF3394F8453080F8FE3394F8443080F8AA +:10A26000FD3300F2FD3020600020E8E7A66B7700A8 +:10A270003A46F3F7F3FF05460028DED000EB060868 +:10A28000014632464046FEF753FDC4E90D57C4F877 +:10A290000080E9E7024B0A4601461868F3F7DABF87 +:10A2A0003C03002470B50E461446054618B1836978 +:10A2B0000BB9FEF76FF8144B9C421AD16C68636EB1 +:10A2C000D80705D4A389990502D4A06DFEF765FCD3 +:10A2D00022462846314600F0A1F8636EDA070546AB +:10A2E00005D4A3899B0502D4A06DFEF758FC28462F +:10A2F00070BD064B9C4201D1AC68E0E7044B9C4228 +:10A3000008BFEC68DBE700BFF0C3010810C4010818 +:10A31000D0C30108024B0A4601461868FFF7C2BFC6 +:10A320003C0300242DE9F843089C8946174602FBAC +:10A3300003F8054618B183690BB9FEF72BF8264BD5 +:10A340009C4223D16C68636EDE0705D4A38998050F +:10A3500002D4A06DFEF721FCA389190720D523693B +:10A36000F3B10026464529D0A06819F80610013837 +:10A370000028A06004DAA369984219DB0A2917D0E3 +:10A3800023685A1C226019700136EBE7134B9C427C +:10A3900001D1AC68D7E7124B9C4208BFEC68D2E70A +:10A3A0002146284600F08CF90028DAD0002605E086 +:10A3B0002246284600F032F90130E5D1636EDA0713 +:10A3C00005D4A3899B0502D4A06DFEF7E8FBB6FB7C +:10A3D000F7F0BDE8F88300BFF0C3010810C401081E +:10A3E000D0C3010807B5009313460A460146034847 +:10A3F0000068FFF797FF03B05DF804FB3C030024FF +:10A4000030B501390024A24201D1002005E0035DEE +:10A4100001340D5DAB42F6D0581B30BD70B50D4612 +:10A420001446064618B183690BB9FDF7B3FF1C4B00 +:10A430009C4224D17468636ED80705D4A38999051A +:10A4400002D4A06DFEF7A9FBA368013B002BA3601B +:10A4500005DAA26993421CDBEBB20A2B19D0236800 +:10A460005A1C22601D70EDB2636EDA0705D4A38911 +:10A470009B0502D4A06DFEF792FB284670BD094BE8 +:10A480009C4201D1B468D6E7074B9C4208BFF468F0 +:10A49000D1E729462246304600F0C0F80546E3E7FA +:10A4A000F0C3010810C40108D0C3010870B50E46FE +:10A4B000054618B183690BB9FDF76CFFAB69AC6851 +:10A4C00013B92846FDF766FF2C4B9C4220D16C68DF +:10A4D000636EDB0705D4A389980502D4A06DFEF74F +:10A4E0005CFBA38919071DD52369DBB1013EA36875 +:10A4F00016F8011F013BA36039BB002B38DA224656 +:10A500000A21284600F08AF8013011D00A2511E00E +:10A510001B4B9C4201D1AC68DAE71A4B9C4208BF46 +:10A52000EC68D5E72146284600F0CAF80028DDD0BF +:10A530004FF0FF35636EDA0705D4A3899B0502D47B +:10A54000A06DFEF72CFB284670BD002B04DAA26933 +:10A550009A4206DC0A2904D023685A1C226019702A +:10A56000C5E72246284600F059F80130BFD1DFE7A1 +:10A5700023680A255A1C22601D70DBE7F0C301081E +:10A5800010C40108D0C30108024B01461868FFF748 +:10A590008DBF00BF3C030024C9B2034610F8012B55 +:10A5A0001AB18A42F9D118467047002918BF002312 +:10A5B000F9E770B503461E4613F8014B44B14A1E35 +:10A5C00001E0A54204D012F8015F002DF9D1F2E7B5 +:10A5D000301A70BD10B50139034632B111F8014F80 +:10A5E00003F8014B013A002CF7D11A4400219342A1 +:10A5F00000D110BD03F8011BF9E770B503461E46F4 +:10A6000013F8014B3CB14A1E01E0A542F7D012F805 +:10A61000015F002DF9D1301A70BD0000F8B50E466B +:10A620001446054618B183690BB9FDF7B3FE214BFB +:10A630009C422BD16C68A369A360A3891A072FD50C +:10A6400023696BB323692068C01A6369F6B2834239 +:10A65000374604DC21462846FDF7F6FD30BBA368EB +:10A66000013BA36023685A1C22601E70636901309D +:10A67000834204D0A389DB0706D50A2E04D12146E4 +:10A680002846FDF7E1FD88B93846F8BD0A4B9C42E3 +:10A6900001D1AC68CFE7094B9C4208BFEC68CAE720 +:10A6A0002146284600F00CF80028CBD04FF0FF37A9 +:10A6B000EAE700BFF0C3010810C40108D0C30108D5 +:10A6C000324B70B51D6806460C4625B1AB6913B90F +:10A6D0002846FDF75FFE2E4B9C420FD16C68A38984 +:10A6E000B4F90C2019072CD4DD0611D409233360EA +:10A6F00042F04003A3814FF0FF303EE0254B9C42E7 +:10A7000001D1AC68EBE7244B9C4208BFEC68E6E75C +:10A71000580712D5616B41B104F14403994202D04C +:10A720003046F3F799FD00236363A38923F02403E4 +:10A73000A3810023636023692360A38943F0080396 +:10A74000A38123694BB9A38903F42073B3F5007F78 +:10A7500003D021463046FEF747FAA089B4F90C2011 +:10A7600010F001030AD00023A36063695B42A36178 +:10A77000236943B910F08000BAD170BD810758BF7A +:10A780006369A360F4E70020F7E700BF3C030024FF +:10A79000F0C3010810C40108D0C301087BB972B925 +:10A7A0000029BEBF00204FF0004106E008BF00288E +:10A7B0001CBF6FF000414FF0FF3000F0A1B9ADF1C8 +:10A7C000080C6DE904CE002909DB002B1ADB00F030 +:10A7D00035F8DDF804E0DDE9022304B070474042BB +:10A7E00061EB4101002B1BDB00F028F8DDF804E0F1 +:10A7F000DDE9022304B0404261EB4101524263EBC8 +:10A8000043037047524263EB430300F017F8DDF84F +:10A8100004E0DDE9022304B0404261EB41017047EE +:10A82000524263EB430300F009F8DDF804E0DDE990 +:10A83000022304B0524263EB430370472DE9F04713 +:10A84000089D04468C46002B40F083808A421746C0 +:10A8500047D9B2FA82F242B1C2F1200024FA00F0E4 +:10A860009140974040EA010C94404FEA1748230C6E +:10A87000BCFBF8F61FFA87FE08FB16C143EA01434A +:10A8800006FB0EF1994209D9FB1806F1FF3080F062 +:10A890001981994240F21681023E3B445B1AA4B2F0 +:10A8A000B3FBF8F008FB103344EA034400FB0EFE50 +:10A8B000A64509D93C1900F1FF3380F00581A64572 +:10A8C00040F2028102383C4440EA0640A4EB0E0408 +:10A8D00000261DB1D4400023C5E900433146BDE840 +:10A8E000F08702B9FFDEB2FA82F2002A50D1CB1B08 +:10A8F0004FEA174E1FFA87F80126B3FBFEFC210C26 +:10A900000EFB1C3341EA034108FB0CF38B4207D9D1 +:10A9100079180CF1FF3002D28B4200F2E9808446B4 +:10A92000C91AA3B2B1FBFEF00EFB101143EA0144B9 +:10A9300008FB00F8A04507D93C1900F1FF3302D20B +:10A94000A04500F2D9801846A4EB080440EA0C4068 +:10A95000BFE78B4209D9002D00F0B1800026C5E980 +:10A96000000130463146BDE8F087B3FA83F6002E89 +:10A970004AD18B4202D3824200F2B880841A61EB42 +:10A98000030101208C46002DA8D0C5E9004CA5E7A5 +:10A99000C2F1200320FA03F6974001FA02F04FEAD1 +:10A9A000174ED9403043030CB1FBFEF61FFA87F86F +:10A9B0000EFB161143EA014306FB08F1994204FA23 +:10A9C00002F409D9FB1806F1FF3C80F08D80994212 +:10A9D00040F28A80023E3B445B1A81B2B3FBFEF038 +:10A9E0000EFB103341EA034100FB08F38B4207D909 +:10A9F000791800F1FF3C73D28B4271D90238394487 +:10AA0000CB1A40EA064678E7C6F1200C03FA06F4B2 +:10AA100022FA0CF31C4320FA0CF701FA06F34FEA72 +:10AA2000144E21FA0CF11F433B0CB1FBFEF91FFA47 +:10AA300084F80EFB191143EA014109FB08FA8A4523 +:10AA400002FA06F200FA06F308D9611809F1FF309C +:10AA500048D28A4546D9A9F102092144A1EB0A014D +:10AA6000BFB2B1FBFEF00EFB101147EA014700FB3D +:10AA700008F8B84507D9E71900F1FF312ED2B845DB +:10AA80002CD90238274440EA0940A7EB0807A0FB6D +:10AA900002894F45C64649461AD317D05DB1B3EB7C +:10AAA0000E0267EB010707FA0CFCF2404CEA0202C7 +:10AAB000F740C5E9002700263146BDE8F0872E465D +:10AAC00028460BE70646E9E61846FDE64345E5D28B +:10AAD000B8EB020E69EB04010138DFE70846D2E764 +:10AAE00060468DE78146B9E7664675E730464AE736 +:10AAF000ACF1020C394413E702383C4424E700BFB0 +:10AB0000704700BF53B94AB9002908BF00281CBFCD +:10AB10004FF0FF314FF0FF30FFF7F2BFADF1080CFF +:10AB20006DE904CEFFF78AFEDDF804E0DDE90223DB +:10AB300004B07047430803F05533C01A830803F08C +:10AB4000333300F03330184400EB101000F00F30B6 +:10AB500000EB002000EB0040000E7047F8B500BF8E +:10AB6000F8BC08BC9E467047F8B500BFF8BC08BCEE +:10AB70009E467047436F6D6D616E642070617261B7 +:10AB80006D206572726F723A2077726F6E67206106 +:10AB90006464726573732073697A650A00496E761E +:10ABA000616C696420616C742062797465732073D0 +:10ABB000697A65002E2E002F006C6974746C6566CE +:10ABC00073006170706C69636174696F6E5F756E3C +:10ABD0006E616D65645F6D75746578006170706C31 +:10ABE00069636174696F6E5F756E6E616D65645FD8 +:10ABF0007468726561640065717565756500452DE1 +:10AC0000496E76616C696420726561643A206661A0 +:10AC10005F6964202564206F6666736574203078F0 +:10AC20002578206C656E20307825780A00452D52F5 +:10AC3000656164206661696C65643A2066615F697C +:10AC400064202564206F66667365742030782578EB +:10AC5000206C656E20307825780A004D4355426F90 +:10AC60006F745F45434945535F763100452D666CEF +:10AC70006173685F617265615F6F70656E2C2075CE +:10AC80006E6B6E6F776E2069642025640A007072A7 +:10AC9000696D617279007365636F6E6461727900CA +:10ACA000452D496D61676520696E207468652025B2 +:10ACB0007320736C6F74206973206E6F74207661DB +:10ACC0006C6964210A00492D5377617020736563B4 +:10ACD000746F72202564206F662025640A00572D4A +:10ACE00025642073746174757320777269746520AC +:10ACF0006661696C7320706572666F726D696E67EC +:10AD00002074686520737761700A0050696E6D6108 +:10AD100070206572726F723A2077726F6E67207062 +:10AD20006F7274206E756D6265722E0053484132E9 +:10AD300035360053484132323400018080808080B3 +:10AD400080800480808080808080088080808080F7 +:10AD500080801080808080808080208080808080C3 +:10AD600080804000040810204002040810204000A9 +:10AD700000000001020304010203040607080900A1 +:10AD800000000000000000010100000000000002BF +:10AD90002200000000000004230000000000000862 +:10ADA000FFFF000000000000010002000400060098 +:10ADB00008000A000C001000200040008000000184 +:10ADC000000000000000000025AE000839AE0008B9 +:10ADD000A982000881820008F37F0008E5B100081D +:10ADE000458200080F820008E3390108097E000847 +:10ADF000237F0008F9810008E1810008137F000823 +:10AE00000D7F0008937F0008337F0008777E0008DD +:10AE1000057F0008000000000000000095D4000835 +:10AE20000000000000000000A5A40008D9A400084C +:10AE3000B97200087D72000897B9000807B80008C9 +:10AE40001FB60008CFB60008C1A20008B3760008FC +:10AE500039A40008AB0C00080BB40008A5B1000829 +:10AE6000879D0008C1AF00089BAF0008A10C000837 +:10AE70008DA8000899760008B10C00087F760008BC +:10AE800051AD000855B30008F77F00082FAA00084D +:10AE9000E9A9000865760008C9A90008F972000848 +:10AEA000BDAE000879AE0008F5A40008FCFFFFFF66 +:10AEB00000000000D1A40008EBA40008000000007E +:10AEC00000000000000000000000000095D4000811 +:10AED000A50C0008AB0C0008A50C0008A50C000888 +:10AEE000C30C0008A50C0008FCFFFFFF00000000D9 +:10AEF0000000000000000000000000000000000052 +:10AF0000000000000000000095D40008A50C000817 +:10AF1000AB0C0008A50C0008A50C0008C30C000829 +:10AF2000A50C00080000000000000000112D000822 +:10AF3000552D0008B97200087D7200081527000819 +:10AF4000C52700088D250008452600082125000892 +:10AF5000B12B0008792B000851290008D77300088D +:10AF60008D240008E9240008D12300085F2400088C +:10AF7000A10C000809240008C9140008B10C00083D +:10AF8000991400080B3600084B73000831150008AF +:10AF9000C12200085B220008791400082122000861 +:10AFA000F9720008FCFFFFFF000000004D2D0008B3 +:10AFB000672D000800000000000000006D0E000872 +:10AFC0001F150008250F0008170E0008010E0008C5 +:10AFD000F50D0008E90D0008DD0D0008490E000818 +:10AFE0000000000000000000B10D00080D15000871 +:10AFF000470D0008310D0008030D00085D0D000825 +:10B00000250D0008190D0008F70C0008EB0C0008CE +:10B01000DF0C0008C90C0008B7D10008B3D1000844 +:10B02000AFCF0008AFCF0008B5CF0008A7D1000808 +:10B030008F0D0008000000000000000011DB000878 +:10B040000000000000000000850E0008FB1400084E +:10B05000250F0008330E0008010E0008F50D00084A +:10B06000E90D0008DD0D0008490E00080000000091 +:10B0700000000000C90D0008E9140008470D000891 +:10B08000310D0008030D0008790D0008250D00089A +:10B09000190D0008F70C0008EB0C0008DF0C000885 +:10B0A000C90C0008B7D10008B3D10008AFCF000821 +:10B0B000AFCF0008B5CF0008A7D100088F0D00085A +:10B0C0000000000000000000A5230108352401084D +:10B0D0000000000000000000B9BB00083DBC0008F3 +:10B0E00077C295F360D2EF7F3552500F2CB679803E +:10B0F0002A8648CE3D0201002A8648CE3D02010044 +:10B100002A8648CE3D030107002A8648CE3D03012A +:10B110000700000040420F00200000000100000076 +:10B120000200000004000000080000001000000001 +:10B13000200000004000000080000000000100002E +:10B1400000020000000400000008000000100000E1 +:10B150000020000000400000008000002CAD01082D +:10B16000062040006CB10108F00A022445080008DE +:10B1700039080008E9070008D90700081D08000879 +:10B18000FD07000809D00008910800080000000031 +:10B19000515350494600464C41534849415000469E +:10B1A00041543332202020002A2B2C3A3B3C3D3E98 +:10B1B0005B5D7C223F7F005346445000000000004E +:10B1C000FBFFFBFEECEAF3EFF7F3EDEDEAFB8CF0AF +:10B1D000F4E9EA809A45418E418F804545454949C9 +:10B1E000498E8F9092924F994F555559999A9B9CA1 +:10B1F0009D9E9F41494F55A5A5A6A7A8A9AAABAC5E +:10B20000ADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCF6 +:10B21000BDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCE6 +:10B22000CDCECFD0D1D2D3D4D5D6D7D8D9DADBDCD6 +:10B23000DDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECC6 +:10B24000EDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCB6 +:10B25000FDFEFF00000000006410B71DC8206E3B1B +:10B26000AC30D9269041DC76F4516B6B5861B24D0D +:10B270003C7105502083B8ED44930FF0E8A3D6D677 +:10B280008CB361CBB0C2649BD4D2D38678E20AA0DF +:10B290001CF2BDBD30313233343536373839616256 +:10B2A000636465663031323334353637383941427C +:10B2B00043444546000000000D0064656661756CFE +:10B2C00074005254582056352E352E330001020496 +:10B2D000982F8A4291443771CFFBC0B5A5DBB5E901 +:10B2E0005BC25639F111F159A4823F92D55E1CAB75 +:10B2F00098AA07D8015B8312BE853124C37D0C5503 +:10B30000745DBE72FEB1DE80A706DC9B74F19BC14A +:10B31000C1699BE48647BEEFC69DC10FCCA10C243A +:10B320006F2CE92DAA84744ADCA9B05CDA88F9761E +:10B3300052513E986DC631A8C82703B0C77F59BF88 +:10B34000F30BE0C64791A7D55163CA0667292914B4 +:10B35000850AB72738211B2EFC6D2C4D130D385351 +:10B3600054730A65BB0A6A762EC9C281852C729213 +:10B37000A1E8BFA24B661AA8708B4BC2A3516CC741 +:10B3800019E892D1240699D685350EF470A06A107A +:10B3900016C1A419086C371E4C774827B5BCB034C9 +:10B3A000B30C1C394AAAD84E4FCA9C5BF36F2E6867 +:10B3B000EE828F746F63A5781478C8840802C78CF6 +:10B3C000FAFFBE90EB6C50A4F7A3F9BEF27871C6F9 +:10B3D0002900000000500052D22700003B0000006E +:10B3E00000500052D22700005800000000500052C8 +:10B3F000D22B0000FFFF0000FFFFFFFF0000000056 +:10B400002A00000000500052D22700003C0000003B +:10B4100000500052D2270000590000000050005296 +:10B42000D22B0000FFFF0000FFFFFFFF0000000025 +:10B430004200000000500052D227000057000000D8 +:10B4400000500052D2270000FFFF0000FFFFFFFF67 +:10B45000000000000100000000500052D227000050 +:10B460003D00000000500052D227000056000000AE +:10B4700000500052D2270000FFFF0000FFFFFFFF37 +:10B48000000000001200000000500052D22700000F +:10B490005A00000000500052D2270000FFFF0000B9 +:10B4A000FFFFFFFF000000001600000000500052E8 +:10B4B000D22B00001A00000000500052D2270000DA +:10B4C0006600000000500052D22B0000FFFF000079 +:10B4D000FFFFFFFF0000000001000000004C0040E3 +:10B4E000D22300000300000000440040D21F0000EF +:10B4F0000800000000780040D22F00000A00000081 +:10B5000000100140D21F00000A010000000C00588A +:10B51000D20F00000B000000004C0040D21B0000C6 +:10B520001300000000780040D22F0000150000003A +:10B5300000500040D23B0000170000000010014006 +:10B54000D21F000017010000000C0058D223000099 +:10B5500018000000004C0040D22300001B00000037 +:10B5600000480040D21F00001C00000000500040B6 +:10B57000D23B00001F00000000100140D213000069 +:10B580002700000000140140D21F00002B00000023 +:10B5900000480040D21F00002B010000004C00407A +:10B5A000D223000030000000004C0040D2230000F5 +:10B5B0003200000000500040D2230000360000009E +:10B5C00000440040D21F0000390000000048004045 +:10B5D000D21F000040000000007C0040D223000089 +:10B5E0004700000000780040D21F00005600000015 +:10B5F00000780040D21F00006900000000140140E4 +:10B60000D21F00007E000000004C0040D22300004A +:10B6100089000000004C0040D22300009900000087 +:10B62000007C0040D2230000FFFF0000FFFFFFFF6F +:10B630000000000000000000004C0040D223000089 +:10B640000200000000440040D21F0000090000007A +:10B6500000100140D21F000009010000000C00583A +:10B66000D20F00000C000000004C0040D21B000074 +:10B670000F00000000780040D22F000014000000EE +:10B6800000780040D22F000016000000001001409A +:10B69000D21F00001601000000500040D23B000005 +:10B6A00016020000000C0058D22300001900000010 +:10B6B000004C0040D22300001A0000000048004067 +:10B6C000D21F00001D00000000500040D23B0000CF +:10B6D0001E00000000100140D213000026000000F0 +:10B6E00000140140D21F00002A0000000048004062 +:10B6F000D21F00002A010000004C0040D2230000AD +:10B700002C00000000500040D22300003100000057 +:10B71000004C0040D22300003500000000440040EF +:10B72000D21F00003800000000480040D21F000077 +:10B7300041000000007C0040D223000048000000CF +:10B7400000780040D21F0000570000000078004041 +:10B75000D21F00006E00000000140140D21F000044 +:10B760007D000000004C0040D22300009800000043 +:10B77000007C0040D2230000FFFF0000FFFFFFFF1E +:10B7800000000000000000000000000065CF00087D +:10B790001DD40008D5D4000869CF0008A3CF000845 +:10B7A000F37F0008F37F000899CF0008D3D1000889 +:10B7B000C9D100089DCF0008C3D10008B7D1000847 +:10B7C000B3D10008AFCF0008AFCF00089DD4000868 +:10B7D000A7D100080000000000000000D9240108E3 +:10B7E000892501085D2401084924010800000000A2 +:10B7F0000000000049D50008000000000000000023 +:10B80000ADDA00082F737464657272002F7374646C +:10B81000696E002F7374646F757400004B60D227DB +:10B820003E3CCE3BF6B053CCB0061D65BC86987648 +:10B8300055BDEBB3E7933AAAD835C65A96C298D805 +:10B840004539A1F4A033EB2D817D0377F240A46349 +:10B85000E5E6BCF847422CE1F2D1176BF551BF3752 +:10B860006840B6CBCE5E316B5733CE2B169E0F7C25 +:10B870004AEBE78E9B7F1AFEE242E34F512563FCC1 +:10B88000C2CAB9F3849E17A7ADFAE6BCFFFFFFFF5B +:10B89000FFFFFFFF00000000FFFFFFFFFFFFFFFFB4 +:10B8A000FFFFFFFFFFFFFFFF0000000000000000A0 +:10B8B0000000000001000000FFFFFFFF46494C456B +:10B8C00042440044465520496E7465726661636562 +:10B8D0000044465520436F6E666967004172647587 +:10B8E000696E6F205341004F70746100452D5254B2 +:10B8F00043536574424B50526567697374657200B7 +:10B90000452D525443476574424B505265676973E5 +:10B9100074657200452D526561643A696E76616C9A +:10B9200069642068616E646C6500452D52656164D0 +:10B930003A667365656B00452D526561643A6861CE +:10B940006E646C6520256420636F756E742030789A +:10B95000257A780A00452D45726173653A696E76DD +:10B96000616C69642068616E646C6500452D457288 +:10B970006173653A667365656B00452D4572617349 +:10B98000653A68616E646C6520256420636F756E2E +:10B9900074203078257A780A00452D4572617365E8 +:10B9A0003A666C75736800452D50726F6772616DF1 +:10B9B0003A696E76616C69642068616E646C6500DA +:10B9C000452D50726F6772616D3A667365656B00E5 +:10B9D000452D50726F6772616D3A68616E646C6577 +:10B9E00020256420636F756E74203078257A780A7C +:10B9F00000452D50726F6772616D3A666C757368A1 +:10BA000000452D43616E6E6F74206F70656E206609 +:10BA1000696C6520626C6F636B2064657669636531 +:10BA20002025732025730A00452D496E69743A66F6 +:10BA30007365656B00572D46696C6520257320730F +:10BA4000697A6520283078257A78292073686F759F +:10BA50006C64206265207468652073616D65206F79 +:10BA60006620756E6465726C79696E6720626C6FB2 +:10BA7000636B2064657669636520283078257A7861 +:10BA8000290A00536574537973436C6F636B2066A6 +:10BA900061696C65640A006D61696E00404D4355D3 +:10BAA000626F6F742020202020202020762E2530E9 +:10BAB00032642020202F3078303030303030303039 +:10BAC0002F302A344B67004041726475696E6F20D5 +:10BAD00020626F6F742020762E2530326420202063 +:10BAE0002F307830303030303030302F302A344BF7 +:10BAF0006700404578742046696C6520466C617328 +:10BB0000682020304D422020202F307830303030D7 +:10BB1000303030302F302A344B6700676F6F64004D +:10BB2000756E73657400626164004255473B206323 +:10BB3000616E27742068617070656E00726576654D +:10BB400072740074657374007065726D00492D53D2 +:10BB500074617274696E672041726475696E6F20DA +:10BB6000626F6F746C6F6164657200492D53656319 +:10BB7000757265206B657973206E6F7420636F6ECC +:10BB80006669677572656400492D5374617274202B +:10BB90004F5441203078255820307825582030786F +:10BBA00025580A00452D20205344204E4F54205341 +:10BBB0005550504F52544544007262002F66732F07 +:10BBC0005550444154452E42494E00492D536B6512 +:10BBD000746368207570646174656400492D426FF8 +:10BBE0006F74696E6720736B65746368206174207D +:10BBF000307825780A0A00492D4E6F20736B6574E2 +:10BC0000636820666F756E6400492D5374617274A9 +:10BC1000696E67204D4355626F6F7400572D466102 +:10BC2000696C65642072656164696E672073656321 +:10BC3000746F72733B20424F4F545F4D41585F49C0 +:10BC40004D475F534543544F52533D2564202D20AB +:10BC5000746F6F20736D616C6C3F0A00572D4661E5 +:10BC6000696C65642072656164696E6720696D61E5 +:10BC7000676520686561646572733B20496D616723 +:10BC8000653D25750A00572D43616E6E6F742075F2 +:10BC90007067726164653A206D6F726520736563C9 +:10BCA000746F7273207468616E20616C6C6F77655D +:10BCB0006400572D43616E6E6F74207570677261FA +:10BCC00064653A20736C6F74732068617665206ECA +:10BCD0006F6E2D636F6D70617469626C6520736542 +:10BCE00063746F727300572D43616E6E6F742075AD +:10BCF0007067726164653A206E6F7420616C6C20AD +:10BD0000736563746F72732066697420696E7369FA +:10BD10006465207363726174636800572D43616EBC +:10BD20006E6F7420757067726164653A20736C6F12 +:10BD3000747320617265206E6F7420636F6D706123 +:10BD40007469626C65005072696D61727920696D09 +:10BD500061676500492D25733A206D616769633D10 +:10BD600025732C20737761705F747970653D30782E +:10BD700025782C20636F70795F646F6E653D307835 +:10BD800025782C20696D6167655F6F6B3D30782584 +:10BD9000780A005363726174636800492D426F6FC3 +:10BDA0007420736F757263653A2025730A00492DFC +:10BDB000426F6F7420736F757263653A206E6F6E99 +:10BDC0006500452D446574656374656420696E6320 +:10BDD0006F6E73697374656E7420737461747573B8 +:10BDE0002100572D4661696C656420726561646944 +:10BDF0006E6720626F6F74207374617475733B207B +:10BE0000496D6167653D25750A00452D70616E6954 +:10BE1000632100492D5365636F6E646172792069F7 +:10BE20006D616765206F6620696D6167652070616F +:10BE30006972202825642E2920697320756E726529 +:10BE400061636861626C652E20547265617420695B +:10BE50007420617320656D7074790A00492D5377E1 +:10BE6000617020747970653A2025730A00492D535A +:10BE700077617020747970653A206E6F6E65004945 +:10BE80002D496D6167652075706772616465207307 +:10BE900065636F6E6461727920736C6F74202D3EE0 +:10BEA000207072696D61727920736C6F7400492D16 +:10BEB00045726173696E6720746865207072696D80 +:10BEC00061727920736C6F7400492D436F707969CA +:10BED0006E6720746865207365636F6E6461727944 +:10BEE00020736C6F7420746F2074686520707269A1 +:10BEF0006D61727920736C6F743A203078257A788E +:10BF00002062797465730A00452D4661696C656429 +:10BF100020746F206C6F63617465206669726D7741 +:10BF200061726520696D6167652C206572726F7240 +:10BF30003A2025640A0A00492D426F6F74696E67C2 +:10BF4000206669726D7761726520696D6167652031 +:10BF5000617420307825780A0A0073696E676C6511 +:10BF6000746F6E5F6D75746578006D616C6C6F6376 +:10BF70005F6D7574657800656E765F6D7574657854 +:10BF800000492D437573746F6D204F5441206461D7 +:10BF9000746100492D5365636F6E64617279205B33 +:10BFA00025645D205B25645D0A00492D5363726141 +:10BFB000746368205B25645D205B25645D0A00492D +:10BFC0002D44656661756C74204F54412064617422 +:10BFD0006100452D55206F6E2049415000452D537D +:10BFE000444D4D4300452D436F6E66696700452DF6 +:10BFF00042442055215300452D4D42522055215396 +:10C0000000452D496E697400452D4D6F756E7400A5 +:10C010002F66732F7570646174652E62696E00728D +:10C02000622B002F66732F736372617463682E62D4 +:10C03000696E00452D5520636F6E66696700452D5A +:10C0400053206F6E2049415000452D5320636F6E81 +:10C0500066696700452D496E69742055204D42522E +:10C0600000452D496E69742053204D42520073657E +:10C070006300452D4D6F756E742055206F6E204CFA +:10C080004F47002F7365632F7570646174652E626E +:10C09000696E0073637200452D4D6F756E74205389 +:10C0A000206F6E204C4F47002F7363722F736372A3 +:10C0B000617463682E62696E007274785F74696D72 +:10C0C0006572007274785F69646C650040496E74D3 +:10C0D00065726E616C20466C6173682020324D423F +:10C0E0002020202F307830383030303030302F3032 +:10C0F000312A3132384B612C31352A3132384B6795 +:10C100000040457874205241572020466C61736886 +:10C110002031364D422020202F30783930303030D9 +:10C120003030302F343039362A344B67000000006D +:10C130005ABF01080B000000FCA402241C000000F0 +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C17000000000000000000001000000E8030000D3 +:10C1800005000000684302241000000000000000C9 +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000001000005F +:10C1D00070C30108ACC30108CD4A01082940010819 +:10C1E00094C30108040000000000000000000000EB +:10C1F000E95201080D53010881C30008EDBE000893 +:10C20000F37F0008B5BF000851C200085DC00008F8 +:10C21000E3390108097E0008097E0008017E000854 +:10C22000877D00087D7D0008817D0008937F0008E0 +:10C23000337F00080F7E0008F97D00080000000031 +:10C240000000000023AE00084180000879BA000811 +:10C25000E18000080B7D0008B77C0008637C0008C3 +:10C260001D7C0008E3390108097C0008F57B000803 +:10C27000E17B0008B97B0008A57B00089F7B0008D4 +:10C28000937F0008337F00080F7E0008737B00084F +:10C29000997B0008877B0008837B00087F7B000870 +:10C2A0000000000000000000E1390108A549010874 +:10C2B0003549010829490108DD3901088D41010886 +:10C2C000C948010839480108E3390108B9390108AA +:10C2D000B3390108AD390108A73901087D7D00088F +:10C2E000A1390108BF390108BF390108BF39010868 +:10C2F00099390108000000000000000021AE00088C +:10C3000035800008057B0008FD7A0008F57A0008F2 +:10C31000AB7A0008617A0008217A0008E339010845 +:10C320002F7900082779000811790008F7780008AC +:10C33000EF780008DD780008D379000885790008D7 +:10C3400037790008D57800080105010001050302CE +:10C3500004010401030403020401040304020401B0 +:10C3600004010403010303040104000000000000B1 +:10C37000C3C0010800000000B444022444000000CF +:10C38000F844022400030000010000000100000046 +:10C39000000000000000000000000000A84302248C +:10C3A00034000000DC43022450000000B9C0010842 +:10C3B000000000007044022444000000F8470224FA +:10C3C0000003000028000000010000000000000041 +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C43000400300241F0000001C0000001F0000003B +:10C440001E0000001F0000001E0000001F00000072 +:10C450001F0000001E0000001F0000001E00000062 +:10C460001F0000001F0000001D0000001F00000052 +:10C470001E0000001F0000001E0000001F00000042 +:10C480001F0000001E0000001F0000001E00000032 +:10C490001F000000545A00474D54002531305B5EA8 +:10C4A000302D392C2B2D5D256E004D256875256EA0 +:10C4B0002E256875256E2E256875256E002F25683A +:10C4C00075256E3A256875256E3A256875256E00C6 +:10C4D0000020202020202020202028282828282054 +:10C4E000202020202020202020202020202020204C +:10C4F00020881010101010101010101010101010B4 +:10C5000010040404040404040404041010101010A3 +:10C51000101041414141414101010101010101016D +:10C5200001010101010101010101010110101010BF +:10C53000101042424242424202020202020202023F +:10C540000202020202020202020202021010101093 +:10C5500020000000000000000000000000000000BB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D00000686C4C002B2D00303000785800412D45 +:10C5E00046612D66383930313233343536375D00A7 +:10C5F000D5C50108D8C50108DBC501080000000049 +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000000000000006 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000000000000000B5 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB0000000000000000000000000000000000075 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000000000000000000000000000035 +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000000000000000000F4 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD400000000000000000000000000000000000E3 +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000000000000000000000038 +:10D8F0000000000000000000000000000000000028 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000000000000000000016 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA600000000000000000000000000000000000B6 +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000000000000000000036 +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000000000000000015 +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000000000000000000000000C5 +:10DB600000000000000000000000000000000000B5 +:10DB700000000000000000000000000000000000A5 +:10DB80000000000000000000000000000000000095 +:10DB90000000000000000000000000000000000085 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000000000000000000000000055 +:10DBD0000000000000000000000000000000000045 +:10DBE0000000000000000000000000000000000035 +:10DBF0000000000000000000000000000000000025 +:10DC00000000000000000000000000000000000014 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000000E4 +:10DC400000000000000000000000000000000000D4 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000000054 +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000000000000000000003 +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000000000000000000000000B3 +:10DD700000000000000000000000000000000000A3 +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD0000000000000000000000000000000000041 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000000000000000000000090 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000000000008C +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000000000000000000001C +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E5200000000000000000000000000000000000EB +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F000000000000000000000000000000000001B +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000000000000000000FA +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000000000000000D9 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000099 +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000000000000000000000019 +:10E800000000000000000000000000000000000008 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000094 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:0BF00000A01908020101001000011916 +:08F00C003415FE7F0100000035 +:10F01400A80600240000000000000000FFFFFFFF1E +:10F02400FFFFFFFFFFFFFFFF0000000000000000E4 +:10F0340000000000000000000000000000000000CC +:10F0440000000000000000000000000000000000BC +:10F0540000000000000000000000000000000000AC +:10F06400000000000000000000000000000000009C +:10F07400000000000000000000000000000000008C +:10F08400000000000000000000000000000000007C +:10F09400000000000000000000000000000000006C +:10F0A400000000000000000000000000000000005C +:10F0B400000000000000000000000000000000004C +:10F0C400000000000000000000000000000000003C +:10F0D400000000000000000000000000000000002C +:10F0E400000000000000000000000000000000001C +:10F0F400000000000000000000000000000000000C +:10F1040000000000000000000000000000000000FB +:10F1140000000000000000000000000058A50224C8 +:10F124004D8D010801000000C2B20108D3B3FB02F7 +:10F1340000000000000000000000000000000000CB +:10F1440000000000000000000000000000000000BB +:10F1540000000000000000000000000000000000AB +:10F16400000000000000000000000000000000009B +:10F17400000000000000000000000000000000008B +:10F18400000000000000000000000000000000007B +:10F19400000000000000000000000000000000006B +:10F1A400000000000000000000000000000000005B +:10F1B400000000000000000000000000000000004B +:10F1C400000000000000000000000000E53A010813 +:10F1D400D93A0108593B0108713B0108993A0108E1 +:10F1E400413B0108293B0108404578742046696C7D +:10F1F4006520466C6173682031364D422020202FF3 +:10F20400307841303030303030302F343039362A95 +:10F21400344B67000000000039410108D54901085A +:10F224006144010889420108F53B0108E53B0108F6 +:10F23400E93B0108F93B0108F13B0108ED3B0108FA +:10F24400FD3B0108FD3B0108FD3B0108D93B0108DA +:10F25400B53B0108CCC0010801C10108D801002454 +:10F2640094270224E5510108114A0108ED410108DF +:10F274006D4E0108193A01080D3A01081201000205 +:10F284000000004041236403000201020301000066 +:10F294000403090432030000000000000000000021 +:10F2A400000000000000000000000000000000005A +:10F2B400000000000000000000000000000000004A +:10F2C400000000000000000009027800030102C0F1 +:10F2D400FA0904000000FE0102060904000100FE10 +:10F2E4000102070904000200FE01020809040003E8 +:10F2F40000FE01020909210BFF0000101A01080B8E +:10F3040001020202010009040100010202010005D8 +:10F31400240010010524010002042402020524062D +:10F3240001020705830308000909040200020A0018 +:10F3340000000705020240000007058202400000A9 +:10F344000A060002000000400100011440030024EA +:10F3540000000000F0C3010810C40108D0C3010874 +:10F364000000000000000000000000000000000099 +:10F374000000000000000000000000000000000089 +:10F384000000000000000000000000000000000079 +:10F394000000000000000000000000000000000069 +:10F3A4000000000000000000000000000000000059 +:10F3B40097C4010897C40108010000000000000080 +:10F3C4004A000000000000000000000000000000EF +:10F3D4000000000000000000000000000000000029 +:10F3E40000000000000000004A00000000000000CF +:10F3F4000000000000000000000000000000000009 +:10F4040000000000000000000000000000000000F8 +:10F4140044A502240000000025050008712D000801 +:08F424000105000800000000D2 +:040000050800067D6C +:00000001FF diff --git a/bootloaders/PORTENTA_H7/portentah7_bootloader_mbed_hs_v2.hex b/bootloaders/PORTENTA_H7/portentah7_bootloader_mbed_hs_v2.hex new file mode 100644 index 000000000..199f89ae1 --- /dev/null +++ b/bootloaders/PORTENTA_H7/portentah7_bootloader_mbed_hs_v2.hex @@ -0,0 +1,8054 @@ +:020000040800F2 +:100000000000082481040008CD0400081D04000835 +:1000100023040008290400082F0400080000000041 +:100020000000000000000000000000005503000870 +:10003000CD04000800000000EF030008FF030008E3 +:10004000CD040008CD040008CD040008CD0400084C +:10005000CD040008CD040008CD040008CD0400083C +:10006000CD040008CD040008CD040008CD0400082C +:10007000CD040008CD040008CD040008CD0400081C +:10008000CD040008CD040008CD040008CD0400080C +:10009000CD040008CD040008CD040008CD040008FC +:1000A000CD040008CD040008CD040008CD040008EC +:1000B000CD040008CD040008CD040008CD040008DC +:1000C000CD040008CD040008CD040008CD040008CC +:1000D000CD040008CD040008CD040008CD040008BC +:1000E000CD040008CD04000800000000CD04000885 +:1000F000CD040008CD040008CD040008CD0400089C +:10010000CD040008CD040008CD040008CD0400088B +:10011000CD040008CD040008CD040008CD0400087B +:10012000CD040008CD040008CD040008CD0400086B +:10013000CD040008CD040008CD040008CD0400085B +:10014000CD040008CD0400080000000000000000FD +:10015000CD040008CD040008CD040008CD0400083B +:10016000CD040008CD040008CD040008CD0400082B +:10017000CD040008CD040008CD04000800000000F4 +:10018000CD040008CD040008CD040008CD0400080B +:10019000CD040008CD040008CD040008CD040008FB +:1001A000CD040008CD040008CD040008CD040008EB +:1001B000CD040008CD040008CD040008CD040008DB +:1001C000CD040008CD040008CD040008CD040008CB +:1001D000CD040008CD040008CD040008CD040008BB +:1001E000CD040008CD040008CD040008CD040008AB +:1001F000CD040008CD040008CD040008CD0400089B +:10020000CD040008CD040008CD040008CD0400088A +:10021000CD040008CD040008CD040008CD0400087A +:10022000CD040008CD040008CD040008CD0400086A +:100230002548010871310008CD040008CD040008EC +:10024000CD040008CD040008CD040008CD0400084A +:10025000CD040008CD040008CD040008CD0400083A +:10026000CD040008CD040008CD040008CD0400082A +:10027000CD040008CD040008CD040008CD0400081A +:10028000CD040008CD040008CD04000800000000E3 +:10029000CD040008CD04000810B5054C237833B90F +:1002A000044B13B10448AFF300800123237010BD49 +:1002B000E00300240000000038F3010808B5034BF8 +:1002C0001BB103490348AFF3008008BD00000000E4 +:1002D000E403002438F30108A3F5803A704700BF17 +:1002E000174B002B08BF134B9D46FFF7F5FF00216E +:1002F0008B460F461348144A121A16F047FF0E4B4E +:10030000002B00D098470D4B002B00D098470020C1 +:10031000002104000D000D48002802D00C480EF00A +:10032000E7F816F023FD200029000EF087FF0FF0FC +:1003300057FA00BF0000080000000000890F010804 +:1003400000000824E0030024B03E0024F1E400088B +:10035000000000001EF0040F0CBFEFF30880EFF365 +:100360000980816911F8021C002932D101B590E899 +:100370000F10E047BDE800508CE80300244B93E8E1 +:100380000600914208BF70471A6041B91EF0100F75 +:1003900010D1204B186820F0010018600AE02CE909 +:1003A000F00F1EF0100F08BF2CED108A81F822E02C +:1003B000C1F838C0906B92F8221061F0FF0E1EF069 +:1003C000100F08BFB0EC108AB0E8F00F80F3098876 +:1003D0007047114A13689942FAD801B552F821C002 +:1003E0000FC8E047BDE80050CCF80000704701B5E9 +:1003F00012F006FABDE80140EFF3098CBEE701B543 +:1004000012F040FABDE80140EFF3098CB6E70000B6 +:100410005001002434EF00E010AC0108102300F07C +:1004200007B8202300F004B8302300F001B84023BF +:100430009C46F0B404AE7546E80801D3EFF3098694 +:100440000E4F0FCE0FC70FBC0FC74046494652464E +:100450005B460FC71DCE3100A60A00D304316E09DA +:1004600000D248311FC7EFF309806946EFF31486C5 +:1004700063C7604601490FF067FB00BF4C3E002494 +:10048000DFF830D002F018FF002103E00A4B5B5880 +:100490004350043109480A4B42189A42F6D3094A9C +:1004A00002E0002342F8043B074B9A42F9D3FFF7DE +:1004B00017FF70470000082444F3010800000024DF +:1004C000D0030024E0030024B03E0024FEE7000037 +:1004D000264B022283F83E201B681A6A22F0010292 +:1004E0001A621A6A42F001021A62214A934219D032 +:1004F00002F58062934215D002F57052934211D0FA +:1005000002F5806293420DD002F58062934209D0D9 +:10051000B3F1804F0ED19968164A0A40062A21D1BC +:10052000002070475A6C42F400425A64104A9342C9 +:10053000EED1F0E7104A9342EDD002F5806293428B +:10054000E9D002F580629342E5D002F57842934209 +:10055000E1D0A2F56C429342DDD01A6842F001026C +:100560001A60DDE7B2F5803FF7D1D9E7640E0024C9 +:10057000000001400700010000040040024B6FF042 +:1005800002021B681A617047640E0024034B1A684C +:10059000D36823F00203D360704700BF640E0024C9 +:1005A000064B6FF002021B681A615A6942F00202A0 +:1005B0005A61DA6842F00202DA607047640E002481 +:1005C000054B6FF002021B6858631A61DA6842F04B +:1005D0000202DA60704700BF640E0024014B586AC3 +:1005E000704700BF000C0040064A1168CB6823F03A +:1005F0000203CB6092F83E30012B01D1FFF768BFB8 +:10060000704700BF640E0024074B084A13601A6944 +:10061000910708D5DA68920705D56FF00202044801 +:100620001A610EF07DB87047000C0040640E002483 +:10063000649B010800487047AC9A0108024BD868D7 +:10064000C0F30010704700BF004000583E48F0B5AE +:10065000036806463D4D41683D4C2B402F462140E6 +:1006600002682A409A425BD1426822408A4257D1AE +:100670000A0DC1F3034402EB820204EB4202D4B23E +:10068000A51E882D4AD8C3F30232C1F30117C3F364 +:10069000032014F0030F02EB820204F1440607EB7F +:1006A000870700EB420C01F00F022A4802EB4702D9 +:1006B00003F00F0702F1FF3200FB02F24FF03C00A3 +:1006C00010FB0C20C3F3021202EB820207EB420282 +:1006D0001044C3F30152C3F3034302EB820203EB62 +:1006E00042034FF4616202FB0303C1F30030C1F324 +:1006F000032208BF0C214FEA800718BF00218A2C73 +:10070000384402EB400202F1FF320A44124951F828 +:100710002200184409D1114B984208D3002011E05F +:10072000336871683B4021409AE7462E0AD004F1B5 +:10073000430240F26D139210113A03FB0522054B60 +:1007400003FB02000021F0BD004000587F7F7F00C6 +:100750003FFFFF0080510100049B010800D12F00E2 +:100760006AB101F00301074B0329596808D000F46E +:100770007060B0F5706F03D121EA02025A607047D1 +:100780000A43FBE70004005830B5114B114DD5F872 +:1007900094409C42FBD14943012A01EB41034FEABB +:1007A00041046FEA030304D0022A0BD0C26813404D +:1007B0000BE0C26813401943C160064B4FF440720E +:1007C0005A6130BDC26813402343C360F5E700BFE0 +:1007D0000003008000640258024BD869DA69824243 +:1007E000FBD17047002C0058044B054A1878054B84 +:1007F000002814BF10461846704700BF4019002457 +:10080000B49A0108BC9A010890F85030011D032BDE +:100810000ED8DFE803F00207090B0648064A42F843 +:10082000231070470548F9E70548F7E70548F5E75D +:100830000020F3E7215D00081C1000243D5D000846 +:10084000595D0008755D000809010028C9B206DB82 +:1008500000F1604000F5614080F80013704700F03F +:100860000F00014B1954704714ED00E073B51C4B99 +:10087000B0F95C409D6804F11006B0F95E2045F8BF +:100880002610BFF34F8F9B6802F1100543F8251027 +:10089000BFF34F8F90F870302046002B0CBF022121 +:1008A00001210191FFF7D0FF01991046FFF7CCFF1E +:1008B000002C08DB0123610904F01F0403FA04F48F +:1008C000084B43F82140002A08DB0123510902F0BC +:1008D0001F0203FA02F2034B43F8212002B070BD5D +:1008E00000ED00E000E100E02DE9F04191F800E0CA +:1008F0004B7874464E69012B354F4FEA4414DFF8AC +:10090000D4C044D100F510652B19B6B91E69374023 +:100910001F611E6946F400261E611E6906EA0C0668 +:10092000012A1E6122D10A6902B15A612B5943F092 +:1009300004432B510020BDE8F081D3F8108008EA71 +:100940000C0CC3F810C0D3F810C00CEA07071F61E5 +:100950008F68BE421E6946F4002688BF4F611E6143 +:100960004E691F69C6F312063E43D9E72B5943F07F +:1009700004432B514B69002BDCD00EF00F020123F6 +:10098000D0F8341893400B43C0F83438D2E700F560 +:10099000306003191D6905EA0C051D611D693D40A4 +:1009A0001D618D6806B14D611E69C5F31205012AEE +:1009B00046F400261E611E6945EA06051D6102D146 +:1009C000CA6802B15A61035943F004430351B1E7C5 +:1009D000FFFF07E00000F8FF0023092803D840EAE2 +:1009E0000310C0B270470A380133C0B2F5E7000007 +:1009F0004E4A70B5946A966AD36A16F07C7FC6F345 +:100A00000551556C00F08D8007EE901AC3F300235A +:100A1000C5F3CC0104F00304F8EEE76A4B43012C64 +:100A2000B7EE006A07EE903AFAEEE97A6BD0022C44 +:100A30005BD0002C67D113689B0646D51168136CF8 +:100A4000C1F3C1013A4AC3F30803CA4007EE102AB2 +:100A5000F8EEC75A85EEA67A06EE903AF8EEE66A08 +:100A600076EEA77A77EE867A304A67EE877A136C4D +:100A7000C3F3462307EE103AB8EEC77A37EE067A8C +:100A8000C7EE876AFCEEE66AC0ED006A136CC3F33A +:100A9000064307EE103AB8EEC77A37EE067AC7EE8D +:100AA000876AFCEEE66AC0ED016A136CC3F3066365 +:100AB00007EE103AB8EEC77A37EE066A87EE867A06 +:100AC000BCEEC77A80ED027A70BD136CDFED195A67 +:100AD000C3F3080307EE103AB8EEC77A77EE277A29 +:100AE00077EE867A85EEA67ABEE7136CDFED125AB2 +:100AF000C3F3080307EE103AB8EEC77A77EE277A09 +:100B000077EE867AEEE7136CDFED0C5AC3F3080339 +:100B100007EE103AB8EEC77A77EE277A77EE867A44 +:100B2000E0E7C0E900118160CEE700BF0044025851 +:100B30000090D0030024744C20BCBE4B0024744AA7 +:100B40004E4A70B5946A966AD36A16F47C3FC6F32F +:100B50000531D56B00F08D8007EE901AC3F30013BA +:100B6000C5F3CC0104F00304F8EEE76A4B43012C13 +:100B7000B7EE006A07EE903AFAEEE97A6BD0022CF3 +:100B80005BD0002C67D113689B0646D51168936B28 +:100B9000C1F3C1013A4AC3F30803CA4007EE102A61 +:100BA000F8EEC75A85EEA67A06EE903AF8EEE66AB7 +:100BB00076EEA77A77EE867A304A67EE877A936B7D +:100BC000C3F3462307EE103AB8EEC77A37EE067A3B +:100BD000C7EE876AFCEEE66AC0ED006A936BC3F36A +:100BE000064307EE103AB8EEC77A37EE067AC7EE3C +:100BF000876AFCEEE66AC0ED016A936BC3F3066395 +:100C000007EE103AB8EEC77A37EE066A87EE867AB4 +:100C1000BCEEC77A80ED027A70BD936BDFED195A96 +:100C2000C3F3080307EE103AB8EEC77A77EE277AD7 +:100C300077EE867A85EEA67ABEE7936BDFED125AE1 +:100C4000C3F3080307EE103AB8EEC77A77EE277AB7 +:100C500077EE867AEEE7936BDFED0C5AC3F3080369 +:100C600007EE103AB8EEC77A77EE277A77EE867AF3 +:100C7000E0E7C0E900118160CEE700BF0044025800 +:100C80000090D0030024744C20BCBE4B0024744A56 +:100C9000094A82B0D2F8F41041F00201C2F8F4100F +:100CA000D2F8F42002F002020192044A019B536838 +:100CB0001843506002B070470044025800040058C6 +:100CC00011F0010307D090F8413003F02803282BDE +:100CD0000CBF4223F2238A0709D590F8412002F085 +:100CE0002802282A0CBF43F0440343F0F4030A040B +:100CF000016848BF43F0B8030A6822EA03030B60A7 +:100D0000704790F84130026803F02803282B70B533 +:100D1000044625D1956991699368C5F30045D66865 +:100D2000C668022E16D1C3F3C21383EA114313F02F +:100D300006030FD1816C01318164816C022908D1D5 +:100D400008218364D16184F84030012375B184F8AF +:100D50006D3070BD4FF40041FFF7B2FF0023F2E7A2 +:100D60000823D361002380F84030F2E784F86E3026 +:100D7000EFE7000030B5039DC1F30901046845EABF +:100D8000024260681A43044B43EA55530A4320EA7F +:100D900003000243626030BDFF63FF03D0F884307C +:100DA00037B50446002B62D0D0F89430002B5ED0CB +:100DB00090F87C2090F84110002A14BF4FF0007288 +:100DC00000222029C26545D190F84010012941D068 +:100DD0000125816FD0F890009BB284F84050222505 +:100DE000606284F84150102584F842500025656403 +:100DF0006385214BE2626363638D9BB2FF2B2BD92A +:100E0000FF2323854FF08073226B122A4FF00002DC +:100E100009D0E06AAA2823D1E262628D92B2FF2A49 +:100E200000D8E36A154A89B20092204694F8282037 +:100E3000FFF7A0FF626B124900238A4284F840301A +:100E400004D0104B9A4214BFF423002321680A688F +:100E500013430B6003B030BD638D2385E36AD3E792 +:100E6000E26AB2F52A4FD8D14FF00072D4E70823D6 +:100E700084F86030EEE700BF775A00080024008055 +:100E8000995B0008ED56000803689A69910701D53F +:100E900000229A629A69D20703D49A6942F0010249 +:100EA0009A61704738B5002580F8425090F841307B +:100EB000212B4FF0200380F841300BD111234563E3 +:100EC00001210363FFF7FCFE80F84050BDE8384085 +:100ED000FFF764BF1223022145630363FFF7F0FEAF +:100EE000082380F8405080F8603038BD0268436BBA +:100EF0009169126803B118477047000090F84130BB +:100F0000202B0BD12823026880F84130044B436327 +:100F10000020136843F0B803136070470220704745 +:100F20007958000808B5194B2022C36200230363D7 +:100F3000436380F8412080F842304B0712D50368A4 +:100F40005A6A436A1A70436A01334362038D4BB194 +:100F5000013B0385438D013B9BB24385436C43F0CA +:100F60000403436448F20301FFF7AAFE102203685A +:100F7000DA61002390F86C2080F84030022A01D119 +:100F800080F86E30BDE80840FFF7B8BF0000FFFFF3 +:100F900090F8413003F0FF020BB980F84020242381 +:100FA00080F8413003681A6822F001021A60426832 +:100FB00022F070621A619A6822F400429A60D0E9C5 +:100FC0000221012925D142F400429A605A6842F078 +:100FD000007242F400425A60DA6822F40042DA6099 +:100FE000D0E904210A43816942EA0122DA60D0E9AA +:100FF00007210A431A601A6842F001021A600023AE +:101000002022436480F84120036380F84230184670 +:10101000704742F4044202299A60D7D14FF400622B +:101020005A60D3E710B528B190F83530022B03D0C1 +:101030008023436501207FE00368504A934252D0E9 +:101040004F498B424FD018318B424CD018318B42D4 +:1010500049D018318B4246D018318B4243D01831D9 +:101060008B4240D018318B423DD001F556718B42F6 +:1010700039D018318B4236D018318B4233D01831E9 +:101080008B4230D018318B422DD018318B422AD070 +:1010900018318B4227D018318B4224D01A6822F0A5 +:1010A0000E021A601A6822F001021A60354A934251 +:1010B00043D1026E136823F480731360D0E91613D2 +:1010C00003F01F02012393404B60D0E919325A60AC +:1010D000C36E002B46D01A6822F480721A60D0E9E1 +:1010E0001C325A603EE00421934280F835101ED035 +:1010F000234A93421BD01832934218D0183293429D +:1011000015D01832934212D0183293420FD01832B1 +:1011100093420CD01832934209D002F55672934292 +:1011200005D01832934202D018329342FFD01A6889 +:1011300022F001021A60002010BD134A9342B8D079 +:1011400014329342B5D014329342B2D01432934247 +:10115000AFD014329342ACD014329342A9D014329F +:101160009342A6D00123002480F83530036D80F827 +:1011700034400BB19847DEE71846DDE71000024027 +:1011800028000240085402581C54025838B590F800 +:101190006C300446022B63D1B0F8763001339BB239 +:1011A000A0F87630B0F87620B0F8743092B29BB2E6 +:1011B0009A4255D2B0F8765090F84120ABB202F086 +:1011C0002802282A05D1056FED1803D14FF40073CA +:1011D000436438BD48F20201FFF772FD90F84030D9 +:1011E000012BF6D090F841300121292B80F84010D6 +:1011F00013D1FFF765FD03681A6850040DD51A680E +:10120000A06B22F480421A6038B1174B0365FFF7D8 +:1012100009FF10B1A06B036D98472A23002284F8C0 +:101220004130202384F8423023686264596821F4F5 +:1012300000415960012165626185618D21854FF012 +:101240008071E162094961639969C90301D4082188 +:10125000D96184F840201A6842F0FC021A60B8E7AD +:10126000002384F86E30B4E77754000879580008FA +:1012700008B5036800211A6880F84210510415D59A +:101280001A6822F480421A6090F84130292B13D159 +:101290002823012180F8413021230363FFF710FD4B +:1012A000002380F8403080F86D3008BD1204EBD583 +:1012B0001A6822F40042E6E790F841302A2BF4D174 +:1012C0002823022180F8413022230363FFF7F8FC32 +:1012D000002380F84030BDE80840FFF757BF0020EA +:1012E00070476FF0570070476FF057007047036802 +:1012F00010B49C6C0023A4461A465DF8044B60476A +:101300006FF05700704743680A46196810B48C6D37 +:101310008168184623465DF8044B18474368816886 +:101320001A681846526D1047436881681A68184653 +:10133000126D1047436881681A681846D26C1047CE +:1013400030B4446813462268956C0A46816820468A +:10135000AC4630BC6047436881681A681846526CD6 +:101360001047436881681A681846126C104730B4F9 +:10137000446813462268D56B0A4681682046AC460D +:1013800030BC604730B4446813462268956B0A4607 +:1013900081682046AC4630BC604710B504464068C2 +:1013A00030B10368A1685B6B98470023636010BD90 +:1013B0006FF01500FBE738B50446FFF7EEFF054672 +:1013C000236820465B689847284638BD70B50D46AF +:1013D0004168044641B929680E6B00F108012846AE +:1013E000B04700B9656070BD6FF01500FBE7000005 +:1013F000044B10B50360044643680BB1FFF7CDFF03 +:10140000204610BDA8990108034B10B5044603609F +:10141000FFF7EEFF204610BD409A0108436881683F +:101420001A681846526F1047436881681A68184650 +:10143000126F1047436881681A681846D26E1047C9 +:1014400043680A46196810B48C6E816818462346B2 +:101450005DF8044B184710B50446406830B1036886 +:10146000A1681B6E98470023636010BD6FF01500E4 +:10147000FBE738B50446FFF7EEFF05462368204634 +:101480005B689847284638BD38B5436804460D4622 +:1014900043B90B6800F108012846DB6D984700B995 +:1014A000656038BD6FF01500FBE70000044B10B518 +:1014B0000360044643680BB1FFF7CDFF204610BD23 +:1014C0007C990108034B10B504460360FFF7EEFF5B +:1014D000204610BD149A01080B4640F2011200216B +:1014E00070B50446184615F051FE03466068A168C1 +:1014F0000268556E1A462B46BDE87040184700003A +:1015000008B50DF065F8064B01221B685A604FF4D0 +:101510008052044BC3F89021BDE808400DF044B858 +:10152000040E002400E100E008B50DF051F8084B6E +:1015300001221A700022074B1A704FF48052064B9A +:10154000C3F810211A61BDE808400DF02DB800BFA6 +:10155000301000243810002400E100E070B504468B +:101560000DF036F8FFF738F9264B05461C60264A81 +:101570004FF480511161254E18463178F1B9611F41 +:101580004FF6F572914222490FD94FF6FA72954201 +:101590000BD906340122A4B20A701C601D4B012233 +:1015A0001A70BDE870400CF0FFBF00220A7003689B +:1015B000AB42194B28BF01221A70EFE7FFF7A0FFDB +:1015C00000235A19013392B2A24204BF0534A4B2D7 +:1015D000052BF6D1114BAC421B6811D24FF6FA72B3 +:1015E00095420DD84FF0FF325A6100230C4C3370F6 +:1015F0002378002BD5D10CF0C3FF01232370D0E753 +:101600005C61F2E73410002400E100E031100024B6 +:10161000681200243810002418100024040E00243E +:1016200069120024F8B5037890F801C0012B057FFA +:101630000279077B866844792ED0022B2FD0002BAD +:1016400030D14FF480738B610023C1F800C04D612D +:101650004B63C1E90B333FB3CB61CB60037C012B00 +:1016600045D0022B48D0002B4BD14FF480430B6266 +:101670000123027E002A47D000230B620B61437FC7 +:10168000012B6AD0022B6BD0002B6CD14FF08073F2 +:1016900000204B628862F8BD4FF40073D3E74FF42B +:1016A0004073D0E70023CEE7012A4E600BD0022A18 +:1016B0000CD072B94FF48063CB61032C09D8DFE8FA +:1016C00004F00B0D10134FF40063F5E74FF4406383 +:1016D000F2E727480DF0ACFB0023BEE74FF4805340 +:1016E000BBE74FF40053B8E74FF44053B5E74FF46E +:1016F00000430B620223BCE74FF440430B62042318 +:10170000B7E700230B62B4E77BB3427CB2FBF3F490 +:1017100003FB142414F0FF0F27D1561EF610741C7F +:10172000042C22DCC2EBC40212F0FF0210D0B2FB88 +:10173000F3F39D4219D3EB1A4B61436903FA02F2AA +:101740008A60032E07D82404A4F580340C6196E740 +:1017500043698B60F5E70748BCE74FF0007397E7F4 +:101760004FF0407394E7002392E74FF0FF3092E789 +:10177000C4940108ED94010800B5564B8DB00A28B9 +:1017800000F2A480DFE800F006162432404E5C6AC6 +:1017900078869400D3F8E0204F4842F00102C3F865 +:1017A000E020D3F8E03003F001030193019B0DB07A +:1017B0005DF804FBD3F8E020484842F00202C3F889 +:1017C000E020D3F8E03003F002030293029BEEE73F +:1017D000D3F8E020424842F00402C3F8E020D3F8F6 +:1017E000E03003F004030393039BE0E7D3F8E02029 +:1017F0003C4842F00802C3F8E020D3F8E03003F0A0 +:1018000008030493049BD2E7D3F8E020364842F063 +:101810001002C3F8E020D3F8E03003F01003059382 +:10182000059BC4E7D3F8E020304842F02002C3F81B +:10183000E020D3F8E03003F020030693069BB6E7E0 +:10184000D3F8E0202A4842F04002C3F8E020D3F861 +:10185000E03003F040030793079BA8E7D3F8E020AC +:10186000244842F08002C3F8E020D3F8E03003F0CF +:1018700080030893089B9AE7D3F8E0201E4842F4BF +:101880008072C3F8E020D3F8E03003F4807309934A +:10189000099B8CE7D3F8E020184842F40072C3F8A3 +:1018A000E020D3F8E03003F400730A930A9B7EE74C +:1018B000D3F8E020124842F48062C3F8E020D3F865 +:1018C000E03003F480630B930B9B70E70D480DF041 +:1018D000AFFA00BF0044025800000258000402584A +:1018E00000080258000C0258001002580014025858 +:1018F00000180258001C0258002002580024025808 +:10190000002802580495010870B50CF061FE2C4BBC +:101910002C4C1A7832B100221A70012223685A60C6 +:101920000DF004FA23681A68D50706D59A68D0071F +:1019300003D501225A600DF0F9F923681A681107DE +:1019400024D59A68120721D508221F4C5A6001221B +:101950001E4B1A7023781BB10CF0E2FD002323709C +:101960001B4C237893B11B4D1B492B7803F0FF06CA +:10197000B3B1FEF731FF06300B6880B2984209D34D +:10198000FFF7D2FD00232B7000232370BDE87040C9 +:101990000CF00ABE0868063880B2FFF7DFFDF1E7F9 +:1019A0000E4D2B7843B1FEF717FF0B68984203D317 +:1019B000FFF7BAFD2E70E7E70868FFF7CFFDE3E712 +:1019C00030100024040E0024691200243110002479 +:1019D0003810002468120024341000241810002449 +:1019E00010B50446FFF710FD204615F069FB2046B0 +:1019F00010BD10B50446FFF765FD204615F060FBED +:101A0000204610BD10B50446FFF7F2FC204615F045 +:101A100057FB204610BD10B50446FFF747FD204692 +:101A200015F04EFB204610BDF0B5142085B00CF02B +:101A3000A5FC4FF6FF71831E00F1120223F8021F6E +:101A40009A42FBD1974B0021974E10251A463060E1 +:101A500002F8011B013D02F8011BFBD142F6021204 +:101A6000924C2946924F5A8204F10800914B924AB7 +:101A70001D61DA605C221D60C3E901558F4B236054 +:101A80008F4B636015F082FB3B234FF0010C201D50 +:101A9000A4F89A308B4BC4F8A850A4F86850C4F846 +:101AA0008C5084F89850C4E927734FF400336627AC +:101AB0006366854BA4F8A470C4E9243C834BC4E955 +:101AC0002B350CF0F7FF04F1BC00A4F8B87000F05F +:101AD000FFF97F4B7F48C4F8F431C4F8005284F812 +:101AE00004520EF09BF80CF0B9FB7B480768092FF5 +:101AF00000F3B8803368991E1A4603F1120631F9D3 +:101B000002CFBCF1660F00F0B080B142F7D11433C0 +:101B100011460232B1F90060013640F09F80662321 +:101B20000B800137002607606A480EF077F80DF049 +:101B3000F5FB00200021C4F8B460032600234FF019 +:101B4000FF32C4F86031C4F8182184F8543184F8A5 +:101B5000FD3184F8FE31C4F8E820C4F8FC20A4F874 +:101B60000031C4E944014FF400300121C4F8F80108 +:101B70000220C4F8281184F8F01084F80211C4E996 +:101B800038603520C4E93D22C4F8EC00534C544A77 +:101B900023612260CDE9003304F144030293102352 +:101BA0000393EFF30583002B62D00020206400270D +:101BB0004C4800F08DF9442200214B4815F0E6FA1C +:101BC000012320223946A3876761484815F0DEFAD1 +:101BD0004FF4805328224FF4D060C4E90B32444BB9 +:101BE000A361444CA76515F063FA064670B3C21CA6 +:101BF000394622F00302131AE260C3F5D06323F0E2 +:101C000003031846C4E904776F1C00283CD101B1D6 +:101C1000256100252262C4E9065325600CF0DCFE34 +:101C20000EF0E2FE344B60600093344B258102934A +:101C30001023A57284F8245001950393C4E90A5532 +:101C4000EFF3058323B30020206366612C480DF079 +:101C500063FA2C480DF060FA05B0F0BD9A427FF4AB +:101C600057AF5EE76FF001065EE74FF0FF365BE7C8 +:101C70000DF0E6FA0146002897D14FF6FF706A464C +:101C8000DFF884C000DF91E740083D460121BBE753 +:101C90000DF0D6FA0028D6D16846DFF870C000DF14 +:101CA000D2E700BF600F0024580F0024601000240A +:101CB0003C005700740F002409CA00082899010845 +:101CC000FC9901083D005A0040420F00B5EA0008A7 +:101CD000005A6202300F00245C0F0024A019002477 +:101CE000A49A0108F4190024181A0024BC1900242D +:101CF000259501084419002440950108781900240D +:101D0000F00E0024B00E00246DD5000821D7000885 +:101D10000B688360054BC26813404A6813438A68A6 +:101D2000134343F48053C36000207047C0E0FEFFBC +:101D30000C4BDB68C3F3022310B4C3F107041A1D74 +:101D4000042C28BF0424062A4FF0FF328CBF033B2B +:101D50000023A2405DF8044B21EA02019940FEF7FE +:101D600073BD00BF00ED00E0464BDA6C1868D1038C +:101D700030B585B07DD410F000704CD0996A9D6A62 +:101D8000DA6A15F47C7FC5F305105C6B43D0C4F3AD +:101D9000CC0402F0010207EE900A01F00301624355 +:101DA000B7EE006AF8EEE76A012907EE902AFAEE2C +:101DB000E97A32D0022940D000294CD11A68920623 +:101DC00049D51968304AC1F3C1011B6BCA40C3F33E +:101DD000080307EE102AF8EEC75A85EEA67A06EE3B +:101DE000903AF8EEE66A76EEA77A77EE867A254A9A +:101DF00067EE877A136B136BC3F3064306EE903AD4 +:101E0000136BF8EEE66A76EE866A87EEA67AFCEE4B +:101E1000C77A17EE900A05B030BD1B6BDFED1B5A79 +:101E2000C3F3080307EE103AB8EEC77A77EE277AC5 +:101E300077EE867A85EEA67AD9E71B6BDFED145A2A +:101E4000C3F3080307EE103AB8EEC77A77EE277AA5 +:101E500077EE867AEEE71B6BDFED0E5AC3F30803CD +:101E600007EE103AB8EEC77A77EE277A77EE867AE1 +:101E7000E0E710F00060CED001A8FEF761FE039805 +:101E8000C9E700BF004402580090D0030024744A00 +:101E900020BCBE4B0024744C044B0122D3E84F0FEE +:101EA000C3E8412FC0B20029F8D17047391000248F +:101EB00007B504460091CDF804E0FFF7EDFFDDE93A +:101EC000001210B920460CF0E1FB0CF091FF00006D +:101ED0001FB5002304460362064B0093031D6846AA +:101EE00002931C2303930B23019310F071FD2060D8 +:101EF00004B010BD4795010810B50446802112F0CA +:101F0000C2FB00212046BDE8104012F0BCBB08B562 +:101F1000026500220B4600F13C0142654FF48072DD +:101F2000836482870269012AD2B208BFC364006851 +:101F3000FEF7DAFC002008BD08B5C0F81022002228 +:101F40000B4600F5FE71C0F81422A0F8FC210269CE +:101F5000C0F80832012AD2B208BFC0F80C320068BB +:101F6000FEF7C2FC002008BD84B02DE9F041044614 +:101F700007ADDDE90C7885E80E000CF029FB636BFA +:101F800023B994F838300BB10CF0FAFA04F12806B2 +:101F900095E80F0086E80F0020460CF059FFA06975 +:101FA000C4E908780CF0C6FCC219204641EB0803CE +:101FB0000CF094FFBDE8F04104B00CF0F5BA00005D +:101FC00010B586B004466846039180E80C0006A868 +:101FD00000E90C0010E90700034B84E807002046E5 +:101FE000E36006B010BD00BF89C500080D4B19881D +:101FF0004FF6FD734A1E92B29A4297BF0A4B4FF0BA +:10200000026303EA812303F10063834207D9B0F13D +:10201000006F34BF4FF0FF304FF4003070474FF087 +:10202000FF30704780E8F11F00FC3F00064B4FF681 +:10203000FD711A88531E9BB28B429ABF034800EA77 +:1020400082204FF40010704780E8F11F00FC3F0031 +:1020500038B50E4B0D46044603600023C0E901313C +:10206000012303730A480DF0D9FD0CF0F7F855B1C0 +:10207000084B1A681C60626005480DF0CFFD0DF03A +:102080004DF9204638BD6560F6E700BF949A010817 +:102090008C0F0024880F0024034653E8000F0138FA +:1020A00043E80002002AF8D170470000074B5A6845 +:1020B00090235343064AD358DA69120701D5082200 +:1020C0001A62D869C0F34010704700BF6C12002438 +:1020D000101300242DE9F84FFF270646D0F80080A2 +:1020E00004253C464FF6FF79B169002972D040467D +:1020F00007F0DBFB0546002855D1F0690378002B7B +:102100006BD0C27AE52B02F03F02B27150D02E2B79 +:102110004ED022F0200108294AD00F2A4DD159066D +:1021200044D503F0BF043369477BF362437BBB4272 +:102130003ED1C27E837E43EA02230FFA83FCBBBBFF +:1021400003780D22D8F81050012123F04003DFF866 +:1021500090E0013B53431EF801AB00EB0A0292F8FA +:1021600001B010F80A2042EA0B2219B3FF2B1FD846 +:1021700025F81320114601330CF1010CBCF10D0FB1 +:10218000E9D10278520605D521B1FF2B10D80022E3 +:1021900025F81320013CE4B20021304608F086FE09 +:1021A00005460028A0D00023B3610CE0A342BDD0B7 +:1021B000FF24F1E74A45DFD0FAE73CB907F066FBB8 +:1021C000B84203D100252846BDE8F88F4FF0FF3311 +:1021D000F362F8E7002DF5D0E5E70425E3E700BF5B +:1021E0001099010808B503480DF018FDBDE8084036 +:1021F0000DF094B8B40F00242DE9F04F87B00646D7 +:102200008B4617464FF001090DF1170ADDE910451D +:102210002544A3EB0408AC4201D1012011E008EBF6 +:10222000040300225946304600933B46CDE901A9FC +:1022300005F011FC28B914F8013B9DF817209A42CB +:10224000E9D007B0BDE8F08F2DE9F04F89B0064620 +:102250008846DDF84C9005924BB94FF0FF32C9F833 +:102260000020149A0020136009B0BDE8F08F013BF4 +:1022700007A900684FF0040A079305F0CFFB12A9E5 +:10228000054630680DF1140B05F0C8FB0746AF4258 +:10229000059B03D3C9F80030129BE2E7EC1B95FACB +:1022A000A5F241463046B4FA84F4B2FA82F2C4F19F +:1022B0001F04944228BF1446A200CDE901BA00923F +:1022C000002205F0C8FB0028CED1012303FA04F454 +:1022D0002D1BDCE7034B596A5A6A521A8242FBD320 +:1022E000704700BF000C0040C069C0F38010704709 +:1022F00038B5431C0C4629D000F00F021D4BC0F32B +:10230000031053F82250FFF737FA1B491B4BD1F843 +:1023100094209A42FBD105FB05F2016802EB4203CF +:102320000B40B3FBF2F3013B012B19D8E31E022B48 +:1023300043680CD82B43032C436019D10122294652 +:10234000FEF722FA0C4B4FF440725A6138BD23EA73 +:102350000503012C4360F1D0022C07D00022EEE7E8 +:1023600004F0FD03012BE9D0052CF5D10222E6E7AC +:10237000052CF2E7C49A01080064025800030080AB +:102380002DE9F843461C05460C4600F09C801FFAD8 +:1023900080F9554A40F47061B2F90030581C4BD1B5 +:1023A0000026524B09F00F02C5F3031053F82270B8 +:1023B000FFF7E2F94E494F4BD1F894209A42FBD1F6 +:1023C00007FB07FCC4F3831283680CEB4C0E0F2A47 +:1023D0006FEA0E0114BF02FB0CF243EA0E034FF446 +:1023E000407E1CBF0B40134304F007028360022AA7 +:1023F0003F4BC3F814E036D10EF1004ED3F8948071 +:10240000F045FBD119F0080FC4F383285DD03B0AD7 +:10241000D0F824E05B435B43C3EB031903FB08F3F1 +:102420002EEA090E4EEA03034362314B4FF4407E1D +:10243000C3F814E002231EE043F470638B4210D112 +:1024400004F003035668032BABD109F47063B3F5B2 +:10245000706FA6D1324621462846BDE8F843FEF704 +:102460007FB9083298E7032A3CD002F1FF3EDEF143 +:10247000000343EB0E03DFF87890DFF878E0D9F83B +:102480009480F045FBD1D0F800E003FB0CFC013A4E +:1024900001EA0E01012A41EA0C01016005D84368F6 +:1024A00022074CBF3B43BB434360C4F30112394690 +:1024B000FEF76AF9324621462846FEF751F90C4BE1 +:1024C0004FF440725A61BDE8F8830CFB0CF9036AC3 +:1024D000C9EB091E23EA0E0E09FB08F34EEA0303BB +:1024E0000362A2E71346C6E798970108C49A010859 +:1024F000006402580003008000280DDB430901221C +:1025000000F01F00203302FA00F0044A42F82300D2 +:10251000BFF34F8FBFF36F8F704700BF00E100E044 +:1025200010B50CF055F8124B1A7842B9114A1268DE +:1025300011680907FCD50821516001221A700E4C60 +:1025400023781BB10BF0ECFF0023237000230B4A10 +:102550008C2013700A4A1370FFF7CEFF094B4FF41B +:102560008052BDE81040C3F890210CF01DB800BFA8 +:1025700031100024040E00246912002438100024B5 +:102580003010002400E100E0FFF7CABF10B50CF0E6 +:102590001FF8134B1348144A596A146803881160D2 +:1025A0001B1B0B440146B3F5803F16D34FF47A71E1 +:1025B000B3FBF1F201FB1233038006E00132A3F515 +:1025C0007A73B3F57A7FF9D20B80084C23681A44EA +:1025D00022600BF0E9FF206810BD0022F1E700BF88 +:1025E000000C0040581000245C10002490120024BD +:1025F00038B5114CE36803F00703062B06D0E068FA +:1026000000F03F00163818BF012038BDE36823F002 +:102610003F0343F01603E360FFF7B8FF0546636826 +:102620009B0401D50020F0E7FFF7B0FF401BB0F599 +:102630007A7FF4D90120E8E7004802582DE9F843F1 +:102640000546294F3C69FFF7A1FF022D0646274B9F +:1026500026D1D7F81041264F1C4044F00044DFF843 +:1026600088804CF25039042F1DD1D8F81000C0F3E7 +:10267000800070B934F0004122D01E4A002C9369CA +:1026800043EA04039361184B17DB5C610120BDE84A +:10269000F883FFF77BFF801B4845E4D90320F6E76A +:1026A0001C400427DBE7D8F8103127EA030313F0B6 +:1026B000040F0CBF01200020DBE7C3F81411E5E78D +:1026C000012D094B06D11A69D103E0D54FF48032B0 +:1026D0005A61DCE7D3F81021D203D8D54FF4803209 +:1026E000C3F81421D3E700BF002000520000EE170A +:1026F000040000803C10002470B504460D461646C8 +:102700002368DB6935EA030301D1002017E0FFF7F6 +:102710003DFF801B2368B0F1007F1A6810D322F4BC +:10272000D0721A609A6822F001029A602023C4F8DD +:102730008430C4F888300023032084F8803070BDD2 +:102740005107DDD5DA691205DAD54FF400621A6255 +:102750001A6822F4D0721A609A6822F001029A6014 +:102760002023C4F88430C4F88830C4F88C30E2E701 +:1027700038B50B4C2268D36823F0A003D360FFF771 +:1027800005FF05462368DB689B0601D5002038BDA0 +:10279000FFF7FCFE401BB0F57A7FF3D90320F6E784 +:1027A000400E002408B5104BDA6822F04002DA60CF +:1027B0009A68920607D4FFF7DBFF18B103200B4B92 +:1027C00083F8210008BD9A6822F020029A60FFF782 +:1027D000CFFF18B10320054B83F82100024A93680C +:1027E00043F020039360EDE700400058400E0024C2 +:1027F000F8B50F4D2B68DC6814F0400416D14FF08B +:10280000FF320327DA60FFF7C1FE06462B68DB685C +:102810005B0601D52046F8BDFFF7B8FE801BB0F57A +:102820007A7FF3D9032485F82170EFE70024F1E7DC +:10283000400E00242DE9F74F06463C250BF0C8FE5C +:102840004FF0180A4FF0070E6A4C6B4B4FF0460BD7 +:10285000B6FBF5F7B7FBF5F5B5FBFAFC0CF1040296 +:102860002360B2FBFEFECEEBCE0EA2EB0E091BF0F8 +:10287000030F07D1BCF5B77F0BD3ACF5B77C0BF1D9 +:10288000010BF4E7BCF5B67F1FD96FF4B6739C4417 +:10289000F5E70123594830214FF0000800FB0CFAFE +:1028A000574801FB030151F8042B92450FD208F160 +:1028B000FF38B9F1000F94F8201008BF4FF0070956 +:1028C00001290CD14F480CF0B3FA0023E2E708F1DC +:1028D0000108B8F10C0FE6D14FF00B08E9E70C2125 +:1028E00001FB0383012184F82010022150F82330DA +:1028F000CA2084F82110404901934862532048625D +:10290000FFF776FF019B00BBAAEB03003B4B22685D +:10291000B0FBF3F00130C0B2FEF75EF840EA493197 +:10292000ABF14400C0B2FEF757F841EA004108F1AC +:102930000100C0B2FEF750F841EA002323F07F43C4 +:1029400023F0C0035360FFF72DFF2368FF225A6274 +:1029500000284BD1012284F8212084F82020022273 +:1029600084F82120CA225A6253225A62FFF740FF9C +:1029700050BB226893681823B5FBF3F003FB10509B +:102980003C25C0B2FEF728F80146B7FBF5F005FB81 +:102990001070C0B2FEF720F80302B6FBF5F005FB9D +:1029A000106043EA0141C0B2FEF716F8084300F098 +:1029B0007F3020F0FE401060936823F48023936002 +:1029C00093689360FFF7EEFE2368FF225A6210B906 +:1029D000012384F82130002384F8203008B10A480C +:1029E00071E703B0BDE8F04F0BF0DEBD002384F8C3 +:1029F000203067E7400E002400400058805101005D +:102A0000049B01086195010878950108F8B53A4CD6 +:102A100006460D46A36A03F00303032B69D023681F +:102A200023F080532360FFF7B1FD074623689A0027 +:102A30004BD4A36A326823F07C7343EA0253A36247 +:102A4000B368F268013B013A5B0212049BB202F4E4 +:102A5000FE0213437268013AC2F30802134332695B +:102A6000013A120602F0FE4213432364E36A7269DC +:102A700023F440631343E362E36AB26923F400730F +:102A80001343E362E36A23F48073E362636CF269E5 +:102A900023F47F4323F0F80343EAC2036364E36A49 +:102AA00043F48073E362E36AB5B943F48003E362FD +:102AB000114C236843F080532360FFF767FD054600 +:102AC00023689B000FD5002005E0FFF75FFDC01BCA +:102AD0000228ABD90320F8BD012D0CBF43F400033D +:102AE00043F08073E3E7FFF751FD401B0228E7D96D +:102AF000F0E70120EFE700BF00440258F8B53A4C78 +:102B000006460D46A36A03F00303032B69D023682E +:102B100023F080632360FFF739FD074623681A011D +:102B20004BD4A36A326823F47C3343EA0233A362B2 +:102B3000B368F268013B013A5B0212049BB202F4F3 +:102B4000FE0213437268013AC2F30802134332696A +:102B5000013A120602F0FE421343A363E36A72696C +:102B600023F0C0031343E362E36AB26923F0200356 +:102B70001343E362E36A23F01003E362E36BF26959 +:102B800023F47F4323F0F80343EAC203E363E36AD9 +:102B900043F01003E362E36AB5B943F40023E36250 +:102BA000114C236843F080632360FFF7EFFC054678 +:102BB00023681B010FD5002005E0FFF7E7FCC01BD1 +:102BC0000228ABD90320F8BD012D0CBF43F48013BC +:102BD00043F40013E3E7FFF7D9FC401B0228E7D9D1 +:102BE000F0E70120EFE700BF004402582DE9F04173 +:102BF000DDF8188004460E4615461F462268936885 +:102C0000334214BF01230023AB4201D1002012E064 +:102C1000B8F1FF3FF3D0FFF7B9FCC01B404502D825 +:102C2000B8F1000FEAD10423012084F84130636C2D +:102C300043F001036364BDE8F0812DE9F04F0546E0 +:102C400085B00C46FFF7A2FC95F8402007EE900AED +:102C5000012A00F0E1800122022085F8402095F849 +:102C60004120012A40F0BE80002241F2883117EE57 +:102C7000903ACDED037A6A640091202185F84100F5 +:102C80002846FFF7B3FFDDED037A002840F0AA8065 +:102C9000D4F824C0BCF1000F03D0A26A2968013A1D +:102CA0000A61D4F818A0D4E90727BAF1000F50D070 +:102CB00063694CEA0A0AD5F800E026684FEA834BBC +:102CC000D4F83480D4E90B1967B3A36847EA0A0A39 +:102CD0002769CEF81C30BAB132431143E26841EAA9 +:102CE000090949EA080848EA0707174347EA0B07B2 +:102CF00047EA0A07CEF814706268CEF81820BCF1D3 +:102D0000000F40F0818062E0314341EA090949EA5D +:102D1000080848EA070747EA0B0747EA0A07CEF818 +:102D20001470ECE752B142EA06070F4347EA09077D +:102D300047EA0808E76848EA0707D7E746EA0107CD +:102D400047EA090747EA080747EA0B0B4BEA0A0775 +:102D5000E5E737B3A1684CEA0707D5F800E0266934 +:102D6000CEF81C106169D4F834808904D4E90BA929 +:102D70006AB13243E36842EA0A0A4AEA090949EABF +:102D8000080848EA030848EA01010F43B2E746EAA7 +:102D90000A0646EA090949EA080848EA01010F4318 +:102DA000BDE78AB1E16A4CEA02020A43216B0A4399 +:102DB000616B0A43E1680A43616942EA814229681A +:102DC0004A6162688A619AE7BCF1000F10D141F252 +:102DD000883217EE903A0221284600920122FFF72E +:102DE00005FFA8B1002385F8403005B0BDE8F08F9D +:102DF000E36A226B4CEA03031343626B1343626979 +:102E000043EA82432A685361012385F84130E9E7A8 +:102E10002B680222DA60F7E70220E6E7F0B593B00C +:102E200004460846164604A91D46FEF7FBFB48B9B2 +:102E30002B6804A920460E93FFF7FFFE074618B142 +:102E40004FF0FF3013B0F0BDFFF7A0FB256803463D +:102E5000A96994F84020012AF2D0012284F8402088 +:102E600094F84120012AD0B246D16764002E3ED0AA +:102E7000222284F841202A690132A2632A6926634A +:102E800041F28836013262636A6922F0406242F0A0 +:102E900080626A61A961A26BA2B901220221204667 +:102EA0000096FFF7A3FE10B923680222DA6001231F +:102EB00084F841300023C01A84F8403018BF012044 +:102EC0004042BFE701220621204600960393FFF708 +:102ED0008DFE0028EBD195F82010226B039B11701A +:102EE000226B01322263A26B013AA263D3E7636CC7 +:102EF00043F008036364DDE70220DBE7F7B50093E6 +:102F0000054690F8943014460191DDE90867F3B165 +:102F1000D6B13B68DBB10DF009F823462846DDE960 +:102F200000210CF023F93B46324605F16801281DCB +:102F3000FFF774FF041E284618BF012464420CF0FA +:102F4000EBFF204603B0F0BD6FF00104F9E74FF04E +:102F5000FF34F6E7F0B593B004460846164604A9D8 +:102F60001D46FEF75FFB48B92B6804A920460E9367 +:102F7000FFF763FE074618B14FF0FF3013B0F0BD06 +:102F8000FFF704FB94F8402003462568012AF3D09C +:102F9000012284F8402094F84120012AD0B243D184 +:102FA0006764002E3BD0122284F841202A69013246 +:102FB000E2622A69666241F288360132A2626A6977 +:102FC00022F040626A61E26AA2B90122022120462F +:102FD0000096FFF70BFE10B923680222DA60012386 +:102FE00084F841300023C01A84F8403018BF012013 +:102FF0004042C3E701220421204600960393FFF7D5 +:10300000F5FD0028EBD1626A039B127885F8202039 +:10301000626A01326262E26A013AE262D3E7636C99 +:1030200043F008036364DDE70220DBE72DE9F047A6 +:103030001C4690B090F894300546DDF86890DDE9C4 +:1030400018A8CDE9002163B30CF070FF4FF0FF33F7 +:1030500028462E1D05F16807DDE900210CF086F8F1 +:1030600014B1BAF1000F23D1B8F1000F02D0B9F1B9 +:10307000000F19D102A93846FEF7D4FA044638B930 +:10308000012302A9CDE90B033046FFF7D6FD08B1B5 +:103090004FF0FF3428460CF03FFF204610B0BDE84B +:1030A000F0874FF0FF34F8E79CB1BAF1000F10D071 +:1030B000224602AB39463046CDF808A0FFF74AFF5A +:1030C00004460028E4D1B8F1000FE3D0B9F1000FB5 +:1030D000E0D002AB424639463046CDF80890FFF7C3 +:1030E0009DFE041E18BF01246442D3E770B50E464E +:1030F00004460809FEF740FB4FF470710546304660 +:10310000FFF73EF9238A0A4A06F00F0603F00F0381 +:103110000121656152F8233001FA06F6A36105F139 +:103120001003183526606360C4E9025570BD00BF06 +:10313000C49A010810B50C4B0C4CD4F894209A4258 +:10314000FBD1D0E90542524302EB4203DB4339B9DC +:103150002268134023604FF44072044B5A6110BD43 +:1031600021680B401343F5E7000300800064025818 +:10317000034BD9681A6822EA01021A605960704745 +:1031800000650258444A1369114603F03803102BB6 +:1031900030B57CD005D8002B55D0082B79D00A68E3 +:1031A00052E0182BFBD1906A956AD16A15F47C7FA6 +:1031B000C5F30513546B3BD007EE903AC4F3CC042F +:1031C00001F0010300F00300F8EEE76A6343012811 +:1031D000F7EE005A07EE903AFAEEE97A39D0022873 +:1031E00047D011682D4BC1F3C101126BCB40C2F324 +:1031F000080207EE103AB8EEC76A86EE267A06EEA7 +:10320000902AF8EEE66A76EEA77A77EEA57A224B58 +:1032100067EE877A1B6BC3F34623013307EE103A40 +:10322000F8EEC76A87EEA67AFCEEC77A17EE903AF8 +:1032300019498A698969C2F3032219498A5CD34012 +:10324000184A136030BD1268C2F3C102134BD34059 +:10325000EEE7136B9FED146AC3F3080307EE103A11 +:10326000B8EEC77A77EE277A77EEA57A86EE267AD9 +:10327000CDE7136B9FED0D6AC3F3080307EE103A19 +:10328000B8EEC77A77EE277A77EEA57AEEE7084BA5 +:10329000CEE7084BCCE700BF004402580090D003B3 +:1032A00004970108000000240024744A20BCBE4B8F +:1032B00040787D0100093D002B4BD3F8882042F473 +:1032C0007002C3F888201A6942F010021A61274A76 +:1032D000136803F00F03062B05D8136823F00F03C0 +:1032E00043F007031360224B1A6842F001021A6090 +:1032F00000221A611F4A19680A401C491A600A68AC +:10330000120705D50A6822F00F0242F007020A6090 +:10331000002219499A61DA611A6299621749D962E1 +:10332000174919635A639963DA6319645A6419680F +:1033300021F4802119601A66124A536A43F48043CB +:103340005362114B1B681B0C1B04B3F1005F02D2CC +:103350000E4B01221A600E4B43F2D2021A600D4A44 +:10336000014B9A60704700BF00ED00E00020005262 +:10337000004402587FEDF6EA000202020000FF015D +:1033800080020101C00000580010005C088100515B +:1033900000400052000000080A4B013B0FD00269B8 +:1033A000002AFADA0369074A43F001030361013A8C +:1033B00005D0036913F00103F9D1184670470320C3 +:1033C000704700BF410D030030B5056C00F5306358 +:1033D0000F4CA54203D9D0F8004B002C16DB00247B +:1033E00001291C611C6944F400241C611C6944F01F +:1033F00018041C611C6944F0C0441C6106D15A6168 +:10340000D0F8003B43F08023C0F8003B002030BDE3 +:103410000A30544FD0F8003E23F00303C0F8003EBA +:10342000D0F8043843F00203C0F804380020704795 +:1034300070B50023940800F5805502F00302A34202 +:1034400014D301EB84017AB100F5805000230468A5 +:10345000D80024FA00F0C854013398B28242F7D160 +:10346000013A92B201321144084670BD2E6841F80B +:1034700023600133E3E770B50E78012500F50062A3 +:1034800006F00F0374019D404B78012BD36917D1CF +:103490001D4300F51060D56103591A040ED48A68E3 +:1034A0000559C2F30A03CA782B4343EA824343EA2D +:1034B000865343F0805343F400430351002070BD12 +:1034C00043EA054500F53060D56103591B04F5D486 +:1034D0008B680259C3F30A031343CA7843EA824351 +:1034E000E7E70000114B4FF4FA5102461B68B3FBAB +:1034F000F1F141F288334B43013B13D3516B11F08F +:10350000450FF9D08904F7D4536B5B0702D504202B +:1035100090637047506B10F0010014BF0123044BFF +:10352000936370474FF00040704700BF00000024D5 +:10353000C5002000454B10B51B6804464FF4FA50F7 +:10354000B3FBF0F342485A43002A48D0636B03426E +:1035500007D09B0405D4636B580704D50420A063EF +:1035600010BD013AF0E7606B10F0010002D00123BA +:10357000A363F5E7374BA3632369DBB2994231D1EB +:103580006369354818400028EAD0002B2CDB5A002C +:103590002DD49C002DD4D9002DD41A012ED45C0139 +:1035A0002FD4D90130D41A0231D45C0232D499021A +:1035B00033D4DA0234D45C0335D4990336D4DA0335 +:1035C00037D41C0438D4590439D49A043AD413F0AB +:1035D000080F14BF4FF400004FF48030C0E74FF0E5 +:1035E0000040BDE70120BBE74FF00070B8E7402086 +:1035F000B6E78020B4E74FF48070B1E74FF4007075 +:10360000AEE74FF48060ABE74FF40060A8E74FF4FB +:103610008050A5E74FF40050A2E74FF480409FE7A9 +:103620004FF400409CE74FF4003099E74FF48020BE +:1036300096E74FF4002093E74FF4801090E74FF4A3 +:1036400000108DE74FF480008AE700BF00000024DF +:1036500045002000C500200008E0FFFDF0B5124D38 +:1036600087B00D2700246B6C01A92E681B0430461F +:1036700001934FF48073CDE902734FF48053CDE989 +:103680000443FEF745FB41F2883239463046FFF7E6 +:1036900051FF28B92B685C69C4F3432007B0F0BD23 +:1036A0006B6B18436863F7E79412002430B54FF44E +:1036B000807387B0062500220446019101A9CDE957 +:1036C00002534FF48053CDE90423FEF721FB41F26E +:1036D000883229462046FFF72DFF07B030BD30B5B0 +:1036E0004FF4807387B0372500220446019101A969 +:1036F000CDE902534FF48053CDE90423FEF708FBD4 +:1037000041F2883229462046FFF714FF07B030BD4A +:1037100010B5002386B0044601A9CDE90133CDE9F7 +:1037200003334FF480530593FEF7F2FA0A4B4FF43C +:10373000FA521B68B3FBF2F241F288335343013B68 +:1037400007D3626B1206FAD5044B0020A36306B0C0 +:1037500010BD4FF00040FAE700000024C500200033 +:1037600030B5002387B00C254FF48072044601A9C0 +:10377000CDE90323CDE901354FF480530593C368A8 +:1037800043F08003C360C36823F04003C360FEF7C7 +:10379000BFFA074A29462046FFF7CCFEE368B0F19E +:1037A000007F08BF002023F08003E36007B030BD36 +:1037B00000E1F50530B54FF4807387B01025002285 +:1037C0000446019101A9CDE902534FF48053CDE99C +:1037D0000423FEF79DFA41F2883229462046FFF77E +:1037E000A9FE07B030BD00002DE9F047364D86B088 +:1037F0000746FEF7CBFE082180462868FFF7DAFF70 +:103800000446002837D1696C28680904FFF767FF70 +:10381000044680BB2E684FF0FF334FF0330901A9F7 +:10382000736208230190B362F36A0490304623F078 +:10383000FF0343F03303F3624FF48073CDE9029347 +:103840004FF480530593FEF763FA41F288324946FC +:103850003046FFF76FFE044668B98146064640F2DF +:103860002A5A2B685A6B12EA0A0F5A6B07D01107B3 +:1038700016D508249C63204606B0BDE8F0871003E7 +:1038800005D424B9D3F880600124D3F88090FEF7E2 +:103890007DFEA0EB08000130E3D14FF00044EAE7E1 +:1038A0005A6B920701D50224E4E75C6B14F0200404 +:1038B00001D02024DEE7054A36BA9A6399FA89F3E3 +:1038C0007E603B60D7E700BF941200243A0F0018D7 +:1038D0002DE9F8430668054616F0006609D0836EA8 +:1038E000B3F5001F2ED013D8F3B1B3F5801F21D04C +:1038F00001262B68DB0540F10281AB6D042B00F241 +:10390000FD80DFE813F024002B00F50029002900DA +:10391000B3F5401FECD1B84A0026A96E136D23F40D +:1039200040130B431365E4E7B34AD36A43F400330F +:10393000D362F0E702210430FFF7E0F806460028E2 +:10394000D7D1E8E702212430FFF760F8F6E7AA4A6A +:10395000D36A43F40033D362344604E00021281DC7 +:10396000FFF7CCF80446002C40F0CB80A24AA96DAA +:10397000136D23F007030B4313652B689F050DD5CB +:10398000EB6D802B00F0DA8000F2BD80002B00F0A0 +:10399000C980402B00F0CC80012634462B685805A6 +:1039A00010D5D5F8A830B3F5800F00F0EC8000F208 +:1039B000CD80002B00F0DB80B3F5001F00F0DD8030 +:1039C000012634462B68190510D5D5F8AC30B3F173 +:1039D000007F00F0FD8000F2DE80002B00F0EC8024 +:1039E000B3F1807F00F0EE80012634462B689A0107 +:1039F0000DD5AB6C202B00F0078100F2F180002B7D +:103A000000F0F180102B00F0F980012634462B687D +:103A1000DB040FD52B6EB3F5005F00F0198100F2C7 +:103A2000FB80002B00F00881B3F5805F00F00A8175 +:103A3000012634462B689F040FD56B6EB3F5003F0B +:103A400000F0268100F20C81002B00F01281B3F50A +:103A5000803F00F01781012634462B68580410D5AA +:103A6000D5F8B030B3F1005F00F0338100F2188177 +:103A7000002B00F01E81B3F1805F00F0248101264D +:103A800034462B68590114D5EB6C43B1B3F5807FF4 +:103A900040F027810121281DFFF730F80446002C53 +:103AA00040F02281544AE96CD36C23F480730B43B9 +:103AB000D3642B681A040DD52B6FB3F1805F00F02F +:103AC0001581B3F1005F00F01F81002B00F013811E +:103AD000012634462B68DB0140F12C816B6C032BF3 +:103AE00000F26C81DFE813F01D01180164011D0173 +:103AF000002105F12400FEF789FF33E70126344653 +:103B00003BE7264639E7C02B03D0B3F5807F7FF42F +:103B100043AFCCB9384AE96D136D23F4E0730B431E +:103B200013653BE7344AD36A43F40033D362F0E7CA +:103B30000021281DFEF7E2FF0446EAE7002105F117 +:103B40002400FEF763FFF7E7264627E7B3F5C00F2B +:103B500003D0B3F5000F7FF433AFD4B9264AD5F8BC +:103B6000A810936D23F460030B4393652AE7224A60 +:103B7000D36A43F40033D362EFE70021281DFEF738 +:103B8000BDFF0446E9E7002105F12400FEF73EFFF2 +:103B9000F7E7264616E7B3F1407F03D0B3F1806F15 +:103BA0007FF422AFD4B9144AD5F8AC10936D23F04A +:103BB000E0630B43936519E70F4AD36A43F400337C +:103BC000D362EFE70021281DFEF798FF0446E9E7DE +:103BD000002105F12400FEF719FFF7E7264605E767 +:103BE000302B7FF412AFACB9034AA96CD36C23F02D +:103BF00030030B43D3640AE7004402589B4AD36A5C +:103C000043F40033D362EEE70221281DFEF776FF6E +:103C10000446E8E72646FAE6B3F5405F03D0B3F57D +:103C2000804F7FF405AFCCB9904A296E136D23F411 +:103C3000E0430B431365FDE68C4AD36A43F400333B +:103C4000D362F0E70021281DFEF758FF0446EAE79B +:103C5000002105F12400FEF7D9FEF7E72646E9E644 +:103C600023F48032B2F5802F03D0B3F5403F7FF4C8 +:103C7000F2AE9CB97D4A696E136D23F4E0230B43C9 +:103C80001365EAE60121281DFEF738FF0446F0E738 +:103C9000012105F12400FEF7B9FEF7E72646DCE630 +:103CA00023F08052B2F1804F03D0B3F1405F7FF434 +:103CB000E6AEA4B96D4AD5F8B010936D23F0E04399 +:103CC0000B439365DDE60121281DFEF717FF04462F +:103CD000EFE7012105F12400FEF798FEF7E72646FD +:103CE000CFE601263446E4E62646E2E65F4AD36A9A +:103CF00043F40033D3626CB95C4A296F136D23F02F +:103D000040530B431365E5E60121281DFEF7F6FE3F +:103D10000446F0E72646DDE6544AD36A43F400330E +:103D2000D362002C4DD1514A696CD36C23F003034C +:103D30000B43D3642B685F024DD54D4F3B6843F472 +:103D400080733B60FEF722FC80463B68D8053AD57D +:103D5000002C6CD1454BD5F8B4001A6F424012F4D8 +:103D6000407F0BD01A6F196F22F4407241F48031FA +:103D70001967196F21F4803119671A67B0F5807FD0 +:103D800040D0D5F8B430394903F44072B2F5407FE1 +:103D900049D10869374A20F47C5002EA13120243E1 +:103DA0000A61C3F30B03314A116F0B43136712E02F +:103DB0000221281DFEF7A2FE0446B2E70126344682 +:103DC000B8E72646B6E7FEF7E1FBA0EB080064285B +:103DD000BBD9032634462B68DA0708D5EB6F102BC6 +:103DE0003CD026D85BB3082B32D0012634462B6852 +:103DF0009B074ED5AB6F052B61D8DFE803F0423D42 +:103E00005A424242FEF7C2FBDFF86080074641F2A9 +:103E10008839D8F870309907B3D4FEF7B7FBC01BC8 +:103E20004845F6D9D5E70A6922F47C52B8E7264618 +:103E3000D1E723F00802202A01D0182BD5D19CB954 +:103E40000A4AE96F536D23F038030B435365CEE7FD +:103E50000121281DFEF752FE0446F0E7012105F17D +:103E60002400FEF7D3FDF7E72646C0E700440258DA +:103E700000480258CFFFFF000121281DFEF73EFE3B +:103E80000446FCB9B74AA96F536D23F007030B43EF +:103E900053652B685F0727D5D5F89430052B00F2C2 +:103EA0003A81DFE813F01600110032011600160007 +:103EB0001600012105F12400FEF7A8FDE0E7012628 +:103EC0003446E6E72646E4E70121281DFEF716FE04 +:103ED0000446002C40F02281A24AD5F89410936D3C +:103EE00023F007030B4393652B68980610D5D5F88C +:103EF0009030B3F1005F00F02C8100F21181002BB3 +:103F000000F01781B3F1805F00F01D810126344677 +:103F10002B68590610D5D5F89C30B3F5006F00F02A +:103F20003C8100F22181002B00F02781B3F5806FE6 +:103F300000F02D81012634462B681A0610D5D5F8DD +:103F4000A030B3F5804F00F0498100F22E81002BA4 +:103F500000F03481B3F5005F00F03A810126344669 +:103F60002B681B0714D5D5F88430B3F5805F07D1D3 +:103F7000022105F12400FEF749FD002818BF0126A3 +:103F8000784AD5F88410536D23F440530B4353659E +:103F90002B68DF0614D5D5F89830B3F5807F07D1AC +:103FA000022105F12400FEF731FD002818BF01268B +:103FB0006C4AD5F89810936D23F440730B439365C6 +:103FC0002B6818031AD5D5F8A410B1F5803F00F07E +:103FD0000D81B1F5003F06D0002940F00D81281D6C +:103FE000FEF78CFD0446002C40F009815D4AD5F8AF +:103FF000A410936D23F440330B4393652B6859034E +:104000001CD5D5F88830B3F5001F00F0FA80B3F561 +:10401000401F08D0B3F5801F40F0FA80514AD36AA0 +:1040200043F40033D362002C40F0F5804D4AD5F8BC +:104030008810536D23F440130B4353652B68DA0348 +:1040400009D52B6D002B00F0E880B3F5803F00F020 +:10405000F280012634462B689B0007D5022105F12A +:104060002400FEF7D3FC002818BF01262B689F030D +:104070000BD5D5F88010B1F5807F00F0F28000F20A +:10408000E280002900F0E5800126DC0206D53549F2 +:10409000686F0A6D22F0004202430A65D80007D516 +:1040A0003049D5F8B8000A6922F4804202430A6117 +:1040B000990206D52B49E86E0A6D22F08072024300 +:1040C0000A655A0009D5274A116921F40041116196 +:1040D0001169D5F8BC0001431161002B06DA2149B2 +:1040E000686DCA6C22F040520243CA641B0207D5B5 +:1040F0001C4AD5F88C10536D23F440030B435365D1 +:10410000301E18BF0120BDE8F883012105F124000D +:10411000FEF77CFCDCE601263446E5E62646E3E6CF +:1041200023F08052B2F1804F03D0B3F1405F7FF4AF +:10413000EDAEA4B90B4AD5F89010536D23F0E043CF +:104140000B435365E4E60021281DFEF7D7FC044627 +:10415000EFE7022105F12400FEF758FCF7E72646B9 +:10416000D6E600BF0044025823F48062B2F5805FB7 +:1041700003D0B3F5406F7FF4DDAEA4B93D4AD5F866 +:104180009C10936D23F4E0530B439365D4E6002118 +:10419000281DFEF7B3FC0446EFE7022105F12400D9 +:1041A000FEF734FCF7E72646C6E623F40052B2F5E4 +:1041B000004F03D0B3F5C04F7FF4D0AEA4B92D4A61 +:1041C000D5F8A010936D23F460430B439365C7E6C5 +:1041D0000021281DFEF792FC0446EFE7022105F1BD +:1041E0002400FEF713FCF7E72646B9E6022105F1A5 +:1041F0002400FEF70BFCF5E601263446FEE62646D3 +:10420000FCE6012105F12400FEF700FC04460AE764 +:104210000126344612E7264610E7164AD36A43F4CD +:104220000033D3626CB9134A296DD36C23F4803305 +:104230000B43D3640FE70221281DFEF75FFC044601 +:10424000F0E7264607E721F48072B2F5007F7FF49D +:104250001BAF64B90748426D22F440720A434265BD +:1042600013E70448C26A42F40032C262F1E726460C +:104270000BE700BF004402583F230360114B1A694B +:1042800002F0070242609A6902F4706282609A69E1 +:1042900002F00F02C2609A6902F070020261DA69EC +:1042A00002F070024261DA6902F4E06282611B6A24 +:1042B00003F07003C361044B1B6803F00F030B6032 +:1042C000704700BF0044025800200052484B1A6952 +:1042D00002F03802102A30B500F08680182A0CD07F +:1042E000002A40F083801A68424812F0200F03D061 +:1042F0001B68C3F3C103D84030BD996A9D6ADA6A6E +:1043000015F47C7FC5F305105C6BF5D0C4F3CC04C9 +:1043100002F0010207EE900A01F003016243B7EEDA +:10432000006AF8EEE76A012907EE902AFAEEE97AC8 +:104330004CD002293CD0002948D11A68920627D5D2 +:1043400019682C4AC1F3C1011B6BCA40C3F30803AF +:1043500007EE102AF8EEC75A85EEA67A06EE903AD6 +:10436000F8EEE66A76EEA77A77EE867A204B67EE6D +:10437000877A1B6BC3F34623013307EE103AF8EE3E +:10438000C76A87EEA67AFCEEC77A17EE900AB3E703 +:104390001B6BC3F3080307EE103AB8EEC77A77EE4B +:1043A000277A77EE867A9FED146A86EE267ADDE725 +:1043B0001B6BC3F3080307EE103AB8EEC77A77EE2B +:1043C000277A77EE867A9FED0D6AEEE71B6BC3F3D3 +:1043D000080307EE103AB8EEC77A77EE277A77EE41 +:1043E000867A9FED076AE0E7064885E7064883E797 +:1043F000004402580090D0030024744C20BCBE4BF3 +:104400000024744A40787D0100093D0008B5FFF79B +:104410005DFF0949094A8B69C3F30323D35C03F0A9 +:104420001F03D8408B6903F00F03D35C044A03F0E9 +:104430001F031060D84008BD0044025804970108CB +:104440000000002473B50E460446FFF7DFFFB0FB03 +:10445000F6F5FF2D47DCFFF7D9FFB0FBF6F101FBC6 +:10446000160606B9013D6560FEF790F894F8412004 +:10447000034612B941F28832A2642068A16802683A +:10448000013922F4706242EA0122202102602046B2 +:10449000A26C00920022FEF7A9FB30BB2268E569FE +:1044A000E36811682B43256A21F07F412B4365683F +:1044B00021F0D00143EA05630B4313605568D4E94A +:1044C00005310B43216943EA0143094929400B4364 +:1044D0005360136843F0010313600123606484F8A0 +:1044E000413002B070BDFF25BDE74FF0FF30F8E767 +:1044F000FEF8E0FF08B5FFF789FF054B054A1B6A88 +:10450000C3F30213D35C03F01F03D84008BD00BF00 +:10451000004402580497010808B5FFF777FF054BE0 +:10452000054ADB69C3F30223D35C03F01F03D840C1 +:1045300008BD00BF004402580497010808B5FFF702 +:1045400065FF054B054ADB69C3F30213D35C03F037 +:104550001F03D84008BD00BF00440258049701085B +:10456000894990202DE9F043D1E90035D1F8089030 +:104570004FF0000E6843854CB9F5965FD1F810C036 +:1045800004EB0002D1F814802CBF76460726A2F86F +:1045900056E089B0C2F81CE0A2F854E0A2F85EE050 +:1045A000A2F85CE0C2F820E0C2F864E0CF692350D2 +:1045B000C868C2F804909060C2F80CC0C2F81080BD +:1045C0009761C2E9096EB1F91AE0BEF1FF3F5FD110 +:1045D000082151616E4A934210D19022B9F5165FBD +:1045E00002FB054292F8801059D8012906D01968BB +:1045F00041F002011960002182F88010902202FB34 +:104600000541D1F884E0BEF1000F01D181F880E0CE +:1046100002FB0542242140EA0800C2F88410196810 +:10462000526921F0010110435A4A196019680A4081 +:10463000104318605A6822F4405242EA0C025A6051 +:104640009A6822F06E4222F4306217439F60DA6A61 +:1046500022F00F021643504A9342DE6225D14F4B9F +:104660005B6D03F03803282B00F284804C4AD35C46 +:10467000082B00F2B281082B7CD8DFE813F0D701B9 +:10468000DD017B007B00E0017B007B007B00E5011E +:10469000B1F9181001310CBF04210C2199E701294F +:1046A000ACD0196821F00201A4E73E4A934207D139 +:1046B0003A4B5B6D03F00703052B5BD83A4AD6E70C +:1046C0003A4A934207D1354B5B6D03F00703052B44 +:1046D00050D8374ACBE7374A934207D12F4B5B6D0F +:1046E00003F00703052B45D8334AC0E7334A93420A +:1046F00007D12A4B5B6D03F00703052B3AD8304AEC +:10470000B5E7304A934207D1244B5B6D03F0380381 +:10471000282B2FD82C4AAAE72C4A934207D11F4BAB +:104720005B6D03F00703052B24D8294A9FE7294A2C +:10473000934207D1194B5B6D03F00703052B19D882 +:10474000254A94E7124A934214D102F50E32936D32 +:1047500003F00703052B0DD82049CB5C102B00F08C +:10476000FF8009D8042B00F0F180082B00F0F380C3 +:10477000022B35D0012639E0202B00F02C81402B74 +:10478000F8D14FF40040F4E06C1200241013002420 +:10479000000C0058F369FFCF00100140004402589C +:1047A000CF96010800440040F896010800480040F8 +:1047B000F8960108004C0040F896010800500040AF +:1047C000F896010800140140CF96010800780040D7 +:1047D000F8960108007C0040F8960108FE96010852 +:1047E000FFF788FE002840F0C480002690224FF09A +:1047F0000113012E02FB05F204EB02018B664FF060 +:104800000003C1E91C3300F034818B6A002B66D0B1 +:10481000D80706D5A058C96A426822F400320A4374 +:1048200042609A0709D590226A43A158A0184A68A5 +:10483000006B22F4803202434A605F0709D5902260 +:104840006A43A158A0184A68406B22F480220243B0 +:104850004A60180709D590226A43A158A0184A68EF +:10486000806B22F4004202434A60D90609D59022A7 +:104870006A43A158A0188A68C06B22F48052024390 +:104880008A609A0609D590226A43A158A0188A68BE +:10489000006C22F4005202438A605F0613D5902216 +:1048A0006A43A158A0184A68476C22F48012B7F5F1 +:1048B000801F42EA07024A6005D14A68806C22F4F0 +:1048C000C00202434A60180609D590236B43E258A0 +:1048D000E1185368C96C23F400230B4353609027FD +:1048E0006F43E35904EB07085A6822F490425A6078 +:1048F0009A6822F02A029A601A6842F001021A604D +:104900000023C8F88C30FDF741FEE35902461B68CE +:10491000190700F1A38090236B43E3581B685B07E2 +:1049200007D54FF480014046FDF7E6FE002840F031 +:104930009F80902303FB05442023C4F88430C4F8EF +:1049400088300023E36684F8803092E002A8FCF708 +:10495000F7F8039846E705A8FCF74AF8069841E7F8 +:104960001368464813F0200F03D01368C3F3C10344 +:10497000D8404FF09009424B09FB05F904EB0901BF +:104980004A6AD1F8048033F8122008EB4801B0FBE2 +:10499000F2F38B42FFF4EEAEB3EB083F3FF6EAAE24 +:1049A0000023002114F046FD42460F0200230602B8 +:1049B00047EA10674FEA5800301847F1000114F039 +:1049C00039FD304BA0F540729A423FF6D3AE54F811 +:1049D0000930D86009E72C48CBE7202B39D0402B91 +:1049E00039D0102B7FF4C6AE284B24481A6812F039 +:1049F000200F03D01B68C3F3C103D84090236B433F +:104A0000E1184A684E6A1E4931F81610B0FBF1F001 +:104A100000EB5200B0FBF2F080B24FF6EF72A0F163 +:104A2000100191423FF6A6AEE358D2E7FFF786FDAC +:104A300000283FF4DAAEE1E7FFF76EFDF8E702A8E1 +:104A4000FCF77EF80398F3E705A8FBF7D1FF06987B +:104A5000EEE70D48D2E74FF40040CFE701904FF466 +:104A600000114046FDF748FE019A00283FF453AF7D +:104A70000326304609B0BDE8F08300BF0090D003A4 +:104A8000F8980108FFFC0F0000093D00004402589F +:104A900010B58AB0694602A8FFF7EEFBFFF74EFD9E +:104AA0003E4B0090D3F8E8203D4942F00802C3F89D +:104AB000E820D3F8E82002F008020192019A394A6E +:104AC000D1F88C409442FBD1D3F89020364C42F080 +:104AD0000802C3F89020D3F8902022F00802C3F80F +:104AE00090204FF44073CB60304B079A23604FF017 +:104AF000FF33E3602E4B002A4DD1B0FBF3F00023CF +:104B000001382361A3606060C4E9053394F83D3047 +:104B100003F0FF020BB984F83C20244A022384F8F6 +:104B20003D30136823F47C7313604FF0FF33D3627E +:104B300001239062536184F8483084F83E3084F851 +:104B40003F3084F8403084F8413084F8423084F8B3 +:104B5000433084F8443084F8453084F8463084F893 +:104B6000473084F83D30134B134A9B68C3F8082143 +:104B7000BFF34F8F114B4FF480225A6094F83E30B0 +:104B8000012B01D1FBF7A4FC2268D36823F00203B8 +:104B9000D3600AB010BD4000AFE700BF0044025828 +:104BA0000064025800030080640E0024000C0040E2 +:104BB00040420F0000ED00E00906000800E100E0BF +:104BC00000232DE9F04F04469BB0C366836039B1E2 +:104BD0008B88A0F858308B89A0F85A300B68036096 +:104BE0002368B04A934212D1002384F85030AE4B70 +:104BF000D3F8E82042F40012C3F8E820D3F8E830F4 +:104C000003F400131393139BA84BE3650BE0A84A2E +:104C100093427FD002F58062934200F08D80A54AD6 +:104C2000934200F09B80A449B4F958000AF060F860 +:104C3000A249B4F95A000AF05BF80421B4F958000B +:104C4000FDF756FB0421B4F95A00FDF751FB636DE3 +:104C50000BB99B4B63659B4A1421656D12682368F1 +:104C6000B2FBF5F24A43636011469869000401D52E +:104C70000139FAD1944E9549D6F88C008842FBD17F +:104C800088498B427CD18849D1F8900040F40010CB +:104C9000C1F89000D1F8900020F40010C1F8900005 +:104CA00089494FF44070C860211D05EE101A9969BA +:104CB000090401D5013AFAD1854A95421AD1794AB7 +:104CC000934202D10120FBF7E3FF2268784B9A421E +:104CD00002D10220FBF7DCFF22687E4B9A4202D110 +:104CE0000420FBF7D5FF2268724B9A4202D10820BC +:104CF000FBF7CEFF7449754BD1F88C209A42FBD15B +:104D0000684B22689A42684B6AD1596D21F4405130 +:104D100059656FE0012384F85030634BD3F8E820E5 +:104D200042F48002C3F8E820D3F8E83003F48003AB +:104D30001493149B684B68E7022384F850305A4B55 +:104D4000D3F8E82042F40002C3F8E820D3F8E830B2 +:104D500003F400031593159B604B56E7032384F877 +:104D60005030514BD3F8F42042F08002C3F8F420C5 +:104D7000D3F8F43003F080031693169B584B44E7A6 +:104D80004B498B4214D001F580618B421CD04949BC +:104D90008B4285D14449D1F89C0040F08000C1F895 +:104DA0009C00D1F89C0020F08000C1F89C0077E7BF +:104DB0003D49D1F8900040F48000C1F89000D1F84E +:104DC000900020F4800069E73749D1F8900040F462 +:104DD0000000C1F89000D1F8900020F400005DE7D9 +:104DE00033498A4291D001F580618A428DD03149A0 +:104DF0008A4240D0344B4FF44071D96094F845302A +:104E0000202BD8B21AD194F84430012B16D0242389 +:104E100084F845306368196821F001011960196848 +:104E200021F48051196019681960196841F0010175 +:104E30001960002384F8450084F84430194B22F4AB +:104E40000061A6689942E76E174B03D018498A4261 +:104E500040F083805B6D03F44053B3F5005F00F0D6 +:104E6000FB810DD8002B43D0B3F5805F00F08D801F +:104E70001C4809F0DDFF996D21F440719965B9E78F +:104E8000B3F5405FF4D1002E00F08880AF4244D0EB +:104E90001548164B00221A60002840F08280002638 +:104EA0003BE000BF00540040004402581F002000B7 +:104EB00000580040001C00585C980108C097010889 +:104EC000A086010000000024006402580003008056 +:104ED00040420F00005C00402100220048004900D1 +:104EE0005F0060008F95010800093D00FC0D002463 +:104EF000FFF724FB0EB1AF420FD0924B9842C8D1BE +:104F0000914B9D4200F0A481904B9D4200F0A28104 +:104F10008F4B904E9D4218BF00260123A6600026AD +:104F200015EE100AE566E660C4E90436C4E90866D1 +:104F3000C4E90666FCF72CF84FF0007384F8716042 +:104F4000656584F87260E56684F8646084F8706072 +:104F50002366A6661BB0BDE8F08F7F498A421BD14D +:104F60009B6D03F44073B3F5007F13D005D84BB1AC +:104F7000B3F5807F09D079487BE7B3F5407FFAD15C +:104F80007748B7E7FFF7B6FAB4E717A8FBF730FDA5 +:104F90001998AFE77348ADE773486AE7734B7048F9 +:104FA0001E60002D3FF47BAFA5F59C3349F64042CF +:104FB000803B934261D9A5F59C236D4AA3F500730C +:104FC00093425DD9A5F543235F4AA3F5A0639342BD +:104FD0003FF665AF4FF0020C664A2C264FF0100BDF +:104FE00002EB5003B3FBF0F30193634B06FB0C366B +:104FF000736AA3F132010493019B03EB4303C91AC3 +:10500000336A029321EAE1713369029876691B1AC7 +:1050100001980591A3F58273A3EB8003029823EA1C +:10502000E3733044019E0693002303909A46194689 +:10503000B1464FF0000E0398CDF81CE00EF1010EC2 +:10504000484529D80027B8460598B8421ED8069882 +:10505000B8421BD35B4519D0142000FB01FB474825 +:10506000013100EB0B0A40F80B307F290798CAE9A1 +:10507000010808D93D4B19601AE04FF0000CABE76E +:105080004FF0010CA8E79B464FF0010A08F1010818 +:105090003744B8F1100FD7D1BEF1100FB144CAD1C7 +:1050A00001330198102B0644C2D1BAF1000FE1D1AF +:1050B0002C2331494FF0000A03FB0CFC01EB0C03DD +:1050C00051F80C1002EB51060993B6FBF1FB59683D +:1050D000CDF81CB0B2FBF1F10C919968049BB2FBC6 +:1050E000F1F20D924FF0FF31204A039112680199BD +:1050F0000F92019A03EB8103029952000B44323262 +:10510000119308921D4A0F9B9A4539D1039B7F2B1F +:105110003FF6C5AE039A142318495343CA18CB5817 +:10512000167C46EA037653681B0503F470031E439E +:1051300093681B0403F470231E43D3681B029BB2C5 +:105140001E43EAE6000E2707801A060040420F00C1 +:10515000A08601007656E140001C0058AC9501087D +:1051600000093D000090D003C7950108FC0D002404 +:105170000071020000CA9A3B14970108FC03002446 +:1051800001994FF0000E1368049803FB011309996D +:10519000089F8969C71902980E9108990744591800 +:1051A000A7EB0B070691F8181199069EABEB0101CE +:1051B0001090A1EB43010E98CDF82CE00EF1010EFA +:1051C000B0423BD2A6F132070198B0EB970F35D22F +:1051D000A1F16400DDF818904FF0000805901098D8 +:1051E00000EB060C0BEB0C070D98CDF8288008F1AE +:1051F0000108B84219D80C98B84216D30998C76963 +:105200004F4512D8019848450FD2059810EA2C0056 +:1052100038BF604607460798874206D20B98079723 +:1052200010610A98CDF80CA0D0600598B8F5807F81 +:1052300099449C44A0EB03000590D3D1BEF5807F38 +:105240001E44A1EB0301B6D10AF1010A14325AE758 +:10525000044E62E6044E60E60448002E3FF419AEA8 +:1052600049E600BF3414C1203615C3000090D003B6 +:10527000F7B504460F460AF06EFFD4F8905004F1DB +:10528000300635F000751AD14FF00073304684F8BF +:105290009450C4F89030FBF7B7FA01463046FBF75C +:1052A000E5FA94F87530202B0CD06FF001052046FC +:1052B0000AF049FFA81E18BF012003B0F0BD434803 +:1052C00009F0B6FD94F87430012BEED00123D4F828 +:1052D0009020A76584F87430212384F8753010235A +:1052E00084F876300223A567A4F85E30384B226636 +:1052F000A366B4F85E309BB2FF2B19D9FF23A4F844 +:105300005C304FF08073616E112904D1AA2A02D05B +:10531000B2F52A4F19D1226EAA2A0FD10022226695 +:10532000B4F85E2092B2FF2A00D8236E294A0DE01D +:10533000B4F85E30A4F85C30236EE4E7226EB2F578 +:105340002A4FEDD14FF00072E9E7002200921021C0 +:1053500094F85C2004F13400FBF70CFD00231E4A96 +:1053600084F87430A36E934203D01C4A934218BF52 +:10537000F225626B13681D43194B15601D68D4F844 +:105380008430B5FBF3F35A255D4394F8943013F061 +:105390001E0F01D1013D12D1B4F98E10B4F98C0069 +:1053A000FDF7AAF80846FDF7A7F81DB194F8943068 +:1053B000082B08D000213046FFF702FC75E70120DA +:1053C000FCF788FFE1E7022571E700BFDD950108E2 +:1053D000775A000800200080995B0008ED5600080D +:1053E00000000024F8B590F841300446602B4FF0DF +:1053F000000317D1202280F84030B0F95A1080F80D +:105400004120026803631368B0F9580023F0FE03DB +:105410001360FDF771F80846FDF76EF8022384F873 +:105420006030F8BD90F86C60071F036380F840306F +:1054300006B18668656C0021384615F0040518BF72 +:105440001425FFF7BDFB86B102232046A66084F831 +:105450006C30FBF79DFD3846FBF7D6F90146384620 +:10546000FBF704FA2046FBF749FD45F00205EDB2D3 +:1054700084F86050D5E7806B836B0BB100221A650E +:10548000C36B0BB100221A65FFF7ACBF70B5344A8D +:10549000002590F84130044680F84250283BC26213 +:1054A0004585426C022B41EA0201416428D8032160 +:1054B000FBF706FC282380F841302A4BA06B63637E +:1054C000236B78B3112B01D0212B2BD123681A68C1 +:1054D000510403D51A6822F480421A6090F83530DE +:1054E000012B1AD0204B0365002384F84030FBF7D2 +:1054F00099FD002833D0A06B036DBDE870401847BC +:1055000048F20301FBF7DCFB90F84130602B02D03E +:10551000202380F841300023D0E72046BDE87040CA +:10552000FFF760BFE06B0028F7D0122B01D0222BD1 +:10553000F3D123681A68120403D51A6822F40042D2 +:105540001A6090F83530012BE7D0074B0365002334 +:1055500084F84030FBF766FD08B1E06BCCE770BD26 +:105560000000FFFF7958000877540008F8B5036879 +:10557000202204460E461F6890F84150DA6105F07B +:10558000F705212D73D148F20101FBF799FB256343 +:10559000236820465A6842F400425A605A6822F052 +:1055A000FF7222F48B3222F4FF7222F001025A6061 +:1055B000FBF76AFC79045FD52268136823F4804303 +:1055C0001360A36B2BB31B68464A93421ED018325C +:1055D00093421BD01832934218D01832934215D000 +:1055E0001832934212D0183293420FD0183293429D +:1055F0000CD01832934209D002F55672934205D06E +:105600001832934202D018329342FFD05B689BB2AB +:105610006385730710D5236826F004065A6A636A07 +:105620001A70636A01336362238D2BB1013B2385BA +:10563000638D013B9BB26385638D9BB21BB1636C31 +:1056400043F004036364002384F84230656C6363B1 +:10565000DDB1616C2046FFF719FF94F84130282B2B +:105660003FD131462046BDE8F840FBF75BBC222D18 +:105670008ED148F2020188E73A04CAD5226813683D +:1056800023F400431360E36B9CE7E36A13F5803F68 +:1056900015D02046FBF7ECFD134B84F84050E36235 +:1056A000202384F8413094F86C302563022B01D11B +:1056B00084F86E502046BDE8F840FBF71FBC94F814 +:1056C000413084F84050222B4FF0200384F84130C1 +:1056D000256304D12046BDE8F840FBF757BD84F8A8 +:1056E0006D50F8BD100002400000FFFFF8B590F8C3 +:1056F000403004460E461546012BC76A00F0B780BD +:1057000001238A0680F8403003D5AB0601D5FFF7A8 +:105710002DFFF20640F1A380EB0640F1A080E90BDB +:10572000A80B41EA9535ED0740F19580E26B52B345 +:1057300011F0010326D013684E4A93421ED018324E +:1057400093421BD01832934218D01832934215D08E +:105750001832934212D0183293420FD0183293422B +:105760000CD01832934209D002F55672934205D0FC +:105770001832934202D018329342FFD05B68B3FADA +:1057800083F35B091A46A36B4BB3C10727D51B688C +:1057900038498B421ED018318B421BD018318B42B6 +:1057A00018D018318B4215D018318B4212D01831D5 +:1057B0008B420FD018318B420CD018318B4209D05C +:1057C00001F556718B4205D018318B4202D0183149 +:1057D0008B42FFD05B68B3FA83F35B090BB9012AF4 +:1057E0001FD194F84130282B0AD1B7F1007F07D19F +:1057F00031462046FBF796FB002084F84000F8BDB8 +:1058000094F841202368292A4FF01002DA61F3D17D +:1058100017F5803FF0D02046FBF736FBFBF728FD5D +:10582000EAE723681022DA6137F08072636C43F094 +:105830000403636494F84130DBB2DDD103F0F70375 +:10584000212B01D1236301E0222BFBD0616C204688 +:10585000FFF71CFED0E723681022DA61CCE732079D +:10586000CAD52B07C8D52046FBF74BFAC4E7022060 +:10587000C5E700BF10000240F8B590F8403004467C +:105880000D461646012BC76A7DD001238A0680F893 +:10589000403003D5B30601D5FFF768FEE80634D5DE +:1058A000F10632D5638D9BB203BB94F84130282BAF +:1058B0000AD1B7F1007F07D129462046FBF732FB1A +:1058C000002084F84000F8BD94F841202368292A7C +:1058D0004FF01002DA61F3D117F5803FF0D0204687 +:1058E000FBF7D2FA2046FBF7C3FCE9E72368102256 +:1058F000DA61636C43F00403636437F08073DFD1D3 +:10590000616C2046FFF7C2FDDAE76A071AD5730714 +:1059100018D5638D9BB26BB123685A6A636A1A709B +:10592000636A01336362238D013B2385638D013BF1 +:105930009BB26385638D9BB2002BC1D117F5803F6D +:10594000BED0CFE7280705D5310703D52046FBF7A2 +:10595000D8F9B5E7AA07B3D5B307B1D5638D9BB224 +:105960006BB1636A226813F8011B91626362638DF5 +:10597000013B9BB26385238D013B2385A0E737F074 +:105980008073AFD09CE702209DE737B503682022E3 +:1059900004460D46DA6190F84130212B37D10121C0 +:1059A000FBF78EF9112323632368E9065A6822F076 +:1059B000FF7222F48B3222F4FF7222F001025A604D +:1059C0004FF000026263A2F58032E26205D5102238 +:1059D000DA61626C42F00402626494F84120602A49 +:1059E00005D16A0703D55B6ADBB20193019B2046B0 +:1059F000FBF74AFA636C94F84120602A00D07BB12F +:105A0000616C204603B0BDE83040FFF73FBD90F821 +:105A10004130222BC8D10221FBF752F91223C2E7F1 +:105A200094F84120212A12D1202284F8403084F8B1 +:105A30004120236394F8422084F84230402A01D167 +:105A400003B030BD03B0BDE83040FBF7A7B994F810 +:105A50004120222AF4D1202284F8403084F84120C9 +:105A6000236394F8422084F84230402AE8D0082387 +:105A700084F86030E4E773B590F8403004460D4692 +:105A80001646012B00F086800123CA0680F84030BC +:105A900017D5F30615D503681022DA61436C43F07D +:105AA00004034364FBF7F0F9AA0605D5B30603D552 +:105AB00029462046FFF769FF002084F8400002B025 +:105AC00070BD680712D5710710D5236825F004054D +:105AD0005A6A636A1A70636A01336362238D013BF9 +:105AE0002385638D013B9BB26385DDE7AA0707D55C +:105AF000B30705D5636A226813F8011B9162ECE7CE +:105B0000280632D5710630D5638D22689BB203B367 +:105B1000208DF0B95168638DC1F309019BB2FF2B51 +:105B200008D9FF224FF08073009022852046FBF7B2 +:105B300021F9B9E7628DE36A92B213F5803F2285BD +:105B4000D2B202D0E36A0090F0E74FF00073009009 +:105B5000ECE753689A0103D42046FBF7A3F9A3E7C7 +:105B600040212046FFF792FC9EE76B069CD570060D +:105B70009AD5638D9BB2002BF2D123685A689101AC +:105B800092D4E26A12F5803FE6D15A6842F480422C +:105B90005A6089E7022092E713B590F84030044636 +:105BA000012B00F08780012380F84030CB061ED502 +:105BB000D0061CD5102322683F49D361636C43F0A3 +:105BC00004036364636B8B420FD03C498B420CBF70 +:105BD00060232023116820460B431360FBF754F920 +:105BE000002084F8400002B010BD6023F2E70B06ED +:105BF00043D5500641D523681A6822F040021A6046 +:105C0000628D92B26AB35968638DC1F309019BB288 +:105C1000FF2B1BD9FF2323854FF0807300222046E2 +:105C2000009294F82820FBF7A5F8638D228D9B1A2B +:105C30009BB2638594F84130222B23681A680CBF0D +:105C400042F4004242F480421A60C9E7638D238522 +:105C5000E36A13F5803F01D0E36ADFE74FF000739A +:105C6000DCE75B689A0103D42046FBF71BF9B7E732 +:105C700040212046FFF70AFCB2E74B0612D550063A +:105C800010D5638D9BB2002BF2D123685A68920124 +:105C9000A6D4E26A12F5803FE6D15A6842F4804207 +:105CA0005A609DE788069BD5930699D52046FFF755 +:105CB0006CFE95E7022096E7995B0008ED56000818 +:105CC000036899691A6810B4CC0508D5140606D57E +:105CD000446C44F0010444644FF48074DC614C056E +:105CE00008D5140606D5446C44F0080444644FF407 +:105CF0008064DC61890508D5120606D5426C42F045 +:105D0000020242644FF40072DA61416C11F00B0F31 +:105D100003D05DF8044BFFF7B9BB5DF8044B704747 +:105D2000054B07B518680190FBF7E0F8019803B040 +:105D30005DF804EBFFF7C4BF1C100024054B07B54A +:105D400058680190FBF7D2F8019803B05DF804EBB6 +:105D5000FFF7B6BF1C100024054B07B598680190EB +:105D6000FBF7C4F8019803B05DF804EBFFF7A8BF98 +:105D70001C100024054B07B5D8680190FBF7B6F856 +:105D8000019803B05DF804EBFFF79ABF1C100024E4 +:105D9000854A136803F00F038B422DE9F041044656 +:105DA0000D46C0F0888023685F0700F192801E07CF +:105DB0000BD57E496669C86900F07000864204D937 +:105DC000CA6922F070023243CA61D8060BD57749FE +:105DD000A669C86900F4E060864204D9CA6922F461 +:105DE000E0623243CA6199060BD57049E669086AD8 +:105DF00000F07000864204D90A6A22F07002324331 +:105E00000A629A070BD56949E668886900F00F00B5 +:105E1000864204D98A6922F00F0232438A61DF0781 +:105E200065D423689E0700F197805F490A6802F0F5 +:105E30000F029542C0F09E80580700F1A680190716 +:105E40000BD55A496569C86900F07000854204D2D3 +:105E5000CA6922F070022A43CA61DA060BD5534997 +:105E6000A569C86900F4E060854204D2CA6922F4D9 +:105E7000E0622A43CA619B060BD54C4AE069116A6D +:105E800001F07001884204D2136A23F070030343C7 +:105E90001362FEF71BFA454A93699269C3F3032321 +:105EA000434AD35C03F01F03D840424B1860FEF70F +:105EB000EFFD00200BE0136823F00F030B4313608A +:105EC000136803F00F038B423FF46DAF0120BDE870 +:105ED000F08136492669886900F0700086427FF6B5 +:105EE00066AF8A6922F0700232438A615FE72F4B06 +:105EF000A1689A6922F470620A439A6162681B6819 +:105F0000022A1CD113F4003FE0D0284E41F2883819 +:105F1000336923F0070313433361FCF737FB07466C +:105F20003369626803F03803B3EBC20F3FF479AF13 +:105F3000FCF72CFBC01B4045F2D90320C7E7032A1E +:105F400002D113F0007FDFE7012A02D113F4807F32 +:105F5000DAE713F0040FD7E71449E668886900F020 +:105F60000F008642BFF461AF8A6922F00F0232430C +:105F70008A615AE70A6822F00F022A430A600A6817 +:105F800002F00F029542A1D156E7084925698869B8 +:105F900000F070008542BFF452AF8A6922F07002AF +:105FA0002A438A614BE700BF002000520044025898 +:105FB0000497010800000024F8B503680446D807D8 +:105FC0005FD42368990700F1B1802368DA0628D5E9 +:105FD000AC4B1A69996A02F03802082A07D0182ACD +:105FE00040F0118101F00302012A40F00C811B688E +:105FF000DB0502D5E369802B56D1A34B216A1A68D1 +:1060000041F20303B3EB124F9E4BC0F0F5805A6888 +:10601000202922F0F8420CBF42F0804242EA81621D +:106020005A602368190700F1338123689A0600F14A +:10603000548123685D071ED5944D2B6843F480730B +:106040002B60FCF7A3FA06462B68DA0540F16A815B +:10605000A3688C4D012B40F06C812B6F43F0010342 +:106060002B6741F28837FCF791FA864E0546336F6D +:106070009B0740F18481606A002840F087810020FE +:106080002AE0804B1A69996A02F03802102A05D07A +:10609000182A0BD101F00302022A07D11B689A03C8 +:1060A0008FD56368002B8CD1012015E06268B2F5B2 +:1060B000803F12D11A6842F480321A60FCF766FA07 +:1060C000704E054633689B033FF57BAFFCF75EFAE5 +:1060D000401B6428F6D90320F8BD6A4D2B689AB995 +:1060E00023F480332B602B6823F480232B60FCF790 +:1060F0004DFA06462B689F037FF563AFFCF746FA1F +:10610000801B6428F6D9E6E7B2F5A02F07D143F447 +:1061100080232B602B6843F480332B60CEE723F47D +:1061200080332B602B6823F48023F6E7554B1A69E4 +:10613000996A12F0380203D0182A20D18E071ED196 +:106140001B685D0702D5E368002BADD04E4B21697B +:106150001A6841F20303B3EB124F4A4B5A6809D352 +:1061600022F47C3240290CBF42F4003242EA013270 +:106170005A602AE722F0FE4242EA0162F8E7E1684B +:106180001A6841B322F019023E4D0A431A60FCF727 +:10619000FDF906462B68580712D53B4B2269196852 +:1061A00041F20303B3EB114F6B680FD323F47C333D +:1061B000402A0CBF43F4003343EA02336B6004E728 +:1061C000FCF7E4F9801B0228E4D984E723F0FE43BE +:1061D00043EA0263F2E722F001022A4E1A60FCF75A +:1061E000D5F90546336859077FF5EFAEFCF7CEF9D0 +:1061F000401B0228F6D96EE7DA6822F07C5242EAA8 +:106200000162DA600DE7E26952B31A681D4D42F08F +:1062100080021A60FCF7BAF906462B68DF0512D532 +:10622000194B226A196841F20303B3EB114F10D3E3 +:106230006B68202A23F0F8430CBF43F0804343EA05 +:1062400082636B60EDE6FCF7A1F9801B0228E4D9BC +:1062500041E7EB6823F07C5343EA0263EB60E0E63E +:106260001A68084E22F080021A60FCF78FF9054682 +:106270003368D8057FF5D5AEFCF788F9401B0228B6 +:10628000F6D928E7004402580010005C0048025884 +:106290006369964D83B16B6F43F001036B67FCF745 +:1062A00075F906466B6F9B073FF5BFAEFCF76EF9BD +:1062B000801B0228F6D90EE76B6F23F001036B6792 +:1062C000FCF764F906466B6F9F077FF5AEAEFCF7EF +:1062D0005DF9801B0228F6D9FDE6A369834D83B1E1 +:1062E0002B6843F480532B60FCF750F906462B686B +:1062F00098043FF59EAEFCF749F9801B0228F6D9B9 +:10630000E9E62B6823F480532B60FCF73FF906463F +:106310002B6899047FF58DAEFCF738F9801B0228B5 +:10632000F6D9D8E6FCF732F9801B64287FF68CAEEC +:10633000D1E6B3B92B6F41F2883723F001032B6705 +:106340002B6F23F004032B67FCF720F906462B6F15 +:1063500098077FF590AEFCF719F9801BB842F6D983 +:10636000B9E6052B2B6F03D143F004032B6774E6CA +:1063700023F001032B672B6F23F0040370E6FCF777 +:1063800005F9401BB8427FF672AEA4E6574D2B6963 +:1063900003F03803182B7AD02B68022823F080737F +:1063A0002B6067D1FCF7F2F806462B6899015BD4A5 +:1063B000AB6AA26A23F47C7323F003031343E26AFB +:1063C00043EA0213AB62636BA26B013B013A5B02CF +:1063D00012049BB202F4FE021343226B013AC2F391 +:1063E00008021343E26B013A120602F0FE42134325 +:1063F0002B63EB6A23F00103EB626B6BA26C23F45B +:106400007F4323F0F80343EAC2036B63EB6A226C19 +:1064100023F00C031343EB62EB6A626C23F002037C +:106420001343EB62EB6A43F48033EB62EB6A43F4B1 +:106430000033EB62EB6A43F48023EB62EB6A43F0D8 +:106440000103EB622B6843F080732B60FCF79EF82E +:10645000264D04462B689A013FF511AEFCF796F8DD +:10646000001B0228F6D936E6FCF790F8801B0228BC +:106470009BD930E6FCF78AF804462B689B017FF530 +:10648000FEADFCF783F8001B0228F6D923E60128AD +:10649000AA6A2B6B3FF420AE02F00301A06A81428E +:1064A0007FF402AEC2F30512E16A8A427FF4FCADCA +:1064B000226BC3F30801013A91427FF4F5AD626BA0 +:1064C000C3F34621013A91427FF4EEADA26BC3F3D0 +:1064D0000641013A91427FF4E7ADE06BC3F30663F6 +:1064E0000138181A18BF0120F6E500BF0044025811 +:1064F0002C4B4FF4165210B59A60C4B01A682A4B50 +:106500009A424CD10021BC2215A8042410F03EFE72 +:10651000264B1494196F11F0020113D1482202A8DE +:1065200010F034FE0123019403930A93204C214B75 +:10653000D4F88C209A42FBD101A8FFF73DFD4FF41F +:106540004073E360194B1B6F9B0710D5184C194B18 +:10655000D4F88C209A42FBD1052314A83993FDF777 +:10656000B7F94FF44073E360FDF7FAFF38B1012348 +:1065700014A83993FDF7ACF9FDF7F2FF08B944B060 +:1065800010BD00230A4C39930A4BD4F88C209A4250 +:10659000FBD114A8FDF79CF94FF44073E360FDF7BD +:1065A000DFFFECE76C120024000C00580044025896 +:1065B000006402580003008030B5C5B048220021B5 +:1065C00002A810F0E3FDC022002114A810F0DEFDA7 +:1065D0004E4B1A68002A40F0968001224C4D1A60FA +:1065E0004C4A136843F4807313604B4BD5F88C20EE +:1065F0009A42FBD1082301A8019300230A930123A7 +:106600000693FFF7D9FC10B1444808F011FC444C44 +:1066100014A8236923F47C532361236F43F400738C +:1066200023674FF4800314934FF400734193FDF7F5 +:106630004FF908B13B48E8E74FF440737F21F92256 +:10664000EB60236F43F400432367374C374B84F8E8 +:1066500021002360606020616061C4E9021294F847 +:106660002120C4E9060002F0FF010AB984F82010D5 +:10667000022284F82120CA225A6253225A62FCF76D +:10668000B7F808BB22682069936823F4E00323F07D +:1066900040039360636891680343A06903430B431D +:1066A0009360D4E9021343EA01431361FCF77AF8DB +:1066B00050B922686569D36C23F00303D364E3699E +:1066C000D16C2B430B43D3642368FF255D6240B933 +:1066D000012194F820208A4284F8211003D1144823 +:1066E00093E7144891E7022284F82120CA225A62D3 +:1066F00053225A629A6842F020029A605D6284F8DE +:10670000200084F8211045B030BD00BF3C0E0024AD +:1067100000640258004802580003008003960108F4 +:106720000044025823960108400E002400400058FF +:10673000679601084C960108764B70B51C68C4B08A +:106740001CB1FBF7EDFE44B070BD0125C02221460F +:1067500014A8714E1D6010F019FD4C22214601A8AD +:1067600010F014FD337833B304230A940193052306 +:106770000393802314934FF4C0433C936749684BC1 +:10678000D1F88C209A42FBD101A8FFF715FCD8B1B3 +:106790000023082201A833700A938023019201226A +:1067A00014934FF4004306923C93FFF705FC58B155 +:1067B0005C4808F03DFB08220A938023069501926D +:1067C00014934FF40043D8E714A8FDF781F808B1FB +:1067D0005548EEE7554B4FF6FF755549D3F8F42071 +:1067E00042F40062C3F8F420D3F8F42002F400620B +:1067F0000092009AD3F89C2042F40062C3F89C20D7 +:10680000D3F89C2022F40062C3F89C20D3F8A8207F +:1068100042F40062C3F8A820464A136843F4801388 +:106820001360136C23F4801313644FF440723B4BDA +:10683000DA604FF48022404B83F8360093F83640FC +:106840001960D8611863C3E90552C3E901001A460B +:10685000C3E90300C3E90800C3E90A000B460CB909 +:1068600082F835000224354982F83640DD68294037 +:10687000D9600123324982F83630324B9B68C3F825 +:106880007012BFF34F8F1368996841F0010199604E +:10689000996841F008019960516882F836400129F1 +:1068A00007D0916AB1F5000F03D1D96821F4606176 +:1068B000D960196944F6206441F001011961102181 +:1068C00059604FF6FF7199611F490968B1FBF4F4F3 +:1068D0004FF47A71614301391C6808BF0320E40654 +:1068E00001D40029F7D1032806D0196941F0040129 +:1068F0001961012182F8361008225A6000225A617B +:106900001A681207FCD508225A6001220F4B1A7030 +:1069100019E700BF000E002440190024006402584B +:1069200000030080819601089A96010800440258ED +:10693000002C005890000058040E0024FEF119FFAE +:106940000919000800ED00E00000002431100024C7 +:1069500090F8BC230368012A21D0012280F8BC23CF +:10696000826A012A06D18269012A03D09A6B42F415 +:1069700080329A639A6842F001029A60D3F8002E3E +:1069800022F00302C3F8002ED3F8042822F00202FA +:10699000C3F80428002380F8BC331846704702204F +:1069A000704700002DE9F74F0023DFF8BC81DFF8C6 +:1069B000BCC14FF0B0490A6832FA03F402D103B007 +:1069C000BDE8F08F01279F403A4000F0B6804C6848 +:1069D0004FEA430E032524F0100A05FA0EF50AF1DA +:1069E000FF36ED43012E10D8866806EA050BCE6807 +:1069F00006FA0EF646EA0B068660466826EA0707A0 +:106A0000C4F300169E4037434760C768BAF1020FCF +:106A10008E6807EA050706FA0EF646EA0706C6601C +:106A200014D14FEAD30A03F0070B0F2700EB8A0AB1 +:106A30004FEA8B0BDAF8206007FA0BF726EA070714 +:106A40000E6906FA0BF63E43CAF820600668354028 +:106A500004F0030606FA0EFE4EEA05050560E500A1 +:106A60006BD5D8F8F45023F0030603F003074FF07A +:106A70000F0E45F0020506F1B046BF00C8F8F4500D +:106A800006F58066D8F8F45005F002050195019DE1 +:106A90000EFA07F5D6F808A02AEA050E314DA842ED +:106AA0004DD005F58065A8424BD005F58065A8421C +:106AB00049D005F58065A84247D005F58065A84214 +:106AC00045D005F58065A84243D005F58065A8420C +:106AD00041D005F58065A8423FD005F58065A84204 +:106AE0003DD005F58065A8420CBF09250A25BD40AB +:106AF000E70345EA0E05B5606FEA0206DCF80050D0 +:106B000054BF35401543A703CCF80050DCF80450BF +:106B100054BF35401543E7024FF0B047CCF804505E +:106B2000D9F8005054BF35401543A4023D607D683C +:106B300054BF35401543C9F8045001333BE70025E5 +:106B4000D5E70125D3E70225D1E70325CFE70425C3 +:106B5000CDE70525CBE70625C9E70725C7E70825C3 +:106B6000C5E700BF000002580044025880000058EA +:106B70000A4BDA6842F00102DA60DA68D2070BD514 +:106B8000D3F80C2142F00102C3F80C21D3F80C0118 +:106B9000C04300F001007047012070470020005200 +:106BA000104BDA68D20706D40E4BD3F80C0110F064 +:106BB00001000AD170470C4A5A6002F188325A60CB +:106BC000DB68DB07F0D501207047074AC3F80421D2 +:106BD00002F18832C3F80421D3F80C0100F001005F +:106BE000704700BF002000522301674538B50446B6 +:106BF000FBF7CCFC05460134FBF7C8FC431BA34262 +:106C0000FAD338BDF0B5A5B020220021044609A86A +:106C100010F0BCFA4C22002111A810F0B7FA564B24 +:106C20009B6A03F00303022B34D0534B0227534ECD +:106C30000025D3F8E02004A9304642F08002C3F8D2 +:106C4000E020D3F8E030079503F080030393039B23 +:106C50000123CDE904730693FFF7A4FE0A20FFF792 +:106C6000C5FFB761FBF7C4FC454BF4B90194DA6A80 +:106C700022F00102DA62DB6A03F001030193414B67 +:106C80009A6942F440429A619B6903F4404301933C +:106C9000019B1FE0012109A8CDE90911FFF778F850 +:106CA0000028C2D0002025B0F0BD0295DA6A22F09B +:106CB0000102DA62DB6A334A03F00103029393694B +:106CC00023F4404343F480439361936903F44043C6 +:106CD0000293029B2B4A93699D04FCD521214FF41A +:106CE000A0230522002C4FF0080511A81C920CBF10 +:106CF000A02228222195CDE9111301231D92002203 +:106D00001793022323921E9320932292CDE91A33E4 +:106D10000A231F93FFF750F901460028C2D13F22F2 +:106D20000323CDE9092340234FF48062CDE90B050D +:106D3000CDE90E320D931093E4B109A8FFF728F8BE +:106D40000028AFD10C4B01201A6842F080021A6073 +:106D5000D3F8F42042F00202C3F8F420D3F8F43060 +:106D6000074A03F002030093009B136A43F00103F8 +:106D7000136298E70421E0E700440258001C02581F +:106D8000000400580048025808B50120FFF73AFFF8 +:106D900010B9024808F04CF808BD00BFBB960108C6 +:106DA00073B505460C200E46019207F0E7FA002362 +:106DB0002946019A0446C0E90133074B0360FAF7FC +:106DC00063FB054630B1236820465B689847284638 +:106DD00002B070BD3460FAE7149A010873B5054635 +:106DE0000C200E46CDE9003207F0C8FA0021044617 +:106DF000C0E901110849DDE9003201602946FAF7CE +:106E0000E5FA054630B1236820465B689847284676 +:106E100002B070BD3460FAE7409A010803682DE9BA +:106E2000F041DB6E04460D469847804640F2011063 +:106E300007F0A4FA2368002706461B6F2946204660 +:106E4000984723683246294620465B6E98470028BB +:106E500001DD0137F5E723684246294620469B6E4F +:106E60009847304610F02CF93846BDE8F081000014 +:106E700010B50446EFF3058313B16FF0050010BDA4 +:106E800008F0DEF90028F8D120464FF0FF31DFF896 +:106E900008C000DFF3E700BFE9CE00080368013354 +:106EA000036000207047F7B5089F0E460468194636 +:106EB000C0690023256800970027E0FB06232046D1 +:106EC00001976D69A84703B0F0BDF7B5089F0E465E +:106ED00004681946C0690023256800970027E0FB75 +:106EE000062320460197AD69A84703B0F0BD37B52A +:106EF0000468C36900202268009301902046D56988 +:106F0000A1FB0323A84703B030BD006803681B69D9 +:106F10001847002807DC10F1160F04DA10F1340FBF +:106F200008BF6FF08900704770B50A440E4E0368C1 +:106F300093FAA3F393FAA3F30360914212D011F8EA +:106F4000014B84EA030505F00F0556F8255085EA44 +:106F5000131383EA141404F00F0456F8244084EA4F +:106F60001313EAE7036070BD789D010843798279C5 +:106F70000433C0791344184470470B6810B5046893 +:106F80009C4209D040684A68904205D0944203D0A0 +:106F9000181A18BF012010BD0020FCE70368013358 +:106FA00004D04068431C5842584170470120704744 +:106FB00003681A6AC36AD31A1944B1FBF2F302FBDD +:106FC0001311036B8B4210B50BD94C09C26B012313 +:106FD00001F01F0103FA01F152F824300B4342F88B +:106FE0002430002010BD036808461847036910B517 +:106FF000044613B150F8041B9847204610BD38B51D +:10700000036804460D46DB6F984723682D692046C8 +:10701000D3F880309847284638BD38B50368044611 +:107020000D46DB6F98472368ED682046D3F8803023 +:107030009847284638BD38B5036804460D46DB6FCF +:10704000984723686D692046D3F8803098472846D2 +:1070500038BD03680122D3F88430184708B5064BC1 +:1070600053F820000368DB6A984780B2B0F5007FD0 +:1070700038BF4FF4007008BD981A002473B5104E45 +:1070800005460C4656F82030BBB1FFF7E7FF2368F2 +:107090006468024656F8250001340168E41AA4FB2E +:1070A0000245A2FB0323CDE90045096A8847002871 +:1070B00014BF0420002002B070BD0320FBE700BF16 +:1070C000981A00242DE9FF4716461C468046DFF833 +:1070D00044900391FFF7C2FFA0FB0667A0FB0445A5 +:1070E00059F8280032460368CDE90045D3F81CA0C2 +:1070F0003B46D04750B959F82800324603990368F7 +:10710000CDE900459C693B46A04700B1042004B08E +:10711000BDE8F087981A00247FB5164605461C4640 +:107120000391FFF79BFF0A4A0346039952F8250093 +:10713000A3FB04450268CDE900455469A3FB06237F +:10714000A047002814BF0420002004B070BD00BF79 +:10715000981A00240A4B37B5044653F820000368F8 +:107160009B6B9847054620460191FFF777FF002368 +:1071700002460199284612F05DF903B030BD00BF08 +:10718000981A002413289ABF014B185640427047A2 +:10719000E29B0108036800229B6F184702461F4BC1 +:1071A0001F4980B2B2F5805F28BF0B46F0B51C1DA9 +:1071B00034F8043C2146ABB1984213D334F8025C56 +:1071C0002E12EFB253FA85F5AA4221DA082E09D819 +:1071D000DFE806F005090F11131517191B00D31A64 +:1071E00034F81300F0BDC31A03F00103C01A80B2D3 +:1071F000F8E71038FBE72038F9E73038F7E71A38B6 +:10720000F5E70830F3E75038F1E7A0F5E350EEE793 +:107210000434002ECCD101EB4703C8E7509F01088E +:1072200042A101080749002310B531F8024B9AB278 +:10723000844203D00133802BF7D11A4602F180003B +:10724000C0B210BD769C010813128A76CB76037803 +:10725000032B01BF120C0A7512124A7570470328DE +:10726000CA7E8B7E08BF487D43EA022302BF0A7DA7 +:1072700042EA002243EA02431846704760B10368BD +:107280005BB11A785AB18088DA88904216BF09201B +:10729000002000230B60704703460920FAE709200D +:1072A0001346F7E7026810B504465AB1114611F8C3 +:1072B000013B1F2B11D93A2BF9D11378303BD8B2AF +:1072C000092802D94FF0FF3006E002329142F9D18D +:1072D000032B1846F6DC216010BD0020FCE7036A92 +:1072E0000239023B8B4283BF4389406B01FB0300A1 +:1072F0000020704738B5C378044613B900252846E6 +:1073000038BDD0E90E2101234078FFF7DBFE0546AA +:1073100080B9A16BE36A626ACB1AE0709342EDD246 +:10732000A378022BEAD10A440123E16B6078FFF7CE +:10733000C9FEE4E70125E2E70B0A017043700B0C7C +:10734000090E8370C170704742884378007843EA21 +:10735000022340EA032070472DE9F0470027D0F8C8 +:10736000009006460C468F758369002B00F0A180C3 +:10737000C36A013303D100232E251A4648E0B846DC +:107380003D4613E0B0F5803F2DD2FFF74BFFFF28BD +:10739000034626D9BAF1010F25D963190212D8750F +:1073A0009A7502231D44002002378046D9F8103018 +:1073B000D85BC8B1B8F1000F05D100F5205292B2E8 +:1073C000B2F5006FF0D340EA0840C5F1FF0A7F280C +:1073D000D8D883B2BAF1000F0FD062199375012388 +:1073E000E0E70028F6D10025B8F1000F4FF00003C8 +:1073F00018BF00252544AB75BDE75546F4E70B2BB8 +:1074000003D81A46531C224451720B2814D002464A +:10741000F169501C895C2029F7D0052908BFE521B6 +:107420000928ECD10B2BF2D804EB030703F101027E +:107430007D72E7D11346EAE7E21800215172A27D7E +:1074400012BBBBB16FF0080504F1090208202D1B27 +:10745000AB1812F8011B81B12E298BB22BD0A3F1EE +:107460004101192904D8F169097B084200D0203371 +:107470001373EDE73F23A3750123234400229A757C +:10748000F3691B7B03B96372F369DB7A03F03F0393 +:107490002372F16901F11C00FFF756FF2060CA7DDD +:1074A0008B7D43EA0223E3804A7E0B7E43EA02237C +:1074B000A380BDE8F0871020DAE713B50C46A430AE +:1074C000019006F0CBFEA469019807F027FF204643 +:1074D00002B0BDE81040FFF71CBD37B50D46A43023 +:1074E000019006F0BBFEEB696C6913F4003F019854 +:1074F00003D02B6A9C4238BF1C4607F00FFF204682 +:1075000003B0BDE83040FFF704BD13B50C46A4300E +:10751000019006F0A3FE246A019807F0FFFE2046C2 +:1075200002B0BDE81040FFF7F4BC10B50C4682690C +:10753000FF21A0680FF02AFE4FF0FF33236010BD3B +:1075400037B50546A4300C46019006F087FE05F1DC +:1075500024026B6A01981BB19C420DD12368136011 +:1075600007F0DCFE14B120460FF0AAFD002003B0A6 +:10757000BDE83040FFF7CDBC1A461B68EBE7036857 +:107580009B6A10B5044613B9C0690FF099FD2368D2 +:10759000DB6A13B9A06A0FF093FD23681B6B23B954 +:1075A000E06BBDE810400FF08BBD10BD70B500F171 +:1075B000A4060546304606F051FED5F8904064B169 +:1075C00005F11400FFF7DBFFD5F890000368DB68D6 +:1075D000984700230446C5F89030304607F09EFED9 +:1075E000204670BD036873B50C46DB6F06469847AE +:1075F00001A92046FFF742FE054600B92060336826 +:107600003046D3F88030984714B120460FF058FD2B +:10761000284602B0BDE87040FFF7B4BD08B10FF0D6 +:107620004FBD704738B58B6A04460D460160CBB13B +:10763000C361EB6A13B3A36204F120012846FFF78C +:1076400074FF4FF0FF33636123681A6BEAB1E263A2 +:1076500000204FF0FF33C4E90300C4E90133A4F86C +:10766000400038BD48690FF023FDE0610028E0D1FB +:107670002046FFF784FF6FF00B00F2E7A8690FF0D8 +:1076800017FDA0620028D7D1F2E7586AC0080FF0B2 +:107690000FFDE0630028DBD1EAE72DE9F341054661 +:1076A0000191FFF727FE044680BB01992846FFF7AA +:1076B00016FE2146A8630746AA89E86B0FF066FD0F +:1076C0006C89AE897443B4F5004F28BF4FF4004471 +:1076D000A6421DD220460FF0EBFC804638BB640862 +:1076E000F6E72346BA1941466878FFF7EBFC18B96C +:1076F00026446B89B342F4D840460FF0E1FC688918 +:10770000801B18BF012002B0BDE8F0810120FAE71C +:10771000EC6B00266B89B342F1D90123BA192146DB +:107720006878FFF7CFFC0028E9D10136F2E722465E +:1077300000210FF02BFDB4FBF6F40026D9E7000082 +:107740000C4B03F10802883310B504460260436015 +:10775000FFF72CFFD4F8A4000BF0DAF8064B204614 +:1077600003F108023433226040F8043F08F082FB42 +:10777000204610BDC09E0108589E0108A0F10400DB +:10778000FFF7DEBF10B50446FFF7DAFF20460FF023 +:1077900097FC204610BDA0F10400FFF7F3BFF7B53A +:1077A0000C460968064617464B1C21D000688369C1 +:1077B00000938568D4E90123A847054620B937B965 +:1077C00021463068FFF7B1FE284603B0F0BD3368AC +:1077D000394630469B690193A3680093D4E900239E +:1077E000FAF70AFD002805DBEAD16FF03305EBE775 +:1077F0000025E9E70546E7E72DE9F74F0C9C07462A +:107800000D4691469846DDF838A0BAF1000F03D135 +:10781000504603B0BDE8F08F2B6838684345826955 +:1078200028D16B68A34225D803EB020BA34521D9CD +:10783000ABEB040BE01AAB68D3450D99184428BF95 +:10784000D3465A465C440FF093FC0D9B5B44AAEB75 +:107850000B0B0D933B689A69B4FBF2F302FB1343E5 +:1078600033B94A4629463846FFF799FF0028D0D158 +:10787000DA46CAE7B4FBF2F302FB13434BBB924573 +:1078800027D34146BAFBF2F302FB13AB2246AAEB25 +:107890000B0ACDF800A083681E460D9BB047002858 +:1078A000B7D1B9F1000F04D10D9B544453440D934B +:1078B000DEE70D9B42464946384600932346CDF805 +:1078C00004A0FAF799FC0028A3DBEDD16FF0330098 +:1078D0009FE7E31AD346C5F800806B60C8E7000055 +:1078E00008B5034808F09AF9BDE8084007F016BD4E +:1078F000B40F002408B5034808F090F9BDE808402B +:1079000006F0ACBCB40F002470B50446FFF7F2FCDF +:10791000054600283FD12378032B35D12679012E47 +:1079200032D10146A289E06B0FF030FCE36B5522A7 +:107930004121722083F8FE21AA2283F8FF215223DD +:10794000E26B137053706123D1709370E26B82F815 +:10795000E73182F8E40182F8E50182F8E611E06B94 +:10796000A16900F5F470FFF7E7FCE06B616900F5D1 +:10797000F670FFF7E1FCA26A3346E16B01326078F2 +:10798000A263FFF79FFB25716278034B53F8220037 +:10799000B0FA80F0400970BD981A002437B51E482F +:1079A00008F03CF906F05AFCF8F748FE78B91A4896 +:1079B00008F034F906F052FCFEF7FEFD002000212D +:1079C000FAF738FF144808F029F907F0A7FCF8F790 +:1079D0003DFE054610480C4608F020F907F09EFCD5 +:1079E0006846CDE900540FF0E5F9D0E90232DB0238 +:1079F00043EA0243426843EA4213026802EBD2724E +:107A000043EA620342690069503A013043EA426343 +:107A100043EA405003B030BD701A0024F8B5C56980 +:107A20000F460E68083DAE4213D3B6FBF5F00138A1 +:107A300011F018FD841CA6EB8404B4FBF5F4204679 +:107A400011F010FDA6EB800004FB150520463D60FB +:107A5000F8BD0020FCE72DE9F04F85B00F469146B8 +:107A60009846109D0390DDE90E460DB9284659E071 +:107A7000039B1868B9F1000F1ED0D9F800304345B8 +:107A80001AD1D9F80410A14216D8826901EB020A72 +:107A9000544511D2AAEB040A611AD9F80830AA4554 +:107AA00028BFAA4630465246194456445444A5EBD2 +:107AB0000A050FF05DFBD8E73A68436990450ED19F +:107AC00079688C420BD301EB030A544507D2AAEB29 +:107AD000040A611ABB68AA4528BFAA46E2E7B4FBBC +:107AE000F3F203FB1242D0F804B08AB99D420FD3DF +:107AF00022464146B5FBF3FA03FB1A5A3346A5EB7F +:107B00000A050095D84768B92E442C445546ACE781 +:107B1000A21A00934146BB68C7F800807A60D84734 +:107B20000028A2D005B0BDE8F08F2DE9F04F8BB052 +:107B3000914607468846149A07A900680DF1200B64 +:107B4000013A0593DDF858A00792FFF767FF059B00 +:107B50000546194605935046159B9847024618BBA3 +:107B600015B305F001064A4600903846C6F10204F6 +:107B7000059BA100CDE901B14146FFF76CFF02462C +:107B800090B9013C944207DC0AAB023E03EB84044B +:107B9000354454F8083CDCE708995046159B984753 +:107BA00001220028EED0024610460BB0BDE8F08F4F +:107BB0002DE9F04786B005460F46144600F114093A +:107BC000D6184FF0010A0DF11708B44203D1002076 +:107BD00006B0BDE8F08700943B460022494628469F +:107BE0000134CDE9018AFFF736FF0028F0D10122E8 +:107BF00041460E98FFF798F9E7E71FB5069C0092FB +:107C00000022CDE901340B4600F11401FFF723FFF8 +:107C100004B010BD2DE9F04F13688BB00026074665 +:107C200004930C465368B0460DF1100B06AD4FF0AF +:107C3000100A05935BF826902B46002238464946E9 +:107C4000CDF800A0FFF7D9FF70B110F1340F06D1C5 +:107C500046B1B8F1000F14BF00206FF033000BB035 +:107C6000BDE8F08F0126E5E7B8F1000F04D0E26926 +:107C7000069B9B1A002BEBDB079B23F00043132B87 +:107C8000E6D93A68D2699342E2D84FF0FF3303A8AD +:107C9000102229460393FFF747F9079B1022009013 +:107CA000494623F000433846103BFFF781FF002888 +:107CB000CBD1039B002BCBD10AAA86F0010304F1A0 +:107CC0001C0CC4F8049002EB83034FF0010853F836 +:107CD000183CC4E9023A95E80F008CE80F00B7E7BA +:107CE00070B500F1A4060C460546304606F0B6FA1B +:107CF00004F11002214605F11400FFF78BFF38B99B +:107D0000236963606369A3600E23A3611023E360AA +:107D10003046BDE8704007F001BB2DE9F041064652 +:107D200000F1A4070C4615461436384606F096FABC +:107D300004F1100221463046FFF76CFFD0B92369E9 +:107D400004F12408A56163606369A3601023E36004 +:107D5000216A21F000439D4201D8E5600AE0002934 +:107D6000A5EB030506DA424621463046FFF752FFEF +:107D70000028EDD03846BDE8F04107F0CFBA00004A +:107D80002DE9F04300F1A4070D46044699B03846AA +:107D900006F064FAC4F890502B6828469B68984710 +:107DA000064648B10023C4F89030384607F0B6FACA +:107DB000304619B0BDE8F0832422014604F16C007E +:107DC00004F158090FF0E2F9404BA5652846E36538 +:107DD00004F114083E4B23663E4B63663E4BA3669C +:107DE0002B685B6A9847D4F8943083422CBFE366D3 +:107DF000E06628462B689B6A9847D4F898308342FF +:107E00002CBF2367206728462B68DB6A9847D4F885 +:107E10009C3083422CBF6367606728462B689B6B4E +:107E20009847626F334611F005FBA0671F30D4F806 +:107E3000A030494620F01F00834294BFE367E0670B +:107E40004046FFF7EFFB0546002833D1636902AADD +:107E50000DA940461B6AA664E364012302960393BE +:107E6000C4E91066FFF7D6FE054600BB20231022AA +:107E70000E994046009305ABFFF7BFFE0546B0B92B +:107E8000069B082215490BA8A361079BE36111F02B +:107E900085F8064648B90A9B1A0C012A02D19BB202 +:107EA000012B82D96FF0150501E06FF033054046D4 +:107EB000FFF765FB00233846C4F8903007F02EFA30 +:107EC000284619B0BDE8F043FFF723B8A76E0008B5 +:107ED000CB6E0008EF6E00080B6F0008909B010846 +:107EE0002DE9F043012397B00F4606460021904646 +:107EF000CDE9051305994046B847044610BB0699DD +:107F00004046B8470446E8B905AA0BA93046FFF732 +:107F100081FE0446B0B90C25139B0E9A23F0004352 +:107F200002F10C01043B994210D9149B05A805935A +:107F3000159B0693FFF732F80028DBD0F56806F1B1 +:107F400014094DBB204617B0BDE8F0830C9908AB6F +:107F500030460095FFF751FE0146002842D107A8A0 +:107F6000FFF704F80E9B18449DF8203003F07003CF +:107F70000E90102BD0D10A9B002BCCD00A46009338 +:107F800006F11401099B3046CDE90178FFF7CDFDDC +:107F90000028C0D00446D5E7EB69DA0312D4EB69B8 +:107FA0009B030DD52B6A5BB1009305F12C0249466A +:107FB0003046CDE901786B6AFFF7B7FD0028E9D1BB +:107FC0002D68BEE76B69002BE9D0009305F12C0208 +:107FD00049463046CDE901782B69FFF7A6FD002818 +:107FE000DDD0D7E70446ADE72DE9F04104460D4664 +:107FF0000127304E4FF00008226BD4E90D13914257 +:1080000024D1002B52D02068E16AD0F820C00A4465 +:10801000B2FBFCF10CFB11220021E262426AE06B30 +:10802000934294BF23632263D208C4F834800FF0D4 +:10803000ADF8201DFEF7B2FF0028DDD12246314603 +:108040002046FFF74DFF0028D4D025E0481C013B17 +:10805000D4F83CC060634809A36301F01F035CF8D7 +:10806000200007FA03F30342C7D1E36A19442368E7 +:108070001A6AB1FBF2F302FB131129600121256B8F +:10808000636BAB4210D05A0903F01F005CF822204A +:1080900001FA00F0104001D1BDE8F08101336363C3 +:1080A000A36B013BA363EBE70020F5E76FF01B0038 +:1080B000F2E700BFB16F00082DE9F04F044687B02A +:1080C0000E4600F1140A05A92046FFF78DFF05466C +:1080D00048B920680599C3689847054600283BD0F1 +:1080E00010F1340FEFD0284607B0BDE8F08F0DF146 +:1080F0001307736A5A4651462046CDF80890CDE9D9 +:108100000087FFF7A8FC70B9059B524604F12001D7 +:108110002046CDF80080CDE90179FFF76DFB20B155 +:1081200010F1340FCFD00546DDE708F10108B36A3E +:108130004345DCD82368A16A9A69706B0FF018F880 +:10814000236A04F120012068F362636A3363FFF756 +:10815000ECF9059B7362C6E7804606F12C0B4FF0E5 +:108160000109E4E7CB695A0344BF23F480234FF0AD +:10817000FF322DE9F04148BFCB610546CB6990B095 +:1081800048BFCA620C4613F400302CD00F6A2C2270 +:10819000002102A80EF0FAFF236905F114060693E8 +:1081A00063690793012396E80700CDE9093710AB0F +:1081B00003E907004FF0FF3398466B61226A636959 +:1081C0009A4213D304F12C08324641462846FFF761 +:1081D000E6FA28B310F1340F05D121462846FFF7FF +:1081E0006BFF0028F0D010B0BDE8F08101230DF145 +:1081F000070202A9284600F00EFA0028F3DB01234B +:108200000DF107022146284600F041F80028EADB7C +:108210006B6901331CBFCDF83480C5F81480CDE7FD +:10822000636A2361236A6361E36923F4003343F4DF +:108230008033C4E90737D6E72DE9F04100F1A408FF +:1082400005460E46144640461F4606F007F805F15F +:1082500014003146FFF786FF054670B93FB1012F84 +:10826000336A01D11C4402E0022F0ED01C46002CC0 +:10827000AABF25466FF015053462404607F04EF858 +:108280002846BDE8F041FEF744BE7369EAE72DE9F0 +:10829000F04F9B468DB0CB69054604920C4603F027 +:1082A0000302012A00F020815E0314D4E66932053E +:1082B0001AD4276A17EB0B0F00F1198116F4003658 +:1082C00018D0D946E369B9F1000F25D123F4002372 +:1082D0005A46E36104E0FFF745FF02460028E5D077 +:1082E00010460DB0BDE8F08F6269216A8A4288BFEE +:1082F0002262DEE763699F42E3D923620BAA01236E +:10830000214628468DF82C60FFF7C1FF021EE7DBEF +:10831000236A9F42F2D8D4E79B0304F12C0620D5B0 +:108320002B68A26ADB699A4242D12B6805F1140AD4 +:108330001B6AAB63D4E90832CDE909230BA92846AF +:10834000FFF752FE0246F8B928680B99C3689847B0 +:10835000024618B312F1340F16D14FF0FF332B62DF +:10836000ECE7236A002BE0D004F12802013B314600 +:108370002846029204F1240200930192D4E90423D6 +:10838000F9F762FF024620B1E36943F40023E36199 +:10839000A6E731462868FFF7C8F8C6E70A9B2868B1 +:1083A00043BB0B9A6262A362E36943F40033E36167 +:1083B000A84658F8143BDF69A36AFF1A4F4528BF47 +:1083C0004F46049B4246314628460193A36A0297D2 +:1083D0000093636AFFF710FA0246002875D010F187 +:1083E000340FD1D121462846FFF766FE0246002809 +:1083F000E7D0C9E7013B0AA905920A93FFF70EFBF4 +:108400000A9B29680133059AC9690A938B424AD1AC +:108410000130904609AF90FAA0F3B3FA83F30593C5 +:10842000013306934FEA88035246314628460793A4 +:108430000423CDE90173079B00930B9BFFF7DCF945 +:108440000246002886D1059B434530D108F101083A +:10845000069B4345E6D80B9B6362069B9B00A2E705 +:108460000123002251462846CDF80080CDE9017352 +:10847000099BFFF7F0FA0246002885D101235246F6 +:1084800031462846CDF80080CDE901730B9BFFF7FC +:10849000B3F9024600287FF45DAF08F101080A9B9A +:1084A0009845DDD37DE790460DF12307F7E70423D8 +:1084B00051462846CDE90173079B0093099BFFF7BE +:1084C000CAFA02460028C1D05EE7236AA9EB070971 +:1084D0003B442362A36A3B44A362049B3B44049352 +:1084E0002B681B6AAB63EDE66FF00802F8E66FF0ED +:1084F0001A02F5E62DE9F04700F1A4060D46814683 +:1085000086B03046904605F0A9FEEA6909F11409E3 +:1085100002F00303012B5AD092036B6903D52A6A38 +:10852000934238BF1346984524D229464846FFF760 +:1085300019FE0446A8B905AB059005F12C01484683 +:10854000029305F11003CDE90083D5E90423F9F77F +:108550007BFE044628B9EB69C5F8148043F48033E8 +:10856000EB61304606F0DAFE204606B0BDE8F04783 +:10857000FEF7CFBC2ED92F6ABB4209D02946484608 +:10858000FFF7F0FD041E15D16B69002B24DB2B6275 +:108590004FF0000A2B6A98450ED829464846FFF747 +:1085A000E1FD20B9381EB4BF6FF01500286200EA63 +:1085B000E074D6E7D5DBEBE7012305AA2946484658 +:1085C0008DF814A0FFF763FE041EE3DAC9E76FF02D +:1085D0000804C6E70024C4E76FF01504C1E730B50E +:1085E00000F1A40585B0044628460193CDE9022197 +:1085F00005F034FE039904F11400DDE90132FFF7C0 +:1086000046FE0446284606F089FE204605B0BDE831 +:108610003040FEF77EBC2DE9F04F1D46CB699046F9 +:1086200087B003F0030207460C46022A54D09A038F +:1086300005D4266A6269964208D3002003E0FFF75A +:1086400091FD0028F5D007B0BDE8F08F961B04F12E +:108650002C0104F1280A04F1240BAE4228BF2E4657 +:10866000B146B9F1000F01D13046ECE7E3695B0395 +:1086700004D53B68A26ADB699A4210D1236A384666 +:1086800005910093CDE901BAD4E90423F9F7DCFDA3 +:108690000028D8D1E369059943F48023E3613A685F +:1086A0003846A36AD56900220093ED1A636A0591E2 +:1086B0004D4528BF4D46CDE90185FFF7CCF900288F +:1086C000C1D1236AA844A9EB050905992B4423626B +:1086D000A36A2B44A362C4E76FF00800B3E730B588 +:1086E00000F1A40585B0044628460193CDE9022196 +:1086F00005F0B4FD039904F11400DDE90132FFF740 +:108700008AFF0446284606F009FE204605B0BDE86B +:108710003040FEF7FEBB00002DE9F341064614464B +:108720000021282206F1A407204600250EF02EFD88 +:10873000384606F11408019505F090FD06F1180081 +:10874000FEF72CFC28B901AA0D494046FFF7C8FBEB +:108750000546384606F0E2FD6DB9736F019AC4E92B +:108760000033B36FC4E902359B1AC4E90435C4E988 +:108770000635FF236362284602B0BDE8F08100BFE2 +:108780009D6E0008F7B5044604300E461546FEF708 +:1087900005FC10B1002003B0F0BD012300906A4633 +:1087A000294620460193FFF735FA0028F3D105F159 +:1087B00024073846FEF7F2FB0028EBD13146384655 +:1087C000FEF7DBFB38B13A4629462046FFF722FA8E +:1087D0000028EED0DFE70120DDE72DE9F341064672 +:1087E0000C46154601F124081027226AE16822F0A0 +:1087F000004301F10C00043B984217D80C230A46B1 +:108800003046616800932B1DFFF7F7F9014690B9D8 +:10881000E66828462E60FEF7A9FB3044E060284653 +:10882000FEF7A4FBA3691844A06104E0002A06DB5C +:1088300029606FF00101084602B0BDE8F0812146D1 +:1088400042463046FFF7E6F901460028F3D1A36916 +:10885000E7601433A361C8E72DE9F84314461D46C9 +:108860000022012306460F4604F1240805F10809F9 +:10887000C4E909234046FEF791FB08B100200DE052 +:10888000424621463046FFF7C5F938B92A46214607 +:108890003046FFF7A2FF18B1831CEBD0BDE8F88388 +:1088A0002B7903F07003202BF0D139464846FEF7B0 +:1088B00064FB0028EAD10120F0E770B5054692B0CC +:1088C00004300E46FEF76AFB68BB0123019001AA43 +:1088D00007A928460293FFF79DF9044618B910A886 +:1088E000FEF75CFB10B1204612B070BD10AA07A9BC +:1088F0002846FFF78FF938B903AA07A92846FFF7DA +:108900006CFF18B1831CEAD00446ECE79DF91030E7 +:10891000002BF1DB0822314605A810F03FFB0028B0 +:10892000EAD10124DFE70024DDE700002DE9F04172 +:1089300000F1A408C8B00E4605464046174605F0AB +:108940008DFC4FF48472002106A80EF01FFCB36961 +:1089500014350E2B22D12223364908A88DF8183061 +:108960000FF01CFE0F230124B361404606F0D6FC35 +:10897000012C0DD19DF81830112B59D0222B14BF8A +:108980000023032308A9384687F800310FF006FEBC +:10899000204648B0BDE8F041FEF7BBBA0F2B08D126 +:1089A0002223254908A88DF818300FF0F7FD102371 +:1089B000D9E702AA31462846FFF70FFF044618B14F +:1089C000821C08BF0024D0E79DF80C3003F07F0222 +:1089D000112A01D0222AECD11B060CD504A9284665 +:1089E000FFF76BFF041EC0DBE3D19DF80C3003F0F2 +:1089F0007F038DF80C309DF80C302846029A112B1D +:108A00008DF8183002F104029DF80E1004BF059B8A +:108A100007939DF80D301A449DF80F300A440093D7 +:108A2000716808ABFFF7E9F8041E08BF01249CE752 +:108A30000523A7E79A9B0108999B0108F0B5012738 +:108A4000061DA7B0044680F840703046FEF7A6FA2F +:108A50000546002840F0818001462C2205A80EF032 +:108A600095FB4FF000432822294610A80D930EF0E5 +:108A70008DFB1A9723681B6A9D4202D36FF0330067 +:108A80001BE019A8FEF78AFA002866D119AA10A9D6 +:108A90002046FFF7BFF880B90D9B002B38DB30462E +:108AA000FEF77CFA58B1199B0E931A9B0F93002383 +:108AB00005A920461A4600F052F827B0F0BD01ABD8 +:108AC0001BAA0EA92046FFF7C7FE0028F5DBEAD057 +:108AD000039A0E99049B8A420F9801D1984217D0AD +:108AE000824201D1994213D00E92DFE79DF9703096 +:108AF000002B0DDA1DA92046FFF7DFFE0028DCDB86 +:108B00001ED01BAA10A9204600F075F90028D4D168 +:108B10001BAA10A92046FFF760FE0028E6D0831CA0 +:108B2000CBD10DF1400C05AF0135BCE80F000FC7EC +:108B3000BCE80F000FC79CE8070087E8070099E72B +:108B40009DF870301BAA10A903F07F038DF87030D8 +:108B50000346204600F0C3F9D8E70020ADE72DE931 +:108B6000F04F2DED028B9BB006460D460793CB6967 +:108B700007980133059202EB0017CB610B1DD1E979 +:108B8000011408EE103A1346C5E901419F420FD186 +:108B90000023CDE90941069330686968C3689847A6 +:108BA000044670B114F1340F00F0F4802046FFE069 +:108BB000D86810332A6A024453F80C0C121A2A623D +:108BC000E4E705F11C080DF12C094FF0FF3306F125 +:108BD000200A10271022414648460B93FEF7A4F9BD +:108BE000224600946B6851463046CDE90187FEF776 +:108BF00003FE04460028D5D18346B84608EE909A75 +:108C00002AE0079B9B4580F2A080059A4FEA0B1350 +:108C1000D35802EB0B19434540F0978018EE900AA9 +:108C2000D9E90212FEF780F9D9F80C30002251463A +:108C300002933046D9F80830CDE900736B68FEF72F +:108C4000DBFD04460028ADD1D9F804300BF1010B4F +:108C50009844D9F80C301F442B6A23F00043043B9E +:108C6000BB42CED804230DF12C08002251460293BA +:108C700030466B68CDE90078FEF7BEFD044600285B +:108C800090D14FF0FF330246514630467361FEF7F4 +:108C900086FD0446002885D130680369984704465C +:108CA00000287FF47FAF4FF0FF330FAF02466968B3 +:108CB0000F9330462B6A009723F00043043BFEF7E6 +:108CC00077FF044600287FF471AF0F9A0B9B9A42FE +:108CD00060D1069B4BB306F104094846FEF75EF9E6 +:108CE000002875D143463A4609A93046FFF7B4FD3E +:108CF00000285DDB6CD06B684246394630460D93E8 +:108D0000AB680E93002300F0EAF8002850D14946E2 +:108D100009A8FEF732F918B96B687360AB68B360E5 +:108D20003046FFF78BFE002842D13469002C3FF417 +:108D30003DAF18EE101A201DFEF71FF918B96B6829 +:108D40006360AB68A3602468F0E7012342460A9998 +:108D5000304600930FABFEF750FF044600287FF427 +:108D600025AF01220FA918EE900AFEF7DDF80123C6 +:108D70002246514602930FAB3046CDE900736B6833 +:108D8000FEF73AFD044600287FF40CAF08F1010815 +:108D9000013761E74FF0FF3300220FA909A83362C2 +:108DA0000123CDE90F23FEF7E8F830B96FF0330067 +:108DB0001BB0BDEC028BBDE8F08F18EE101A3046E8 +:108DC000FFF712F90123069300283FF4E5AEEFE721 +:108DD0003A4609A93046FFF7D5FC0028E8DBA4D0C5 +:108DE0006B68394630461893AB68199300231A46CE +:108DF000FFF7B5FE97E72DE9F04780468CB01046A7 +:108E00000C461646FEF7B2F80B6A143023F0004306 +:108E100083421DD101AA04314046FFF7B3FC051E71 +:108E200012DB099A002A13DA236A01A9404663F08B +:108E3000004313400993636A0A93A36A0B930023C8 +:108E40001A46FFF78CFE054628460CB0BDE8F087B1 +:108E5000336830460193FEF789F80023029001AA97 +:108E600021464046CDE903330123FFF778FE05464E +:108E70000028E9D1D8F80C70211D4FF0FF3ACFB986 +:108E8000D8F81070211D002FDED0381DFEF775F8C0 +:108E900070B9FC6833689C420AD93046FEF766F820 +:108EA000201AF8603046FEF761F8BB69181AB861FD +:108EB0003F68E8E7381DFEF760F830B9D7F80C9046 +:108EC0003368994503D1C7E901AA3F68D7E7FCD9C0 +:108ED0003046FEF74BF8A9EB0000F860F5E770B5F7 +:108EE000154688B00C26D27955F8044B002B079212 +:108EF0000094344403960494CDE9052314BF02235F +:108F000001236A46CDE90165FFF729FE08B070BD6F +:108F100070B592B006460D46FFF724F9044670BBC3 +:108F2000EB6903F41023B3F5803F28D12A1D1046C6 +:108F3000FEF734F818BB07A93046FEF76BFE04466F +:108F4000E8B90C23EA680690009304AB08990392F1 +:108F5000CDE904003046FEF750FE044678B92B698F +:108F600003AA07A905936B69069303463046FFF7EA +:108F7000B6FF044618B9EB6923F48033EB61204651 +:108F800012B070BD37B500F1A40504460191284622 +:108F900005F064F9019904F11400FFF7B9FF0446E4 +:108FA000284606F0BBF9204603B0BDE83040FDF787 +:108FB000B0BFF8B500F1A40705460C46384605F0E9 +:108FC0004DF9214605F11400FFF7A2FF05F120023B +:108FD00006462B6A1BB19C4216D123681360A36915 +:108FE0000BB11B682BB96B695B6B13B9606B0EF02F +:108FF00067F8384606F092F920460EF061F83046E0 +:10900000BDE8F840FDF785BF1A461B68E2E700009F +:109010002DE9F04F2DED028B85B01F68054608EE57 +:10902000101A029340F622031446DFF84091536071 +:10903000436893608368D3604946384610F035F83A +:1090400007EB000883464946404610F00AF801281D +:10905000064608EB000A05D117F80B302E2B0AD173 +:109060005746E9E7022806D102463F4940460FF03D +:1090700095FF0028F4D057464FF0010B4946504663 +:1090800010F013F88244494650460FF0EAFF0246BA +:1090900090B102280CD10390504633490FF07EFF67 +:1090A000039A28B9BBF1010B04D10AF10207C3E707 +:1090B0000BF1010B9244E1E798F80000002845D03D +:1090C000029BC3F800802379222B49D104F1080ABE +:1090D00018EE101A28465246FEF79CFDB0BB05F16B +:1090E000140B224618EE101A2846FFF776FB68BBD1 +:1090F000237903F07F03112B01D0222BF1D1E379E7 +:10910000B342EED1236859466279284604331344AA +:10911000A279134418EE102ACDE900865268F9F7B7 +:109120006BF8002812DBDCD095F84130002B83D19E +:1091300094F90430002BBFF67FAF51462846FFF765 +:10914000BCFB002807D001DB6FF0010005B0BDECCF +:10915000028BBDE8F08F237903F07F0323716BE767 +:109160006FF01300F2E700BF999B01089C9B010878 +:109170002DE9F041804600F1A406D4B00C4608F178 +:1091800014073046154605F069F802AB03AA07A993 +:1091900038460294FFF73CFF0446C0B901464FF43D +:1091A000847212A80DF0F2FF9DF8103008F118013A +:1091B00005A8112B8DF8483004BF069B1393FDF7CB +:1091C000DCFE0446C0B9174914A80FF0E7F9304691 +:1091D00006F0A4F8139B2B619DF84830112B1DD08D +:1091E000222B44F2FF1318BF002320466B6054B0BB +:1091F000BDE8F041FDF78DBE039B38469DF8111088 +:1092000004339DF8122019449DF813300A4400934A +:10921000089914ABFEF7F1FC0446D8E748F2FF13B7 +:10922000E3E700BF9C9B0108F0B500F1A4050446EC +:109230009DB00F46284604F1140605F00FF894F887 +:109240005430019783B101AB02AA06A93046FFF75B +:10925000DFFE044678B1284606F060F820461DB0CF +:10926000BDE8F040FDF755BE3046FFF7E7FB04468A +:109270000028E8D0EFE79DF80C30222B1ED002AA80 +:1092800006A93046FFF7B7FD04460028E3D19DF854 +:109290000C30222BDFD106AA12A93046FFF772FA52 +:1092A000041ED8DB1A9B06A930460F931B9B109314 +:1092B00000231A46FFF753FC0446CCE704AA11A981 +:1092C0003046FEF7A7FC04460028C4D1199B142B96 +:1092D000D5D06FF02604BEE773B50C4604310646C0 +:1092E000FEF782FE0546F0B904F108013046FEF7AC +:1092F0007BFE0546B8B904230246616830460093F8 +:1093000004F11C03FEF779FC10B110F1340F0DD1FC +:10931000E36914220133E3614FF0FF33C4E908230A +:10932000A3621023E360284602B070BD0546FAE749 +:109330002DE9F04F00F1A4080646C3B00D464046A3 +:1093400004F08CFFD6F8903063B1002D08BF1D46A5 +:10935000336830469B6A9847044668B1404605F03A +:10936000DDFF05E045B96FF01204404605F0D6FF79 +:10937000204643B0BDE8F08F2B6828469B68D6E9AD +:1093800025BAD6E92797984704460028E6D1242233 +:10939000014628A80DF0FAFE6A4B2846239524932F +:1093A000694B2593694B2693694B27932B685B6A1E +:1093B00098472B6858452CBF2890CDF8A0B0284678 +:1093C0009B6A98472B6850452CBF2990CDF8A4A0E4 +:1093D0002846DB6A98472B6848452CBF2A90CDF871 +:1093E000A89028469B6B984723462A9A10F022F8AB +:1093F0002B901F3023A920F01F00B84294BF2C905F +:109400002C9731A8FEF70EF90446002840F086801C +:10941000319B014640985A6AD2080DF0B7FE319A46 +:109420000DA931A83C94D2E90832CDE93E439A42D5 +:1094300094BF3D923D93FFF74FFF0446002869D14A +:1094400018A931A8FFF748FF0446002862D1034657 +:10945000024618A931A8FFF782FB0446002859D11B +:1094600041F22E438DF816001A9F4FF01009ADF807 +:1094700014300823DDF864C08DF81730319B339722 +:10948000DA691B6A089209934FF00113314A0A9373 +:109490000BAB106851686A46CDF8C8C0CDF8109083 +:1094A000CDF8009003C334230DA931A815932023D0 +:1094B000CDE906C7CDE916C705AF0193CDE9027323 +:1094C0000123FFF74CFB4B4620B110F1340F02D0C3 +:1094D00004461FE00124009320236A460DA903934C +:1094E00031A8CDE901370123FFF739FB20B110F195 +:1094F000340FEDD1002CEBD0002201230DA931A8AF +:10950000CDE900236A46FEF785FB044610B9319B7E +:109510001B6A3F9331A8FEF732F86CB12046FDF785 +:10952000F8FC044600287FF419AF3368294630461A +:109530005B6A9847044611E72B682846DB68984722 +:10954000EFE700BFA76E0008CB6E0008EF6E0008C3 +:109550000B6F0008909B01082DE9F043074695B07A +:109560000E469046994601F124044046316AFDF7C3 +:10957000FDFC3B680844DB69984218D8043943462F +:10958000002243F8041B0991CDE90A230C23CDE9FD +:109590000C3198F807303146CDE90E29109309AA0D +:1095A00002233846FFF7DBFA15B0BDE8F083002947 +:1095B00037DB354609AC0FCD0FC40FCD0FC495E88E +:1095C000070084E8070031463846FFF785FE00288B +:1095D000EAD1129B424631467362139BB362336AEF +:1095E000043B42F8043B03920C22CDE90130CDE963 +:1095F000042398F8073001AACDE9060908933846F4 +:109600000223FFF7ACFA0028CED1119B024609A92C +:1096100043F00043119373681293B36813930346A6 +:10962000BFE7224631463846FEF7F4FA00289CD0C0 +:10963000BAE7F0B500F1A40605469FB00C463046E7 +:1096400005F1140704F00AFE95F854300394002B3A +:1096500043D003AB04AA08A93846FFF7D9FC831C02 +:10966000044649D12F2103980FF0EEFC00283AD18F +:109670006B6913A938461B6AEB64FFF72DFE04469D +:10968000002830D1119B024613A91C93129B1D93F5 +:1096900003463846FFF763FA044620BB40F6220330 +:1096A0008DF81600ADF81430039B184601930EF0A8 +:1096B0007DFF1499159A8DF8170038460691079288 +:1096C000019BCDE9111204AA08A9FFF745FF044642 +:1096D00048B96B691B6AEB6405E03846FFF7AEF9E1 +:1096E00004460028B5D0304605F018FE20461FB0CD +:1096F000BDE8F040FDF70DBC002808BF6FF0100476 +:10970000F1E72DE9F04300F1A4058046B3B00F4620 +:109710002846144604F0A2FD98F8543008F11406C7 +:10972000CDE90274002B4DD0029B05AA11A9304649 +:10973000049304ABFFF76CFC0446002848D19DF865 +:10974000183005AA11A963F07F038DF8183003467D +:109750003046FFF7C4FB0446002839D10DF1240937 +:1097600003AB1CA930464A46FFF752FC07460028C7 +:1097700037D0821C40F085802F2103980FF064FCC5 +:1097800000287ED10DAC99E80F0084E80F0006AAEE +:109790000EAB07CA83E807009DF8383003F07F035B +:1097A0008DF83830039B184601930EF0FFFEBB1C6A +:1097B0008DF83B00019B2CD122461CA93046FFF7B7 +:1097C000CBFE2BE03046FFF739F904460028ABD03A +:1097D000284605F0A3FD204633B0BDE8F043FDF771 +:1097E00098BB9DF818309DF8282003F07F039A421B +:1097F00049D1222AC6D10BAA27A93046FEF70AFA78 +:1098000004460028E4D12F9B142BBBD06FF0260414 +:10981000DEE722461CA93046FFF761FB044600281C +:10982000D6D1012305AA11A9304688F8553002ABDC +:10983000FFF7EEFB04460028CAD188F855008146A0 +:1098400005AA11A93046FFF7D6FA04460028BFD171 +:109850000237BDD09DF82830222BB9D11CAA28A9E7 +:109860003046FEF78FFF041EB2DB309B4A461CA930 +:1098700030462593319B26934B46FFF770F90446FB +:10988000A6E73C46A4E76FF01404A1E7024600F106 +:109890000B01002012F8013B03EBC0138A4203EBDB +:1098A000500303F0FF00F5D1704738B5836B0546D0 +:1098B0000C468B420FD0FDF71DFD58B922460123FF +:1098C000E96B6878FDF728FC00281CBF4FF0FF34D7 +:1098D0000120AC6338BD0020FCE70129F8B504463F +:1098E0000E4664D9036A994261D20378022B30D0C4 +:1098F000032B45D0012B5AD101EB51058389C16A55 +:10990000B5FBF3F31944FFF7D0FF10B14FF0FF3070 +:10991000F8BDA1896F1C2046B5FBF1F301FB13557F +:10992000E36BB7FBF1F15D5DE36A1944FFF7BDFF3F +:109930000028EBD1A289B7FBF2F302FB1373E26BB1 +:10994000D05CF30745EA00204CBF0009C0F30B00D0 +:10995000DEE783895B08B1FBF3F3C16A1944FFF7C3 +:10996000A4FF0028D2D1A2897600B6FBF2F302FB55 +:109970001366E36B9A19985D527840EA0220C7E7B4 +:1099800083899B08B1FBF3F3C16A1944FFF78DFF8C +:109990000028BBD1A189B600B6FBF1F001FB10662F +:1099A000E06B3044FDF7D0FC20F07040B0E70120C0 +:1099B000AEE72DE9F04F1E46036885B00C46DB6F1D +:1099C00082469146984703A92046FDF757FC054675 +:1099D0000746002840F0A480657C0DBB237C13F073 +:1099E0000103009300F09E80E3682F4662699B1A92 +:1099F0009E4228BF1E469EB1039862698389B2FBCE +:109A0000F3F103FB1123002B6AD14389013B0B4087 +:109A100001931FD192B9A068012814D8022565745A +:109A2000DAF800305046D3F880309847002D7CD0CB +:109A3000284605B0BDE8F04FFDF7A4BBA16920683A +:109A4000FFF74BFFE8E7431C03D10123009D63743C +:109A5000E6E7A061DDF80CB0A1695846FDF73FFCD0 +:109A60000028DBD0019B03EB0008BBF80C309E42C2 +:109A700034D30199BBF80A209BF80100B6FBF3F33D +:109A800019449142494684BF019BD31A424601932F +:109A9000FDF742FB019B0028D7D1DDF80CB09BF805 +:109AA00003207AB1DBF83800A0EB0800834209D923 +:109AB000BBF80C20DBF83C1000FB029001930DF08A +:109AC00057FB019BBBF80C8003FB08F86369A6EB0E +:109AD00008064744C144434463618CE7C4F81C80D2 +:109AE000039862698389E169B2FBF3F803FB1828E4 +:109AF000A3EB0803B34228BF33469846FFF7D5FED1 +:109B00000028A2D1039A60699189B0FBF1F301FBAF +:109B10001303D16B4846424619440DF029FBD5E7A3 +:109B200000277DE72F4607257AE7384605B0BDE8D0 +:109B3000F08FB1F5001FF8B504460D4601D30220A1 +:109B4000F8BDCA06FBD1826806680161DAB93378CC +:109B5000022B01D9336BABB93389B3EB551FEED967 +:109B6000336BA361A3696261002BE8D0B289002046 +:109B7000B5FBF2F10B4402FB1151F56BA3612944D3 +:109B8000E161DDE71A467389B7895F43BD4211463B +:109B90000CD32068FFF7A1FE431C02460BD001281E +:109BA000CDD9336A8342CAD9ED1BEFE73046FDF7C2 +:109BB00096FBA061D6E70120C2E7F7B501A90546EB +:109BC000FDF75CFB044660BB2C7C14F0400428D0FD +:109BD000FDF7E4FE296A07460198FFF766FE044692 +:109BE000F8B96E6AF37A314643F02003F372AA683B +:109BF0002868FDF729FBE96806F11C00FDF79CFBCE +:109C0000394606F11600FDF797FB01230198B4745D +:109C1000F474C370FDF778FE2B7C044623F04003F8 +:109C20002B74204603B0F0BD38B503680D460446DA +:109C3000DB6F98472846FFF7C0FF2368054620469C +:109C4000D3F8803098472846BDE83840FDF79ABAE7 +:109C5000036873B50D46DB6F064698472846FFF745 +:109C6000ACFF044630B901A92846FDF707FB0446BE +:109C700000B9286033683046D3F88030984715B172 +:109C800028460DF01DFA204602B0BDE87040FDF7F1 +:109C900079BA000038B500230446C3704FF0FF3393 +:109CA0008363FFF702FE002851D1E46B237894F818 +:109CB000FF5194F8FE01EB2B40EA052503D0183341 +:109CC000DBB2012B3CD84AF655239D4207D108222E +:109CD000214904F152000FF061F9002836D0227BAF +:109CE000E37A43EA0223A3F50072B2F5606F27D846 +:109CF000607B28B3591E421E0B40024013431FD104 +:109D0000E27BA37B53EA02231AD0237C013B012B85 +:109D100016D8A27C637C53EA022311D0227DE37C17 +:109D200043EA02237F2B06D804F12000FDF70CFB49 +:109D3000B0F5803F04D3E27DA37D53EA022308D12E +:109D40004AF6552085420CBF0220032038BD04206E +:109D5000FCE70020FAE700BFB59B01082DE9F04FB2 +:109D6000002687B00D4617460E60FDF79BFA0028C7 +:109D7000C0F25481B24B53F82040002C00F05081C7 +:109D80002C602378BBB96070C0B2AE4D55F820008E +:109D900003689B68984710F00106C3B240F0428107 +:109DA00017F0FE0F02D05B0700F13E81607855F896 +:109DB000203023B90126304607B0BDE8F08FFDF70B +:109DC0004DF9A0F50072A081B2F5606FF2D8421E85 +:109DD0000242EFD1E36B002B00F0F580002120461A +:109DE000FFF758FF022840F00081E56B02AF05F550 +:109DF000E371B84605F206250846FDF7A5FA1031CD +:109E000048F8040B8D42F7D1002557F8041B0029B0 +:109E100000F0E1802046FFF73DFF012800F2DC80E2 +:109E2000E56BB4F80C902A7BEB7A43EA0223994560 +:109E300040F0D980E87DA97D51EA002104D105F1E7 +:109E40002400FDF781FA0146616295F810A0D4F86C +:109E500038B00AF1FF3384F802A0012B00F2C3806E +:109E60006B7B6381002B00F0BE805A1E1A4240F0CB +:109E7000BA80AA7C95F8118048EA02280FFA88F285 +:109E8000A4F8088000924FEA5912B8FBF2F702FBDF +:109E9000178292B2002A40F0A6802A7DE87C50EA20 +:109EA000022005D105F120000193FDF74DFA019B39 +:109EB00095F80FC0AA7B52EA0C2200F0948001FBB7 +:109EC0000AFC174407EB0C0E7045C0F08C80A0EB29 +:109ED0000E009842B0FBF3F7C0F085805A4B9F42CA +:109EE00000F281804FF6F5739F4240F29F804FF061 +:109EF000030A02375A440BEB0E03BAF1030F276231 +:109F0000C4F828B0E262636376D195F82B2095F807 +:109F10002A3043EA0223009A1A4313B2002B62D17B +:109F2000BF0005F12C00FDF70FFA206309F1FF33A4 +:109F30001F44B7FBF9F9894555D84FF0FF33BAF103 +:109F4000030FC4E905334FF08003237130D195F836 +:109F5000312095F8303043EA0223012B28D10BF150 +:109F600001012046FFF7A1FC10BBE16B207191F8C5 +:109F7000FF2191F8FE3143EA02234AF6552293422B +:109F800016D10846FDF7E0F9304B984210D101F5A3 +:109F9000F270FDF7D9F92E4B984209D101F5F47012 +:109FA000FDF7D2F9A06101F5F670FDF7CDF960611A +:109FB000284A84F800A0138801339BB21380E38001 +:109FC0000023E361F7E60DF073F8E06300287FF407 +:109FD00005AF1126EFE603200135042D7FF415AF00 +:109FE00004283FF4E7AE0D26E5E604283FF4E2AE90 +:109FF00001287FF615AFF6E7B8F1000FF3D0BAF1FC +:10A00000020F4FEA470362441ABFDB1907F001074A +:10A010001F46226318BF07EB530787E70B26CAE6E4 +:10A020000C26C8E60326C6E60A26C4E640F6F57AFC +:10A0300057458CBF4FF0020A4FF0010A59E700BFA5 +:10A04000601A0024981A0024F5FFFF0F5252614154 +:10A05000727241615C1A00242DE9F74F1546804663 +:10A060002822002128460DF091F8D8F8003040460B +:10A07000DB6F984708F15403002201A9684600935A +:10A08000FFF76CFE06460446002871D1DDF8049007 +:10A09000D9F820A0D9F81870AAF102039F421CD960 +:10A0A00099F80060012E36D14FF0020A074651465A +:10A0B0004846FFF712FC431C5AD0012857D000B97C +:10A0C0000137019B0AF1010A1B6A9A45EFD3019BF4 +:10A0D0001A799F6142F001021A71B9F80C3000241C +:10A0E000D9F820204046C5E90033023AB9F80A30D1 +:10A0F0005A435F43FF236B62D8F80030C5E902245E +:10A10000D3F88030C5E90474C5E906749847204641 +:10A1100003B0BDE8F08FD9F82C1007463CB9019880 +:10A1200001F1010BFFF7C1FB064608BB5946019E32 +:10A130003278F36B022A03EB04000FD11B5D02346B +:10A14000427853EA022308BF0137B389BAF1010A02 +:10A15000B4FBF3F203FB1244E0D1B8E7FDF7F4F8E7 +:10A1600030F0704304F1040408BF0137EDE7022624 +:10A17000D8F800304046D3F880309847304603B0D6 +:10A18000BDE8F04FFCF7FEBF7FB5CDE9001003A896 +:10A1900014460391FDF786F8051E19DB0D4E56F89F +:10A1A000252022B10023D06B13700CF089FF019B96 +:10A1B00013B100221A70DA6346F825302CB1002260 +:10A1C00001A96846FFF7CAFD0446204604B070BDE9 +:10A1D0000B24FAE7601A0024F8B503680446DB6F25 +:10A1E0009847A36D013308D123686FF01505204609 +:10A1F000D3F8803098472846F8BD002204F1540176 +:10A20000104F1046FFF7C0FFA36D064657F8230016 +:10A210000368DB6898472368054620B1D3F880308F +:10A2200020469847E7E7A26DD3F8803047F8220030 +:10A230004FF0FF322046A26598473046BDE8F8400F +:10A24000FCF7A0BF981A00240A4B03F108029833C8 +:10A2500010B5026004464360FFF7BEFF064B204680 +:10A2600003F108023433226040F8043F05F002FE97 +:10A27000204610BDB89D0108589E0108A0F10400B9 +:10A28000FFF7E2BF10B50446FFF7DEFF20460CF0F3 +:10A2900017FF204610BDA0F10400FFF7F3BF000038 +:10A2A000036873B50446DB6F01920D469847A36DB2 +:10A2B000019A013308D023682046D3F880309847AC +:10A2C0006FF0150002B070BD16480023064650F826 +:10A2D000041BE1B946F8235004F11400A3653033A0 +:10A2E00084F8561004F1540184F854303A2384F869 +:10A2F0005530FFF749FF236805462046D3F88030E4 +:10A300009847284602B0BDE87040FCF73BBF0133D8 +:10A31000042BDCD123682046D3F8803098476FF0B7 +:10A320000B00CFE7981A00242DE9F04F03688B4605 +:10A330001746DB6F2DED028BA7B003909847039B68 +:10A340009B6D5C1C0FD0BBF1000F02D1A34A52F8E9 +:10A3500023B0039B03981B689B6A9847824610B101 +:10A36000039B1B686EE0BBF1000F0DD1039B6FF0E8 +:10A37000120A03981B68D3F880309847504627B0DC +:10A38000BDEC028BBDE8F08F954B002110A80F9318 +:10A39000F7F75EFE934B4022002114A80F939033F1 +:10A3A00010930CF0F3FE4FF0FF330FA82593FDF749 +:10A3B000A1FADBF8003058469B689847824610B1F6 +:10A3C000F7F710FF35E0DBF800305846DB6A9847B6 +:10A3D00003185846049341EB01030593DBF8003062 +:10A3E000DDE90412CDE900120022D9690023884773 +:10A3F000DBF80030824618B1DB6858469847DFE743 +:10A400005B6B58469847002847DADBF8003058461F +:10A410009B6A9847064689460CF04AFE8046B0B9CA +:10A42000DBF800306FF00B0A5846DB689847F7F707 +:10A43000D9FE0FA8FFF708FF039B1B68BAF1000FB6 +:10A4400000F08E82D3F880300398984796E7002476 +:10A4500000253246FF210CF099FEDDE904239D42E0 +:10A4600008BF944216D2DBF80030224641465846D7 +:10A47000CDE90069D3F818A02B46D047824628B111 +:10A4800040460CF01DFEDBF80030B5E7A41945EBA3 +:10A490000905E2E740460CF013FEDBF800305846B1 +:10A4A0001C6A9B6B984700230022CDE900015846A7 +:10A4B000A047DBF8003082465846DB68BAF1000F4F +:10A4C0009CD19847824600287FF47AAF02465946CD +:10A4D0000FA8FFF7E5FE824600287FF471AF24AB9A +:10A4E0000CA80C93FCF7DEFE0028C0F237823E4B2E +:10A4F00053F820300BB183F800A0C6B2374D55F8A1 +:10A50000260003689B689847C3B2C00700F1248205 +:10A51000590700F11F8255F826300BB9012432E0AB +:10A520003046FCF79BFDA0F5007380469BB2B3F567 +:10A53000606FF3D8421E0240F0D1B7F1807F2CD873 +:10A540007B1E3B4218BF00274FF48053B3FBF8F348 +:10A55000099303FB08F3184608EE103A0CF0A8FD27 +:10A560000446002800F0DF8155F82630002B00F06B +:10A570002D813046FCF7EEFD7F2881460FD820461E +:10A580000E240CF09DFD0FA8FFF726FEF7F72AFE1C +:10A590002046FCF7F7FD82464BE71746D4E7B7FBAA +:10A5A000F8F7802F28BF8027FDF7F8F94FEA193315 +:10A5B00008F1FF3C4FEA594E4FF6F5710A900B93A4 +:10A5C000002F48D1094B012533F8020B002843D056 +:10A5D0000B9A824240D36D00F6E700BF981A002420 +:10A5E0009C9E0108C09D0108601A0024FEA101087C +:10A5F0006D082F464FF0030AB9FBF5F3981CA3F53D +:10A600007F430CEB8000F63BB0FBF8F00790202076 +:10A61000049000200690C5488342B0D8049B079A56 +:10A620009818069A00EB051313444B45A7D8069BD0 +:10A63000BAF1030FA9EB0303A3EB0003B3FBF5F39C +:10A64000089327D18B4250D8002F98D1012DCFD815 +:10A6500095E73D46CEE73D4640F6F572B9FBF5F38A +:10A66000934293BF03EB430302334FF0020A4FF0D0 +:10A67000010A97BF01335B005B0803336344B3FBFC +:10A68000F8F307934FF48043B3FBF8F306930123E9 +:10A690000493C3E7BAF1020F1FD1089B8B420ED976 +:10A6A000002FD6D16D00402D15D9A14B012533F8CF +:10A6B000020B00289ED086459CD36D00F7E7089BCF +:10A6C00040F6F572934210D8002F7FF458AF6D001A +:10A6D000802D3FF654AF2F4672E740F6F573089A87 +:10A6E0009A423FF64CAF4FF0010A002709F1FF33C1 +:10A6F0000DA930460E930D97FCF7C0FC4246394633 +:10A7000020460CF043FD8B4A2346BAF1030F5168F3 +:10A71000106803C31189927A19809A704FEA28232E +:10A7200084F80B802373049B6573A3734FF00103BC +:10A73000E773237414BF02233B46B9F5803F677467 +:10A74000A37446D24FEA292384F8139023750A9BF9 +:10A75000002104F11C004B449946F8236375764BA5 +:10A76000A361FCF7E9FDBAF1030F494637D104F1C3 +:10A770004300FCF7E1FD079904F12400FCF7DCFD40 +:10A7800002216E4B04F14702C4E90B13802384F8C5 +:10A790004030292384F84230694B03F1100153F80B +:10A7A000040B8B4242F8040BF9D119884AF655295B +:10A7B0009B78304611802146937001230022A4F833 +:10A7C000FE91FCF77FFC074608B320460CF078FCAE +:10A7D000A4E6494604F12000FCF7AEFDB7E704F11A +:10A7E0002700FCF7A9FD079B04F12B02E3828023DD +:10A7F00084F82430292384F82630524B03F11001C9 +:10A8000053F8040B8B4242F8040BF9D1CDE7BAF1AF +:10A81000030F2AD10123062221463046FCF752FCC1 +:10A820004246394620460CF0B1FC474B04F5F47023 +:10A83000236003F1FF5303F500532033C4F8E431E0 +:10A84000089B591EFCF778FD022307222146C4F815 +:10A85000EC3130460123A4F8FE91FCF733FC0123D0 +:10A86000214630461A46FCF72DFC18EE102A00212E +:10A8700020460CF08BFCBAF1030F4AD14FF0FF33A6 +:10A880006FF00702C4E900236FF07043A360099BD7 +:10A890002146079A3046934228BF1346049A1F4622 +:10A8A000FCF710FC014600288FD1424620460CF0F0 +:10A8B0006DFC049B3B440493079BDB1B0793E6D191 +:10A8C000069BBAF1030F08BF2B460693099B21464E +:10A8D000069A3046934228BF1346049A1D46FCF759 +:10A8E000F1FB00287FF471AF049B2B440493069B7B +:10A8F0005B1B0693EAD1154B204653F82630002BFC +:10A900003FF464AF0CF0DCFB0FA8FFF765FC824658 +:10A9100056E5BAF1010F0E49204618BF6FF0070146 +:10A92000FCF70AFDB3E711242DE600BFFFFFFE0F81 +:10A930000CA201089E9B01083F00FF0001000600D9 +:10A94000AA9B0108BE9B010852526141981A00243B +:10A95000F8FFFF000A2416E6032414E60B2412E68F +:10A960005B6A5946039898478246F9E401292DE924 +:10A97000F84304460E46174640F28380036A8B4232 +:10A980007FD90378022B45D0032B5AD0012B78D1E5 +:10A9900001EB51098389C16AB9FBF3F31944FEF74E +:10A9A00084FF054660BBA38916F00106E06B09F140 +:10A9B0000108B9FBF3F203FB12920FBFFBB2835CF9 +:10A9C00003F00F013B011CBF03F0F0030B43835462 +:10A9D0000123E16A2046E370A389B8FBF3F319442D +:10A9E000FEF763FF054658B9A389E16BB8FBF3F0A6 +:10A9F00003FB10803EB1C7F307170F540123E37028 +:10AA00002846BDE8F8830B5CC7F3032723F00F0348 +:10AA10001F43F2E783895B08B1FBF3F3C16A194472 +:10AA2000FEF743FF05460028EAD1A2897600B6FB6F +:10AA3000F2F302FB1366E36B9F5598193F124770C0 +:10AA4000DCE783899B08B1FBF3F3C16A1944FEF785 +:10AA50002CFF05460028D3D1A389B60027F0704704 +:10AA6000B6FBF3F103FB1161E66B0E443046FCF7D5 +:10AA70006BFC00F0704047EA00013046FCF75CFCDC +:10AA8000BCE70225BCE72DE9F041804605680F468A +:10AA900049B96E69C6B12B6AB34298BF0126AB694A +:10AAA000A3B9002406E02846FEF717FF0128044654 +:10AAB00003D801242046BDE8F081421C51D02B6A06 +:10AAC0008342F7D83E46EAE70126E8E7BE4215D1C1 +:10AAD0002B6A741CD8F80000A34298BF02242146B8 +:10AAE000FEF7FBFE0128E4D0431C3AD0D8B16B69D5 +:10AAF000012B03D92A6A934238BF1E4634460134DB +:10AB00002B6AA34202D8012ECBD902242146D8F8C1 +:10AB10000000FEF7E2FE40B10128CAD0013020D08B +:10AB2000B442ECD1BDE7002CE8D04FF0FF32214613 +:10AB30002846FFF71BFF90B957B92A6AAB69023A5A +:10AB40006C61934210D92B7943F001032B71B1E76B +:10AB5000224639462846FFF709FF0028EDD0012894 +:10AB6000A7D14FF0FF34A5E7013BAB61EBE72DE93F +:10AB7000F04F1E46036885B00D46DB6F8246914656 +:10AB8000984703A92846FCF779FB044607460028A6 +:10AB900040F0D7806C7C5CBB2B7C9A0740F1D38063 +:10ABA0006B690027DE42009728BFDE43002E00F0CD +:10ABB000BC8003986A698389B2FBF3F103FB11231C +:10ABC000002B40F08E80B0F80A8008F1FF3818EAB8 +:10ABD000010826D1DAB9A86830B901462846FFF73E +:10ABE00052FF002800F0A180012812D102246C74C9 +:10ABF000DAF800305046D3F880309847002C00F047 +:10AC0000A580204605B0BDE8F04FFCF7BBBAA969A6 +:10AC1000E4E7431C01D10124E9E7AB68A86103B96B +:10AC2000A8600398EB69826B9A4247D0DDF80CB0BC +:10AC3000A9695846FCF753FB0028D7D0BBF80C3065 +:10AC400008EB00029E423ED3BBF80A10B6FBF3F3BA +:10AC500008EB030088429BF8010088BFA1EB0803C2 +:10AC60004946CDE90023FCF72DFA8046DDE90023B3 +:10AC70000028D0D10398816B891A8B420AD9828926 +:10AC8000C06B02FB019100930CF072FA039A009BD7 +:10AC900082F80380039AB2F80C8003FB08F80123C2 +:10ACA00000936B69A6EB0806EA6847444344C14435 +:10ACB0006B619A422CBFEA60EB6077E7FCF71AFB06 +:10ACC0000028B3D0A7E76969EB68994208D35846D2 +:10ACD0000192FCF70FFB019A00289CD1039B9A6319 +:10ACE000EA6103986B69B0F80C80E969B3FBF8F28C +:10ACF00008FB1232A8EB0208B04528BFB046FEF7A9 +:10AD0000D4FD002887D1039A69699089B1FBF0F3DB +:10AD100000FB1313D06B4946424618440CF028FA46 +:10AD2000039B4FF00102DA70BBE72B7C43F040033A +:10AD30002B74009B002B3FF45BAF2846FEF73DFFD2 +:10AD400056E7002754E72746072451E7384605B061 +:10AD5000BDE8F08F2DE9F3410D4601A90446FCF74B +:10AD60008DFA0646002863D1667C002E60D1E36828 +:10AD7000AB4204D2227C12F0020F08BF1D46002213 +:10AD800063696261B5B90020E2686369934281BF7B +:10AD9000227CE36042F040022274019A9189B3FB65 +:10ADA000F1F201FB1233002B42D0E369834218BF5A +:10ADB000E0613DE0019A518997894F4373B3013BAC +:10ADC0006A1EB3FBF7F1B2FBF7F28A4226D37A424E +:10ADD000A1691340ED1A63610029D4D0BD426369B3 +:10ADE0000CD93B44A5EB07086361237C9A072AD55D +:10ADF0002046FFF748FE054648BB014663690198B7 +:10AE00002B4463618389B5FBF3F203FB1255002DDC +:10AE1000B9D0FCF764FA48B11044B5E7A16881B92C +:10AE20002046FFF730FE0128014605D10226667450 +:10AE3000304602B0BDE8F081481C01D10126F6E79A +:10AE4000A160A161C8E72068FEF747FD05466B1CBD +:10AE5000F4D0012DEAD9019B1B6AAB42E6D9294601 +:10AE6000A5614546BAE7F8B51F46036806460D4694 +:10AE7000DB6F14469847022F12D1EB681C44214621 +:10AE80002846FFF767FF336804463046D3F8803022 +:10AE90006D69984744B12046BDE8F840FCF772B9A7 +:10AEA000012FECD16B69E9E72846F8BD2DE9F041A7 +:10AEB00007690446884606682037B7F5001F24BF97 +:10AEC00000238361836983B1B289B7FBF2F002FB8F +:10AED0001072002A38D101336169A36139B933890D +:10AEE000B3EB571F30D80023A36104200AE0738915 +:10AEF000013B034228D13046FEF7EFFC012805460E +:10AF000002D80220BDE8F081421C01D10120F9E7FE +:10AF1000336A834212D8B8F1000FE4D06169204649 +:10AF2000FFF7B1FD0546D0B10128EAD0431CEDD0B2 +:10AF300001463046FCF7B1FB0028E7D129463046F0 +:10AF40006561FCF7CCF9A061B28900202761B7FBED +:10AF5000F2F302FB1373F76B1F44E761D2E707209C +:10AF6000D0E72DE9F3410F4601A90546FCF786F924 +:10AF7000044628B947B901462846FEF7DAFD0446DB +:10AF8000204602B0BDE8F0814FF400700CF090F85C +:10AF90000646C0B1019B18612846F7F79BF810F0F0 +:10AFA000FB0804460BD139462846FCF7D5F9414643 +:10AFB0002846FFF77BFF042814BF044600243046D0 +:10AFC0000CF07EF8DCE71124DAE7036870B50D4673 +:10AFD0000446DB6F984728460021FFF7C2FF23682D +:10AFE0002046D3F88030BDE8704018470368F0B5BC +:10AFF00016460F69C7B0DB6F05460C469847B74247 +:10B000000ADD00212046FFF7ACFF2B682846D3F865 +:10B010008030984747B0F0BDB742F6DA694620461F +:10B02000FFF79FFF27690028EFD19DF81630002B0E +:10B03000F2D1EAE7036870B50E46C6B00546DB6F8D +:10B040001446984730466946FFF78BFF2B68064643 +:10B050002846D3F8803098472EB1304646B0BDE838 +:10B060007040FCF78FB89DF8160088B19DF8083045 +:10B0700013F0100F14BF0323052384F80031237845 +:10B080002BB9FF220DF1160120460DF0FBFF012028 +:10B0900046B070BDC16A4B1C2DE9F04104460568FD +:10B0A000066918D1E5274FF00108A1692846FEF787 +:10B0B000FCFB60B9E3691F7085F803802369B34224 +:10B0C0000DD201462046FFF7F1FE0028EDD00428FE +:10B0D00008BF022003E0FEF72CFD0028E2D0BDE807 +:10B0E000F08100002DE9F04F002187B00446D0F830 +:10B0F00000B0FEF71EFD0746002840F095804FF097 +:10B10000FF094FF0FF33C846E3620293A169584636 +:10B11000FEF7CBFB0746002840F08680E5692E78D5 +:10B12000002E00F08580EA7AE52E02F03F03A3713D +:10B1300003D0120704D50F2B04D0029BE36256E024 +:10B140000F2B5CD194F82B30580646D471064CD5A1 +:10B15000236906F0BF0695F80D90E3626B7B4B45C3 +:10B1600045D1EA7EAB7E53EA022340D12A78DBF850 +:10B17000103002F03F07DFF8C0A001937B1E0D27BF +:10B180005F4301231AF8011B681815F80180407805 +:10B1900048EA002873B3FF2F059228D84046FBF7F2 +:10B1A000FDFF019B791C049033F817000391FBF716 +:10B1B000F5FF049B98421AD103994346059A0F461E +:10B1C0001C495145DED1520604D51BB1019B33F811 +:10B1D000173063B9013E5FFA86F800212046FFF779 +:10B1E00065FE0746002891D01EE0B045B6D04FF06E +:10B1F000FF08F2E74FF6FF718845E1D0F7E7B8F1B5 +:10B20000000F04D12846FEF741FB48450CD094F8C6 +:10B210002B7017F0010790D10B2204F12001284672 +:10B220000DF0BCFE002888D1384607B0BDE8F08F8D +:10B230000427F9E71D990108109901082DE9F04F3D +:10B240000B7885B0064689462F2BD0F800B001D088 +:10B250005C2B09D14A461378914601322F2BFAD044 +:10B260005C2BF8D0002301E0DBF81C30B36099F8C8 +:10B2700000301F2B00F2308180230021304686F8F9 +:10B280002B3005B0BDE8F04FFEF753BC49460B78B4 +:10B29000894601312F2BFAD05C2BF8D01F2B8CBFA5 +:10B2A00000240424012F2FD113882E2B31D1002309 +:10B2B00022F8173006F120029F428CBF2E21202158 +:10B2C00001330B2B02F8011BF6D144F02004304669 +:10B2D00086F82B40FFF706FF96F82B30002800F089 +:10B2E000E68004280BD1990603F0040240F1DB80CC +:10B2F000002A00F0F1808023002086F82B3005B072 +:10B30000BDE8F08F0424CDE7022F02D153882E2B05 +:10B31000CAD0911E3FB131F81730202B01D02E2B0F +:10B3200001D1013FF6E7002322F81730002F00F08B +:10B33000FD8032F81300194601332028F9D009B9ED +:10B340002E2801D144F00304931E33F817002E2851 +:10B3500001D0013FF9D14FF020334FF0000A736262 +:10B36000D0463362C6F827300823481C32F8115003 +:10B370000090B5B1202D03D02E2D05D1B84208D0B4 +:10B3800044F003040099F0E79A4505D20099B942C8 +:10B390003BD10B2B30D101E00B2B27D144F0030420 +:10B3A0000B2396F82020E52A04BF052286F82020EA +:10B3B000082B04BF4FEA88085FFA88F808F00C03EE +:10B3C0000C2B03D008F00303032B01D144F002043B +:10B3D000A0073FF57CAF18F0010F18BF44F0100430 +:10B3E00018F0040F18BF44F0080470E70099B94240 +:10B3F00002D044F00304D4D84FEA88080B234FF05E +:10B40000080A00975FFA88F8BCE77F2D14D944F04A +:10B4100002012846CDE902230191FBF703FF10F05A +:10B42000800F0546039BDDE9011216D000F07F0571 +:10B430004048455D0C4645B329463F48CDE90123C8 +:10B440000DF002FEDDE90123F8B9A5F1410189B251 +:10B4500019291ED848F0020810E0FF28EAD9581E22 +:10B46000824503D344F003049A468BE706EB0A00B7 +:10B470002C120AF1010A80F820400C4606EB0A0162 +:10B480000AF1010A81F820507CE744F003045F25AB +:10B49000F4E7A5F1610189B219299EBF203D48F06A +:10B4A0000108ADB2EAE7002A08BF052027E75A07DE +:10B4B0003FF525AFB379DB063AD5BBF80C103269FE +:10B4C0009BF80000B2FBF1F301FB1323DBF83C1007 +:10B4D0001944FBF7C4FEB060336800271A6919F8F5 +:10B4E000013B9CB2002B3FF40DAF7F2C06D903F13A +:10B4F00000431249803B31F81340BCB11F2C7FF64A +:10B5000001AF2F2C3FF4C2AE5C2C3FF4BFAE7F2CBA +:10B5100006D821460A4800920DF096FD009A28B9F7 +:10B52000FF2F03D022F817400137D8E70620E6E6C0 +:10B530000520E4E6F69B0108DB9B0108769C0108E8 +:10B54000D29B01082DE9F04F90F82BB089B004464A +:10B550001BF0A00540F0928007683B6933F8152086 +:10B560000AB10135FAE704F120060DF1140A1BF0C7 +:10B57000010F96E807008AE8070000F08680402364 +:10B580004FF0010884F82B30B4463B69B8F1050F41 +:10B590009AE80700ACE803002CF8022B4FEA1242AD +:10B5A0008CF8002015D9991E424631F8020F88B157 +:10B5B0004FF0100C00F0010E40080EEB4202D303D6 +:10B5C00044BF82F4883282F02102BCF1010CF1D137 +:10B5D000EBE742460DF1130C072102F00F0E9146E6 +:10B5E00012090EF13000392888BF0EF137000139F9 +:10B5F0000CF8010902D0B9F10F0FEED808AB7E208C +:10B600005A1802F8140C04F11F00002284469142DB +:10B6100006D01CF801EF02F10109BEF1200F20D184 +:10B62000072902F1010297BF08AB4FF0200C03EB92 +:10B63000010C013198BF1CF814CC072A00F802C095 +:10B64000EED92046FFF74EFD8146D0B908F101083A +:10B65000B8F1640F98D14FF00709484609B0BDE82A +:10B66000F08F4A46D3E7804601212046FFF71EFCB3 +:10B670008146F8B1B9F1040FEDD0EEE74FF00609BD +:10B68000EBE70428E9D184F82BB01BF0020F4FF050 +:10B6900000012046D4F800A01BBF0C350D23012566 +:10B6A000B5FBF3F518BF0135FEF743FA81460028D4 +:10B6B000E0D18046A1695046FEF7F7F881460028A0 +:10B6C000D8D1E3691B78E52B01D0002BCBD108F151 +:10B6D00001084545C8D1013D55D021692046A1EB5F +:10B6E0004511FEF726FA81460028B6D14FF6FF78BD +:10B6F0003046FEF7CBF80190A1693846FEF7D5F841 +:10B7000081460028A9D1E369E9B2019A4FF00D0CF6 +:10B71000D7F810E05A734FF00F02DFF8A8A0DA72E2 +:10B720004A1E18730CFB02F284469876D876404580 +:10B730001AF8019B0CF1010C18BF3EF8120003EB44 +:10B74000090B18BF013203F809004FEA202900282D +:10B7500008BF4046BCF10D0F8BF80190E7D1404582 +:10B7600002D03EF812200AB941F0400119700123BD +:10B7700000212046FB70FFF799FB814600287FF4EB +:10B780006CAF013DB8D1A1693846FEF78EF881460D +:10B7900000287FF462AF20224946E0690BF0F6FCF6 +:10B7A000E36903CE18605960B27831889A721981C2 +:10B7B00094F82B30E26903F0180313730123FB7034 +:10B7C0004BE700BF109901082DE9F3410C460646EE +:10B7D00011460568012C46D92B6AA34243D94AB9C0 +:10B7E000A046214630682746FEF777F8044658B948 +:10B7F000002006E04FF0FF322846FFF7B7F8002898 +:10B80000EED002B0BDE8F08101282CD0431C2CD032 +:10B81000002239462846FFF7A9F80028F1D12A6A04 +:10B82000AB69023A934205D20133AB612B7943F005 +:10B8300001032B717B1CA34211D041462846FBF724 +:10B840004EFD394600902846FBF749FD6B89A0461E +:10B850006946013B184401906878FBF70FFC2B6A9E +:10B86000A342BED8C4E70220CBE70120C9E72DE9F7 +:10B87000FF4103680C4601920646DB6F9847019929 +:10B8800020466769FFF766FA054650B133683046CF +:10B89000D3F880309847284604B0BDE8F041FBF764 +:10B8A00071BC03A92046FBF7E9FC05460028EDD151 +:10B8B000657C002DEAD1237C9A0701D40725E5E7B2 +:10B8C000D4F81480E368984508D320463946FFF73A +:10B8D00041FA044670BB04B0BDE8F081B8F1000F36 +:10B8E00011D12A46A1682046FFF76EFF0546C4F82D +:10B8F00008806369E360237C43F040032374002DD8 +:10B90000E3D06574C2E7A1692068FDF7E6FF431C38 +:10B9100001460BD001280BD0039B1B6A9842E8D24A +:10B92000A2692046FFF750FF0546E2E70125E0E760 +:10B930000225DEE733683046D3F88030984720464A +:10B94000AAE72DE9F043064687B02C20154606F1FC +:10B95000A4080F4602F012FD0446404606F1140901 +:10B9600002F07CFCB36902AA214663604846F36991 +:10B970000195A36001ABFDF74BFB0546A8B99DF807 +:10B980000C30222B1CD104AA21464846FCF742F970 +:10B99000054650B963682361A36863610E23A36100 +:10B9A0001023E360736A74622360404603F0B6FCC0 +:10B9B0004DB93C60284607B0BDE8F043FBF7A9BA93 +:10B9C0006FF01305F1E720460BF07AFBF2E72DE963 +:10B9D000F04F07469B4693B0382007F1A4098846EC +:10B9E000164602F0CBFC0446484602F037FC1BF03A +:10B9F000030C07F1140A00F0C580BCF1010F4FF0F1 +:10BA0000000000F0C180BCF1020F844601D000218B +:10BA100000E003214FEA6B0202964FEAAB0502F405 +:10BA2000807205F400752A430BF480652A434FEABF +:10BA30000B2505F40065154345EA0C0505430D4348 +:10BA400005F00303012B11D102AB03AA07A950464D +:10BA5000FDF7DEFA064600BB9DF81030222B00F001 +:10BA60008A80A9053FD56FF0100609E097F8543099 +:10BA7000002BE9D15046FCF7E1FF06460028E3D051 +:10BA8000484603F04BFC002E78D1C8F80040304601 +:10BA900013B0BDE8F04FFBF73CBA821CF0D1029B1B +:10BAA0002F21184601930DF0CFFA83460028E7D1E5 +:10BAB000EB05E5D5019B40F611028DF81200184602 +:10BAC000ADF810200CF072FD4FF0FF328DF813002E +:10BAD00007A9019B5046CDE9052B03AAFDF73CFDC4 +:10BAE00006460028CCD1089B002268056360099BAC +:10BAF000A261A360039BE360059B2361069BC4E9ED +:10BB0000075263610AD44FF0FF337D69E3626B6BC8 +:10BB1000F3B13A6A62B16FF00B06B1E713B145F4C5 +:10BB20008035E5614FF0FF320023C4E90423EAE7E2 +:10BB30006363E36903F00303012B04D004F12C01D8 +:10BB40002846FBF7F2FC3B6A00263C62236097E73D +:10BB5000E36903F00303012B06D168690BF0A8FA2F +:10BB600060630028EFD1D6E7A8690BF0A1FA606303 +:10BB70000028E3D1CFE76FF0140681E720460BF0F1 +:10BB80009FFA84E7012042E74FF0020C3FE70000F4 +:10BB9000F0B50C468BB0064624B9326004613046DD +:10BBA0000BB0F0BD104601920CF000FD043002F025 +:10BBB000E5FB3A233034054643702F2304700330ED +:10BBC00000F8013C3746019906AC0CF0E7FC084B45 +:10BBD000002247F8045B0593064B029302ABCDE9C4 +:10BBE00003220FCB84E80F0087E80F00D7E700BFE0 +:10BBF000E76F00081D7600082DE9F04106468AB07F +:10BC000030208846019202F0B9FB019A0546B16DD9 +:10BC100005A8FFF7BDFF33683046DB6F9847059BEB +:10BC20000393002D4BD0002204A903A8FEF796F839 +:10BC3000044650BB049C4FF400702C600BF038FAA3 +:10BC4000074600283DD0206128460399FFF7F6FA01 +:10BC50000446A0B995F92B30002B08DBAB79DB0645 +:10BC600029D5049BE9691878FBF7F9FAA860049BC9 +:10BC700000212846DB88AB80FDF75BFF0446384691 +:10BC80000BF01EFA042C18D00CB100232B60336883 +:10BC90003046D3F880309847ACB128460BF010FA04 +:10BCA0002046FBF76FFA044605A8FBF79FF92046EC +:10BCB0000AB0BDE8F0810524E1E70524E5E70924A1 +:10BCC000E5E71124E3E7C8F80050EDE72DE9F04F70 +:10BCD000804697B01C4628208A46019202F04EFB0F +:10BCE000019A0546D8F8581005A8FFF751FFA60796 +:10BCF00056BF04F0010603260136A00505D56105EF +:10BD00004CBF46F0080646F01006D8F8003022076F +:10BD10004046DB6F48BF46F030069847059B0393CB +:10BD2000A5B90924D8F800304046D3F880309847A8 +:10BD300028460BF0C5F92046FBF724FA044605A86F +:10BD4000FBF754F9204617B0BDE8F08F324604A93E +:10BD500003A8FEF703F8002840F0C780049C4FF4C6 +:10BD600000700A940BF0A4F9814608B91124D9E7B0 +:10BD700020610AA80399FFF761FA044620B99DF9EA +:10BD80005330002BB8BF062416F01C0F71D0002CC6 +:10BD90004AD0042C3ED10AA8FFF7D4FB0446002861 +:10BDA00038D146F00806FBF7F9FD014601901198DD +:10BDB0000E30FBF7C1FA119801991630FBF7BCFA67 +:10BDC000049C11992078FBF74AFA202300220746A9 +:10BDD000CB7220461199FBF737FA119B0022012103 +:10BDE0001A775A779A77DA77049BD970002F4AD05E +:10BDF00039460AA8D3F838B0FFF7E6FC044648B93C +:10BE000059460498FDF751FD013F049B04465F61CC +:10BE1000002838D048460BF053F9D8F80030002CF1 +:10BE200065D000232B607DE79DF82E3013F0110FB5 +:10BE300057D13307B7D4049C119FA36B39466F6267 +:10BE40002B622078FBF70BFA0146A86007F11C0073 +:10BE5000FBF77AFAE388B2060746AB804FF000039F +:10BE6000E8602C602E746B74EB616B6110D400245D +:10BE7000D0E7002CCED19DF82E30DF062FD4B407AA +:10BE800001D5D8072DD4310748BF46F04006D2E788 +:10BE90000028ECD06389A48968615C43BC421AD253 +:10BEA00028683F1BFDF719FD0128014615D9431CE1 +:10BEB000F4D10124A961002CACD104988389B7FB8B +:10BEC000F3F203FB1277002FD1D0FBF708FA50B141 +:10BED0001044E8619EE70024ECE70224EAE704242A +:10BEE00098E7072496E7022494E7044699E7D3F8F5 +:10BEF000803040469847CAF8005020E7F0B5D9B0E6 +:10BF0000054617460A46816D01A8FFF741FE2B68DA +:10BF10002846DB6F98474FF48C72002112A80BF073 +:10BF200035F9019B002206A968460093FDF716FF2C +:10BF3000044630B94FF400700BF0BAF8064678B9F1 +:10BF400011242B682846D3F8803098472046FBF709 +:10BF500019F9044601A8FBF749F8204659B0F0BD8D +:10BF6000069B0099186106A8FFF768F9044638B9DE +:10BF70009DF94330002B23DB12A906A8FBF7ECF94F +:10BF800030460BF09DF8002CDBD19DF8502040F29C +:10BF9000FF11129B284612F0100F3B6114BF4FF4A3 +:10BFA00080434FF4004312F0010F40F26D1208BFBE +:10BFB0000A4613437B602B68D3F880309847C9E763 +:10BFC0000624DDE72DE9F04198B005460A46816D6B +:10BFD00007A8FFF7DDFD2B682846DB6F9847079B16 +:10BFE000022202A901A80193FDF7B8FE0446002829 +:10BFF00040F08380029C4FF400700C940BF058F8D2 +:10C000000646002800F0998020610CA80199FFF7EE +:10C0100015F90446002800F08C8004286AD19DF8A8 +:10C020005B1011F0200140F08680029B03A803936F +:10C03000FEF729FD044600286FD0012870D0431C6C +:10C04000D3F1000848EB0308FBF7A8FC0746B8F15A +:10C05000000F68D121460298FBF71FFB002862D130 +:10C06000029B4FF020321021DB6B1A605A60C3F83C +:10C0700007202E22029BDB6B1A70029BDA6BD172B7 +:10C080003946D86B1630FBF757F902982246C16B38 +:10C09000FBF7DAF80298C36B03F12002114653F85C +:10C0A00004CB934241F804CBF9D1C36B2E224FF05D +:10C0B000010883F82120C16B0E9A2031FBF7C4F8E8 +:10C0C000029B0CA883F80380FFF73CFA58BB139837 +:10C0D00039461630FBF730F9224602981399FBF7E0 +:10C0E000B3F8139B10220298DA7280F80380FBF7F2 +:10C0F0000BFC044630460AF0E3FF2B682846D3F8D1 +:10C10000803098472046FBF73DF8044607A8FAF729 +:10C110006DFF204618B0BDE8F0814FF0070893E7A7 +:10C120004FF0020890E70022214603A8FFF74CFBDE +:10C13000DFE70824DEE70624DCE71124DDE7F0B5BD +:10C14000AFB0054614460A46816D09A8FFF720FDE9 +:10C150002246A96D04A8FFF71BFD2B682846DB6F5C +:10C160009847099B02A80193049B0293FBF79AF856 +:10C170000028C0F2AE80022203A901A8FDF7EEFD5F +:10C180000446002840F08F80039C4FF40070169402 +:10C190000AF08EFF0646002800F09D80206116A858 +:10C1A0000199FFF74BF80446002879D19DF88330B8 +:10C1B00013F0A00F40F089801D9B0EAC03F1200707 +:10C1C0001868083353F8041C2246BB4203C21446C5 +:10C1D000F6D116AF22AC0FCF0FC40FCF0FC497E824 +:10C1E0000F0084E80F00029922A8FFF727F8044601 +:10C1F00048B9249A189B9A4203D1269A1A9B9A42CC +:10C2000003D008244CE004284AD122A8FFF79AF969 +:10C210000446002844D129990DF145030DF155003C +:10C2200001F10D0253F8044B834242F8044BF9D15B +:10C230001888012710809B7893709DF84330039CE9 +:10C24000DA0658BF43F02003CB72E770CB7ADB06E7 +:10C250001DD5189A249B9A4219D02078FAF7FFFF2F +:10C2600001462046FBF73BF8014680B32046FDF728 +:10C270001CFB0446A0B90398C16B91F821302E2B0A +:10C2800005D1249A2031FAF7DFFF039BDF7016A84F +:10C29000FEF700FF044618B90398FBF735FB044688 +:10C2A00030460AF00DFF2B682846D3F880309847B7 +:10C2B0002046FAF767FF044604A8FAF797FE09A894 +:10C2C000FAF794FE20462FB0F0BD0624E8E70224DA +:10C2D000E6E70B24E7E71124E5E72DE9F043A1B0F9 +:10C2E00005460A46816D03A8FFF752FC2B682846D5 +:10C2F000DB6F9847039B022202A901A80193FDF777 +:10C300002DFD0446E8B9029C4FF4007008940AF031 +:10C31000CFFE804600285CD0206108A80199FEF776 +:10C320008DFF044650B99DF84B3098064FD419063E +:10C330004DD49DF82670FA0715D5072440460AF01B +:10C34000BFFE2B682846D3F880309847072C42D090 +:10C350002046FAF717FF044603A8FAF747FE2046DF +:10C3600021B0BDE8F083029E0F993078FAF777FF8D +:10C37000FB0681460DD408A8FEF78CFE0446002873 +:10C38000DCD1B9F1000F19D10298FBF7BDFA0446D0 +:10C39000D4E7F3699842D0D02146169014A8149699 +:10C3A000FDF7C7FB04460028C8D114A8F5F792FE94 +:10C3B00004460028C1D00428C0D1DCE70246494623 +:10C3C00008A8FFF701FA04460028B7D1DCE70624E5 +:10C3D000B4E71124B5E76FF05904BDE7406810B128 +:10C3E00003689B6C18477047407E7047007E70471B +:10C3F000D0E9042110B5D0E90234981844EB0101CA +:10C4000010BDD0E902017047D0E90401704790F8EF +:10C4100020301BB1406803685B6B18476FF47A608B +:10C42000704790F8201030B459B1D0E90114C068B9 +:10C430000D6812192D6B40EB03030846294630BCEA +:10C4400008470020002130BC704790F820301BB115 +:10C4500040680368DB6A184700200021704790F8A5 +:10C4600020301BB1406803689B6A184700200021F8 +:10C47000704790F820301BB1406803685B6A18472A +:10C480000020002170472DE9F34190F82010044668 +:10C4900015469846DDE9086799B10168CDE900675E +:10C4A000496C884768B1E368D4E901020168AA18B9 +:10C4B000CDE9086748EB0303C96902B0BDE8F04164 +:10C4C00008476FF47A6002B0BDE8F0812DE9F043CF +:10C4D00090F820C085B00446154698460391DDE9E2 +:10C4E0000C67BCF1000F16D0CDE900670168D1F8E8 +:10C4F0004090C84778B1E3680399D4E90102046821 +:10C50000AA18CDE90C67A46948EB0303A44605B05B +:10C51000BDE8F04360476FF47A6005B0BDE8F08392 +:10C520002DE9F04390F820C085B0044615469846A2 +:10C530000391DDE90C67BCF1000F16D0CDE900676F +:10C540000168D1F83C90C84778B1E3680399D4E911 +:10C5500001020468AA18CDE90C67646948EB03037B +:10C56000A44605B0BDE8F04360476FF47A6005B0BB +:10C57000BDE8F08390F820301BB1406803681B6968 +:10C5800018476FF47A6070472DE9F047D0E901143D +:10C5900005684FEA640A9DF820C005EB6400E407D3 +:10C5A0009DF824E048BF55F80A409DF82880DDF842 +:10C5B0002C9048BF6158DDE90C67CDE90A89CDE9C7 +:10C5C0000C67CDE908CEBDE8F0470847FF2070476B +:10C5D000D0E944017047F0B51F46D0F8183116462F +:10C5E00001332DD1D0F86021D0E94445AF4208BFD6 +:10C5F000A6421CD2D0F82811C9B101290CD000F5EF +:10C60000B47C0023994212DDFCE80245BD4208BF1C +:10C61000B44202D20133F5E700230344012193F829 +:10C62000544100230C4205D0723350F823201046A9 +:10C63000D117F0BD01334900042B49B2F2D1F6E71E +:10C640004FF480500021F4E7004870471AA2010817 +:10C65000D0F86001002170470120002170472DE9CA +:10C66000F74F164601680269054600930192896BEF +:10C670004769DDE90CAB16EB0A0843EB0B09884769 +:10C68000494508BF4045DDE9003203D2002003B030 +:10C69000BDE8F08F16F17844284643F1FF31A41825 +:10C6A0002A6841EB0707116B3246884702460B4662 +:10C6B000204639460CF0BEFE1343E7D114EB0A04C2 +:10C6C0002B68284647EB0B0718F1FF32196B49F12D +:10C6D000FF33884702460B46204639460CF0AAFE37 +:10C6E00013430CBF01200020D1E700000048704731 +:10C6F00020A20108D0E90601704790F82030002BF5 +:10C700000CBF4FF0FF30FF20704790F8203013B17E +:10C710002020002170470020FBE77047094B0A48A2 +:10C720005B6870B590248D1804FB03038D4207D01D +:10C7300011F8014B1868C6693606FCD58462F5E726 +:10C74000104670BD6C1200241013002400207047A6 +:10C75000012070476FF0150070476FF01C007047A4 +:10C7600008B5836823B9054B1B6893F83D0008BDE5 +:10C77000C06898470028F6D0F9E700BFF01C0024F5 +:10C7800003681B6818470000094B30B51A46094C6E +:10C79000D3F89450A542FBD1036829B181680B609E +:10C7A0004FF44073536130BDC1681B04F7E700BF0D +:10C7B0000064025800030080BFF35F8F0122084924 +:10C7C0008A6001320B69042A23F0010343EA000363 +:10C7D0000B61F5D1BFF34F8FBFF36F8F704700BF71 +:10C7E00090ED00E0BFF35F8F064A0023936013696A +:10C7F00023F0010318431061BFF34F8FBFF36F8F16 +:10C80000704700BF90ED00E070472DE9F0474668A3 +:10C8100096F8327087BB03685B689847346A844235 +:10C820002AD03369041B96F934201C40B368306267 +:10C83000A4FB0345CAB1736A14EB030845F1000970 +:10C84000002A1BDBC2F12001A2F1200328FA02F426 +:10C8500029FA02F509FA01F129FA03F30C431C4302 +:10C8600004FA02F2A8EB02027262D6E90A321B193C +:10C8700045EB0202C6E90A32BDE8F087D6F80CA003 +:10C880003B464046494652460CF0D4FD04460D4610 +:10C890000AFB1082E8E72DE9F14F46680546376B41 +:10C8A00027F07F4727F0FF07002F57D1FFF7ADFF95 +:10C8B0007368002B60D0D5F800A0D3E90001D6E959 +:10C8C0000A238B4208BF824205D3DAF8143001B044 +:10C8D000BDE8F04F18476C68D4E90A32D4F814B0B8 +:10C8E000B0EB030861EB0209D4E906234B4508BF0E +:10C8F000424520D3E36894F933C0A3FB080103FB4E +:10C900000911BCF1000F13D0A268531EC01841F1E9 +:10C910000001BCF1000F24DBCCF12002ACF12003BC +:10C9200020FA0CF001FA02F221FA03F31043184343 +:10C93000834528BF8346236A9B4423690BEA030B84 +:10C94000DAF81030584698472B685B689847336A86 +:10C950005B450AD258450CD283420AD801B0BDE8E3 +:10C96000F08F3B460CF066FDE2E78342F6D958456E +:10C97000F4D32B685B69AAE77369306A326918449B +:10C980002B6810401B6901B0BDE8F04F184700004C +:10C99000014BD868704700BF3C0100246FF01500C0 +:10C9A0007047012070474168034630B471B1D0E947 +:10C9B000032000F0010402B944B1451001EB60000E +:10C9C0000CB149598A58996830BC104730BC70473F +:10C9D0006FF015007047036800221B691146184765 +:10C9E0000368012200211B691847704784B001A821 +:10C9F00004B080E80E0070471120704700290CBF7A +:10CA00006FF018000020704703680BB10846184704 +:10CA100070470000024B987A003818BF0120704719 +:10CA20003C01002408B504F013F8FCE7014B5869F9 +:10CA3000704700BF3C01002401230A4A90F92010EE +:10CA400043701C32936810B51BB193F920408C429F +:10CA500005DCC0E90232906003B1D86010BD1A460F +:10CA60009B68F1E73C01002490F82230826B13F0C0 +:10CA7000100F0CBF602020201044704710B5C4690F +:10CA8000621CD0E904310CD103B1596142691AB179 +:10CA900013610023436101E0074A13630023C3616C +:10CAA00010BD1BB1DA6959612244DA614269002A7A +:10CAB000EED1014AD362F1E73C010024C2682AB1F9 +:10CAC0008368936003B1DA600023C3607047037822 +:10CAD000F12B00D07047C068F9E783689A688260DC +:10CAE00002B1D06000221846DA60704738B51F4C9A +:10CAF000237A022B35D1636A002B34D063694A1C38 +:10CB0000587016D1226B002172B94FF0FF30C3E983 +:10CB10000421D86159B10B611548FFF7DEFF0223EC +:10CB20004370A061012038BD11461269ECE7236310 +:10CB3000F2E7E26A002012B1D569A9420BD2D961AD +:10CB4000C3E9042058B10361002AE5D0D0695361DC +:10CB5000411AD161E0E71046491B1269EBE7E36235 +:10CB6000F2E70020DFE71846DDE700BF3C010024C4 +:10CB70005801002491F92020836810B51BB193F966 +:10CB80002040944205DAC1E90230816003B1D960E6 +:10CB900010BD18469B68F1E7012301464370014828 +:10CBA000FFF7E8BF5801002470B5124D04462E7AF5 +:10CBB000696990B9022E0FD16C6A6CB194F920208A +:10CBC00091F920309A4207DD2046FFF777FF0846AB +:10CBD000FFF732FF6670AC6170BD022E05D190F98F +:10CBE000202091F920309A42F1DC2046BDE87040C7 +:10CBF000FFF7D2BF3C01002438B504461546FFF7C5 +:10CC000033FF01602046FFF739FF1DB1BDE8384012 +:10CC1000FFF7CABFBDE83840FFF7BEBF10B50446F6 +:10CC2000806918B100221146FFF7E6FF6378232BD5 +:10CC300002BFA36800229A6110BD10B501460446E8 +:10CC400064B12378F12B07D00846FFF737FF204661 +:10CC5000BDE81040FFF78EBFE468F1E710BD0000AB +:10CC600038B5254DEC6A002C45D0E369013BE36102 +:10CC7000002B40D16378732B06D009D8532B0BD0EF +:10CC800003F0DF03432B29D12046FFF720FF25E0E7 +:10CC900003F0EF03832BF6E72046FFF718FFC37876 +:10CCA0009B071BD5C06890F92120C36AD9788907F2 +:10CCB00009D599688C4208BFA16821B191F920106B +:10CCC0008A42B8BF0A465B69002BEFD190F9203049 +:10CCD000934203D080F82020FFF7AFFF2046FFF7F4 +:10CCE000EDFEFFF759FF246924B1E369002BC1D0A1 +:10CCF00000236361EC6238BD3C01002410B503469B +:10CD000053E8000F084203D1BFF32F8F002005E046 +:10CD100020EA010243E8002404B1F1E710BD10B598 +:10CD2000034653E8000F00EA01028A4203D0BFF332 +:10CD30002F8F002005E020EA010243E8002404B11F +:10CD4000EFE710BD10B543780446332B15D190F8AA +:10CD50002330416A03F001029B0708D428301AB13E +:10CD6000FFF7DDFF48B10BE0FFF7C8FFFAE7806A85 +:10CD700001EA000312B19942F4D010BD002BFCD09F +:10CD8000014600222046BDE81040FFF735BFD0E83D +:10CD90005F3F13B9BFF32F8F04E05A1EC0E8512F35 +:10CDA00001B1F4E798B2704710B5D0E85F3F5A1C64 +:10CDB000914200D80022C0E8542F04B1F5E798B2A0 +:10CDC00010BD10B5D0E85F3F994202D8BFF32F8F56 +:10CDD00004E05A1CC0E8542F04B1F3E798B210BD28 +:10CDE00010B50446B8B10378F62B14D183683BB173 +:10CDF000FFF773FE01220021FFF7FEFE002010BDA9 +:10CE0000C1890C30FFF7DDFFE38983428CBF00202E +:10CE10006FF00200F3E76FF00300F0E7836810B5EE +:10CE2000044663B10C30FFF7B2FF40B12046FFF774 +:10CE300054FE0022BDE810401146FFF7DDBE10BDD4 +:10CE4000284B5A6970B50446002A41D0002842D0C8 +:10CE50000378F52B3FD1037E002B3FD0C168914270 +:10CE60003CD1013BDBB2037613BB43690BB10169D3 +:10CE700019612169F1B14B6192F92130D56ADDB9AF +:10CE800082F82030A36883B12046FFF726FE0646CD +:10CE90002A462946FFF7B0FEF36AC4E903656361D9 +:10CEA00003B11C610123F46223760020FFF77CFEAE +:10CEB00000200FE0D362DFE7E978890706D5A9688B +:10CEC00021B191F920108B42B8BF0B466D69D6E7AE +:10CED0004FF0FF3070BD6FF00300FBE76FF0020012 +:10CEE000F8E700BF3C010024224B70B55D690446A1 +:10CEF0000E46002D35D0002836D00378F52B33D1DF +:10CF0000037E53B9C0E90353EB6A436103B118616F +:10CF10000123EC620020237670BDC278D10706D5CC +:10CF2000C168A94203D1FF2B21D00133F2E7F6B14A +:10CF300093070AD5E06895F9203090F920209A42AD +:10CF400003DA80F82030FFF778FE31465320FFF7F0 +:10CF5000CDFD18B129462046FFF70CFE6FF0010009 +:10CF6000DAE74FF0FF30D7E76FF00300D4E76FF058 +:10CF70000200D1E73C0100242DE9F04104460026DF +:10CF800001270CB9BDE8F081E378D4F814801B07C1 +:10CF900012D5A36826767BB12046FFF79EFD0022BE +:10CFA00005461146FFF728FEEB6AC4E903566361A4 +:10CFB00003B11C61EC6227764446E2E7034653E87E +:10CFC000000F421C43E8002101B1F8E77047036BF2 +:10CFD00030B4BBB1CD780024DA78AA420AD31A461D +:10CFE000C1E9012462B191607CB16160283030BC3C +:10CFF000FFF7E4BF5A681C46002AF1D01346EBE75E +:10D00000C162F1E7C1E90133C1620163EEE730B506 +:10D01000F0B1C3688B421BD803698B4218D900F169 +:10D0200014031A680A60BFF35F8F53E8002F0C687F +:10D030009442F6D143E8001505B1F2E7043050E818 +:10D04000003F5A1E40E8002101B1F8E7002030BD42 +:10D050006FF00300FBE710B590B100F1140353E843 +:10D06000004F14B9BFF32F8F04E0226843E800217A +:10D0700001B1F4E714B10430FFF7A0FF204610BD62 +:10D080000446FBE730B5C0B189B1C2B1CBB10024D1 +:10D090000160C3604361C0E9014202FB01F41D1954 +:10D0A00005611846013904D1A21A99500121084698 +:10D0B00030BD851805602846F4E70146F7E71146BC +:10D0C000F5E71946F3E730B580B1C9B1A1F108051C +:10D0D00000F108040022A54209D16B6823F0030483 +:10D0E00043681B1B43603AB96A60012030BD236866 +:10D0F00022463BB11C46EEE751F8083C1360F4E7CA +:10D100000846F3E71846F1E710B5C378044613F074 +:10D11000010322D1038083789A0708D513F0100FFA +:10D12000016B134B0FD0D3F88400FFF770FFA37887 +:10D13000DB071CD50E4B2146D3F8880038B1BDE87B +:10D140001040FFF764BF586FFFF7BDFFEFE7D3F85C +:10D150008000BDE81040FFF7B6BF042343700023F2 +:10D16000C360034B5A6B826002B1D0605C6310BD38 +:10D170003C01002438B5044600283BD00378F12B4D +:10D1800038D1437803F00F03022B06D0032B28D0AD +:10D19000012B23D06FF002001FE0184B1A7A022AED +:10D1A000F8D15B6A002BF5D0E06AFFF7E5FE204678 +:10D1B000FFF734FD6578022D18D1104901F11C00EC +:10D1C000FFF78BFC45708861EFF30983A3630023AD +:10D1D0004B612046FFF798FF002038BDFFF76EFC3B +:10D1E000E2E7FFF76BFCFFF749FCDDE70020FFF704 +:10D1F000DBFCEEE76FF00300EFE700BF3C0100242B +:10D2000070B50F4C267A022E18D1636AB3B16569E6 +:10D21000E86AFFF7B1FE2846FFF700FD04F11C00A5 +:10D22000FFF75BFC4670A061EFF30983AB6300235B +:10D2300028466361BDE87040FFF766BF70BD00BF60 +:10D240003C01002470B5054638B30378F62B24D191 +:10D25000836863B12846FFF740FC00226FF00201AB +:10D26000FFF7CAFCA8680028F4D1FFF79DFCAB7853 +:10D27000002613F001032E7012D00A4B2946D3F872 +:10D28000984024B12046FFF7C2FE304670BDD3F867 +:10D290008000FFF718FF2046F8E76FF00300F5E77E +:10D2A0001846F3E73C01002470B50446002849D035 +:10D2B0000378F52B46D1037EBBB16369C0680BB11F +:10D2C00022691A61226902B3536190F92120C36A6D +:10D2D000EBB990F92030934203D080F82020FFF77B +:10D2E000ACFCA068F8B9FFF75FFCA078002610F04E +:10D2F0000100267008D0154B2146D3F89450DDB1BB +:10D300002846FFF784FE304670BDC362DDE7D9785A +:10D31000890706D5996821B191F920108A42B8BFD2 +:10D320000A465B69D4E72046FFF7D7FB00226FF07F +:10D330000201FFF761FCD4E7D3F88000FFF7C3FEDA +:10D340002846E1E76FF00300DEE700BF3C01002460 +:10D35000F0B568B381B10F3100F1080621F007077D +:10D36000334636685C68F11A24F00304091B8F42C7 +:10D3700004D931680029F3D10846F0BD45683A4325 +:10D3800004683D444560204450F8041C08388D4230 +:10D3900088BF4560586818B903F108015A60EBE787 +:10D3A00020F0030019181E504A6019600831E3E7A5 +:10D3B0000146E1E72DE9F04F85B08146029120B9A1 +:10D3C0000024204605B0BDE8F08F002A00F08680DA +:10D3D0009468B4B1A007F3D1D368432BF0D997690F +:10D3E000D2E904658EB17107EAD1002DE8D077B992 +:10D3F00018276B07E4D1A5F14801574B99420BD987 +:10D40000DEE7D368002BEAD0DAE7002F64D07B1E7A +:10D41000372BD5D8002DECD1D2E900A30193002CF5 +:10D4200069D14E4BD3F8880000285DD0FFF713FE7A +:10D4300004460028C4D04FF00108A6B9DFF81CB19B +:10D44000002D71D1DBF88400002857D0FFF703FED0 +:10D45000002870D048F0100806464FF4805548F078 +:10D460000208002CACD040F2F113FD226563403D70 +:10D4700023807FB2019B35446284E3700023384AE5 +:10D4800084F80280C4F804A084F8207084F8217025 +:10D49000C4E90E59C4E90233C4E90433C4E90633CC +:10D4A000C4E90933C4E90B363260A26B114602F1BC +:10D4B000340042F8043B8242FBD12A4B20462A4AE0 +:10D4C000C1E90D394FF08073CB63029B0B62234B94 +:10D4D0001A66FFF769FB74E718279BE79246164622 +:10D4E0001827154601929CE701224421D3F88000B9 +:10D4F000FFF72EFF9CE74FF000089EE72A464FF407 +:10D5000080554FF48051DBF87400FFF721FFF8B924 +:10D51000B8F1000F1ED0DBF888207AB12146104602 +:10D520000024FFF774FD9AE732462946DBF87400C1 +:10D53000FFF70EFFEBE74FF48055E9E72146DBF8F4 +:10D5400080000392FFF7BFFD039A1446164686E754 +:10D55000064684E7444682E7B7FFFF7F3C0100248C +:10D56000A52E5AE259F2000845CD000870B54FF6D5 +:10D57000FE731446421E05460E469A4201D900200B +:10D5800070BD8842FBD3CCB1A068226890B110F086 +:10D590000303F4D1E1680F29F1D91446F622837010 +:10D5A00000234460027083600D4A0E4B8681C58162 +:10D5B0009A66E5E7E368002BE1D11446094BD3F8FE +:10D5C000980028B1FFF747FD0028D8D00123E5E7F0 +:10D5D00001221021D3F88000FFF7BAFEF4E700BF64 +:10D5E0001DCE00083C01002438B5034660B3D0E9E5 +:10D5F00000458068A0B110F0030201D0002038BDC2 +:10D60000DB681B2BFAD91346F52283700023C57003 +:10D61000027044600376C0E90233C0E90433EEE7E8 +:10D62000DB68002BEAD10A4BD3F8940030B9012211 +:10D630001C21D3F88000FFF78BFE01E0FFF70BFD04 +:10D640000028DBD00123DFE704460546EBE700BFF7 +:10D650003C01002410B598B140EA010313F0070320 +:10D660000ED117290AD90160083910220C1842601E +:10D6700084600B5081684A60C3600123184610BD66 +:10D680000023FBE738B51C4C257A012D28D07DBB43 +:10D690001A4B29462846E3651023A4F85430052385 +:10D6A0002364FFF7D7FF08B1C4F880500021084673 +:10D6B000FFF7D0FFB0B9D4F8803000216367084687 +:10D6C000FFF7C8FF80B9D4F880300021A36708466F +:10D6D000FFF7C0FF50B9D4F88030E367012323720D +:10D6E000002038BD0023E8E70023EEE70023F4E73D +:10D6F0004FF0FF30F5E700BF3C010024142E00245A +:10D70000064BDA6A3AB1D0695B6C1BB11B6998426F +:10D7100028BF184670474FF0FF30F5E73C01002462 +:10D7200010B50446D0B10268806898B110F00303C8 +:10D7300001D0002010BDE1680F29FAD91446F32268 +:10D7400083700023446002700D4AC0E902330D4B20 +:10D750005A66EFE7E368002BEBD11446094BD3F888 +:10D76000900028B1FFF777FC0028E2D00123E6E71C +:10D7700001221021D3F88000FFF7EAFDF4E700BF93 +:10D780007FD800083C01002410B402F00104920785 +:10D7900009D40C301CB15DF8044BFFF7C0BA5DF83A +:10D7A000044BFFF7ABBAC06801EA00022CB191420A +:10D7B00018BF00205DF8044B7047002A08BF002006 +:10D7C000F8E70000F8B50D4617461E460446C0B1FE +:10D7D0000378F32B15D1002913DBFFF7D5FF90B9A0 +:10D7E00096B131464320FFF781F938B1084B204606 +:10D7F0005969FFF7BFF94D6281F823706FF001009E +:10D8000001E06FF00300F8BD6FF00200FBE700BF1E +:10D810003C010024F8B5064670B30378F32B2BD1F6 +:10D82000002929DB00F10C0353E8002F42EA010430 +:10D8300043E8004000B1F7E7B56825B92846FFF78F +:10D84000B3F92046F8BD696A304695F82320AF68E1 +:10D85000FFF79AFF014668B195F823309B0756BF42 +:10D860006C6A044620EA04042846FFF727F90022E0 +:10D87000FFF7C2F93D46E0E76FF00304E1E770B55A +:10D880000546846804B970BD616A284694F823206F +:10D89000A668FFF779FF014628B12046FFF70EF989 +:10D8A0000022FFF7A9F93446ECE7014608B538B184 +:10D8B0001320FFF71BF980F00100C0B2404208BD01 +:10D8C0006FF00300FBE7C3681847D0E90030184742 +:10D8D000D0E90132016810B401EB62005410D207A4 +:10D8E00048BF0A595DF8044B48BFD3581847FFF7A3 +:10D8F000EABF7047002050709070D070704730B50C +:10D90000A1F11004002500F00F02CD7302390009C7 +:10D91000D3B2092ACCBF373330330B748C42F2D1E7 +:10D9200030BD0000322310B50A4C0B800A4BA11CFD +:10D930001868FFF7E4FF094B04F112011868FFF7BC +:10D94000DEFF074B04F122011868FFF7D8FF2046DD +:10D9500010BD00BF0400002400E8F11F04E8F11F1F +:10D9600008E8F11F90F8203010B504465BB11C3078 +:10D97000F4F792FB38B984F8200060680368BDE8CA +:10D980001040DB681847002010BD10B5044609F0B0 +:10D9900097FB204610BD10B5044609F091FB2046C8 +:10D9A00010BD10B5044609F08BFB204610BD08B52C +:10D9B00090F820302BB100691044F4F717FB0021D8 +:10D9C00008BD1846FBE708B590F8203023B1006980 +:10D9D000F4F70CFB002108BD1846FBE7F8B59C46A0 +:10D9E0000D4617460446002872D00278FA2A6FD1F5 +:10D9F00000296DD000F1280252E8001F11B9BFF3D1 +:10DA00002F8F04E0481E42E8000606B1F4E711B18A +:10DA1000E66A01229EB9BCF1000F5CD0614683200A +:10DA2000FFF764F840B1304B20465969FFF7A2F880 +:10DA3000EFF30983C3E902576FF0010023E0B11C43 +:10DA4000D1E84F0FC1E8432F03B1F9E710F0FF0F02 +:10DA500044D0B668DEE79A60B268AAB15360626AE1 +:10DA600006F10C01284609F083FB0FB1F3783B70F7 +:10DA7000002504F10C07314638463570FFF7C7FA28 +:10DA8000A3681BB90020F8BD2363E8E73846FFF719 +:10DA9000E2FA06460028F5D02046FFF71EF80746B2 +:10DAA00029460122FFF7A8F83846FEF7DDFF626A33 +:10DAB0000746816806F10C0009F05AFBF923B5709E +:10DAC000314633702046FB68F370FFF780FAD9E7E0 +:10DAD0006FF00300D7E76FF00200D4E7D6E9013218 +:10DAE000002BB8D1E262B7E73C010024F8B5817899 +:10DAF00004468568002938D04368C6688BB39D60AA +:10DB0000A26882B35360002706F10C05214628461F +:10DB10002770FFF77CFAB368002B4CD02846FFF73C +:10DB20009AFA0446002846D03046FEF7D6FF05464E +:10DB30003A463946FFF760F82846FEF795FF726AC5 +:10DB40008168054604F10C0009F012FBF923A77067 +:10DB5000214623703046EB68E370BDE8F840FFF7DC +:10DB600036BAF562CCE73363CDE7AB6803B35B78D5 +:10DB7000832B1DD12846FEF7B0FF06460A46FFF765 +:10DB80003BF83046FEF770FF06466A6A04F10C0166 +:10DB9000806809F0EDFAF3680BB1E2781A7000239F +:10DBA000214605F10C002370BDE8F840FFF72FBABD +:10DBB00021462846D1E7F8BD2DE9F0410C4617462D +:10DBC00098460546002848D00378FA2B45D100290D +:10DBD00043D08368C3B15B78832B15D1FEF77DFFFB +:10DBE000064601220021FFF707F83046FEF73CFF0A +:10DBF00006466A6A2146806809F0BAFAF06808B1F8 +:10DC000007700020BDE8F08105F10C00FFF723FA52 +:10DC1000064670B121466A6A0C30002409F0A8FA61 +:10DC2000F923314628463370B470F770FFF7CFF907 +:10DC3000E7E7B8F1000F13D041469320FEF756FFF7 +:10DC400040B1094B28465969FEF794FFEFF3098369 +:10DC5000C3E902476FF00100D4E76FF00300D1E79A +:10DC60006FF00200CEE700BF3C010024024B1868B1 +:10DC700008B1F9F7FDB87047A835002470B514460F +:10DC80006FF00046126805460498B24207D238B1D8 +:10DC9000014618460BF07AF9431C05D1206070BD8F +:10DCA00015B18A4238BFAB54236801332360F6E7CD +:10DCB0002DE9F04F2DED028B8DB00E46002105466B +:10DCC0009DF87030174607A814229DF868900493B9 +:10DCD0000691DDE918AB09F059FA049B002B14BF3B +:10DCE00030232023B9F1010F08EE103A48D1BAF1E0 +:10DCF000000F7BF1000343DADAF1000ACDF80C9053 +:10DD00006BEB4B0BA9F102034FF00008DBB205935C +:10DD1000059B012B5ED8B9F1020F0AF00F030CBF6F +:10DD20003B4A3C4AD35C06AA02F808304FEA1A1371 +:10DD30004FEA1B1243EA0B7393469A465AEA0B03C7 +:10DD400008F1010444D1039B23B3049B3BB11D9B09 +:10DD50003A463146284600932D23FFF78FFF08F1FE +:10DD600002041B9B9C421ADB049B3BB91D9B3A4659 +:10DD70003146284600932D23FFF780FF013C1FE02A +:10DD80005AEA0B0302D000230393BBE7302301249C +:10DD90008DF818301B9B9C4212DA002303931D9BC5 +:10DDA0003A4631462846009318EE103AFFF766FFD0 +:10DDB0001B9B013BA3421B93F1DC039B002BD3D1A4 +:10DDC0000DF11808CCB90DB0BDEC028BBDE8F08F99 +:10DDD000A0469DE7504659460A2200230BF02AFB35 +:10DDE00006AB30325046594603F808200A22002379 +:10DDF0000BF020FB82468B46A0E71D9B013C3A4678 +:10DE000031460093284618F80430FFF737FFD9E76A +:10DE1000EBA90108FBA901082DE9F04F1C468BB0C6 +:10DE2000002306460D46DDF8508017460993AAB137 +:10DE3000994213DB0CBF012301F1FF354FF0000BBA +:10DE4000079317F80B306BB946B1079B33B9099BA1 +:10DE5000AB4295BF079A079BF254735509980BB0D4 +:10DE6000BDE8F08F252B40F02B810BF1010A17F84C +:10DE70000A30203BDBB20D2B07D842F6090222FA0A +:10DE800003F3DB0748BF0BF1020A17F80A302A2B0D +:10DE900046D100210AF101020434084617F802C0F5 +:10DEA000BB18BCF12E0F62D193F801C0BCF12A0F50 +:10DEB00051D00022C7F10109069209EB030213F8C1 +:10DEC00001CFACF1300C5FFA8CFEBEF1090F47D9DF +:10DED000BB5C682B4ED1BB185B78682B0CBF7223E0 +:10DEE000112303F0030A924417F80A90B9F1640F62 +:10DEF00002D0B9F1690F62D1822B55D1073424F0D9 +:10DF00000704F4E8022303910121CDE904080291FA +:10DF100029463046CDE9002309AAFFF7C9FE87E06C +:10DF2000302B16D10AF1010A17F80A30302BF9D03C +:10DF30000120BA440021AAEB07021AF8013B303B4A +:10DF40005FFA83FCBCF1090FA8D80A2202FB013159 +:10DF5000F1E70020EDE7023254F8043B0693B7E7FF +:10DF6000069A4FF00A0E0EFB02C20692A5E76FF06A +:10DF70000043F3E76C2B06D1BB185B786C2B0CBF0E +:10DF800082232123ADE76A2B08D07A2B08D0742B8B +:10DF900008D04C2B14BF00236123A2E73123A0E754 +:10DFA00041239EE751239CE7112B54F8042B04D006 +:10DFB000722B08BF52B2D317A5E712B2FBE7B9F133 +:10DFC000750F03D009F0DF02582A24D1822B0CD11F +:10DFD000073424F00704F4E80223B9F1750F039124 +:10DFE000CDE9040811D1002191E7512B54F8042BFD +:10DFF00009D0722B03D0112B03D00023EDE7D2B24E +:10E00000FBE792B2F9E7D317E7E7B9F1580F0CBF76 +:10E01000032102217BE7B9F1630F0CD154F8043BD3 +:10E0200009AA29463046DBB2CDF80080FFF726FE6C +:10E030000AF1010B05E7B9F1730F15D154F804BBD0 +:10E040000BF1FF3919F8013F002BF1D0069AA2EB32 +:10E0500009021BEB020FEBD009AA29463046CDF886 +:10E060000080FFF70BFEEDE7B9F1700F1BD154F8FC +:10E07000049B302309AA29463046CDF80080FFF7DB +:10E08000FDFD782309AA29463046CDF80080FFF728 +:10E09000F5FD00234A46CDF81480CDE90333032370 +:10E0A0000293D31734E7252309AA29463046CDF831 +:10E0B0000080B9F1250F18BFDA46FFF7DFFDB7E79B +:10E0C00009AA29463046CDF80080DA46FFF7D6FD8A +:10E0D000AEE7012008B501F083FB000011F001005C +:10E0E00010B58CB204D0F3F7E1FF003818BF01205F +:10E0F000E2060AD5054B5A6890235343044AD35885 +:10E10000DB691B0648BF40F0100010BD6C120024F4 +:10E1100010130024F8B50D4682B3194B194C5F68F3 +:10E12000902303FB07439A68B2F5805F16D11A6902 +:10E13000BAB940F2FF12A3F86020902202FB074216 +:10E14000B2F86060F3F7B2FF0028FBD09023012003 +:10E150007B43E3585B6A1E402E70F8BD1AB91A69FA +:10E1600032B9FF22E7E7B2F1805F05D11A690AB937 +:10E170007F22E0E73F22DEE70022DCE71046ECE703 +:10E180006C1200241013002438B50F4C0546B4F867 +:10E19000541004F15600FEF714FE814203D8022108 +:10E1A0000A48F3F785FE04F15800FEF7FDFDE36D24 +:10E1B00043F82050637A23B9054B4FF080525A60E0 +:10E1C00038BD0123A372FBE73C0100242601028035 +:10E1D00000ED00E038B50D4CFA2300251422237021 +:10E1E0000823042104F10C00A570C4E90935084B8B +:10E1F000C4E90155C4E90B55FEF744FF054B064A37 +:10E200002846DC641A67054A1A6538BD542E002476 +:10E21000882E00243C010024EDDA0008F1080108F2 +:10E2200010B5044C0A460448214606F0B5FA2046CB +:10E2300010BD00BFA81A002429A2010810B5044C83 +:10E240000A460448214606F0A7FA204610BD00BF42 +:10E25000A81A002437A201087047000010B5044630 +:10E260000068F8F705FE014618B9236A01332362F6 +:10E2700010BD044B1B78DBB2002BF9D10248F3F739 +:10E2800017FE00BF391000241501028007B51346A0 +:10E290000A466FF0004100900020FFF7BDFD03B07B +:10E2A0005DF804FB0EB40FB505AB6FF0004153F8F9 +:10E2B000042B009000200393FFF7AEFD04B05DF83F +:10E2C00004EB03B0704713B500240094FFF7A4FDDE +:10E2D00002B010BD07B51346002200920A466FF047 +:10E2E0000041FFF799FD03B05DF804FB07B50B464D +:10E2F0000649024600200968896800916FF00041D4 +:10E30000FFF78AFD03B05DF804FB00BFF4020024B0 +:10E310000CB41FB506AB002453F8042B00940393F0 +:10E32000FFF77AFD04B0BDE8104002B070470EB4AC +:10E330000FB5002105AB53F8042B00916FF000419D +:10E340000393FFF769FD04B05DF804EB03B0704779 +:10E350000FB41FB5084906AB0020096853F8042B19 +:10E360008968039300916FF00041FFF755FD05B0F8 +:10E370005DF804EB04B07047F402002407B5019087 +:10E3800008F096FE019910B90248F3F791FD03B029 +:10E390005DF804FB1F0101802DE9F34D00F11C0322 +:10E3A000074653E8002F013243E80026002EF8D13B +:10E3B000012A40F08680786803689B689847064683 +:10E3C00068BB786803685B6A9847422838BF422078 +:10E3D0000446FFF7D3FF80467868C4F500720368EF +:10E3E0004146CDE900465D693346A847064698B9DF +:10E3F000A4F1420308EB030595F84030552B64D196 +:10E4000095F84130AA2B60D17B7E05EB031313F8FE +:10E41000102C520608D02E4E404608F051FE002324 +:10E4200087F82030FB614CE013F80C2C0F2A04D83D +:10E4300048F22103D340DB07EDD478684FF0000A9F +:10E440000368DB6A98477B7EB0F5007F03F1FF33FA +:10E4500038BF4FF4007005EB03131A793A7653F87E +:10E46000081F0A0A61F3070A62F30F2A0A0C090E51 +:10E4700062F3174A002261F31F6AA0FB0AABC7E9E7 +:10E4800002AB5B68190A63F3070261F30F22190CF0 +:10E490001B0E61F3174263F31F62A0FB024578680D +:10E4A00052460368C7E90445CDE90045596C5B460F +:10E4B00088470028AFD00123404687F8203008F075 +:10E4C000FFFD304602B0BDE8F08D024EA4E700BF6C +:10E4D000E2F3FFFFE3F3FFFF014B1868F8F7C8BC56 +:10E4E000402D0024014B1868F8F7C2BCF02D002421 +:10E4F00001207047074A084913681844884283BFBF +:10E50000064B0C224FF0FF3010608CBF1A6018468B +:10E51000704700BF3801002400FC0724AC3E0024F3 +:10E5200008B5094BD3E85F2F013AC3E8512F002902 +:10E53000F8D14FF6FF7192B28A4203D1198803488D +:10E54000F3F7B6FC08BD00BF2C2D00242401048085 +:10E55000436B30B5044685B07BB100F128036D46AE +:10E560000FCB85E80F000023636394F838300BB1BC +:10E57000FFF7D6FF2846FFF7A6F905B030BD00002B +:10E5800008B5074BD3E85F2F0132C3E8512F0029AC +:10E59000F8D192B21AB919880248F3F789FC08BD7C +:10E5A0002C2D002423010480064A136843B1013B4B +:10E5B00013602BB9044A1370044B1B7803B162B685 +:10E5C000704700BF282D0024C8350024242D0024C6 +:10E5D000EFF3108372B6074A117831B9DB4306496D +:10E5E00003F001030B7001231370044A1368013315 +:10E5F00013607047C8350024242D0024282D0024E2 +:10E6000008B5FFF7E5FF064A1388013B9BB213806C +:10E6100013B90120FEF7E6F8BDE80840FFF7C4BFD4 +:10E62000102E002410B5074CFFF7D2FF218811B936 +:10E630000846FEF7D7F801312180BDE81040FFF70A +:10E64000B3BF00BF102E002408B5FFF7C1FF064A74 +:10E650001388013B9BB2138013B90120FEF7ACF87D +:10E66000BDE80840FFF7A0BF122E002410B5064CED +:10E67000FFF7AEFF208808B9FEF79EF80130208032 +:10E68000BDE81040FFF790BF122E0024F0B51E4DDC +:10E690008FB00E461746002818BF054630220021CD +:10E6A00002A808F073FD194B01AC01952B440396A9 +:10E6B000012B05D9164B9D4202D0033B9D4220D130 +:10E6C000F36B0293736B0893124B134D5B69DA6B18 +:10E6D000049305925A6B1B6B06920793FFF778FF22 +:10E6E0000E4A1368013313600FCC0FC50FCC0FC552 +:10E6F0000FCC0FC523682B60FFF756FF00200FB02B +:10E70000F0BD02970894DFE70101FF80C2FE007FA1 +:10E710004001FF803C010024AC2D0024602D00242A +:10E72000F8B50546FFF754FFD0E90034DB68984799 +:10E7300094F832301BB1BDE8F840FFF735BF012334 +:10E7400084F831306368ABB12846FEF75EF8616843 +:10E75000D4E90A67D1E900239F4208BF964209D352 +:10E760006B685A68CB6863602368002BEAD09068B6 +:10E770009847E7E70023284684F83130FEF78BF806 +:10E78000D9E7F8B54B6915460C469B1A002BACBF70 +:10E79000D318131C4B6103898B80FFF719FF0246C6 +:10E7A00003686BB35E696169771A002F24DB8E42C0 +:10E7B00026D19B68A36013B104F1080119611368A5 +:10E7C0002146002641F80C3F9E6019611460836A5F +:10E7D00022616BB190F8242052B10268A24207D1A5 +:10E7E000E2682AB96169C06A491B21EAE171984768 +:10E7F000BDE8F840FFF7D8BE03F108029B68D0E7F8 +:10E80000A36013B104F1080119610023E360DDE79F +:10E8100008F0C4BC08F06CBD08F010BD406828B119 +:10E82000037B012B01D104387047002070470000A2 +:10E83000436893F830202DE9F0470646002A74D14A +:10E8400093F83230002B70D103681B689847336807 +:10E85000DB699847364B0268002A08BF1A46114602 +:10E860001C46B1FBF3F304FB13132146002BF7D135 +:10E870002F4B01257768B3FBF4F11F23B960013BEF +:10E8800003D305FA03FC6145F9D1B2FBF4F287F832 +:10E89000333001241F23FA6004FA03F5AA4201D0A1 +:10E8A000013BF9D287F834304468231F1B2B93BFF8 +:10E8B00001234FF0FF332024A340A4F1040498BFA8 +:10E8C00003F1FF3312F1FF303B614FF0070303FA0E +:10E8D00004F44FF000034FEAE4797C61A4FB0145A6 +:10E8E0009A4601FB095543F1FF31201845EB010120 +:10E8F0000AF0A0FD3368C7E906015B68C7E900AA12 +:10E90000984773683862002100200122C3F824A0D0 +:10E9100083F832A01A86C3E90A013046FDF775FF75 +:10E920003046BDE8F047FDF7B6BFBDE8F08700BF51 +:10E9300040420F0010B50446FFF77AFFFFF748FE8C +:10E940002046FDF762FF6368D3E90A01FFF72CFE5A +:10E9500010BD2DE9F8430C4680468869FFF7EAFFB1 +:10E96000D4E90A59461B61EB0907002F08BFB6F529 +:10E970007A7F2AD3002F08BFB6F5FA6F28D3002E6E +:10E980004FF47A72304677F101034FF00003B4BFC1 +:10E99000002139460AF04EFD4FF47A760023A36336 +:10E9A000A0FB0623551906FB013343EB0903C4E919 +:10E9B0000A53D4E90C32C318404642EB0101C4E9C2 +:10E9C0000C31C8E90031BDE8F88300200146E3E7D7 +:10E9D00001200021E0E700002DE97043154E356865 +:10E9E0002DBB154C4FF0000814484FF00009144B94 +:10E9F000A0612360C4E90289C4E90455FFF718FF48 +:10EA0000FFF7E6FD0F4B104A1A60FFF7CDFD0F4BE5 +:10EA1000A0692360FFF78EFF84F840503460C4E99A +:10EA20000801C4E90A01C4E90C89C4E90E5530683B +:10EA3000BDE87083F01C0024A81C00240CAA010867 +:10EA4000A0A90108682D002481C70008D0A90108E9 +:10EA5000B1F900305A1C01D118467047834201D1E8 +:10EA6000886870470C31F3E708B5431C03D10346AF +:10EA7000184608BD0C31B1F900305A1C04D0984238 +:10EA8000F8D14B68591CF3D101460148F3F710FA4D +:10EA900030010180884208B507D0431C05D0013100 +:10EAA000014602D00248F3F703FA084608BD00BF4A +:10EAB00030010180D0F890302DE9F04F012B044651 +:10EAC0002DED088B87B0029307D9002084F89400BD +:10EAD00007B0BDEC088BBDE8F08F031DB0F9967050 +:10EAE000B0F9986008EE103AD0F88C30B0F99A502E +:10EAF000B0F99CA008EE903AB0F99EB0B0F9A080B1 +:10EB000038467249FFF7B0FF714903903046FFF76E +:10EB1000ABFF704901902846FFF7A6FF6E4909EE4A +:10EB2000100A5046FFF7A0FF6C4909EE900A5846BC +:10EB3000FFF79AFF6A490AEE100A4046FFF794FF72 +:10EB4000019A039B814611461846FFF7A3FF19EE71 +:10EB5000901A019019EE100AFFF79CFF49460390A6 +:10EB60001AEE100AFFF796FF019B1A46039B9A4282 +:10EB7000ABD1019B8342A8D154493846FFF768FFC7 +:10EB8000534903903046FFF763FF524909EE100ADC +:10EB90002846FFF75DFF504909EE900A5046FFF7FF +:10EBA00057FF4E490AEE100A5846FFF751FF4C49ED +:10EBB0000AEE900A4046FFF74BFF4A4A0BEE100A56 +:10EBC000039BD2F8D410484841F48041C2F8D410D5 +:10EBD000D2F8D41001F48041059105994349D0F849 +:10EBE0008CC08C45FBD1D16F4FF0000941F48041BE +:10EBF000D167D16F21F48041D1674FF44072012178 +:10EC0000C26000223846A4F8547084F8452022617E +:10EC100084F844204FF0004292FAA2F2B2FA82F253 +:10EC2000013A62614FF48062A261029AE261019A44 +:10EC3000C4E9021162601946C4E90899F3F7A0FB20 +:10EC400049463846F3F754FB19EE101A3046A4F83B +:10EC50005660F3F795FB49463046F3F749FB19EE4A +:10EC6000901A2846A4F85850F3F78AFB49462846DC +:10EC7000F3F73EFB1AEE101A5046A4F85AA0F3F729 +:10EC80007FFB49465046F3F733FB1AEE901A58467D +:10EC9000A4F85CB0F3F774FB49465846F3F728FB39 +:10ECA0001BEE101A4046A4F85E80F3F769FB494654 +:10ECB0004046F3F71DFB18EE901A18EE100AF5F710 +:10ECC000C1FBB0FA80F0400900E700BF40A5010891 +:10ECD00070A50108A0A50108C4A50108F4A50108B4 +:10ECE00018A601080044025800640258000300807E +:10ECF000431C07B510D103B05DF804FB83420AD171 +:10ED000089680190F3F73CFB0021019803B05DF89E +:10ED100004EBF3F7EDBA0C31B1F900305A1CEDD128 +:10ED200001460148F3F7C4F8300101800148FFF7BC +:10ED3000F7BC00BF0CAA010870B504461646018254 +:10ED40001D46F4F7D3F920460021F4F7F3F93146D4 +:10ED5000B4F91000F3F7CCFA29462046BDE870401C +:10ED6000FDF712BD38B5154604460182F4F7BEF929 +:10ED700020462946FDF708FD0121F4F7DBF9B4F937 +:10ED800010000021BDE83840F3F7B2BA00B589B0F1 +:10ED9000154DFFF71DFC0022A52101A8FFF7E2FF9A +:10EDA0000424012101A8FDF7EFFC2846F3F792FAAD +:10EDB000002101A8FDF7E8FC2846F3F78BFA013C97 +:10EDC000EFD10424094E012101A8FDF7DDFC3046F6 +:10EDD000F3F780FA002101A8FDF7D6FC3046F3F7DF +:10EDE00079FA013CEFD1DBE7F0490200801A060016 +:10EDF00008B50E4B0121D3E84F2FC3E8401FD2B214 +:10EE00000028F8D12AB1FFF7E3FBBFF34F8F20BFF3 +:10EE1000FDE7EFF305831BB9EFF31083DB0701D5A3 +:10EE2000FFF7B4FF012000F0DBFC00BFA82D002499 +:10EE30000FB407B5CDF804E0F3F72EF8019A0146B8 +:10EE400010B90248FFF722FCFFF7D2FF0001FF8054 +:10EE500038B5856900F10804FFF7BAFB6A685368A2 +:10EE60009C4209D1436928465360FDF714FDBDE873 +:10EE70003840FFF799BB1346002BF8D0DA6894426C +:10EE8000F9D14269DA60F2E738B5114C237A022BE6 +:10EE90001CD1104B1D682846FFF7DAFF00234FF006 +:10EEA000007285F83F300C4B5A6001226272BFF34A +:10EEB0004F8F5968C90003D54FF000615960A272A5 +:10EEC00004232372BDE83840FEF71ABC002038BD89 +:10EED0003C010024F01C002400ED00E02DE9F74384 +:10EEE000044600F108058069904699460190FFF7B5 +:10EEF0006FFB0198FDF789FC0198002142682461AD +:10EF00005368C4E902892BB9636161B95560FDF7A3 +:10EF1000C2FC0FE0D3E90067B94508BFB045F3D3A1 +:10EF20001946DB68EFE7D2E90A23CD604B4508BFFD +:10EF30004245ECD203B0BDE8F043FFF735BB00001B +:10EF400090F83C3030B453B1002380F83C3090F856 +:10EF50003E3013B9012380F83D3030BC704790F843 +:10EF60003F30002BF9D0836B4FF080620133836315 +:10EF70000B4B5A60D0E90C32013342F10002C0E978 +:10EF80000C32D0E90A2312F57A7543F1000412F528 +:10EF9000FA62C0E90A5443F1000330BCFFF79EBF98 +:10EFA00000ED00E010B5FFF717FD012380F83F30BA +:10EFB000836B1BB1064B4FF080625A60D0E90A2385 +:10EFC000BDE8104012F57A7243F10003FFF786BFE7 +:10EFD00000ED00E038B5274C237A012B03D04FF029 +:10EFE000FF35284638BD244A00212448FEF7E2F9BF +:10EFF000A062FFF7EFF805460028F0D1204AE16C47 +:10F000002048FEF7D7F9A0640028E8D01E4AFF2365 +:10F0100082F8223092F82230D26863F0FF03C2F304 +:10F020000222DB4314BFB3FA83F32023C3F120038E +:10F03000934298BF531CFE2202FA03F3124ADBB23A +:10F04000D377F02382F823309368104ADA63BFF352 +:10F050004F8F4FF0FF332361FFF7A4FF0C48FDF7FC +:10F060003CFD02234370A06183F31488BFF36F8FCC +:10F070002372B6E73C01002438AA010825CA00081B +:10F0800074AA0108BD08010800ED00E0FF030008B4 +:10F090005801002438B51E4C0546237A042B35D17F +:10F0A000FEF72EFBE26AA842034694BF00F1FF334D +:10F0B0002B4612B1D069C01AD061626C12B11069CE +:10F0C000C01A1061E06803440544E360E368AB42A2 +:10F0D00013D1022300202372FDF766FD0023637223 +:10F0E000BFF34F8FA27A22B1A3724FF08052094B27 +:10F0F0005A60BDE83840FFF755BF0133E360FDF7C4 +:10F10000AFFD236D002BE1D09847DFE738BD00BF8E +:10F110003C01002400ED00E0F8B50F4B002600276D +:10F12000002504460360C0E90267C0E904550B48A6 +:10F13000A061FFF77DFBFFF74BFA094B094A1A6004 +:10F14000FFF732FA01232046656384F83830064B16 +:10F15000C4E908672360F8BDA0A90108649B010801 +:10F16000E00F002481C70008C4A90108F8B50446CF +:10F170000E4615460021202268301F4608F006F88A +:10F1800094F86030721C84F8683016BF00230123A5 +:10F1900084F8696084F86A3094F8613084F86C30DF +:10F1A00094F8623084F86D306B1C16BF0023012385 +:10F1B0002567013784F8743094F8633084F8783028 +:10F1C00094F8643084F8793016BF00230123E36794 +:10F1D00084F88030D4F8883084F8843094F865302E +:10F1E00084F88530F8BD43681A6803681A4214BF72 +:10F1F0000120002070470000094B30B51A46094C29 +:10F20000D3F89450A542FBD1036829B181680B6003 +:10F210004FF44073536130BDC1681B04F7E700BF72 +:10F22000006402580003008008B5FFF7D1F90121FE +:10F23000F3F780FFBDE80840FFF7B6B905F0C6BB9D +:10F24000EFF310832BB9EFF31180003818BF0120C2 +:10F25000704701207047000008B5EFF305832BB914 +:10F26000FFF7EEFF10B9DFF80CC000DFDFF808C0D1 +:10F2700000DFFEE72DCA000801D2000810B50446E1 +:10F28000EFF305831BB15CB96FF0030017E0FFF7E4 +:10F29000D7FF0028F7D12046DFF82CC000DF0EE0B2 +:10F2A0002378F62BF0D1E18904F10C00FDF789FDFC +:10F2B000E389834204D92046FEF766FF002010BD93 +:10F2C0006FF00200FBE700BFE1CD000810B5044677 +:10F2D0000430FEF7F8FA04F15400FEF7BFFF0023F4 +:10F2E000206C6361012384F83D30BDE81040FFF7D6 +:10F2F000C5BF0000024608B5EFF3058313B16FF0F8 +:10F30000050008BDFFF79CFF0028F8D11046DFF884 +:10F3100008C000DFF5E700BF41CE000808B5036A6A +:10F32000013B03620068FFF7E5FF014630B1044B83 +:10F330001B78DBB213B90348F2F7BAFD08BD00BF72 +:10F34000391000241701028010B52C4C2C48FEF710 +:10F3500085FF636913B994F83D3023B12848FFF75E +:10F36000DDFF002010BDA36A53B1A26A0023254926 +:10F37000E06AB3EB900F11D242F823100133F7E7A4 +:10F38000E06A214B984294BF20F003004FF0FF3019 +:10F3900007F08EFEA0620028E7D1DFE744231B4A76 +:10F3A00063621B4B226263601A4BA3600023E3601D +:10F3B000194B2361EFF305838BB10023636194F84C +:10F3C0003C302BB1A06A08B107F07AFE0023A3629B +:10F3D0000B48FFF7A3FF206CFFF750FFC1E7FFF7D3 +:10F3E0002FFF0028E9D1A2F178010C48603ADFF83C +:10F3F00030C000DF60610028B0D1E0E7A019002430 +:10F40000F4190024A52E5AE2FBFFFF7F181A0024EE +:10F4100044190024F5110108D1D80008CDF20008E4 +:10F42000B5D30008014B1868FFF764BF402D0024D6 +:10F43000014B1868FFF75EBFF02D0024024B1868DF +:10F4400008B1FFF757BF7047A8350024037823F0B1 +:10F45000030343F001030370FFF7F0BF10B5044648 +:10F46000037803F00303012B08D0FEF7FFFB23789A +:10F4700003F00302012A03D1FFF7E0FF002003E0BD +:10F4800043F002032370012010BD00003F282DE946 +:10F49000F04F06468BB000F32C81974F57F82000B1 +:10F4A000411C40F00A81022E00F307819348DFF8E7 +:10F4B00090920378BFF35B8F13F0010F40F0FA8056 +:10F4C000FFF7CCFF002800F0F5808D4BC9F8003025 +:10F4D0008C4B1A689846002A40F0E9808A49092036 +:10F4E000FFF7C2FA044689490A20FFF7BDFA014630 +:10F4F0002046874DFFF7CEFA834904460920FFF7DF +:10F50000A7FA824983460A20FFF7A2FA814B824676 +:10F510002C609C4221D1804AD2F8F01041F01001B9 +:10F52000C2F8F010D2F8F02002F010020992099A05 +:10F530007A4A94424AD1784BD3F8F02042F0200224 +:10F54000C3F8F020D3F8F03003F020030493049BB9 +:10F55000734B9C424AD1012487E0714A94421AD0ED +:10F5600002F58062944224D06E4A94425CD06E4A86 +:10F570009442DDD1684AD2F8E81041F48011C2F813 +:10F58000E810D2F8E82002F480120592059A9C4215 +:10F59000DED1002469E0604AD2F8E81041F400317D +:10F5A000C2F8E810D2F8E82002F400320892089A73 +:10F5B000BEE7594AD2F8E81041F48021C2F8E810B9 +:10F5C000D2F8E82002F480220792079A574A944220 +:10F5D00037D1514BD3F8E82042F08042C3F8E820FD +:10F5E000D3F8E83003F080430393039B504B9C42D5 +:10F5F00075D003F580639C4273D003F580639C4211 +:10F6000071D003F544439C426FD0A3F51C439C4248 +:10F610006DD003F580639C425FD04648844214BF9E +:10F620004FF0FF34082420E03B4AD2F8E81041F4C0 +:10F630000021C2F8E810D2F8E82002F40022069275 +:10F64000069A3D4A94423BD03A4A94429FD1324B6B +:10F650000824D3F8F42042F00802C3F8F420D3F8C9 +:10F66000F43003F008030193019B594609206C60B4 +:10F67000F2F786FE01210920F2F73AFE51460A20F0 +:10F68000F2F77EFE01210A20F2F732FE00234FF44A +:10F690001652C5E90223294AC5E90433C5E9062300 +:10F6A000F4F75EFF0123C8F80030F6F721FF134896 +:10F6B000FFF7CCFE224847F826900BB0BDE8F08F4C +:10F6C000154BD3F8E82042F00042C3F8E820D3F805 +:10F6D000E83003F000430293029B0724C5E70224AD +:10F6E000C3E70324C1E70424BFE70524BDE70624DC +:10F6F000BBE70020E1E700BF38000024A81B00247E +:10F70000FCA80108CC350024A4A7010848A60108DC +:10F710006C12002400100140004402580014014003 +:10F7200000440040004C0040005000400078004081 +:10F7300000480040000C0058007C004009000A000E +:10F74000F41C002438B50D46FFF7A0FE044630B97E +:10F7500006F028FF092303604FF0FF3038BD03682F +:10F76000DB6998470028204614BF4FF400534FF43C +:10F7700000436B6023689B6A984728610020EDE78F +:10F7800010B5FFF783FE30B906F00CFF09230360C4 +:10F790004FF0FF3010BD03689B699847041E04DAE0 +:10F7A000644206F0FFFE0460F2E70020F2E700008A +:10F7B0000A4D044608B52B68986806F0BBFF2B6815 +:10F7C000D86806F0B7FF0120FFF7DAFF0220FFF745 +:10F7D000D7FF0CB1FFF7DAFAFEE700BFF40200240E +:10F7E00008B5FFF7E5FF13B5CDE90021FFF74EFEA1 +:10F7F000DDE9002140B906F0D5FE092303604FF092 +:10F80000FF34204602B010BD03681B699847041EF0 +:10F81000F7DA644206F0C6FE0460F0E710B5FFF7C1 +:10F8200035FE044628B906F0BDFE092303602046D4 +:10F8300010BD0368DB699847041EF8DA644206F0DD +:10F84000B1FE04600024F2E7FFF7E8BF13B5CDE98D +:10F850000021FFF71BFEDDE9002140B906F0A2FE02 +:10F86000092303604FF0FF34204602B010BD036847 +:10F870009B689847041EF7DA644206F093FE046022 +:10F88000F0E700007FB5002A04460D4606DA06F0D0 +:10F8900089FE162303604FF0FF3019E00192FFF755 +:10F8A000BDFF019AE8B1114E01220DF10F01204672 +:10F8B000FFF7CCFF0028EEDB0AD09DF80F300D2BB0 +:10F8C00008D1325D0A2A3355EED00A2301202B706D +:10F8D00004B070BD0A2B02D1325D0D2AF3E7335517 +:10F8E000F4E729462046FFF7B1FFF1E7AC1B0024FF +:10F8F00013B5CDE90021FFF7C9FDDDE9002140B9CD +:10F9000006F050FE092303604FF0FF34204602B09A +:10F9100010BD0368DB689847041EF7DA644206F0FE +:10F9200041FE0460F0E700002DE9F74FB2F1000856 +:10F9300005460E4609DA06F035FE162303604FF041 +:10F94000FF34204603B0BDE8F08FFFF767FF0446A1 +:10F9500060B31F4A0027DFF87CA04FF00D0B535D0A +:10F960003C469146B84521DDF25D0A2A1BD10D2B9C +:10F97000019318D0BC420CDA3A1B31192846FFF724 +:10F98000B7FF0028019BDADB0444A742D9DC09F861 +:10F990000530012251462846FFF7AAFF0028CEDB9A +:10F9A000CFD009F805B0F35D0137DBE7A045C8DD2E +:10F9B000A8EB040231192846FFF79AFF0028BEDBA6 +:10F9C00024181FBF3619024B16F8012C5A55B8E7F8 +:10F9D000EC1B002442A201080FB470B5A4B084212E +:10F9E00028AB03A853F8042B0293FEF76CFC832882 +:10F9F00006D9194B1A681B79CDF88B208DF88F30FA +:10FA000000280FDD002203A9022003ACFFF770FFDE +:10FA10000D26FEF7DDFD0022254614F8013B33B923 +:10FA2000FEF7C2FD24B0BDE8704004B070470A2B59 +:10FA300009D10D2A07D001220DF1070102208DF80E +:10FA40000760FFF755FF012229460220FFF750FF0C +:10FA500014F8012CE0E700BF44A20108F0B52C4ED9 +:10FA600085B000242B4F35462146013456F8042B2F +:10FA70003846FFF7B1FF0D2CF6D1AB6C264C029344 +:10FA80006B6C264801932B6C0093696BD5E90E23B0 +:10FA9000FFF7A2FF21682248FFF79EFFE16AA26AF2 +:10FAA000A36AA06AD2B2266BC3F30723E76B000CEC +:10FAB000CDE9016700901B48FFF78EFFA36A1E0681 +:10FAC00003D5616B1848FFF787FFA36A180403D5B5 +:10FAD000A16B1648FFF780FFEB6C190712D514488D +:10FAE000FFF77AFF2B6DDA070FD51248FFF774FF87 +:10FAF000EB6C5B074CBF1048104805B0BDE8F04008 +:10FB0000FFF76ABF0E48FFF767FF0E48EEE700BF3A +:10FB10004C3E002449A2010800ED00E057A2010874 +:10FB2000A6A20108B4A2010803A3010811A30108B9 +:10FB30001FA301082EA301085EA301086AA3010800 +:10FB40004EA301083BA3010808B504460D46F2F791 +:10FB5000A3F950BB1648FFF73FFF302C16D0402CBE +:10FB600019D0202C1CD1134C1348FFF735FF134834 +:10FB7000FFF732FFFFF772FF1148FFF72DFF114B20 +:10FB800000221A7029462046F2F792F90E480F4CCF +:10FB9000FFF722FFEBE70E480E4CFFF71DFFE6E7ED +:10FBA0000D480E4CFFF718FFE1E70024EAE700BF1D +:10FBB00076A301083E01FF809FA30108CCA30108A2 +:10FBC000D7A3010839100024AEA301083F01FF802C +:10FBD000B7A301084001FF80C2A301083D01FF80D7 +:10FBE00038B505460024FFF751FC0B4B43F8254080 +:10FBF00030B906F0D7FC092303604FF0FF3038BD61 +:10FC000003685B699847051E04DA6D4206F0CAFC7A +:10FC10000560F2E72046F2E73800002438B50546D3 +:10FC2000046854B9FEF722F82C6824B92C1D20462C +:10FC3000F2F74EF92C60FFF701FC204638BD0000BA +:10FC4000F0B50E4685B090F8201005461446DDE963 +:10FC50000A7C19B96FF47A6005B0F0BD0168CDE98E +:10FC6000007CC96B88470028F4D029690D486118C9 +:10FC70000391FFF7D3FFFEF7F1FAFEF7F7FCFEF76B +:10FC8000D1FC3A460399304607F072FAFEF7B8FC09 +:10FC9000FEF7DAFC0348FFF7C1FFFFF73FFB002048 +:10FCA000DAE700BF801C00242DE9F04188460025DA +:10FCB00004462349C0E90055404609F0F6F980445E +:10FCC000C4F8008023681A782F2A1CD101332360DE +:10FCD0001C48FFF7A3FFFEF7C1FA1B4B1E68D6B105 +:10FCE000B768B7B1384608F061FC854211D12A46A1 +:10FCF0004146384609F052F958B91248FFF78EFFCD +:10FD0000FFF70CFB17E0002AE2D001330135236036 +:10FD1000D8E77668E3E7072DEFD12A4641460B483E +:10FD200009F03CF90028E8D10648FFF777FFFFF714 +:10FD3000F5FA074B1E6820466660BDE8F08100BFFB +:10FD40009C9B01088C0F0024880F0024F6A3010857 +:10FD50007C1C00242DE9FF478A463F49054608F0F0 +:10FD600013FC044628B9FFF791FB204604B0BDE818 +:10FD7000F0873A49284608F007FC20B90120012401 +:10FD8000FFF784FBF1E73649284608F0FDFB20B970 +:10FD900002200224FFF77AFBE7E72B78402B02D101 +:10FDA000D5F80140E1E72F4E03242F48B046FFF776 +:10FDB00035FFFEF753FA56F82490B9F1000F2AD018 +:10FDC0000134402CF7D106F0EDFB182303602648E0 +:10FDD000FFF724FFFFF7A2FA0AE002A8FEF71EFDD4 +:10FDE000054640B906F0DEFB1323036046F82450B5 +:10FDF0004FF0FF34B9E7036801A9029A9D682AF41D +:10FE00008033A8470546E8B16D4206F0CBFB05609C +:10FE100046F82490ECE74FF0FF37134846F824707B +:10FE2000FFF7FCFEFFF77AFA294602A8CDF8049006 +:10FE3000FFF73AFF039D002DD4D02B7B002BCCD1B4 +:10FE4000043D0195019B094A48F8243000231355CD +:10FE5000074A135589E700BFDCA90108E3A9010897 +:10FE6000D4A90108380000242C1C0024AC1B002459 +:10FE7000EC1B00241D4B70B5036004461C48FFF7C3 +:10FE8000CDFEFEF7EBF9A3682BB11A4962680B6847 +:10FE9000A34224D10A60184B15481A68A24204BF35 +:10FEA00000221A60FFF7BAFEFFF738FA257BA5B9E2 +:10FEB0001248261FFFF7B2FEFEF7D0F9104A402382 +:10FEC00052F8041B8E4208BF42F8045C013BF7D194 +:10FED0000A48FFF7A3FEFFF721FA204670BD194636 +:10FEE0005B68A342FBD14A60D5E700BF949A010842 +:10FEF0008C0F0024880F00247C1C00242C1C002460 +:10FF00003800002410B50446FFF7B4FF204607F080 +:10FF1000D7F8204610BD000008B50348FFF77EFE65 +:10FF2000BDE80840FFF7FAB9541C002408B503489F +:10FF3000FFF774FEBDE80840FEF790B9541C00249A +:10FF40002DE9F0479DF82070054689469246022F1C +:10FF500098469DF8246022D8124BDB5DFBB1B6FBBE +:10FF6000F3F403FB146414F0FF0418D1FFF7DEFF71 +:10FF70009DF82830284685F8609085F865300B9B01 +:10FF800085F861A085F8628085F8637085F8646003 +:10FF9000C5F88830FFF7C0FF2046BDE8F0874FF076 +:10FFA000FF30FAE73CA501082DE9F04F89B09046F3 +:10FFB000994605469DF84820C3469DF8503090F874 +:10FFC000FA71DDE915610591032A57D8DFE802F0DF +:10FFD0001B02190302270F2B4FF0000205F1040A40 +:10FFE00008BF95F8FD3111465046009203933B46F9 +:10FFF000CDE90122FFF7A4FF044638B109B0BDE8FE +:020000040801F1 +:10000000F08F0327E7E74FF0FF3BE4E7059B4FF056 +:10001000FF329DF84C105046079307ABCDE90063C3 +:100020005B46F2F76BFF3B4683462246214650462D +:10003000CDE90244CDE90044FFF782FF0028DDD17D +:10004000BBF1000F01D05846D8E795F80101002810 +:10005000D4D0B9F1000F08BFB8F1040F04D1337840 +:1000600043F00A033370EEE7B9F1000F08BFB8F1AF +:10007000020FE8D1337823F00403F3E74FF0FF30A9 +:10008000BCE70000274B10B504460360FFF74EFFA6 +:1000900025496268136823F0010313600023A364F9 +:1000A00084F84530214BD1F88C209A42FBD1204B6B +:1000B000B4F95400DA6F42F48042DA67DA6F22F45E +:1000C0008042DA674FF44072CA6040F2C331D3F81D +:1000D000D42022F48042C3F8D420F2F751F9B4F9C5 +:1000E000560040F2C331F2F74BF9B4F9580040F230 +:1000F000C331F2F745F9B4F95A0040F2C331F2F7CF +:100100003FF9B4F95C0040F2C331F2F739F940F23B +:10011000C331B4F95E00F2F733F92046FFF7FCFE75 +:10012000204610BDFC9901080064025800030080BD +:100130000044025810B50446FFF7A4FF204606F01D +:10014000BFFF204610BD08B5D830FFF767FDBDE8FA +:100150000840FFF7E3B808B5D830FFF75FFDBDE80A +:100160000840FEF77BB800002DE9F04F0D4616461B +:1001700085B0F1F75BFFAC1900F10060A042C0F060 +:100180001E8109D92046F1F731FFB4FBF0F303FBE0 +:100190001040002840F0138190484FF00009DFF82C +:1001A00058B2FFF73BFDFEF759F8002E00F0FE8035 +:1001B000B9F1000F40F0F88005F17843B5F1016F17 +:1001C0004FF0100A4FEA5343019334BF0123022337 +:1001D000012B03F0010803F002070CBF4FF000638E +:1001E0004FF001630293FEF741FAFEF71BFABBF8EA +:1001F00000304FF6FD715A1E92B28A4297BF784A7C +:100200004FF0026302EA832303F100639D420ED2A2 +:10021000B5F1006F0BD3734C734BD4F888209A421E +:10022000FBD1F6F7BDFC60B14FF44073A360FEF75D +:10023000E7F9FEF709FABAF1010AD4D14FF0FF3914 +:100240006BE0FEF7C5F9BBF800204FF6FD71DFF853 +:10025000AC91531E9BB28B4299F8143097BF634CFC +:100260004FF0016404EA422404F10064A5422ABF6D +:100270002C1B019C640C012B00F0938001200023B7 +:1002800089F81400C9F81830B8F1000F00F09D800B +:10029000F2F7D4F9031E18BF0123002F00F0998054 +:1002A00002200393F2F7CAF9039B00283BD00120F8 +:1002B0000023C01A89F8143018BF0120C0F10009CA +:1002C000029B03EB4444BFF34F8F494B04F50032CC +:1002D000C3F8704220349442FAD1BFF34F8FBFF37A +:1002E0006F8FBFF34F8FBFF36F8F0022C3F8502281 +:1002F000BFF34F8FBFF36F8FFEF756F9F6F738FC59 +:10030000002894D1374B4FF440729A60B9F1000F36 +:100310008DD1FEF775F9FEF797F92846F1F766FEDD +:10032000361A054441E7002BC1D1B8F1000F0AD0BD +:10033000304AD36823F4E663D360D36843EA0423E6 +:1003400043F0A403D36077B12A4AD2F80C3123F4E6 +:10035000E663C2F80C31D2F80C3143EA042343F0CF +:10036000A403C2F80C31B8F1000F2BD00120F2F732 +:1003700065F9204AD36823F4E06323F00403D360D3 +:100380005FB10220F2F75AF91A4AD2F80C3123F47D +:10039000E06323F00403C2F80C31002888D1002068 +:1003A00086E74FF0FF398BE74FF0FF390B48FFF737 +:1003B00035FCFEF7B3FF484605B0BDE8F08F4FF0BF +:1003C000FF39F8E7002FEAD0DBE7002FE7D04346FC +:1003D00066E700287FF46BAFAAE700BF801C00240B +:1003E00000FC3F00006402580003008000FE1F0074 +:1003F00000ED00E00020005280E8F11F3C100024D6 +:10040000F7B590F8201004461546DDE9086771B18C +:100410000168CDE90067496C884740B121693246DF +:10042000201D294403B0BDE8F040FFF79DBE6FF4E6 +:100430007A6003B0F0BD00002DE9F04F12F01F0408 +:1004400087B082460F461646994640F0268100291D +:1004500000F02381F1F7EAFD09EB060300F10060EB +:10046000834200F21A818E48DFF850B2FFF7D6FBC4 +:10047000FDF7F4FEB9F1000F00F00681002C40F00A +:1004800001813046F1F7B2FDB6FBF0F500FB1565D2 +:10049000451B4D4528BF4D46BB0701D11F2D4BD8ED +:1004A000202DA8463946DAF8040028BF4FF020086E +:1004B000424606F05DFE1F2D07D8DAF80400C8F1A9 +:1004C0002002FF21404406F061FEDAF804302025C6 +:1004D000039310230293FEF7C9F8FEF7A3F8714BBC +:1004E00019884FF6FD734A1E92B29A4297BF6E4B1F +:1004F0004FF0026303EA812303F100639E4210D2AE +:10050000B6F1006F0DD3694C694BD4F888209A423C +:10051000FBD1F6F745FB002800F0AC804FF44073A8 +:10052000A360FEF76DF8FEF78FF8029B013B029384 +:10053000D1D14FF0FF3487E025F01F050397A8467F +:10054000C7E7012B00F09B8002F178400123B0F552 +:10055000801F8BF8143006D3A2F10163B3F5801F1E +:1005600080F085800223002005920493CBF81800C8 +:100570001846F2F763F8059A20BB049B4D48012BFF +:1005800067D1C16841F00201C160BFF36F8FBFF353 +:100590004F8F002001990958115004302028F9D1BB +:1005A0000592BFF36F8FBFF34F8F18460493F2F796 +:1005B00045F8049B059A012B3E4B51D1D96821F097 +:1005C0000201D96000238BF8143000284FD1019B21 +:1005D0002032203301939BF814307019824203D2E9 +:1005E000002CAED04FF0FF34002D11DD06F01F03BC +:1005F0002B44BFF34F8F304832463344C0F870224B +:100600002032991A0029F9DCBFF34F8FBFF36F8FA7 +:10061000BFF34F8FBFF36F8F274B0022C3F85022D9 +:10062000BFF34F8FBFF36F8FF6F7A2FA00287FF466 +:1006300078AF1E4B4FF440729A60002C7FF471AF7C +:10064000FDF7DEFFFEF700F8A9EB08094644474432 +:1006500010E7D0F80C1141F00201C0F80C1194E73A +:10066000D3F80C1121F00201C3F80C11AAE74FF0E6 +:10067000FF34B0E7039B044632460193ABE74FF0EB +:10068000FF34ABE74FF0FF340548FFF7C7FAFEF73A +:1006900045FE204607B0BDE8F08F4FF0FF34F8E785 +:1006A000801C002480E8F11F00FC3F000064025819 +:1006B000000300800020005200ED00E03C10002408 +:1006C000F0B590F8207085B0044615460391DDE939 +:1006D0000A6C7FB10768CDE9006C3F6CB84748B140 +:1006E000226933460399201D2A4405B0BDE8F04035 +:1006F000FFF7A2BE6FF47A6005B0F0BD10B50446F6 +:100700000168D0E901230548FFF796FE206806F04E +:10071000D7FC2046BDE8104006F0D2BCA02D002436 +:1007200010B504460B48FFF779FAFDF797FDFDF782 +:100730009DFFFDF777FFFDF763FFFDF785FF60681D +:1007400008B106F0BDFC0348FFF768FAFEF7E6FDC6 +:10075000002010BD801C002490F8203010B5044605 +:1007600013B94362002010BD2430F1F795FC002836 +:10077000F8D184F82000201DBDE81040FFF7D0BF5D +:10078000034B10B504460360FFF7E6FF204610BD9B +:100790004CA9010810B50446FFF7F2FF204606F009 +:1007A0008FFC204610BD000010B504461248FFF72C +:1007B00035FAFDF753FDFDF759FFFDF733FF0F4BFA +:1007C0000F4AD3F888109142FBD14FF48E010D4AA5 +:1007D00051614FF440729A60FDF712FFFDF734FF4C +:1007E0002020FDF7CBFD60600348FFF717FAFEF706 +:1007F00095FD002010BD00BF801C0024006402583D +:10080000000300800020005290F820302DE9F04FC6 +:10081000814685B003B9436209F1240656E8000F0A +:10082000013046E80003002BF8D1012843D109F13B +:100830000400FFF7B9FF804630B13046F1F72CFCD9 +:10084000404605B0BDE8F08FD9E906ABD9E90445CB +:100850001AEB040300934BEB05030193F1F7E6FB5E +:10086000002300F1006C8646DDE900018B4208BFE1 +:10087000844505D230466FF47A68F1F70DFCDFE766 +:10088000002D08BFB4F1006FF4D35AEA0B030ED168 +:100890004FF000610B1B029365EB45030393DDE909 +:1008A000026716EB0E0647F10007C9E9066701214A +:1008B00089F82010C4E79846C2E7000004460B4DB3 +:1008C00007B5EFF30583002BFBD1FEF7B9FC024619 +:1008D0000028F6D1204669464FF0FF33AC4600DFD2 +:1008E0000028EED1DDE900309847EAE7DDD90008BD +:1008F0002DE9F74F394D6C6C002C63D023694FF014 +:100900000008DFF8E0904FF0F90A013B6F692361BE +:100910002369002B55D1E3680BB1A2689A60D5F822 +:100920004CB004F118016B64EFF3058343B1BBF1E4 +:10093000000F13D1AB69032129486B61F1F7B8FAB5 +:100940000191FEF77DFC019902460028EFD158463F +:100950001346CC4600DF0028ECD11BE09BF80030AA +:100960000191FA2BE6D10BF10C00FCF774FB064663 +:100970000028DFD001990C30DBF8242006F0F8FBCA +:100980000199304686F800A0A6F80280C6E9011B4E +:10099000FDF7FAFBE378012B1DD16B6C0021626936 +:1009A00013B11869824210D22261C4E902131BB14B +:1009B00018699C60821A1A6159B1CC606C6C002C69 +:1009C000A6D16F6103B0BDE8F08F1946121ADB683B +:1009D000E6E76C64F2E701236370EFE73C01002473 +:1009E00027010280B9DB000808B5EFF3058353B196 +:1009F000124B1B689869FDF79DFF4FF47A72002334 +:100A000008F064FB08BDFDF7E3FDEFF305836BB170 +:100A10000B4BD8680B4B1A681860824281BF0A4999 +:100A20000A6801320A60FDF7BFFDEBE7FEF708FC3C +:100A30000028EDD1DFF814C000DFEBE7F01C002444 +:100A40003C010024FC1C0024F81C002491C900086F +:100A50002DE9F04FA1B0EFF30583002B63D0002008 +:100A60008A4D2C68FDF7B4FDD4E90C67FDF79CFDB9 +:100A7000A36BF11ADFF84882DFF8489267EBE37264 +:100A80001346CDE900120A1843F10003CDE908230B +:100A90007F4B0A9300230B93FDF79EFF08A8FBF7FB +:100AA0005FFE002840F02E826FF000434FF0FF32CF +:100AB000DDE908679F4208BF964210D02C6894F881 +:100AC0003C3063B9214604A8FDF743FFDDE9042368 +:100AD000BB4208BFB2422ED3012384F83D30FDF75C +:100AE00077FD08A8FBF73CFE002840F009826FF074 +:100AF00000414FF0FF30DDE908238B4208BF8242FE +:100B000062D1FDF765FD634B1B889BB2002B65D05E +:100B1000FDF75EFD604B1B68604B1A6922F0040212 +:100B20001A6130BFE9E1FEF78BFB002897D1DFF8AF +:100B300098C100DF94E7FDF74BFDD4E90C01FDF708 +:100B400033FD4FF47A73B6EB000A67EB010BA6FB9B +:100B5000030103FB0711D4E9082386184FF00102B3 +:100B600041EB030794F84030A28783B9A3691B685F +:100B700093F82030002B40F0E58184F84020FDF709 +:100B8000FFFCBBF1000F08BFBAF1050F0DD2002327 +:100B900084F83E3094F8403023B9012384F8403083 +:100BA000FDF7EEFC32463B460AE094F84030002B5D +:100BB000EDD10123B6F57A6284F83E3047F1FF3378 +:100BC0002046FEF78BF98AE72B6893F83C30002B20 +:100BD00097D1FDF7E9FCBFF36F8F5FE7D8F80040CE +:100BE00014F0010405D04046F1F77EFBB0FA80F422 +:100BF00064092B480368DB0704D5F1F775FB00286F +:100C000008BF012427480368DF0704D5F1F76CFB10 +:100C1000002808BF012424480368DE0704D5F1F743 +:100C200063FB002808BF012420480368D90704D5C6 +:100C3000F1F75AFB002808BF01241D480368DA07B2 +:100C400004D5F1F751FB002808BF012419480368B7 +:100C5000DB0704D5F1F748FB002808BF012416483C +:100C60000368DF0704D5F1F73FFB002808BF012424 +:100C700012480368DE0703D444B3FDF795FCA8E7E8 +:100C8000F1F732FB0028F7D1F7E700BFF01C002492 +:100C900015CA00082C2D00240048025800ED00E081 +:100CA0000044004000480040004C0040005000401C +:100CB0000014014000780040007C0040000C005807 +:100CC00000100140640E002489EE0008FDF780FC4E +:100CD000D9F800309F4E5A6A5B6B9F4F33609F4B31 +:100CE0003A609F4CDB6823609E4B19681A6801F0DC +:100CF000010142F001021A609B4A1268C2F303121A +:100D0000072A00F0AF805A6922F004025A611A687B +:100D100042F001021A60944A1068C0F303100728D9 +:100D200010D1186920F001001861136943F0040321 +:100D30001361BFF34F8FBFF36F8F30BF136923F081 +:100D40000403136121B1874A136843F00103136060 +:100D50008649874BD1F890209A42FBD1814B1A6982 +:100D6000910640F1B4805B699A0640F1B0807F49FA +:100D70007F4BD1F88C209A42FBD1482200210EA84B +:100D800006F004FA3F237B4A0D9313685B036ED58C +:100D90004FF4A0230E93136803F080031493764B53 +:100DA0001A6841F20303B3EB124F724A66D35368D9 +:100DB000C3F384631593136803F0010310936E4B20 +:100DC000196841F20303B3EB114F53682CBFC3F30F +:100DD0000533C3F306631193664B1A6F500751D561 +:100DE00005220F9201215A6F0DA802F00102129202 +:100DF0001A68C2F3003213921A689A6A02F0030268 +:100E000017929A6AC2F3051218921A6BC2F308027B +:100E1000013219921A6BC2F3066201321C921A6BEC +:100E2000C2F3462201321A921A6BC2F30642013211 +:100E30001B92DA6A02F00C021D92DA6AC2F34002D7 +:100E40001E925B6BC3F3CC031F9302230D931023FD +:100E5000CDE9101300231693F5F7AEF8C0B147485B +:100E6000FDF7E6FF1A6922F004021A614FE71368E2 +:100E700013F4803318BF4FF480338BE7D368C3F388 +:100E8000056397E71A6F12F0010218BF0122A8E765 +:100E900020220146079003900DA806F077F907A9D4 +:100EA0000DA8F3F7E9F9039B1B2207990DA81393EB +:100EB0000D920E9310931293F4F76AFF08B1304825 +:100EC000CEE7F5F761FF294B4FF44072DA60254A0F +:100ED0004FF4FA70136943F4007313614FF44072D6 +:100EE000224B1A61F1F7F6F9D9F800303A685A62E4 +:100EF00032685A632268194BDA60FDF755FBBCE68D +:100F0000FDF752FB2C682046FDF7A2FF002394F862 +:100F10004020A3871AB184F84030FDF701FB29680F +:100F200004A8FDF716FD049AEFF305833BB9FEF71D +:100F300087F920B9009BDFF84CC0D01A00DF21B040 +:100F4000BDE8F08FBBF1000F08BFBAF1050FFFF449 +:100F50001EAE2EE6D0350024D4350024000C00400F +:100F6000D83500240048025800ED00E00064025823 +:100F700000030080004402580010005CFEA301083A +:100F800023A4010895F0000800B595B0BFF35F8F6A +:100F9000804B0022196810465A60C1F30721914224 +:100FA00040F0BE801022DA607B4A1A611322DA60B8 +:100FB0007A4A1A611122DA60794A1A61794ADA604A +:100FC000794A1A6107225A60BFF34F8FBFF36F8FC0 +:100FD000764B774998684FF000531A1802F1604237 +:100FE000126843F8042B8B42F7D1704B4FF000523C +:100FF0009A605A69920315D45A6912F4003211D1D9 +:10100000BFF34F8FBFF36F8FC3F85022BFF34F8FE3 +:10101000BFF36F8F5A6942F400325A61BFF34F8FAA +:10102000BFF36F8F614B5A69D60327D45A6912F404 +:10103000803223D1C3F88420BFF34F8FD3F88020B0 +:1010400043F6E074C2F3C900C2F34E32520102EA21 +:101050000406014646EA81750139C3F86052F9D2A7 +:10106000203A12F1200FF2D1BFF34F8F5A6942F4A8 +:1010700080325A61BFF34F8FBFF36F8F4D4CD4F85E +:10108000E03043F00073C4F8E030D4F8E03003F00F +:1010900000730093009BF2F775F84449464BCA6809 +:1010A00022F4E0621204120C1343CB60F3F70EF942 +:1010B000A369A269C3F30323404AD35C03F01F036F +:1010C000D8403F4B1860F3F7E3FC236F9D070AD429 +:1010D0003C4A136843F4807313603B4B1B68236FD7 +:1010E00023F018032367F1F783FAF5F74DFEF2F7C3 +:1010F00049F84C22002101A806F048F82D4B1B6F3F +:1011000013F4407F10D0082301A8019300230A9311 +:1011100001230693F4F750FF30B12C48FDF788FE09 +:101120009A60013218613AE7EFF75EFAEFF3058350 +:101130002BB9FEF785F810B9DFF8ACC000DF244A00 +:10114000244B13614FF4805353614423D360224BEB +:10115000936018239361214B1360EFF305831BB158 +:101160001B491F48F0F7A4FEFEF76AF80146002865 +:10117000F6D11C48DFF874C000DF0028F0D0EFF390 +:1011800005832BB9FEF75CF810B9DFF864C000DF07 +:101190000021E6E790ED00E039F00206390702137E +:1011A0003FF50B13120000803900021300ED00E040 +:1011B00098020020004402580003FA050497010831 +:1011C00000000024004802580010005C4BA40108F5 +:1011D000002D0024001D0024D82E002469A401083D +:1011E0001D0101802D2A010885D60008B5D300080D +:1011F000D5EF00082DE9F34705460026674FFFF7B6 +:10120000F3FB85F82460FDF7E3F96B6801A91B1A6D +:10121000002B2B68D8BF686001931BB15A69121A62 +:10122000002A3BDD2B6003B11D610E60019911B1F5 +:101230002B8901332B81FDF7B7F901A8002931D1A2 +:10124000019C05F118094FF0010A002C37D1FFF776 +:10125000CBFBFDF7BDF92B68002B7ED05C69241A0F +:1012600024EAE474FDF7A0F9D5F83080EFF30583A4 +:10127000002B75D0B8F1000F7DD1AB7A002B00F0B8 +:101280008A80FDF7A5F9AB7A002B00F0828000235D +:10129000AB7202B0BDE8F047FDF786B903F1080173 +:1012A0009B68BAE78C680B4600229A601A46DB6896 +:1012B000002BFAD1026001F108002146BEE7236A43 +:1012C000D4F8088013B104F124009847A269002AD9 +:1012D0000BDB636913446361FFF786FB214602461B +:1012E0002846FDF74EFA4446AFE7EB6873B1A342D8 +:1012F0000CD82B6AA34209D3A3792A690133DBB244 +:1013000013FA02F214BFA37184F806A0E36913B1C3 +:1013100004F124009847EB6823B1A34202D82B6A5A +:10132000A34201D2A671DEE7FDF752F94846AB6948 +:1013300083B119682268914208D30BD1E360036836 +:101340009B68A3600460FDF72FF9CCE703F1080068 +:101350009B68EDE7E6600368F3E74FF0FF3481E751 +:10136000FDF76EFF0246002884D140460121234646 +:10137000BC4600DF81E798F80030F32B7FF47DAFA7 +:10138000002C7FF47AAF224601214046FCF7FCF99D +:1013900073E7FDF709F9FFF727FB34E7C5D7000826 +:1013A0002DE9F04700238AB0814642F21078DFF839 +:1013B0005CA001240025002600278DF82730EFF3DC +:1013C00005832BB9FDF73CFF10B90120D44600DF9F +:1013D0000DF127034FF0FF32052148460493002307 +:1013E000CDE9064500934FF0FF33CDE9026700F0E9 +:1013F0007FF89DF8273013F0010002D0B8F1010802 +:10140000DDD180F001000AB0BDE8F087ABD800085C +:10141000F0B500238BB0002600278DF827304FF061 +:10142000FF320493062100934FF0FF330446CDE9C9 +:101430000667CDE9026700F05BF8054618B14FF08A +:10144000FF300BB0F0BD2046FFF7AAFF0028F6D012 +:1014500001220023052120460095CDE906230DF148 +:1014600027034FF0FF3204934FF0FF33CDE90267BB +:1014700000F03EF80028E2D19DF8270080F002003D +:1014800040F34000DDE770B51D46D0F8F43086B07B +:101490000646013317D0140E8DF81740FFF7B8FF3A +:1014A00070B901234FF0FF32D6F8F41000930DF11C +:1014B0001703CDE90100301DF1F7B8FD06B070BD8E +:1014C0004FF0FF30FAE790F8FA31032B0ED06B1C87 +:1014D00008BFB2F1FF3F09D0002D08BFB2F1807FF5 +:1014E0002CBF4FF0FF30002040B2E7E70020E5E7D7 +:1014F0002DE9F7430A9E044615460C9FDDF8388017 +:10150000DDF840900191FFF7BEFF58B933462A46F7 +:101510000199201D0A97CDE90B8903B0BDE8F0437E +:10152000F1F784BD03B0BDE8F083D0F8E8300133B3 +:101530002DE9F047054688B08A461DD1FFF768FFC0 +:1015400028B14FF0FF34204608B0BDE8F0870022F4 +:10155000002301210490CDF800A0CDE90623D5F8A1 +:10156000E4304FF0FF32CDE902304FF0FF33284630 +:10157000FFF7BEFF0446E6E7FFF74AFF0028E0D189 +:101580004FF000084FF000090126002704904FF0AB +:10159000FF324FF0FF3301212846CDF800A0CDE9FE +:1015A0000689CDE90267FFF7A3FF04460028CAD1E8 +:1015B0002846FFF72DFF0028C3D14FF0FF324FF030 +:1015C000FF33D5F8E8100494CDF800A0CDE90689E2 +:1015D000CDE90267CBE7F0B5012289B000230026F0 +:1015E00000270C46049105210546CDE9062300237A +:1015F0004FF0FF3200934FF0FF33CDE90267FFF762 +:1016000077FF98B9D5F8E430013B0FD00134009052 +:101610004FF0FF32D5F8EC100494CDE90630CDE957 +:1016200002674FF0FF332846FFF762FF09B0F0BDB5 +:10163000F0B500F1BC07044689B03846FCF70EFE51 +:1016400094F804522DB93846C4F80052FDF766FEEE +:1016500009E0D4F80062013EC4F8006236B100250A +:101660003846FDF75BFE284609B0F0BD0022002396 +:101670000421204604960096CDE90623CDE90223F5 +:101680004FF0FF334FF0FF32FFF732FF002884F8AE +:10169000046238460CBF00256FF47A65FDF73EFE04 +:1016A000D4F8B430002BDED11048B4F9B840FEF7BE +:1016B000B5FAFCF7D3FD0E4B1B6803F114011A4673 +:1016C0000233B2F90000A0420CD14FF6FF73138031 +:1016D000084A1368002B01DD013B13600348FEF745 +:1016E0009DFAB3E78B42EAD1F8E700BF300F002440 +:1016F000580F00245C0F002408B50448FFF710F8C9 +:101700000348FFF795FF002008BD00BFA02D00246F +:10171000601000242DE9F04700F1BC0788B00446B2 +:101720001546109E384605938946FCF797FD2A46D4 +:10173000059B2046D4F8E0A00796FFF7A4FEA0BBC7 +:1017400094F8FD3104F1040894F8F921039340461C +:1017500094F8FE31029394F8FB31CDE9002394F81C +:10176000FA3194F8F811FEF7EBFB0646E8B994F865 +:10177000FB0107AB5146B0FA80F04009CDE9009378 +:1017800042422B464046F1F7B9FB05463246314608 +:101790004046CDE90266CDE9006694F8FA31FEF7DD +:1017A000CFFB45EA000464B20CB16FF47A643846AA +:1017B000FDF7B4FD204608B0BDE8F087B0F1104F4A +:1017C00013B50C4608D24B1E024490420CD010F8C0 +:1017D000011B03F8011FF8E70023CDE9002300F106 +:1017E000E0420348FFF796FF204602B010BD00BF5D +:1017F000601000242DE9F04F92469B468DB00446C0 +:10180000D0E944239B4508BF924528D2D0F828C18F +:10181000BCF1000F23D0BCF1010F0CD000F5B47E59 +:101820000025AC451BDDFEE80201594508BF5045C7 +:1018300002D20135F5E70025611991F8541105919F +:1018400016991AEB010617994BEB0107BB4208BF2B +:10185000B24207D2614C20460DB0BDE8F08F4FF088 +:10186000FF35E9E7236852462046196B5B468847F7 +:1018700002460B465046594607F0DCFD1343E9D1BA +:1018800016F1FF3223682046196B47F1FF33884772 +:1018900002460B463046394607F0CCFD1343D9D1FA +:1018A00004F5E4730993DDE91623134300F09480F3 +:1018B000D4F81891B9F1FF3F59D11AF1FF334FF025 +:1018C00008074FF003060A934BF1FF330B9305F122 +:1018D000090304EBC3030893059B3B4224D0099BF7 +:1018E0004FF000095046594653F826301A4698469C +:1018F0004B4607F09FFD134316D1DDE916234B45F8 +:1019000008BF424510D30A9B13EB080306930B9BB9 +:1019100043EB09030793089BDDE90601D3E948235C +:101920008B4208BF824203D2013E4FEA5707D3D20F +:1019300004EB8606D6F8B891D6F8C86104F1BC0766 +:101940004FF000083846FCF789FC2046FFF760FDA1 +:1019500000283DD15B4652462046FFF794FD0346E2 +:1019600040B16FF47A643846FDF7D8FC73E74FF462 +:101970008056E3E7CDE90100009052464946201D1C +:10198000F1F754FB0028ECD11AEB060A169B4BEB3F +:10199000080B9B1B1693179B63EB08031793DDE95A +:1019A000162313430CD004EBC503D3E95A235B453C +:1019B00008BF52453FBF0135631993F85431059371 +:1019C0002046FFF7EDFC28B13846FDF7A7FC6AE793 +:1019D000034CC8E7034CC6E700243CE75BF0FFFF7D +:1019E0005CF0FFFF5DF0FFFFB0F1104F1FB5044644 +:1019F00010D300F1E04200230A480392FAF7EBFD0E +:101A0000039A0023CDE900010648FFF7F3FE80B2F8 +:101A100004B010BDF0F7EAFA214602460248FEF78C +:101A2000A3FBF4E760100024A02D00242DE9F04F63 +:101A30001F4600F1080304460E46154600F1BC0897 +:101A400000F104092DED028B08EE103A87B0DDE9B4 +:101A5000122313437CD0D4F8F0314FF0000B28460A +:101A600039469A461A4602935B4607F0E3FC129900 +:101A70005118009113994B410193DDE9000159453B +:101A80004FF0000B08BF504540462ABF029B129BF7 +:101A90009B1A0293029B9A46CDE904ABFCF7DEFB4E +:101AA0002046FFF7B5FC00284ED12A463B4620468B +:101AB000FFF7E9FC50B16FF47A644046FDF72EFC65 +:101AC000204607B0BDEC028BBDE8F08F94F898304B +:101AD000002BF0D0002EEED0049B002BEBD048461C +:101AE000FEF724FA4FF0FF332A4602214846FDF75D +:101AF0003DFB04AB324604F16C0118EE100AF1F71D +:101B000029FA03904846FEF707FA039B002BD2D12F +:101B1000DDE904239B4508BF9245CCD1029B15EB20 +:101B20000A0520461E44129B47EB0B07B3EB0A0342 +:101B30001293139B63EB0B031393FFF731FC28B154 +:101B40004046FDF7EBFB82E7024CB6E7024CB4E7F8 +:101B50000024B5E75CF0FFFF5DF0FFFFB1F1104F2F +:101B6000F0B506468BB00D4614461AD3002200236A +:101B70004B4801F1E045FAF72EFD0B4600210246E5 +:101B8000474899424FF00003314608BF944238BF9E +:101B900014462A46CDE90043FFF748FF80B20BB058 +:101BA000F0BD104605F084FA22463146074605F09E +:101BB000DFFA0C2005F07CFA3A4B00228460059392 +:101BC00006AE394B0492CDE9023002ABC0E9007594 +:101BD0000FCB364D86E80F00FCF7FAFC2B4653F886 +:101BE000184F6CB9EB69332B4FD92C6A343B04F195 +:101BF0003402EB6134232A6223600123A37108E0DD +:101C00002268332A3DD9E268002A37D01A60A368D7 +:101C10009360FCF7C9FC00224FF0FF3304F1240766 +:101C2000C4E9052396E80F0087E80F00204BE36125 +:101C3000FEF7DAFE1F4B0246214623626369034426 +:101C40001A486361FCF79DFD2A6BEFF3058313B916 +:101C5000FDF7F6FAE8B1D2B11378F32B17D102F100 +:101C60000C03012153E8004F44EA010043E800055A +:101C700005B1F7E71046FCF787FA08E0A2681A609A +:101C8000C7E704F10803A468ABE7FCF78DFC00206C +:101C900085E710460121DFF820C000DFF7E700BF2D +:101CA00060100024CBD80008FD0601084419002468 +:101CB000F3D80008EFD8000815D800082DE9F04F38 +:101CC000D0F8B4A005462DED028BB5B0BAF1000FE7 +:101CD0000CD0AE4AAE4BBAF1FF3F0CBF92469A46CB +:101CE000504635B0BDEC028BBDE8F08F00F1BC036F +:101CF000184608EE903AFCF7B1FA2B1D52465146B1 +:101D000008EE103A95F8FA3118EE100ACDE902AA59 +:101D1000CDE900AAFEF714F930B16FF47A6A18EE33 +:101D2000900AFDF7FBFADBE795F804320BB9C5F82A +:101D300000A2D5F800620136012EC5F80062EED18E +:101D40000023D5F8F44185F8FB3185F8FD3195F88D +:101D50009830002BE1D018EE100AFEF7E7F818EEE5 +:101D6000103A2146C5F89040181DF2F76BFB8046EB +:101D700018EE100AFEF7D0F8B8F1000FCDD12846C2 +:101D8000FFF70EFB002800F0D584824F032220AC21 +:101D90009F213B7828460494BB468DF88030002371 +:101DA000CDF80080ADF88180CDE906230022002324 +:101DB000CDE902234FF0FF324FF0FF33FFF798FBDE +:101DC0000028AAD19DF88030BF2B00F0B58000F22A +:101DD000A580012B00F0B6809D2B00F0B080002381 +:101DE00010AEDFF8B8812946304600270DF17009A2 +:101DF000C5E94233C5E94833CDE9208394E80C00B6 +:101E0000F0F7DEF84FF05A0C96E80F00082684E849 +:101E10000F000123002220462399CDF80C90B246F2 +:101E20000296CDE9003CCDE9046700238847B8421B +:101E3000CDF828806FDB04225749484607F0AEF8FA +:101E40008046002867D19DF87530012B63D19DF83D +:101E5000763032460B933B4637461E4601215A20C8 +:101E6000CDE90476CDE90010CDE902A920462399F9 +:101E7000CDE90C32884700284DDB9DF87230012BEC +:101E8000099348D11D99080EFF28DDE90C3212D1C3 +:101E90009DF87000812865D084286DD058B921F054 +:101EA0007F41C5F808119DF8731089005029A8BF1B +:101EB0005021C5F80C1108320B9808F1010143F1CB +:101EC000000340454CDC0A9B002714AE29462093B2 +:101ED0003046219794E80C00F0F772F80DF1700C81 +:101EE00096E80F008CE80F00D5F80C310822012687 +:101EF00060461F9903940096CDE904375A23CDE933 +:101F00000132D5F808213B468847824618B99DF929 +:101F10008730BB4246DADFF888A000E7C22B7FF4A7 +:101F20005EAF032385F8006185F8F000C5F8E43062 +:101F30001523C5F8EC3052E785F802014FE7C5F8E4 +:101F4000E4604CE79DF88130022B7FF448AF9DF8A8 +:101F50008230202B7FF443AF012385F801313EE727 +:101F600088467BE721F07F41C5F820119DF873106A +:101F70008900C5F824119EE721F07F41C5F8D811EA +:101F80009DF873108900C5F8DC1194E75AF0FFFF43 +:101F900059F0FFFFB8A401086EA40108A9FF0008CA +:101FA0005EF0FFFF219B0133DB08C5E94430D5F823 +:101FB0000C31282B89BF9DF8A8304FF480761B1177 +:101FC0009E409DF8BD3013F00802C5F8F0615AD06C +:101FD0000021002300204FF0FF32049300934FF0C4 +:101FE000FF33CDE90601CDE90201F0212846FFF7D4 +:101FF0007FFA00288FD12846FFF7D2F9064600283D +:1020000089D0D5F80C011C285FD9012305F5DC71B6 +:1020100005F5E47C4FF0FF3E9846227F41F804EB43 +:1020200008FA02F2012ACA600ED9677F41F8047CDF +:10203000D5F86071BA4200D30FB9C5F8602195F8A0 +:1020400054211A4385F854215B008C4504F10204A5 +:10205000DBB2E2D19DF882309F063DD59DF88930F4 +:10206000C5F8E0309DF8883003F01F025B119B003B +:1020700085F8FD2185F8FB31022385F8F93100262A +:1020800085F8FE3141E0DB067FF545AF00260027ED +:1020900004924FF0FF33009266214FF0FF32284642 +:1020A000CDE90667CDE90267FFF722FA00287FF441 +:1020B00032AF4FF0FF324FF0FF3399210490009080 +:1020C000CDE90667CDE9026790E79DF88130FF2BE7 +:1020D000C5F81831BED11EE7102866DD9DF89020A6 +:1020E000D40662D59DF89B30C5F8E0309DF89A3053 +:1020F00003F01F025B119B0085F8FD2185F8FB3181 +:10210000022385F8F93185F8FE3195F8003193B353 +:1021100000229BF8003018EE100A8DF8603011464E +:102120000223ADF86120CDE90222CDE90022FDF7BE +:1021300007FF00BB18A92846FFF74DFAD8B99DF84C +:102140006230284643F002038DF86230FFF760F9F1 +:1021500088B918A92846FFF7E8F9044658B928466F +:10216000FFF71EF938B118A92846ADF860408DF880 +:102170006240FFF730FA9BF8002000238DF83C20E6 +:102180008DF860209DF8BA20ADF83D30C2F3021200 +:10219000ADF86130013A042A00F2FE80DFE812F067 +:1021A000B60022012601B600B60058060ED59DF8ED +:1021B0008B30C5F8E0309DF88A3003F01F025B11C8 +:1021C00085F8FD2185F8FB31022358E79DF8902022 +:1021D000D1077DD59DF89730C5F8E0309DF8963051 +:1021E00003F01F025B115B0085F8FD2185F8FB31D0 +:1021F000012385F8F93185F8FE3195F8F030BBB14F +:10220000D5F80C313F2B13DD9DF8BF3013F04002A1 +:1022100000F05E8103234FF0000B85F8FA3195F84A +:10222000FA31032B00F0E281BBF1000F7FF473AEB3 +:102230002846FFF7B5F800283FF46DAE0A9B18AEAC +:102240004FF000090DF1800829462093CDF88490C5 +:1022500030461CAC98E80C00EFF7B2FED5F820B180 +:1022600096E80F0084E80F00BBF1000F04D0D5F80A +:102270002461002E40F0C8810123C5F82831D5E93A +:102280004432C5F82C3113F1FF3342F1FF32C5E976 +:102290005A32D24B28461B788DF880300023ADF897 +:1022A0008130FFF77DF800283FF435AE95F8024104 +:1022B000002C00F00982012C00F020822846FFF754 +:1022C0006FF800283FF427AE012385F8043226E595 +:1022D000DA0606D59DF88F30C5F8E0309DF88E30CF +:1022E0007EE7DB070ED59DF88D30C5F8E0309DF810 +:1022F0008C3003F01F025B1185F8FD2185F8FB315E +:10230000012378E70323C5F8E03076E70123C5F819 +:10231000F830C5F8FC30D5F8F8305F1C09D0D5F896 +:10232000FC104C1C05D034AA134401228A4003F847 +:10233000942C18A92846FFF74EF99DF862309DF8B5 +:102340003E202846BDF83C101343BDF860209DF8A0 +:102350003C700A4318A99DF83D40ADF860208DF807 +:102360006230FFF7E2F82846FFF71AF800283FF43A +:10237000D2AD002318A92846ADF860308DF8623040 +:10238000FFF729F99DF860301F409DF861301C402F +:1023900057EA04033FF4BFAD002E3FF42EAF9DF883 +:1023A000B9309DF8B8201B0103F0100343EA121363 +:1023B000082B66D037DC022B23DC002B3FF41DAF4B +:1023C0000021002300204FF0FF32049300934FF0D0 +:1023D000FF33CDE90601CDE9020138212846FFF798 +:1023E00087F80AE7C5F8F830062392E7C5F8F83011 +:1023F00007234FF03E0EC5F8FC303F23C5E93AE312 +:1024000089E7042B7FF4F9AE0021002300204FF070 +:10241000FF32049300934FF0FF33CDE90601CDE97D +:1024200002013521DAE7102B7FF4E7AE0126002701 +:1024300018AC4FF000084FF000094FF0000B4FF0C0 +:10244000FF324FF0FF33652128460494CDF800B0E9 +:10245000CDE90667CDE90289FFF74AF89DF86030BB +:102460004FF0FF32612103F07F030494CDF800B0F8 +:102470008DF860304FF0FF33CDE90667CDE9028972 +:10248000ACE70126002718AC4FF000084FF0000918 +:102490004FF0000B524A0023652128460494CDF8E2 +:1024A00000B0CDE90667CDE90289FFF721F89DF874 +:1024B00060304B4A712143F040030494CDF800B0E2 +:1024C0008DF860300023CDE90667CDE9028985E704 +:1024D000D80711D50020002104920092CDE9060111 +:1024E000CDE902014FF0FF324FF0FF33B72128460C +:1024F000FEF7FEFF60BB8DE613F002020DD028460A +:10250000FEF786FF002865D100220023049000908A +:10251000CDE90623CDE90223E4E713F0100139D019 +:102520000126002718AC4FF000084FF000098DF885 +:10253000602000924FF0FF334FF0FF32B521284664 +:102540000494CDE90667CDE90289FEF7D1FF10B109 +:10255000DFF890B063E69DF86030284643F0010351 +:102560008DF86030FEF754FF834698BB04904FF01F +:10257000FF324FF0FF33B12128460094CDE90689A0 +:10258000CDE90267FEF7B4FF0028E1D1032385F807 +:10259000FA3144E613F0080013D08023002204919E +:1025A00017218DF860300023CDE906230122002396 +:1025B000CDE9022318AB4FF0FF3200934FF0FF3309 +:1025C00095E713F0040B4FF00203E0D0C522C5F8E5 +:1025D000F42020E6DFF810B021E600BFB8A401081F +:1025E000030080005EF0FFFF5CF0FFFF002218EEAA +:1025F000100A1146CDE90222CDE90022FDF7A0FC28 +:1026000000283FF411AE86E4304604F051FD074641 +:1026100000283FF480AC5A23082103905A462046F4 +:10262000CDE9013101231F9900934B46CDE904699F +:10263000884700283DDB3E78D5F824C116F0020615 +:1026400094E80F0088E80F0040F0B98007EB0C0910 +:102650003C460834A1452CD30120002114F8063C47 +:1026600014F805BC54F8042CCDE904010FA9404628 +:10267000039103F00F019B09029114F8071C0093CA +:102680000023019123998847002812DB9DF83C30F4 +:10269000760014F8082C1BEA030FF6B2237818BF53 +:1026A00046F00106D20703F0020300F18A80002BF6 +:1026B000CFD04FF0FF347BE0099901334900042B60 +:1026C000C9B2099169D173E02846FEF7A1FE00283E +:1026D0007FF421AC0022002304909821009028462A +:1026E000CDE90623CDE902234FF0FF324FF0FF334F +:1026F000FEF7FEFE00283FF4E1AD0CE420A92846D9 +:10270000FEF769FF00287FF406ACD5F8F8307BB9F6 +:10271000D5F8FC309C4044F00304E4B29DF88030CE +:1027200020A928461C408DF88040FEF7FEFEE1E718 +:102730000324F3E7DFF8C4A0FFF7F1BA0CF10103BB +:102740000A2BC5F82831B4DC6FF4AA79043405F5F6 +:10275000967805F5AA7605F5B47E00210F22A9EB3F +:102760000509236814F8040B23F0FF0300F00F00A1 +:1027700003F58073024048F8043B013B06F8010B67 +:102780000B44D9171846EEE80201591C09EB060361 +:102790009C45E6DC0023C5F86031099911EA020482 +:1027A0008AD005EB83030024D3F8C831C5F8603123 +:1027B000384604F085FC01343FF4ADAB69E53C4696 +:1027C0004E46D5F824213A44217888077FF571AF29 +:1027D00004F108039A42FFF46CAF94F802C00CF1C4 +:1027E000020304EB83039A42FFF463AF6078B042C4 +:1027F000A4D0C9073FF55DAF1C46E5E75DF0FFFFDC +:1028000073B51F4C04F1560504F15A06B4F8541080 +:1028100028460191FAF7BBFA58B301993046FAF706 +:10282000C3FAE36D53F8200018B30378F13B082B8B +:10283000ECD801A252F823F05D2801080D28010808 +:10284000632801080D2801080D28010867280108E0 +:102850006B2801080D2801086F280108236E98478E +:10286000D4E7636EFBE7A36EF9E7E36EF7E7236F48 +:10287000F5E7002002B0BDE87040FAF795B900BF57 +:102880003C0100241F4B186870B53830EFF704FC8A +:1028900018B11D4B4FF080625A601C4CE368013345 +:1028A000E360FAF7DDF90020FAF77EF9236D03B152 +:1028B0009847226C2AB3A369E16B994203D0D96986 +:1028C000E36301B9DA61DA69BAB9267A022E18D15E +:1028D000656AB5B1E36B95F9202093F920309A42EF +:1028E0000FD12846FAF7EAF8E06BFAF755F96E705F +:1028F000236CE563A561EB6103E0013ADA61002A2C +:10290000E3D070BDF01C002400ED00E03C01002489 +:10291000024608B5EFF3058313B16FF0050008BD5B +:10292000FCF78EFC0028F8D11046DFF808C000DF65 +:10293000F5E700BFA9D2000870B51D4B0546044657 +:1029400045F8543B2846FBF789FC206C6669FCF788 +:1029500095FC0023636194F83D306BB9012384F842 +:102960003D304EB1EFF3058333B9FCF769FC18B97C +:102970003046DFF840C000DF2846FCF7CFFC94F873 +:102980003C302BB1A06A08B104F09AFB0023A3628B +:10299000606DFFF7BDFF226CEFF3058333B9FCF7E1 +:1029A0004FFC18B91046DFF810C000DF204670BD9C +:1029B000A49A010875D1000845D2000810B5044654 +:1029C000FFF7BAFF204604F07BFB204610BD000055 +:1029D000024608B5EFF305830BB1002008BDFCF7F4 +:1029E0002FFC0028F9D11046DFF804C000DFF5E71E +:1029F000E9D50008074B10B504460360FEF718FE42 +:102A0000D4F8BC00FFF784FF201DFDF73BFB2046F8 +:102A100010BD00BF2899010810B50446FFF7EAFF72 +:102A2000204604F04DFB204610BD00001FB5134B9F +:102A30006C460B250FCB84E80F0020461C24FFF7C3 +:102A4000C7FF0F4B18600F480F4B456003600F4BDB +:102A5000C4608360FFF7BCFF0D4B18600D480E4B40 +:102A6000C460C0E900350D4B8360FFF7B1FF0C4B2C +:102A7000186004F07BF9FCF7E1FB00BFBCA401087F +:102A8000A8350024E02D002483A40108F42D00249F +:102A9000F02D0024302D002490A40108442D0024A2 +:102AA000402D0024042301480B807047700200244D +:102AB000122301480B8070475C020024036818470A +:102AC00000F07B43B3F1005F0ED000F07743B3F129 +:102AD000405F09D000F07F40B0F1805F14BF4FF03D +:102AE000FF304FF001607047004870470000040855 +:102AF000BFF34F8F0549064BCA6802F4E0621343E7 +:102B0000CB60BFF34F8F00BFFDE700BF00ED00E0DB +:102B10000400FA0508B5D0F8B4325B689847002085 +:102B200008BD08B5D0F8B4320BB9022008BD1B6847 +:102B300098470028FAD0F8E7D0E90030184700009D +:102B40000A23038000487047E802002400207047F1 +:102B50000020704700207047002070470020704719 +:102B6000002070476F2303800048704778020024DC +:102B70000048704798AA0108D0E90931C26A006A82 +:102B8000424301FB0323A0FB010119447047D0E934 +:102B900006017047D0E904017047D0E9020170478F +:102BA00001682DE9F04717469846096B0646DDE9AE +:102BB000089A884702460B463846414606F03AFCDA +:102BC000134302D00020BDE8F08717EB09043368F7 +:102BD000304648EB0A0514F1FF32196B45F1FF331B +:102BE000884702460B462046294606F023FC13433D +:102BF000E8D1336830469B6B9847A94208BFA04292 +:102C00002CBF01200020DEE72DE9F0471E460368B7 +:102C1000154604469B6ADDE9087A984702460B464A +:102C20002846314606F006FC134302D00020BDE8DA +:102C3000F087236820469B6A984702460B46384631 +:102C4000514606F0F7FB1343F0D115EB0708236854 +:102C5000204646EB0A099B6B9847494508BF40450B +:102C60002CBF01200020E2E72DE9F0471E46036853 +:102C7000154604465B6ADDE9087A984702460B462A +:102C80002846314606F0D6FB134302D00020BDE8AB +:102C9000F087236820465B6A984702460B46384611 +:102CA000514606F0C7FB1343F0D115EB0708236824 +:102CB000204646EB0A099B6B9847494508BF4045AB +:102CC0002CBF01200020E2E74FF0FF30704703687F +:102CD000DB6A18470020704710B50224C0E90722BC +:102CE000C0F89442D0F8C002EFF711F9002010BDEF +:102CF00008B5002204231146C0F89432D0F8C0026F +:102D0000EFF705F9002008BD37B54B7804460D46AE +:102D1000092B45D8DFE813F0040120014400190114 +:102D2000440088000A004400EC00B90000234988F0 +:102D3000ADF806300B0A013B062B31D8DFE803F073 +:102D40000416233030515B00D0F8B0321B680DF10F +:102D50000601207C9847BDF80620002A5FD0EB884A +:102D6000002B53D12046FFF7C3FF5BE0027CD0F875 +:102D7000B43232B99B6A0DF10600984702234370C2 +:102D8000E9E7DB6AF7E7C9B2052921D8DFE801F0F6 +:102D9000030C1014181CD0F8B0325B68002BD6D18D +:102DA0002046EFF7A9F83DE0D0F8B0329B68F5E790 +:102DB000D0F8B032DB68F1E7D0F8B0321B69EDE74C +:102DC000D0F8B0325B69E9E7D0F8B0329B69E5E74B +:102DD000D0F8B4329B6B002BE2D00DF1060298477D +:102DE000B9E7037C002BDBD1D0F8B4320DF106003B +:102DF0005B6B9847AFE7037C002BD1D1D0F8B4329E +:102E00000DF106001B6B98470723B8E79A4201466D +:102E1000204628BF1A46ADF80620FFF75DFFEB8875 +:102E2000002B9FD003B030BD8B88002BB8D1C88851 +:102E30000028B5D14D887F2DB2D894F89C32032B51 +:102E4000AED0EAB2D4F8C03284F89E2293F8BC1314 +:102E5000012910D083F838201A68D2F8001821F41C +:102E6000FE61C2F80018D2F8001841EA0511C2F854 +:102E7000001883F8BC032046FFF73AFF1DB1022378 +:102E800084F89C32CEE70123FAE78978384D01298E +:102E9000297085D890F89C32022B08D0032B15D0CE +:102EA000EFF72AF829782046FFF734FEBAE7002921 +:102EB0003FF458AF01210323416080F89C32204643 +:102EC000FFF72FFE02287FF44DAF69E731B90223E7 +:102ED000416080F89C32FFF71DFE43E741680129FD +:102EE0003FF440AFC9B2FFF715FE29786160E6E70D +:102EF000CA88012A7FF454AF90F89C32022B0AD87A +:102F0000002B3FF44DAF0146002341F8083F204617 +:102F1000FFF7E2FE86E7032B7FF442AF011DF6E7E1 +:102F200090F89C32013B022B3FF63AAFCB88022B44 +:102F30007FF436AF0123C360D0F8A4320BB1032372 +:102F4000C360022204F10C01E1E74B88012B7FF4FE +:102F500069AFC4F8A43205E790F89C32013B022B1C +:102F60003FF61EAF4B88012B7FF45CAF0023F0E7E8 +:102F7000043A002438B5036804460025DB6C984702 +:102F8000104B03227C2083F830200F4A116821F077 +:102F9000030111605D631A6083F83050EFF7ACFAFB +:102FA0000A4A2046D2F8DC3023F40073C2F8DC3041 +:102FB000236884F8545084F880501B6D9847284645 +:102FC00038BD00BF94120024002402480044025877 +:102FD00038B5D0F8B432044601795B689847D4F824 +:102FE000C04294F8BC33012B21D02568012384F81A +:102FF000BC332846AB6823F00103AB60F0F70AFA54 +:103000004FF48463226813610A4B013B02D01169BB +:103010008906FAD4A36A012B06D1A369012B03D038 +:10302000AB6B23F48033AB63002384F8BC33002004 +:1030300038BD00BF410D030008B5FFF7C9FFFFF71A +:1030400057FD00002DE9F7430D7800230646D0F820 +:10305000B84215F06005ADF8063000F07C81202DF7 +:1030600040F08F8191F80180B8F1060F00F289815C +:10307000DFE818F0440107004300B4000B0122010F +:10308000270141F21803CA88E05C02B3022801D08C +:10309000052818D1498804F58053196041F20403CA +:1030A00041F21801E2500323635441F214016354C6 +:1030B0002146D6F8C002C6F89432C6E95722EEF788 +:1030C0003BFF002515E03046EEF716FFF9E705282F +:1030D00001D00228F7D14FF483720025E25241F269 +:1030E00011030622E55441F21203E55241F21403A2 +:1030F000E254284603B0BDE8F083CA8841F21800C4 +:10310000002A5FD0205C04F58053022801D00928F2 +:1031100052D14F8841F204091F6041F2180344F86C +:103120000920DFB9032A21464FF0030298BF4FF070 +:10313000090804F8038041F21103E75441F2120335 +:10314000E75241F2140304F803804FF40453238040 +:103150004123A3703046FFF7BFFDB2E7012F41F2D4 +:1031600011011BD009200025023FE05441F2120357 +:1031700065542146E55241F21403E05441F208033C +:10318000E058D6F8BC3200EB0730DB69984734F8DA +:10319000092001463046FFF79FFDAAE70F220025D0 +:1031A000E25441F212036554E55241F21403E25431 +:1031B0003046EEF7A1FE9CE7002541F20402A5503F +:1031C0001D60F5E7022341F211012354625441F2DC +:1031D0001201625241F21401635472E741F2180283 +:1031E00004F58055A35C1035032B04D0062B2DD09D +:1031F00006222946AEE741F2040341F21100E358EA +:10320000EBB1042341F21201A35400222254625272 +:1032100041F21402A35441F20803E05804F580532C +:103220001968D6F8BC3231B92278412A03D11B6A19 +:103230002A469847DCE71B6A2A460121F9E705215F +:10324000A154235441F21202A3520DE041F219039A +:10325000E35C012B0CD10721A15441F21102A354CC +:1032600041F212030022E25241F21403E154BFE79B +:10327000002BBDD1564991F826104907B8D5022137 +:10328000A15441F21102A354DCE741F2180341F2C8 +:103290001001E25C0A2A07D102220025E25441F221 +:1032A00014036550E25224E70A22E2540E236350CD +:1032B00041F21403E25204E704F58051012218316F +:1032C00048E741F21802A35C092B3FF6FAAE4FF42F +:1032D0001B75DD40ED4315F001057FF4F2AE0223CE +:1032E000A35441F21002A55041F21402A35204F576 +:1032F00080531D6041F20403E550FAE641F21800E4 +:10330000225C092A14D84FF41B73D340DB4313F01B +:1033100001030DD10222225441F21000235041F248 +:103320001400225204F58052136041F20402A350AB +:10333000274B93F8275015F0100508D03046454626 +:10334000FFF746FED6F8C002F3F702FBD1E6488845 +:10335000F3F74CFCCDE64F780B2F12D8DFE807F0DF +:1033600006111111111116111111232C90F89C3214 +:10337000032B06D102220DF106013D46FFF7ACFCFE +:10338000B7E630460225EEF7B7FDB2E64B881B12D2 +:10339000212B05D1CA880F49092A28BF0922F9E63D +:1033A00000221146F6E690F89C32032BE9D104F591 +:1033B000805101220C31EDE68B78022BE1D890F898 +:1033C0009C22032ADDD141F20C02A35091E600BFFA +:1033D000780200249C020024F0B541F21802D0F8D3 +:1033E000B84289B00746A35C042B65D104F580562A +:1033F00041F20403316800294FD12278AAB9E35879 +:10340000012B41D1002541F2040341F21802E5509D +:1034100003233560A35441F21102A55441F2120274 +:10342000A55241F21402A3542BE0212A10D1E358F3 +:10343000052B29D1E378A2781B0403EB02236278E1 +:103440001344227903EB026341F20802A350D9E747 +:10345000412A19D1E358052B16D1E378A0781B0433 +:1034600003EB002360780344207903EB006041F212 +:103470000803E050D7F8BC325B6998470028C1D0F8 +:103480000225284609B0F0BD002341F20402384667 +:10349000A3503360EEF730FDB4E70129B2D941F211 +:1034A00008020239A058D7F8BC2200EB01312046AF +:1034B0009569E258A847E1E7072B4FF0000313D1C5 +:1034C00041F219016354184991F8265041F2110153 +:1034D00015F004050AD00620A05441F212026354EC +:1034E000A35241F21402A0541D46CAE70823A35474 +:1034F00041F212026554A55241F21402A354D0F8CD +:10350000BC321B699847094B094A002109480792B8 +:1035100006950092CDE9043704ABCDE902010648D7 +:103520000ECBEEF721FDACE778020024393001081C +:10353000392B0108400D0300B00E002438B50446B5 +:1035400041F21C0003F0B4FDC4F8B802E0B102225D +:1035500041F2180300F580510C4DC25200230B605C +:1035600041F20401435041F20801455041F20C017F +:10357000435041F21001435041F21403C252D4F8B7 +:10358000BC32DB68984700B1022038BD0000040857 +:1035900070B504460D46164600211C2203F0F6FDC8 +:1035A000204632462946FBF7DDFB204670BD38B584 +:1035B000D0F8B832002541F21801044603F58052D4 +:1035C000156041F204029D5002225A5441F210014A +:1035D0005D5441F214015A54D0F8B80218B103F006 +:1035E0006FFDC4F8B852002038BD00002DE9F04F3F +:1035F0008BB0016806469346149F159C0097019472 +:10360000496C8847002800F0BF8033683046DB6C87 +:10361000984796F8803043B9336830465B4C1B6D51 +:10362000984720460BB0BDE8F08F594C94F83030E5 +:103630002546012B5FFA83FA1AD14FF0000958464C +:10364000D6E908234946CDE9023205F0F3FE039A94 +:103650008046029BB81A4946584405F0EBFE804567 +:103660000746C4F8349005D9636B43F00063636385 +:10367000484C80E0236D984203D9636B43F000739C +:10368000F5E70323D4F8009084F83030236C9A06D1 +:1036900009D4414BC9F83830636B43F080636363EE +:1036A00084F830A0E4E7D9F814309B0106D53A4BF2 +:1036B000C9F83830636B43F40063F0E7A36B012B68 +:1036C00004D0032B36D04FEA482847022024002399 +:1036D000CDF814804FF4807A4FF4805805A94846FD +:1036E000CDE9064ACDE90838EEF712FB41F28832FF +:1036F00021464846EFF71EFF48B12B68264A9A63D9 +:103700006B6B18430123686385F83030B0E72C6891 +:1037100005A905972127CDE908082046CDE9067AB5 +:10372000EEF7F6FA41F2883239462046EFF702FF0B +:103730000028E2D100234FF4807226272C6805A9C7 +:103740002046CDE90723CDE905374FF4805309938F +:10375000EEF7DEFA4FF2186239462046EFF7EAFE3E +:1037600028B12B680C4A9A636C6B2043CAE701238B +:10377000044685F83030EFF771FF0428FBD1336839 +:1037800030461B6D98474CE7044C4AE774ECFFFF4A +:10379000941200246EECFFFFFF0FE01F75ECFFFF9B +:1037A0002DE9F04F8BB00E460168054693469A46C8 +:1037B000DDE91478CDE90078096C8847002800F02D +:1037C000FE802B682846DB6C984795F8803043B91B +:1037D0002B6828467B4C1B6D984720460BB0BDE8F4 +:1037E000F08FAB6D784C0393D5E90889EEF7CEFEE8 +:1037F000074626B9636B43F00063636368E094F89F +:103800003030012B40F0D78042464B465146584657 +:1038100005F010FE824642464B46DDE9140105F0F4 +:1038200009FE226D0AEB000100238046914263638A +:1038300003D9636B43F00073DFE7D4F800B00322D1 +:103840004FEA482984F83020CBF82C30A36B012BA9 +:103850004FF0FF33CBF8243018BF4FEA4A2ACBF899 +:103860002890B8F1010FDBF82C3023F0FF0343F070 +:103870009003CBF82C30DBF80C3043F04003CBF84E +:103880000C3027D92023CDF814A04FF0190AE36299 +:103890004FF4807100235846CDF818A0CDE90713E6 +:1038A0004FF4805305A90993EEF732FA41F28832BA +:1038B00051465846EFF73EFE78B32368434A9A6371 +:1038C000636B18436063012384F830300023E362A4 +:1038D0003F4C67E01023CDF814A04FF0180AE362C4 +:1038E000D6E7436B5A040CD5B9F11F0F09D906F17D +:1038F000200356F8042BB342C0F88020F9D1A9F177 +:103900002009EEF743FE039BC01B834205D82368C2 +:103910002E4A9A63636B6363D5E72068436B13F4A5 +:103920008D7FDED0C36823F04003C360436BDB05AB +:1039300009D5B8F1010F06D9A36B032B03D0EFF71C +:103940000FFF0028B9D12268506B10F0080005D095 +:103950001E4B9363636B43F00803DCE7516B11F07C +:1039600002010AD0194B9363636B43F00203636354 +:10397000012384F83030E062AAE7536B13F01003A0 +:103980000AD0124B9363636B43F01003636301230C +:1039900084F83030E1629BE70E499163012284F89C +:1039A00030201C46EFF75AFE0428FBD12B6828462E +:1039B0001B6D984711E7636B43F000531DE7064CFE +:1039C0000BE700BF74ECFFFF94120024FF0FE01F11 +:1039D0006CECFFFF3A0F001875ECFFFF2DE9F04F7C +:1039E0008BB00E460168054693469A46DDE9147889 +:1039F000CDE90078C96B8847002800F00E812B685C +:103A00002846DB6C984795F8803043B92B682846E8 +:103A1000834C1B6D984720460BB0BDE8F08FAB6D13 +:103A2000804C0393D5E90889EEF7B0FD074626B927 +:103A3000636B43F00063636369E094F83030012BFB +:103A400040F0E78042464B465146584605F0F2FCAE +:103A5000824642464B46DDE9140105F0EBFC226D3F +:103A60000AEB0001002380469142636303D9636B34 +:103A700043F00073DFE7D4F800B003224FEA48298F +:103A800084F83020CBF82C30A36B012B4FF0FF33A0 +:103A9000CBF8243018BF4FEA4A2ACBF82890B8F167 +:103AA000010FDBF82C3023F0FF0343F09203CBF837 +:103AB0002C30DBF80C3043F04003CBF80C3028D925 +:103AC0000223CDF814A04FF0120AE3624FF4807184 +:103AD00000235846CDF818A0CDE907134FF48053C2 +:103AE00005A90993EEF714F941F288325146584678 +:103AF000EFF720FD00283ED023684B4A9A63636BA2 +:103B000018436063012384F830300023E362474C9C +:103B100076E00123CDF814A04FF0110AE362D5E757 +:103B2000436B1A0419D5B9F11F0F16D9331D06F1CD +:103B3000240122680433D2F88020100A03F8082CEC +:103B400003F8070C100C120E03F8060C03F8052CF2 +:103B50008B42EED12036A9F12009EEF717FD039B29 +:103B6000C01B834207D823682F4A9A63636B43F0D4 +:103B700000436363C6E72068436B13F4957FCFD09F +:103B8000C36823F04003C360436BDB0509D5B8F17C +:103B9000010F06D9A36B032B03D0EFF7E1FD00283B +:103BA000AAD12268506B10F0080005D01E4B936319 +:103BB000636B43F00803DCE7516B11F002010AD09C +:103BC000194B9363636B43F002036363012384F82F +:103BD0003030E0629BE7536B13F020030AD0124BA6 +:103BE0009363636B43F020036363012384F83030F5 +:103BF000E1628CE70E499163012284F830201C4673 +:103C0000EFF72CFD0428FBD12B6828461B6D984745 +:103C100001E7636B43F000530DE7064CFBE600BF82 +:103C200074ECFFFF94120024FF0FE01F6DECFFFF08 +:103C30003A0F001875ECFFFF03682DE9F04FDB6CBD +:103C40009FB0B84C05469847B74BB84E4FF48042EA +:103C500023600423E2604FF0010863610023B44F46 +:103C60004FF0030923610EA93846C4E90133D6F8A1 +:103C7000E02042F04002C6F8E020D6F8E0201093A1 +:103C800002F04002CDF844900792079A0822CDE94D +:103C90000E28F2F787FE4FF400230EA9A548BB615A +:103CA0000227D6F8DC3043F40073C6F8DC30D6F8CF +:103CB000DC3003F400730693069BD6F8E03043F043 +:103CC0000203C6F8E030D6F8E03003F002030593B3 +:103CD000059BD6F8E03043F00803C6F8E030D6F88C +:103CE000E030CDF8449003F008030493049B0923CB +:103CF00012934CF21803CDE90F780E93F2F752FEAF +:103D0000C0230EA98C480E930B231293F2F74AFEA0 +:103D100005217C20EEF70CF8884B4FF08052DA60DA +:103D20008DF80F809DF80F30012B5FFA83F812D0C9 +:103D30007C20EEF7E1FBD6F8DC30284623F4007354 +:103D4000C6F8DC302B6885F854701B6D98477C48AA +:103D50001FB0BDE8F08F94F8303003F0FF0203B9D4 +:103D60002276032384F83030EDF7FEFF70B901238B +:103D700084F830304FF0006363630123284685F8F0 +:103D800054302B681B6D98476E48E1E721686E4BF5 +:103D90004A686E4FB0FBF3F33A401A435B00B0FB46 +:103DA000F3F06B4B4A600A68B3FBF0F042F0030299 +:103DB00001300A60F2F71AFF002320680893EFF73A +:103DC000A7FC834688BB4FF4D5700822D4F8009036 +:103DD0000EA9604ECDE90E024FF480724846CDE93F +:103DE000102B4FF480521292EDF792FF32684FF48D +:103DF000FA51B2FBF1F141F288324A43013A0DD354 +:103E0000D9F8341011F0450FF8D08904F6D4D9F858 +:103E10003420520710D50422C9F838200022206827 +:103E2000E263EFF775FCF0B18346012284F830209D +:103E3000636B43EA0B039FE7D9F83420D30701D51E +:103E40000122E9E7D9F83420500602D54022C9F80A +:103E500038200122E26300212068EFF740FC28B1FE +:103E60004FF0805BE1E7E26B012AF4D04FF6FE7978 +:103E70000021CA4637E02068EFF731FC834600286E +:103E8000D3D1354B29212268CDE90E314FF4807111 +:103E90004FF4805301921293CDE910100EA91046F1 +:103EA000EDF736FF33684FF4FA51019AB3FBF1F1A5 +:103EB00041F288334B43013BD2D3516B11F0450F94 +:103EC000F9D08904F7D4536B5B0702D504239363BD +:103ED000C6E7224B93632368D3F814B0089A4FEADD +:103EE000DB7101320892089A4A4501D80029C2D0F4 +:103EF000089A524513D81BF0804F01D00123A363C9 +:103F0000D4F80090D9F80030980729D14FF080609C +:103F1000012384F83030636B184360632DE74FF062 +:103F2000807B82E794120024002402480044025857 +:103F30000018025800040258000C025800E100E08A +:103F400073ECFFFF74ECFFFF00350C00002CC0FF8A +:103F50001021010000000024000010C1C500200055 +:103F6000A36B032B69D0002302224FF4805A0EA9C1 +:103F70004846CDF848A0CDE90E324FF44072CDE965 +:103F80001023EDF7C5FE4846EFF7ACFA0028BFD185 +:103F9000D4F80090D9F81430E366D9F818302367C4 +:103FA000D9F81C306367D9F82030A367A36B032BC3 +:103FB00043D04FF4807303210E90CDE90F13CDE968 +:103FC000110A0EA94846EDF7A3FE33684FF4FA52E2 +:103FD000B3FBF2F241F288335343013BC0F01C8142 +:103FE000D9F8342012F0450FF7D09204F5D4D9F85F +:103FF00034305B0703D50420C9F8380088E7D9F8C6 +:10400000340010F0010003D00123C9F838307FE7F5 +:10401000D9F81030DBB2032B40F0FC80C94BC9F853 +:104020003830D9F8143013F4604240F0E680A16BC8 +:104030001B0C2668032940F0F280D4F800B0DBF8AE +:1040400018301B0D2364E36D9A0F8DF83820C3F3ED +:1040500083628DF83920C3F301628DF83A20C3F3EF +:1040600007428DF83B20C3F30722DBB28DF83C20DA +:104070008DF83D30236E1A0DADF83E20C3F3034298 +:104080008DF84020C3F3C0328DF84120C3F3803255 +:104090008DF84220C3F340328DF84320C3F3003241 +:1040A0008DF8442000228DF84520A26B002A40F0B4 +:1040B000D68040F6FC71626E01EA830343EA927394 +:1040C0001293C2F3C2638DF84C30C2F302638DF8D1 +:1040D0004D30C2F342538DF84E30C2F38243C2F3E7 +:1040E000C2328DF84F308DF85020129B9DF8502031 +:1040F000013302F00702023293409DF8402002F0A3 +:104100000F010122A3648A40E264520A53432365EB +:104110004FF4007363654FF0010A636E4FF48079CA +:104120004FF480565846C3F380320D968DF85120D7 +:10413000C3F3C61203F07F038DF852208DF853307D +:10414000A36EDA0FC3F300418DF85420C3F341721C +:104150008DF85520C3F382628DF85620C3F3835245 +:104160008DF85720C3F340528DF8582000228DF867 +:1041700059208DF85A10C3F3C0310C928DF85B10A2 +:10418000C3F380318DF85C10C3F340318DF85D10BE +:10419000C3F300318DF85E10C3F381218DF85F10F9 +:1041A000C3F30121C3F346038DF8601009A98DF80C +:1041B0006130636C8DF862A01B0409930723CDE97D +:1041C0000A39EDF7A5FD072341F288325846194612 +:1041D000EFF7B0F900287FF49BAE4FF40071206830 +:1041E000EFF7E8FA002859D02368574A9A63636BBF +:1041F0001843606384F830A0BFE55E0407D413F46D +:10420000004F0CBF4FF480304FF4805080E64FF4E5 +:1042100000507DE601207BE64FF0004078E66364C5 +:104220001B04092130460E934FF440731192CDE9DF +:104230000F134FF480530EA91293EDF769FD30462A +:10424000EFF750F900287FF463AE23685A69E265FE +:104250009A692266DA6962661B6AA366EDE6012A3C +:104260000FD11B04B4F8662003F47C13134312939C +:10427000129B01339B02A36423654FF40073E36434 +:1042800048E7314B4FF08050CBF83830636B43F048 +:1042900080536363012384F8303039E6EEF776F912 +:1042A0008246206843699B0100F1C3804021EFF7FB +:1042B00081FA58B1636B63632368234A9A63636B23 +:1042C00018430123606384F830309FE0616C2068FC +:1042D0000904EFF704FA0028ECD1D4F800B04FF04D +:1042E000FF330EA9CBF824304023CBF82830DBF87D +:1042F0002C3023F0FF0343F06303CBF82C300D2365 +:104300000E90CDE911065846CDE90F39EDF700FDC5 +:104310000D2341F2883258461946EFF70BF9002871 +:10432000C8D10EAE23685A6B12F4957F5A6B0DD02C +:1043300011077CD45A6B920777D45B6B9B0622D50E +:104340002020B9E7C5002000FF0FE01F100407D5AB +:1043500006F12002D3F8801046F8041B9642F9D1EA +:10436000EEF714F9A0EB0A000130DBD14FF000406A +:10437000A2E7D2F8803046F8043BEEF707F9A0EB4D +:104380000A000130F2D02268536B13F48053F0D14D +:10439000A84991630E99C1F381128DF82420C1F3CD +:1043A00040128DF825200A0A22F0FF0242EA11622B +:1043B00092B2ADF826200F9A12BA0A92109AD1B290 +:1043C0008DF82C10C2F307218DF82D10C2F3035184 +:1043D000120C8DF82E10119922F0FF02C8B2024380 +:1043E000ADF83020C1F385228DF83220C1F30122CF +:1043F0008DF83320C1F3031201F00F018DF8342042 +:104400009DF84B208DF835108DF836204FF4007153 +:1044100020681E46EFF7CEF970B12368864A9A638A +:104420006063012384F83030A7E4022044E70820C9 +:1044300042E74FF400603FE7002E7FF49EACA16B93 +:104440009DF8342001299DF83530D2B2DBB213D16A +:10445000134314BF4FF400734FF48073A365032319 +:10446000E668994284F8303002D0B6F5004F05D1A5 +:10447000636B43F080535CE0A665F0E7B6F5804FD0 +:1044800033D10023CDE90E3323685B69980126D42C +:104490000EA8EFF7A9F960B90F9B590322D5616CFB +:1044A00020680904EFF71BF918B902212068EFF71B +:1044B000FDF8636B18436063636B002B3BD023688C +:1044C0005D4A9A634FF400712068EFF773F9002892 +:1044D0006DD02368584A9A63636B1843A0E74FF482 +:1044E0000060E6E74FF08060E3E7FEB92368CDE9BE +:1044F0000E665B699A0113D40EA8EFF775F960B9DF +:104500000F9BDB030FD5616C20680904EFF7E7F818 +:1045100018B901462068EFF7C9F8616B0843CAE78C +:104520004FF40060F9E74FF08060F6E7636B43F00B +:1045300000636363C0E7EDF717FC98B33F4AB0FB35 +:10454000F2F9D4E904C3D4E9018E4B450CD2A16D34 +:10455000B1F5007F08D0B1F5807F19D19BB99042A9 +:1045600002D9374BB0FBF3F3216846EA08064FF057 +:1045700000084A6846EA0E06174046EA0C0637432A +:104580001F434F609EE75900B0FBF1F19142E7E70E +:104590002C4A1BB9904288BF4B46E5E75900B0FB57 +:1045A000F1F0F7E7636B43F0006363638AE701238D +:1045B00084F83030B8F1000F7FF4DFABEDF7E6FFA1 +:1045C0000646EFF74BF804282BD1E36B0026A06BCF +:1045D000012266636B63236CA16CAB63636C276D14 +:1045E000E66285F8546084F83020EB63E36C646D18 +:1045F000286329642871284685F880206B64AF649D +:10460000EC64C5E90A16C5E90236C5E90436C5E910 +:104610000636C5E908362B681B6D98473046FFF70C +:1046200097BBEDF7B3FF801B0130CAD14FF00043B9 +:104630006363F6E63A0F0018FF0FE01F80F0FA02FE +:1046400000E1F50540787D01064B10B50360044696 +:1046500090F880300BB1FEF78DFCE06DFEF758F955 +:10466000204610BD58AB010810B50446FFF7ECFF1B +:10467000204602F025FD204610BD5C30FAF74EBE04 +:104680005C30F9F7EBBD38B5D0F8C04201F00F054A +:1046900063689D4237D811F0800F4FF01C0234D070 +:1046A00002FB054302FB054101223C3381F83D201A +:1046B00001221D709A7094F8BC13914223D084F8A3 +:1046C000BC231A785B782068012B4FF020030CBFC5 +:1046D00000F5106100F5306113FB02131968002921 +:1046E00004DB1AB11A6822F080421A601A6842F498 +:1046F00000121A6025B904F57172217CEEF764FE90 +:10470000002384F8BC33002038BD02FB014302FBC8 +:104710000141002203F5FE7381F8FD21C8E770B561 +:10472000044616460D4651BBD0F89432032B1FD1D8 +:10473000D0E9581291420ED9891A8A42C0F8601104 +:10474000D0F8C00288BF8AB2314698BF92B2EDF766 +:10475000F3FB284670BDD0F8B4321B6923B190F842 +:104760009C22032A00D198472046FEF7C1FAF0E7C1 +:10477000052BEED1C4F89412FFF785FFE9E7D0F8D6 +:10478000B4329B6933B190F89C22032A02D10025F0 +:104790009847DEE70225DCE730B5013800252B46D7 +:1047A0000135445D002CFAD1DBB201335B0013808C +:1047B0000B7003234B70022310F8015F05B930BD65 +:1047C0005A1CCD540233D2B2DBB28C54F4E7000051 +:1047D000082908B50AD8D0F8BC32063953F82100A8 +:1047E00010B10349FFF7D8FF014800E0002008BDE1 +:1047F000FC3800240A460349034808B5FFF7CCFFFC +:10480000084608BDA81A00249FAA01080A460349C1 +:10481000034808B5FFF7C0FF084608BDA81A0024E2 +:10482000AAAA010838B5674C2068E56A436B1904E9 +:104830001FD52A071DD5A36A1F2B19D9616A0B1D25 +:1048400001F1240022680433D2F88020150A03F80D +:10485000082C03F8075C150C120E03F8065C03F82D +:10486000052C8342EED1A36A2031203B6162A36212 +:1048700038BD436BDB0535D54FF480738363C36B61 +:1048800023F4414323F03A03C363C36B23F0805303 +:10489000C363C36823F04003C36015F0080311D05D +:1048A00015F0220F05D0EEF75BFF10B1636B1843D4 +:1048B00060632368444A9A63012384F830300023FC +:1048C000E362D5E72906D3D515F0220F8362C362D0 +:1048D0000365F1D0EEF744FF0028EDD0636B184379 +:1048E0006063E9E7436B5A0411D52B070FD5226AA1 +:1048F0001F2ABDD9E36903F1200153F8045B8B4201 +:10490000C0F88050F9D1203AE3612262B0E7436BEE +:1049100013F03A0F436B4DD0990703D5636B43F007 +:1049200002036363436B1A0703D5636B43F0080309 +:104930006363436B9B0603D5636B43F020036363A0 +:10494000436BD90603D5636B43F0100363631E4BBF +:104950008363C36B23F49D73C363C36823F0400375 +:10496000C360C36A43F40053C362C36843F0800367 +:10497000C360EEF7F5FE636B15F0080140EA030033 +:1049800023686063DA6822F08002DA604FF4006224 +:104990009A6391D12A067FF56BAF626B002A3FF4D0 +:1049A00067AFDA6B22F08052DA631965012384F86D +:1049B00030305DE7DB007FF55BAF4FF08053836302 +:1049C000036D55E7941200243A0F00182DE9804832 +:1049D000ADF5217D1C220021D84D04AF07F1D80090 +:1049E00002F0D4FB882107F1D800A7F8E810EEF711 +:1049F0007DFB002107F1D800EEF79CFB0221B7F9FF +:104A0000E800EDF775FCCE48CE4A0368CE4943F482 +:104A1000807311600360CD48D1F850800478BFF3F3 +:104A20005B8FBA6014F0010430D1FAF717FD68B358 +:104A3000C74BD3F8D020560000F15D82D3F8D020C8 +:104A4000002AC0F25882D3F8D020D00000F155825D +:104A5000D3F8D020510100F15082D3F8D020D201F8 +:104A600000F14D82D3F8D02016020BD4D3F8D02019 +:104A7000900200F14682D3F8D03013F4800F0CBFBF +:104A80000B240124B1482C70FAF7E0FCB14C2378D8 +:104A9000BFF35B8FD9070BD42046FAF7DFFC38B1A0 +:104AA000AB4B2046D3F8D020AB4B1A60FAF7CEFCC4 +:104AB000A74AD2F8D03043F48033C2F8D0302B78F4 +:104AC000012B08D1BB684DF659724FF4FA701B6880 +:104AD0001A65F2F78BF80022942107F1BC00FEF76B +:104AE00057FD1C22002107F1A00002F04FFB07F147 +:104AF000A000002301229621FAF71EF907F1A00079 +:104B0000FAF771FB40B107F1A000FAF78DFB012124 +:104B100007F1A000FAF770FB0022922107F1840050 +:104B200007F5B675FEF734FD0022932107F1680002 +:104B3000FEF72EFD1C22002107F14C0002F026FB9F +:104B4000A621002207F14C00FAF70CF98348F9F787 +:104B50006FFE0024F9F73CFD814B824A4FF0240B95 +:104B60001A60F9F721FD01229F2107F13000FEF7BD +:104B70000FFDF2F715F87C4BA42221462B6007F5B8 +:104B8000CE707A4B2C616B61AD61AC85C5E9074491 +:104B9000C5E9094402F0FAFA754BC5E9353407F561 +:104BA0001273BBF1010B03F8014BFAD12846FBF756 +:104BB000D2FA704B1C225946C5F8003107F1F400B7 +:104BC00002F0E4FA01235A46172107F1F400FAF73C +:104BD000B3F81C22594607F5887002F0D7FA07F59A +:104BE000887001235A461621FAF7A6F807F588704F +:104BF000FAF7F9FA00286ED007F1F400FAF7F3FAA1 +:104C0000012868D0F9F7E4FC0A245946B7F92001D5 +:104C1000EDF76EFBF9F7C8FC07F58870FAF704FBAF +:104C2000F9F7D6FC0021B7F92001EDF761FBF9F7A0 +:104C3000BBFC002107F58870FAF7DEFA0520EDF7D6 +:104C400049FBF9F7C5FC0121B7F92001EDF750FB4D +:104C5000F9F7AAFC012107F58870FAF7CDFA0520CB +:104C6000EDF738FB013CDBD107F1F400FAF7DCFA91 +:104C7000214607F1F400FAF7BFFA0520EDF72AFB09 +:104C8000012107F58870FAF7B7FA0520EDF722FB46 +:104C9000012107F1F400FAF7AFFA0520EDF71AFB4E +:104CA000F9F796FC214607F1F400EEF743FAF9F71D +:104CB0007BFCF9F78DFC07F588702146EEF73AFA90 +:104CC000F9F772FC07F58870FAF78DFA18B107F159 +:104CD000F400FAF788FAB5F90091B5F902612649AE +:104CE0004846F9F7C1FE044624493046F9F7BCFEB0 +:104CF0000146204607F58874F9F7CCFE1E49F86096 +:104D00004846F9F7A5FE1D4982463046F9F7A0FE50 +:104D1000FB68A4220021206107F5CE702360A4F86F +:104D20000490C4F808A0A68102F030FA214607F5E5 +:104D3000CE70EFF745FF284622E000BFFB39002484 +:104D4000004802580C36002400400058F438002473 +:104D500000440258F8380024FC390024649B010800 +:104D6000E00F002481C70008ACA90108A7C900080A +:104D7000A0860100170016005C980108C097010882 +:104D8000FBF7E1F94F2307F1100128463B82F0F7CA +:104D90006FFA4FF4756307F1100128463B82F0F774 +:104DA00067FA40F24C5307F1100128463B82F0F7B6 +:104DB0005FFA40F24D3307F1100128463B82F0F7CD +:104DC00057FA40F6521307F1100128463B82F0F7DC +:104DD0004FFA40F6537307F1100128463B82F0F773 +:104DE00047FA0A20F1F702FF48F29C0307F110018D +:104DF00028463B82F0F73CFA42F29E0307F110018D +:104E000028463B82F0F734FA0A20F1F7EFFE40F231 +:104E1000422307F1100128463B82F0F729FA0A20C5 +:104E2000F1F7E4FE4AF2940307F1100128463B82B1 +:104E3000F0F71EFA40F63B7307F1100128463B825B +:104E4000F0F716FA40F6357307F1100128463B8259 +:104E5000F0F70EFA0A20F1F7C9FE012107F1BC00B4 +:104E6000FAF7CAF90A20F1F7C1FE002107F1BC00E8 +:104E7000FAF7C2F90A20F1F7B9FE012107F1BC00E7 +:104E8000FAF7BAF90A20F1F7B1FE40F2AA73984591 +:104E900040F07F81BB68AE481B68AE4DD3F854909C +:104EA0009A6D5FFA89F6DB6DFA607B60FBF77CFC3C +:104EB00016F0020F3ED016F06003DFF8C4A222D035 +:104EC0002820F9F75BFAFB68C0F800A003F1006244 +:104ED000C3F500110023C0E90423013280F820301B +:104EE0004362C0E90133C0E9061300D009BB0021C9 +:104EF0009948ECF7DDFF0624C4E50424C2E5032449 +:104F0000C0E50224BEE528203B60F9F737FA4FF0F0 +:104F1000006100223B68C0F800A080F820304362A6 +:104F2000C0E904124FF400110022C0E90133C0E9C6 +:104F300006122860720744BF884B2B6033071DD5CB +:104F40008820F9F71BFA864B4FF400728246036003 +:104F500000235C3040E9152340E9132340E9112385 +:104F600040E90F230023002240E90D23ECF7B0FFB6 +:104F70004FF47A73C5F800A0CAF8583019F0800FC2 +:104F800015D02820D5F80090F9F7F8F9754B0022D4 +:104F90002860C0E900390023C0E90223C0E90423E6 +:104FA0000023FA6803764276C36180F8203016F059 +:104FB000400FDFF8D0A12BD0C820F9F7DFF96A4BFA +:104FC00081466A4940F8043BEDF742F8684B4422B9 +:104FD0000021C9F80030803309F11400C9F8043009 +:104FE00002F0D4F83822002109F1580002F0CEF87E +:104FF00040230020C9F89830C9E924034FF4007316 +:1050000009F1A400C9E92733ECF762FFCAF8009060 +:10501000B10618D55C20F9F7B1F9534B0646534950 +:1050200040F8043BEDF714F8524B40220021336066 +:10503000903306F11400736002F0A8F84FF0FF33CC +:10504000CAF80060B365DAF800002968002800F0AB +:10505000248503685B6A98470646002840F0198556 +:105060004549464801F0A2FC8146002800F08C80AA +:1050700003460422012107F1F40001F013FD32463A +:105080003146484601F01EFDD7F8F400FDF718FD43 +:10509000421C05467AD0394907F12800FAF704FE88 +:1050A00007F12800F9F7BAFB804600283DD101F04E +:1050B00079FA1323C7F80C8003602846244EECF7D6 +:1050C00095FFB0F5804F28BF4FF48040804601F037 +:1050D000EFFF8246FB689B4580F047854B46424682 +:1050E0000121504601F0DEFC05EB0B0128467960FA +:1050F000ECF77CFF79680246B1FBF0F300FB131379 +:105100003BB93046FBF730F842F21070EDF7E2F8A9 +:1051100079680A46434651463046FBF78DF94FF40D +:105120007A70C344EDF7D6F8D4E703682246B96A2B +:105130009B699847B0F1000806DA01F033FAC8F12C +:105140000003FE600360B8E72369FB60B5E700BFBA +:10515000A02D0024003A00240101FF8060100024EB +:1051600058AB0108B4AB01089C9E0108969B01084E +:10517000C89E0108C09D0108BEAA0108C1AA010875 +:105180004CA901080C3A00246FF00205BB681B68AB +:105190001D65CA4B1A6802F07F42B2F1005F11D060 +:1051A0001A6802F07F42B2F1105F0BD01A6802F069 +:1051B0007F42B2F1405F05D01B6803F07F43B3F13B +:1051C000605F66D14DF65973984562D040F2AA737C +:1051D00098455ED0BB6800251B681D65F1F7C8FCCB +:1051E00072B6B74B2946DFF824E31D604FF0E02389 +:1051F0005B6803F00F035E1C2B464FF0FF359C46A7 +:105200008A0002F1604202F56142C2F88050C2F8A1 +:1052100080510022D01801327044082A80F800C35F +:10522000F8D1013108338E42EADCA64B4FF0206200 +:105230005A60A2F1FE729A6040F2FA52DA600022DD +:10524000C3F810C01146981801320C2A0176FAD121 +:105250004FF0FF3259629A629B4ADA621F221A6348 +:10526000BFF35F8F994B5960BFF34F8FBFF36F8FC1 +:105270009249974B08681D68002282F3148885467E +:1052800082F3108828470A6882F3088801201B6887 +:1052900098470020F1F7B6FCEDF774FF8D48FBF757 +:1052A00083FA8D48FCF70AFD18238C4A30218C487C +:1052B000F9F72EF88B4AD2F8B432FA6013B1002312 +:1052C000C2F8B432884BFA68884DC2F8B032012275 +:1052D000FB68F96883F89C22002385480B7006213F +:1052E0002B632B61EB60EB62C5E90833C5E906234C +:1052F000FB68C5F80434C3F8C05295F8BD33C5E95E +:10530000000103F0FF08002B40F0AA80794E4FF017 +:10531000020A85F8BC834FF00A09D6F8E03021462E +:1053200075481343C6F8E030D6F8E0301340C7F8AC +:10533000F430D7F8F430D6F8E03043F00203C6F882 +:10534000E030D6F8E03003F00203BB62BB6AD6F867 +:10535000E03043F00403C6F8E030D6F8E03003F064 +:1053600004037B627B6AD6F8E03043F08003C6F822 +:10537000E030D6F8E03003F080033B623B6AD6F8B9 +:10538000E03043F48073C6F8E030D6F8E030C4F87B +:10539000088003F48073FB61FB692023C4E9003AB1 +:1053A0000323C4E90339F1F7FDFA08210323524826 +:1053B000C4F80880C4E9001A2146C4E90339F1F7AA +:1053C000F1FA43F6234321464C48C4F80880C4F858 +:1053D0001090C4E9003AF1F7E5FA01222146484865 +:1053E000C4F80880C4F81090C4E9002AF1F7DAFA8A +:1053F000102321464348C4F80880C4F81090C4E93B +:10540000003AF1F7CFFA4FF4006321463E48C4F862 +:105410000880C4F81090C4E9003AF1F7C3FAD6F84E +:10542000D83001224D2043F080631146C6F8D830B1 +:10543000D6F8D83003F08063BB61BB69D6F8D830AA +:1054400043F00073C6F8D830D6F8D83003F00073B4 +:105450007B617B69ECF76CFC2C4B4FF4005199603D +:1054600003232E6885F8BD33214BDB6B13F4807367 +:1054700008BF2B61B368D5F8108023F00103B36037 +:10548000AB69012B40F09383B36B696B23F48033DA +:105490000129B363F36823F4840323F04003F3602A +:1054A000F36823F44013F36003D1F36843F48013EB +:1054B000F3603046EDF770FF044629E00000040871 +:1054C00010E000E000ED00E0020000C090ED00E020 +:1054D00004000408A02D002460100024D0AA0108B4 +:1054E000DC35002430360024E0010024103A00248A +:1054F0000000044000440258000002580004025812 +:1055000000080258001C02580020025800E100E088 +:10551000B8F1010F10D1F36D9BB2F365F36D43F059 +:105520007B7343F40033F365B36843F00603B36061 +:10553000B36843F02003B360002C00F065830223BE +:1055400085F8BD332B684FF40071FA685962596AC7 +:10555000D2F8C00241F000719962B54BC2F8B43282 +:10556000B44BC2F8BC32F1F7F3F94D20ECF7C4FFAD +:105570006520ECF7C1FFB04B5A699B691A4200F0F5 +:105580002F82AE4E3468B246636913F001033B606C +:1055900040F026826269A3691A4200F021826369A1 +:1055A000A26913409A0703D5636903F0020363619C +:1055B0006369A2691340DB062BD5A36923F01003AE +:1055C000A361D4F82080C8F3434308F00F05022BF1 +:1055D00040F03E8447F6F07318EA030F14D01C2302 +:1055E000C8F30A19204603FB05A54A46D5F8081258 +:1055F000EDF71EFFD5F808324B44C5F80832D5F850 +:1056000014324B44C5F814323268936943F01003E6 +:10561000936133685A6999690A40150300F12A8435 +:10562000864E3368B2465A6999690A4012F4802F4F +:1056300011D0D3F8182803F50063B046DB69134096 +:105640009BB27B6004F51063BB600023FB607B684A +:10565000002B40F029863068426983691A4210D5D0 +:10566000D4F8043823F00103C4F8043896F8F4336E +:10567000012B04BF002386F8F433436903F0004391 +:105680004361436982691340190510D5D4F808387D +:10569000DA0708D5D6F8043493F89C2283F89D22C3 +:1056A000042283F89C22436903F400634361436945 +:1056B000826913401B0111D5436903F00063436104 +:1056C0005E4B93F8F423002A40F01687012283F8FA +:1056D000F423426DC2F38302C3F8F823436982695D +:1056E0001340DD043ED5D4F8042804F5006322F00D +:1056F00001025A604FF484620261514A013A02D0B9 +:1057000001698906FAD404F51062DFF830E14FF63A +:105710007F3CDEF804100D463968A942C0F0F786D8 +:10572000DA6942F00112DA61DEF83020002A00F076 +:105730001087D3F8842042F00B02C3F884205A6CFF +:1057400042F00B025A64D4F800383E4A23F4FE6358 +:10575000317CC4F80038EDF737FE3268536903F442 +:105760008053536134686369A26913409B0440F11C +:10577000EF80D4F8003923F4FF6323F00703C4F863 +:105780000039D4F8042842F48072C4F80428D4F80C +:10579000082812F0060304D012F0020F14BF0223EF +:1057A0000F23F360EEF732FEF268D3B2022B40F023 +:1057B000EE86254B254903448B4240F2D686244B86 +:1057C000244903448B4240F2D386A0F57403224956 +:1057D000A3F510538B4240F2CE86A0F183731F498C +:1057E000A3F5E7438B42C0F0C9861D4B1D49034416 +:1057F0008B4240F2C6861C4B1C4903448B42C0F0CE +:10580000C3861B4B1B4903448B42C0F0C086A0F1EA +:10581000B7731949A3F558538B42C0F0BB86174B99 +:10582000174903448B4234BF072306232AE000BFF5 +:10583000FC0100243802002400000440103A002437 +:10584000410D0300D43D0024405327FFFF340C00DA +:10585000401E1BFF3F420F007F4F120020D6130057 +:1058600060B6E5FE5FE3160000D3CEFE40771B0076 +:10587000C05BB3FEC091210020753800E05459FE92 +:10588000E09C4100E168B2F100084FF0000921F40A +:10589000705118BF4FF00108E160E16841EA8323CD +:1058A000E3604023D6F80444D4F8C052C5F804326B +:1058B00005F5FE7195F8BC33A5F8FC91012B85F830 +:1058C000FF9107D00123286885F8BC33EDF7D3FD9D +:1058D00085F8BC93D4F8C092402201230025C4F877 +:1058E00064214FF48070C4F8583109F13C01C9F8C3 +:1058F000442099F8BC23A9F83C009A4289F83F500B +:10590000A9F8425007D0D9F8000089F8BC33EDF768 +:10591000B2FD89F8BC53012300214022A36184F821 +:105920009C32D4F8B8326262C4F894126160C4F850 +:10593000A41223B1D4F8B43220465B689847D6F855 +:105940000434326883F81080536903F400535361C0 +:1059500032685369926913401D070FD5D6F80404C5 +:1059600090F89C32032B04D1D0F8B432DB6903B138 +:1059700098473268536903F00803536133685A69E2 +:1059800099690A40D40203D55A6902F480125A6117 +:105990005A6999690A40900203D55A6902F40012C3 +:1059A0005A615A6999690A40510003D55A6902F04F +:1059B00080425A615A6999690A40520710D55C6859 +:1059C000630709D5D6F80404012380F89C32D0F887 +:1059D000B43201795B68984733685A6814435C6055 +:1059E0007D4A1368591C1160282293FBF2F402FBD4 +:1059F0001434002C7FF4BFADECF7C8FDB0F5FA7F8E +:105A00000BD9764B1A7842B1754A4DF65971126826 +:105A1000106D884201D114651C70724D724C2B7848 +:105A20008BB9724B07F14C001B78227842FA83F352 +:105A3000DBB22370F9F7D7FBB0FA80F107F14C0025 +:105A40004909F9F7D9FB2B780133DBB22B702378A6 +:105A5000FA2B02D82378092B0AD8644A13785B42C0 +:105A60005BB213701378227842FA83F3DBB22370AF +:105A70002A7823789A427FF47EAD07F14C00F9F73B +:105A8000B2FBB0FA80F107F14C004909F9F7B4FB19 +:105A900071E56FF00105FFF779BB002965D00B6850 +:105AA0000846E9469B689847064600287BD1286847 +:105AB00003689B6A9847102802462868B8BF1022DE +:105AC00001689300073323F00703ADEB030DD317F1 +:105AD0000DF1100ACDE90023FA6833464D695146AD +:105AE000A847DAF80000FCF7EBFF431C054657D047 +:105AF000ECF77CFAB0F5804F28BF4FF48040804629 +:105B000001F0D6FA82463E607B689B452CD2384B2A +:105B1000514618680368CDF800803A6801925E69C2 +:105B2000FB680BEB03020023B04705EB0B0628468E +:105B3000ECF75CFA0246B6FBF0F300FB13633BB9EB +:105B400031462C48FAF710FB42F21070ECF7C2FB1A +:105B50004346324651462748FAF76EFC4FF47A70B6 +:105B6000C344ECF7B7FBCFE7CD4622480025FAF750 +:105B7000D7FD214B214AE360214B224823600023BB +:105B8000C7E94555CDE90223E368009394E80E0088 +:105B9000ECF7EAF9BB681B681D65F0F7E9FFFEE763 +:105BA000CD46FFF7F3BA6FF00305FFF7EFBAF368DE +:105BB0003046D5F8289043F04003F360EDF7ECFB56 +:105BC000B36B0446B9F1000F03D143F48033B363E0 +:105BD0009EE423F48033FAE7083A00247402002498 +:105BE0000C360024183E0024F3020024F2020024A4 +:105BF000003A0024A02D0024BD2A0108400D030016 +:105C0000F12A0108F00E00242B6832204FF0010821 +:105C10002646D96821F0C041D960D96841F0804159 +:105C2000D960F0F7E3FFD5F804C023464FF01C0E0F +:105C3000D8B2591C6045C0F0B28000234FF01C0E52 +:105C40001846DEB201336645C0F0B88000212B68EB +:105C5000D5E903E20E467A60D5E906823A60EA6A3F +:105C6000BA6001F14000013103EB80000F2946606A +:105C7000F7D1BA6803F50066002A40F0AC8071687D +:105C800041F002017160996B21F400119963196868 +:105C900041F040011960196841F08001196000214C +:105CA000B8F1010FC3F8001ED3F80018C3F80018AC +:105CB000D3F8001840F09780BEF1000F40F09080BC +:105CC000C3F800184FF4846119618949013900F063 +:105CD0008D8018698206F9D410211961844901392F +:105CE00000F086801869C006F9D4002103F5106021 +:105CF0004FF000684FF67F398E4631617161F16176 +:105D00008C4577D103F530604FF0000C4FF0904E8A +:105D10004FF000684FF67F39594540F08180316976 +:105D20007A6821F480713161002199616FF08041BE +:105D300059611AB9996941F01001996198696D49E1 +:105D40003A68014399611AB1996941F00801996172 +:105D5000BA68012A05D1996941F0804141F00401F6 +:105D60009961002C7FF4EBAB012185F8384085F870 +:105D7000BD13696A01290DD185F8F443C5F8FC13F8 +:105D8000996941F000619961596D41F0805141F08C +:105D9000030159651846EDF73DFBFFF7D3BB0EFB3A +:105DA000005383F83D8083F83C00A3F8420083F859 +:105DB0003F601E65C3E911660B4639E70EFB0651CD +:105DC00081F8FD0181F8FC6181F8FF01C1F8100242 +:105DD000C1E9810035E7996B41F4001199635EE7F1 +:105DE00041F001016CE741F0030169E7012473E729 +:105DF00001247AE7D0F800A0BAF1000F0DDA41B91A +:105E0000C0F80080C0F810E00131C0F808902030E0 +:105E100076E74FF090420260F4E7C0F800E0F1E767 +:105E2000D0F800A0BAF1000F0FDABBF1000F09D1D2 +:105E3000C0F80080C0F810C00BF1010BC0F808904A +:105E4000203069E7C0F800E0F4E7C0F800C0F1E7EF +:105E5000062B7FF4D9AB082227492046EDF7E8FA54 +:105E60001C2303FB05A5C8F30A13D5F81422134419 +:105E7000FFF7C8BBD3F8182803F5006304F53068B2 +:105E8000DFF878A0DB69002613401B0CFB60FB6881 +:105E9000002B3FF4C5ABFB68D80740F1BA80174D23 +:105EA0005FFA86FB286800F5306C0CEB4B139A68A0 +:105EB000D0F8143802EA03092B4619F0010F27D055 +:105EC000296901220CEB461C0129C8F80820D0F8EA +:105ED00040E0DCF8082040F0C780110712D5084BDD +:105EE0009E4515D9100413D54FF400430EE000BFB2 +:105EF000410D030000383C80D43D0024103A0024BA +:105F00000A30544F910640F18D802023CCF80830A0 +:105F100019F0080F6AD02B680822C8F808201A6CFC +:105F200003F53063BA6003EB4613B9689A68084614 +:105F3000C849884204D9150402D54FF400429A603A +:105F4000C548D0F8045490F8C43305F52A7185F893 +:105F5000A83290F8C5E385F8A9E290F8C72390F835 +:105F6000C6C30CEB022C1FFA8CFCA5F8AAC290F851 +:105F7000C9B390F8C82302EB0B2292B2A5F8AC2269 +:105F800090F8CBB390F8CA0300EB0B204FF0010B55 +:105F900080B2C5E9A5B003F01F0BA5F8AE02BBF1B6 +:105FA000010F7ED0BBF1020F00F09A80BBF1000F11 +:105FB00040F0778103F06003202B00F0C180402B7C +:105FC00000F0BE80002B40F0C7802846FCF79CFE06 +:105FD000BB681A469F4B9A4208D99F4B1969012901 +:105FE00004D103F571721868EDF7EEF919F0100F8E +:105FF00002D01023C8F8083019F0200F02D0202357 +:10600000C8F8083019F4005F03D04FF40053C8F803 +:106010000830FB68013608F120080AF11C0A5B0809 +:10602000FB6034E712F0280F7FF472AF89498E4588 +:1060300002D912043FF558AFDCF81020DAF8041248 +:10604000C2F312028A1ACAF81422DAF8082211449A +:10605000D5F810223243CAF8081210D17F4A012124 +:10606000EDF7B2F97C4B0AE07D498E4512D111045F +:106070003FF53AAF920602D52022CCF808201C2228 +:106080005946D5F8040402FB0B33D3F80822FEF777 +:1060900046FB3DE7D5F810123143F0D105F571729A +:1060A000DEE703F06000402801D0580654D495F88C +:1060B0009C32013B022B4FD8D2B2022A4CD8D5F8E1 +:1060C000B43228469B689847B5F8AE32002B7FF46F +:1060D0007FAF00287FF47CAF2846FCF709FE77E706 +:1060E00003F06003202B2BD0402B29D0A3BBBEF1A3 +:1060F000010FD1B23DD0BEF1030F27D0BEF1000F8A +:106100002AD195F89C32022B00F09380032B23D1E7 +:1061100052B201F00F031420002A00FB035380F257 +:10612000A1809B69C3B101F07F0303FB00002844F9 +:1061300011F07F0340F0A28002220146036085E057 +:10614000D5F8B43228469B68984741E795F89C32C9 +:10615000022B5AD0032B03D02846EBF7CDFE37E7AE +:106160004A06B9D05CEA0003B6D12846FEF78BFA9E +:10617000B2E795F89C32022B47D0032BECD1BCF14F +:10618000000F7FF425AF4806A6D0D5F8C00201F075 +:106190000F01436899429FD8C1EBC10312F0800FF1 +:1061A0004FF01C024FEA830339D03C3302FB01025B +:1061B0004FF0010C034482F83DC0002219709A7020 +:1061C00090F8BC23012A87D00122016880F8BC2303 +:1061D0005A7893F800C0012A4FF020020CBF01F555 +:1061E000106101F5306112FB0C12116821F40011ED +:1061F0001160DB78023B012B03D8136843F0805316 +:106200001360002380F8BC3366E74B062846A4D011 +:10621000FEF739FA80212846FEF735FAD8E603F56D +:10622000FE7302FB01024FF0000C034482F8FDC133 +:10623000C3E7490690D113064FF000034FF0020266 +:106240004CBF05F1140105F5AA710B602846FCF757 +:1062500043FDBDE60A30544F103A0024D43D0024DB +:106260000A31544FD3F85831002B3FF475AF01F089 +:106270007F0300FB035000F5AA7059E7002AD5F808 +:10628000C0C24FF01C02B5BF02FB03C102FB01C339 +:1062900091F83E3093F8FE31002B3FF44DAF0123CF +:1062A0004AE703F08001B6E77B68D80740F1178121 +:1062B000DAF8000097F80CB0D0F8101800F510626A +:1062C000D0F834580BF00F0902EB4B1225FA09F9FC +:1062D00092684FEAC9195FFA89F949EA010909EA9E +:1062E000020919F0010F46D0FB68D4F8342803F0F6 +:1062F0000F01012303FA01F1BB6822EA0102DAF877 +:106300001010C4F834281A460123994293600CD126 +:10631000FB68D8E911522A44C8F84820DAF850201E +:10632000134302D19D4AEDF74FF89D4BD3F8045427 +:10633000BBF1000F40F09E80D5F89422022A40F075 +:106340009080D5E908239A4262D9D21A9449D5F8A7 +:10635000C002896C2A6292B2EBF7D9FD5A465946BF +:10636000D5F8C002EBF7E8FD95F8A022012A02D18A +:10637000002285F8A02219F0080F02D00822BB687D +:106380009A6019F0100F02D01022BB689A6019F0C1 +:10639000400F02D04022BB689A6019F0020F02D071 +:1063A0000222BB689A6019F0800F00F09880D8E94B +:1063B0001421914200F29380521AD8F84410DAF86E +:1063C00000508A42FB6805F5106C28BF0A4605F5A7 +:1063D00080510CEB431C033201EB0B339208DCF8C9 +:1063E00018E01FFA8EFE9645D8E9140175D388424D +:1063F00001D900284DD1FA680121D5F8343802F0CE +:106400000F0201FA02F223EA0203C5F8343866E00B +:10641000E969B1FBF3F003FB101070B98B420CD8A3 +:10642000D5F89822914208D25A465946D5F8C0026A +:10643000EBF76DFDC5F898B290E7D5F8B422D268B5 +:106440002AB195F89C12032901D128469047802152 +:106450002846FEF718F90522C5F8942200221146B5 +:106460007EE732F004037FF47FAF80212846FEF7F9 +:106470000AF979E7D5F8B4225269002A3FF47BAFD4 +:1064800095F89C1203297FF476AF59462846904729 +:1064900071E7411AD8F844209AF81000914228BFB9 +:1064A0001146CA1C920850B1D8F848000844C8F8F0 +:1064B0004800D8F854000144C8F854108FE788B257 +:1064C000D8F848E0033080080EEB80007045EBD030 +:1064D0005EF8049BC3F80090F8E788428BD9FB680C +:1064E00008F11C080133FB607B685B087B60BB68BC +:1064F0002033BB60FFF7ABB8D3F8043493F89C2289 +:1065000083F89D22042283F89C22FFF7E7B8C2F8A3 +:1065100008C0203252F8201C21F4001142F8201C3F +:1065200052F8201C41F0006142F8201CC2F8E8C17A +:10653000D2F8E01121F40011C2F8E011D2F8E01114 +:1065400041F00061C2F8E011396801313960FFF7AC +:10655000E0B85A6942F4005242F02B025A611A69BB +:1065600042F00B021A61FFF7EEB80F23FFF78AB96A +:106570000E23FFF787B90D23FFF784B90C23FFF72C +:1065800081B90B23FFF77EB90A23FFF77BB90923F3 +:10659000FFF778B90823FFF775B900BFD43D002491 +:1065A000103A0024014B1868704700BFF402002421 +:1065B0008A892DE9F041054610070C4658D44B68EE +:1065C000002B05DC0B6C002B02DC0020BDE8F08109 +:1065D000E66A002EF9D0002312F480522F682B6057 +:1065E00032D0606DA3895A0705D56368C01A636B02 +:1065F0000BB1236CC01A00230246E66A216A2846C2 +:10660000B047431CA38906D129681D292CD82A4AE2 +:10661000CA40D60728D500226260D90422692260C8 +:1066200004D5421C01D12B6803B96065616B2F60F2 +:106630000029CAD004F14403994202D02846F8F751 +:10664000E7F800206063C1E7216A01232846B047CC +:10665000411CC7D12B68002BC4D01D2B01D0162B99 +:1066600001D12F60B1E7A38943F04003A381ADE7D7 +:106670000F69002FA9D093070E6808BF4B690F6000 +:1066800018BF0023A6EB07088B60B8F1000F9CDD54 +:10669000216AA66A43463A462846B047002806DCE7 +:1066A000A38943F04003A3814FF0FF308EE70744F6 +:1066B000A8EB0008E9E700BF0100402038B50B69EE +:1066C00005460C4613B90025284638BD18B1836924 +:1066D0000BB900F099F8144B9C421BD16C68B4F9CB +:1066E0000C30002BEFD0626ED00704D4990502D491 +:1066F000A06D00F076FC28462146FFF759FF636E37 +:10670000DA070546E0D4A3899B05DDD4A06D00F02F +:106710006AFCD9E7054B9C4201D1AC68DFE7044B2A +:106720009C4208BFEC68DAE72CF101084CF1010843 +:106730000CF10108014620B9044B0549186800F026 +:10674000F6BA044B1868FFF7B9BF00BF6CF1010837 +:10675000BD660108F4020024002310B50446C0E918 +:106760000033C0E90433836081814366C281836161 +:10677000194608225C3000F009FD054B6362054BA9 +:10678000A362054BE362054B2462236310BD00BF87 +:10679000A9740108CF740108077501082B75010859 +:1067A000014900F0C4BA00BFBD66010870B54A1EB9 +:1067B000682555430E4605F17401F8F72DF8044697 +:1067C00040B10021C0E900160C30A06005F168025C +:1067D00000F0DCFC204670BD014800F002BC00BFA8 +:1067E000A73E0024014800F0FEBB00BFA73E0024E6 +:1067F000014800F0F6BB00BFA43E0024014800F0B1 +:10680000F2BB00BFA43E002410B50446FFF7F0FF22 +:10681000A3691BB1BDE81040FFF7F0BFC4E9123314 +:106820002365134B134A1B68A262A34204BF0123D2 +:10683000A361204600F020F86060204600F01CF8BC +:10684000A060204600F018F80022E0600421606893 +:10685000FFF782FFA06801220921FFF77DFFE068B2 +:1068600002221221FFF778FF0123A361D2E700BFC4 +:106870006CF10108A1670108F8B50746FFF7ACFF06 +:106880001E4B1E68B36913B93046FFF7BDFF48368B +:10689000D6E90134013B03D533680BB33668F7E71B +:1068A000B4F90C50D5B9164BE36004F15800656695 +:1068B00000F094FBFFF796FFC4E90155C4E90455C5 +:1068C0002560A5610822294604F15C0000F05EFC09 +:1068D000C4E90D55C4E912552046F8BD6834D9E71E +:1068E00004213846FFF762FF044630600028D5D106 +:1068F000FFF778FF0C233B60EEE700BF6CF1010867 +:106900000100FFFFF7B50F46114601AA054601F049 +:1069100095F9064618B90024204603B0F0BD284674 +:10692000FFF7AAFF04460028F5D03946019A4FF434 +:10693000DB73284600F002FD071E09DA0025FFF789 +:106940004BFFA06DA58100F04AFBFFF74BFFE2E78C +:10695000636EDB0705D4A389980502D4A06D00F00F +:1069600040FB0E4B63620E4BA3620E4BE362F105DC +:106970000D4BE781A6812462236305D50223002203 +:106980002146284600F09CF8636EDA07C4D4A38938 +:106990009B05C1D4A06D00F026FBBDE7A9740108DA +:1069A000CF740108077501082B750108024B0A46D0 +:1069B00001461868FFF7A6BFF40200242DE9F74F3F +:1069C0001F4613467B430C9C06468A4691469B46CF +:1069D0005FD018B183690BB9FFF716FF2E4B9C42AD +:1069E00028D17468636EDB0705D4A3899D0502D4A2 +:1069F000A06D00F0F6FA6368002B01DA00236360F3 +:106A0000D846D4E9001545451ED34246504600F00D +:106A1000AFFB60682168636EA0EB08004144DA07B1 +:106A2000606021602FD4A3899B052CD4A06D00F059 +:106A3000DAFA28E0194B9C4201D1B468D2E7184B2E +:106A40009C4208BFF468CDE72A46504600F090FB10 +:106A500023682B4423602146A8EB050330460193AD +:106A600000F088FCAA44019B88B1636ED80705D466 +:106A7000A389990502D4A06D00F0B5FA5D44A5EB99 +:106A80000803B3FBF9F7384603B0BDE8F08F98462A +:106A9000B7E71F46F7E700BF2CF101084CF10108EA +:106AA0000CF1010807B5009313460A460146034856 +:106AB0000068FFF783FF03B05DF804FBF4020024D5 +:106AC00000F00AB813460A4601460248006800F082 +:106AD00003B800BFF40200242DE9F0410C4617462C +:106AE0001E46054618B183690BB9FFF78DFE444B6E +:106AF0009C4222D16C68636ED90705D4A3899A059C +:106B000002D4A06D00F06DFAA38903F48473B3F589 +:106B1000847F03D121462846FFF7D0FDD4F82C808E +:106B2000B8F1000F13D11D232B60636ED9075DD51B +:106B30004FF0FF363046BDE8F081324B9C4201D128 +:106B4000AC68D8E7304B9C4208BFEC68D3E7012E15 +:106B500036D036F0020347D123691BB921462846B7 +:106B600000F066FA21462846FFF7A8FD0028DCD190 +:106B7000216A33463A462846C0470130D5D0616B7A +:106B800041B104F14403994202D02846F7F740FE90 +:106B90000023636323692360A389002523F4026330 +:106BA0006560A3810822294604F15C0000F0EEFA3A +:106BB000666E16F0010620D1A3899B05BAD40CE0BD +:106BC0002146284600F022F8431C064609D1636E90 +:106BD000DD07ADD4A3899805AAD4A06D00F003FA0F +:106BE000A8E707440026B7E716239DE7A3899A057F +:106BF0009ED4A06D00F0F7F99AE72E469AE700BF01 +:106C00002CF101084CF101080CF1010870B50C469B +:106C1000054618B183690BB9FFF7F6FD324B9C426C +:106C200014D16C68636EDA0705D4A3899B0502D47E +:106C3000A06D00F0D6F9E66ACEB91D232B60636E15 +:106C4000DE070DD54FF0FF35284670BD274B9C421F +:106C500001D1AC68E6E7264B9C4208BFEC68E1E74F +:106C6000A3899D05EED4A06D00F0BDF9EAE7A289E5 +:106C700002F00C03082B19D12368BBB121695B1A00 +:106C8000002B13DDD00511D502230022216A2846EE +:106C9000B047411C05460DD1636EDA07D2D4A389F3 +:106CA0009B05CFD4A06D00F09EF9CDE712F4805281 +:106CB0000FD0656DA28956070DD56368ED1A636B19 +:106CC0000BB1236CED1A636ED907BDD49305BBD409 +:106CD000E8E70123DAE71007F5D52368002BF2D0A7 +:106CE00021695B1A1D44EEE72CF101084CF1010803 +:106CF0000CF101082DE9F0410F4600F1480400268F +:106D0000D4E90185B8F1010805D52468002CF7D134 +:106D10003046BDE8F081AB89012B06D9B5F90E30BC +:106D2000013302D02846B84706436835EAE72DE923 +:106D3000F8430646884600F148040027D4E9019547 +:106D4000B9F1010905D52468002CF7D13846BDE812 +:106D5000F883AB89012B07D9B5F90E30013303D085 +:106D600029463046C04707436835E9E770B50D4D01 +:106D70000D4C641BA4100026A64209D10B4D0C4CEF +:106D800002F094FB641BA4100026A64205D170BD3E +:106D900055F8043B98470136EEE755F8043B984711 +:106DA0000136F2E7C0030024C0030024C00300241E +:106DB000C803002438B50B4B1D68EB6B044653B970 +:106DC000242000F075F90246E86320B9064B074815 +:106DD000322100F005FFE96B2046BDE8384000F0A5 +:106DE00007B800BFF402002470F1010887F1010820 +:106DF0002DE9F3410746019100F0BCFF019980465F +:106E0000384600F0BBFF43699A07044603F26C76EC +:106E100005D1642296FBF2F302FB13637BBB4FF4B4 +:106E2000C87396FBF3F503FB1565B5FA85F56D0997 +:106E3000684B302202FB053500F032FD00F03CFDCE +:106E4000654B1B6853B3D8F80430B34219D1D8F856 +:106E50000010D7E90067D8E90823D1B9964277EB4B +:106E6000030323DAD8E91223964277EB0303B4BF76 +:106E70000123002323621BDBD8F828101AE0012528 +:106E8000D6E7304600F064FC0028E0D14FF0FF3335 +:106E900004E0964277EB030302DA00232362EBE778 +:106EA000D8E91223964277EB0303F6DA0123236233 +:106EB000D8F850104FF461633C2091FBF3F603FBCC +:106EC0001613616893FBF0F200FB12302368891AF5 +:106ED000A26861601B1A921B3B2B2360A26035DD08 +:106EE000013161603C3B236063683B2B34DD013240 +:106EF000A2603C3B6360A368172B33DDE26901327B +:106F0000E261A2690132062AC8BF0022A261E268DA +:106F1000183B0132A3602369E26055F823108A42CE +:106F20000EDD0B2BA2EB0102E26003F1010209BFAF +:106F3000636922610022013302BF22616361E26161 +:106F400000F0B4FC204602B0BDE8F081002BCBDAA3 +:106F5000013961603C33C6E7002BCCDA013AA2600C +:106F60003C33C7E7002BEBDAE269013AE261A26940 +:106F7000013A48BF0622A261E2681833013AE26092 +:106F8000A360002ADCD12369013B05D42361236976 +:106F900055F82330E360D3E70B23236163695A1E5E +:106FA000626103F26B72930705D1642192FBF1F3E6 +:106FB00001FB132363B94FF4C87192FBF1F301FB9A +:106FC0001323B3FA83F35B0903F5B673E361DEE7DA +:106FD0000123F9E704F20108403E0024704770479E +:106FE000704770477047704770B50E46B1F90E1084 +:106FF000002996B014461D4607DA00232B60B3899A +:107000001A0610D44FF480630EE06A4600F05EFE6C +:107010000028F2DB019A02F47042A2F500535A42B2 +:107020005A412A60EEE740230020236016B070BD6D +:107030008B8973B59D0706460C4607D504F14703B7 +:10704000236023610123636102B070BD01AB6A4616 +:10705000FFF7CAFF009905463046F7F7DDFB48B950 +:10706000B4F90C309A05EFD423F0030343F0020384 +:10707000A381E3E70D4BB362A389206043F0800353 +:10708000A381009B6361019B20615BB1B4F90E1089 +:10709000304600F023FF28B1A38923F0030343F017 +:1070A0000103A381A0890543A581CDE7A16701085C +:1070B000024B01461868F7F7AFBB00BFF40200248B +:1070C000024B01461868F7F7A3BB00BFF402002487 +:1070D00001F0FF01102A2BDB10F0070F08D010F889 +:1070E000013B013A8B422DD010F0070F42B3F6D18D +:1070F000F0B441EA012141EA014122F007047FF0A6 +:1071000000070023F0E80256083C85EA010586EAFC +:10711000010685FA47F5A3FA87F586FA47F6A5FA38 +:1071200087F68EB9EED1F0BC01F0FF0102F0070244 +:1071300032B110F8013B013A83EA010313B1F8D1EF +:107140000020704701387047002D06BF35460338D0 +:10715000073815F0010F07D1013015F4807F02BF09 +:10716000013015F4C03F0130F0BC0138704700BF5A +:107170000A44914200F1FF3300D1704710B511F875 +:10718000014B03F8014F9142F9D110BD024403466F +:10719000934200D1704703F8011BF9E737B5002986 +:1071A00048D051F8043C0190002BA1F10404B8BF71 +:1071B000E418F7F797F9204A01981368154633B990 +:1071C0006360146003B0BDE83040F8F731B9A34202 +:1071D0000BD921686218934204BF1A685B68636028 +:1071E00004BF521822602C60ECE71A465B680BB1B2 +:1071F000A342FAD911685518A5420BD1246821443D +:107200005418A3421160DDD11C685B6853602144AF +:107210001160D7E702D90C230360D3E72568611911 +:107220008B4204BF19685B68636004BF4919216021 +:107230005460C7E703B030BD1C3E0024F8B5CD1C38 +:1072400025F0030508350C2D38BF0C25002D06460A +:1072500001DBA94203D90C2333600020F8BDF7F706 +:1072600041F921490A6814469CB9204F3B6823B96B +:107270002146304600F008F938602946304600F0D3 +:1072800003F9431C23D10C2333603046F8F7D0F8C0 +:10729000E3E723685B1B17D40B2B03D923601C4443 +:1072A000256004E06368A2420CBF0B605360304667 +:1072B000F8F7BEF804F10B00231D20F00700C21AF6 +:1072C000CCD01B1AA350C9E722466468CCE7C41C83 +:1072D00024F00304A042E3D0211A304600F0D4F891 +:1072E0000130DDD1CFE700BF1C3E0024203E00244A +:1072F000F8B5074614460E4621B9BDE8F8401146D8 +:10730000F7F78ABA22B9F7F783FA25462846F8BD77 +:1073100000F006FEA0420FD221463846F7F77CFA6D +:1073200005460028F2D031462246FFF721FF3146BC +:107330003846F7F76DFAE9E73546E7E738B5074D20 +:1073400004460846114600222A601A46F8F702FD54 +:10735000431C02D12B6803B1236038BDAC3E00242E +:10736000838903F00903092B01D1FFF7E3B900205A +:1073700070470000F8B50C46054618B183690BB993 +:10738000FFF742FA3B4B9C420AD16C68B4F90C20DF +:1073900000236360A3899E060CD54FF0FF3066E0A2 +:1073A000354B9C4201D1AC68F0E7344B9C4208BF9E +:1073B000EC68EBE7580748D4D90605D409232B60BD +:1073C00042F04003A381E8E71A070BD5214628467F +:1073D000FFF774F90028E0D1A389A06023F0080327 +:1073E000A381A061A38943F00403A38123691BB98E +:1073F00021462846FFF71CFEA689B4F90C70B30796 +:107400000FD00123A3811E4B1E49186806F0090600 +:10741000FFF770FC092EA78103D121462846FFF70C +:10742000C7F82269666A6369216A22602846B04704 +:10743000002860601CDCB4F90C3017BF002243F058 +:107440002003626043F04003BCE7616B0029CDD0AC +:1074500004F14403994202D02846F7F7D9F9236C86 +:10746000636000206063002BC0D0E36B2360F8BD35 +:107470000020FCE72CF101084CF101080CF1010897 +:107480006CF101086173010838B5064D002304460C +:1074900008462B60F7F72EF8431C02D12B6803B186 +:1074A000236038BDAC3E002410B50C46B1F90E1077 +:1074B00001F02CF80028ABBF636DA3891B1823F4DF +:1074C0008053ACBF6365A38110BD002070472DE9D8 +:1074D000F0411F468B89DB0505460C46164605D54F +:1074E000B1F90E100223002200F008FDA389B4F9BF +:1074F0000E1023F48053A38132463B462846BDE854 +:10750000F04100F05BBB10B50C46B1F90E1000F075 +:10751000F5FC431CA38915BF606523F4805343F435 +:107520008053A38118BFA38110BDB1F90E1000F0E4 +:1075300075BB0000012B2DE9F04701D0242B06D9A3 +:10754000FFF730F8162303600020BDE8F0873A4FBC +:107550008E4676461EF8014BE55D15F00805F8D11C +:107560002D2C34D19EF800404FF0010806F1020E98 +:10757000002B5CD0102B0CD1302C0AD19EF800408F +:1075800004F0DF04582C4DD19EF8014010230EF179 +:10759000020E08F1004C0CF1FF3C0026BCFBF3F995 +:1075A000354603FB19CAA4F13007092F18D83C4609 +:1075B000A34224DD002E1FDBA9451DD301D1A24526 +:1075C0001ADB05FB034501261EF8014BEBE72B2CCC +:1075D00008BF9EF80040A84608BF06F1020EC7E7A4 +:1075E000A4F14107192F01D8373CE1E7A4F1610765 +:1075F000192F04D8573CDBE74FF0FF36E4E7002EA5 +:1076000005DA22230360654642B928469DE7B8F1B2 +:10761000000F00D06D42002AF7D00EB10EF1FF31FD +:107620001160F2E73024002BB3D10823B1E7302CEE +:10763000A4D00A23ADE700BF0CF00108FFF77ABF22 +:107640002DE9F0433B4E86468C4660461CF8014BC4 +:10765000A55D15F00805F8D12D2C34D19CF800401B +:107660004FF0010800F1020C002B5ED0102B0CD162 +:10767000302C0AD19CF8000000F0DF0058284FD1D0 +:107680009CF8014010230CF1020C4FF0FF3700254D +:10769000B7FBF3F703FB07F96FEA09092846A4F1E2 +:1076A0003006092E18D83446A34224DD002D1FDBF6 +:1076B00087421DD301D1A1451ADB00FB0340012500 +:1076C0001CF8014BEBE72B2C08BF9CF80040A846A8 +:1076D00008BF00F1020CC7E7A4F14106192E01D83A +:1076E000373CE1E7A4F16106192E04D8573CDBE7EB +:1076F0004FF0FF35E4E7002D07DA2223CEF8003003 +:107700004FF0FF3042B9BDE8F083B8F1000F00D070 +:107710004042002AF7D00DB10CF1FF311160F2E7C1 +:107720003024002BB1D10823AFE7302CA2D00A239C +:10773000ABE700BF0CF00108FFF782BF13460A4613 +:10774000014602480068FFF77BBF00BFF402002437 +:107750002DE9F74F804600F00DFB40F2B1739845DC +:1077600040F398806FF4F66343449B1040F26D122F +:10777000A8F2B27502FB05356FF06302A8F26D73D3 +:1077800093FBF2F31D444FF4C8736FF4C86298FB87 +:10779000F3F703FB17874244B7FA87FCB2FBF3F217 +:1077A00008F0030315446422C0F8048098FBF2F645 +:1077B0004FEA5C1C02FB1686044600F1500B009356 +:1077C0004FF0070E227A63694A2A28D10099EA18F5 +:1077D00001B906B90FBB3B2BD4BF002301231344CF +:1077E0005A1EA3692C4901FB0232A36A13441A46AC +:1077F000DB17C4E908232834A345E3D1D0E90845C1 +:10780000D0E91223944275EB0303B4BF0123002394 +:107810000360012003B0BDE8F08F0023DFE7442AB6 +:1078200001D1EA18DDE7009A72BB002E0CBFE046DA +:107830004FF001081949E26801924FF0300A0AFB43 +:1078400008182A464FF00009A8F10408019909F127 +:107850000109494558F829A018DC02F1040898FBF1 +:10786000FEF9C9EBC909A8EB0909B3EB09092369BA +:1078700003F1FF3348BF09F10709C3EBC3034B44CE +:10788000534505DA1A44ACE7E046D3E75244DDE756 +:10789000073BF5E70020BDE78051010004F2010835 +:1078A0000148FFF79DBB00BFA63E00240148FFF73B +:1078B00099BB00BFA63E0024014B186800F002B837 +:1078C000F40200242DE9F04F8DB0074600F052FA83 +:1078D000AE49AF4E0546384600F044FA044670B94A +:1078E000AC4BAD4A1860AD4B1860AD4B3068C3E986 +:1078F0000022FFF7E5FB34600DB0BDE8F08F316882 +:1079000000295FD13068FFF7DBFB204600F04EFE18 +:10791000411C3846F6F780FF3060002857D12378A5 +:10792000A04AA1493A2B08BF01340AAE334620468B +:1079300000F0FEFD0028DFDD0A9BE718E35C2D2B3D +:1079400049D101374FF0FF340DF1200A0DF11E0B24 +:107950004FF00008CDE9016A94490396CDF800B0D4 +:10796000334607AA3846ADF81E80ADF8208000F0F7 +:10797000DFFD4045C0DDBDF81E30BDF82020DFF83A +:1079800038923C2101FB0322BDF81C304FF46161A9 +:1079900001FB03235C43AC62814C824B23600A9B56 +:1079A00081491F444A463346384600F0C1FD4045F0 +:1079B00016DC23686360774BAA6A1A60774BC3F8BA +:1079C000008099E700F0E0FD00289BD194E7214674 +:1079D00000F0E4FDA3E72B2B08BF01370124B3E738 +:1079E0000A9BC4F80490FC18FB5C2D2B40F08B80A4 +:1079F00001344FF0FF370023ADF81C30ADF81E30D6 +:107A0000ADF820300A93CDE902A6CDE900B667496A +:107A1000334607AA204600F08BFD002878DCAF6AC9 +:107A2000A7F561670A9B2F651C442F464FF000099C +:107A300023782C2B08BF013494F80080B8F14D0F47 +:107A400078D10DF12603CDE9016309AB00935849C4 +:107A5000039633460DF12202204600F069FD03280B +:107A60007FF44AAFBDF822104B1E0B2B3FF644AFFC +:107A7000BDF82420531E042B3FF63EAFBDF8263040 +:107A8000062B3FF639AFC7E9031287F808807B6100 +:107A90000A9B04EB03080223ADF81C300023ADF869 +:107AA0001E30ADF820300A9398F800302F2B09D102 +:107AB000CDE902A6CDE900B63E49334607AA4046C5 +:107AC00000F036FDBDF81E30BDF820203C2101FB42 +:107AD0000322BDF81C304FF4616101FB0323BB613D +:107AE0000A9C28374444B9F1000F20D06868FFF79A +:107AF0002FFE284BAA6A1A602B6D9B1A274A18BFC3 +:107B000001231360F8E62B2B08BF0134012772E72D +:107B1000BDF81E30BDF820203C2101FB0322BDF83A +:107B20001C304FF4616101FB03235F437AE74FF0A0 +:107B300001097DE7B8F14A0F06BF013443464423EB +:107B40000A220BA920460593FFF7F8FDDDF82C80EB +:107B5000059BADF82600A04514D14D23B9F1000FC7 +:107B600007D12B7203210223C5E90313C5F8149032 +:107B700091E785F830300B220123C5E90D2300235E +:107B8000EB6388E780B23B72786184E764F20108B6 +:107B90003C3E0024443E002467F20108403E00249D +:107BA000580300242F3E00246BF201088EF20108D6 +:107BB0007AF201088DF20108243E002438B5074D01 +:107BC00004460846114600222A601A46F7F7ACFE22 +:107BD000431C02D12B6803B1236038BDAC3E0024A6 +:107BE0001FB514461A46094B1B680546D8684CB1A8 +:107BF000074B0091CDE9013406492B4600F054F8BB +:107C000000F0AEFD044B1C46F3E700BFF402002475 +:107C1000A0F20108ADF20108F5A3010838B5064D40 +:107C20000023044608462B60F7F7DAFF431C02D115 +:107C30002B6803B1236038BDAC3E00240B78722B57 +:107C400030B522D0772B24D0612B27D016230360A8 +:107C5000002030BD622D12D0782D13D02B2D07D1EE +:107C600020F01C0023F0030340F0100043F0020357 +:107C700011F8015F002DEDD123431360E9E743F4D0 +:107C80008033F5E743F40063F2E700242346042041 +:107C9000EEE74FF4C06401230820E9E74FF40274D3 +:107CA00001234FF48470E3E70EB403B5014603AB40 +:107CB000054853F8042B0068019300F063F902B003 +:107CC0005DF804EB03B07047F402002438B5074DAB +:107CD00000230446084611462B60F7F733FD431C8A +:107CE00002D12B6803B1236038BD00BFAC3E002435 +:107CF0002DE9F84F074689461646F6F7EDFB184B77 +:107D00001C689A4634B14B46984613F8011B39B1AA +:107D10003D29F9D13846F7F785FB0020BDE8F88FFB +:107D2000A8EB0908A34654F8040B0028F2D04246F9 +:107D3000494600F043FC0028F4D154F8043C03EB1E +:107D4000080513F808303D2BECD1DAF80030ABEB26 +:107D500003039B1038463360F7F764FB681CDDE7CC +:107D6000B803002407B501AAFFF7C2FF03B05DF80E +:107D700004FB000000487047600300242DE9F04137 +:107D8000D0E900670C46514A00233046394601F0DD +:107D90009DF9394605464D4A3046002301F096F9D3 +:107DA000002ABCBF02F5A83202F5C0724FF461612F +:107DB00005F52F20B2FBF1F301FB13224FF03C013C +:107DC000ACBF00F66C2000F66B20A360B2FBF1F3B1 +:107DD00001FB132263602260C31C072293FBF2F2B3 +:107DE000C2EBC2029B1A48BF07330028A361B8BF89 +:107DF000A0F50E333649AEBF90FBF1F1A3F52C731D +:107E000093FBF1F1334B03FB010048F6AC62B0FB8E +:107E1000F2F2024440F2B45CB0FBFCF3D21A40F23E +:107E20006D172D4BB0FBF3F36426D31AB3FBF7F5B4 +:107E3000B3FBFCF3B5FBF6F2D31A034407FB15338F +:107E4000992003EB830C0CF1020C03F1010EBCFB37 +:107E5000F0F7784302304FF00508B0FBF8F0AEEBD6 +:107E6000000040F2F95EF44594BF4FF0020C6FF051 +:107E7000090C67444FF4C87C0CFB0151012F98BFDB +:107E80000131B3F5997F0CD3A3F59973E361A1F2A6 +:107E90006C710023E060C4E9047123622046BDE8F0 +:107EA000F08115F0030F02D106FB12525AB94FF4BC +:107EB000C876B5FBF6F206FB1252B2FA82F252090C +:107EC0003B331344E2E70122FAE700BF805101008F +:107ED000B13A02004FC5FDFFB03A020038B5064D79 +:107EE0000023044608462B60F7F7AEFC431C02D182 +:107EF0002B6803B1236038BDAC3E002438B5074D74 +:107F000004460846114600222A601A46F7F76BFC21 +:107F1000431C02D12B6803B1236038BDAC3E002462 +:107F200051F8043C181F002BBCBF0B58C0187047F9 +:107F30009368013B002B10B4936008DA9469A34264 +:107F400001DB0A2903D15DF8044B00F049BB13683B +:107F5000581C1060197008465DF8044B7047F8B55E +:107F600006460F461446D518AC4201D1002007E062 +:107F700014F8011B3A463046FFF7DAFF431CF3D1F1 +:107F8000F8BD00002DE9F04F0D469DB0144698460F +:107F9000064618B183690BB9FEF736FC894B9D4242 +:107FA0001BD175686B6ED90705D4AB899A0502D4CD +:107FB000A86DFFF716F8AB891B0701D52B69EBB944 +:107FC0002946304600F05EFBC0B16B6EDC070ED573 +:107FD0004FF0FF301DB0BDE8F08F7B4B9D4201D1CB +:107FE000B568DFE7794B9D4208BFF568DAE7AB89F2 +:107FF0009805EDD4A86DFEF7F6FFE9E70023099395 +:1080000020238DF82930CDF80C803023DFF8C08193 +:108010008DF82A304FF0010923469A4613F8012BB8 +:108020000AB1252AF9D1BAEB040B0BD05B462246E4 +:1080300029463046FFF793FF013000F0AA80099AE5 +:108040005A4409929AF80030002B00F0A2800023D5 +:108050004FF0FF32CDE905230AF1010A049307939B +:108060008DF853301A935446052214F8011B5848D2 +:10807000FFF72EF8049AD8B9D10644BF20238DF813 +:108080005330130744BF2B238DF853309AF8003038 +:108090002A2B15D0079A544600204FF00A0C21468F +:1080A00011F8013B303B092B4ED9B0B1079214E0D7 +:1080B000A0EB080309FA03F313430493A246D2E7A3 +:1080C000039B191D1B680391002BBBBF5B4242F051 +:1080D000020207930793B8BF049223782E2B0CD18A +:1080E00063782A2B35D1039B1A1D1B680392002B42 +:1080F000B8BF4FF0FF3302340593DFF8E4A02178D6 +:1081000003225046FEF7E4FF40B14023A0EB0A00F3 +:1081100003FA00F0049B03430134049314F8011B99 +:108120002C488DF828100622FEF7D2FF00283FD0F9 +:10813000294B1BBB039B073323F00703083303932F +:10814000099B3B44099367E70CFB02320C46012074 +:10815000A5E700230134059319464FF00A0C204689 +:1081600010F8012B303A092A03D9002BC5D005910C +:10817000C3E70CFB012104460123F0E703AB0093A6 +:108180002A46164B04A93046AFF300800746781CF8 +:10819000D6D16B6ED90705D4AB899A0502D4A86DE8 +:1081A000FEF721FFAB895B063FF512AF099811E797 +:1081B00003AB00932A46094B04A9304600F080F82F +:1081C000E4E700BF2CF101084CF101080CF10108B3 +:1081D000DCF20108E6F20108000000005F7F010800 +:1081E000E2F201082DE9F047164699468A680B69C4 +:1081F000DDF820809342B8BF1346336091F84320E6 +:1082000007460C460AB1013333602368990642BF22 +:10821000336802333360256815F0060506D104F192 +:10822000190AE36832689B1AAB4226DC94F84320B3 +:10823000131E226818BF012392062BD404F14302B7 +:1082400049463846C04701301ED02368E568326889 +:1082500003F00603042B08BFAD1AA36822690CBF04 +:1082600025EAE57500259342C4BF9B1AED18002648 +:108270001A34B5421AD1002008E00123524649467B +:108280003846C047013003D14FF0FF30BDE8F087DA +:108290000135C6E7E1185A1C302081F8430022441A +:1082A00094F8451082F843100233C7E701232246B1 +:1082B00049463846C0470130E6D00136D9E70000CC +:1082C0002DE9FF470C469146277E0C99782F804672 +:1082D0009A4604F1430207D8622F0AD8002F00F013 +:1082E000D880582F00F0A38004F1420684F8427031 +:1082F0003AE0A7F16303152BF6D801A050F823F05C +:10830000598301086D830108E9820108E9820108A7 +:10831000E9820108E98201086D830108E982010808 +:10832000E9820108E9820108E982010879840108EB +:108330009D8301085B840108E9820108E982010844 +:108340009B840108E98201089D830108E9820108F4 +:10835000E9820108638401080B681A1D1B680A6022 +:1083600004F1420684F842300123A3E0256808683E +:108370002E0600F104030AD505680B60002D03DA10 +:108380002D236D4284F843305E480A2319E015F02E +:10839000400F05680B6018BF2DB2EFE70B6825682A +:1083A000181D0860280601D51D6802E06906FBD586 +:1083B0001D8854486F2F0CBF08230A23002184F81E +:1083C00043106668A660002EA2BF216821F0040158 +:1083D00021600DB9002E4DD01646B5FBF3F103FB1D +:1083E0001157C75D06F8017D2F46BB420D46F4D9F3 +:1083F000082B0BD12368DF0708D5236961689942F0 +:10840000DEBF302306F8013C06F1FF36921B2261E5 +:10841000CDF800A04B4603AA21464046FFF7E2FEF6 +:1084200001304CD14FF0FF3004B0BDE8F087354843 +:1084300084F8457023680E681F0656F8045B0E60CA +:1084400014D5D90744BF43F0200323601DB9236826 +:1084500023F0200323601023B0E7236843F02003B8 +:1084600023607823284884F84530E3E75E0648BF58 +:10847000ADB2E6E71646BBE70B68266860691D1DCE +:108480000D6035061B6801D5186002E07106FBD54A +:108490001880002323611646BAE70B681A1D0A608C +:1084A0001E68626800213046FEF712FE08B1801B8C +:1084B000606063682361002384F84330A8E7236980 +:1084C000324649464046D0470130ABD023689B072F +:1084D00013D4E068039B9842B8BF1846A4E7012371 +:1084E000324649464046D04701309BD00135E368CB +:1084F00003995B1AAB42F2DCEBE7002504F11906A5 +:10850000F5E700BFEDF20108FEF2010838B5074DAE +:1085100004460846114600222A601A46F7F7B2F9C7 +:10852000431C02D12B6803B1236038BDAC3E00244C +:108530000EB410B59FB021AC4FF4017154F8042B68 +:108540000192ADF81C100490089000F02FF80C4B2D +:10855000059009900D930B48019A0068039400233D +:10856000119316934FF6FF73ADF81E3004A92346FE +:1085700000F058F91FB0BDE8104003B0704700BFCD +:10858000CB740108F402002410F8012B11F8013B10 +:10859000012A28BF9A42F7D0D01A7047034611F833 +:1085A000012B03F8012B002AF9D17047034613F879 +:1085B000012B002AFBD1181A0138704710B56AB197 +:1085C0000139841810F8013B11F8012F934203D1AF +:1085D000A04201D0002BF5D1981A10BD1046FCE73F +:1085E000F8B50E461446054618B183690BB9FEF777 +:1085F0000BF9214B9C422BD16C68A369A360A38922 +:108600001A072FD523696BB323692068C01A6369E1 +:10861000F6B28342374604DC21462846FEF74EF880 +:1086200030BBA368013BA36023685A1C22601E7004 +:1086300063690130834204D0A389DB0706D50A2E83 +:1086400004D121462846FEF739F888B93846F8BDE6 +:108650000A4B9C4201D1AC68CFE7094B9C4208BF52 +:10866000EC68CAE72146284600F00CF80028CBD079 +:108670004FF0FF37EAE700BF2CF101084CF1010889 +:108680000CF10108324B70B51D6806460C4625B149 +:10869000AB6913B92846FEF7B7F82E4B9C420FD1B1 +:1086A0006C68A389B4F90C2019072CD4DD0611D409 +:1086B0000923336042F04003A3814FF0FF303EE0D6 +:1086C000254B9C4201D1AC68EBE7244B9C4208BF90 +:1086D000EC68E6E7580712D5616B41B104F1440339 +:1086E000994202D03046F6F793F800236363A389DA +:1086F00023F02403A3810023636023692360A389FB +:1087000043F00803A38123694BB9A38903F42073C1 +:10871000B3F5007F03D021463046FEF789FCA089DF +:10872000B4F90C2010F001030AD00023A3606369A0 +:108730005B42A361236943B910F08000BAD170BDD8 +:10874000810758BF6369A360F4E70020F7E700BF23 +:10875000F40200242CF101084CF101080CF101088D +:1087600008B5062000F084FB0120F7F721F838B5A2 +:108770004B1C144603D14FF0FF35284638BD938972 +:1087800023F020039381636B5268CDB28BB1A36B4E +:10879000934208DD23685A1E226003F8015C636877 +:1087A00001336360E9E7214600F07EFB0028F1D049 +:1087B000E1E72169236851B1994208D213F8011CFD +:1087C000A94204D1013B013223606260D5E7C4E9CC +:1087D0000F3204F1440363630323A363234603F8C6 +:1087E000465F23600123DCE710B50C46496B69B195 +:1087F00004F14403994201D0F6F70AF8236C636050 +:108800000020606313B1E36B236010BD2369236014 +:1088100000236360A38943F02003A3814FF0FF305E +:10882000F3E700002DE9F04F0C46ADF5237D002164 +:10883000CDE94411B249A0910DF10408B149B24FFC +:10884000DFF8C892CDF818810646A191009392F8FE +:1088500000A0BAF1000F00F051811AF8073013F0B0 +:10886000080302F1010519D06368002B0FDD2368AE +:108870001A78BA5C120701D42A46E8E7459A013211 +:10888000459262680133013A62602360ECE7A19B84 +:108890002146304698470028E9D0EDE7BAF1250F88 +:1088A00040F083804193439353782A2B02BF1023D7 +:1088B000951C41930A22AB461BF8011BA1F1300322 +:1088C000092B1DD991480322FEF702FC40B1012378 +:1088D000A0EB090003FA00F0419B184341905D466C +:1088E00015F8013B782B06D8572B10D8252B5CD0D8 +:1088F00056D8002B74D0032347930A23429381E078 +:10890000439B02FB0313303B43935D46D3E7A3F144 +:108910005802202AEFD801A151F822F0EF8901086E +:10892000F7880108F78801084D8A0108F7880108CF +:10893000F7880108F7880108F7880108F788010817 +:10894000F7880108F7880108638A0108398A010855 +:10895000A7890108A7890108A7890108F7880108E4 +:108960003D8A0108F7880108F7880108F78801089F +:10897000F7880108738A0108458A0108E789010818 +:10898000F7880108F78801086F8A0108F78801084D +:10899000398A0108F7880108F7880108EF8901087A +:1089A000453B022BA7D805232BE06368002B0DDD88 +:1089B00023681A78524540F0A18001336268236031 +:1089C000459B013A01336260459355E7A19B2146DF +:1089D000304698470028EBD04498002840F0848027 +:1089E0004FF0FF3086E0419A42F020024192419AD6 +:1089F00042F40072419210226F2B429234BF032343 +:108A0000042347936368002B41DD419B590604D43E +:108A100023681A78BA5C120740D4479B022B4FDCBC +:108A20006B46224641A9304600F074F8012865D013 +:108A300002287FF421AFCFE70A22DDE7002342932B +:108A40000323DEE7082342930423DAE7294640465E +:108A500000F0ACF9419B43F04003419305460123EC +:108A6000CFE7419B43F0400341930023C9E7022332 +:108A7000C7E74198C3063FF5FFAE009B459A191D15 +:108A800000911B68C0074CBF1A801A60F4E6A19BD6 +:108A90002146304698470028B7D09DE7459A0132D5 +:108AA00045926268013A002A626002DD0133236068 +:108AB000AEE7A19B2146304698470028A8D08BE717 +:108AC000042B06DC6B46224641A9304600F07AF8BA +:108AD000ACE70F4B002B3FF4CFAE6B46224641A9CB +:108AE0003046AFF30080A1E7A38913F0400F18BF11 +:108AF0004FF0FF300DF5237DBDE8F08F4498F9E786 +:108B00006F870108E98701080CF00108E2F201080B +:108B1000000000002DE9F84315468A6880460C469F +:108B200032B98A69002A0CBF01224FF0FF328A60F5 +:108B30002268DFF88C90D1065FBF1A68111D19609A +:108B400016680027A06988B1012807D12B681A7818 +:108B500063699B5C53B927BBBDE8F883022820D129 +:108B60002B681B7813F809301B071AD42368DA0620 +:108B70005EBF2B681B7806F8013B2A686B680132E0 +:108B80002A60A268013B013A6B600137A26042B1E2 +:108B9000002BD7DCD4F8803129464046984700287E +:108BA000D0D0236813F0100305D1E2680132E260EF +:108BB000A26902B1337023691F4427610020CBE70B +:108BC0000CF001082DE9F04F9846744B0C46824694 +:108BD000164693E8070087B003AB83E80700704BA5 +:108BE000A169704A032918BF1A46A36801925A1E48 +:108BF000B2F5AE7F88BF6FF4AE75274682BF03EB38 +:108C0000050940F25D13A36057F81C3B43F4506321 +:108C100098BF4FF0000923603D464FF0000B3168CC +:108C200003AB097853F82B000222FEF751FA28B360 +:108C3000BBF1010F59D162682AB92268082342F4B6 +:108C4000007263602260226822F4A0622260A2683F +:108C5000511EA16092B13268511C3160127805F842 +:108C6000012B7268013A002A726007DCD4F8802177 +:108C7000314650469047002840F085800BF1010BAB +:108C8000BBF1030FCBD163680BB90A236360636840 +:108C900045496069C91A00F089F84FF0000BA368D4 +:108CA0002268002B3DD03168606991F800C010F84F +:108CB0000C00002835D0BCF1300F24D1100522D58E +:108CC0000BF1010BB9F1000F03D0013309F1FF39AA +:108CD000A3607368013B002B73601BDD33680133B5 +:108CE0003360A368013BA360D9E7BBF1020FAED1AB +:108CF000226802F4C061B1F5007FBFD11023636028 +:108D000042F48072A2E722F4106222600B7805F828 +:108D1000013BDEE7D4F880313146504698470028C1 +:108D2000DFD02368D9050DD5BD4209D915F8011C3E +:108D3000D4F87C3132465046984705F1FF394D460C +:108D4000BD4228D0226812F0100213D12A70636845 +:108D5000019E39465046B047D8F8003021681A1DA8 +:108D6000C8F8002011F0200F1B680FD01860E368CE +:108D70000133E360ED1BAB4425695D4425610020B0 +:108D800007B0BDE8F08F4FF0000BCAE7CA074CBF31 +:108D900018801860EBE70120F2E700BF2CF3010810 +:108DA000397701083D76010828F3010870B50B7882 +:108DB00004465E2B0BBF4B78481C881C002208BF62 +:108DC0000122611E04F1FF0501F8012FA942FBD128 +:108DD0000BB9013870BD82F00101E154421C12F858 +:108DE000015C2D2D02F1FF36104606D05D2DF1D02D +:108DF0000DB93046EEE72B46EFE716785D2EFAD038 +:108E0000B342F8DC1846013086422154FBDCD843DB +:108E100030445D1CB342A8BF00202B180232DEE7AD +:108E20001F2938B504460D4604D9162303604FF0B8 +:108E3000FF3038BD426C12B152F821304BB9204698 +:108E400000F030F82A4601462046BDE8384000F0E0 +:108E500017B8012B0AD0591C03D116230360012037 +:108E6000E7E7002442F82540284698470020E0E73D +:108E7000024B01461868FFF7D3BF00BFF40200247D +:108E800038B5074D00230446084611462B6000F014 +:108E900005FB431C02D12B6803B1236038BD00BF22 +:108EA000AC3E002400F0F2BA2DE9F0410C46496BCB +:108EB00004F1440399421DD14FF48061F5F7ACFCF5 +:108EC00018B94FF0FF30BDE8F0814FF48063A36321 +:108ED00094F84630606380F8FF3394F8453080F8AA +:108EE000FE3394F8443080F8FD3300F2FD3020600A +:108EF0000020E8E7A66B77003A46F5F78BFC0546BD +:108F00000028DED000EB0608014632464046FEF758 +:108F10002FF9C4E90D57C4F80080E9E770B50E4693 +:108F20001446054618B183690BB9FDF76DFC144B67 +:108F30009C421AD16C68636ED80705D4A389990541 +:108F400002D4A06DFEF74DF822462846314600F0C7 +:108F500033F8636EDA07054605D4A3899B0502D46E +:108F6000A06DFEF740F8284670BD064B9C4201D12B +:108F7000AC68E0E7044B9C4208BFEC68DBE700BF4D +:108F80002CF101084CF101080CF10108024B0A46D2 +:108F900001461868FFF7C2BFF402002430B501395A +:108FA0000024A24201D1002005E0035D01340D5DE3 +:108FB000AB42F6D0581B30BD70B50D461446064680 +:108FC00018B183690BB9FDF71FFC1C4B9C4224D1DF +:108FD0007468636ED80705D4A389990502D4A06D7F +:108FE000FDF7FFFFA368013B002BA36005DAA26930 +:108FF00093421CDBEBB20A2B19D023685A1C226067 +:109000001D70EDB2636EDA0705D4A3899B0502D407 +:10901000A06DFDF7E8FF284670BD094B9C4201D1C9 +:10902000B468D6E7074B9C4208BFF468D1E72946ED +:1090300022463046FFF7D4FA0546E3E72CF1010853 +:109040004CF101080CF10108C9B2034610F8012BDC +:109050001AB18A42F9D118467047002918BF002377 +:10906000F9E770B503461E4613F8014B44B14A1E9A +:1090700001E0A54204D012F8015F002DF9D1F2E71A +:10908000301A70BD10B50139034632B111F8014FE5 +:1090900003F8014B013A002CF7D11A440021934206 +:1090A00000D110BD03F8011BF9E770B503461E4659 +:1090B00013F8014B3CB14A1E01E0A542F7D012F86B +:1090C000015F002DF9D1301A70BD00007BB972B973 +:1090D0000029BEBF00204FF0004106E008BF002875 +:1090E0001CBF6FF000414FF0FF3000F0A1B9ADF1AF +:1090F000080C6DE904CE002909DB002B1ADB00F017 +:1091000035F8DDF804E0DDE9022304B070474042A1 +:1091100061EB4101002B1BDB00F028F8DDF804E0D7 +:10912000DDE9022304B0404261EB4101524263EBAE +:1091300043037047524263EB430300F017F8DDF836 +:1091400004E0DDE9022304B0404261EB41017047D5 +:10915000524263EB430300F009F8DDF804E0DDE977 +:10916000022304B0524263EB430370472DE9F047FA +:10917000089D04468C46002B40F083808A421746A7 +:1091800047D9B2FA82F242B1C2F1200024FA00F0CB +:109190009140974040EA010C94404FEA1748230C55 +:1091A000BCFBF8F61FFA87FE08FB16C143EA014331 +:1091B00006FB0EF1994209D9FB1806F1FF3080F049 +:1091C0001981994240F21681023E3B445B1AA4B2D7 +:1091D000B3FBF8F008FB103344EA034400FB0EFE37 +:1091E000A64509D93C1900F1FF3380F00581A64559 +:1091F00040F2028102383C4440EA0640A4EB0E04EF +:1092000000261DB1D4400023C5E900433146BDE826 +:10921000F08702B9FFDEB2FA82F2002A50D1CB1BEE +:109220004FEA174E1FFA87F80126B3FBFEFC210C0C +:109230000EFB1C3341EA034108FB0CF38B4207D9B8 +:1092400079180CF1FF3002D28B4200F2E98084469B +:10925000C91AA3B2B1FBFEF00EFB101143EA0144A0 +:1092600008FB00F8A04507D93C1900F1FF3302D2F2 +:10927000A04500F2D9801846A4EB080440EA0C404F +:10928000BFE78B4209D9002D00F0B1800026C5E967 +:10929000000130463146BDE8F087B3FA83F6002E70 +:1092A0004AD18B4202D3824200F2B880841A61EB29 +:1092B000030101208C46002DA8D0C5E9004CA5E78C +:1092C000C2F1200320FA03F6974001FA02F04FEAB8 +:1092D000174ED9403043030CB1FBFEF61FFA87F856 +:1092E0000EFB161143EA014306FB08F1994204FA0A +:1092F00002F409D9FB1806F1FF3C80F08D809942F9 +:1093000040F28A80023E3B445B1A81B2B3FBFEF01E +:109310000EFB103341EA034100FB08F38B4207D9EF +:10932000791800F1FF3C73D28B4271D9023839446D +:10933000CB1A40EA064678E7C6F1200C03FA06F499 +:1093400022FA0CF31C4320FA0CF701FA06F34FEA59 +:10935000144E21FA0CF11F433B0CB1FBFEF91FFA2E +:1093600084F80EFB191143EA014109FB08FA8A450A +:1093700002FA06F200FA06F308D9611809F1FF3083 +:1093800048D28A4546D9A9F102092144A1EB0A0134 +:10939000BFB2B1FBFEF00EFB101147EA014700FB24 +:1093A00008F8B84507D9E71900F1FF312ED2B845C2 +:1093B0002CD90238274440EA0940A7EB0807A0FB54 +:1093C00002894F45C64649461AD317D05DB1B3EB63 +:1093D0000E0267EB010707FA0CFCF2404CEA0202AE +:1093E000F740C5E9002700263146BDE8F0872E4644 +:1093F00028460BE70646E9E61846FDE64345E5D272 +:10940000B8EB020E69EB04010138DFE70846D2E74A +:1094100060468DE78146B9E7664675E730464AE71C +:10942000ACF1020C394413E702383C4424E700BF96 +:10943000704700BF53B94AB9002908BF00281CBFB4 +:109440004FF0FF314FF0FF30FFF7F2BFADF1080CE6 +:109450006DE904CEFFF78AFEDDF804E0DDE90223C2 +:1094600004B07047430803F05533C01A830803F073 +:10947000333300F03330184400EB101000F00F309D +:1094800000EB002000EB0040000E7047024B58221A +:109490001A604FF0FF307047AC3E0024024B582258 +:1094A0001A604FF0FF307047AC3E0024F8B500BFA3 +:1094B000F8BC08BC9E467047F8B500BFF8BC08BCB5 +:1094C0009E467047436F6D6D616E6420706172617E +:1094D0006D206572726F723A2077726F6E672061CD +:1094E0006464726573732073697A650A00496E76E5 +:1094F000616C696420616C74206279746573207397 +:10950000697A650050696E6D6170206572726F7264 +:109510003A2077726F6E6720706F7274206E756D6F +:109520006265722E006170706C69636174696F6E40 +:109530005F756E6E616D65645F746872656164000D +:10954000657175657565006170706C6963617469DA +:109550006F6E5F756E6E616D65645F6D7574657855 +:109560000048414C5F5254435F53657444617465D5 +:10957000206572726F720A0048414C5F5254435F1B +:1095800053657454696D65206572726F720A004983 +:1095900032433132333A20496E76616C696420631C +:1095A0006C6F636B20736F7572636500493243346F +:1095B0003A20496E76616C696420636C6F636B203E +:1095C000736F75726365004932433A20756E6B6E36 +:1095D0006F776E20696E7374616E63650049324304 +:1095E0003A2061626E6F726D616C206361736520F9 +:1095F00073686F756C64206E6F742068617070653D +:109600006E640043616E6E6F7420696E6974696187 +:109610006C697A65205254432077697468204C53F2 +:10962000490A00506572697068436C6B496E6974D1 +:1096300053747275637420525443206661696C657B +:10964000642077697468204C53490A0052544320BF +:10965000696E697469616C697A6174696F6E20669C +:1096600061696C65640A00456E61626C654279707F +:10967000617373536861646F77206572726F720AE9 +:109680000048414C5F5243435F4F7363436F6E66C4 +:109690006967204552524F520A0048414C5F52437D +:1096A0004345785F506572697068434C4B436F6EF9 +:1096B000666967204552524F520A005365745379C8 +:1096C00073436C6F636B206661696C65640A0001AB +:1096D000808080808080800480808080808080087E +:1096E000808080808080801080808080808080204A +:1096F0008080808080808040000408102040020428 +:1097000008102040000000000102030401020304CD +:1097100006070809A086010080380100C0D40100B6 +:10972000000000007A0D0000FA0000005C1200004A +:10973000A00F0000800200001400000000000000E4 +:10974000801A060000E20400005307000000000039 +:1097500084030000640000001405000058020000AB +:10976000FA000000640000000000000040420F000A +:1097700000350C00804F120000000000C201000004 +:1097800032000000F4010000040100003C00000071 +:109790006400000000000000000000000000000164 +:1097A0000100000000000002220000000000000490 +:1097B0002300000000000008FFFF00000000000080 +:1097C00008000000005C0040CA1300001600000002 +:1097D00000540040CA13000016010000001C00588D +:1097E000CA1B00001800000000540040CA1300000B +:1097F00018010000001C0058CA1B00001A000000DD +:1098000000580040CA1300003C000000001C005833 +:10981000CA1300005100000000580040CA130000A5 +:109820005E000000001C0058CA1300007400000015 +:1098300000580040CA13000077000000005C0040A0 +:10984000CA1300007B000000001C0058CA1300006F +:10985000FFFF0000FFFFFFFF0000000017000000F7 +:1098600000540040CA13000017010000001C0058FB +:10987000CA1B00001900000000540040CA13000079 +:1098800019010000001C0058CA1B00001B0000004A +:1098900000580040CA13000029000000005C00408E +:1098A000CA1300003D000000001C0058CA1300004D +:1098B0005000000000580040CA1300005F00000084 +:1098C000001C0058CA13000075000000005800403A +:1098D000CA13000078000000005C0040CA130000BA +:1098E0007C000000001C0058CA130000FFFF0000AD +:1098F000FFFFFFFF0000000001000200040006005F +:1099000008000A000C001000200040008000000148 +:1099100001030507090E10121416181C1E00000082 +:109920000000000000000000F5290108192A0108C4 +:10993000BD1C0108311601084DC7000815170108A4 +:109940002D1A0108F5170108D52C010859C6000881 +:1099500059C6000851C60008D7C50008CDC5000883 +:10996000D1C50008692C0108092C0108A12B0108A8 +:1099700049C600080000000000000000AD14000807 +:10998000171A0008D91400085714000841140008D9 +:1099900035140008291400081D1400088914000853 +:1099A0000000000000000000F1130008051A000884 +:1099B000851300086F130008411300089B1300086B +:1099C0006313000857130008351300082913000813 +:1099D0001D13000807130008FDC90008A3C90008EB +:1099E0009DC900089DC90008F9C90008EDC9000813 +:1099F000CD130008000000000000000085000108F1 +:109A0000350101082DFF000819FF000800000000C3 +:109A100000000000C5140008F3190008D91400085C +:109A200073140008411400083514000829140008B4 +:109A30001D14000889140008000000000000000048 +:109A400009140008E1190008851300086F130008C5 +:109A500041130008B71300086313000857130008E8 +:109A600035130008291300081D1300080713000808 +:109A7000FDC90008A3C900089DC900089DC90008C8 +:109A8000F9C90008EDC90008CD1300080000000066 +:109A90000000000075FE000805FF0008000000003F +:109AA0000000000039290108BD29010840420F00CB +:109AB000200000000080000010000000007D000079 +:109AC000100000000100000002000000040000007F +:109AD000080000001000000020000000400000000E +:109AE00080000000000100000002000000040000EF +:109AF00000080000001000000020000000400000EE +:109B0000008000000000000080DE280080C84D00BA +:109B100000A7760000349E008012C700809FEE00F0 +:109B2000007E1701805C400180E9670100C8900158 +:109B30000055B8010000000080DE2800001A4F0028 +:109B400080F8770080859F000064C80000F1EF0076 +:109B500080CF180100AE4101003B690180199201DC +:109B600080A6B9016C9B0108E00F0024E9050008FC +:109B7000DD0500088D0500087D050008C105000809 +:109B8000A105000809C8000835060008000000000B +:109B90006C6974746C656673002E2E002F00EBFEEA +:109BA000904D53444F53352E30004E4F204E414D73 +:109BB00045202020204641543332202020004E4FA3 +:109BC000204E414D45202020204641542020202079 +:109BD00020002A3A3C3E7C223F7F002B2C3B3D5B01 +:109BE0005D0000FBFFFBFEECEAF3EFF7F3EDEDEABF +:109BF000FB8CF0F4E9EA809A45418E418F8045451F +:109C0000454949498E8F9092924F994F5555599990 +:109C10009A9B9C9D9E9F41494F55A5A5A6A7A8A983 +:109C2000AAABACADAEAFB0B1B2B3B4B5B6B7B8B91C +:109C3000BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C90C +:109C4000CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9FC +:109C5000DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EC +:109C6000EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9DC +:109C7000FAFBFCFDFEFFC700FC00E900E200E40087 +:109C8000E000E500E700EA00EB00E800EF00EE008E +:109C9000EC00C400C500C900E600C600F400F600F0 +:109CA000F200FB00F900FF00D600DC00A200A300D8 +:109CB000A500A7209201E100ED00F300FA00F100F9 +:109CC000D100AA00BA00BF001023AC00BD00BC0048 +:109CD000A100AB00BB0091259225932502252425E8 +:109CE00061256225562555256325512557255D2576 +:109CF0005C255B251025142534252C251C250025E5 +:109D00003C255E255F255A25542569256625602555 +:109D100050256C2567256825642565255925582516 +:109D2000522553256B256A2518250C258825842561 +:109D30008C2590258025B103DF009303C003A30386 +:109D4000C303B500C403A6039803A903B4031E22EA +:109D5000C603B50329226122B100652264222023B3 +:109D60002123F7004822B0001922B7001A227F20D1 +:109D7000B200A025A0000000000000006410B71D84 +:109D8000C8206E3BAC30D9269041DC76F4516B6B29 +:109D90005861B24D3C7105502083B8ED44930FF0EB +:109DA000E8A3D6D68CB361CBB0C2649BD4D2D386A1 +:109DB00078E20AA01CF2BDBD000000000000000017 +:109DC00049A2000885A20008DD6D0008A16D000809 +:109DD000DBC200083FC10008FDBE0008C5BF000887 +:109DE00059A0000853700008D9A100089571000817 +:109DF000CDBC0008519C0008B39900086FAB000867 +:109E0000299C0008DF12000867AE000837700008C0 +:109E1000EF1200081B7000086FB80008F9BB0008BB +:109E2000E575000835B00008EDAF0008FF6F0008C9 +:109E3000CBAF00081D6E000829A30008F5780008C4 +:109E4000E1780008A1A20008FCFFFFFF000000006D +:109E50007DA2000897A2000800000000000000009A +:109E60000000000000000000D3E00008E31200083A +:109E7000E9120008E3120008E312000801130008C9 +:109E8000E3120008FCFFFFFF0000000000000000DC +:109E900000000000000000000000000000000000C2 +:109EA00000000000D3E00008E3120008E9120008F7 +:109EB000E3120008E312000801130008E31200088F +:109EC00000000000000000004177000885770008CE +:109ED000DD6D0008A16D00082992000803970008B5 +:109EE000719100083396000819870008817D0008E9 +:109EF000AD75000831930008CFB90008B38F000892 +:109F0000DF860008DF850008858F0008DF12000863 +:109F1000398200080B750008EF120008DB74000896 +:109F2000F584000843B90008417500082D89000830 +:109F30001B7D0008BB740008E17C00081D6E000852 +:109F4000FCFFFFFF000000007D7700089777000806 +:109F500061001A03E0001703F8000703FF00010087 +:109F600078010001300132010601390110014A0176 +:109F70002E017901060180014D0043028101820119 +:109F800082018401840186018701870189018A0198 +:109F90008B018B018D018E018F0190019101910147 +:109FA00093019401F60196019701980198013D02F1 +:109FB0009B019C019D0120029F01A001A001A20123 +:109FC000A201A401A401A601A701A701A901AA0158 +:109FD000AB01AC01AC01AE01AF01AF01B101B20107 +:109FE000B301B301B501B501B701B801B801BA01B8 +:109FF000BB01BC01BC01BE01F701C001C101C2012E +:10A00000C301C401C501C401C701C801C701CA0118 +:10A01000CB01CA01CD011001DD0101008E01DE017D +:10A020001201F3010300F101F401F401F801280128 +:10A03000220212013A020900652C3B023B023D025A +:10A04000662C3F0240024102410246020A015302CD +:10A05000400081018601550289018A0158028F0161 +:10A060005A0290015C025D025E025F02930161028E +:10A07000620294016402650266026702970196011A +:10A080006A02622C6C026D026E029C017002710207 +:10A090009D01730274029F017602770278027902B1 +:10A0A0007A027B027C02642C7E027F02A60181027E +:10A0B0008202A9018402850286028702AE0144025F +:10A0C000B101B20145028D028E028F02900291020F +:10A0D000B7017B030300FD03FE03FF03AC03040091 +:10A0E0008603880389038A03B1031103C2030200B4 +:10A0F000A303A303C4030803CC0303008C038E0350 +:10A100008F03D8031801F2030A00F903F303F403E1 +:10A11000F503F603F703F703F903FA03FA03300430 +:10A12000200350041007600422018A043601C10490 +:10A130000E01CF040100C004D004440161052604CF +:10A1400000007D1D0100632C001E9601A01E5A0117 +:10A15000001F0806101F0606201F0806301F0806ED +:10A16000401F0606511F0700591F521F5B1F541F37 +:10A170005D1F561F5F1F601F0806701F0E00BA1F6D +:10A18000BB1FC81FC91FCA1FCB1FDA1FDB1FF81F49 +:10A19000F91FEA1FEB1FFA1FFB1F801F0806901F05 +:10A1A0000806A01F0806B01F0400B81FB91FB21F81 +:10A1B000BC1FCC1F0100C31FD01F0206E01F0206F8 +:10A1C000E51F0100EC1FF31F0100FC1F4E210100E1 +:10A1D000322170211002842101008321D0241A052C +:10A1E000302C2F04602C0201672C0601752C020113 +:10A1F000802C6401002D260841FF1A030000010095 +:10A2000004001000400000010002000001000200F4 +:10A21000040008001000200000005153504946007F +:10A22000464C4153484941500044465520496E74BC +:10A230006572666163650044465520436F6E6669CA +:10A2400067000D002E2E2E0A000A52252D34643A86 +:10A25000202530386C58000A53502020203A202501 +:10A2600030386C580A4C522020203A202530386C67 +:10A27000580A50432020203A202530386C580A785C +:10A28000505352203A202530386C580A50535020F1 +:10A29000203A202530386C580A4D535020203A205F +:10A2A0002530386C58000A43505549443A2025302F +:10A2B000386C58000A48465352203A202530386CF2 +:10A2C000580A4D4D4653523A202530386C580A42B0 +:10A2D000465352203A202530386C580A554653527E +:10A2E000203A202530386C580A44465352203A20F0 +:10A2F0002530386C580A41465352203A20253038D0 +:10A300006C58000A4D4D4641523A202530386C5861 +:10A31000000A42464152203A202530386C58000A43 +:10A320004D6F6465203A20546872656164000A507C +:10A33000726976203A2055736572000A5072697608 +:10A34000203A2050726976696C65676564000A4D31 +:10A350006F6465203A2048616E646C6572000A5330 +:10A360007461636B3A20505350000A537461636BFD +:10A370003A204D5350000A2B2B204D6265644F53F9 +:10A38000204661756C742048616E646C6572202B88 +:10A390002B0A0A4661756C74547970653A20004D39 +:10A3A000656D4D616E6167654661756C74004275DF +:10A3B000734661756C740055736167654661756CB1 +:10A3C0007400486172644661756C74000A0A436FD8 +:10A3D0006E746578743A000A0A2D2D204D6265640A +:10A3E0004F53204661756C742048616E646C6572D1 +:10A3F000202D2D0A0A0064656661756C7400466F35 +:10A400007263654F73634F75746F6644656570530F +:10A410006C65657020636C6F636B20697373756521 +:10A420000D0A00466F7263655065726970684F75FA +:10A43000746F6644656570536C65657020636C6FFE +:10A44000636B2069737375650D0A00496E6974202A +:10A450003A2063616E6E6F7420696E697469616C15 +:10A46000697A65204C53490A006D61696E00534654 +:10A4700044500073696E676C65746F6E5F6D7574C0 +:10A480006578006D616C6C6F635F6D7574657800E5 +:10A49000656E765F6D75746578007274785F746947 +:10A4A0006D6572007274785F69646C65005254580F +:10A4B0002056352E352E33000000000073A401080D +:10A4C0000B000000AC3500241C000000010000005F +:10A4D000E803000005000000142E00241000000016 +:10A4E000000000000000000000000000000000006C +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000000000000000000004B +:10A51000000000000000000000000000000000003B +:10A520000010000038AA010874AA0108BD0801083B +:10A53000D5E100085CAA0108040000000102040043 +:10A540002900000000500052D22700003B0000000C +:10A5500000500052D2270000580000000050005266 +:10A56000D22B0000FFFF0000FFFFFFFF00000000F4 +:10A570002A00000000500052D22700003C000000DA +:10A5800000500052D2270000590000000050005235 +:10A59000D22B0000FFFF0000FFFFFFFF00000000C4 +:10A5A0004200000000500052D22700005700000077 +:10A5B00000500052D2270000FFFF0000FFFFFFFF06 +:10A5C000000000000100000000500052D2270000EF +:10A5D0003D00000000500052D2270000560000004D +:10A5E00000500052D2270000FFFF0000FFFFFFFFD6 +:10A5F000000000001200000000500052D2270000AE +:10A600005A00000000500052D2270000FFFF000057 +:10A61000FFFFFFFF00000000160000000050005286 +:10A62000D22B00001A00000000500052D227000078 +:10A630006600000000500052D22B0000FFFF000017 +:10A64000FFFFFFFF0000000001000000004C004081 +:10A65000D22300000300000000440040D21F00008D +:10A660000800000000780040D22F00000A0000001F +:10A6700000100140D21F00000A010000000C005829 +:10A68000D20F00000B000000004C0040D21B000065 +:10A690001300000000780040D22F000015000000D9 +:10A6A00000500040D23B00001700000000100140A5 +:10A6B000D21F000017010000000C0058D223000038 +:10A6C00018000000004C0040D22300001B000000D6 +:10A6D00000480040D21F00001C0000000050004055 +:10A6E000D23B00001F00000000100140D213000008 +:10A6F0002700000000140140D21F00002B000000C2 +:10A7000000480040D21F00002B010000004C004018 +:10A71000D223000030000000004C0040D223000093 +:10A720003200000000500040D2230000360000003C +:10A7300000440040D21F00003900000000480040E3 +:10A74000D21F000040000000007C0040D223000027 +:10A750004700000000780040D21F000056000000B3 +:10A7600000780040D21F0000690000000014014082 +:10A77000D21F00007E000000004C0040D2230000E9 +:10A7800089000000004C0040D22300009900000026 +:10A79000007C0040D2230000FFFF0000FFFFFFFF0E +:10A7A0000000000000000000004C0040D223000028 +:10A7B0000200000000440040D21F00000900000019 +:10A7C00000100140D21F000009010000000C0058D9 +:10A7D000D20F00000C000000004C0040D21B000013 +:10A7E0000F00000000780040D22F0000140000008D +:10A7F00000780040D22F0000160000000010014039 +:10A80000D21F00001601000000500040D23B0000A3 +:10A8100016020000000C0058D223000019000000AE +:10A82000004C0040D22300001A0000000048004005 +:10A83000D21F00001D00000000500040D23B00006D +:10A840001E00000000100140D2130000260000008E +:10A8500000140140D21F00002A0000000048004000 +:10A86000D21F00002A010000004C0040D22300004B +:10A870002C00000000500040D223000031000000F6 +:10A88000004C0040D223000035000000004400408E +:10A89000D21F00003800000000480040D21F000016 +:10A8A00041000000007C0040D2230000480000006E +:10A8B00000780040D21F00005700000000780040E0 +:10A8C000D21F00006E00000000140140D21F0000E3 +:10A8D0007D000000004C0040D223000098000000E2 +:10A8E000007C0040D2230000FFFF0000FFFFFFFFBD +:10A8F0000000000000000000000000001BC700086E +:10A9000097D9000815E100081DC700085BC70008BB +:10A910004DC700084DC7000851C70008E1C900082D +:10A92000D7C9000855C70008D1C90008FDC90008EB +:10A93000A3C900089DC900089DC90008DDE0000802 +:10A94000EDC90008000000000000000081070108B8 +:10A950009507010809080108590701084DC70008B3 +:10A9600041FC0008C106010801040108D52C0108BA +:10A9700059C600080BC70008C7D90008AFD900089E +:10A98000FBC60008F5C60008692C0108092C01085F +:10A990005FC60008EDC600080000000000000000CF +:10A9A000D3E000080000000000000000570101088B +:10A9B00047010108EBC90008A3D900080000000006 +:10A9C0000000000051E50008000000000000000049 +:10A9D00041EF00082F737464657272002F73746402 +:10A9E000696E002F7374646F7574003031323334C4 +:10A9F00035363738396162636465663031323334F5 +:10AA000035363738394142434445460014AA0108D7 +:10AA1000682D002439670008D9070008212500089F +:10AA2000011500085D150008291500088925000892 +:10AA3000E907000801000000A4A4010800000000CC +:10AA4000602F002444000000A82F00240003000011 +:10AA500001000000010000000000000000000000F4 +:10AA600000000000542E002434000000882E002432 +:10AA7000500000009AA40108000000001C2F0024D0 +:10AA800044000000A8320024000300002800000059 +:10AA900001000000000000005344434152440041C3 +:10AAA000726475696E6F20534100456E766965204A +:10AAB000483720426F6F746C6F6164657200726218 +:10AAC000002F66732F5550444154452E42494E0085 +:10AAD00040426F6F746C6F6164657220766572734B +:10AAE000696F6E202564202F307830303030303060 +:10AAF00030302F302A344B670040496E7465726ED7 +:10AB0000616C20466C6173682020202F30783038CB +:10AB10003030303030302F30312A3132384B612CE8 +:10AB200031352A3132384B67004045787465726E92 +:10AB3000616C20466C6173682020202F307839309A +:10AB40003030303030302F343039362A344B6700D3 +:10AB500000000000000000004946010869460108A5 +:10AB6000393C0108752F01084DC70008DD3901087F +:10AB7000A1370108ED350108D52C01089B2B0108F0 +:10AB8000952B01088F2B0108CF2C0108C92C010837 +:10AB9000792B0108692C0108092C0108A12B010857 +:10ABA000712B0108814601087B4601080000000066 +:10ABB0000000000059E200088BD9000899E3000862 +:10ABC00065D9000875C5000821C50008CDC4000876 +:10ABD00087C40008D52C010873C400085FC40008AE +:10ABE0004BC4000823C400080FC4000809C40008AF +:10ABF000692C0108092C0108A12B0108DDC30008FC +:10AC000003C40008F1C30008EDC30008E9C300084D +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000000000000013 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000000022 +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000000000000000069 +:10B7E0000000000000000000000000000000000059 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000000000000000000000000000002B +:10C51000000000000000000000000000000000001B +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D000000000000000000000000000000000005B +:10C5E000000000000000000000000000000000004B +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000000000000006 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000000000000000B5 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB0000000000000000000000000000000000075 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000000000000000000000000000035 +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000000000000000000F4 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD400000000000000000000000000000000000E3 +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000000000000000000000038 +:10D8F0000000000000000000000000000000000028 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000000000000000000016 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA600000000000000000000000000000000000B6 +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000000000000000000036 +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000000000000000015 +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000000000000000000000000C5 +:10DB600000000000000000000000000000000000B5 +:10DB700000000000000000000000000000000000A5 +:10DB80000000000000000000000000000000000095 +:10DB90000000000000000000000000000000000085 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000000000000000000000000055 +:10DBD0000000000000000000000000000000000045 +:10DBE0000000000000000000000000000000000035 +:10DBF0000000000000000000000000000000000025 +:10DC00000000000000000000000000000000000014 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000000E4 +:10DC400000000000000000000000000000000000D4 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000000054 +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000000000000000000003 +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000000000000000000000000B3 +:10DD700000000000000000000000000000000000A3 +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD0000000000000000000000000000000000041 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000000000000000000000090 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000000000008C +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000000000000000000001C +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E5200000000000000000000000000000000000EB +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F000000000000000000000000000000000001B +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000000000000000000FA +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000000000000000D9 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000099 +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000000000000000000000019 +:10E800000000000000000000000000000000000008 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000094 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F00000A01808010101081001011900202020208A +:10F0100020202020202828282828202020202020C8 +:10F0200020202020202020202020202088101010A8 +:10F030001010101010101010101010100404040400 +:10F040000404040404041010101010101041414175 +:10F0500041414101010101010101010101010101E0 +:10F060000101010101010110101010101042424273 +:10F0700042424202020202020202020202020202B0 +:10F080000202020202020210101010200000000012 +:10F090000000000000000000000000000000000070 +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000F802002481 +:10F170005245454E54206D616C6C6F63207375630E +:10F18000636565646564002F6D6E742F776F726BB5 +:10F1900073706163652F776F726B73706163652F36 +:10F1A0004743432D392D706970656C696E652F6A10 +:10F1B000656E6B696E732D4743432D392D706970F1 +:10F1C000656C696E652D3230305F323032303035EB +:10F1D00032315F313539303035333337342F737254 +:10F1E000632F6E65776C69622F6E65776C69622F2D +:10F1F0006C6962632F74696D652F6C636C74696DE3 +:10F20000652E63001F0000001C0000001F000000AE +:10F210001E0000001F0000001E0000001F00000074 +:10F220001F0000001E0000001F0000001E00000064 +:10F230001F0000001F0000001D0000001F00000054 +:10F240001E0000001F0000001E0000001F00000044 +:10F250001F0000001E0000001F0000001E00000034 +:10F260001F000000545A00474D54002531305B5EAA +:10F27000302D392C2B2D5D256E004D256875256EA2 +:10F280002E256875256E2E256875256E002F25683C +:10F2900075256E3A256875256E3A256875256E00C8 +:10F2A0002C2066756E6374696F6E3A20006173730B +:10F2B000657274696F6E2022257322206661696C05 +:10F2C00065643A2066696C6520222573222C206CC7 +:10F2D000696E65202564257325730A00232D302B64 +:10F2E0002000686C4C006566674546470030313247 +:10F2F000333435363738394142434445460030319E +:10F300003233343536373839616263646566002BD1 +:10F310002D00303000785800412D46612D66383977 +:10F3200030313233343536375D0000000FF30108D9 +:0CF3300012F3010815F3010800000000B2 +:08F33C009C0FFE7F01000000A0 +:10F344000090D00332030000000000000000000021 +:10F3540000000000000000000000000000000000A9 +:10F364000000000000000000000000000000000099 +:10F374000000000000000000FFFFFFFFFFFFFFFF91 +:10F38400FFFFFFFF0000000000000000000000007D +:10F394000000000000000000000000000000000069 +:10F3A4000000000000000000000000000000000059 +:10F3B4000000000000000000000000000000000049 +:10F3C4000000000000000000000000000000000039 +:10F3D4000000000000000000000000000000000029 +:10F3E4000000000000000000000000000000000019 +:10F3F4000000000000000000000000000000000009 +:10F4040000000000000000000000000000000000F8 +:10F4140000000000000000000000000000000000E8 +:10F4240000000000000000000000000000000000D8 +:10F4340000000000000000000000000000000000C8 +:10F4440000000000000000000000000000000000B8 +:10F4540000000000000000000000000000000000A8 +:10F464000000000000000000000000000000000098 +:10F474000000000000000000B03E0024ADA401081C +:10F48400D3B3FB02000000000000000000000000F5 +:10F494000000000000000000000000000000000068 +:10F4A4000000000000000000000000000000000058 +:10F4B4000000000000000000000000000000000048 +:10F4C4000000000000000000000000000000000038 +:10F4D4000000000000000000000000000000000028 +:10F4E4000000000000000000000000000000000018 +:10F4F4000000000000000000000000000000000008 +:10F5040000000000000000000000000000000000F7 +:10F5140000000000000000000000000000000000E7 +:10F52400B12A0108A52A0108F54701080D48010878 +:10F5340025D900083DE2000821E200083D35010814 +:10F54400AF35010845300108D93301085D2B0108A6 +:10F554004D2B0108512B0108612B0108592B01087F +:10F56400552B0108652B0108652B0108652B010843 +:10F57400412B0108D1470108F9AA010829AB010868 +:10F58400DC35002449F30008F9160108E9190108DB +:10F594005D1B0108BD170108F5D80008120100021F +:10F5A4000000004041235B0300020102030100004C +:10F5B400040309040100000009026F00030102C0F2 +:10F5C400FA0904000000FE0102060904000100FE1D +:10F5D4000102070904000200FE01020809210BFFD1 +:10F5E4000000101A01080B010202020100090401C3 +:10F5F400000102020100052400100105240100029B +:10F6040004240202052406010207058303080009F5 +:10F6140009040200020A00000007050202000200B9 +:10F6240007058202000200000A06000200000040F2 +:10F6340001000114F8020024000000002CF101086C +:10F644004CF101080CF1010800000000000000006A +:10F6540000000000000000000000000000000000A6 +:10F664000000000000000000000000000000000096 +:10F674000000000000000000000000000000000086 +:10F684000000000000000000000000000000000076 +:10F69400000000000000000067F2010867F20108A2 +:10F6A40001000000000000004A000000000000000B +:10F6B4000000000000000000000000000000000046 +:10F6C4000000000000000000000000000000000036 +:10F6D4004A000000000000000000000000000000DC +:10F6E4000000000000000000000000000000000016 +:10F6F4000000000000000000483E0024000000005C +:10F70400BD020008291A0008990200080000000040 +:04000005080004816A +:00000001FF diff --git a/cores/arduino/Arduino.h b/cores/arduino/Arduino.h index 5dddc6e32..4095321e5 100644 --- a/cores/arduino/Arduino.h +++ b/cores/arduino/Arduino.h @@ -84,6 +84,7 @@ typedef struct _AnalogPinDescription AnalogPinDescription; extern PinDescription g_APinDescription[]; extern AnalogPinDescription g_AAnalogPinDescription[]; extern AnalogPinDescription g_AAnalogOutPinDescription[]; +extern AnalogPinDescription g_pureAAnalogPinDescription[]; #ifdef ANALOG_CONFIG #include "hal/analogin_api.h" diff --git a/cores/arduino/Serial.h b/cores/arduino/Serial.h index f511256ad..2cdd7c0f4 100644 --- a/cores/arduino/Serial.h +++ b/cores/arduino/Serial.h @@ -76,7 +76,6 @@ class UART : public HardwareSerial { mbed_usb_serial* _usb_serial = NULL; PinName _tx, _rx, _rts, _cts; RingBufferN<256> rx_buffer; - uint8_t intermediate_buf[4]; bool is_usb = false; }; } diff --git a/cores/arduino/USB/PluggableUSBDevice.cpp b/cores/arduino/USB/PluggableUSBDevice.cpp index 288f940c6..c1449610d 100644 --- a/cores/arduino/USB/PluggableUSBDevice.cpp +++ b/cores/arduino/USB/PluggableUSBDevice.cpp @@ -60,6 +60,10 @@ uint32_t arduino::internal::PluggableUSBModule::write_finish(usb_ep_t endpoint) return PluggableUSBD().write_finish(endpoint); } +void arduino::internal::PluggableUSBModule::callback_reset() +{ +} + arduino::PluggableUSBDevice::PluggableUSBDevice(uint16_t vendor_id, uint16_t product_id) : USBDevice(get_usb_phy(), vendor_id, product_id, 1 << 8) { diff --git a/cores/arduino/USB/PluggableUSBDevice.h b/cores/arduino/USB/PluggableUSBDevice.h index a92bb9693..d766bd80b 100644 --- a/cores/arduino/USB/PluggableUSBDevice.h +++ b/cores/arduino/USB/PluggableUSBDevice.h @@ -38,6 +38,8 @@ class PluggableUSBModule { PluggableUSBModule(uint8_t numIfs) : numInterfaces(numIfs) { } + virtual ~PluggableUSBModule() + { } void lock(); void unlock(); void assert_locked(); @@ -49,17 +51,25 @@ class PluggableUSBModule { uint32_t write_finish(usb_ep_t endpoint); protected: - virtual const uint8_t *configuration_desc(uint8_t index); - virtual void callback_reset() {}; - virtual void callback_state_change(USBDevice::DeviceState new_state); - virtual uint32_t callback_request(const USBDevice::setup_packet_t *setup, USBDevice::RequestResult *result, uint8_t** data); - virtual bool callback_request_xfer_done(const USBDevice::setup_packet_t *setup, bool aborted); - virtual bool callback_set_configuration(uint8_t configuration); - virtual void callback_set_interface(uint16_t interface, uint8_t alternate); - virtual void init(EndpointResolver& resolver); - virtual const uint8_t *string_iinterface_desc(); + virtual const uint8_t *configuration_desc(uint8_t index) = 0; + virtual void callback_state_change(USBDevice::DeviceState new_state) = 0; + virtual uint32_t callback_request(const USBDevice::setup_packet_t *setup, USBDevice::RequestResult *result, uint8_t** data) = 0; + virtual bool callback_request_xfer_done(const USBDevice::setup_packet_t *setup, bool aborted) = 0; + virtual bool callback_set_configuration(uint8_t configuration) = 0; + virtual void callback_set_interface(uint16_t interface, uint8_t alternate) = 0; + virtual void init(EndpointResolver& resolver) = 0; + virtual const uint8_t *string_iinterface_desc() = 0; virtual uint8_t getProductVersion() = 0; + /** + * Non-pure virtual method with a non-inline definition + * + * @note This satisfies all criteria necessary for the compiler to emit a + * vtable, allowing users to safely subclass any of the derived "pluggable" + * USB device classes (USBCDC, USBHID, USBMIDI, etc). + */ + virtual void callback_reset(); + uint8_t pluggedInterface; const uint8_t numInterfaces; diff --git a/cores/arduino/WMath.cpp b/cores/arduino/WMath.cpp index f4ce2b754..aec2b4d6d 100644 --- a/cores/arduino/WMath.cpp +++ b/cores/arduino/WMath.cpp @@ -23,10 +23,36 @@ extern "C" { #include "stdlib.h" + #include "hal/trng_api.h" } +#if defined(ARDUINO_NANO_RP2040_CONNECT) || \ + defined(ARDUINO_PORTENTA_H7_M7) || \ + defined(ARDUINO_NICLA_VISION) || \ + defined(ARDUINO_OPTA) || \ + defined(ARDUINO_GIGA) +#define MBED_TRNG_SUPPORT 1 +static long trng() +{ + trng_t trng_obj; + trng_init(&trng_obj); + long value; + size_t olen; + if (trng_get_bytes(&trng_obj, (uint8_t*)&value, sizeof(value), &olen) != 0) + return -1; + trng_free(&trng_obj); + return value >= 0 ? value : -value; +} +#endif + +#if (MBED_TRNG_SUPPORT == 1) +static bool useTRNG = true; +#endif void randomSeed(unsigned long seed) { +#if (MBED_TRNG_SUPPORT == 1) + useTRNG = false; +#endif if (seed != 0) { srandom(seed); } @@ -37,6 +63,11 @@ long random(long howbig) if (howbig == 0) { return 0; } +#if (MBED_TRNG_SUPPORT == 1) + if (useTRNG == true) { + return trng() % howbig; + } +#endif return random() % howbig; } @@ -48,3 +79,5 @@ long random(long howsmall, long howbig) long diff = howbig - howsmall; return random(diff) + howsmall; } + +#undef MBED_TRNG_SUPPORT diff --git a/cores/arduino/mbed/connectivity/cellular/include/cellular/framework/common/CellularCommon.h b/cores/arduino/mbed/connectivity/cellular/include/cellular/framework/common/CellularCommon.h index f0466e88c..96e25dc99 100644 --- a/cores/arduino/mbed/connectivity/cellular/include/cellular/framework/common/CellularCommon.h +++ b/cores/arduino/mbed/connectivity/cellular/include/cellular/framework/common/CellularCommon.h @@ -47,6 +47,26 @@ struct cell_signal_quality_t { } }; +struct cell_timeout_cb_t { + int timeout; /* configured timeout */ + int state; /* cellular state */ + cell_timeout_cb_t() + { + timeout = -1; + state = -1; + } +}; + +struct cell_retry_cb_t { + int retry_count; /* retry count */ + int state; /* cellular state */ + cell_retry_cb_t() + { + retry_count = -1; + state = -1; + } +}; + /** * Cellular specific event changes. * Connect and disconnect are handled via NSAPI_EVENT_CONNECTION_STATUS_CHANGE diff --git a/cores/arduino/mbed/connectivity/cellular/include/cellular/framework/device/CellularStateMachine.h b/cores/arduino/mbed/connectivity/cellular/include/cellular/framework/device/CellularStateMachine.h index 67912e463..aed9d615c 100644 --- a/cores/arduino/mbed/connectivity/cellular/include/cellular/framework/device/CellularStateMachine.h +++ b/cores/arduino/mbed/connectivity/cellular/include/cellular/framework/device/CellularStateMachine.h @@ -189,6 +189,8 @@ class CellularStateMachine { bool _command_success; bool _is_retry; cell_callback_data_t _cb_data; + cell_timeout_cb_t _timeout_cb_data; + cell_retry_cb_t _retry_cb_data; cellular_connection_status_t _current_event; int _status; PlatformMutex _mutex; diff --git a/cores/arduino/mbed/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.h b/cores/arduino/mbed/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.h index 4dd109894..8d8f54075 100644 --- a/cores/arduino/mbed/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.h +++ b/cores/arduino/mbed/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.h @@ -119,6 +119,12 @@ class WhdSTAInterface : public WiFiInterface, public EMACInterface { return 0; } + nsapi_error_t set_timeout(uint32_t timeout) + { + _timeout = timeout; + return NSAPI_ERROR_OK; + } + /** Set blocking status of interface. * Nonblocking mode unsupported. * @@ -257,6 +263,7 @@ class WhdSTAInterface : public WiFiInterface, public EMACInterface { nsapi_security_t _security; WHD_EMAC &_whd_emac; OlmInterface *_olm; + uint32_t _timeout; whd_interface_shared_info_t &_iface_shared; }; diff --git a/cores/arduino/mbed/connectivity/drivers/emac/TARGET_STM/stm32xx_emac.h b/cores/arduino/mbed/connectivity/drivers/emac/TARGET_STM/stm32xx_emac.h index cfa675217..ecc280b2f 100644 --- a/cores/arduino/mbed/connectivity/drivers/emac/TARGET_STM/stm32xx_emac.h +++ b/cores/arduino/mbed/connectivity/drivers/emac/TARGET_STM/stm32xx_emac.h @@ -148,6 +148,13 @@ class STM32_EMAC : public EMAC { */ virtual void set_memory_manager(EMACMemoryManager &mem_mngr); + /* return the status of the interface as integer */ + int get_interface_status() override; + /* return true if the interface is in the correct state to transmit */ + bool is_ready_to_tx() override; + /* restart only if the interface is in error state */ + void restart() override; + // Called from driver functions ETH_HandleTypeDef EthHandle; osThreadId_t thread; /**< Processing thread */ diff --git a/cores/arduino/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_version.h b/cores/arduino/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_version.h index 1caef23b6..5f69d8c3e 100755 --- a/cores/arduino/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_version.h +++ b/cores/arduino/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_version.h @@ -15,6 +15,7 @@ * limitations under the License. */ -#define WHD_VERSION "v1.94.0" +/* This define is used by arduino::WiFiClass::firmwareVersion() do not prepend v */ +#define WHD_VERSION "1.94.0" #define WHD_BRANCH "v1.94.0" #define WHD_DATE "2021-04-27 16:54:34 +0800" diff --git a/cores/arduino/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_wifi_api.h b/cores/arduino/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_wifi_api.h index f3b73214c..291bd23de 100755 --- a/cores/arduino/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_wifi_api.h +++ b/cores/arduino/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_wifi_api.h @@ -281,7 +281,7 @@ extern uint32_t whd_wifi_stop_scan(whd_interface_t ifp); * Error code if an error occurred */ extern uint32_t whd_wifi_join(whd_interface_t ifp, const whd_ssid_t *ssid, whd_security_t auth_type, - const uint8_t *security_key, uint8_t key_length); + const uint8_t *security_key, uint8_t key_length, uint32_t timeout); /** Joins a specific Wi-Fi network * diff --git a/cores/arduino/mbed/connectivity/netsocket/include/netsocket/EMAC.h b/cores/arduino/mbed/connectivity/netsocket/include/netsocket/EMAC.h index 515629b5a..885bc92c0 100644 --- a/cores/arduino/mbed/connectivity/netsocket/include/netsocket/EMAC.h +++ b/cores/arduino/mbed/connectivity/netsocket/include/netsocket/EMAC.h @@ -176,6 +176,17 @@ class EMAC { * @param mem_mngr Pointer to memory manager */ virtual void set_memory_manager(EMACMemoryManager &mem_mngr) = 0; + + virtual bool is_ready_to_tx() { + return true; + } + + virtual void restart() { + } + + virtual int get_interface_status() { + return -1; + } }; diff --git a/cores/arduino/mbed/connectivity/netsocket/include/netsocket/EMACInterface.h b/cores/arduino/mbed/connectivity/netsocket/include/netsocket/EMACInterface.h index 8cf47cb70..c06aeb850 100644 --- a/cores/arduino/mbed/connectivity/netsocket/include/netsocket/EMACInterface.h +++ b/cores/arduino/mbed/connectivity/netsocket/include/netsocket/EMACInterface.h @@ -83,6 +83,12 @@ class EMACInterface : public virtual NetworkInterface { /** @copydoc NetworkInterface::disconnect */ nsapi_error_t disconnect() override; + /** @copydoc NetworkInterface::get_hostname */ + const char *get_hostname() override; + + /** @copydoc NetworkInterface::set_hostname */ + nsapi_error_t set_hostname(const char *hostname) override; + /** @copydoc NetworkInterface::get_mac_address */ const char *get_mac_address() override; @@ -146,6 +152,8 @@ class EMACInterface : public virtual NetworkInterface { OnboardNetworkStack::Interface *_interface = nullptr; bool _dhcp = true; bool _blocking = true; + bool _hostname_set = false; + char _hostname[NSAPI_HOSTNAME_SIZE]; bool _hw_mac_addr_set = false; char _mac_address[NSAPI_MAC_SIZE]; char _ip_address[NSAPI_IPv6_SIZE] {}; diff --git a/cores/arduino/mbed/connectivity/netsocket/include/netsocket/ICMPSocket.h b/cores/arduino/mbed/connectivity/netsocket/include/netsocket/ICMPSocket.h index 1837bc8e0..5e1ee8fb0 100644 --- a/cores/arduino/mbed/connectivity/netsocket/include/netsocket/ICMPSocket.h +++ b/cores/arduino/mbed/connectivity/netsocket/include/netsocket/ICMPSocket.h @@ -37,6 +37,10 @@ class ICMPSocket : public InternetDatagramSocket { */ ICMPSocket(); +#if MBED_CONF_LWIP_RAW_SOCKET_ENABLED + int ping(SocketAddress &socketAddress, uint32_t timeout); +#endif + #if !defined(DOXYGEN_ONLY) protected: diff --git a/cores/arduino/mbed/connectivity/netsocket/include/netsocket/NetworkInterface.h b/cores/arduino/mbed/connectivity/netsocket/include/netsocket/NetworkInterface.h index 9071a1e40..22355767c 100644 --- a/cores/arduino/mbed/connectivity/netsocket/include/netsocket/NetworkInterface.h +++ b/cores/arduino/mbed/connectivity/netsocket/include/netsocket/NetworkInterface.h @@ -90,6 +90,24 @@ class NetworkInterface: public DNS { */ virtual void set_as_default(); + /** Get hostname. + * + * @return Hostname if configured, null otherwise + */ + virtual const char *get_hostname(); + + /** Set hostname. + * + * @param hostname Hostname string + * @retval NSAPI_ERROR_OK on success + * @retval NSAPI_ERROR_UNSUPPORTED if this feature is not supported + * @retval NSAPI_ERROR_PARAMETER if hostname is not valid + * @retval NSAPI_ERROR_BUSY if hostname couldn't be set (e.g. for + * LwIP stack, hostname can only be set before calling + * \c EthernetInterface::connect method) + */ + virtual nsapi_error_t set_hostname(const char *hostname); + /** Get the local MAC address. * * Provided MAC address is intended for info or debug purposes and diff --git a/cores/arduino/mbed/connectivity/netsocket/include/netsocket/TLSSocketWrapper.h b/cores/arduino/mbed/connectivity/netsocket/include/netsocket/TLSSocketWrapper.h index 2dc3b4b00..79fe5c564 100644 --- a/cores/arduino/mbed/connectivity/netsocket/include/netsocket/TLSSocketWrapper.h +++ b/cores/arduino/mbed/connectivity/netsocket/include/netsocket/TLSSocketWrapper.h @@ -379,6 +379,10 @@ class TLSSocketWrapper : public Socket { Socket *_transport; int _timeout = -1; + // Event flags + static const int READ_FLAG = 0x1u; + static const int WRITE_FLAG = 0x2u; + #ifdef MBEDTLS_X509_CRT_PARSE_C mbedtls_x509_crt *_cacert = nullptr; mbedtls_x509_crt *_clicert = nullptr; diff --git a/cores/arduino/mbed/connectivity/netsocket/include/netsocket/WiFiInterface.h b/cores/arduino/mbed/connectivity/netsocket/include/netsocket/WiFiInterface.h index 4fd7fc6fb..c13cab431 100644 --- a/cores/arduino/mbed/connectivity/netsocket/include/netsocket/WiFiInterface.h +++ b/cores/arduino/mbed/connectivity/netsocket/include/netsocket/WiFiInterface.h @@ -59,6 +59,13 @@ class WiFiInterface: public virtual NetworkInterface { */ virtual nsapi_error_t set_channel(uint8_t channel) = 0; + /** Set the Wi-Fi network join timeout. + * + * @param timeout joint timeout in milliseconds (Default: 7000). + * @return NSAPI_ERROR_OK on success, or error code on failure. + */ + virtual nsapi_error_t set_timeout(uint32_t timeout) = 0; + /** Get the current radio signal strength for active connection. * * @return Connection strength in dBm (negative value), diff --git a/cores/arduino/mbed/connectivity/netsocket/include/netsocket/nsapi_types.h b/cores/arduino/mbed/connectivity/netsocket/include/netsocket/nsapi_types.h index 3b496d508..28dbcc9a3 100644 --- a/cores/arduino/mbed/connectivity/netsocket/include/netsocket/nsapi_types.h +++ b/cores/arduino/mbed/connectivity/netsocket/include/netsocket/nsapi_types.h @@ -196,6 +196,16 @@ typedef enum nsapi_security { */ #define NSAPI_IP_BYTES NSAPI_IPv6_BYTES +/** Maximum size of hostname + * + * According to RFC 1034 [1], Section 3.1 "Name space specifications and + * terminology", 63 is the maximum size of a hostname. +1 for the string + * terminator. + * + * [1] https://www.rfc-editor.org/rfc/rfc1034 + */ +#define NSAPI_HOSTNAME_SIZE 64 + /** Maximum size of MAC address representation */ #define NSAPI_MAC_SIZE 18 diff --git a/cores/arduino/mbed/platform/include/platform/Callback.h b/cores/arduino/mbed/platform/include/platform/Callback.h index e76a4f197..3df0b9117 100644 --- a/cores/arduino/mbed/platform/include/platform/Callback.h +++ b/cores/arduino/mbed/platform/include/platform/Callback.h @@ -26,6 +26,14 @@ #include #include +#pragma GCC push_options +// This prevents the GCC compiler from applying optimizations that assume the code follows strict aliasing rules. +// In order to prevent bugs arising from undefined behavior that is tricky to find in the Callback implementation, +// or simply from compiler bugs in GCC. +#pragma GCC optimize("-fno-strict-aliasing") +// This prevents the GCC compiler from generating incorrect inline code for the Callback constructor. +#pragma GCC optimize("-fno-inline") + // Controlling switches from config: // MBED_CONF_PLATFORM_CALLBACK_NONTRIVIAL - support storing non-trivial function objects // MBED_CONF_PLATFORM_CALLBACK_COMPARABLE - support memcmp comparing stored objects (requires zero padding) @@ -835,4 +843,6 @@ Callback(R(*func)(const volatile T *, ArgTs...), const volatile U *arg) -> Callb } // namespace mbed +#pragma GCC pop_options + #endif diff --git a/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/objects.h b/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/objects.h index f5f44a58f..0231968bb 100644 --- a/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/objects.h +++ b/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/objects.h @@ -33,6 +33,7 @@ extern "C" { #include "pico/assert.h" #include "pico/time.h" #include "pico/types.h" +#include "pico/rand.h" #include "hardware/pwm.h" #include "hardware/adc.h" #include "hardware/resets.h" @@ -122,6 +123,12 @@ struct flash_s { uint32_t dummy; }; +#if DEVICE_TRNG +struct trng_s { + uint8_t not_used; +}; +#endif + typedef struct gpio_s gpio_t; typedef struct serial_s serial_t; diff --git a/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/hardware_sync/include/hardware/sync.h b/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/hardware_sync/include/hardware/sync.h index 8f91d5595..4f076aba0 100644 --- a/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/hardware_sync/include/hardware/sync.h +++ b/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/hardware_sync/include/hardware/sync.h @@ -70,6 +70,11 @@ typedef volatile uint32_t spin_lock_t; #define PICO_SPINLOCK_ID_HARDWARE_CLAIM 11 #endif +// PICO_CONFIG: PICO_SPINLOCK_ID_RAND, Spinlock ID for Random Number Generator, min=0, max=31, default=12, group=hardware_sync +#ifndef PICO_SPINLOCK_ID_RAND +#define PICO_SPINLOCK_ID_RAND 12 +#endif + // PICO_CONFIG: PICO_SPINLOCK_ID_OS1, First Spinlock ID reserved for use by low level OS style software, min=0, max=31, default=14, group=hardware_sync #ifndef PICO_SPINLOCK_ID_OS1 #define PICO_SPINLOCK_ID_OS1 14 diff --git a/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_platform/include/pico/platform.h b/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_platform/include/pico/platform.h index ee1d360ce..ea16d9734 100644 --- a/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_platform/include/pico/platform.h +++ b/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_platform/include/pico/platform.h @@ -151,14 +151,14 @@ extern "C" { * * For example a `uint32_t` foo that will retain its value if the program is restarted by reset. * - * uint32_t __uninitialized_ram("my_group_name") foo; + * uint32_t __uninitialized_ram(foo); * - * The section attribute is `.uninitialized_ram.` + * The section attribute is `.uninitialized_data.` * * \param group a string suffix to use in the section name to distinguish groups that can be linker * garbage-collected independently */ -#define __uninitialized_ram(group) __attribute__((section(".uninitialized_ram." #group))) group +#define __uninitialized_ram(group) __attribute__((section(".uninitialized_data." #group))) group /*! \brief Section attribute macro for placement in flash even in a COPY_TO_RAM binary * \ingroup pico_platform diff --git a/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/include/pico/rand.h b/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/include/pico/rand.h new file mode 100644 index 000000000..20fc6d6cb --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/include/pico/rand.h @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2022 Raspberry Pi (Trading) Ltd. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _PICO_RAND_H +#define _PICO_RAND_H + +#include "pico.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \file pico/rand.h + * \defgroup pico_rand pico_rand + * + * Random Number Generator API + * + * This module generates random numbers at runtime utilizing a number of possible entropy + * sources and uses those sources to modify the state of a 128-bit 'Pseudo + * Random Number Generator' implemented in software. + * + * The random numbers (32 to 128 bit) to be supplied are read from the PRNG which is used + * to help provide a large number space. + * + * The following (multiple) sources of entropy are available (of varying quality), each enabled by a #define: + * + * - The Ring Oscillator (ROSC) (\ref PICO_RAND_ENTROPY_SRC_ROSC == 1): + * \ref PICO_RAND_ROSC_BIT_SAMPLE_COUNT bits are gathered from the ring oscillator "random bit" and mixed in each + * time. This should not be used if the ROSC is off, or the processor is running from + * the ROSC. + * \note the maximum throughput of ROSC bit sampling is controlled by PICO_RAND_MIN_ROSC_BIT_SAMPLE_TIME_US which defaults + * to 10us, i.e. 100,000 bits per second. + * - Time (\ref PICO_RAND_ENTROPY_SRC_TIME == 1): The 64-bit microsecond timer is mixed in each time. + * - Bus Performance Counter (\ref PICO_RAND_ENTROPY_SRC_BUS_PERF_COUNTER == 1): One of the bus fabric's performance + * counters is mixed in each time. + * + * \note All entropy sources are hashed before application to the PRNG state machine. + * + * The \em first time a random number is requested, the 128-bit PRNG state + * must be seeded. Multiple entropy sources are also available for the seeding operation: + * + * - The Ring Oscillator (ROSC) (\ref PICO_RAND_SEED_ENTROPY_SRC_ROSC == 1): + * 64 bits are gathered from the ring oscillator "random bit" and mixed into the seed. + * - Time (\ref PICO_RAND_SEED_ENTROPY_SRC_TIME == 1): The 64-bit microsecond timer is mixed into the seed. + * - Board Identifier (PICO_RAND_SEED_ENTROPY_SRC_BOARD_ID == 1): The board id via \ref pico_get_unique_board_id + * is mixed into the seed. + * - RAM hash (\ref PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH (\ref PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH): The hashed contents of a + * subset of RAM are mixed in. Initial RAM contents are undefined on power up, so provide a reasonable source of entropy. + * By default the last 1K of RAM (which usually contains the core 0 stack) is hashed, which may also provide for differences + * after each warm reset. + * + * With default settings, the seed generation takes approximately 1 millisecond while + * subsequent random numbers generally take between 10 and 20 microseconds to generate. + * + * pico_rand methods may be safely called from either core or from an IRQ, but be careful in the latter case as + * the calls may block for a number of microseconds waiting on more entropy. + */ + +// --------------- +// ENTROPY SOURCES +// --------------- + +// PICO_CONFIG: PICO_RAND_ENTROPY_SRC_ROSC, Enable/disable use of ROSC as an entropy source, type=bool, default=1, group=pico_rand +#ifndef PICO_RAND_ENTROPY_SRC_ROSC +#define PICO_RAND_ENTROPY_SRC_ROSC 1 +#endif + +// PICO_CONFIG: PICO_RAND_ENTROPY_SRC_TIME, Enable/disable use of hardware timestamp as an entropy source, type=bool, default=1, group=pico_rand +#ifndef PICO_RAND_ENTROPY_SRC_TIME +#define PICO_RAND_ENTROPY_SRC_TIME 1 +#endif + +// PICO_CONFIG: PICO_RAND_ENTROPY_SRC_BUS_PERF_COUNTER, Enable/disable use of a bus performance counter as an entropy source, type=bool, default=1, group=pico_rand +#ifndef PICO_RAND_ENTROPY_SRC_BUS_PERF_COUNTER +#define PICO_RAND_ENTROPY_SRC_BUS_PERF_COUNTER 1 +#endif + +// -------------------- +// SEED ENTROPY SOURCES +// -------------------- + +// PICO_CONFIG: PICO_RAND_SEED_ENTROPY_SRC_ROSC, Enable/disable use of ROSC as an entropy source for the random seed, type=bool, default=1, group=pico_rand +#ifndef PICO_RAND_SEED_ENTROPY_SRC_ROSC +#define PICO_RAND_SEED_ENTROPY_SRC_ROSC PICO_RAND_ENTROPY_SRC_ROSC +#endif + +// PICO_CONFIG: PICO_RAND_SEED_ENTROPY_SRC_TIME, Enable/disable use of hardware timestamp as an entropy source for the random seed, type=bool, default=1, group=pico_rand +#ifndef PICO_RAND_SEED_ENTROPY_SRC_TIME +#define PICO_RAND_SEED_ENTROPY_SRC_TIME PICO_RAND_ENTROPY_SRC_TIME +#endif + +// PICO_CONFIG: PICO_RAND_SEED_ENTROPY_SRC_BOARD_ID, Enable/disable use of board id as part of the random seed, type=bool, default=1, group=pico_rand +#ifndef PICO_RAND_SEED_ENTROPY_SRC_BOARD_ID +#define PICO_RAND_SEED_ENTROPY_SRC_BOARD_ID 0 +#endif + +// PICO_CONFIG: PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH, Enable/disable use of a RAM hash as an entropy source for the random seed, type=bool, default=1, group=pico_rand +#ifndef PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH +#define PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH 1 +#endif + +// --------------------------------- +// PICO_RAND_ENTROPY_SRC_ROSC CONFIG +// --------------------------------- + +// PICO_CONFIG: PICO_RAND_ROSC_BIT_SAMPLE_COUNT, Number of samples to take of the ROSC random bit per random number generation , min=1, max=64, default=1, group=pico_rand +#ifndef PICO_RAND_ROSC_BIT_SAMPLE_COUNT +#define PICO_RAND_ROSC_BIT_SAMPLE_COUNT 1 +#endif + +// PICO_CONFIG: PICO_RAND_MIN_ROSC_BIT_SAMPLE_TIME_US, Define a default minimum time between sampling the ROSC random bit, min=5, max=20, default=10, group=pico_rand +#ifndef PICO_RAND_MIN_ROSC_BIT_SAMPLE_TIME_US +// (Arbitrary / tested) minimum time between sampling the ROSC random bit +#define PICO_RAND_MIN_ROSC_BIT_SAMPLE_TIME_US 10u +#endif + +// --------------------------------------------- +// PICO_RAND_ENTROPY_SRC_BUS_PERF_COUNTER CONFIG +// --------------------------------------------- + +// PICO_CONFIG: PICO_RAND_BUS_PERF_COUNTER_INDEX, Bus performance counter index to use for sourcing entropy, min=0, max=3, group=pico_rand +// this is deliberately undefined by default, meaning the code will pick that appears unused +//#define PICO_RAND_BUS_PERF_COUNTER_INDEX 0 + +// PICO_CONFIG: PICO_RAND_BUS_PERF_COUNTER_EVENT, Bus performance counter event to use for sourcing entropy, default=arbiter_sram5_perf_event_access, group=pico_rand +#ifndef PICO_RAND_BUS_PERF_COUNTER_EVENT +#define PICO_RAND_BUS_PERF_COUNTER_EVENT arbiter_sram5_perf_event_access +#endif + +// ------------------------------------------ +// PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH CONFIG +// ------------------------------------------ + +// PICO_CONFIG: PICO_RAND_RAM_HASH_END, end of address in RAM (non-inclusive) to hash during pico_rand seed initialization, default=SRAM_END, group=pico_rand +#ifndef PICO_RAND_RAM_HASH_END +#define PICO_RAND_RAM_HASH_END SRAM_END +#endif +// PICO_CONFIG: PICO_RAND_RAM_HASH_START, start of address in RAM (inclusive) to hash during pico_rand seed initialization, default=PICO_RAND_RAM_HASH_END - 1024, group=pico_rand +#ifndef PICO_RAND_RAM_HASH_START +#define PICO_RAND_RAM_HASH_START (PICO_RAND_RAM_HASH_END - 1024u) +#endif + +// We provide a maximum of 128 bits entropy in one go +typedef struct rng_128 { + uint64_t r[2]; +} rng_128_t; + +/*! \brief Get 128-bit random number + * \ingroup pico_rand + * + * This method may be safely called from either core or from an IRQ, but be careful in the latter case as + * the call may block for a number of microseconds waiting on more entropy. + * + * \param rand128 Pointer to storage to accept a 128-bit random number + */ +void get_rand_128(rng_128_t *rand128); + +/*! \brief Get 64-bit random number + * \ingroup pico_rand + * + * This method may be safely called from either core or from an IRQ, but be careful in the latter case as + * the call may block for a number of microseconds waiting on more entropy. + * + * \return 64-bit random number + */ +uint64_t get_rand_64(void); + +/*! \brief Get 32-bit random number + * \ingroup pico_rand + * + * This method may be safely called from either core or from an IRQ, but be careful in the latter case as + * the call may block for a number of microseconds waiting on more entropy. + * + * \return 32-bit random number + */ +uint32_t get_rand_32(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cy_result.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cy_result.h new file mode 100644 index 000000000..8277169ab --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cy_result.h @@ -0,0 +1,228 @@ +/***************************************************************************//** +* \file cy_result.h +* +* \brief +* Basic function result handling. Defines a simple type for conveying +* information about whether something succeeded or details about any issues +* that were detected. +* +******************************************************************************** +* \copyright +* Copyright 2018-2020 Cypress Semiconductor Corporation +* SPDX-License-Identifier: Apache-2.0 +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +/** +* \addtogroup group_result Result Type +* \ingroup group_abstraction +* \{ +* \anchor anchor_general_description +* \brief Defines a type and related utilities for function result handling. +* +* The @ref cy_rslt_t type is a structured bitfield which encodes information +* about result type, the originating module, and a code for the specific +* error (or warning etc). In order to extract these individual fields from +* a @ref cy_rslt_t value, the utility macros @ref CY_RSLT_GET_TYPE, @ref CY_RSLT_GET_MODULE, +* and @ref CY_RSLT_GET_CODE are provided. For example: +* \code +* cy_rslt_t result = cy_hal_do_operation(arg); +* // Will be CY_RSLT_TYPE_INFO, CY_RSLT_TYPE_WARNING, CY_RSLT_TYPE_ERROR, or CY_RSLT_TYPE_FATAL +* uint8_t type = CY_RSLT_GET_TYPE(result) +* // See the "Modules" section for possible values +* uint16_t module_id = CY_RSLT_GET_MODULE(result); +* // Specific error codes are defined by each module +* uint16_t error_code = CY_RSLT_GET_CODE(result); +* \endcode +*/ + +#if !defined(CY_RESULT_H) +#define CY_RESULT_H + +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +/** + * @brief Provides the result of an operation as a structured bitfield. + * + * See the \ref anchor_general_description "General Description" + * for more details on structure and usage. + */ +typedef uint32_t cy_rslt_t; + +/** @ref cy_rslt_t return value indicating success */ +#define CY_RSLT_SUCCESS ((cy_rslt_t)0x00000000U) + +/** \cond INTERNAL */ +/** Mask for the bit at position "x" */ +#define CY_BIT_MASK(x) ((1UL << (x)) - 1U) + +/** Bit position of the result type */ +#define CY_RSLT_TYPE_POSITION (16U) +/** Bit width of the result type */ +#define CY_RSLT_TYPE_WIDTH (2U) +/** Bit position of the module identifier */ +#define CY_RSLT_MODULE_POSITION (18U) +/** Bit width of the module identifier */ +#define CY_RSLT_MODULE_WIDTH (14U) +/** Bit position of the result code */ +#define CY_RSLT_CODE_POSITION (0U) +/** Bit width of the result code */ +#define CY_RSLT_CODE_WIDTH (16U) + +/** Mask for the result type */ +#define CY_RSLT_TYPE_MASK CY_BIT_MASK(CY_RSLT_TYPE_WIDTH) +/** Mask for the module identifier */ +#define CY_RSLT_MODULE_MASK CY_BIT_MASK(CY_RSLT_MODULE_WIDTH) +/** Mask for the result code */ +#define CY_RSLT_CODE_MASK CY_BIT_MASK(CY_RSLT_CODE_WIDTH) + +/** \endcond */ + +/** +* \{ +* @name Fields +* Utility macros for constructing result values and extracting individual fields from existing results. +*/ + +/** + * @brief Get the value of the result type field + * @param x the @ref cy_rslt_t value from which to extract the result type + */ +#define CY_RSLT_GET_TYPE(x) (((x) >> CY_RSLT_TYPE_POSITION) & CY_RSLT_TYPE_MASK) +/** + * @brief Get the value of the module identifier field + * @param x the @ref cy_rslt_t value from which to extract the module id + */ +#define CY_RSLT_GET_MODULE(x) (((x) >> CY_RSLT_MODULE_POSITION) & CY_RSLT_MODULE_MASK) +/** + * @brief Get the value of the result code field + * @param x the @ref cy_rslt_t value from which to extract the result code + */ +#define CY_RSLT_GET_CODE(x) (((x) >> CY_RSLT_CODE_POSITION) & CY_RSLT_CODE_MASK) + +/** + * @brief Create a new @ref cy_rslt_t value that encodes the specified type, module, and result code. + * @param type one of @ref CY_RSLT_TYPE_INFO, @ref CY_RSLT_TYPE_WARNING, + * @ref CY_RSLT_TYPE_ERROR, @ref CY_RSLT_TYPE_FATAL + * @param module Identifies the module where this result originated; see @ref anchor_modules "Modules". + * @param code a module-defined identifier to identify the specific situation that + * this result describes. + */ +#define CY_RSLT_CREATE(type, module, code) \ + ((((module) & CY_RSLT_MODULE_MASK) << CY_RSLT_MODULE_POSITION) | \ + (((code) & CY_RSLT_CODE_MASK) << CY_RSLT_CODE_POSITION) | \ + (((type) & CY_RSLT_TYPE_MASK) << CY_RSLT_TYPE_POSITION)) + +/** \} fields */ + +/** +* \{ +* @name Result Types +* Defines codes to identify the type of result. +*/ + +/** @brief The result code is informational-only */ +#define CY_RSLT_TYPE_INFO (0U) +/** @brief The result code is warning of a problem but will proceed */ +#define CY_RSLT_TYPE_WARNING (1U) +/** @brief The result code is an error */ +#define CY_RSLT_TYPE_ERROR (2U) +/** @brief The result code is a fatal error */ +#define CY_RSLT_TYPE_FATAL (3U) + +/** \} severity */ + +/** +* \{ +* @name Modules +* @anchor anchor_modules +* Defines codes to identify the module from which an error originated. +* For some large libraries, a range of module codes is defined here; +* see the library documentation for values corresponding to individual modules. +* Valid range is 0x0000-0x4000. +*/ +/**** DRIVER Module codes: 0x0000 - 0x00FF ****/ +/** Base module identifier for peripheral driver library drivers (0x0000 - 0x007F) */ +#define CY_RSLT_MODULE_DRIVERS_PDL_BASE (0x0000U) +/** Base module identifier for wireless host driver library modules (0x0080 - 0x00FF) */ +#define CY_RSLT_MODULE_DRIVERS_WHD_BASE (0x0080U) + +/** Deprecated. Use \ref CY_RSLT_MODULE_ABSTRACTION_HAL */ +#define CY_RSLT_MODULE_ABSTRACTION_HAL_BASE (0x0100U) +/** Module identifier for the Hardware Abstraction Layer */ +#define CY_RSLT_MODULE_ABSTRACTION_HAL (0x0100U) +/** Module identifier for board support package */ +#define CY_RSLT_MODULE_ABSTRACTION_BSP (0x0180U) +/** Module identifier for file system abstraction */ +#define CY_RSLT_MODULE_ABSTRACTION_FS (0x0181U) +/** Module identifier for resource abstraction */ +#define CY_RSLT_MODULE_ABSTRACTION_RESOURCE (0x0182U) +/** Module identifier for rtos abstraction */ +#define CY_RSLT_MODULE_ABSTRACTION_OS (0x0183U) +/** Base identifier for environment abstraction modules (0x0184 - 0x01FF) */ +#define CY_RSLT_MODULE_ABSTRACTION_ENV (0x0184U) + +/** Base module identifier for Board Libraries (0x01A0 - 0x01BF) */ +#define CY_RSLT_MODULE_BOARD_LIB_BASE (0x01A0U) +/** Module identifier for the Retarget IO Board Library */ +#define CY_RSLT_MODULE_BOARD_LIB_RETARGET_IO (0x1A0U) +/** Module identifier for the RGB LED Board Library */ +#define CY_RSLT_MODULE_BOARD_LIB_RGB_LED (0x01A1U) +/** Module identifier for the Serial Flash Board Library */ +#define CY_RSLT_MODULE_BOARD_LIB_SERIAL_FLASH (0x01A2U) +/** Module identifier for the WiFi Host Driver + Board Support Integration Library */ +#define CY_RSLT_MODULE_BOARD_LIB_WHD_INTEGRATION (0x01A3U) + +/** Base module identifier for Shield Board Libraries (0x01B8 - 0x01BF) */ +#define CY_RSLT_MODULE_BOARD_SHIELD_BASE (0x01B8U) +/** Module identifier for Shield Board CY8CKIT-028-EPD */ +#define CY_RSLT_MODULE_BOARD_SHIELD_028_EPD (0x01B8U) +/** Module identifier for Shield Board CY8CKIT-028-TFT */ +#define CY_RSLT_MODULE_BOARD_SHIELD_028_TFT (0x01B9U) +/** Module identifier for Shield Board CY8CKIT-032 */ +#define CY_RSLT_MODULE_BOARD_SHIELD_032 (0x01BAU) + +/** Base module identifier for Board Hardware Libraries (0x01C0 - 0x01FF) */ +#define CY_RSLT_MODULE_BOARD_HARDWARE_BASE (0x01C0U) +/** Module identifier for the BMI160 Motion Sensor Library */ +#define CY_RSLT_MODULE_BOARD_HARDWARE_BMI160 (0x01C0U) +/** Module identifier for the E2271CS021 E-Ink Controller Library */ +#define CY_RSLT_MODULE_BOARD_HARDWARE_E2271CS021 (0x01C1U) +/** Module identifier for the NTC GPIO Thermistor Library */ +#define CY_RSLT_MODULE_BOARD_HARDWARE_THERMISTOR (0x01C2U) +/** Module identifier for the SSD1306 OLED Controller Library */ +#define CY_RSLT_MODULE_BOARD_HARDWARE_SSD1306 (0x01C3U) +/** Module identifier for the ST7789V TFT Controller Library */ +#define CY_RSLT_MODULE_BOARD_HARDWARE_ST7789V (0x01C4U) +/** Module identifier for the Light Sensor Library */ +#define CY_RSLT_MODULE_BOARD_HARDWARE_LIGHT_SENSOR (0x01C5U) +/** Module identifier for the AK4954A Audio Codec Library */ +#define CY_RSLT_MODULE_BOARD_HARDWARE_AK4954A (0x01C6U) + +/** Base module identifier for Middleware Libraries (0x0200 - 0x02FF) */ +#define CY_RSLT_MODULE_MIDDLEWARE_BASE (0x0200U) + +/** \} modules */ + +#ifdef __cplusplus +} +#endif + +#endif /* CY_RESULT_H */ + +/** \} group_result */ diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyabs_rtos.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyabs_rtos.h new file mode 100644 index 000000000..e19ffc49f --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyabs_rtos.h @@ -0,0 +1,711 @@ +/***************************************************************************//** +* \file cyabs_rtos.h +* +* \brief +* Defines the Cypress RTOS Interface. Provides prototypes for functions that +* allow Cypress libraries to use RTOS resources such as threads, mutexes & +* timing functions in an abstract way. The APIs are implemented in the Port +* Layer RTOS interface which is specific to the RTOS in use. +* +******************************************************************************** +* \copyright +* Copyright 2018-2020 Cypress Semiconductor Corporation +* SPDX-License-Identifier: Apache-2.0 +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +#ifndef INCLUDED_CY_RTOS_INTERFACE_H_ +#define INCLUDED_CY_RTOS_INTERFACE_H_ + +#include "cyabs_rtos_impl.h" +#include "cy_result.h" +#include +#include +#include + +/** +* \defgroup group_abstraction_rtos_common Common + * General types and defines for working with the RTOS abstraction layer. +* \defgroup group_abstraction_rtos_mutex Mutex + * APIs for acquiring and working with Mutexes. +* \defgroup group_abstraction_rtos_queue Queue + * APIs for creating and working with Queues. +* \defgroup group_abstraction_rtos_semaphore Semaphore + * APIs for acquiring and working with Semaphores. +* \defgroup group_abstraction_rtos_threads Threads + * APIs for creating and working with Threads. +* \defgroup group_abstraction_rtos_time Time + * APIs for getting the current time and waiting. +* \defgroup group_abstraction_rtos_timer Timer + * APIs for creating and working with Timers. +*/ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*********************************************** CONSTANTS **********************************************/ + +/** + * \ingroup group_abstraction_rtos_common + * \{ + */ + +#if defined(DOXYGEN) +//#include "Template/cyabs_rtos_impl.h" + +/** Return value indicating success */ +#define CY_RSLT_SUCCESS ((cy_rslt_t)0x00000000U) +#endif + +/** Used with RTOS calls that require a timeout. This implies the call will never timeout. */ +#define CY_RTOS_NEVER_TIMEOUT ( (uint32_t)0xffffffffUL ) + +// +// Note on error strategy. If the error is a normal part of operation (timeouts, full queues, empty +// queues), the these errors are listed here and the abstraction layer implementation must map from the +// underlying errors to these. If the errors are special cases, the the error \ref CY_RTOS_GENERAL_ERROR +// will be returned and \ref cy_rtos_last_error() can be used to retrieve the RTOS specific error message. +// +/** Requested operation did not complete in the specified time */ +#define CY_RTOS_TIMEOUT CY_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CY_RSLT_MODULE_ABSTRACTION_OS, 0) +/** The RTOS could not allocate memory for the specified operation */ +#define CY_RTOS_NO_MEMORY CY_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CY_RSLT_MODULE_ABSTRACTION_OS, 1) +/** An error occured in the RTOS */ +#define CY_RTOS_GENERAL_ERROR CY_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CY_RSLT_MODULE_ABSTRACTION_OS, 2) +/** A bad argument was passed into the APIs */ +#define CY_RTOS_BAD_PARAM CY_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CY_RSLT_MODULE_ABSTRACTION_OS, 5) +/** A memory alignment issue was detected. Ensure memory provided is aligned per \ref CY_RTOS_ALIGNMENT_MASK */ +#define CY_RTOS_ALIGNMENT_ERROR CY_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CY_RSLT_MODULE_ABSTRACTION_OS, 6) + +/** \} group_abstraction_rtos_common */ + +/** + * \ingroup group_abstraction_rtos_queue + * \{ + */ + +/** The Queue is already full and can't accept any more items at this time */ +#define CY_RTOS_QUEUE_FULL CY_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CY_RSLT_MODULE_ABSTRACTION_OS, 3) +/** The Queue is empty and has nothing to remove */ +#define CY_RTOS_QUEUE_EMPTY CY_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CY_RSLT_MODULE_ABSTRACTION_OS, 4) + +/** \} group_abstraction_rtos_queue */ + +/*********************************************** TYPES **********************************************/ + +/** + * The state a thread can be in + * + * \ingroup group_abstraction_rtos_threads + */ +typedef enum cy_thread_state +{ + CY_THREAD_STATE_INACTIVE, /**< thread has not started or was terminated but not yet joined */ + CY_THREAD_STATE_READY, /**< thread can run, but is not currently */ + CY_THREAD_STATE_RUNNING, /**< thread is currently running */ + CY_THREAD_STATE_BLOCKED, /**< thread is blocked waiting for something */ + CY_THREAD_STATE_TERMINATED, /**< thread has terminated but not freed */ + CY_THREAD_STATE_UNKNOWN, /**< thread is in an unknown state */ +} cy_thread_state_t; + +/** + * The type of timer + * + * \ingroup group_abstraction_rtos_timer + */ +typedef enum cy_timer_trigger_type +{ + CY_TIMER_TYPE_PERIODIC, /**< called periodically until stopped */ + CY_TIMER_TYPE_ONCE, /**< called once only */ + cy_timer_type_periodic = CY_TIMER_TYPE_PERIODIC, /**< \deprecated replaced by \ref CY_TIMER_TYPE_PERIODIC */ + cy_timer_type_once = CY_TIMER_TYPE_ONCE, /**< \deprecated replaced by \ref CY_TIMER_TYPE_ONCE */ +} cy_timer_trigger_type_t; + +/** + * The type of a function that is the entry point for a thread + * + * @param[in] arg the argument passed from the thread create call to the entry function + * + * \ingroup group_abstraction_rtos_threads + */ +typedef void (*cy_thread_entry_fn_t)(cy_thread_arg_t arg); + +/** + * The callback function to be called by a timer + * + * \ingroup group_abstraction_rtos_timer + */ +typedef void (*cy_timer_callback_t)(cy_timer_callback_arg_t arg); + +/** + * Return the last error from the RTOS. + * + * The functions in the RTOS abstraction layer adhere to the Cypress return + * results calling convention. The underlying RTOS implementations will not but rather + * will have their own error code conventions. This function is provided as a service + * to the developer, mostly for debugging, and returns the underlying RTOS error code + * from the last RTOS abstraction layer that returned \ref CY_RTOS_GENERAL_ERROR. + * + * @return RTOS specific error code. + * + * \ingroup group_abstraction_rtos_common + */ +cy_rtos_error_t cy_rtos_last_error(); + +/*********************************************** Threads **********************************************/ + +/** + * \ingroup group_abstraction_rtos_threads + * \{ + */ + +/** Create a thread with specific thread argument. + * + * This function is called to startup a new thread. If the thread can exit, it must call + * \ref cy_rtos_exit_thread() just before doing so. All created threads that can terminate, either + * by themselves or forcefully by another thread MUST have \ref cy_rtos_join_thread() called on them + * by another thread in order to cleanup any resources that might have been allocated for them. + * + * @param[out] thread Pointer to a variable which will receive the new thread handle + * @param[in] entry_function Function pointer which points to the main function for the new thread + * @param[in] name String thread name used for a debugger + * @param[in] stack The buffer to use for the thread stack. This must be aligned to + * \ref CY_RTOS_ALIGNMENT_MASK with a size of at least \ref CY_RTOS_MIN_STACK_SIZE. + * If stack is null, cy_rtos_create_thread will allocate a stack from the heap. + * @param[in] stack_size The size of the thread stack in bytes + * @param[in] priority The priority of the thread. Values are operating system specific, but some + * common priority levels are defined: + * CY_THREAD_PRIORITY_LOW + * CY_THREAD_PRIORITY_NORMAL + * CY_THREAD_PRIORITY_HIGH + * @param[in] arg The argument to pass to the new thread + * + * @return The status of thread create request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_create_thread(cy_thread_t *thread, cy_thread_entry_fn_t entry_function, + const char *name, void *stack, uint32_t stack_size, cy_thread_priority_t priority, cy_thread_arg_t arg); + +/** Exit the current thread. + * + * This function is called just before a thread exits. In some cases it is sufficient + * for a thread to just return to exit, but in other cases, the RTOS must be explicitly + * signaled. In cases where a return is sufficient, this should be a null funcition. + * where the RTOS must be signaled, this function should perform that In cases operation. + * In code using RTOS services, this function should be placed at any at any location + * where the main thread function will return, exiting the thread. Threads that can + * exit must still be joined (\ref cy_rtos_join_thread) to ensure their resources are + * fully cleaned up. + * + * @return The status of thread exit request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_exit_thread(); + +/** Terminates another thread. + * + * This function is called to terminate another thread and reap the resources claimed + * by the thread. This should be called both when forcibly terminating another thread + * as well as any time a thread can exit on its own. For some RTOS implementations + * this is not required as the thread resources are claimed as soon as it exits. In + * other cases, this must be called to reclaim resources. Threads that are terminated + * must still be joined (\ref cy_rtos_join_thread) to ensure their resources are fully + * cleaned up. + * + * @param[in] thread Handle of the thread to terminate + * + * @returns The status of the thread terminate. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_terminate_thread(cy_thread_t *thread); + +/** Waits for a thread to complete. + * + * This must be called on any thread that can complete to ensure that any resources that + * were allocated for it are cleaned up. + * + * @param[in] thread Handle of the thread to wait for + * + * @returns The status of thread join request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_join_thread(cy_thread_t *thread); + +/** Checks if the thread is running + * + * This function is called to determine if a thread is actively running or not. For information on + * the thread state, use the \ref cy_rtos_get_thread_state() function. + * + * @param[in] thread Handle of the terminated thread to delete + * @param[out] running Returns true if the thread is running, otherwise false + * + * @returns The status of the thread running check. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_is_thread_running(cy_thread_t *thread, bool *running); + +/** Gets the state the thread is currently in + * + * This function is called to determine if a thread is running/blocked/inactive/ready etc. + * + * @param[in] thread Handle of the terminated thread to delete + * @param[out] state Returns the state the thread is currently in + * + * @returns The status of the thread state check. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_get_thread_state(cy_thread_t *thread, cy_thread_state_t *state); + +/** Get current thread handle + * + * Returns the unique thread handle of the current running thread. + * + * @param[out] thread Handle of the current running thread + * + * @returns The status of thread join request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_get_thread_handle(cy_thread_t *thread); + +/** \} group_abstraction_rtos_threads */ + +/*********************************************** Mutexes **********************************************/ + +/** + * \ingroup group_abstraction_rtos_mutex + * \{ + */ + +/** Create a recursive mutex. + * + * Creates a binary mutex which can be used to synchronize between threads + * and between threads and ISRs. Created mutexes are recursive and support priority inheritance. + * + * This function has been replaced by \ref cy_rtos_init_mutex2 which allow for specifying + * whether or not the mutex supports recursion or not. + * + * @param[out] mutex Pointer to the mutex handle to be initialized + * + * @return The status of mutex creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR] + */ +#define cy_rtos_init_mutex(mutex) cy_rtos_init_mutex2(mutex, true) + +/** Create a mutex which can support recursion or not. + * + * Creates a binary mutex which can be used to synchronize between threads and between threads and + * ISRs. Created mutexes can support priority inheritance if recursive. + * + * \note Not all RTOS implementations support non-recursive mutexes. In this case a recursive + * mutex will be created. + * + * @param[out] mutex Pointer to the mutex handle to be initialized + * @param[in] recursive Should the created mutex support recursion or not + * + * @return The status of mutex creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_init_mutex2(cy_mutex_t *mutex, bool recursive); + +/** Get a mutex. + * + * If the mutex is available, it is acquired and this function returned. + * If the mutex is not available, the thread waits until the mutex is available + * or until the timeout occurs. + * + * @note This function must not be called from an interrupt context as it may block. + * + * @param[in] mutex Pointer to the mutex handle + * @param[in] timeout_ms Maximum number of milliseconds to wait while attempting to get + * the mutex. Use the \ref CY_RTOS_NEVER_TIMEOUT constant to wait forever. + * Must be zero if in_isr is true. + * + * @return The status of the get mutex. Returns timeout if mutex was not acquired + * before timeout_ms period. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_TIMEOUT, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_get_mutex(cy_mutex_t *mutex, cy_time_t timeout_ms); + +/** Set a mutex. + * + * The mutex is released allowing any other threads waiting on the mutex to + * obtain the semaphore. + * + * @param[in] mutex Pointer to the mutex handle + * + * @return The status of the set mutex request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + * + */ +cy_rslt_t cy_rtos_set_mutex(cy_mutex_t *mutex); + +/** Deletes a mutex. + * + * This function frees the resources associated with a sempahore. + * + * @param[in] mutex Pointer to the mutex handle + * + * @return The status to the delete request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_deinit_mutex(cy_mutex_t *mutex); + +/** \} group_abstraction_rtos_mutex */ + +/*********************************************** Semaphores **********************************************/ + +/** + * \ingroup group_abstraction_rtos_semaphore + * \{ + */ + +/** + * Create a semaphore + * + * This is basically a counting semaphore. + * + * @param[in,out] semaphore Pointer to the semaphore handle to be initialized + * @param[in] maxcount The maximum count for this semaphore + * @param[in] initcount The initial count for this semaphore + * + * @return The status of the semaphore creation. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_init_semaphore(cy_semaphore_t *semaphore, uint32_t maxcount, uint32_t initcount); + +/** + * Get/Acquire a semaphore + * + * If the semaphore count is zero, waits until the semaphore count is greater than zero. + * Once the semaphore count is greater than zero, this function decrements + * the count and return. It may also return if the timeout is exceeded. + * + * @param[in] semaphore Pointer to the semaphore handle + * @param[in] timeout_ms Maximum number of milliseconds to wait while attempting to get + * the semaphore. Use the \ref CY_RTOS_NEVER_TIMEOUT constant to wait forever. Must + * be zero is in_isr is true + * @param[in] in_isr true if we are trying to get the semaphore from with an ISR + * @return The status of get semaphore operation [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_TIMEOUT, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_get_semaphore(cy_semaphore_t *semaphore, cy_time_t timeout_ms, bool in_isr); + +/** + * Set/Release a semaphore + * + * Increments the semaphore count, up to the maximum count for this semaphore. + * + * @param[in] semaphore Pointer to the semaphore handle + * @param[in] in_isr Value of true indicates calling from interrupt context + * Value of false indicates calling from normal thread context + * @return The status of set semaphore operation [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_set_semaphore(cy_semaphore_t *semaphore, bool in_isr); + +/** + * Get the count of a semaphore. + * + * Gets the number of available tokens on the semaphore. + * + * @param[in] semaphore Pointer to the semaphore handle + * @param[out] count Pointer to the return count + * @return The status of get semaphore count operation [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_get_count_semaphore(cy_semaphore_t *semaphore, size_t *count); + +/** + * Deletes a semaphore + * + * This function frees the resources associated with a semaphore. + * + * @param[in] semaphore Pointer to the semaphore handle + * + * @return The status of semaphore deletion [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_deinit_semaphore(cy_semaphore_t *semaphore); + +/** \} group_abstraction_rtos_semaphore */ + +/*********************************************** Events **********************************************/ + +/** + * \ingroup group_abstraction_rtos_event + * \{ + */ + +/** Create an event. + * + * This is an event which can be used to signal a set of threads + * with a 32 bit data element. + * + * @param[in,out] event Pointer to the event handle to be initialized + * + * @return The status of the event initialization request. + * [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_init_event(cy_event_t *event); + +/** Set the event flag bits. + * + * This is an event which can be used to signal a set of threads + * with a 32 bit data element. Any threads waiting on this event are released + * + * @param[in] event Pointer to the event handle + * @param[in] bits The value of the 32 bit flags + * @param[in] in_isr If true, this is called from an ISR, otherwise from a thread + * + * @return The status of the set request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_setbits_event(cy_event_t *event, uint32_t bits, bool in_isr) ; + +/** + * Clear the event flag bits + * + * This function clears bits in the event. + * + * @param[in] event Pointer to the event handle + * @param[in] bits Any bits set in this value, will be cleared in the event. + * @param[in] in_isr if true, this is called from an ISR, otherwise from a thread + * + * @return The status of the clear flags request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_clearbits_event(cy_event_t *event, uint32_t bits, bool in_isr) ; + +/** Get the event bits. + * + * Returns the current bits for the event. + * + * @param[in] event Pointer to the event handle + * @param[out] bits pointer to receive the value of the event flags + * + * @return The status of the get request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_getbits_event(cy_event_t *event, uint32_t *bits); + +/** Wait for the event and return bits. + * + * Waits for the event to be set and then returns the bits associated + * with the event, or waits for the given timeout period. + * @note This function returns if any bit in the set is set. + * + * @param[in] event Pointer to the event handle + * @param[in,out] bits pointer to receive the value of the event flags + * @param[in] clear if true, clear any bits set that cause the wait to return + * if false, do not clear bits + * @param[in] all if true, all bits in the initial bits value must be set to return + * if false, any one bit in the initial bits value must be set to return + * @param[in] timeout The amount of time to wait in milliseconds + * + * @return The status of the wait for event request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_waitbits_event(cy_event_t *event, uint32_t *bits, bool clear, bool all, cy_time_t timeout); + +/** Deinitialize a event. + * + * This function frees the resources associated with an event. + * + * @param[in] event Pointer to the event handle + * + * @return The status of the deletion request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_deinit_event(cy_event_t *event); + +/** \} group_abstraction_rtos_event */ + +/*********************************************** Queues **********************************************/ + +/** + * \ingroup group_abstraction_rtos_queue + * \{ + */ + +/** Create a queue. + * + * This is a queue of data where entries are placed on the back of the queue + * and removed from the front of the queue. + * + * @param[out] queue Pointer to the queue handle + * @param[in] length The maximum length of the queue in items + * @param[in] itemsize The size of each item in the queue. + * + * @return The status of the creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_init_queue(cy_queue_t *queue, size_t length, size_t itemsize); + +/** Put an item in a queue. + * + * This function puts an item in the queue. The item is copied + * into the queue using a memory copy and the data pointed to by item_ptr + * is no longer referenced once the call returns. + * + * @note If in_isr is true, timeout_ms must be zero. + * + * @param[in] queue Pointer to the queue handle + * @param[in] item_ptr Pointer to the item to place in the queue + * @param[in] timeout_ms The time to wait to place the item in the queue + * @param[in] in_isr If true this is being called from within and ISR + * + * @return The status of the creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR, \ref CY_RTOS_QUEUE_FULL] + */ +cy_rslt_t cy_rtos_put_queue(cy_queue_t *queue, const void *item_ptr, cy_time_t timeout_ms, bool in_isr); + +/** Gets an item in a queue. + * + * This function gets an item from the queue. The item is copied + * out of the queue into the memory provide by item_ptr. This space must be + * large enough to hold a queue entry as defined when the queue was initialized. + * + * @note If in_isr is true, timeout_ms must be zero. + * + * @param[in] queue Pointer to the queue handle + * @param[in] item_ptr Pointer to the memory for the item from the queue + * @param[in] timeout_ms The time to wait to get an item from the queue + * @param[in] in_isr If true this is being called from within an ISR + * + * @return The status of the creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_NO_MEMORY, \ref CY_RTOS_GENERAL_ERROR, \ref CY_RTOS_QUEUE_EMPTY] + */ +cy_rslt_t cy_rtos_get_queue(cy_queue_t *queue, void *item_ptr, cy_time_t timeout_ms, bool in_isr); + +/** Return the number of items in the queue. + * + * This function returns the number of items currently in the queue. + * + * @param[in] queue Pointer to the queue handle + * @param[out] num_waiting Pointer to the return count + * + * @return The status of the creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_count_queue(cy_queue_t *queue, size_t *num_waiting); + +/** Return the amount of empty space in the queue. + * + * This function returns the amount of empty space in the + * queue. For instance, if the queue was created with 10 entries max and there + * are currently 2 entries in the queue, this will return 8. + * + * @param[in] queue Pointer to the queue handle + * @param[out] num_spaces Pointer to the return count. + * + * @return The status of the creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_space_queue(cy_queue_t *queue, size_t *num_spaces); + +/** Reset the queue. + * + * This function sets the queue to empty. + * + * @param[in] queue pointer to the queue handle + * + * @return The status of the creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_reset_queue(cy_queue_t *queue); + +/** Deinitialize the queue handle. + * + * This function de-initializes the queue and returns all + * resources used by the queue. + * + * @param[in] queue Pointer to the queue handle + * + * @return The status of the creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_deinit_queue(cy_queue_t *queue); + +/** \} group_abstraction_rtos_queue */ + +/*********************************************** Timers **********************************************/ + +/** + * \ingroup group_abstraction_rtos_timer + * \{ + */ + +/** Create a new timer. + * + * This function initializes a timer object. + * @note The timer is not active until start is called. + * @note The callback may be (likely will be) called from a different thread. + * + * @param[out] timer Pointer to the timer handle to initialize + * @param[in] type Type of timer (periodic or once) + * @param[in] fun The function + * @param[in] arg Argument to pass along to the callback function + * + * @return The status of the creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_init_timer(cy_timer_t *timer, cy_timer_trigger_type_t type, + cy_timer_callback_t fun, cy_timer_callback_arg_t arg); + +/** Start a timer. + * + * @param[in] timer Pointer to the timer handle + * @param[in] num_ms The number of milliseconds to wait before the timer fires + * + * @return The status of the creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_start_timer(cy_timer_t *timer, cy_time_t num_ms); + +/** Stop a timer. + * + * @param[in] timer Pointer to the timer handle + * + * @return The status of the creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_stop_timer(cy_timer_t *timer); + +/** Returns state of a timer. + * + * @param[in] timer Pointer to the timer handle + * @param[out] state Return value for state, true if running, false otherwise + * + * @return The status of the creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_is_running_timer(cy_timer_t *timer, bool *state); + +/** Deinit the timer. + * + * This function deinitializes the timer and frees all consumed resources. + * + * @param[in] timer Pointer to the timer handle + * + * @return The status of the creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_deinit_timer(cy_timer_t *timer); + +/** \} group_abstraction_rtos_timer */ + +/*********************************************** Time **********************************************/ + +/** + * \ingroup group_abstraction_rtos_time + * \{ + */ + +/** Gets time in milliseconds since RTOS start. + * + * @note Since this is only 32 bits, it will roll over every 49 days, 17 hours, 2 mins, 47.296 seconds + * + * @param[out] tval Pointer to the struct to populate with the RTOS time + * + * @returns Time in milliseconds since the RTOS started. + */ +cy_rslt_t cy_rtos_get_time(cy_time_t *tval); + +/** Delay for a number of milliseconds. + * + * Processing of this function depends on the minimum sleep + * time resolution of the RTOS. The current thread should sleep for + * the longest period possible which is less than the delay required, + * then makes up the difference with a tight loop. + * + * @param[in] num_ms The number of milliseconds to delay for + * + * @return The status of the creation request. [\ref CY_RSLT_SUCCESS, \ref CY_RTOS_GENERAL_ERROR] + */ +cy_rslt_t cy_rtos_delay_milliseconds(cy_time_t num_ms); + +/** \} group_abstraction_rtos_time */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif +#endif /* ifndef INCLUDED_CY_RTOS_INTERFACE_H_ */ diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyabs_rtos_impl.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyabs_rtos_impl.h new file mode 100644 index 000000000..8b36a6884 --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyabs_rtos_impl.h @@ -0,0 +1,77 @@ +/***************************************************************************//** +* \file cyabs_rtos_impl.h +* +* \brief +* Internal definitions for RTOS abstraction layer +* +******************************************************************************** +* \copyright +* Copyright 2019-2020 Cypress Semiconductor Corporation +* SPDX-License-Identifier: Apache-2.0 +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + + +#ifndef INCLUDED_CYABS_RTOS_IMPL_H_ +#define INCLUDED_CYABS_RTOS_IMPL_H_ + +#include "cmsis_os2.h" +#include "rtx_os.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/****************************************************** +* Constants +******************************************************/ +#define CY_RTOS_MIN_STACK_SIZE 300 /** Minimum stack size in bytes */ +#define CY_RTOS_ALIGNMENT 0x00000008UL /** Minimum alignment for RTOS objects */ +#define CY_RTOS_ALIGNMENT_MASK 0x00000007UL /** Mask for checking the alignment of created RTOS objects */ + + +/****************************************************** +* Type Definitions +******************************************************/ + +/* RTOS thread priority */ +typedef enum +{ + CY_RTOS_PRIORITY_MIN = osPriorityNone, + CY_RTOS_PRIORITY_LOW = osPriorityLow, + CY_RTOS_PRIORITY_BELOWNORMAL = osPriorityBelowNormal, + CY_RTOS_PRIORITY_NORMAL = osPriorityNormal, + CY_RTOS_PRIORITY_ABOVENORMAL = osPriorityAboveNormal, + CY_RTOS_PRIORITY_HIGH = osPriorityHigh, + CY_RTOS_PRIORITY_REALTIME = osPriorityRealtime, + CY_RTOS_PRIORITY_MAX = osPriorityRealtime7 +} cy_thread_priority_t ; + +typedef osThreadId_t cy_thread_t; /** CMSIS definition of a thread handle */ +typedef void * cy_thread_arg_t; /** Argument passed to the entry function of a thread */ +typedef osMutexId_t cy_mutex_t; /** CMSIS definition of a mutex */ +typedef osSemaphoreId_t cy_semaphore_t; /** CMSIS definition of a semaphore */ +typedef osEventFlagsId_t cy_event_t; /** CMSIS definition of an event */ +typedef osMessageQueueId_t cy_queue_t; /** CMSIS definition of a message queue */ +typedef osTimerId_t cy_timer_t; /** CMSIS definition of a timer */ +typedef void * cy_timer_callback_arg_t; /** Argument passed to the timer callback function */ +typedef uint32_t cy_time_t; /** Time in milliseconds */ +typedef osStatus_t cy_rtos_error_t; /** CMSIS definition of a error status */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif +#endif /* ifndef INCLUDED_CYABS_RTOS_IMPL_H_ */ + diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyhal_gpio.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyhal_gpio.h new file mode 100644 index 000000000..08d4e5bfb --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyhal_gpio.h @@ -0,0 +1,247 @@ +/***************************************************************************//** +* \file cyhal_gpio.h +* +* \brief +* Provides a high level interface for interacting with the GPIO on Cypress devices. +* This interface abstracts out the chip specific details. If any chip specific +* functionality is necessary, or performance is critical the low level functions +* can be used directly. +* +******************************************************************************** +* \copyright +* Copyright 2018-2020 Cypress Semiconductor Corporation +* SPDX-License-Identifier: Apache-2.0 +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +/** +* \addtogroup group_hal_gpio GPIO (General Purpose Input Output) +* \ingroup group_hal +* \{ +* High level interface for configuring and interacting with general purpose input/outputs (GPIO). +* +* The GPIO driver provides functions to configure and initialize GPIO, and to read and write data to the pin. +* The driver also supports interrupt generation on GPIO signals with rising, falling or both edges. +* +* \note The APIs in this driver need not be used if a GPIO is to be used as an input or output of peripherals like I2C or PWM. +* The respective peripheral's driver will utilize the GPIO interface to configure and initialize its GPIO pins. +* +* \section subsection_gpio_features Features +* * Configurable GPIO pin direction - \ref cyhal_gpio_direction_t +* * Configurable GPIO pin drive modes - \ref cyhal_gpio_drive_mode_t +* * Configurable analog and digital characteristics +* * Configurable edge-triggered interrupts and callback assignment on GPIO events - \ref cyhal_gpio_event_t +* +* \section subsection_gpio_quickstart Quick Start +* \ref cyhal_gpio_init can be used for a simple GPIO initialization by providing the pin number (pin), pin direction (direction), +* pin drive mode (drive_mode) and the initial value on the pin (init_val). +* +* \section subsection_gpio_sample_snippets Code Snippets +* +* \subsection subsection_gpio_snippet_1 Snippet 1: Reading value from GPIO +* The following snippet initializes GPIO pin \ref P0_0 as an input with high impedance digital drive mode and initial value = false (low). A value is read +* from the pin and stored to a uint8_t variable (read_val). + +* \snippet gpio.c snippet_cyhal_gpio_read + +* \subsection subsection_gpio_snippet_2 Snippet 2: Writing value to a GPIO +* The following snippet initializes GPIO pin \ref P0_0 as an output pin with strong drive mode and initial value = false (low). +* A value = true (high) is written to the output driver. + +* \snippet gpio.c snippet_cyhal_gpio_write + +* \subsection subsection_gpio_snippet_3 Snippet 3: Reconfiguring a GPIO +* The following snippet shows how to reconfigure a GPIO pin during run-time using the firmware. The GPIO pin \ref P0_0 +* is first initialized as an output pin with strong drive mode. The pin is then reconfigured as an input with high impedance digital drive mode. +* \note \ref cyhal_gpio_configure only changes the direction and the drive_mode +* of the pin. Previously set pin value is retained. +* +* \snippet gpio.c snippet_cyhal_gpio_reconfigure + +* \subsection subsection_gpio_snippet_4 Snippet 4: Interrupts on GPIO events +* GPIO events can be mapped to an interrupt and assigned to a callback function. The callback function needs to be first registered and +* then the event needs to be enabled. +** The following snippet initializes GPIO pin \ref P0_0 as an input pin. It registers a callback function and enables detection +* of a falling edge event to trigger the callback. +* \note If no argument needs to be passed to the callback function then a NULL can be passed during registering.
+* +* \snippet gpio.c snippet_cyhal_gpio_interrupt +*/ + +#pragma once + +#include +#include +#include "cy_result.h" +#include "cyhal_hw_types.h" + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + + +/******************************************************************************* +* Defines +*******************************************************************************/ + +/** Integer representation of no connect pin (required to exist in all BSPs) */ +#define CYHAL_NC_PIN_VALUE (NC) + +/******************************************************************************* +* Enumerations +*******************************************************************************/ + +/** Pin events */ +typedef enum { + CYHAL_GPIO_IRQ_NONE = 0, /**< No interrupt */ + CYHAL_GPIO_IRQ_RISE = 1 << 0, /**< Interrupt on rising edge */ + CYHAL_GPIO_IRQ_FALL = 1 << 1, /**< Interrupt on falling edge */ + CYHAL_GPIO_IRQ_BOTH = (CYHAL_GPIO_IRQ_RISE | CYHAL_GPIO_IRQ_FALL), /**< Interrupt on both rising and falling edges */ +} cyhal_gpio_event_t; + +/** Pin direction */ +typedef enum { + CYHAL_GPIO_DIR_INPUT, /**< Input pin */ + CYHAL_GPIO_DIR_OUTPUT, /**< Output pin */ + CYHAL_GPIO_DIR_BIDIRECTIONAL, /**< Input and output pin */ +} cyhal_gpio_direction_t; + +/** Pin drive mode */ + +/** \note When the drive_mode of the pin is set to CYHAL_GPIO_DRIVE_PULL_NONE , + * it is set to CYHAL_GPIO_DRIVE_STRONG if the direction + * of the pin is CYHAL_GPIO_DIR_OUTPUT or CYHAL_GPIO_DIR_BIDIRECTIONAL. + * If not, the drive_mode of the pin is set to CYHAL_GPIO_DRIVE_NONE. + */ +typedef enum { + CYHAL_GPIO_DRIVE_NONE, /**< Digital Hi-Z. Input only. Input init value(s): 0 or 1 */ + CYHAL_GPIO_DRIVE_ANALOG, /**< Analog Hi-Z. Use only for analog purpose */ + CYHAL_GPIO_DRIVE_PULLUP, /**< Pull-up resistor. Input and output. Input init value(s): 1, output value(s): 0 */ + CYHAL_GPIO_DRIVE_PULLDOWN, /**< Pull-down resistor. Input and output. Input init value(s): 0, output value(s): 1 */ + CYHAL_GPIO_DRIVE_OPENDRAINDRIVESLOW, /**< Open-drain, Drives Low. Input and output. Input init value(s): 1, output value(s): 0 */ + CYHAL_GPIO_DRIVE_OPENDRAINDRIVESHIGH, /**< Open-drain, Drives High. Input and output. Input init value(s): 0, output value(s): 1 */ + CYHAL_GPIO_DRIVE_STRONG, /**< Strong output. Output only. Output init value(s): 0 or 1 */ + CYHAL_GPIO_DRIVE_PULLUPDOWN, /**< Pull-up and pull-down resistors. Input and output. Input init value(s): 0 or 1, output value(s): 0 or 1 */ + CYHAL_GPIO_DRIVE_PULL_NONE, /**< No Pull-up or pull-down resistors. Input and output. Input init value(s): 0 or 1, output value(s): 0 or 1 */ +} cyhal_gpio_drive_mode_t; + +/** GPIO callback function type */ +typedef void (*cyhal_gpio_event_callback_t)(void *callback_arg, cyhal_gpio_event_t event); + +/******************************************************************************* +* Functions +*******************************************************************************/ + +/** Initialize the GPIO pin
+ * See \ref subsection_gpio_snippet_1. + * + * @param[in] pin The GPIO pin to initialize + * @param[in] direction The pin direction + * @param[in] drive_mode The pin drive mode + * @param[in] init_val Initial value on the pin + * + * @return The status of the init request + * + * Guidance for using gpio drive modes ( \ref cyhal_gpio_drive_mode_t for details). + * For default use drive modes: + * Input GPIO direction - \ref CYHAL_GPIO_DRIVE_NONE + * Output GPIO direction - \ref CYHAL_GPIO_DRIVE_STRONG + * Bidirectional GPIO - \ref CYHAL_GPIO_DRIVE_PULLUPDOWN + * \warning Don't use \ref CYHAL_GPIO_DRIVE_STRONG for input GPIO direction. It may cause an overcurrent issue. + */ +cy_rslt_t cyhal_gpio_init(cyhal_gpio_t pin, cyhal_gpio_direction_t direction, cyhal_gpio_drive_mode_t drive_mode, bool init_val); + +/** Uninitialize the gpio peripheral and the cyhal_gpio_t object + * + * @param[in] pin Pin number + */ +void cyhal_gpio_free(cyhal_gpio_t pin); + +/** Configure the GPIO pin
+ * See \ref subsection_gpio_snippet_3. + * + * @param[in] pin The GPIO pin + * @param[in] direction The pin direction + * @param[in] drive_mode The pin drive mode + * + * @return The status of the configure request + */ +cy_rslt_t cyhal_gpio_configure(cyhal_gpio_t pin, cyhal_gpio_direction_t direction, cyhal_gpio_drive_mode_t drive_mode); + +/** Set the output value for the pin. This only works for output & in_out pins.
+ * See \ref subsection_gpio_snippet_2. + * + * @param[in] pin The GPIO object + * @param[in] value The value to be set (high = true, low = false) + */ +void cyhal_gpio_write(cyhal_gpio_t pin, bool value); + +/** Read the input value. This only works for \ref CYHAL_GPIO_DIR_INPUT & \ref CYHAL_GPIO_DIR_BIDIRECTIONAL pins.
+ * See \ref subsection_gpio_snippet_1. + * + * @param[in] pin The GPIO object + * @return The value of the IO (true = high, false = low) + */ +bool cyhal_gpio_read(cyhal_gpio_t pin); + +/** Toggle the output value
+ * See \ref subsection_gpio_snippet_4. + * @param[in] pin The GPIO object + */ +void cyhal_gpio_toggle(cyhal_gpio_t pin); + +/** Register/clear a callback handler for pin events
+ * + * This function will be called when one of the events enabled by \ref cyhal_gpio_enable_event occurs. + * + * See \ref subsection_gpio_snippet_4. + * + * @param[in] pin The pin number + * @param[in] callback The function to call when the specified event happens. Pass NULL to unregister the handler. + * @param[in] callback_arg Generic argument that will be provided to the callback when called, can be NULL + */ +void cyhal_gpio_register_callback(cyhal_gpio_t pin, cyhal_gpio_event_callback_t callback, void *callback_arg); + +/** Enable or Disable the specified GPIO event
+ * + * When an enabled event occurs, the function specified by \ref cyhal_gpio_register_callback will be called. + * + * See \ref subsection_gpio_snippet_4. + * + * @param[in] pin The GPIO object + * @param[in] event The GPIO event + * @param[in] intr_priority The priority for NVIC interrupt events + * @param[in] enable True to turn on interrupts, False to turn off + */ +void cyhal_gpio_enable_event(cyhal_gpio_t pin, cyhal_gpio_event_t event, uint8_t intr_priority, bool enable); + +/******************************************************************************* +* Backward compatibility macro. The following code is DEPRECATED and must +* not be used in new projects +*******************************************************************************/ +/** \cond INTERNAL */ +#define cyhal_gpio_register_irq(pin, priority, handler, handler_arg) cyhal_gpio_register_callback(pin, handler, handler_arg) +#define cyhal_gpio_irq_enable(pin, event, enable) cyhal_gpio_enable_event(pin, event, CYHAL_ISR_PRIORITY_DEFAULT, enable) +typedef cyhal_gpio_event_t cyhal_gpio_irq_event_t; +/** \endcond */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#ifdef CYHAL_GPIO_IMPL_HEADER +#include CYHAL_GPIO_IMPL_HEADER +#endif /* CYHAL_GPIO_IMPL_HEADER */ + +/** \} group_hal_gpio */ diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyhal_sdio.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyhal_sdio.h new file mode 100644 index 000000000..d5600efd9 --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyhal_sdio.h @@ -0,0 +1,366 @@ +/***************************************************************************//** +* \file cyhal_sdio.h +* +* \brief +* Provides a high level interface for interacting with the Cypress SDIO interface. +* This interface abstracts out the chip specific details. If any chip specific +* functionality is necessary, or performance is critical the low level functions +* can be used directly. +* +******************************************************************************** +* \copyright +* Copyright 2018-2020 Cypress Semiconductor Corporation +* SPDX-License-Identifier: Apache-2.0 +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +/** +* \addtogroup group_hal_sdio SDIO (Secure Digital Input Output) +* \ingroup group_hal +* \{ +* High level interface to the Secure Digital Input Output (SDIO). +* +* This driver allows commands to be sent over the SDIO bus; the supported commands +* can be found in \ref cyhal_sdio_command_t. Bulk data transfer is also supported +* via cyhal_sdio_bulk_transfer(). +* +* The SDIO protocol is an extension of the SD +* interface for general I/O functions. Refer to the SD Specifications Part 1 SDIO +* Specifications Version 4.10 for more information on the SDIO protocol and specifications. +* +* +* \section subsection_sdio_features Features +* * Supports 4-bit interface +* * Supports Ultra High Speed (UHS-I) mode +* * Supports Default Speed (DS), High Speed (HS), SDR12, SDR25 and SDR50 speed modes +* * Supports SDIO card interrupts in both 1-bit and 4-bit modes +* * Supports Standard capacity (SDSC), High capacity (SDHC) and Extended capacity (SDXC) memory +* +* \section subsection_sdio_quickstart Quick Start +* +* \ref cyhal_sdio_init initializes the SDIO peripheral and passes a pointer to the SDIO block through the **obj** object of type \ref cyhal_sdio_t. +* +* \section subsection_sdio_code_snippets Code Snippets +* +* \subsection subsection_sdio_use_case_1 Snippet1: Simple SDIO Initialization example +* The following snippet shows how to initialize the SDIO interface with a pre-defined configuration +* +* \snippet sdio.c snippet_cyhal_sdio_simple_init +* +* \subsection subsection_sdio_use_case_2 Snippet2: Configure Interrupt +* The following snippet shows how to configure an interrupt and handle specific events. Refer \ref cyhal_sdio_event_t for different types of events. +* +* \snippet sdio.c snippet_cyhal_sdio_interrupt_callback +* +* \subsection subsection_sdio_use_case_3 Snippet3: Sending Commands +* The following snippet shows how to send a particular command. Some steps of the card initialization have been provided for reference. Refer \ref cyhal_sdio_command_t for different commands. +* +* \snippet sdio.c snippet_cyhal_sdio_send_command +* +* \subsection subsection_sdio_use_case_4 Snippet4: Bulk Data Transfer +* The following snippet shows how to start a bulk data transfer. +* +* \snippet sdio.c snippet_cyhal_sdio_bulk_transfer +* +* \subsection subsection_sdio_use_case_5 Snippet5: Async Data Transfer +* +* The following snippet shows how to start an async data transfer. +* \snippet sdio.c snippet_cyhal_sdio_async_transfer +*/ + +#pragma once + +#include +#include +#include "cy_result.h" +#include "cyhal_hw_types.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* +* Defines +*******************************************************************************/ + +#define CYHAL_SDIO_RET_NO_ERRORS (0x00) /**< No error*/ +#define CYHAL_SDIO_RET_NO_SP_ERRORS (0x01) /**< Non-specific error code*/ +#define CYHAL_SDIO_RET_CMD_CRC_ERROR (0x02) /**< There was a CRC error on the Command/Response*/ +#define CYHAL_SDIO_RET_CMD_IDX_ERROR (0x04) /**< The index for the command didn't match*/ +#define CYHAL_SDIO_RET_CMD_EB_ERROR (0x08) /**< There was an end bit error on the command*/ +#define CYHAL_SDIO_RET_DAT_CRC_ERROR (0x10) /**< There was a data CRC Error*/ +#define CYHAL_SDIO_RET_CMD_TIMEOUT (0x20) /**< The command didn't finish before the timeout period was over*/ +#define CYHAL_SDIO_RET_DAT_TIMEOUT (0x40) /**< The data didn't finish before the timeout period was over*/ +#define CYHAL_SDIO_RET_RESP_FLAG_ERROR (0x80) /**< There was an error in the resposne flag for command 53*/ + +#define CYHAL_SDIO_CLOCK_ERROR (0x100) /**< Failed to initial clock for SDIO */ +#define CYHAL_SDIO_BAD_ARGUMENT (0x200) /**< Bad argument passed for SDIO */ +#define CYHAL_SDIO_SEMA_NOT_INITED (0x400) /**< Semaphore is not initiated */ +#define CYHAL_SDIO_FUNC_NOT_SUPPORTED (0x800) /**< Function is not supported */ +#define CYHAL_SDIO_CANCELED (0x1000) /**< Operation canceled */ +#define CYHAL_SDIO_PM_PENDING_ERROR (0x2000) /**< Transfer cannot be initiated after power mode transition allowed.*/ + +/* HAL return value defines */ + +/** \addtogroup group_hal_results_sdio SDIO HAL Results + * SDIO specific return codes + * \ingroup group_hal_results + * \{ *//** + */ + +/** Incorrect parameter value define */ +#define CYHAL_SDIO_RSLT_ERR_BAD_PARAM \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SDIO, CYHAL_SDIO_BAD_ARGUMENT)) +/** Clock initialization error define */ +#define CYHAL_SDIO_RSLT_ERR_CLOCK \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SDIO, CYHAL_SDIO_CLOCK_ERROR)) +/** Semaphore not initiated error define */ +#define CYHAL_SDIO_RSLT_ERR_SEMA_NOT_INITED \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SDIO, CYHAL_SDIO_SEMA_NOT_INITED)) +/** Error define based on SDIO lower function return value */ +#define CYHAL_SDIO_RSLT_ERR_FUNC_RET(retVal) \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SDIO, ((uint16_t)retVal))) +/** Define to indicate canceled operation */ +#define CYHAL_SDIO_RSLT_CANCELED \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SDIO, CYHAL_SDIO_CANCELED)) +/** Transfers are not allowed after the SDIO block has allowed power mode transition. */ +#define CYHAL_SDIO_RSLT_ERR_PM_PENDING \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SDIO, CYHAL_SDIO_PM_PENDING_ERROR)) + +/** + * \} + */ + + +/******************************************************************************* +* Enumerations +*******************************************************************************/ + +/** Commands that can be issued */ +typedef enum +{ + CYHAL_SDIO_CMD_GO_IDLE_STATE = 0, //!< Go to idle state + CYHAL_SDIO_CMD_SEND_RELATIVE_ADDR = 3, //!< Send a relative address + CYHAL_SDIO_CMD_IO_SEND_OP_COND = 5, //!< Send an OP IO + CYHAL_SDIO_CMD_SELECT_CARD = 7, //!< Send a card select + CYHAL_SDIO_CMD_GO_INACTIVE_STATE = 15, //!< Go to inactive state + CYHAL_SDIO_CMD_IO_RW_DIRECT = 52, //!< Perform a direct read/write + CYHAL_SDIO_CMD_IO_RW_EXTENDED = 53, //!< Perform an extended read/write +} cyhal_sdio_command_t; + +/** Types of transfer that can be performed */ +typedef enum +{ + CYHAL_READ, //!< Read from the card + CYHAL_WRITE //!< Write to the card +} cyhal_transfer_t; + +/** Types of events that could be asserted by SDIO */ +typedef enum { + /* Interrupt-based thread events */ + CYHAL_SDIO_CMD_COMPLETE = 0x00001, //!< Command Complete + CYHAL_SDIO_XFER_COMPLETE = 0x00002, //!< Host read/write transfer is complete + CYHAL_SDIO_BGAP_EVENT = 0x00004, //!< This bit is set when both read/write transaction is stopped + CYHAL_SDIO_DMA_INTERRUPT = 0x00008, //!< Host controller detects an SDMA Buffer Boundary during transfer + CYHAL_SDIO_BUF_WR_READY = 0x00010, //!< This bit is set if the Buffer Write Enable changes from 0 to 1 + CYHAL_SDIO_BUF_RD_READY = 0x00020, //!< This bit is set if the Buffer Read Enable changes from 0 to 1 + CYHAL_SDIO_CARD_INSERTION = 0x00040, //!< This bit is set if the Card Inserted in the Present State + CYHAL_SDIO_CARD_REMOVAL = 0x00080, //!< This bit is set if the Card Inserted in the Present State + CYHAL_SDIO_CARD_INTERRUPT = 0x00100, //!< The synchronized value of the DAT[1] interrupt input for SD mode + CYHAL_SDIO_INT_A = 0x00200, //!< Reserved: set to 0 + CYHAL_SDIO_INT_B = 0x00400, //!< Reserved: set to 0 + CYHAL_SDIO_INT_C = 0x00800, //!< Reserved: set to 0 + CYHAL_SDIO_RE_TUNE_EVENT = 0x01000, //!< Reserved: set to 0 + CYHAL_SDIO_FX_EVENT = 0x02000, //!< This status is set when R[14] of response register is set to 1 + CYHAL_SDIO_CQE_EVENT = 0x04000, //!< This status is set if Command Queuing/Crypto event has occurred + CYHAL_SDIO_ERR_INTERRUPT = 0x08000, //!< If any of the bits in the Error Interrupt Status register are set + + /* Non-interrupt-based thread events */ + CYHAL_SDIO_GOING_DOWN = 0x10000, //!< The interface is going away (eg: powering down for some period of time) + CYHAL_SDIO_COMING_UP = 0x20000, //!< The interface is back up (eg: came back from a low power state) + + CYHAL_SDIO_ALL_INTERRUPTS = 0x0E1FF, //!< Is used to enable/disable all interrupts events +} cyhal_sdio_event_t; + + +/******************************************************************************* +* Data Structures +*******************************************************************************/ + +/** @brief SDIO controller initial configuration */ +typedef struct +{ + uint32_t frequencyhal_hz; //!< Clock frequency, in hertz + uint16_t block_size; //!< Block size +} cyhal_sdio_cfg_t; + +/** Callback for SDIO events */ +typedef void (*cyhal_sdio_event_callback_t)(void *callback_arg, cyhal_sdio_event_t event); + + +/******************************************************************************* +* Data Structures +*******************************************************************************/ +/** Initialize the SDIO peripheral + * + * @param[out] obj Pointer to an SDIO object. + * The caller must allocate the memory for this object but the init + * function will initialize its contents. + * @param[out] clk The pin connected to the clk signal + * @param[in] cmd The pin connected to the command signal + * @param[in] data0 The pin connected to the data0 signal + * @param[in] data1 The pin connected to the data1 signal + * @param[in] data2 The pin connected to the data2 signal + * @param[in] data3 The pin connected to the data3 signal + * @return The status of the init request + * + * Returns \ref CY_RSLT_SUCCESS on successful operation. Refer \ref subsection_sdio_use_case_1 for more information. + */ +cy_rslt_t cyhal_sdio_init(cyhal_sdio_t *obj, cyhal_gpio_t cmd, cyhal_gpio_t clk, cyhal_gpio_t data0, cyhal_gpio_t data1, cyhal_gpio_t data2, cyhal_gpio_t data3); + +/** Release the SDIO block. + * + * @param[in,out] obj The SDIO object + */ +void cyhal_sdio_free(cyhal_sdio_t *obj); + +/** Configure the SDIO block with required parameters. Refer \ref cyhal_sdio_cfg_t for more information. + * + * @param[in,out] obj The SDIO object + * @param[in] config The SDIO configuration to apply + * @return The status of the configure request. + * + * Returns \ref CY_RSLT_SUCCESS on successful operation. + */ +cy_rslt_t cyhal_sdio_configure(cyhal_sdio_t *obj, const cyhal_sdio_cfg_t *config); + +/** Sends command to the SDIO device. See \ref cyhal_sdio_command_t for list of available commands. + * + * This will block until the command is completed. + * + * @param[in,out] obj The SDIO object + * @param[in] direction The direction of transfer (read/write) + * @param[in] command The command to send to the SDIO device + * @param[in] argument The argument to the command + * @param[out] response The response from the SDIO device + * @return The status of the command transfer. + * + * Returns \ref CY_RSLT_SUCCESS on successful operation. Refer \ref subsection_sdio_use_case_3 for more information. + */ +cy_rslt_t cyhal_sdio_send_cmd(const cyhal_sdio_t *obj, cyhal_transfer_t direction, cyhal_sdio_command_t command, uint32_t argument, uint32_t* response); + +/** Performs a bulk data transfer. Sends \ref CYHAL_SDIO_CMD_IO_RW_EXTENDED command (CMD=53) which allows writing and reading of a large number of I/O registers with a single command. + * + * This will block until the transfer is completed. + * + * @param[in,out] obj The SDIO object + * @param[in] direction The direction of transfer (read/write) + * @param[in] argument The argument to the command + * @param[in] data The data to send to the SDIO device. A bulk transfer is done in block + * size (default: 64 bytes) chunks for better performance. Therefore, + * the size of the data buffer passed into this function must be at least + * `length` bytes and a multiple of the block size. For example, when + * requesting to read 100 bytes of data with a block size 64 bytes, the + * data buffer needs to be at least 128 bytes. The first 100 bytes of data + * in the buffer will be the requested data. + * @param[in] length The number of bytes to send + * @param[out] response The response from the SDIO device + * @return The status of the bulk transfer operation. + * + * Returns \ref CY_RSLT_SUCCESS on successful operation. Refer \ref subsection_sdio_use_case_4 for more information. + */ +cy_rslt_t cyhal_sdio_bulk_transfer(cyhal_sdio_t *obj, cyhal_transfer_t direction, uint32_t argument, const uint32_t* data, uint16_t length, uint32_t* response); + +/** Performs a bulk asynchronous data transfer by issuing the \ref CYHAL_SDIO_CMD_IO_RW_EXTENDED command(CMD=53) to the SDIO block. + * After exiting this function the \ref CYHAL_SDIO_CMD_COMPLETE and \ref CYHAL_SDIO_XFER_COMPLETE events are not asserted. + * + * To complete the asynchronous transfer, call \ref cyhal_sdio_is_busy() + * until it returns false. + * The \ref CYHAL_SDIO_CMD_COMPLETE and \ref CYHAL_SDIO_XFER_COMPLETE events are enabled + * after the asynchronous transfer is complete and in the condition they were + * enabled in before the transfer operation started. Handle these events in the interrupt callback. + * + * When the transfer is complete, the \ref CYHAL_SDIO_XFER_COMPLETE event will be raised. + * See \ref cyhal_sdio_register_callback and \ref cyhal_sdio_enable_event. + * + * @param[in,out] obj The SDIO object + * @param[in] direction The direction of transfer (read/write) + * @param[in] argument The argument to the command + * @param[in] data The data to send to the SDIO device + * @param[in] length The number of bytes to send + * @return The status of the async tranfer operation. + * + * Returns \ref CY_RSLT_SUCCESS on successful operation. Refer \ref subsection_sdio_use_case_5 for more information. + */ +cy_rslt_t cyhal_sdio_transfer_async(cyhal_sdio_t *obj, cyhal_transfer_t direction, uint32_t argument, const uint32_t* data, uint16_t length); + +/** Checks if the specified SDIO is in use + * + * @param[in] obj The SDIO peripheral to check + * @return true if SDIO is in use. false, otherwise. + */ +bool cyhal_sdio_is_busy(const cyhal_sdio_t *obj); + +/** Abort an SDIO transfer + * + * @param[in] obj The SDIO peripheral to stop + * @return The status of the abort_async request. + * + * Returns \ref CY_RSLT_SUCCESS on successful operation. + */ +cy_rslt_t cyhal_sdio_abort_async(const cyhal_sdio_t *obj); + +/** Register an SDIO event callback to be invoked when the event is triggered. + * + * This function will be called when one of the events enabled by \ref cyhal_sdio_enable_event occurs. + * + * @param[in] obj The SDIO object + * @param[in] callback The callback function which will be invoked when the event triggers + * @param[in] callback_arg Generic argument that will be provided to the callback when executed + * + * Refer \ref subsection_sdio_use_case_2 for more implementation. + */ +void cyhal_sdio_register_callback(cyhal_sdio_t *obj, cyhal_sdio_event_callback_t callback, void *callback_arg); + +/** Enables callbacks to be triggered for specified SDIO events. Refer \ref cyhal_sdio_event_t for all events. + * + * @param[in] obj The SDIO object + * @param[in] event The SDIO event type + * @param[in] intr_priority The priority for NVIC interrupt events + * @param[in] enable Set to true to enable events, or false to disable them + * + * Refer \ref subsection_sdio_use_case_2 for more information. + */ +void cyhal_sdio_enable_event(cyhal_sdio_t *obj, cyhal_sdio_event_t event, uint8_t intr_priority, bool enable); + +/******************************************************************************* +* Backward compatibility macro. The following code is DEPRECATED and must +* not be used in new projects +*******************************************************************************/ +/** \cond INTERNAL */ +#define cyhal_sdio_register_irq cyhal_sdio_register_callback +#define cyhal_sdio_irq_enable(obj, event, enable) cyhal_sdio_enable_event(obj, event, CYHAL_ISR_PRIORITY_DEFAULT, enable) +typedef cyhal_sdio_event_t cyhal_sdio_irq_event_t; +typedef cyhal_sdio_event_callback_t cyhal_sdio_irq_handler_t; +/** \endcond */ + +#if defined(__cplusplus) +} +#endif + +#ifdef CYHAL_SDIO_IMPL_HEADER +#include CYHAL_SDIO_IMPL_HEADER +#endif /* CYHAL_SDIO_IMPL_HEADER */ + +/** \} group_hal_sdio */ diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyhal_spi.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyhal_spi.h new file mode 100644 index 000000000..f5ba47669 --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface/cyhal_spi.h @@ -0,0 +1,383 @@ +/***************************************************************************//** +* \file cyhal_spi.h +* +* \brief +* Provides a high level interface for interacting with the Cypress SPI. +* This interface abstracts out the chip specific details. If any chip specific +* functionality is necessary, or performance is critical the low level functions +* can be used directly. +* +******************************************************************************** +* \copyright +* Copyright 2018-2020 Cypress Semiconductor Corporation +* SPDX-License-Identifier: Apache-2.0 +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +/** +* \addtogroup group_hal_spi SPI (Serial Peripheral Interface) +* \ingroup group_hal +* \{ +* High level interface for interacting with the Serial Peripheral Interface (SPI). +* +* The SPI protocol is a synchronous serial interface protocol. Devices operate +* in either master or slave mode. The master initiates the data transfer. +* +* Motorola SPI modes 0, 1, 2, and 3 are supported, with either MSB or LSB first. +* The operating mode and data frame size can be configured via \ref cyhal_spi_cfg_t. +* +* \section section_spi_features Features +* * Supports master and slave functionality. +* * Supports Motorola modes - 0, 1, 2 and 3 - \ref cyhal_spi_mode_t +* * MSb or LSb first shift direction - \ref cyhal_spi_mode_t +* * Master supports up to four slave select lines +* * Supports data frame size of 8 or 16 bits +* * Configurable interrupt and callback assignment on SPI events: +* Data transfer to FIFO complete, Transfer complete and Transmission error - \ref cyhal_spi_event_t +* * Supports changing baud rate of the transaction in run time. +* * Provides functions to send/receive a single byte or block of data. +* +* \section section_spi_quickstart Quick Start +* +* Initialise a SPI master or slave interface using \ref cyhal_spi_init() and provide the SPI pins (mosi, miso, sclk, ssel), +* number of bits per frame (data_bits) and SPI Motorola mode. The data rate can be set using \ref cyhal_spi_set_frequency().
+* See \ref section_spi_snippets for code snippets to send or receive the data. +* +* \section section_spi_snippets Code snippets +* +* \subsection subsection_spi_snippet_1 Snippet 1: SPI Master - Single byte transfer operation (Read and Write) +* The following code snippet initializes an SPI Master interface using the \ref cyhal_spi_init(). The data rate of transfer is set using \ref cyhal_spi_set_frequency(). +* The code snippet shows how to transfer a single byte of data using \ref cyhal_spi_send() and \ref cyhal_spi_recv(). +* \snippet spi.c snippet_cyhal_spi_master_byte_operation +* +* \subsection subsection_spi_snippet_2 Snippet 2: SPI Slave - Single byte transfer operation (Read and Write) +* The following code snippet initializes an SPI Slave interface using the \ref cyhal_spi_init(). The data rate of transfer is set using \ref cyhal_spi_set_frequency. +* The code snippet shows how to transfer a single byte of data using \ref cyhal_spi_send() and \ref cyhal_spi_recv. +* \snippet spi.c snippet_cyhal_spi_slave_byte_operation +* +* \subsection subsection_spi_snippet_3 Snippet 3: SPI Block Data transfer +* The following snippet sends and receives an array of data in a single SPI transaction using \ref cyhal_spi_transfer(). The example +* uses SPI master to transmit 5 bytes of data and receive 5 bytes of data in a single transaction. +* \snippet spi.c snippet_cyhal_spi_block_data_transfer +* +* \subsection subsection_spi_snippet_4 Snippet 4: Interrupts on SPI events +* SPI interrupt events ( \ref cyhal_spi_event_t) can be mapped to an interrupt and assigned to a callback function. +* The callback function needs to be first registered and then the event needs to be enabled. +* The following snippet initialises a SPI master to perform a block transfer using \ref cyhal_spi_transfer_async(). This is a non-blocking function. +* A callback function is registered using \ref cyhal_spi_register_callback to notify whenever the SPI transfer is complete. +* \snippet spi.c snippet_cyhal_spi_interrupt_callback_events + +* \section subsection_spi_moreinfor More Information +* +* * mtb-example-psoc6-spi-master: This example project demonstrates +* use of SPI (HAL) resource in PSoC® 6 MCU in Master mode to write data to an SPI slave. +* +*/ + +#pragma once + +#include +#include +#include "cy_result.h" +#include "cyhal_hw_types.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** \addtogroup group_hal_results_spi SPI HAL Results + * SPI specific return codes + * \ingroup group_hal_results + * \{ *//** + */ + +/** Bad argument */ +#define CYHAL_SPI_RSLT_BAD_ARGUMENT \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SPI, 0)) +/** Failed to initialize SPI clock */ +#define CYHAL_SPI_RSLT_CLOCK_ERROR \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SPI, 1)) +/** Failed to Transfer SPI data */ +#define CYHAL_SPI_RSLT_TRANSFER_ERROR \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SPI, 2)) +/** Provided clock is not supported by SPI */ +#define CYHAL_SPI_RSLT_CLOCK_NOT_SUPPORTED \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SPI, 3)) +/** Provided PIN configuration is not supported by SPI */ +#define CYHAL_SPI_RSLT_PIN_CONFIG_NOT_SUPPORTED \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SPI, 5)) +/** Provided PIN configuration is not supported by SPI */ +#define CYHAL_SPI_RSLT_INVALID_PIN_API_NOT_SUPPORTED \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SPI, 6)) +/** The requested resource type is invalid */ +#define CYHAL_SPI_RSLT_ERR_INVALID_PIN \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SPI, 7)) +/** Cannot configure SSEL signal */ +#define CYHAL_SPI_RSLT_ERR_CANNOT_CONFIG_SSEL \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SPI, 8)) +/** Cannot switch SSEL - device is busy or incorrect pin provided */ +#define CYHAL_SPI_RSLT_ERR_CANNOT_SWITCH_SSEL \ + (CYHAL_RSLT_CREATE(CY_RSLT_TYPE_ERROR, CYHAL_RSLT_MODULE_SPI, 9)) + +/** + * \} + */ + +/** Compatibility define for cyhal_spi_set_frequency. */ +#define cyhal_spi_frequency cyhal_spi_set_frequency + +/** SPI interrupt triggers */ +typedef enum { + /** All transfer data has been moved into data FIFO */ + CYHAL_SPI_IRQ_DATA_IN_FIFO = 1 << 1, + /** Transfer complete. */ + CYHAL_SPI_IRQ_DONE = 1 << 2, + /** An error occurred while transferring data */ + CYHAL_SPI_IRQ_ERROR = 1 << 3, +} cyhal_spi_event_t; + +/** SPI Slave Select polarity */ +typedef enum { + /** SSEL signal is active low */ + CYHAL_SPI_SSEL_ACTIVE_LOW = 0, + /** SSEL signal is active high */ + CYHAL_SPI_SSEL_ACTIVE_HIGH = 1, +} cyhal_spi_ssel_polarity_t; + +/** Handler for SPI interrupts */ +typedef void (*cyhal_spi_event_callback_t)(void *callback_arg, cyhal_spi_event_t event); + +/** Flag for SPI \ref cyhal_spi_mode_t values indicating that the LSB is sent first. */ +#define CYHAL_SPI_MODE_FLAG_LSB (0x01u) +/** Flag for SPI \ref cyhal_spi_mode_t values indicating that the CPHA=1. */ +#define CYHAL_SPI_MODE_FLAG_CPHA (0x02u) +/** Flag for SPI \ref cyhal_spi_mode_t values indicating that the CPOL=1. */ +#define CYHAL_SPI_MODE_FLAG_CPOL (0x04u) +/** Creates a \ref cyhal_spi_mode_t value given the cpol, cpha, lsb values. */ +#define CYHAL_SPI_MODE(cpol, cpha, lsb) (((cpol > 0) ? CYHAL_SPI_MODE_FLAG_CPOL : 0) | \ + ((cpha > 0) ? CYHAL_SPI_MODE_FLAG_CPHA : 0) | \ + (( lsb > 0) ? CYHAL_SPI_MODE_FLAG_LSB : 0)) + +/** SPI operating modes */ +typedef enum +{ + /** Standard motorola SPI CPOL=0, CPHA=0 with MSB first operation */ + CYHAL_SPI_MODE_00_MSB = CYHAL_SPI_MODE(0, 0, 0), + /** Standard motorola SPI CPOL=0, CPHA=0 with LSB first operation */ + CYHAL_SPI_MODE_00_LSB = CYHAL_SPI_MODE(0, 0, 1), + /** Standard motorola SPI CPOL=0, CPHA=1 with MSB first operation */ + CYHAL_SPI_MODE_01_MSB = CYHAL_SPI_MODE(0, 1, 0), + /** Standard motorola SPI CPOL=0, CPHA=1 with LSB first operation */ + CYHAL_SPI_MODE_01_LSB = CYHAL_SPI_MODE(0, 1, 1), + /** Standard motorola SPI CPOL=1, CPHA=0 with MSB first operation */ + CYHAL_SPI_MODE_10_MSB = CYHAL_SPI_MODE(1, 0, 0), + /** Standard motorola SPI CPOL=1, CPHA=0 with LSB first operation */ + CYHAL_SPI_MODE_10_LSB = CYHAL_SPI_MODE(1, 0, 1), + /** Standard motorola SPI CPOL=1, CPHA=1 with MSB first operation */ + CYHAL_SPI_MODE_11_MSB = CYHAL_SPI_MODE(1, 1, 0), + /** Standard motorola SPI CPOL=1, CPHA=1 with LSB first operation */ + CYHAL_SPI_MODE_11_LSB = CYHAL_SPI_MODE(1, 1, 1), +} cyhal_spi_mode_t; + +/** @brief Initial SPI configuration. */ +typedef struct +{ + cyhal_spi_mode_t mode; //!< The operating mode + uint8_t data_bits; //!< The number of bits per transfer + bool is_slave; //!< Whether the peripheral is operating as slave or master +} cyhal_spi_cfg_t; + +/** Initialize the SPI peripheral + * + * Configures the pins used by SPI, sets a default format and frequency, and enables the peripheral + * @param[out] obj Pointer to a SPI object. The caller must allocate the memory + * for this object but the init function will initialize its contents. + * @param[in] mosi The pin to use for MOSI + * @note At least MOSI or MISO pin should be non-NC + * @param[in] miso The pin to use for MISO + * @note At least MOSI or MISO pin should be non-NC + * @param[in] sclk The pin to use for SCLK + * @note This pin cannot be NC + * @param[in] ssel The pin to use for SSEL + * @note Provided pin will be configured for \ref CYHAL_SPI_SSEL_ACTIVE_LOW polarity and set as active. This can be changed + * (as well as additional ssel pins can be added) by \ref cyhal_spi_slave_select_config and \ref cyhal_spi_select_active_ssel + * functions. This pin can be NC. + * @param[in] clk The clock to use can be shared, if not provided a new clock will be allocated + * @param[in] bits The number of bits per frame + * @note bits should be 8 or 16 + * @param[in] mode The SPI mode (clock polarity, phase, and shift direction) + * @param[in] is_slave false for master mode or true for slave mode operation + * @return The status of the init request + */ +cy_rslt_t cyhal_spi_init(cyhal_spi_t *obj, cyhal_gpio_t mosi, cyhal_gpio_t miso, cyhal_gpio_t sclk, cyhal_gpio_t ssel, + const cyhal_clock_t *clk, uint8_t bits, cyhal_spi_mode_t mode, bool is_slave); + +/** Release a SPI object + * + * Return the peripheral, pins and clock owned by the SPI object to their reset state + * @param[in,out] obj The SPI object to deinitialize + */ +void cyhal_spi_free(cyhal_spi_t *obj); + +/** Set the SPI baud rate + * + * Actual frequency may differ from the desired frequency due to available dividers and bus clock + * Configures the SPI peripheral's baud rate + * @param[in,out] obj The SPI object to configure + * @param[in] hz The baud rate in Hz + * @return The status of the set_frequency request + */ +cy_rslt_t cyhal_spi_set_frequency(cyhal_spi_t *obj, uint32_t hz); + +/** Configures provided ssel pin to work as SPI slave select with specified polarity. + * + * Multiple pins can be configured as SPI slave select pins. Please refer to device datasheet for details. Switching + * between configured slave select pins is done by \ref cyhal_spi_select_active_ssel function. + * Unless modified with this function, the SSEL pin provided as part of \ref cyhal_spi_init is the default. + * @param[in] obj The SPI object to add slave select for + * @param[in] ssel Slave select pin to be added + * @param[in] polarity Polarity of slave select + * @return The status of ssel pin configuration + */ +cy_rslt_t cyhal_spi_slave_select_config(cyhal_spi_t *obj, cyhal_gpio_t ssel, cyhal_spi_ssel_polarity_t polarity); + +/** Selects an active slave select line from one of available. + * + * This function is applicable for the master and slave. + * SSEL pin should be configured by \ref cyhal_spi_slave_select_config or \ref cyhal_spi_init functions prior + * to selecting it as active. The active slave select line will automatically be toggled as part of any transfer. + * @param[in] obj The SPI object for switching + * @param[in] ssel Slave select pin to be set as active + * @return CY_RSLT_SUCCESS if slave select was switched successfully, otherwise - CYHAL_SPI_RSLT_ERR_CANNOT_SWITCH_SSEL + */ +cy_rslt_t cyhal_spi_select_active_ssel(cyhal_spi_t *obj, cyhal_gpio_t ssel); + +/** Synchronously get a received value out of the SPI receive buffer + * + * In Master mode - transmits fill-in value and read the data from RxFifo + * In Slave mode - Blocks until a value is available + * + * @param[in] obj The SPI peripheral to read + * @param[in] value The value received + * @return The status of the read request + * @note + * - In Master mode, MISO pin required to be non-NC for this API to operate + * - In Slave mode, MOSI pin required to be non-NC for this API to operate + */ +cy_rslt_t cyhal_spi_recv(cyhal_spi_t *obj, uint32_t* value); + +/** Synchronously send a byte out + * + * In Master mode transmits value to slave and read/drop a value from the RxFifo. + * In Slave mode writes a value to TxFifo + * + * @param[in] obj The SPI peripheral to use for sending + * @param[in] value The value to send + * @return The status of the write request + * @note + * - In Master mode, MOSI pin required to be non-NC for this API to operate + * - In Slave mode, MISO pin required to be non-NC for this API to operate + */ +cy_rslt_t cyhal_spi_send(cyhal_spi_t *obj, uint32_t value); + +/** Synchronously Write a block out and receive a value + * + * The total number of bytes sent and received will be the maximum of tx_length + * and rx_length. The bytes written will be padded (at the end) with the value + * given by write_fill. + * + * This function will block for the duration of the transfer. \ref cyhal_spi_transfer_async + * can be used for non-blocking transfers. + * + * @param[in] obj The SPI peripheral to use for sending + * @param[in] tx Pointer to the byte-array of data to write to the device + * @param[in,out] tx_length Number of bytes to write, updated with the number actually written + * @param[out] rx Pointer to the byte-array of data to read from the device + * @param[in,out] rx_length Number of bytes to read, updated with the number actually read + * @param[in] write_fill Default data transmitted while performing a read + * @return The status of the transfer request + * @note Both MOSI and MISO pins required to be non-NC for this API to operate + */ +cy_rslt_t cyhal_spi_transfer(cyhal_spi_t *obj, const uint8_t *tx, size_t tx_length, uint8_t *rx, size_t rx_length, uint8_t write_fill); + +/** Start an asynchronous SPI transfer. + * + * This will transfer `rx_length` bytes into the buffer pointed to by `rx`, while simultaneously transfering + * `tx_length` bytes of data from the buffer pointed to by `tx`, both in the background. + * When the transfer is complete, the @ref CYHAL_SPI_IRQ_DONE event will be raised. + * See @ref cyhal_spi_register_callback and @ref cyhal_spi_enable_event. + * \note For blocking transfers cyhal_spi_transfer can be used. + * + * @param[in] obj The SPI object that holds the transfer information + * @param[in] tx The transmit buffer + * @param[in,out] tx_length The number of bytes to transmit + * @param[out] rx The receive buffer + * @param[in,out] rx_length The number of bytes to receive + * @return The status of the transfer_async request + * @note Both MOSI and MISO pins required to be non-NC for this API to operate + */ +cy_rslt_t cyhal_spi_transfer_async(cyhal_spi_t *obj, const uint8_t *tx, size_t tx_length, uint8_t *rx, size_t rx_length); + +/** Checks if the specified SPI peripheral is in use + * + * @param[in] obj The SPI peripheral to check + * @return Indication of whether the SPI is still transmitting + */ +bool cyhal_spi_is_busy(cyhal_spi_t *obj); + +/** Abort an SPI transfer + * + * @param[in] obj The SPI peripheral to stop + * @return The status of the abort_async request + */ +cy_rslt_t cyhal_spi_abort_async(cyhal_spi_t *obj); + +/** Register a SPI callback handler + * + * This function will be called when one of the events enabled by \ref cyhal_spi_enable_event occurs. + * + * @param[in] obj The SPI object + * @param[in] callback The callback handler which will be invoked when the interrupt fires + * @param[in] callback_arg Generic argument that will be provided to the callback when called + */ +void cyhal_spi_register_callback(cyhal_spi_t *obj, cyhal_spi_event_callback_t callback, void *callback_arg); + +/** Configure SPI interrupt. This function is used for word-approach + * + * When an enabled event occurs, the function specified by \ref cyhal_spi_register_callback will be called. + * + * @param[in] obj The SPI object + * @param[in] event The SPI event type + * @param[in] intr_priority The priority for NVIC interrupt events + * @param[in] enable True to turn on interrupts, False to turn off + */ +void cyhal_spi_enable_event(cyhal_spi_t *obj, cyhal_spi_event_t event, uint8_t intr_priority, bool enable); + +/******************************************************************************* +* Backward compatibility macro. The following code is DEPRECATED and must +* not be used in new projects +*******************************************************************************/ +/** \cond INTERNAL */ +typedef cyhal_spi_event_t cyhal_spi_irq_event_t; +/** \endcond */ + +#if defined(__cplusplus) +} +#endif + +#ifdef CYHAL_SPI_IMPL_HEADER +#include CYHAL_SPI_IMPL_HEADER +#endif /* CYHAL_SPI_IMPL_HEADER */ + +/** \} group_hal_spi */ diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cy_syslib.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cy_syslib.h new file mode 100644 index 000000000..7671d853c --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cy_syslib.h @@ -0,0 +1,592 @@ +/***************************************************************************//** +* \file cy_syslib.h +* \version 2.40.1 +* +* Provides an API declaration of the SysLib driver. +* +******************************************************************************** +* \copyright +* Copyright 2016-2019 Cypress Semiconductor Corporation +* SPDX-License-Identifier: Apache-2.0 +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +/** +* \addtogroup group_syslib +* \{ +* The system libraries provide APIs that can be called in the user application +* to handle the timing, logical checking or register. +* +* The functions and other declarations used in this driver are in cy_syslib.h. +* You can include cy_pdl.h (ModusToolbox only) to get access to all functions +* and declarations in the PDL. +* +* The SysLib driver contains a set of different system functions. These functions +* can be called in the application routine. Major features of the system library: +* * Delay functions +* * The register Read/Write macro +* * Assert and Halt +* * Assert Classes and Levels +* * A software reset +* * Reading the reset cause +* * An API to invalidate the flash cache and buffer +* * Data manipulation macro +* * A variable type definition from MISRA-C which specifies signedness +* * Cross compiler compatible attributes +* * Getting a silicon-unique ID API +* * Setting wait states API +* * Resetting the backup domain API +* * APIs to serve Fault handler +* +* \section group_syslib_configuration Configuration Considerations +* Assertion Usage
+* Use the CY_ASSERT() macro to check expressions that must be true as long as the +* program is running correctly. It is a convenient way to insert sanity checks. +* The CY_ASSERT() macro is defined in the cy_syslib.h file which is part of +* the PDL library. The behavior of the macro is as follows: if the expression +* passed to the macro is false, output an error message that includes the file +* name and line number, and then halts the CPU. \n +* In case of fault, the CY_ASSERT() macro calls the Cy_SysLib_AssertFailed() function. +* This is a weakly linked function. The default implementation stores the file +* name and line number of the ASSERT into global variables, cy_assertFileName +* and cy_assertLine . It then calls the Cy_SysLib_Halt() function. +* \note Firmware can redefine the Cy_SysLib_AssertFailed() function for custom processing. +* +* The PDL source code uses this assert mechanism extensively. It is recommended +* that you enable asserts when debugging firmware. \n +* Assertion Classes and Levels
+* The PDL defines three assert classes, which correspond to different kinds +* of parameters. There is a corresponding assert "level" for each class. +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
Class MacroLevel MacroType of check
CY_ASSERT_CLASS_1CY_ASSERT_L1A parameter that could change between different PSoC devices +* (e.g. the number of clock paths)
CY_ASSERT_CLASS_2CY_ASSERT_L2A parameter that has fixed limits such as a counter period
CY_ASSERT_CLASS_3CY_ASSERT_L3A parameter that is an enum constant
+* Firmware defines which ASSERT class is enabled by defining CY_ASSERT_LEVEL. +* This is a compiler command line argument, similar to how the DEBUG / NDEBUG +* macro is passed. \n +* Enabling any class also enables any lower-numbered class. +* CY_ASSERT_CLASS_3 is the default level, and it enables asserts for all three +* classes. The following example shows the command-line option to enable all +* the assert levels: +* \code -D CY_ASSERT_LEVEL=CY_ASSERT_CLASS_3 \endcode +* \note The use of special characters, such as spaces, parenthesis, etc. must +* be protected with quotes. +* +* After CY_ASSERT_LEVEL is defined, firmware can use +* one of the three level macros to make an assertion. For example, if the +* parameter can vary between devices, firmware uses the L1 macro. +* \code CY_ASSERT_L1(clkPath < SRSS_NUM_CLKPATH); \endcode +* If the parameter has bounds, firmware uses L2. +* \code CY_ASSERT_L2(trim <= CY_CTB_TRIM_VALUE_MAX); \endcode +* If the parameter is an enum, firmware uses L3. +* \code CY_ASSERT_L3(config->LossAction <= CY_SYSCLK_CSV_ERROR_FAULT_RESET); \endcode +* Each check uses the appropriate level macro for the kind of parameter being checked. +* If a particular assert class/level is not enabled, then the assert does nothing. +* +* \section group_syslib_more_information More Information +* Refer to the technical reference manual (TRM). +* +* \section group_syslib_MISRA MISRA-C Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
1.2RNo reliance shall be placed on undefined or unspecified behaviour.This specific behavior is explicitly covered in rule 20.1.
2.1RThis function contains a mixture of in-line assembler statements and C statements.This si required by design of the Cy_SysLib_Halt function.
18.4RUnions shall not be used.The unions are used for CFSR, HFSR and SHCSR Fault Status Registers +* content access as a word in code and as a structure during debug.
19.13AThe # and ## operators should not be used.The ## preprocessor operator is used in macros to form the field mask.
20.1RReserved identifiers, macros and functions in the standard library, shall not be +* defined, redefined or undefined.The driver defines the macros with leading underscores +* (_CLR_SET_FLD/_BOOL2FLD/_FLD2BOOL) and therefore generates this MISRA violation.
+* +* \section group_syslib_changelog Changelog +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
VersionChangesReason for Change
2.40.1Correct the CY_RAMFUNC_BEGIN macro for the IAR compiler.Removed the IAR compiler warning.
2.40Added new macros CY_SYSLIB_DIV_ROUND and CY_SYSLIB_DIV_ROUNDUP to easy perform integer division with rounding.Improve PDL code base.
2.30Updated implementation of the Cy_SysLib_AsmInfiniteLoop() function to be compatible with ARMC6.Provided support for the ARM Compiler 6.
Minor documentation edits.Documentation update and clarification.
Added new macros CY_RAMFUNC_BEGIN and CY_RAMFUNC_END for convenient placement function in RAM for all supported compilers.Improve user experience.
2.20Updated implementation of the \ref Cy_SysLib_AssertFailed() function to be available in Release and Debug modes.Provided support for the PDL static library in Release mode.
Minor documentation edits.Documentation update and clarification.
2.10Flattened the organization of the driver source code into the single source directory and the single include directory.Driver library directory-structure simplification.
Added the following macros: \ref CY_REG32_CLR_SET, \ref _CLR_SET_FLD16U, \ref CY_REG16_CLR_SET, \ref _CLR_SET_FLD8U, \ref CY_REG8_CLR_SETRegister access simplification.
Removed the Cy_SysLib_GetNumHfclkResetCause API function.This feature is not supported by SRSS_ver1.
Added register access layer. Use register access macros instead +* of direct register access using dereferenced pointers.Makes register access device-independent, so that the PDL does +* not need to be recompiled for each supported part number.
2.0.1Minor documentation editsDocumentation update and clarification
2.0 +* Added Cy_SysLib_ResetBackupDomain() API implementation. \n +* Added CY_NOINLINE attribute implementation. \n +* Added DIE_YEAR field to 64-bit unique ID return value of Cy_SysLib_GetUniqueId() API. \n +* Added storing of SCB->HFSR, SCB->SHCSR registers and SCB->MMFAR, SCB->BFAR addresses to Fault Handler debug structure. \n +* Optimized Cy_SysLib_SetWaitStates() API implementation. +* Improvements made based on usability feedback.
Added Assertion Classes and Levels.For error checking, parameter validation and status returns in the PDL API.
Applied CY_NOINIT attribute to cy_assertFileName, cy_assertLine, and cy_faultFrame global variables.To store debug information into a non-zero init area for future analysis.
Removed CY_WEAK attribute implementation.CMSIS __WEAK attribute should be used instead.
1.0Initial version
+* +* \defgroup group_syslib_macros Macros +* \defgroup group_syslib_functions Functions +* \defgroup group_syslib_data_structures Data Structures +* \defgroup group_syslib_enumerated_types Enumerated Types +* +*/ + +#if !defined(CY_SYSLIB_H) +#define CY_SYSLIB_H + +#include +#include + +/******************************************************************************* +* Data manipulation defines +*******************************************************************************/ + +/** Get the lower 8 bits of a 16-bit value. */ +#define CY_LO8(x) ((uint8_t) ((x) & 0xFFU)) +/** Get the upper 8 bits of a 16-bit value. */ +#define CY_HI8(x) ((uint8_t) ((uint16_t)(x) >> 8U)) + +/** Get the lower 16 bits of a 32-bit value. */ +#define CY_LO16(x) ((uint16_t) ((x) & 0xFFFFU)) +/** Get the upper 16 bits of a 32-bit value. */ +#define CY_HI16(x) ((uint16_t) ((uint32_t)(x) >> 16U)) + +/** Swap the byte ordering of a 16-bit value */ +#define CY_SWAP_ENDIAN16(x) ((uint16_t)(((x) << 8U) | (((x) >> 8U) & 0x00FFU))) + +/** Swap the byte ordering of a 32-bit value */ +#define CY_SWAP_ENDIAN32(x) ((uint32_t)((((x) >> 24U) & 0x000000FFU) | (((x) & 0x00FF0000U) >> 8U) | \ + (((x) & 0x0000FF00U) << 8U) | ((x) << 24U))) + +/** Swap the byte ordering of a 64-bit value */ +#define CY_SWAP_ENDIAN64(x) ((uint64_t) (((uint64_t) CY_SWAP_ENDIAN32((uint32_t)(x)) << 32U) | \ + CY_SWAP_ENDIAN32((uint32_t)((x) >> 32U)))) + +/* MISRA rule 6.3 recommends using specific-length typedef for the basic + * numerical types of signed and unsigned variants of char, float, and double. + */ +typedef char char_t; /**< Specific-length typedef for the basic numerical types of char */ +typedef float float32_t; /**< Specific-length typedef for the basic numerical types of float */ +typedef double float64_t; /**< Specific-length typedef for the basic numerical types of double */ + + +/******************************************************************************* +* Macro Name: CY_GET_REG8(addr) +****************************************************************************//** +* +* Reads the 8-bit value from the specified address. This function can't be +* used to access the Core register, otherwise a fault occurs. +* +* \param addr The register address. +* +* \return The read value. +* +*******************************************************************************/ +#define CY_GET_REG8(addr) (*((const volatile uint8_t *)(addr))) + + +/******************************************************************************* +* Macro Name: CY_SET_REG8(addr, value) +****************************************************************************//** +* +* Writes an 8-bit value to the specified address. This function can't be +* used to access the Core register, otherwise a fault occurs. +* +* \param addr The register address. +* +* \param value The value to write. +* +*******************************************************************************/ +#define CY_SET_REG8(addr, value) (*((volatile uint8_t *)(addr)) = (uint8_t)(value)) + + +/******************************************************************************* +* Macro Name: CY_GET_REG16(addr) +****************************************************************************//** +* +* Reads the 16-bit value from the specified address. +* +* \param addr The register address. +* +* \return The read value. +* +*******************************************************************************/ +#define CY_GET_REG16(addr) (*((const volatile uint16_t *)(addr))) + + +/******************************************************************************* +* Macro Name: CY_SET_REG16(addr, value) +****************************************************************************//** +* +* Writes the 16-bit value to the specified address. +* +* \param addr The register address. +* +* \param value The value to write. +* +*******************************************************************************/ +#define CY_SET_REG16(addr, value) (*((volatile uint16_t *)(addr)) = (uint16_t)(value)) + + +/******************************************************************************* +* Macro Name: CY_GET_REG24(addr) +****************************************************************************//** +* +* Reads the 24-bit value from the specified address. +* +* \param addr The register address. +* +* \return The read value. +* +*******************************************************************************/ +#define CY_GET_REG24(addr) (((uint32_t) (*((const volatile uint8_t *)(addr)))) | \ + (((uint32_t) (*((const volatile uint8_t *)(addr) + 1))) << 8U) | \ + (((uint32_t) (*((const volatile uint8_t *)(addr) + 2))) << 16U)) + + +/******************************************************************************* +* Macro Name: CY_SET_REG24(addr, value) +****************************************************************************//** +* +* Writes the 24-bit value to the specified address. +* +* \param addr The register address. +* +* \param value The value to write. +* +*******************************************************************************/ +#define CY_SET_REG24(addr, value) do \ + { \ + (*((volatile uint8_t *) (addr))) = (uint8_t)(value); \ + (*((volatile uint8_t *) (addr) + 1)) = (uint8_t)((value) >> 8U); \ + (*((volatile uint8_t *) (addr) + 2)) = (uint8_t)((value) >> 16U); \ + } \ + while(0) + + +/******************************************************************************* +* Macro Name: CY_GET_REG32(addr) +****************************************************************************//** +* +* Reads the 32-bit value from the specified register. The address is the little +* endian order (LSB in lowest address). +* +* \param addr The register address. +* +* \return The read value. +* +*******************************************************************************/ +#define CY_GET_REG32(addr) (*((const volatile uint32_t *)(addr))) + + +/******************************************************************************* +* Macro Name: CY_SET_REG32(addr, value) +****************************************************************************//** +* +* Writes the 32-bit value to the specified register. The address is the little +* endian order (LSB in lowest address). +* +* \param addr The register address. +* +* \param value The value to write. +* +*******************************************************************************/ +#define CY_SET_REG32(addr, value) (*((volatile uint32_t *)(addr)) = (uint32_t)(value)) + +/******************************************************************************* +* Macro Name: _CLR_SET_FLD32U +****************************************************************************//** +* +* The macro for setting a register with a name field and value for providing +* get-clear-modify-write operations. +* Returns a resulting value to be assigned to the register. +* +*******************************************************************************/ +#define _CLR_SET_FLD32U(reg, field, value) (((reg) & ((uint32_t)(~(field ## _Msk)))) | (_VAL2FLD(field, value))) + + +/******************************************************************************* +* Macro Name: CY_REG32_CLR_SET +****************************************************************************//** +* +* Uses _CLR_SET_FLD32U macro for providing get-clear-modify-write +* operations with a name field and value and writes a resulting value +* to the 32-bit register. +* +*******************************************************************************/ +#define CY_REG32_CLR_SET(reg, field, value) ((reg) = _CLR_SET_FLD32U((reg), field, (value))) + + +/******************************************************************************* +* Macro Name: _CLR_SET_FLD16U +****************************************************************************//** +* +* The macro for setting a 16-bit register with a name field and value for providing +* get-clear-modify-write operations. +* Returns a resulting value to be assigned to the 16-bit register. +* +*******************************************************************************/ +#define _CLR_SET_FLD16U(reg, field, value) ((uint16_t)(((reg) & ((uint16_t)(~(field ## _Msk)))) | \ + ((uint16_t)_VAL2FLD(field, value)))) + + +/******************************************************************************* +* Macro Name: CY_REG16_CLR_SET +****************************************************************************//** +* +* Uses _CLR_SET_FLD16U macro for providing get-clear-modify-write +* operations with a name field and value and writes a resulting value +* to the 16-bit register. +* +*******************************************************************************/ +#define CY_REG16_CLR_SET(reg, field, value) ((reg) = _CLR_SET_FLD16U((reg), field, (value))) + + +/******************************************************************************* +* Macro Name: _CLR_SET_FLD8U +****************************************************************************//** +* +* The macro for setting a 8-bit register with a name field and value for providing +* get-clear-modify-write operations. +* Returns a resulting value to be assigned to the 8-bit register. +* +*******************************************************************************/ +#define _CLR_SET_FLD8U(reg, field, value) ((uint8_t)(((reg) & ((uint8_t)(~(field ## _Msk)))) | \ + ((uint8_t)_VAL2FLD(field, value)))) + + +/******************************************************************************* +* Macro Name: CY_REG8_CLR_SET +****************************************************************************//** +* +* Uses _CLR_SET_FLD8U macro for providing get-clear-modify-write +* operations with a name field and value and writes a resulting value +* to the 8-bit register. +* +*******************************************************************************/ +#define CY_REG8_CLR_SET(reg, field, value) ((reg) = _CLR_SET_FLD8U((reg), field, (value))) + + +/******************************************************************************* +* Macro Name: _BOOL2FLD +****************************************************************************//** +* +* Returns a field mask if the value is not false. +* Returns 0, if the value is false. +* +*******************************************************************************/ +#define _BOOL2FLD(field, value) (((value) != false) ? (field ## _Msk) : 0UL) + + +/******************************************************************************* +* Macro Name: _FLD2BOOL +****************************************************************************//** +* +* Returns true, if the value includes the field mask. +* Returns false, if the value doesn't include the field mask. +* +*******************************************************************************/ +#define _FLD2BOOL(field, value) (((value) & (field ## _Msk)) != 0UL) + + +/******************************************************************************* +* Macro Name: CY_SYSLIB_DIV_ROUND +****************************************************************************//** +* +* Calculates a / b with rounding to the nearest integer, +* a and b must have the same sign. +* +*******************************************************************************/ +#define CY_SYSLIB_DIV_ROUND(a, b) (((a) + ((b) / 2U)) / (b)) + + +/******************************************************************************* +* Macro Name: CY_SYSLIB_DIV_ROUNDUP +****************************************************************************//** +* +* Calculates a / b with rounding up if remainder != 0, +* both a and b must be positive. +* +*******************************************************************************/ +#define CY_SYSLIB_DIV_ROUNDUP(a, b) ((((a) - 1U) / (b)) + 1U) + +typedef uint32_t cy_status; +/** The ARM 32-bit status value for backward compatibility with the UDB components. Do not use it in your code. */ +typedef uint32_t cystatus; +typedef uint8_t uint8; /**< Alias to uint8_t for backward compatibility */ +typedef uint16_t uint16; /**< Alias to uint16_t for backward compatibility */ +typedef uint32_t uint32; /**< Alias to uint32_t for backward compatibility */ +typedef int8_t int8; /**< Alias to int8_t for backward compatibility */ +typedef int16_t int16; /**< Alias to int16_t for backward compatibility */ +typedef int32_t int32; /**< Alias to int32_t for backward compatibility */ +typedef float float32; /**< Alias to float for backward compatibility */ +typedef double float64; /**< Alias to double for backward compatibility */ +typedef int64_t int64; /**< Alias to int64_t for backward compatibility */ +typedef uint64_t uint64; /**< Alias to uint64_t for backward compatibility */ +/* Signed or unsigned depending on the compiler selection */ +typedef char char8; /**< Alias to char for backward compatibility */ +typedef volatile uint8_t reg8; /**< Alias to uint8_t for backward compatibility */ +typedef volatile uint16_t reg16; /**< Alias to uint16_t for backward compatibility */ +typedef volatile uint32_t reg32; /**< Alias to uint32_t for backward compatibility */ + +/** The ARM 32-bit Return error / status code for backward compatibility. +* Do not use them in your code. +*/ +#define CY_RET_SUCCESS (0x00U) /* Successful */ +#define CY_RET_BAD_PARAM (0x01U) /* One or more invalid parameters */ +#define CY_RET_INVALID_OBJECT (0x02U) /* An invalid object specified */ +#define CY_RET_MEMORY (0x03U) /* A memory-related failure */ +#define CY_RET_LOCKED (0x04U) /* A resource lock failure */ +#define CY_RET_EMPTY (0x05U) /* No more objects available */ +#define CY_RET_BAD_DATA (0x06U) /* Bad data received (CRC or other error check) */ +#define CY_RET_STARTED (0x07U) /* Operation started, but not necessarily completed yet */ +#define CY_RET_FINISHED (0x08U) /* Operation is completed */ +#define CY_RET_CANCELED (0x09U) /* Operation is canceled */ +#define CY_RET_TIMEOUT (0x10U) /* Operation timed out */ +#define CY_RET_INVALID_STATE (0x11U) /* Operation is not setup or is in an improper state */ +#define CY_RET_UNKNOWN ((cy_status) 0xFFFFFFFFU) /* Unknown failure */ + +/** ARM 32-bit Return error / status codes for backward compatibility with the UDB components. +* Do not use them in your code. +*/ +#define CYRET_SUCCESS (0x00U) /* Successful */ +#define CYRET_BAD_PARAM (0x01U) /* One or more invalid parameters */ +#define CYRET_INVALID_OBJECT (0x02U) /* An invalid object specified */ +#define CYRET_MEMORY (0x03U) /* A memory-related failure */ +#define CYRET_LOCKED (0x04U) /* A resource lock failure */ +#define CYRET_EMPTY (0x05U) /* No more objects available */ +#define CYRET_BAD_DATA (0x06U) /* Bad data received (CRC or other error check) */ +#define CYRET_STARTED (0x07U) /* Operation started, but not necessarily completed yet */ +#define CYRET_FINISHED (0x08U) /* Operation is completed */ +#define CYRET_CANCELED (0x09U) /* Operation is canceled */ +#define CYRET_TIMEOUT (0x10U) /* Operation timed out */ +#define CYRET_INVALID_STATE (0x11U) /* Operation is not setup or is in an improper state */ +#define CYRET_UNKNOWN ((cystatus) 0xFFFFFFFFU) /* Unknown failure */ + +/** \} group_syslib_functions */ + +#endif /* CY_SYSLIB_H */ + +/** \} group_syslib */ + +/* [] END OF FILE */ diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cy_utils.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cy_utils.h new file mode 100644 index 000000000..db8c143f3 --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cy_utils.h @@ -0,0 +1,81 @@ +/***************************************************************************//** +* \file cy_utils.h +* +* \brief +* Basic utility macros and functions. +* +******************************************************************************** +* \copyright +* Copyright 2018-2019 Cypress Semiconductor Corporation +* SPDX-License-Identifier: Apache-2.0 +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +/** +* \addtogroup group_utils Utilities +* \ingroup group_abstraction +* \{ +* Basic utility macros and functions. +* +* \defgroup group_utils_macros Macros +*/ + +#pragma once + +#include "stdint.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** +* \addtogroup group_utils_macros +* \{ +*/ + +/** Simple macro to supress the unused parameter warning by casting to void. */ +#define CY_UNUSED_PARAMETER(x) ( (void)(x) ) + +/** Halt the processor in the debug state + * @return + */ +static inline uint32_t CY_HALT() +{ + __asm(" bkpt 1"); + return 0; +} + +#ifdef CY_ASSERT +#undef CY_ASSERT +#endif /* ifdef(CY_ASSERT) */ + +/** Utility macro when neither NDEBUG or CY_NO_ASSERT is not declared to check a condition and, if false, trigger a breakpoint */ +#if defined(NDEBUG) || defined(CY_NO_ASSERT) + #define CY_ASSERT(x) CY_UNUSED_PARAMETER(x) +#else + #define CY_ASSERT(x) do { \ + if(!(x)) \ + { \ + CY_HALT(); \ + } \ + } while(0) +#endif /* defined(NDEBUG) */ + +/** \} group_utils_macros */ + +#ifdef __cplusplus +} +#endif + +/** \} group_utils */ diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cybsp.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cybsp.h new file mode 100644 index 000000000..06226f327 --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cybsp.h @@ -0,0 +1,50 @@ +/***************************************************************************//** +* \file cybsp.h +* +* \brief +* Basic API for setting up boards containing a Cypress MCU. +* +******************************************************************************** +* \copyright +* Copyright 2018-2020 Cypress Semiconductor Corporation +* SPDX-License-Identifier: Apache-2.0 +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +#pragma once + +#include "cy_result.h" +#include "cyhal_sdio.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** +* \addtogroup group_bsp_functions Functions +* \{ +*/ + +/** + * \brief Get the initialized sdio object used for communicating with the WiFi Chip. + * \note This function should only be called after cybsp_init(); + * \returns The initialized sdio object. + */ +cyhal_sdio_t* cybsp_get_wifi_sdio_obj(void); + +/** \} group_bsp_functions */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cycfg.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cycfg.h new file mode 100644 index 000000000..7a3dee0ca --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cycfg.h @@ -0,0 +1,20 @@ +/* + * Copyright 2020 Arduino SA + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @file + * Empty file to be compliant with Cypress COMPONENT_WHD + */ \ No newline at end of file diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cyhal.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cyhal.h new file mode 100644 index 000000000..e56be0e01 --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cyhal.h @@ -0,0 +1,52 @@ +/* + * Copyright 2020 Arduino SA + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @file + * Provides cyhal porting to generic mbed APIs + */ +#include "whd_config.h" +#include "cyhal_hw_types.h" +#include "cyhal_gpio.h" +#include "cyhal_sdio.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +typedef enum +{ + CYBSP_WIFI_WL_REG_ON, + CYBSP_WIFI_32K_CLK, + CYBSP_LED1, + CYBSP_LED2, + CYBSP_WIFI_SDIO_CMD, + CYBSP_WIFI_SDIO_CLK, + CYBSP_WIFI_SDIO_D0, + CYBSP_WIFI_SDIO_D1, + CYBSP_WIFI_SDIO_D2, + CYBSP_WIFI_SDIO_D3, + CYBSP_SDIO_OOB_IRQ, + CYBSP_WIFI_MAX, +} wwd_sdio_pin_t; + +void cyhal_system_delay_ms(uint32_t milliseconds); +cy_rslt_t sdio_enable_high_speed(void); + +#if defined(__cplusplus) +} +#endif + diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cyhal_hw_types.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cyhal_hw_types.h new file mode 100644 index 000000000..1f872abb3 --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cyhal_hw_types.h @@ -0,0 +1,112 @@ +/***************************************************************************//** +* \file cyhal_hw_types_template.h +* +* \brief +* Provides a template for configuration resources used by the HAL. Items +* here need to be implemented for each HAL port. It is up to the environment +* being ported into what the actual types are. There are some suggestions below +* but these are not required. All that is required is that the type is defined; +* it does not matter to the HAL what type is actually chosen for the +* implementation +* All TODOs and references to 'PORT' need to be replaced by with meaningful +* values for the device being supported. +* +******************************************************************************** +* \copyright +* Copyright 2018-2019 Cypress Semiconductor Corporation +* SPDX-License-Identifier: Apache-2.0 +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +/** + * \addtogroup group_hal_hw_types PORT Hardware Types + * \ingroup group_hal_PORT + * \{ + * Struct definitions for configuration resources in the PORT. + * + * \defgroup group_hal_hw_types_data_structures Data Structures + */ + +#pragma once +#include +#include "stm32h7xx_hal.h" +#include "PinNames.h" + +/* + #include "TODO: Port specific header file" + */ + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifndef CYHAL_ISR_PRIORITY_DEFAULT +/** Priority that is applied by default to all drivers when initalized. Priorities can be + * overridden on each driver as part of enabling events. + */ +#define CYHAL_ISR_PRIORITY_DEFAULT (7) +#endif + +/** + * \addtogroup group_hal_hw_types_data_structures + * \{ + */ + +typedef int32_t cyhal_gpio_t; + +/** GPIO object */ +typedef struct +{ + GPIO_TypeDef *port; + GPIO_InitTypeDef config; +} pinconfig_t; + +/** Clock divider object */ +typedef struct +{ + /* TODO: replace with port specific items */ + void *div_type; +} cyhal_clock_divider_t; + +/** Clock object */ +typedef struct +{ + //For backwards compatibility with cyhal_clock_divider_t only. Do not use going forward. + int div_type; /*!< Deprecated */ + uint8_t div_num; /*!< Deprecated */ + //End BWC items + int block; + uint8_t channel; + bool reserved; +} cyhal_clock_t; + +/** SDIO object */ +typedef void* *cyhal_sdio_t; + +/** SPI object */ +typedef struct +{ + /* TODO: replace with port specific items */ + void *empty; +} cyhal_spi_t; + +#include "whd_config.h" +#include "whd_debug.h" + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +/** \} group_hal_hw_types */ diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cyhal_system.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cyhal_system.h new file mode 100644 index 000000000..7a3dee0ca --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/cyhal_system.h @@ -0,0 +1,20 @@ +/* + * Copyright 2020 Arduino SA + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @file + * Empty file to be compliant with Cypress COMPONENT_WHD + */ \ No newline at end of file diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/wiced_bd.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/wiced_bd.h new file mode 100644 index 000000000..578b2d9e4 --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/wiced_bd.h @@ -0,0 +1,49 @@ +/* + * Copyright 2020 Arduino SA + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @file + * Provides wiced fs porting to generic mbed APIs + */ + +#pragma once + +#include "whd_config.h" +#include "BlockDevice.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************** + * Type Definitions + ******************************************************/ + +/** + * Mount the physical device + * + * This assumes that the device is ready to read/write immediately. + * + * @param[in] device - physical media to init + * @param[out] fs_handle_out - Receives the filesystem handle. + * + * @return WICED_SUCCESS on success + */ +wiced_result_t wiced_filesystem_mount(mbed::BlockDevice *device, wiced_filesystem_handle_type_t fs_type, wiced_filesystem_t *fs_handle_out, const char *mounted_name); + +#ifdef __cplusplus +} /*extern "C" */ +#endif diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/wiced_filesystem.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/wiced_filesystem.h new file mode 100644 index 000000000..77d49d182 --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port/wiced_filesystem.h @@ -0,0 +1,148 @@ +/* + * Copyright 2020 Arduino SA + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @file + * Provides wiced fs porting to generic mbed APIs + */ + +#pragma once + +#include "whd_config.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/****************************************************** + * Enumerations + ******************************************************/ + +typedef enum { + WICED_FILESYSTEM_OPEN_FOR_READ, /** Specifies read access to the object. Data can be read from the file - equivalent to "r" or "rb" */ + WICED_FILESYSTEM_OPEN_FOR_WRITE, /** Specifies read/write access to the object. Data can be written to the file - equivalent to "r+" or "rb+" or "r+b" */ + WICED_FILESYSTEM_OPEN_WRITE_CREATE, /** Opens for read/write access, creates it if it doesn't exist */ + WICED_FILESYSTEM_OPEN_ZERO_LENGTH, /** Opens for read/write access, Truncates file to zero length if it exists, or creates it if it doesn't - equivalent to "w+", "wb+" or "w+b" */ + WICED_FILESYSTEM_OPEN_APPEND, /** Opens for read/write access, places the current location at the end of the file ready for appending - equivalent to "a", "ab" */ + WICED_FILESYSTEM_OPEN_APPEND_CREATE, /** Opens for read/write access, creates it if it doesn't exist, and places the current location at the end of the file ready for appending - equivalent to "a+", "ab+" or "a+b" */ +} wiced_filesystem_open_mode_t; + +typedef enum { + WICED_FILESYSTEM_SEEK_SET = SEEK_SET, /* Offset from start of file */ + WICED_FILESYSTEM_SEEK_CUR = SEEK_CUR, /* Offset from current position in file */ + WICED_FILESYSTEM_SEEK_END = SEEK_END, /* Offset from end of file */ +} wiced_filesystem_seek_type_t; + +typedef enum { + WICED_SUCCESS = 0, + WICED_ERROR = 1 +} wiced_result_t; + +/****************************************************** + * Type Definitions + ******************************************************/ + +/** + * File-system Handle Structure + */ +typedef int wiced_filesystem_t; + +/** + * File Handle Structure + * + */ +typedef int wiced_file_t; + +/** + * File-system type Handle Structure + */ +typedef int wiced_filesystem_handle_type_t; + +/** + * Initialise the BlockDevice and filesystem module + * + * Initialises the BlockDevice and filesystem module before mounting a physical device. + * + * @return WICED_SUCCESS on success + */ +wiced_result_t wiced_filesystem_init(void); + +/** + * Mount the physical device using default parameters + * + * This assumes that the device is ready to read/write immediately. + * + * @return WICED_SUCCESS on success + */ +wiced_result_t wiced_filesystem_mount_default(void); + +/** + * Open a file for reading or writing + * + * @param[in] fs_handle - The filesystem handle to use - obtained from wiced_filesystem_mount + * @param[out] file_handle_out - a pointer to a wiced_file_t structure which will receive the + * file handle after it is opened + * @param[in] filename - The filename of the file to open + * @param[in] mode - Specifies read or write access + * + * @return WICED_SUCCESS on success + */ +wiced_result_t wiced_filesystem_file_open(wiced_filesystem_t *fs_handle, wiced_file_t *file_handle_out, const char *filename, wiced_filesystem_open_mode_t mode); + +/** + * Seek to a location within a file + * + * This is similar to the fseek() in ISO C. + * + * @param[in] file_handle - The file handle on which to perform the seek. + * Must have been previously opened with wiced_filesystem_fopen. + * @param[in] offset - The offset in bytes + * @param[in] whence - WICED_FILESYSTEM_SEEK_SET = Offset from start of file + * WICED_FILESYSTEM_SEEK_CUR = Offset from current position in file + * WICED_FILESYSTEM_SEEK_END = Offset from end of file + * + * @return WICED_SUCCESS on success + */ +wiced_result_t wiced_filesystem_file_seek(wiced_file_t *file_handle, int64_t offset, wiced_filesystem_seek_type_t whence); + +/** + * Reads data from a file into a memory buffer + * + * @param[in] file_handle - the file handle to read from + * @param[out] data - A pointer to the memory buffer that will + * receive the data that is read + * @param[in] bytes_to_read - the number of bytes to read + * @param[out] returned_item_count - the number of items successfully read. + * + * @return WICED_SUCCESS on success + */ +wiced_result_t wiced_filesystem_file_read(wiced_file_t *file_handle, void *data, uint64_t bytes_to_read, uint64_t *returned_bytes_count); + +/** + * Close a file + * + * This is similar to the fclose() in ISO C. + * + * @param[in] file_handle - the file handle to close + * + * @return WICED_SUCCESS = success + */ +wiced_result_t wiced_filesystem_file_close(wiced_file_t *file_handle); + +#ifdef __cplusplus +} /*extern "C" */ +#endif diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/resources/firmware/COMPONENT_4343W_FS/resources.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/resources/firmware/COMPONENT_4343W_FS/resources.h new file mode 100644 index 000000000..01bad9226 --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/resources/firmware/COMPONENT_4343W_FS/resources.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2019, Cypress Semiconductor Corporation, All Rights Reserved + * SPDX-License-Identifier: LicenseRef-PBL + * + * This file and the related binary are licensed under the + * Permissive Binary License, Version 1.0 (the "License"); + * you may not use these files except in compliance with the License. + * + * You may obtain a copy of the License here: + * LICENSE-permissive-binary-license-1.0.txt and at + * https://www.mbed.com/licenses/PBL-1.0 + * + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* Automatically generated file - this comment ensures resources.h file creation */ +/* Auto-generated header file. Do not edit */ +#ifndef INCLUDED_RESOURCES_H_ +#define INCLUDED_RESOURCES_H_ +#include "wiced_resource.h" +#include "wiced_filesystem.h" + +extern wiced_filesystem_t resource_fs_handle; + +extern const resource_hnd_t wifi_firmware_image; +extern const unsigned char wifi_firmware_image_data[421098]; +extern const resource_hnd_t wifi_firmware_clm_blob; +extern const unsigned char wifi_firmware_clm_blob_image_data[7222]; + +#endif /* ifndef INCLUDED_RESOURCES_H_ */ diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/resources/nvram/wifi_nvram_image.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/resources/nvram/wifi_nvram_image.h new file mode 100644 index 000000000..3f2279c2b --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/resources/nvram/wifi_nvram_image.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2019, Cypress Semiconductor Corporation, All Rights Reserved + * SPDX-License-Identifier: LicenseRef-PBL + * + * This file and the related binary are licensed under the + * Permissive Binary License, Version 1.0 (the "License"); + * you may not use these files except in compliance with the License. + * + * You may obtain a copy of the License here: + * LICENSE-permissive-binary-license-1.0.txt and at + * https://www.mbed.com/licenses/PBL-1.0 + * + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @file + * NVRAM file for CY8CKIT-062-WiFi-BT (PSoC6 WiFi-BT Pioneer Kit) using + * Murata's Type 1DX module - Copied from bcm94343wwcd1.txt on 08/04/2019 + * # 2.4 GHz, 20 MHz BW mode; No Antenna Diversity + */ + +#ifndef INCLUDED_NVRAM_IMAGE_H_ +#define INCLUDED_NVRAM_IMAGE_H_ + +#include +#include +#include "generated_mac_address.txt" + + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Character array of NVRAM image + * + * Generated from cyw94343cy8ckit-062-wifi-bt.txt + */ + +static const char wifi_nvram_image[] = + "manfid=0x2d0" "\x00" + "prodid=0x0726" "\x00" + "vendid=0x14e4" "\x00" + "devid=0x43e2" "\x00" + "boardtype=0x0726" "\x00" + "boardrev=0x1202" "\x00" + "boardnum=22" "\x00" + NVRAM_GENERATED_MAC_ADDRESS "\x00" + "sromrev=11" "\x00" + "boardflags=0x00404201" "\x00" + "boardflags3=0x04000000" "\x00" + "xtalfreq=37400" "\x00" + "nocrc=1" "\x00" + "ag0=0" "\x00" + "aa2g=1" "\x00" + "ccode=ALL" "\x00" + "extpagain2g=0" "\x00" + "pa2ga0=-145,6667,-751" "\x00" + "AvVmid_c0=0x0,0xc8" "\x00" + "cckpwroffset0=2" "\x00" + "maxp2ga0=74" "\x00" + "cckbw202gpo=0" "\x00" + "legofdmbw202gpo=0x88888888" "\x00" + "mcsbw202gpo=0xaaaaaaaa" "\x00" + "propbw202gpo=0xdd" "\x00" + "ofdmdigfilttype=18" "\x00" + "ofdmdigfilttypebe=18" "\x00" + "papdmode=1" "\x00" + "papdvalidtest=1" "\x00" + "pacalidx2g=48" "\x00" + "papdepsoffset=-22" "\x00" + "papdendidx=58" "\x00" + "il0"NVRAM_GENERATED_MAC_ADDRESS "\x00" + "wl0id=0x431b" "\x00" + "muxenab=0x10" "\x00" + "\x00\x00"; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#else /* ifndef INCLUDED_NVRAM_IMAGE_H_ */ + +#error Wi-Fi NVRAM image included twice + +#endif /* ifndef INCLUDED_NVRAM_IMAGE_H_ */ diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/whd_config.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/whd_config.h new file mode 100644 index 000000000..4b320b9de --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/whd_config.h @@ -0,0 +1,61 @@ +/* + * Copyright 2020 Arduino SA + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** @file + * Provides configuration for WHD driver on Arduino Portenta H7 + */ + +#ifndef __WHD_CONFIG__ +#define __WHD_CONFIG__ + +#include "whd_types.h" +#include "stm32h7xx_hal.h" +#include + +/* disable WPRINT_MACRO */ +#define WHD_PRINT_DISABLE + +/* please define your configuration , either SDIO or SPI */ +#define CY_WHD_CONFIG_USE_SDIO +//#define CY_WHD_CONFIG_USE_SPI + +/* select resource implementation */ +#define USES_RESOURCE_GENERIC_FILESYSTEM + +/* if not defined default value is 2 */ +#define CY_WIFI_OOB_INTR_PRIORITY 0 + +#define CYBSP_WIFI_HOST_WAKE_IRQ_EVENT CYHAL_GPIO_IRQ_FALL +#define CYBSP_WIFI_HOST_WAKE CYBSP_SDIO_OOB_IRQ + +#define BSP_LED1 {GPIOK,{.Pin= GPIO_PIN_5 , .Mode = GPIO_MODE_OUTPUT_PP , .Pull = GPIO_NOPULL , .Speed= GPIO_SPEED_FREQ_LOW}} +#define BSP_LED2 {GPIOK,{.Pin= GPIO_PIN_6 , .Mode = GPIO_MODE_OUTPUT_PP , .Pull = GPIO_NOPULL , .Speed= GPIO_SPEED_FREQ_LOW}} +#define BSP_LED3 {GPIOK,{.Pin= GPIO_PIN_7 , .Mode = GPIO_MODE_OUTPUT_PP , .Pull = GPIO_NOPULL , .Speed= GPIO_SPEED_FREQ_LOW}} + +/* power pin */ +#define WIFI_WL_REG_ON {GPIOB,{.Pin= GPIO_PIN_10, .Mode = GPIO_MODE_OUTPUT_PP , .Pull = GPIO_NOPULL , .Speed= GPIO_SPEED_FREQ_LOW}} +//#define WIFI_32K_CLK {GPIOA,{.Pin= GPIO_PIN_8, .Mode = GPIO_MODE_AF_PP , .Pull = GPIO_NOPULL , .Speed= GPIO_SPEED_FREQ_LOW , .Alternate = GPIO_AF0_MCO}} + +#define WIFI_SDIO_CMD {GPIOD,{.Pin= GPIO_PIN_2 , .Mode = GPIO_MODE_AF_PP , .Pull = GPIO_NOPULL , .Speed= GPIO_SPEED_FREQ_VERY_HIGH, .Alternate = GPIO_AF12_SDIO1}} +#define WIFI_SDIO_CLK {GPIOC,{.Pin= GPIO_PIN_12 , .Mode = GPIO_MODE_AF_PP , .Pull = GPIO_NOPULL , .Speed= GPIO_SPEED_FREQ_VERY_HIGH, .Alternate = GPIO_AF12_SDIO1}} +#define WIFI_SDIO_D0 {GPIOC,{.Pin= GPIO_PIN_8, .Mode = GPIO_MODE_AF_PP , .Pull = GPIO_NOPULL , .Speed= GPIO_SPEED_FREQ_VERY_HIGH, .Alternate = GPIO_AF12_SDIO1}} +#define WIFI_SDIO_D1 {GPIOC,{.Pin= GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP , .Pull = GPIO_NOPULL , .Speed= GPIO_SPEED_FREQ_VERY_HIGH, .Alternate = GPIO_AF12_SDIO1}} +#define WIFI_SDIO_D2 {GPIOC,{.Pin= GPIO_PIN_10, .Mode = GPIO_MODE_AF_PP , .Pull = GPIO_NOPULL , .Speed= GPIO_SPEED_FREQ_VERY_HIGH, .Alternate = GPIO_AF12_SDIO1}} +#define WIFI_SDIO_D3 {GPIOC,{.Pin= GPIO_PIN_11 , .Mode = GPIO_MODE_AF_PP , .Pull = GPIO_NOPULL , .Speed= GPIO_SPEED_FREQ_VERY_HIGH, .Alternate = GPIO_AF12_SDIO1}} +#define WIFI_SDIO_OOB_IRQ {GPIOI,{.Pin= GPIO_PIN_8 , .Mode = GPIO_MODE_IT_FALLING , .Pull = GPIO_NOPULL , .Speed= GPIO_SPEED_FREQ_VERY_HIGH}} + +#endif diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h new file mode 100644 index 000000000..04a34504a --- /dev/null +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h @@ -0,0 +1,356 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) 2018, STMicroelectronics + * Copyright (c) 2020, Arduino SA + * + * SPDX-License-Identifier: BSD-3-Clause + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +/* MBED TARGET LIST: GIGA */ + +#ifndef MBED_PINNAMES_H +#define MBED_PINNAMES_H + +#include "cmsis.h" +#include "PinNamesTypes.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define DUAL_PAD 0x800 + +typedef enum { + ALT0 = 0x100, + ALT1 = 0x200, + ALT2 = 0x300, + ALT3 = 0x400, + ALT4 = 0x500, +} ALTx; + +typedef enum { + PA_0 = 0x00, + PA_0C = PA_0 | DUAL_PAD, // dual pad + PA_0C_ALT0 = PA_0C | ALT0, // same pin used for alternate HW + PA_0C_ALT1 = PA_0C | ALT1, // same pin used for alternate HW + PA_0C_ALT2 = PA_0C | ALT2, // same pin used for alternate HW + PA_1 = 0x01, + PA_1C = PA_1 | DUAL_PAD, // dual pad + PA_1C_ALT0 = PA_1C | ALT0, // same pin used for alternate HW + PA_1_ALT0 = PA_1 | ALT0, // same pin used for alternate HW + PA_2 = 0x02, + PA_2_ALT0 = PA_2 | ALT0, // same pin used for alternate HW + PA_3 = 0x03, + PA_3_ALT0 = PA_3 | ALT0, // same pin used for alternate HW + PA_4 = 0x04, + PA_4_ALT0 = PA_4 | ALT0, // same pin used for alternate HW + PA_4_ALT1 = PA_4 | ALT1, // same pin used for alternate HW + PA_5 = 0x05, + PA_5_ALT0 = PA_5 | ALT0, // same pin used for alternate HW + PA_5_ALT1 = PA_5 | ALT1, // same pin used for alternate HW + PA_5_ALT2 = PA_5 | ALT2, // same pin used for alternate HW + PA_6 = 0x06, + PA_6_ALT0 = PA_6 | ALT0, // same pin used for alternate HW + PA_7 = 0x07, + PA_7_ALT0 = PA_7 | ALT0, // same pin used for alternate HW + PA_7_ALT1 = PA_7 | ALT1, // same pin used for alternate HW + PA_7_ALT2 = PA_7 | ALT2, // same pin used for alternate HW + PA_8 = 0x08, + PA_9 = 0x09, + PA_9_ALT0 = PA_9 | ALT0, // same pin used for alternate HW + PA_10 = 0x0A, + PA_10_ALT0 = PA_10 | ALT0, // same pin used for alternate HW + PA_11 = 0x0B, + PA_11_ALT0 = PA_11 | ALT0, // same pin used for alternate HW + PA_12 = 0x0C, + PA_12_ALT0 = PA_12 | ALT0, // same pin used for alternate HW + PA_13 = 0x0D, + PA_14 = 0x0E, + PA_15 = 0x0F, + PA_15_ALT0 = PA_15 | ALT0, // same pin used for alternate HW + PA_15_ALT1 = PA_15 | ALT1, // same pin used for alternate HW + PB_0 = 0x10, + PB_0_ALT0 = PB_0 | ALT0, // same pin used for alternate HW + PB_0_ALT1 = PB_0 | ALT1, // same pin used for alternate HW + PB_0_ALT2 = PB_0 | ALT2, // same pin used for alternate HW + PB_1 = 0x11, + PB_1_ALT0 = PB_1 | ALT0, // same pin used for alternate HW + PB_1_ALT1 = PB_1 | ALT1, // same pin used for alternate HW + PB_2 = 0x12, + PB_3 = 0x13, + PB_3_ALT0 = PB_3 | ALT0, // same pin used for alternate HW + PB_3_ALT1 = PB_3 | ALT1, // same pin used for alternate HW + PB_4 = 0x14, + PB_4_ALT0 = PB_4 | ALT0, // same pin used for alternate HW + PB_4_ALT1 = PB_4 | ALT1, // same pin used for alternate HW + PB_5 = 0x15, + PB_5_ALT0 = PB_5 | ALT0, // same pin used for alternate HW + PB_5_ALT1 = PB_5 | ALT1, // same pin used for alternate HW + PB_6 = 0x16, + PB_6_ALT0 = PB_6 | ALT0, // same pin used for alternate HW + PB_6_ALT1 = PB_6 | ALT1, // same pin used for alternate HW + PB_7 = 0x17, + PB_7_ALT0 = PB_7 | ALT0, // same pin used for alternate HW + PB_8 = 0x18, + PB_8_ALT0 = PB_8 | ALT0, // same pin used for alternate HW + PB_9 = 0x19, + PB_9_ALT0 = PB_9 | ALT0, // same pin used for alternate HW + PB_10 = 0x1A, + PB_11 = 0x1B, + PB_12 = 0x1C, + PB_13 = 0x1D, + PB_14 = 0x1E, + PB_14_ALT0 = PB_14 | ALT0, // same pin used for alternate HW + PB_14_ALT1 = PB_14 | ALT1, // same pin used for alternate HW + PB_15 = 0x1F, + PB_15_ALT0 = PB_15 | ALT0, // same pin used for alternate HW + PB_15_ALT1 = PB_15 | ALT1, // same pin used for alternate HW + PC_0 = 0x20, + PC_0_ALT0 = PC_0 | ALT0, // same pin used for alternate HW + PC_0_ALT1 = PC_0 | ALT1, // same pin used for alternate HW + PC_1 = 0x21, + PC_1_ALT0 = PC_1 | ALT0, // same pin used for alternate HW + PC_1_ALT1 = PC_1 | ALT1, // same pin used for alternate HW + PC_1_ALT2 = PC_1 | ALT2, // same pin used for alternate HW + PC_1_ALT3 = PC_1 | ALT3, // same pin used for alternate HW + PC_1_ALT4 = PC_1 | ALT4, // same pin used for alternate HW + PC_2 = 0x22, + PC_2C = PC_2 | DUAL_PAD, // dual pad + PC_2C_ALT0 = PC_2C | ALT0, // same pin used for alternate HW + PC_2_ALT0 = PC_2 | ALT0, // same pin used for alternate HW + PC_2_ALT1 = PC_2 | ALT1, // same pin used for alternate HW + PC_2_ALT2 = PC_2 | ALT2, // same pin used for alternate HW + PC_2_ALT3 = PC_2 | ALT3, // same pin used for alternate HW + PC_2_ALT4 = PC_2 | ALT4, // same pin used for alternate HW + PC_3 = 0x23, + PC_3C = PC_3 | DUAL_PAD, // dual pad + PC_3_ALT0 = PC_3 | ALT0, // same pin used for alternate HW + PC_3_ALT1 = PC_3 | ALT1, // same pin used for alternate HW + PC_3_ALT2 = PC_3 | ALT2, // same pin used for alternate HW + PC_4 = 0x24, + PC_4_ALT0 = PC_4 | ALT0, // same pin used for alternate HW + PC_5 = 0x25, + PC_5_ALT0 = PC_5 | ALT0, // same pin used for alternate HW + PC_5_ALT1 = PC_5 | ALT1, // same pin used for alternate HW + PC_5_ALT2 = PC_5 | ALT2, // same pin used for alternate HW + PC_6 = 0x26, + PC_6_ALT0 = PC_6 | ALT0, // same pin used for alternate HW + PC_7 = 0x27, + PC_7_ALT0 = PC_7 | ALT0, // same pin used for alternate HW + PC_8 = 0x28, + PC_8_ALT0 = PC_8 | ALT0, // same pin used for alternate HW + PC_9 = 0x29, + PC_9_ALT0 = PC_9 | ALT0, // same pin used for alternate HW + PC_10 = 0x2A, + PC_10_ALT0 = PC_10 | ALT0, // same pin used for alternate HW + PC_11 = 0x2B, + PC_11_ALT0 = PC_11 | ALT0, // same pin used for alternate HW + PC_12 = 0x2C, + PC_13 = 0x2D, + PC_14 = 0x2E, + PC_15 = 0x2F, + PD_0 = 0x30, + PD_1 = 0x31, + PD_2 = 0x32, + PD_3 = 0x33, + PD_4 = 0x34, + PD_5 = 0x35, + PD_6 = 0x36, + PD_7 = 0x37, + PD_8 = 0x38, + PD_9 = 0x39, + PD_10 = 0x3A, + PD_11 = 0x3B, + PD_12 = 0x3C, + PD_13 = 0x3D, + PD_14 = 0x3E, + PD_15 = 0x3F, + PE_0 = 0x40, + PE_1 = 0x41, + PE_2 = 0x42, + PE_3 = 0x43, + PE_4 = 0x44, + PE_5 = 0x45, + PE_6 = 0x46, + PE_7 = 0x47, + PE_8 = 0x48, + PE_9 = 0x49, + PE_10 = 0x4A, + PE_11 = 0x4B, + PE_12 = 0x4C, + PE_13 = 0x4D, + PE_14 = 0x4E, + PE_15 = 0x4F, + PF_0 = 0x50, + PF_1 = 0x51, + PF_2 = 0x52, + PF_3 = 0x53, + PF_4 = 0x54, + PF_4_ALT0 = PF_4 | ALT0, // same pin used for alternate HW + PF_5 = 0x55, + PF_6 = 0x56, + PF_6_ALT0 = PF_6 | ALT0, // same pin used for alternate HW + PF_7 = 0x57, + PF_8 = 0x58, + PF_8_ALT0 = PF_8 | ALT0, // same pin used for alternate HW + PF_9 = 0x59, + PF_9_ALT0 = PF_9 | ALT0, // same pin used for alternate HW + PF_10 = 0x5A, + PF_10_ALT0 = PF_10 | ALT0, // same pin used for alternate HW + PF_11 = 0x5B, + PF_12 = 0x5C, + PF_12_ALT0 = PF_12 | ALT0, // same pin used for alternate HW + PF_13 = 0x5D, + PF_14 = 0x5E, + PF_14_ALT0 = PF_14 | ALT0, // same pin used for alternate HW + PF_15 = 0x5F, + PG_0 = 0x60, + PG_1 = 0x61, + PG_2 = 0x62, + PG_3 = 0x63, + PG_4 = 0x64, + PG_5 = 0x65, + PG_6 = 0x66, + PG_7 = 0x67, + PG_8 = 0x68, + PG_9 = 0x69, + PG_10 = 0x6A, + PG_11 = 0x6B, + PG_12 = 0x6C, + PG_13 = 0x6D, + PG_14 = 0x6E, + PG_15 = 0x6F, + PH_0 = 0x70, + PH_1 = 0x71, + PH_2 = 0x72, + PH_3 = 0x73, + PH_3_ALT0 = PH_3 | ALT0, // same pin used for alternate HW + PH_4 = 0x74, + PH_4_ALT0 = PH_4 | ALT0, // same pin used for alternate HW + PH_5 = 0x75, + PH_5_ALT0 = PH_5 | ALT0, // same pin used for alternate HW + PH_6 = 0x76, + PH_7 = 0x77, + PH_8 = 0x78, + PH_9 = 0x79, + PH_10 = 0x7A, + PH_11 = 0x7B, + PH_12 = 0x7C, + PH_13 = 0x7D, + PH_14 = 0x7E, + PH_15 = 0x7F, + PI_0 = 0x80, + PI_1 = 0x81, + PI_2 = 0x82, + PI_3 = 0x83, + PI_4 = 0x84, + PI_5 = 0x85, + PI_6 = 0x86, + PI_7 = 0x87, + PI_8 = 0x88, + PI_9 = 0x89, + PI_10 = 0x8A, + PI_11 = 0x8B, + PI_12 = 0x8C, + PI_13 = 0x8D, + PI_14 = 0x8E, + PI_15 = 0x8F, + PJ_0 = 0x90, + PJ_1 = 0x91, + PJ_2 = 0x92, + PJ_3 = 0x93, + PJ_4 = 0x94, + PJ_5 = 0x95, + PJ_6 = 0x96, + PJ_7 = 0x97, + PJ_8 = 0x98, + PJ_8_ALT0 = PJ_8 | ALT0, // same pin used for alternate HW + PJ_9 = 0x99, + PJ_9_ALT0 = PJ_9 | ALT0, // same pin used for alternate HW + PJ_10 = 0x9A, + PJ_10_ALT0 = PJ_10 | ALT0, // same pin used for alternate HW + PJ_11 = 0x9B, + PJ_11_ALT0 = PJ_11 | ALT0, // same pin used for alternate HW + PJ_12 = 0x9C, + PJ_13 = 0x9D, + PJ_14 = 0x9E, + PJ_15 = 0x9F, + PK_0 = 0xA0, + PK_0_ALT0 = PK_0 | ALT0, // same pin used for alternate HW + PK_1 = 0xA1, + PK_1_ALT0 = PK_1 | ALT0, // same pin used for alternate HW + PK_2 = 0xA2, + PK_3 = 0xA3, + PK_4 = 0xA4, + PK_5 = 0xA5, + PK_6 = 0xA6, + PK_7 = 0xA7, + + ADC_TEMP = 0xF0, // Internal pin virtual value + ADC_VREF = 0xF1, // Internal pin virtual value + ADC_VBAT = 0xF2, // Internal pin virtual value + + // Not connected + NC = (int)0xFFFFFFFF, + + CONSOLE_TX = NC, + CONSOLE_RX = NC, + + WL_REG_ON = NC, + WL_HOST_WAKE = NC, + WL_SDIO_0 = NC, + WL_SDIO_1 = NC, + WL_SDIO_2 = NC, + WL_SDIO_3 = NC, + WL_SDIO_CMD = NC, + WL_SDIO_CLK = NC, + + CYBSP_BT_UART_RX = NC, + CYBSP_BT_UART_TX = NC, + CYBSP_BT_UART_RTS = NC, + CYBSP_BT_UART_CTS = NC, + + CYBSP_BT_POWER = NC, + CYBSP_BT_HOST_WAKE = NC, + CYBSP_BT_DEVICE_WAKE = NC, + + /**** QSPI FLASH pins ****/ + QSPI_FLASH1_IO0 = NC, + QSPI_FLASH1_IO1 = NC, + QSPI_FLASH1_IO2 = NC, + QSPI_FLASH1_IO3 = NC, + QSPI_FLASH1_SCK = NC, + QSPI_FLASH1_CSN = NC + +} PinName; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GIGA/PinNames.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GIGA/PinNames.h index e5463fe09..f7314dbac 100644 --- a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GIGA/PinNames.h +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GIGA/PinNames.h @@ -43,7 +43,7 @@ extern "C" { #endif -#define DUAL_PAD 0xF00 +#define DUAL_PAD 0x800 typedef enum { ALT0 = 0x100, diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_NICLA_VISION/PinNames.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_NICLA_VISION/PinNames.h index 9f14a66d6..42d24cd79 100644 --- a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_NICLA_VISION/PinNames.h +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_NICLA_VISION/PinNames.h @@ -467,6 +467,11 @@ typedef enum { NC = (int)0xFFFFFFFF } PinName; +// Standardized LED and button names +#define LED1 LED_RED +#define LED2 LED_GREEN +#define LED3 LED_BLUE + #ifdef __cplusplus } #endif diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_OPTA/PinNames.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_OPTA/PinNames.h index 93baf9ee1..efe0f63b2 100644 --- a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_OPTA/PinNames.h +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_OPTA/PinNames.h @@ -43,7 +43,7 @@ extern "C" { #endif -#define DUAL_PAD 0xF00 +#define DUAL_PAD 0x800 typedef enum { ALT0 = 0x100, diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_PORTENTA_H7/PinNames.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_PORTENTA_H7/PinNames.h index 585fb0ea8..0c088c81e 100644 --- a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_PORTENTA_H7/PinNames.h +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_PORTENTA_H7/PinNames.h @@ -43,7 +43,7 @@ extern "C" { #endif -#define DUAL_PAD 0xF00 +#define DUAL_PAD 0x800 typedef enum { ALT0 = 0x100, diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_PORTENTA_X8/PinNames.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_PORTENTA_X8/PinNames.h index 1cce05b2e..96f611cde 100644 --- a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_PORTENTA_X8/PinNames.h +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_PORTENTA_X8/PinNames.h @@ -43,7 +43,7 @@ extern "C" { #endif -#define DUAL_PAD 0xF00 +#define DUAL_PAD 0x800 typedef enum { ALT0 = 0x100, diff --git a/giga.variables b/giga.variables index eef4bae04..63eb5981c 100644 --- a/giga.variables +++ b/giga.variables @@ -1,5 +1,5 @@ export FLAVOUR="giga" export VARIANTS=("GIGA GENERIC_STM32H747_M4") export FQBNS=("giga") -export LIBRARIES=("MRI Portenta_SDRAM SPI WiFi ea_malloc openamp_arduino STM32H747_System ThreadDebug Himax_HM01B0 PDM Arduino_H7_Video USBAudio KernelDebug Portenta_Audio RPC USBHID Wire Portenta_lvgl Camera rpclib OV7670 mbed-memory-status Scheduler USBMSD USBMIDI SocketWrapper MCUboot Arduino_CAN") +export LIBRARIES=("MRI Portenta_SDRAM SPI WiFi ea_malloc openamp_arduino STM32H747_System ThreadDebug Himax_HM01B0 PDM Arduino_H7_Video USBAudio KernelDebug Portenta_Audio RPC USBHID Wire Portenta_lvgl Camera rpclib OV7670 GC2145 mbed-memory-status Scheduler USBMSD USBMIDI SocketWrapper MCUboot Arduino_CAN") export BOOTLOADERS=("GIGA") diff --git a/libraries/Arduino_CAN/src/Arduino_CAN.cpp b/libraries/Arduino_CAN/src/Arduino_CAN.cpp index de74c22c5..30690e83f 100644 --- a/libraries/Arduino_CAN/src/Arduino_CAN.cpp +++ b/libraries/Arduino_CAN/src/Arduino_CAN.cpp @@ -57,7 +57,10 @@ int Arduino_CAN::write(CanMsg const & msg) CANData, is_standard_id ? CANStandard : CANExtended); - return _can.write(can_msg); + int const rc = _can.write(can_msg); + if (rc == 0) /* mbed returns 0 in case of failed CAN::write(). */ + return -1; /* Note: provide named constant in ArduinoCore-API/HardwareCAN.h, i.e. CAN_WRITE_GENERIC_ERROR */ + return 1; } size_t Arduino_CAN::available() diff --git a/libraries/Arduino_CAN/src/Arduino_CAN.h b/libraries/Arduino_CAN/src/Arduino_CAN.h index b5d9fdd5a..649ae6f22 100644 --- a/libraries/Arduino_CAN/src/Arduino_CAN.h +++ b/libraries/Arduino_CAN/src/Arduino_CAN.h @@ -24,7 +24,7 @@ * COMPILE TIME CHECKS **************************************************************************************/ -#if !(defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_GIGA)) +#if !(defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_GIGA) || defined(CORE_CM4)) # error "CAN only available on Arduino Portenta H7 and Arduino Giga (of all ArduinoCore-mbed enabled boards)." #endif diff --git a/libraries/Arduino_H7_Video/docs/README.md b/libraries/Arduino_H7_Video/docs/README.md index 54e894a08..a8da54c49 100644 --- a/libraries/Arduino_H7_Video/docs/README.md +++ b/libraries/Arduino_H7_Video/docs/README.md @@ -46,6 +46,18 @@ void loop() { } - **[ArduinoLogo](../examples/ArduinoLogo):** This example demonstrates how to display an Arduino logo image on the screen. - **[ArduinoLogoDrawing](../examples/ArduinoLogoDrawing):** This example demonstrates how to draw an Arduino logo image using graphics primitives (line, circle, rect, etc.). - **[LVGLDemo](../examples/LVGLDemo):** This example demonstrates how to create a graphical user interface (GUI) using the LVGL library. It includes the [Arduino_GigaDisplayTouch](https://github.com/arduino-libraries/Arduino_GigaDisplayTouch/) library to handle touch events. +- **[emWinDemo](../examples/emWinDemo):** This example demonstrates how to create a graphical user interface (GUI) using the SEGGER emWin library. It includes the [emWin-Arduino-Library](https://github.com/SEGGERMicro/emWin-Arduino-Library) library. + +## Guides + +To learn more about usage of this library, you can check out the following guides: +- [GIGA Display Shield LVGL Guide](https://docs.arduino.cc/tutorials/giga-display-shield/lvgl-guide). +- [GIGA Display Shield Image Orientation Guide](https://docs.arduino.cc/tutorials/giga-display-shield/image-orientation) +- [GIGA Display Shield Image Draw Guide](https://docs.arduino.cc/tutorials/giga-display-shield/basic-draw-and-image) + + +You can also check out the following guide available in the Segger Wiki: +- using the SEGGER emWin library on the GIGA Display Shield, check out the [SEGGER emWin on Arduino Wiki](https://wiki.segger.com/emWin_on_Arduino). ## API diff --git a/libraries/Arduino_H7_Video/docs/api.md b/libraries/Arduino_H7_Video/docs/api.md index 356144b49..923393173 100644 --- a/libraries/Arduino_H7_Video/docs/api.md +++ b/libraries/Arduino_H7_Video/docs/api.md @@ -14,6 +14,7 @@ The main class for managing the video controller and the display. | `public ` [`Arduino_H7_Video`](#public-arduino_h7_videoint-width-int-height-h7displayshield-shield) | Construct a new Arduino_H7_Video object with the specified width, height, and display shield. | | `public int` [`begin`](#public-int-begin) | Initialize the video controller and display. | | `public void` [`end`](#public-void-end) | De-initialize the video controller and display. | +| `public bool` [`detect`](#public-bool-detect) | Checks if the display is connected. | | `public int` [`width`](#public-int-width) | Get the width of the display. | | `public int` [`height`](#public-int-height) | Get the height of the display. | | `public bool` [`isRotated`](#public-bool-isrotated) | Check if the display is rotated. | @@ -54,6 +55,15 @@ De-initialize the video controller and display. --- +### `public bool` [`detect`](#)`()` + +Checks if the display is connected. + +#### Returns +`bool`: True if the display is connected, False otherwis. + +--- + ### `public int` [`width`](#)`()` Get the width of the display. diff --git a/libraries/Arduino_H7_Video/examples/LVGLDemo/LVGLDemo.ino b/libraries/Arduino_H7_Video/examples/LVGLDemo/LVGLDemo.ino index 44b453e6c..385ead77c 100644 --- a/libraries/Arduino_H7_Video/examples/LVGLDemo/LVGLDemo.ino +++ b/libraries/Arduino_H7_Video/examples/LVGLDemo/LVGLDemo.ino @@ -17,7 +17,7 @@ Arduino_GigaDisplayTouch TouchDetector; /* Button click event callback */ static void btn_event_cb(lv_event_t * e) { static uint32_t cnt = 1; - lv_obj_t * btn = lv_event_get_target(e); + lv_obj_t * btn = (lv_obj_t *)lv_event_get_target(e); lv_obj_t * label = lv_obj_get_child(btn, 0); lv_label_set_text_fmt(label, "%"LV_PRIu32, cnt); cnt++; @@ -76,7 +76,11 @@ void setup() { lv_style_init(&style_radio); lv_style_set_radius(&style_radio, LV_RADIUS_CIRCLE); lv_style_init(&style_radio_chk); + #if (LVGL_VERSION_MAJOR == 9) + lv_style_set_bg_image_src(&style_radio_chk, NULL); + #else lv_style_set_bg_img_src(&style_radio_chk, NULL); + #endif cb = lv_checkbox_create(obj); lv_checkbox_set_text(cb, "Lemon"); diff --git a/libraries/Arduino_H7_Video/examples/LVGLDemo/img_arduinologo.c b/libraries/Arduino_H7_Video/examples/LVGLDemo/img_arduinologo.c index 244e45576..e938d7999 100644 --- a/libraries/Arduino_H7_Video/examples/LVGLDemo/img_arduinologo.c +++ b/libraries/Arduino_H7_Video/examples/LVGLDemo/img_arduinologo.c @@ -636,6 +636,15 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_IMG_ARDUI #endif }; +#if (LVGL_VERSION_MAJOR == 9) +const lv_img_dsc_t img_arduinologo = { + .header.cf = LV_COLOR_FORMAT_RGB565, + .header.w = 200, + .header.h = 150, + .data_size = 30000 * LV_COLOR_DEPTH / 8, + .data = img_arduinologo_map, +}; +#else const lv_img_dsc_t img_arduinologo = { .header.cf = LV_IMG_CF_TRUE_COLOR, .header.always_zero = 0, @@ -645,3 +654,4 @@ const lv_img_dsc_t img_arduinologo = { .data_size = 30000 * LV_COLOR_SIZE / 8, .data = img_arduinologo_map, }; +#endif \ No newline at end of file diff --git a/libraries/Arduino_H7_Video/examples/emWinDemo/emWinDemo.ino b/libraries/Arduino_H7_Video/examples/emWinDemo/emWinDemo.ino new file mode 100644 index 000000000..b5b933c84 --- /dev/null +++ b/libraries/Arduino_H7_Video/examples/emWinDemo/emWinDemo.ino @@ -0,0 +1,303 @@ +/* + emWinDemo + + created 04 Dec 2023 + by Leonardo Cavagnis +*/ + +#include "DIALOG.h" /* emWin library includes Arduino_H7_Video and Arduino_GigaDisplayTouch library */ + +/* +* Main window handler: It creates 4 window childs. +* Source: https://wiki.segger.com/WM_child_windows_(Sample) +*/ +static void _cbWin(WM_MESSAGE * pMsg) { + switch (pMsg->MsgId) { + case WM_CREATE: + /* [0, 0] - Image */ + WM_CreateWindowAsChild(20, 20, 370, 210, pMsg->hWin, WM_CF_SHOW, _cbChildWinImg, 0); + + /* [1, 0] - Slider */ + WM_CreateWindowAsChild(20, 210+20*2, 370, 210, pMsg->hWin, WM_CF_SHOW, _cbChildWinSlider, 0); + + /* [0, 1] - Checkbox, button and labels */ + WM_CreateWindowAsChild(370+20*2, 20, 370, 210, pMsg->hWin, WM_CF_SHOW, _cbChildWinChkBtn, 0); + + /* [1, 1] - Progress bar */ + WM_CreateWindowAsChild(370+20*2, 210+20*2, 370, 210, pMsg->hWin, WM_CF_SHOW, _cbChildWinPgrBar, 0); + break; + case WM_PAINT: + GUI_SetBkColor(0x03989e); /* Background color set to: R(0x03),G(0x98),B(0x9E) */ + GUI_Clear(); + break; + default: + WM_DefaultProc(pMsg); + break; + } +} + +/* +* Image window handler +* To convert image use "Bitmap Converter for emWin" +* https://www.segger.com/products/user-interface/emwin/tools/tools-overview/ +*/ +extern GUI_CONST_STORAGE GUI_BITMAP bmarduinologo; /* Image bitmap structure (see img_arduinologo_emwin.c in attach) */ + +static void _cbChildWinImg(WM_MESSAGE * pMsg) { + switch (pMsg->MsgId) { + case WM_CREATE: + break; + case WM_PAINT: + GUI_SetBkColor(GUI_WHITE); + GUI_Clear(); + /* Draw image */ + GUI_DrawBitmap(&bmarduinologo, 85, 35); + break; + default: + WM_DefaultProc(pMsg); + break; + } +} + +/* +* Slider window handler +* Source: https://wiki.segger.com/SLIDER_-_Usage_(Sample) +*/ +static void _cbChildWinSlider(WM_MESSAGE * pMsg) { + static WM_HWIN hSlider; + int NCode, Id; + int Value; + char acBuffer[32]; + + switch(pMsg->MsgId) { + case WM_CREATE: + /* Create horizonzal slider */ + hSlider = SLIDER_CreateEx(110, 90, 150, 30, pMsg->hWin, WM_CF_SHOW, SLIDER_CF_HORIZONTAL, GUI_ID_SLIDER0); + /* Set range of slider */ + SLIDER_SetRange(hSlider, 0, 100); + /* Set number of tick marks */ + SLIDER_SetNumTicks(hSlider, 10); + /* Set value of slider */ + SLIDER_SetValue(hSlider, 20); + /* Set width of thumb */ + SLIDER_SetWidth(hSlider, 20); + break; + case WM_PAINT: + GUI_SetBkColor(GUI_WHITE); + GUI_Clear(); + GUI_SetFont(&GUI_Font13B_1); + GUI_SetColor(GUI_BLACK); + + /* Display slider value */ + Value = SLIDER_GetValue(hSlider); + sprintf(acBuffer, "Value: %d", Value); + GUI_DispStringAt(acBuffer, 110, 120); + break; + case WM_NOTIFY_PARENT: + Id = WM_GetId(pMsg->hWinSrc); + NCode = pMsg->Data.v; + + switch(Id) { + case GUI_ID_SLIDER0: + switch(NCode) { + case WM_NOTIFICATION_VALUE_CHANGED: + /* Redraw the window when a value has changed so the displayed value will be updated */ + WM_InvalidateWindow(pMsg->hWin); + break; + } + break; + } + break; + default: + WM_DefaultProc(pMsg); + } +} + +/* +* Checkbox&Button window handler +* Source: +* https://wiki.segger.com/CHECKBOX_-_Usage_(Sample) +* https://wiki.segger.com/BUTTON_-_Usage_(Sample) +*/ +#define ID_BUTTON 1 + +static void _cbChildWinChkBtn(WM_MESSAGE * pMsg) { + static WM_HWIN hBox; + BUTTON_Handle hButton; + int NCode, Id; + char acBuffer[32]; + int State; + static int Clicked, Released; + + switch(pMsg->MsgId) { + case WM_CREATE: + /* Create CHECKBOX widget */ + hBox = CHECKBOX_CreateEx(10, 30, 80, 20, pMsg->hWin, WM_CF_SHOW, 0, GUI_ID_CHECK0); + /* Edit widget properties */ + CHECKBOX_SetText(hBox, "Check"); + CHECKBOX_SetTextColor(hBox, GUI_BLACK); + CHECKBOX_SetFont(hBox, &GUI_Font16_1); + /* Set number of possible states to 3 (if needed). The minimum number of states is 2 and the maximum is 3 */ + CHECKBOX_SetNumStates(hBox, 3); + /* Manually set the state */ + CHECKBOX_SetState(hBox, 1); + + /* Create a button */ + hButton = BUTTON_CreateEx(10, 100, 80, 20, pMsg->hWin, WM_CF_SHOW, 0, ID_BUTTON); + BUTTON_SetText(hButton, "Click me"); + break; + case WM_PAINT: + GUI_SetBkColor(GUI_WHITE); + GUI_Clear(); + GUI_SetFont(&GUI_Font16_1); + GUI_SetColor(GUI_BLACK); + + /* Display current CHECKBOX state */ + State = CHECKBOX_GetState(hBox); + sprintf(acBuffer, "State of checkbox: %d", State); + GUI_DispStringAt(acBuffer, 10, 60); + + /* Check button state and print info on labels */ + if(Clicked) { + sprintf(acBuffer, "Button was clicked at: %d.", Clicked); + GUI_DispStringAt(acBuffer, 10, 130); + } + if(Released) { + sprintf(acBuffer, "Button was released at: %d.", Released); + GUI_DispStringAt(acBuffer, 10, 150); + } + break; + case WM_NOTIFY_PARENT: + /* Get Id of sender window and notification code */ + Id = WM_GetId(pMsg->hWinSrc); + NCode = pMsg->Data.v; + + switch (Id) { + case GUI_ID_CHECK0: + switch(NCode) { + case WM_NOTIFICATION_VALUE_CHANGED: + /* When the value of the checkbox changed, redraw parent window to update the display of the state */ + WM_InvalidateWindow(pMsg->hWin); + break; + } + break; + case ID_BUTTON: + switch(NCode) { + case WM_NOTIFICATION_CLICKED: + Clicked = GUI_GetTime(); + WM_InvalidateWindow(pMsg->hWin); + break; + case WM_NOTIFICATION_RELEASED: + Released = GUI_GetTime(); + WM_InvalidateWindow(pMsg->hWin); + break; + } + break; + break; + } + break; + default: + WM_DefaultProc(pMsg); + } +} + +/* +* Progress bar window handler +* Source: https://wiki.segger.com/PROGBAR_-_Custom_(Sample) +*/ +PROGBAR_Handle hProg; + +static void _cbChildWinPgrBar(WM_MESSAGE * pMsg) { + GUI_RECT Rect; + float ValueF; + int Value; + char acBuffer[16]; + + switch (pMsg->MsgId) { + case WM_CREATE: + hProg = PROGBAR_CreateEx(85, 90, 200, 30, pMsg->hWin, WM_CF_SHOW, PROGBAR_CF_HORIZONTAL, GUI_ID_PROGBAR0); + WM_SetCallback(hProg, _cbProgbar); + break; + case WM_PAINT: + GUI_SetBkColor(GUI_WHITE); + GUI_Clear(); + break; + default: + WM_DefaultProc(pMsg); + break; + } +} + +/* +* Progress bar widget handler +* Source: https://wiki.segger.com/PROGBAR_-_Custom_(Sample) +*/ +static void _cbProgbar(WM_MESSAGE * pMsg) { + GUI_RECT Rect; + float ValueF; + int Value; + char acBuffer[16]; + + switch (pMsg->MsgId) { + case WM_PAINT: + GUI_SetBkColor(GUI_WHITE); + GUI_Clear(); + /* Draw progress bar */ + WM_GetClientRect(&Rect); + GUI_SetColor(GUI_BLACK); + GUI_AA_DrawRoundedRectEx(&Rect, 3); + Value = PROGBAR_GetValue(pMsg->hWin); + ValueF = Value / 100.0F; + sprintf(acBuffer, "Progress: %d%%", Value); + Rect.x0 += 2; + Rect.y0 += 2; + Rect.x1 -= 2; + Rect.y1 -= 2; + Rect.x1 = Rect.x1 * (ValueF); + GUI_SetColor(GUI_GRAY_9A); + GUI_AA_FillRoundedRectEx(&Rect, 1); + WM_GetClientRect(&Rect); + Rect.x0 += 2; + Rect.y0 += 2; + Rect.x1 -= 2; + Rect.y1 -= 2; + GUI_SetColor(GUI_BLACK); + GUI_SetTextMode(GUI_TM_TRANS); + GUI_SetFont(&GUI_Font16B_1); + GUI_DispStringInRect(acBuffer, &Rect, GUI_TA_HCENTER | GUI_TA_VCENTER); + break; + default: + PROGBAR_Callback(pMsg); + break; + } +} + +int progbarCnt = 0; +unsigned long previousMillis = 0; + +void setup() { + /* Init SEGGER emWin library. It also init display and touch controller */ + GUI_Init(); + + LCD_ROTATE_SetSel(1); /* Set landscape mode */ + WM_MULTIBUF_Enable(1); /* Enable multi buffering mode for Windows manager */ + + /* Create the main window. It will include all the sub-windows */ + WM_CreateWindowAsChild(0, 0, LCD_GetXSize(), LCD_GetYSize(), WM_HBKWIN, WM_CF_SHOW, _cbWin, 0); +} + +void loop() { + /* Update progress bar value */ + if (millis() - previousMillis >= 100) { + previousMillis = millis(); + progbarCnt++; + if (progbarCnt > 100) { + progbarCnt = 0; + } + PROGBAR_SetValue(hProg, progbarCnt); + WM_InvalidateWindow(hProg); /* Make sure the entire PROGBAR gets redrawn */ + } + + /* Keep emWin alive, handle touch and other stuff */ + GUI_Exec(); +} \ No newline at end of file diff --git a/libraries/Arduino_H7_Video/examples/emWinDemo/img_arduinologo_emwin.c b/libraries/Arduino_H7_Video/examples/emWinDemo/img_arduinologo_emwin.c new file mode 100644 index 000000000..620223312 --- /dev/null +++ b/libraries/Arduino_H7_Video/examples/emWinDemo/img_arduinologo_emwin.c @@ -0,0 +1,1995 @@ +/********************************************************************* +* (c) 1998 - 2023 SEGGER Microcontroller GmbH * +* Solutions for real time microcontroller applications * +* www.segger.com * +********************************************************************** +* * +* C-file generated by * +* * +* Bitmap Converter for emWin (Demo version) V6.34. * +* Compiled Jul 6 2023, 14:21:44 * +* * +* (c) 1998 - 2023 SEGGER Microcontroller GmbH * +* * +* May not be used in a product * +* * +********************************************************************** +* * +* Source file: arduinologo * +* Dimensions: 200 * 139 * +* NumColors: 65536 colors + 8 bit alpha channel * +* NumBytes: 83420 * +* * +********************************************************************** +*/ + +#include + +#include "GUI.h" + +#ifndef GUI_CONST_STORAGE + #define GUI_CONST_STORAGE const +#endif + +extern GUI_CONST_STORAGE GUI_BITMAP bmarduinologo; + +static GUI_CONST_STORAGE unsigned char _acarduinologo[] = { + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xCE,0x4F, 0x00,0xA4,0xE1, 0x00,0xAD,0x00, + 0x00,0xA4,0xE0, 0x00,0xB5,0x88, 0x00,0xEF,0x59, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xF7,0xBC, + 0x00,0xEF,0x7A, 0x00,0xEF,0x59, 0x00,0xE7,0x37, 0x00,0xE7,0x16, 0x00,0xE7,0x16, 0x00,0xE7,0x17, 0x00,0xE7,0x38, 0x00,0xEF,0x59, 0x00,0xEF,0x9B, 0x00,0xF7,0xBD, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xF7,0xBC, 0x00,0xEF,0x7A, 0x00,0xEF,0x59, 0x00,0xE7,0x37, 0x00,0xE7,0x16, + 0x00,0xE7,0x16, 0x00,0xE7,0x16, 0x00,0xE7,0x38, 0x00,0xEF,0x59, 0x00,0xEF,0x9B, 0x00,0xF7,0xBC, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xAD,0x44, 0x00,0xA4,0xE1, 0x00,0xD6,0xB2, 0x00,0xEF,0x59, + 0x00,0xE7,0x16, 0x00,0xB5,0x87, 0x00,0xAD,0x00, 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xEF,0x7A, 0x00,0xDE,0xF5, 0x00,0xCE,0x6F, 0x00,0xBD,0xCA, 0x00,0xB5,0x67, 0x00,0xAD,0x24, 0x00,0xA5,0x02, + 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xAD,0x03, 0x00,0xAD,0x45, 0x00,0xB5,0x88, 0x00,0xC6,0x0C, 0x00,0xD6,0x91, 0x00,0xE7,0x17, + 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xEF,0x7A, 0x00,0xDE,0xF5, 0x00,0xCE,0x70, 0x00,0xBD,0xEB, 0x00,0xB5,0x87, 0x00,0xAD,0x24, 0x00,0xA5,0x02, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, + 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xA5,0x03, 0x00,0xAD,0x45, 0x00,0xB5,0x88, 0x00,0xC5,0xEC, 0x00,0xD6,0x91, 0x00,0xE7,0x16, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x87, 0x00,0xAD,0x23, 0x00,0xF7,0x9C, 0x00,0xDE,0xD4, 0x00,0xCE,0x6F, + 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xCE,0x4F, 0x00,0xAD,0x00, 0x00,0xEF,0x79, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x9B, 0x00,0xDE,0xD3, 0x00,0xC5,0xEB, 0x00,0xAD,0x45, 0x00,0xA4,0xC1, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, + 0x00,0xA4,0xE2, 0x00,0xB5,0x66, 0x00,0xC6,0x2D, 0x00,0xDE,0xF5, 0x00,0xF7,0xBC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xEF,0x7B, 0x00,0xDE,0xD3, 0x00,0xC5,0xEB, 0x00,0xAD,0x45, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xE1, 0x00,0xB5,0x66, 0x00,0xC6,0x2D, 0x00,0xDE,0xF6, + 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xAD,0x20, 0x00,0xEF,0x7A, 0x00,0xEF,0x9B, 0x00,0xAD,0x40, 0x00,0xB5,0x46, + 0x00,0xA4,0xE0, 0x00,0xCE,0x2D, 0x00,0xFF,0xFF, 0x00,0xAD,0x45, 0x00,0xBD,0xA9, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xF7,0x9B, 0x00,0xD6,0x92, 0x00,0xB5,0x88, 0x00,0xA4,0xE1, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x02, 0x00,0xBD,0xCA, 0x00,0xDE,0xD4, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x9B, 0x00,0xD6,0x91, 0x00,0xB5,0x87, + 0x00,0xA4,0xE1, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, + 0x00,0xA5,0x03, 0x00,0xBD,0xCA, 0x00,0xDE,0xF5, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x4F, 0x00,0xAD,0x23, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0xA4,0xC0, 0x00,0xF7,0xBD, + 0x00,0xBD,0xCA, 0x00,0xA5,0x03, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, 0x00,0xA4,0xC0, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, + 0x00,0xBD,0xCA, 0x00,0xA4,0xE1, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x02, 0x00,0xC5,0xEC, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xDE,0xD4, 0x00,0xBD,0xA9, 0x00,0xA4,0xE1, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, + 0x00,0xA4,0xC0, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xAD,0x23, 0x00,0xC6,0x2D, 0x00,0xEF,0x59, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC6,0x0D, 0x00,0xB5,0x66, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0xA4,0xC0, 0x00,0xAD,0x24, + 0x00,0xA4,0xC1, 0x00,0xDE,0xD3, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xAD,0x00, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0xB5,0x87, 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xD6,0x91, 0x00,0xAD,0x44, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0xBD,0xCA, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x70, 0x00,0xA4,0xE2, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0xA4,0xE0, 0x00,0xCE,0x2E, + 0x00,0xA4,0xE1, 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, 0x00,0xCE,0x4F, 0x00,0xA4,0xE1, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xAD,0x45, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xB5,0x46, 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xCE,0x70, 0x00,0xA5,0x03, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xBD,0xA9, 0x00,0xE7,0x58, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0xAD,0x00, 0x00,0xDE,0xF5, 0x00,0xF7,0xDD, 0x00,0xAD,0x23, 0x00,0xF7,0x9C, + 0x00,0xCE,0x2D, 0x00,0xB5,0x87, 0x00,0xFF,0xFF, 0x00,0xA4,0xE2, 0x00,0xC6,0x0D, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xB5,0x67, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xB5,0x66, + 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x92, 0x00,0xA5,0x03, 0x00,0xAD,0x00, 0x00,0xA4,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xC5,0xEB, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC6,0x0D, 0x00,0xA5,0x00, 0x00,0xE7,0x17, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xB5,0x67, 0x00,0xA4,0xE1, 0x00,0xF7,0xBD, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xC6,0x0C, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, + 0x00,0xA4,0xE0, 0x00,0xBD,0xCA, 0x00,0xEF,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x17, 0x00,0xB5,0x46, 0x00,0xAD,0x00, 0x00,0xA4,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xA4,0xE2, 0x00,0xD6,0x92, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC5,0xEB, 0x00,0xAD,0x00, 0x00,0xB5,0x88, 0x00,0xCE,0x4E, + 0x00,0xC5,0xEC, 0x00,0xA4,0xE1, 0x00,0xA5,0x02, 0x00,0xEF,0x79, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF6, 0x00,0xAD,0x23, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xA4,0xE1, 0x00,0xD6,0x91, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xF7,0xBD, 0x00,0xC5,0xEB, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xB5,0x88, 0x00,0xEF,0x9B, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x17, 0x00,0xBD,0xCA, 0x00,0xB5,0x66, + 0x00,0xB5,0x88, 0x00,0xD6,0x91, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x2E, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xB5,0x87, 0x00,0xEF,0x7B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF6, + 0x00,0xA5,0x03, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA5,0x00, 0x00,0xA4,0xE1, + 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xB5,0x67, 0x00,0xAD,0x20, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA5,0x00, 0x00,0xA4,0xE1, 0x00,0xDE,0xD3, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC6,0x2D, 0x00,0xA5,0x00, + 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, + 0x00,0xAD,0x00, 0x00,0xC6,0x2D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, + 0x00,0xFF,0xFF, 0x00,0xE7,0x38, 0x00,0xA5,0x03, 0x00,0xA5,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xEF,0x9B, 0x00,0xB5,0x66, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xB5,0x88, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, + 0x00,0xDE,0xF5, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xB5,0x66, 0x00,0xF7,0x9C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE1, 0x00,0xA5,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xAD,0x45, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, + 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA5,0x00, 0x00,0xA5,0x02, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x92, 0x00,0xA4,0xE0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA5,0x00, 0x00,0xA5,0x03, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xA4,0xE0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x2E, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xA5,0x02, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, + 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xD6,0xB2, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC5,0xEB, 0x00,0xAD,0x20, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xAD,0x00, + 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xA5,0x03, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0xAD,0x24, + 0x00,0xB5,0x66, 0x00,0xBD,0xA9, 0x00,0xBD,0xEA, 0x00,0xC5,0xEC, 0x00,0xC6,0x0C, 0x00,0xC5,0xEB, 0x00,0xBD,0xCA, 0x00,0xB5,0x87, 0x00,0xAD,0x45, 0x00,0xA5,0x02, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xCE,0x70, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0xAD,0x23, 0x00,0xB5,0x66, 0x00,0xB5,0x88, 0x00,0xBD,0xCA, 0x00,0xC5,0xEB, + 0x00,0xC6,0x0C, 0x00,0xC5,0xEB, 0x00,0xBD,0xCA, 0x00,0xB5,0x88, 0x00,0xB5,0x66, 0x00,0xA5,0x03, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xAD,0x24, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0xA4,0xE1, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA4,0xE2, 0x00,0xB5,0x88, 0x00,0xCE,0x4F, 0x00,0xDE,0xF5, 0x00,0xEF,0x7A, 0x00,0xF7,0xDD, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xF7,0xBC, 0x00,0xEF,0x58, 0x00,0xDE,0xD3, 0x00,0xC6,0x0D, 0x00,0xAD,0x46, 0x00,0x9C,0xC0, + 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xCE,0x4F, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA8, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA4,0xE2, 0x00,0xB5,0x88, 0x00,0xCE,0x4F, 0x00,0xDE,0xF5, 0x00,0xEF,0x7A, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xEF,0x59, 0x00,0xDE,0xD4, 0x00,0xC6,0x0D, 0x00,0xB5,0x66, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xB5,0x67, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xAD,0x00, 0x00,0xA4,0xE1, 0x00,0xBD,0xA9, 0x00,0xDE,0xD3, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, + 0x00,0xD6,0x70, 0x00,0xB5,0x67, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, + 0x00,0xCE,0x70, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xA4,0xE1, 0x00,0xBD,0xC9, 0x00,0xDE,0xD3, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0xD6,0x70, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xCA, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xA5,0x02, 0x00,0xCE,0x4E, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x38, 0x00,0xC6,0x0C, 0x00,0xA4,0xE1, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xAD,0x00, 0x00,0xD6,0x91, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xCA, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, + 0x00,0xAD,0x24, 0x00,0xCE,0x70, 0x00,0xEF,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xBD,0xCA, + 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xDE,0xB3, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xDE,0xB2, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xA4,0xE1, 0x00,0xCE,0x4F, 0x00,0xF7,0xBC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x9B, 0x00,0xCE,0x2E, 0x00,0xA4,0xE1, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC6,0x0C, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xAD,0x24, 0x00,0xD6,0x92, + 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xEF,0x59, 0x00,0xBD,0xCA, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7B, 0x00,0xA4,0xE1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xC0, + 0x00,0xA4,0xE0, 0x00,0xBD,0xCA, 0x00,0xEF,0x7B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x9B, 0x00,0xC5,0xEB, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xCE,0x4F, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xA4,0xE1, 0x00,0xCE,0x70, 0x00,0xF7,0xDE, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x17, 0x00,0xB5,0x46, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x67, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA8, 0x00,0xA5,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA5,0x00, 0x00,0xA5,0x02, + 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x17, 0x00,0xAD,0x45, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xE1, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, + 0x00,0xDE,0xD3, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xBD,0xA9, 0x00,0xEF,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x4F, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xD6,0x91, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xB5,0x87, 0x00,0xF7,0x9B, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xCE,0x2E, 0x00,0xA4,0xE0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x44, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x38, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA5,0x00, 0x00,0xA4,0xE2, 0x00,0xDE,0xD3, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA5,0x02, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xAD,0x24, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA5,0x02, 0x00,0xA5,0x00, 0x00,0x9C,0xC1, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xBD,0xA9, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xA5,0x02, + 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xB5,0x67, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xF7,0x9C, 0x00,0xB5,0x46, 0x00,0xA5,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xBD,0xEB, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xCE,0x70, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xCE,0x4E, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0x9C, 0x00,0xB5,0x67, 0x00,0xAD,0x00, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x87, 0x00,0xA5,0x00, + 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xB5,0x87, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xA5,0x02, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC5,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xDE,0xF6, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x2E, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xD6,0x92, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xB5,0x87, 0x00,0xA5,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xBD,0xA9, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x6F, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x2D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xCE,0x4E, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xE2, 0x00,0xF7,0x9C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xB5,0x66, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, + 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xAD,0x03, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xBD,0xA9, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xD6,0x70, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xA5,0x02, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xE1, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xA5,0x03, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, + 0x00,0xBD,0xCA, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0xB3, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x44, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x92, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0x91, 0x00,0xBD,0xEB, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xC0, 0x00,0xA4,0xE1, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xC1, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x67, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x71, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, + 0x00,0xA4,0xC0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xCE,0x70, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x58, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x2E, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x4F, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, + 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xE0, 0x00,0xAD,0x45, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x4E, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x24, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC6,0x0C, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xDE,0xD4, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xD6,0xB2, 0x00,0xDE,0xB3, 0x00,0xD6,0xB3, 0x00,0xD6,0xB3, 0x00,0xD6,0xB3, + 0x00,0xD6,0xB3, 0x00,0xD6,0xB3, 0x00,0xD6,0xB2, 0x00,0xDE,0xF6, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x38, 0x00,0xA4,0xE0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x17, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x46, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xDE,0xD3, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0xA8, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x70, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xAD,0x45, 0x00,0xAD,0x40, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, + 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xB5,0x40, 0x00,0xB5,0x66, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x2D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x45, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xAD,0x24, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xBD,0xEB, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0xA4,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, 0x00,0xA4,0xE0, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x45, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xD6,0x92, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0xB2, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xEF,0x79, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x46, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x87, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xBD,0xCA, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xBD,0xCA, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xAD,0x03, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xEF,0x7B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0xB2, 0x00,0xFF,0xFF, + 0x00,0xFF,0xDE, 0x00,0xAD,0x24, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC6,0x0D, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xDE,0xD5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC5,0xEB, 0x00,0xFF,0xFF, + 0x00,0xEF,0x7A, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x17, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xCE,0x4E, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x46, 0x00,0xFF,0xFF, + 0x00,0xDE,0xF5, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x23, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x58, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x45, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x02, 0x00,0xF7,0xBC, + 0x00,0xCE,0x70, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xBD,0xCA, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xCE,0x4F, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x17, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x87, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xA5,0x03, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xEF,0x59, + 0x00,0xC6,0x0C, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0x70, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0xA8, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xF5, + 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xDE,0xF6, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0xD6,0x92, 0x00,0xD6,0xB3, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, + 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, + 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xF7,0xBC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x23, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, + 0x00,0xD6,0x92, 0x00,0xD6,0xB3, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xAD,0x24, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x25, 0x00,0xDE,0xB3, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0x92, 0x00,0xDE,0xF6, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC6,0x2D, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0x91, + 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xB3, 0x00,0xB5,0x40, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, + 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, + 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xAD,0x20, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC6,0x0C, 0x00,0xAD,0x00, + 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, + 0x00,0xAD,0x40, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xB5,0x40, 0x00,0xB5,0x66, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x92, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xCE,0x4E, + 0x00,0xA5,0x02, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xE2, 0x00,0xF7,0xBC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xA5,0x00, 0x00,0xA4,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xC0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0x9C, 0x00,0xA4,0xE2, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x88, + 0x00,0xA4,0xE0, 0x00,0xA4,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, 0x00,0xA4,0xE0, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xE0, 0x00,0xA5,0x03, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xD6,0x70, + 0x00,0xAD,0x20, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x88, + 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC5,0xEB, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xE0, 0x00,0xAD,0x24, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, + 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xC5,0xEC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x88, + 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x38, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xBD,0xCA, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xE0, 0x00,0xAD,0x25, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, + 0x00,0xBD,0xEB, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xDE,0xD3, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x88, + 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x38, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xBD,0xA9, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xE0, 0x00,0xAD,0x24, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x45, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x88, + 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x38, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xBD,0xCA, + 0x00,0xA4,0xE1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xC0, 0x00,0xA5,0x03, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0x91, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x88, + 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC5,0xEC, + 0x00,0xA5,0x03, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF6, 0x00,0xA4,0xE0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA5,0x02, 0x00,0xF7,0xBC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x88, + 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x2D, + 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xE7,0x58, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xAD,0x20, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, + 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, + 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x87, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xB5,0x87, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x70, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xCE,0x4F, + 0x00,0xBD,0xCA, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xE7,0x16, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, + 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, + 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x37, 0x00,0xE7,0x17, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xCE,0x6F, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, + 0x00,0xE7,0x16, 0x00,0xE7,0x37, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x37, 0x00,0xE7,0x37, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x46, 0x00,0xE7,0x38, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x17, 0x00,0xE7,0x37, 0x00,0xE7,0x16, 0x00,0xEF,0x59, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC5,0xEB, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0xB3, + 0x00,0xCE,0x2D, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xCE,0x2E, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x46, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x46, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x16, + 0x00,0xD6,0xB2, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x87, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x87, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x87, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xEF,0x9B, 0x00,0xA4,0xE1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xEF,0x7A, + 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xD6,0x70, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xE7,0x58, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x03, 0x00,0xF7,0xDD, + 0x00,0xF7,0x9C, 0x00,0xA4,0xE2, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xDE,0xB3, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x58, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x45, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xBD,0xCA, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xAD,0x24, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xBD,0xCA, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xF7,0x9B, 0x00,0xA4,0xE2, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xCE,0x2D, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x59, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xC9, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0x91, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, + 0x00,0xD6,0x91, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xDE,0xF6, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x70, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, + 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE2, 0x00,0xF7,0xBC, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xA4,0xE2, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xEF,0x7B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA5,0x02, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x87, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xDE,0xD3, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xBD,0xA9, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0xA4,0xE1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xB5,0x66, 0x00,0xFF,0xDE, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0xA4,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xAD,0x44, + 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0x91, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xB3, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x9B, 0x00,0xA5,0x03, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xBD,0xA9, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x79, 0x00,0xE7,0x38, 0x00,0xE7,0x58, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, + 0x00,0xE7,0x38, 0x00,0xE7,0x58, 0x00,0xE7,0x38, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xCE,0x70, 0x00,0xAD,0x00, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xEF,0x7B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xA5,0x02, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x66, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, + 0x00,0xC5,0xEB, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0xA4,0xC1, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA5,0x00, 0x00,0xBD,0xA9, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC6,0x0C, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xB5,0x66, 0x00,0xA5,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x45, 0x00,0xA5,0x03, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x67, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA5,0x00, 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x58, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xDE,0xF6, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, + 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xB5,0x46, 0x00,0xA5,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xF7,0x9B, 0x00,0xDE,0xD4, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC6,0x2D, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, + 0x00,0xAD,0x24, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x88, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xE1, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, + 0x00,0xF7,0x9C, 0x00,0xAD,0x45, 0x00,0xA5,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0x92, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xCA, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC5,0xEB, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xD6,0xB2, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, + 0x00,0xD6,0x70, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDF,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x24, 0x00,0xF7,0x9C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, + 0x00,0xAD,0x23, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xBD,0xCA, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xAD,0x24, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xBD,0xA9, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA5,0x03, + 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x87, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xAD,0x45, 0x00,0xF7,0x9C, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF6, 0x00,0xA4,0xE1, + 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x24, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x38, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA5,0x00, 0x00,0xB5,0x46, 0x00,0xEF,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x4F, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x17, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xAD,0x24, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x70, 0x00,0xA4,0xE0, 0x00,0xA4,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x59, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xD6,0x92, 0x00,0xAD,0x00, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xA5,0x02, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x23, 0x00,0xF7,0xDD, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xCA, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE2, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xBD,0xA9, 0x00,0xAD,0x00, 0x00,0x9C,0xA0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xD3, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC5,0xEC, + 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xE0, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x70, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xDE,0xB3, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x9B, 0x00,0xA4,0xE1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xCE,0x70, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xA5,0x03, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x4E, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xB5,0x67, 0x00,0xA5,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xB5,0x67, 0x00,0xEF,0x59, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xBD,0xCA, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x67, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x71, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, + 0x00,0xB5,0x88, 0x00,0xEF,0x79, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0xBD,0xCA, 0x00,0xA4,0xE0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xBD,0xCA, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xF7,0xBC, 0x00,0xAD,0x24, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0xCE,0x4F, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xAD,0x23, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x58, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x87, 0x00,0xA5,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xE0, 0x00,0xA4,0xE1, 0x00,0xCE,0x4F, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xCE,0x2E, 0x00,0xA4,0xE1, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC1, 0x00,0xA5,0x00, 0x00,0xB5,0x67, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0xA4,0xE1, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xAD,0x24, 0x00,0xD6,0xB2, 0x00,0xFF,0xFE, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0xBD,0xCA, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x6F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7B, 0x00,0xA4,0xE1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xAD,0x23, 0x00,0xD6,0x70, 0x00,0xF7,0xBC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7B, 0x00,0xCE,0x4F, 0x00,0xA5,0x02, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xA5,0x00, 0x00,0xAD,0x45, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xAD,0x45, + 0x00,0xDE,0xB2, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, + 0x00,0xC6,0x0D, 0x00,0xA4,0xC1, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA5,0x00, 0x00,0xB5,0x87, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xAD,0x03, 0x00,0xC6,0x2D, 0x00,0xEF,0x58, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xF7,0xDD, 0x00,0xE7,0x16, 0x00,0xBD,0xEB, 0x00,0xA4,0xE1, 0x00,0xAD,0x00, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, + 0x00,0xAD,0x24, 0x00,0xF7,0x9C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xDE,0xF6, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, + 0x00,0xA5,0x00, 0x00,0xAD,0x24, 0x00,0xCE,0x2E, 0x00,0xEF,0x59, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xDE,0xF6, 0x00,0xBD,0xCA, 0x00,0xA4,0xE1, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA5,0x02, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x2E, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0xB5,0x67, 0x00,0xCE,0x4F, 0x00,0xE7,0x37, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0x9B, 0x00,0xDE,0xF5, 0x00,0xC6,0x0D, + 0x00,0xAD,0x24, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xAD,0x03, + 0x00,0xEF,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0xB5,0x67, 0x00,0xCE,0x4F, 0x00,0xE7,0x17, 0x00,0xF7,0xBC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0x9B, 0x00,0xDE,0xF5, 0x00,0xC6,0x2D, 0x00,0xAD,0x24, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xDF,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xCA, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0xAD,0x24, 0x00,0xB5,0xA8, 0x00,0xCE,0x2E, 0x00,0xD6,0xB2, + 0x00,0xDE,0xF5, 0x00,0xE7,0x37, 0x00,0xEF,0x58, 0x00,0xEF,0x59, 0x00,0xEF,0x7A, 0x00,0xEF,0x59, 0x00,0xE7,0x38, 0x00,0xE7,0x16, 0x00,0xDE,0xD4, 0x00,0xD6,0x70, 0x00,0xC5,0xEC, 0x00,0xB5,0x66, 0x00,0xA5,0x02, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, + 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA5,0x00, 0x00,0xAD,0x24, 0x00,0xEF,0x7A, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xA4,0xC0, 0x00,0xAD,0x03, 0x00,0xB5,0x88, 0x00,0xC6,0x2D, 0x00,0xD6,0x92, 0x00,0xDE,0xF5, 0x00,0xE7,0x17, 0x00,0xE7,0x58, 0x00,0xEF,0x59, + 0x00,0xEF,0x7A, 0x00,0xEF,0x59, 0x00,0xE7,0x58, 0x00,0xE7,0x17, 0x00,0xDE,0xF5, 0x00,0xD6,0x91, 0x00,0xC6,0x0C, 0x00,0xB5,0x67, 0x00,0xA5,0x02, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xD6,0x92, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x88, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xA5,0x00, + 0x00,0xA4,0xE0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xB5,0x66, 0x00,0xF7,0xBC, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE1, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xCE,0x70, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xB5,0x87, 0x00,0xAD,0x00, + 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0xA5,0x02, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x20, 0x00,0xCE,0x2E, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xB5,0x87, + 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC5,0xEB, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xEF,0x7B, 0x00,0xAD,0x45, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xCE,0x2E, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, + 0x00,0xB5,0x88, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xBD,0xA9, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xC5,0xEB, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xA4,0xE1, 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x2E, 0x00,0xA4,0xE0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC1, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xE0, 0x00,0xD6,0xB2, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x6F, 0x00,0xA4,0xE0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xB5,0x66, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xA4,0xE2, 0x00,0xA5,0x00, + 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xA4,0xE0, 0x00,0xA4,0xE1, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xA4,0xE2, 0x00,0xA5,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xC6,0x2D, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x9B, 0x00,0xB5,0x88, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, + 0x00,0xB5,0x66, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x9B, 0x00,0xB5,0x88, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xAD,0x24, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xD6,0x91, 0x00,0xA4,0xE1, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xC6,0x2D, + 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, 0x00,0xA4,0xE1, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0xCE,0x2E, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xAD,0x44, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0xBD,0xC9, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, + 0x00,0xBD,0xA8, 0x00,0xEF,0x58, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xAD,0x45, 0x00,0xAD,0x00, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xA4,0xC1, 0x00,0xCE,0x4E, 0x00,0xF7,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF6, 0x00,0xB5,0x66, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xB5,0x66, 0x00,0xDE,0xF5, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xD6,0x91, 0x00,0xA5,0x03, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xA4,0xC0, 0x00,0xBD,0xCA, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD3, 0x00,0xB5,0x46, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xB5,0x67, 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xCE,0x70, 0x00,0xAD,0x24, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0xBD,0xA9, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD5, 0x00,0xBD,0xA8, + 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xA4,0xE1, 0x00,0xBD,0xCA, 0x00,0xDE,0xF6, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xD6,0xB2, 0x00,0xB5,0x67, 0x00,0xA4,0xC0, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xA5,0x02, 0x00,0xC5,0xEC, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xEF,0x59, 0x00,0xCE,0x2E, 0x00,0xAD,0x44, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0xB5,0x66, 0x00,0xCE,0x70, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xC6,0x0D, 0x00,0xAD,0x24, 0x00,0xA4,0xE0, + 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, + 0x00,0xAD,0x00, 0x00,0xA4,0xC0, 0x00,0xB5,0x67, 0x00,0xD6,0x91, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xE7,0x16, 0x00,0xCE,0x2D, 0x00,0xB5,0x46, 0x00,0xA4,0xC0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, + 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xE1, 0x00,0xB5,0x87, 0x00,0xCE,0x4F, 0x00,0xE7,0x58, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xDE,0xF6, + 0x00,0xC6,0x0D, 0x00,0xAD,0x45, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xE2, 0x00,0xB5,0x88, + 0x00,0xCE,0x70, 0x00,0xEF,0x59, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xEF,0x59, 0x00,0xDE,0xB3, 0x00,0xC6,0x0D, 0x00,0xB5,0x87, 0x00,0xA5,0x03, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, + 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xE1, 0x00,0xAD,0x24, 0x00,0xBD,0xA9, + 0x00,0xCE,0x2E, 0x00,0xDE,0xF5, 0x00,0xEF,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xEF,0x59, 0x00,0xDE,0xB3, 0x00,0xC6,0x0D, 0x00,0xB5,0x67, 0x00,0xA5,0x03, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, + 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xE1, 0x00,0xAD,0x24, 0x00,0xBD,0xA9, 0x00,0xCE,0x4E, 0x00,0xDE,0xF5, 0x00,0xEF,0x9B, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xEF,0x59, 0x00,0xDE,0xF5, 0x00,0xD6,0xB2, 0x00,0xCE,0x4F, + 0x00,0xC6,0x0C, 0x00,0xBD,0xCA, 0x00,0xBD,0xC9, 0x00,0xBD,0xA9, 0x00,0xBD,0xA9, 0x00,0xBD,0xA9, 0x00,0xBD,0xCA, 0x00,0xC5,0xEB, 0x00,0xC6,0x0D, 0x00,0xCE,0x70, 0x00,0xDE,0xD3, 0x00,0xE7,0x16, 0x00,0xEF,0x7A, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xEF,0x59, 0x00,0xDE,0xF5, 0x00,0xD6,0xB2, 0x00,0xCE,0x4F, 0x00,0xC6,0x0C, 0x00,0xBD,0xEB, 0x00,0xBD,0xCA, 0x00,0xBD,0xA9, + 0x00,0xBD,0xA9, 0x00,0xBD,0xA9, 0x00,0xBD,0xCA, 0x00,0xBD,0xEB, 0x00,0xC6,0x0D, 0x00,0xCE,0x70, 0x00,0xDE,0xD3, 0x00,0xE7,0x16, 0x00,0xEF,0x7A, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xE7,0x38, + 0x00,0xE7,0x37, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x37, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xE7,0x37, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, + 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xEF,0x7A, 0x00,0xF7,0xBC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xE7,0x37, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xEF,0x59, 0x00,0xEF,0x9B, 0x00,0xF7,0xDD, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, + 0x00,0xE7,0x37, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x37, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0x9C, + 0x00,0xE7,0x37, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0xE7,0x37, 0x00,0xE7,0x38, + 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, + 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x37, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDE, 0x00,0xE7,0x37, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, + 0x00,0xE7,0x37, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0xE7,0x37, 0x00,0xE7,0x38, 0x00,0xE7,0x38, 0x00,0xE7,0x38, + 0x00,0xE7,0x37, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xE7,0x16, + 0x00,0xD6,0x91, 0x00,0xCE,0x4F, 0x00,0xCE,0x2E, 0x00,0xCE,0x4E, 0x00,0xD6,0x70, 0x00,0xDE,0xD4, 0x00,0xEF,0x59, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x38, 0x00,0xA4,0xE0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xAD,0x24, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, + 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x02, 0x00,0xB5,0x66, 0x00,0xC6,0x2D, 0x00,0xE7,0x58, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xAD,0x24, + 0x00,0xB5,0x88, 0x00,0xCE,0x2E, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x20, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x20, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xEF,0x79, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, + 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, + 0x00,0xAD,0x20, 0x00,0xBD,0xCB, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, + 0x00,0xAD,0x20, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7B, 0x00,0xC6,0x0C, 0x00,0xA5,0x03, 0x00,0xA4,0xE0, + 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0xAD,0x45, 0x00,0xCE,0x4F, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xCE,0x4F, 0x00,0xAD,0x00, + 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xA4,0xC0, 0x00,0xBD,0xCA, 0x00,0xF7,0xBC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, + 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0xB5,0x66, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC5,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x67, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x87, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0xB2, 0x00,0xA4,0xE1, 0x00,0xAD,0x00, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xA5,0x03, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x4E, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xAD,0x24, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xC6,0x2D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x67, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x70, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x45, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xB5,0x66, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x20, 0x00,0xC5,0xEC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x67, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA4,0xE1, 0x00,0xEF,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x70, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x59, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, + 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xD6,0xB2, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x20, 0x00,0xD6,0xB2, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xAD,0x45, 0x00,0xB5,0x40, 0x00,0xA5,0x00, + 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, + 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xB5,0x40, 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x66, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xAD,0x03, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA5,0x00, 0x00,0xA4,0xC1, 0x00,0xA5,0x02, 0x00,0xA4,0xE1, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xBD,0xCA, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x87, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x70, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x88, 0x00,0xDE,0xD4, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, + 0x00,0xD6,0x92, 0x00,0xCE,0x2E, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x66, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x87, 0x00,0xDE,0xD3, 0x00,0xD6,0xB2, 0x00,0xD6,0x91, 0x00,0xCE,0x2E, 0x00,0xBD,0xA8, 0x00,0xA4,0xC1, + 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA5,0x02, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xCE,0x70, 0x00,0xD6,0x91, + 0x00,0xD6,0x91, 0x00,0xD6,0x91, 0x00,0xD6,0x71, 0x00,0xD6,0x91, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xCE,0x2E, 0x00,0xD6,0x91, 0x00,0xD6,0x70, 0x00,0xD6,0x71, + 0x00,0xD6,0x91, 0x00,0xD6,0x91, 0x00,0xD6,0x70, 0x00,0xEF,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xDE,0xD3, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x70, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, + 0x00,0xD6,0xB2, 0x00,0xEF,0x7B, 0x00,0xF7,0xBC, 0x00,0xEF,0x9B, 0x00,0xE7,0x16, 0x00,0xB5,0x67, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x9B, 0x00,0xA4,0xE1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE2, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x67, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x2E, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xCA, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, + 0x00,0xB5,0x88, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xD6,0x91, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x44, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xDE,0xD4, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xD6,0x71, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xD6,0xB2, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xCE,0x4F, 0x00,0xA4,0xE2, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFE, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x87, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x59, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xD6,0x91, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x58, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x45, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xBD,0xA9, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xEF,0x9B, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0x91, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xA5,0x03, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, + 0x00,0xFF,0xFF, 0x00,0xDE,0xB3, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE2, 0x00,0xF7,0xBC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA5,0x03, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x38, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x24, 0x00,0xFF,0xDE, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xA4,0xE2, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xE0, 0x00,0xB5,0x66, 0x00,0xFF,0xFF, 0x00,0xC5,0xEC, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0xA8, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xA5,0x03, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xD5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0xA4,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xA0, 0x00,0xA4,0xE0, 0x00,0xE7,0x58, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC5,0xEB, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xD6,0x91, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x9B, 0x00,0xA4,0xE1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xEF,0x9B, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xC6,0x2D, 0x00,0xFF,0xFF, 0x00,0xDE,0xD3, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xEF,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xEF,0x7B, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xAD,0x23, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, + 0x00,0xBD,0xCA, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x87, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xDE,0xD3, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xA5,0x02, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xA0, 0x00,0xA4,0xC0, 0x00,0xE7,0x58, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xCA, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA5,0x00, 0x00,0xDE,0xD5, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0xA4,0xE1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0xB2, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x4F, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xEF,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0x92, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, + 0x00,0xE7,0x16, 0x00,0xB5,0x87, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xAD,0x23, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x16, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xAD,0x03, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xE1, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x67, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xBD,0xA9, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFE, + 0x00,0xFF,0xFE, 0x00,0xF7,0xBD, 0x00,0xD6,0x91, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x66, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x46, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xCE,0x70, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, + 0x00,0xE7,0x38, 0x00,0xE7,0x37, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xAD,0x23, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xAD,0x23, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xF5, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDF,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, + 0x00,0xB5,0x66, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x2E, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE2, 0x00,0xF7,0x9C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x02, 0x00,0xB5,0x45, 0x00,0xAD,0x45, 0x00,0xAD,0x45, + 0x00,0xB5,0x45, 0x00,0xA5,0x02, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x20, 0x00,0xD6,0x92, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x46, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xCE,0x6F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, + 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xB5,0x67, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xBD,0xCA, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xA5,0x03, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xDE,0xF6, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xAD,0x23, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xDE,0xD4, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC6,0x0C, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, + 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xF7,0xDE, 0x00,0xFF,0xFF, 0x00,0xDE,0xF6, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, + 0x00,0xA4,0xE0, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, 0x00,0xA5,0x00, 0x00,0xAD,0x45, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x46, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0x71, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, + 0x00,0xDE,0xF6, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xBD,0xA8, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xA5,0x03, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xDE,0xF6, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xAD,0x23, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xF5, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xAD,0x24, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, + 0x00,0xE7,0x17, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xAD,0x03, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xBD,0xCA, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xA4,0xE1, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0xB2, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, + 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xBD,0xA9, 0x00,0xB5,0x87, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xAD,0x24, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xAD,0x23, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x16, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xC5,0xEB, 0x00,0xCE,0x2E, 0x00,0xC6,0x2D, 0x00,0xC6,0x2D, 0x00,0xCE,0x2E, 0x00,0xA5,0x03, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA5,0x02, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x45, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xAD,0x24, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xDE,0xF6, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x58, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, + 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x58, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xA5,0x02, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xEF,0x59, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x4E, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE2, 0x00,0xF7,0xBC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xEF,0x9B, 0x00,0xA4,0xE1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x79, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, + 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x88, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xD6,0xB2, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0x9B, 0x00,0xA4,0xE1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xF7,0x9B, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC5,0xEC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x45, 0x00,0xC6,0x0C, 0x00,0xC5,0xEB, 0x00,0xC5,0xEB, + 0x00,0xA4,0xE1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xD6,0x91, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, + 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x23, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC5,0xEB, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x4F, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, + 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC6,0x0C, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x58, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x45, 0x00,0xFF,0xFE, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x24, 0x00,0xF7,0xDE, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x2E, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xC5,0xEB, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA5,0x02, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xB5,0x67, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xBD,0xCA, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC6,0x2D, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x6F, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, + 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x59, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, + 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC6,0x0D, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0xB2, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xB5,0x88, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xD6,0x92, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xBD,0xEB, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xCE,0x70, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, + 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x17, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, + 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x4E, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, + 0x00,0xC5,0xEB, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0x92, + 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x24, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x9B, 0x00,0xA4,0xC1, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x24, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, + 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0x9B, 0x00,0xA4,0xE1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x59, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x46, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x00, 0x00,0xDE,0xD3, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x87, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE2, 0x00,0xBD,0xA9, + 0x00,0xB5,0x88, 0x00,0xB5,0x88, 0x00,0xB5,0x88, 0x00,0xB5,0x88, 0x00,0xB5,0x88, 0x00,0xBD,0xA9, 0x00,0xAD,0x45, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xBD,0xCA, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE1, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xB5,0x88, 0x00,0xE7,0x16, 0x00,0xDE,0xF5, 0x00,0xDE,0xF5, 0x00,0xDE,0xB3, 0x00,0xCE,0x2E, 0x00,0xAD,0x24, + 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x45, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x58, + 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xBD,0xA9, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0xB5,0x46, 0x00,0xA4,0xE0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xBD,0xCA, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x17, 0x00,0xDE,0xD5, 0x00,0xDE,0xF5, + 0x00,0xDE,0xF5, 0x00,0xDE,0xF5, 0x00,0xDE,0xF5, 0x00,0xE7,0x16, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xD6,0x92, 0x00,0xDE,0xF6, 0x00,0xDE,0xF5, 0x00,0xDE,0xF5, + 0x00,0xDE,0xF5, 0x00,0xDE,0xF5, 0x00,0xDE,0xD5, 0x00,0xF7,0xBC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, + 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xCE,0x4F, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x88, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x24, + 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0x9B, 0x00,0xBD,0xCA, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA5,0x03, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7B, 0x00,0xA4,0xE1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x7A, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xAD,0x45, 0x00,0xFF,0xFE, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x17, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE1, 0x00,0xB5,0x46, 0x00,0xB5,0x67, 0x00,0xAD,0x45, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA5,0x00, 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xAD,0x45, 0x00,0xAD,0x40, 0x00,0xA4,0xE0, + 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, + 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xAD,0x20, 0x00,0xDE,0xF6, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, + 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBD, 0x00,0xA5,0x02, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, + 0x00,0xA4,0xC0, 0x00,0xAD,0x45, 0x00,0xB5,0x87, 0x00,0xB5,0x66, 0x00,0xA4,0xE1, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x20, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xD6,0xB2, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xAD,0x45, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x38, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0xA8, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xAD,0x20, 0x00,0xCE,0x70, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xDE,0xD4, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, 0x00,0xAD,0x00, 0x00,0xB5,0x87, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x67, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, + 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xD6,0x91, 0x00,0xAD,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA8, 0x00,0xAD,0x00, 0x00,0xA4,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xAD,0x44, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xBD,0xA9, 0x00,0xA5,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, 0x00,0xEF,0x7B, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC5,0xEC, 0x00,0xAD,0x00, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xCE,0x4F, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF6, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xAD,0x00, 0x00,0xBD,0xEB, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xD6,0x70, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xBD,0xEB, 0x00,0xAD,0x20, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, 0x00,0xA5,0x00, 0x00,0xA5,0x02, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x66, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xE0, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA5,0x00, + 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xAD,0x24, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, + 0x00,0xAD,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xAD,0x23, 0x00,0xAD,0x00, 0x00,0xA4,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, 0x00,0xA4,0xE0, 0x00,0xA4,0xE1, 0x00,0xEF,0x79, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xA4,0xE2, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, 0x00,0xA4,0xE0, 0x00,0xB5,0x66, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xA5,0x00, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, 0x00,0xA4,0xE0, 0x00,0xB5,0x66, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x16, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, 0x00,0xA5,0x00, 0x00,0xC6,0x0D, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x67, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xEF,0x59, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xA4,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0xB5,0x66, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xC5,0xEC, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0xA4,0xE0, 0x00,0xAD,0x20, 0x00,0xAD,0x45, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xB5,0x67, 0x00,0xA4,0xE0, 0x00,0x9C,0xC1, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0xA4,0xE0, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC1, 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, 0x00,0xA4,0xE0, + 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xD6,0xB2, 0x00,0xAD,0x00, 0x00,0xA4,0xC1, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC1, + 0x00,0xA5,0x00, 0x00,0xCE,0x4F, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0x9B, 0x00,0xAD,0x46, 0x00,0xAD,0x20, 0x00,0xA4,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, + 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0x9C,0xC0, 0x00,0xA4,0xC0, 0x00,0xAD,0x20, 0x00,0xAD,0x24, 0x00,0xEF,0x59, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xD6,0xB2, 0x00,0xB5,0x40, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0xB5,0x60, 0x00,0xC6,0x0C, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0x9B, 0x00,0xA4,0xC0, 0x00,0xAD,0x20, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x20, + 0x00,0xE7,0x38, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xDF,0x16, 0x00,0xB5,0x40, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0xB5,0x60, 0x00,0xC5,0xEC, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xAD,0x40, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0xB5,0x40, 0x00,0xB5,0x87, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xE7,0x17, 0x00,0xAD,0x40, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xC1, + 0x00,0xAD,0x24, 0x00,0xC5,0xEB, 0x00,0xE7,0x16, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xB5,0x66, 0x00,0xA4,0xC0, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, + 0x00,0xAD,0x24, 0x00,0xD6,0x70, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xAD,0x45, 0x00,0xB5,0x40, 0x00,0xA4,0xE0, + 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, + 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xB5,0x40, 0x00,0xDE,0xF5, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0xAD,0x20, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, 0x00,0xB5,0x40, + 0x00,0xDE,0xD4, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xAD,0x45, 0x00,0xAD,0x40, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xAD,0x00, 0x00,0xA4,0xE0, + 0x00,0xB5,0x60, 0x00,0xCE,0x4E, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFE, 0x00,0xCE,0x70, 0x00,0xA5,0x03, 0x00,0xA4,0xE0, 0x00,0xAD,0x00, + 0x00,0xA5,0x00, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA4,0xE0, 0x00,0xA5,0x00, 0x00,0xAD,0x00, 0x00,0xA5,0x00, 0x00,0xA5,0x02, 0x00,0xCE,0x4E, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x37, 0x00,0xD6,0x91, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0x91, 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xD4, 0x00,0xD6,0x92, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0x91, + 0x00,0xEF,0x7A, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0x9B, 0x00,0xD6,0x92, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0x91, 0x00,0xE7,0x37, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xDE, 0x00,0xDE,0xB3, 0x00,0xD6,0x92, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xF7,0xDD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xD6,0x92, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0x92, 0x00,0xDE,0xB3, 0x00,0xDE,0xD5, 0x00,0xE7,0x37, 0x00,0xEF,0x7A, + 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xE7,0x38, 0x00,0xD6,0x70, 0x00,0xC5,0xEB, 0x00,0xB5,0x88, 0x00,0xB5,0x46, 0x00,0xAD,0x46, 0x00,0xB5,0x87, 0x00,0xBD,0xCA, 0x00,0xCE,0x6F, 0x00,0xE7,0x17, + 0x00,0xFF,0xDE, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xDE,0xF5, 0x00,0xD6,0x92, 0x00,0xD6,0xB2, + 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, + 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0x92, 0x00,0xF7,0x9B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xBC, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0x91, + 0x00,0xEF,0x7B, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xEF,0x59, 0x00,0xD6,0x91, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, 0x00,0xD6,0xB2, + 0x00,0xD6,0x91, 0x00,0xEF,0x58, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xF7,0xDD, 0x00,0xDE,0xF5, 0x00,0xCE,0x2E, + 0x00,0xBD,0xA9, 0x00,0xB5,0x67, 0x00,0xAD,0x45, 0x00,0xB5,0x66, 0x00,0xBD,0xA9, 0x00,0xCE,0x2D, 0x00,0xDE,0xD5, 0x00,0xF7,0xBD, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, + 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF, 0x00,0xFF,0xFF +}; + +GUI_CONST_STORAGE GUI_BITMAP bmarduinologo = { + 200, // xSize + 139, // ySize + 600, // BytesPerLine + 24, // BitsPerPixel + (const unsigned char *)_acarduinologo, // Pointer to picture data + NULL, // Pointer to palette + GUI_DRAW_BMPA565 +}; + +/*************************** End of file ****************************/ diff --git a/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp b/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp index 43ec72919..68ee9b01f 100644 --- a/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp +++ b/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp @@ -37,8 +37,20 @@ extern "C" { /* Private function prototypes -----------------------------------------------*/ #if __has_include ("lvgl.h") +#include "mbed.h" +#if (LVGL_VERSION_MAJOR == 9) +void lvgl_displayFlushing(lv_display_t * display, const lv_area_t * area, unsigned char * px_map); +static void inc_thd() { + while (1) { + lv_tick_inc(16); + delay(16); + } +} +static rtos::Thread lvgl_inc_thd; +#else void lvgl_displayFlushing(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); #endif +#endif /* Functions -----------------------------------------------------------------*/ Arduino_H7_Video::Arduino_H7_Video(int width, int height, H7DisplayShield &shield) @@ -77,16 +89,47 @@ int Arduino_H7_Video::begin() { textFont(Font_5x7); #endif +#if defined(ARDUINO_GIGA) + /* Configure SDRAM */ + SDRAM.begin(dsi_getFramebufferEnd()); +#endif + /* Video controller/bridge init */ - _shield->init(_edidMode); + int err_code = _shield->init(_edidMode); + if (err_code < 0) { + return 3; /* Video controller fail init */ + } #if __has_include("lvgl.h") /* Initiliaze LVGL library */ lv_init(); + + #if (LVGL_VERSION_MAJOR == 9) /* Create a draw buffer */ + static lv_color_t * buf1 = (lv_color_t*)malloc((width() * height() / 10)); /* Declare a buffer for 1/10 screen size */ + if (buf1 == NULL) { + return 2; /* Insuff memory err */ + } + + lv_display_t *display; + if(_rotated) { + display = lv_display_create(height(), width()); + lv_display_set_rotation(display, LV_DISPLAY_ROTATION_270); + //display->sw_rotate = 1; + } else { + display = lv_display_create(width(), height()); + } + lv_display_set_buffers(display, buf1, NULL, width() * height() / 10, LV_DISPLAY_RENDER_MODE_PARTIAL); /*Initialize the display buffer.*/ + lv_display_set_flush_cb(display, lvgl_displayFlushing); + + lvgl_inc_thd.start(inc_thd); + + #else //LVGL_VERSION_MAJOR + + /* Create a draw buffer */ static lv_disp_draw_buf_t draw_buf; - static lv_color_t * buf1; + static lv_color_t * buf1; buf1 = (lv_color_t*)malloc((width() * height() / 10) * sizeof(lv_color_t)); /* Declare a buffer for 1/10 screen size */ if (buf1 == NULL) { return 2; /* Insuff memory err */ @@ -110,9 +153,12 @@ int Arduino_H7_Video::begin() { disp_drv.sw_rotate = 1; lv_disp_drv_register(&disp_drv); /* Finally register the driver */ #endif + #endif +#if !defined(ARDUINO_GIGA) /* Configure SDRAM */ SDRAM.begin(dsi_getFramebufferEnd()); //FIXME: SDRAM init after video controller init can cause display glitch at start-up +#endif return 0; } @@ -129,6 +175,11 @@ bool Arduino_H7_Video::isRotated() { return _rotated; } +bool Arduino_H7_Video::detect() +{ + return (_shield->getStatus() > 0); +} + void Arduino_H7_Video::end() { #ifdef HAS_ARDUINOGRAPHICS ArduinoGraphics::end(); @@ -189,6 +240,46 @@ void Arduino_H7_Video::set(int x, int y, uint8_t r, uint8_t g, uint8_t b) { #endif #if __has_include("lvgl.h") +#if (LVGL_VERSION_MAJOR == 9) +static uint8_t* rotated_buf = nullptr; +void lvgl_displayFlushing(lv_display_t * disp, const lv_area_t * area, unsigned char * px_map) { + uint32_t w = lv_area_get_width(area); + uint32_t h = lv_area_get_height(area); + lv_area_t* area_in_use = (lv_area_t *)area; + + // TODO: find a smart way to tackle sw rotation + lv_display_rotation_t rotation = lv_display_get_rotation(disp); + lv_area_t rotated_area; + if (rotation != LV_DISPLAY_ROTATION_0) { + rotated_buf = (uint8_t*)realloc(rotated_buf, w * h * 4); + lv_color_format_t cf = lv_display_get_color_format(disp); + #if (LVGL_VERSION_MINOR < 2) + rotation = LV_DISPLAY_ROTATION_90; // bugfix: force 90 degree rotation for lvgl 9.1 end earlier + #endif + lv_draw_sw_rotate(px_map, rotated_buf, + w, h, lv_draw_buf_width_to_stride(w, cf), + lv_draw_buf_width_to_stride(h, cf), + rotation, cf); + + rotated_area.x1 = lv_display_get_vertical_resolution(disp) - area->y2 - 1; + rotated_area.y1 = area->x1; + //rotated_area.y2 = dsi_getDisplayYSize() - area->x1 - 1; + rotated_area.x2 = rotated_area.x1 + h - 1; + rotated_area.y2 = rotated_area.y1 + w + 1; + + area_in_use = &rotated_area; + px_map = rotated_buf; + auto temp = w; + w = h; + h = temp; + } + + uint32_t offsetPos = (area_in_use->x1 + (dsi_getDisplayXSize() * area_in_use->y1)) * sizeof(uint16_t); + + dsi_lcdDrawImage((void *) px_map, (void *)(dsi_getActiveFrameBuffer() + offsetPos), w, h, DMA2D_INPUT_RGB565); + lv_display_flush_ready(disp); /* Indicate you are ready with the flushing*/ +} +#else void lvgl_displayFlushing(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { uint32_t width = lv_area_get_width(area); uint32_t height = lv_area_get_height(area); @@ -198,5 +289,6 @@ void lvgl_displayFlushing(lv_disp_drv_t * disp, const lv_area_t * area, lv_color lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ } #endif +#endif -/**** END OF FILE ****/ \ No newline at end of file +/**** END OF FILE ****/ diff --git a/libraries/Arduino_H7_Video/src/Arduino_H7_Video.h b/libraries/Arduino_H7_Video/src/Arduino_H7_Video.h index 9f05f5ea0..8f40d37a0 100644 --- a/libraries/Arduino_H7_Video/src/Arduino_H7_Video.h +++ b/libraries/Arduino_H7_Video/src/Arduino_H7_Video.h @@ -106,6 +106,13 @@ class Arduino_H7_Video */ bool isRotated(); + /** + * @brief Checks if the display is connected. + * + * @return true if the display is connected, false otherwise. + */ + bool detect(); + #ifdef HAS_ARDUINOGRAPHICS /** * @brief Clear the display. diff --git a/libraries/Arduino_H7_Video/src/H7DisplayShield.cpp b/libraries/Arduino_H7_Video/src/H7DisplayShield.cpp index 033b550a3..b6010f3f0 100644 --- a/libraries/Arduino_H7_Video/src/H7DisplayShield.cpp +++ b/libraries/Arduino_H7_Video/src/H7DisplayShield.cpp @@ -18,10 +18,16 @@ int GigaDisplayShieldClass::getEdidMode(int h, int v) { return EDID_MODE_480x800_60Hz; } +int GigaDisplayShieldClass::getStatus() { + return 1; // TODO: Not implemented; +} + int USBCVideoClass::init(int edidmode) { struct edid recognized_edid; int err_code = 0; + memset(&recognized_edid, 0, sizeof(recognized_edid)); + //Initialization of ANX7625 err_code = anx7625_init(0); if(err_code < 0) { @@ -29,13 +35,22 @@ int USBCVideoClass::init(int edidmode) { } //Checking HDMI plug event - anx7625_wait_hpd_event(0); + err_code = anx7625_wait_hpd_event(0); + if(err_code < 0) { + return err_code; + } //Read EDID - anx7625_dp_get_edid(0, &recognized_edid); + err_code = anx7625_dp_get_edid(0, &recognized_edid); + if(err_code < 0) { + return err_code; + } //DSI Configuration - anx7625_dp_start(0, &recognized_edid, (enum edid_modes) edidmode); + err_code = anx7625_dp_start(0, &recognized_edid, (enum edid_modes) edidmode); + if(err_code < 0) { + return err_code; + } return 0; } @@ -46,5 +61,11 @@ int USBCVideoClass::getEdidMode(int h, int v) { return edidmode; } +int USBCVideoClass::getStatus() { + int detected = anx7625_get_hpd_event(0); + + return detected; +} + GigaDisplayShieldClass GigaDisplayShield; USBCVideoClass USBCVideo; \ No newline at end of file diff --git a/libraries/Arduino_H7_Video/src/H7DisplayShield.h b/libraries/Arduino_H7_Video/src/H7DisplayShield.h index c29f9d7eb..541c2c632 100644 --- a/libraries/Arduino_H7_Video/src/H7DisplayShield.h +++ b/libraries/Arduino_H7_Video/src/H7DisplayShield.h @@ -5,18 +5,21 @@ class H7DisplayShield { public: virtual int init(int edidmode) = 0; virtual int getEdidMode(int h, int v); + virtual int getStatus(); }; class GigaDisplayShieldClass : public H7DisplayShield { public: int init(int edidmode); int getEdidMode(int h, int v); + int getStatus(); }; class USBCVideoClass : public H7DisplayShield { public: int init(int edidmode); int getEdidMode(int h, int v); + int getStatus(); }; extern GigaDisplayShieldClass GigaDisplayShield; diff --git a/libraries/Arduino_H7_Video/src/anx7625.cpp b/libraries/Arduino_H7_Video/src/anx7625.cpp index 596e6f9be..3cfefce47 100644 --- a/libraries/Arduino_H7_Video/src/anx7625.cpp +++ b/libraries/Arduino_H7_Video/src/anx7625.cpp @@ -25,7 +25,7 @@ #include #include -#if defined(ARDUINO_PORTENTA_H7_M7) +#if defined(ARDUINO_PORTENTA_H7_M7) || defined(PORTENTA_H7_PINS) #include "dsi.h" #include "anx7625.h" @@ -42,9 +42,12 @@ #define ANXDEBUG(format, ...) \ printk(BIOS_DEBUG, "%s: " format, __func__, ##__VA_ARGS__) #else - #define ANXERROR(format, ...) - #define ANXINFO(format, ...) - #define ANXDEBUG(format, ...) + #define ANXERROR(format, ...) \ + do { static volatile int _i = 5; _i++; } while (0) + #define ANXINFO(format, ...) \ + do { } while (0) + #define ANXDEBUG(format, ...) \ + do { } while (0) #endif #define FLASH_LOAD_STA 0x05 @@ -506,7 +509,7 @@ int anx7625_init(uint8_t bus) { return -1; } ANXINFO("Powering on anx7625 successfull.\n"); - mdelay(200); // Wait for anx7625 to be stable + mdelay(500); // Wait for anx7625 to be stable if(anx7625_is_power_provider(0)) { ANXINFO("OTG_ON = 0 -> VBUS ON\n"); @@ -517,15 +520,21 @@ int anx7625_init(uint8_t bus) { return 0; } -void anx7625_wait_hpd_event(uint8_t bus) { +int anx7625_wait_hpd_event(uint8_t bus) { ANXINFO("Waiting for HDMI hot plug event...\n"); - - while (1) { + + int retry_hpd_change = 10000; + while (--retry_hpd_change) { mdelay(10); int detected = anx7625_hpd_change_detect(bus); - if (detected == 1) - break; + if (detected < 0) + return -1; + if (detected > 0) + return 0; } + + ANXERROR("Timed out to detect HPD change on bus %d.\n", bus); + return -1; } int anx7625_get_cc_status(uint8_t bus, uint8_t *cc_status) { @@ -621,6 +630,11 @@ bool anx7625_is_power_provider(uint8_t bus) { } } +int anx7625_get_hpd_event(uint8_t bus) { + int ret = anx7625_hpd_change_detect(bus); + return ret; +} + int i2c_writeb(uint8_t bus, uint8_t saddr, uint8_t offset, uint8_t val) { char cmd[2]; cmd[0] = offset; diff --git a/libraries/Arduino_H7_Video/src/anx7625.h b/libraries/Arduino_H7_Video/src/anx7625.h index a1ae467a9..146d09ec1 100644 --- a/libraries/Arduino_H7_Video/src/anx7625.h +++ b/libraries/Arduino_H7_Video/src/anx7625.h @@ -20,9 +20,10 @@ extern "C" { int anx7625_dp_start(uint8_t bus, const struct edid *edid, enum edid_modes mode = EDID_MODE_AUTO); int anx7625_dp_get_edid(uint8_t bus, struct edid *out); int anx7625_init(uint8_t bus); -void anx7625_wait_hpd_event(uint8_t bus); +int anx7625_wait_hpd_event(uint8_t bus); int anx7625_get_cc_status(uint8_t bus, uint8_t *cc_status); int anx7625_read_system_status(uint8_t bus, uint8_t *sys_status); bool anx7625_is_power_provider(uint8_t bus); +int anx7625_get_hpd_event(uint8_t bus); #endif /* _ANX7625_H */ diff --git a/libraries/Arduino_H7_Video/src/dsi.cpp b/libraries/Arduino_H7_Video/src/dsi.cpp index fc1c79948..77541d71c 100644 --- a/libraries/Arduino_H7_Video/src/dsi.cpp +++ b/libraries/Arduino_H7_Video/src/dsi.cpp @@ -48,9 +48,11 @@ static void dsi_layerInit(uint16_t LayerIndex, uint32_t FB_Address); int dsi_init(uint8_t bus, struct edid *edid, struct display_timing *dt) { #ifdef ARDUINO_GIGA static const uint32_t DSI_PLLNDIV = 125; - static const uint32_t DSI_PLLIDF = DSI_PLL_IN_DIV3; + static const uint32_t DSI_PLLIDF = DSI_PLL_IN_DIV4; static const uint32_t DSI_PLLODF = DSI_PLL_OUT_DIV1; static const uint32_t DSI_TXEXCAPECLOCKDIV = 4; + #undef HSE_VALUE + #define HSE_VALUE 16000000 #else static const uint32_t DSI_PLLNDIV = 40; static const uint32_t DSI_PLLIDF = DSI_PLL_IN_DIV2; @@ -321,7 +323,7 @@ uint32_t dsi_getFramebufferEnd(void) { return (FB_BASE_ADDRESS + 2 * (lcd_x_size * lcd_y_size * BYTES_PER_PIXEL)); } -void dsi_drawCurrentFrameBuffer(void) { +void dsi_drawCurrentFrameBuffer(bool reload) { int fb = pend_buffer++ % 2; /* Enable current LTDC layer */ @@ -329,6 +331,9 @@ void dsi_drawCurrentFrameBuffer(void) { /* Disable active LTDC layer */ __HAL_LTDC_LAYER_DISABLE(&(ltdc), !fb); + if (!reload) { + return; + } /* LTDC reload request within next vertical blanking */ reloadLTDC_status = 0; HAL_LTDC_Reload(<dc, LTDC_SRCR_VBR); @@ -407,4 +412,4 @@ extern "C" void HAL_LTDC_ReloadEventCallback(LTDC_HandleTypeDef *hltdc) { reloadLTDC_status = 1; } -/**** END OF FILE ****/ \ No newline at end of file +/**** END OF FILE ****/ diff --git a/libraries/Arduino_H7_Video/src/dsi.h b/libraries/Arduino_H7_Video/src/dsi.h index f2570c8e4..e3e5999bf 100644 --- a/libraries/Arduino_H7_Video/src/dsi.h +++ b/libraries/Arduino_H7_Video/src/dsi.h @@ -36,7 +36,7 @@ void dsi_lcdClear(uint32_t color); void dsi_lcdDrawImage(void *pSrc, void *pDst, uint32_t xSize, uint32_t ySize, uint32_t ColorMode); void dsi_lcdFillArea(void *pDst, uint32_t xSize, uint32_t ySize, uint32_t ColorMode); void dsi_configueCLUT(uint32_t* clut); -void dsi_drawCurrentFrameBuffer(void); +void dsi_drawCurrentFrameBuffer(bool reload = true); uint32_t dsi_getCurrentFrameBuffer(void); uint32_t dsi_getActiveFrameBuffer(void); uint32_t dsi_getFramebufferEnd(void); diff --git a/libraries/Arduino_H7_Video/src/edid.c b/libraries/Arduino_H7_Video/src/edid.c index 76a6f8e1c..802483c2d 100644 --- a/libraries/Arduino_H7_Video/src/edid.c +++ b/libraries/Arduino_H7_Video/src/edid.c @@ -47,9 +47,12 @@ #define EDIDDEBUG(format, ...) \ printk(BIOS_SPEW, "%s: " format, __func__, ##__VA_ARGS__) #else - #define EDIDERROR(format, ...) - #define EDIDWARNING(format, ...) - #define EDIDDEBUG(format, ...) + #define EDIDERROR(format ...) \ + do { } while (0) + #define EDIDWARNING(format ...) \ + do { } while (0) + #define EDIDDEBUG(format ...) \ + do { } while (0) #endif struct edid_context { @@ -1034,7 +1037,7 @@ parse_extension(struct edid *out, unsigned char *x, struct edid_context *c) } static const struct { - int x, y, refresh; + unsigned int x, y, refresh; } established_timings[] = { /* 0x23 bit 7 - 0 */ {720, 400, 70}, diff --git a/libraries/Arduino_H7_Video/src/lv_conf.h b/libraries/Arduino_H7_Video/src/lv_conf.h index 56acd738c..e664bb2de 100644 --- a/libraries/Arduino_H7_Video/src/lv_conf.h +++ b/libraries/Arduino_H7_Video/src/lv_conf.h @@ -1,762 +1,6 @@ -/** - * @file lv_conf.h - * Configuration file for v8.3.5 - */ - -/* - * Copy this file as `lv_conf.h` - * 1. simply next to the `lvgl` folder - * 2. or any other places and - * - define `LV_CONF_INCLUDE_SIMPLE` - * - add the path as include path - */ - -/* clang-format off */ -#if 1 /*Set it to "1" to enable content*/ - -#ifndef LV_CONF_H -#define LV_CONF_H - -#include - -/*==================== - COLOR SETTINGS - *====================*/ - -/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ -#define LV_COLOR_DEPTH 16 - -/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/ -#define LV_COLOR_16_SWAP 0 - -/*Enable features to draw on transparent background. - *It's required if opa, and transform_* style properties are used. - *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/ -#define LV_COLOR_SCREEN_TRANSP 0 - -/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. - * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ -#define LV_COLOR_MIX_ROUND_OFS 0 - -/*Images pixels with this color will not be drawn if they are chroma keyed)*/ -#define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/ - -/*========================= - MEMORY SETTINGS - *=========================*/ - -/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/ -#define LV_MEM_CUSTOM 0 -#if LV_MEM_CUSTOM == 0 - /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/ - #define LV_MEM_SIZE (48U * 1024U) /*[bytes]*/ - - /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ - #define LV_MEM_ADR 0 /*0: unused*/ - /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ - #if LV_MEM_ADR == 0 - #undef LV_MEM_POOL_INCLUDE - #undef LV_MEM_POOL_ALLOC - #endif - -#else /*LV_MEM_CUSTOM*/ - #define LV_MEM_CUSTOM_INCLUDE /*Header for the dynamic memory function*/ - #define LV_MEM_CUSTOM_ALLOC malloc - #define LV_MEM_CUSTOM_FREE free - #define LV_MEM_CUSTOM_REALLOC realloc -#endif /*LV_MEM_CUSTOM*/ - -/*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms. - *You will see an error log message if there wasn't enough buffers. */ -#define LV_MEM_BUF_MAX_NUM 16 - -/*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/ -#define LV_MEMCPY_MEMSET_STD 0 - -/*==================== - HAL SETTINGS - *====================*/ - -/*Default display refresh period. LVG will redraw changed areas with this period time*/ -#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/ - -/*Input device read period in milliseconds*/ -#define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/ - -/*Use a custom tick source that tells the elapsed time in milliseconds. - *It removes the need to manually update the tick with `lv_tick_inc()`)*/ -#define LV_TICK_CUSTOM 1 -#if LV_TICK_CUSTOM - #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ - #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ - /*If using lvgl as ESP32 component*/ - // #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" - // #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL)) -#endif /*LV_TICK_CUSTOM*/ - -/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. - *(Not so important, you can adjust it to modify default sizes and spaces)*/ -#define LV_DPI_DEF 130 /*[px/inch]*/ - -/*======================= - * FEATURE CONFIGURATION - *=======================*/ - -/*------------- - * Drawing - *-----------*/ - -/*Enable complex draw engine. - *Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/ -#define LV_DRAW_COMPLEX 1 -#if LV_DRAW_COMPLEX != 0 - - /*Allow buffering some shadow calculation. - *LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` - *Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/ - #define LV_SHADOW_CACHE_SIZE 0 - - /* Set number of maximally cached circle data. - * The circumference of 1/4 circle are saved for anti-aliasing - * radius * 4 bytes are used per circle (the most often used radiuses are saved) - * 0: to disable caching */ - #define LV_CIRCLE_CACHE_SIZE 4 -#endif /*LV_DRAW_COMPLEX*/ - -/** - * "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer - * and blend it as an image with the given opacity. - * Note that `bg_opa`, `text_opa` etc don't require buffering into layer) - * The widget can be buffered in smaller chunks to avoid using large buffers. - * - * - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it - * - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated. - * - * Both buffer sizes are in bytes. - * "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers - * and can't be drawn in chunks. So these settings affects only widgets with opacity. - */ -#define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024) -#define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024) - -/*Default image cache size. Image caching keeps the images opened. - *If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added) - *With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images. - *However the opened images might consume additional RAM. - *0: to disable caching*/ -#define LV_IMG_CACHE_DEF_SIZE 0 - -/*Number of stops allowed per gradient. Increase this to allow more stops. - *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ -#define LV_GRADIENT_MAX_STOPS 2 - -/*Default gradient buffer size. - *When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again. - *LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes. - *If the cache is too small the map will be allocated only while it's required for the drawing. - *0 mean no caching.*/ -#define LV_GRAD_CACHE_DEF_SIZE 0 - -/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display) - *LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface - *The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */ -#define LV_DITHER_GRADIENT 0 -#if LV_DITHER_GRADIENT - /*Add support for error diffusion dithering. - *Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing. - *The increase in memory consumption is (24 bits * object's width)*/ - #define LV_DITHER_ERROR_DIFFUSION 0 -#endif - -/*Maximum buffer size to allocate for rotation. - *Only used if software rotation is enabled in the display driver.*/ -#define LV_DISP_ROT_MAX_BUF (10*1024) - -/*------------- - * GPU - *-----------*/ - -/*Use Arm's 2D acceleration library Arm-2D */ -#define LV_USE_GPU_ARM2D 0 - -/*Use STM32's DMA2D (aka Chrom Art) GPU*/ -#define LV_USE_GPU_STM32_DMA2D 0 -#if LV_USE_GPU_STM32_DMA2D - /*Must be defined to include path of CMSIS header of target processor - e.g. "stm32f769xx.h" or "stm32f429xx.h"*/ - #define LV_GPU_DMA2D_CMSIS_INCLUDE -#endif - -/*Use SWM341's DMA2D GPU*/ -#define LV_USE_GPU_SWM341_DMA2D 0 -#if LV_USE_GPU_SWM341_DMA2D - #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h" -#endif - -/*Use NXP's PXP GPU iMX RTxxx platforms*/ -#define LV_USE_GPU_NXP_PXP 0 -#if LV_USE_GPU_NXP_PXP - /*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c) - * and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS - * has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected. - *0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init() - */ - #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0 -#endif - -/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/ -#define LV_USE_GPU_NXP_VG_LITE 0 - -/*Use SDL renderer API*/ -#define LV_USE_GPU_SDL 0 -#if LV_USE_GPU_SDL - #define LV_GPU_SDL_INCLUDE_PATH - /*Texture cache size, 8MB by default*/ - #define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8) - /*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/ - #define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6)) -#endif - -/*------------- - * Logging - *-----------*/ - -/*Enable the log module*/ -#define LV_USE_LOG 0 -#if LV_USE_LOG - - /*How important log should be added: - *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information - *LV_LOG_LEVEL_INFO Log important events - *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem - *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail - *LV_LOG_LEVEL_USER Only logs added by the user - *LV_LOG_LEVEL_NONE Do not log anything*/ - #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN - - /*1: Print the log with 'printf'; - *0: User need to register a callback with `lv_log_register_print_cb()`*/ - #define LV_LOG_PRINTF 0 - - /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ - #define LV_LOG_TRACE_MEM 1 - #define LV_LOG_TRACE_TIMER 1 - #define LV_LOG_TRACE_INDEV 1 - #define LV_LOG_TRACE_DISP_REFR 1 - #define LV_LOG_TRACE_EVENT 1 - #define LV_LOG_TRACE_OBJ_CREATE 1 - #define LV_LOG_TRACE_LAYOUT 1 - #define LV_LOG_TRACE_ANIM 1 - -#endif /*LV_USE_LOG*/ - -/*------------- - * Asserts - *-----------*/ - -/*Enable asserts if an operation is failed or an invalid data is found. - *If LV_USE_LOG is enabled an error message will be printed on failure*/ -#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ -#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ -#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ -#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ -#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ - -/*Add a custom handler when assert happens e.g. to restart the MCU*/ -#define LV_ASSERT_HANDLER_INCLUDE -#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ - -/*------------- - * Others - *-----------*/ - -/*1: Show CPU usage and FPS count*/ -#define LV_USE_PERF_MONITOR 0 -#if LV_USE_PERF_MONITOR - #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT -#endif - -/*1: Show the used memory and the memory fragmentation - * Requires LV_MEM_CUSTOM = 0*/ -#define LV_USE_MEM_MONITOR 0 -#if LV_USE_MEM_MONITOR - #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT -#endif - -/*1: Draw random colored rectangles over the redrawn areas*/ -#define LV_USE_REFR_DEBUG 0 - -/*Change the built in (v)snprintf functions*/ -#define LV_SPRINTF_CUSTOM 0 -#if LV_SPRINTF_CUSTOM - #define LV_SPRINTF_INCLUDE - #define lv_snprintf snprintf - #define lv_vsnprintf vsnprintf -#else /*LV_SPRINTF_CUSTOM*/ - #define LV_SPRINTF_USE_FLOAT 0 -#endif /*LV_SPRINTF_CUSTOM*/ - -#define LV_USE_USER_DATA 1 - -/*Garbage Collector settings - *Used if lvgl is bound to higher level language and the memory is managed by that language*/ -#define LV_ENABLE_GC 0 -#if LV_ENABLE_GC != 0 - #define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/ -#endif /*LV_ENABLE_GC*/ - -/*===================== - * COMPILER SETTINGS - *====================*/ - -/*For big endian systems set to 1*/ -#define LV_BIG_ENDIAN_SYSTEM 0 - -/*Define a custom attribute to `lv_tick_inc` function*/ -#define LV_ATTRIBUTE_TICK_INC - -/*Define a custom attribute to `lv_timer_handler` function*/ -#define LV_ATTRIBUTE_TIMER_HANDLER - -/*Define a custom attribute to `lv_disp_flush_ready` function*/ -#define LV_ATTRIBUTE_FLUSH_READY - -/*Required alignment size for buffers*/ -#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 - -/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). - * E.g. __attribute__((aligned(4)))*/ -#define LV_ATTRIBUTE_MEM_ALIGN - -/*Attribute to mark large constant arrays for example font's bitmaps*/ -#define LV_ATTRIBUTE_LARGE_CONST - -/*Compiler prefix for a big array declaration in RAM*/ -#define LV_ATTRIBUTE_LARGE_RAM_ARRAY - -/*Place performance critical functions into a faster memory (e.g RAM)*/ -#define LV_ATTRIBUTE_FAST_MEM - -/*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/ -#define LV_ATTRIBUTE_DMA - -/*Export integer constant to binding. This macro is used with constants in the form of LV_ that - *should also appear on LVGL binding API such as Micropython.*/ -#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ - -/*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/ -#define LV_USE_LARGE_COORD 0 - -/*================== - * FONT USAGE - *===================*/ - -/*Montserrat fonts with ASCII range and some symbols using bpp = 4 - *https://fonts.google.com/specimen/Montserrat*/ -#define LV_FONT_MONTSERRAT_8 0 -#define LV_FONT_MONTSERRAT_10 0 -#define LV_FONT_MONTSERRAT_12 0 -#define LV_FONT_MONTSERRAT_14 1 -#define LV_FONT_MONTSERRAT_16 0 -#define LV_FONT_MONTSERRAT_18 0 -#define LV_FONT_MONTSERRAT_20 0 -#define LV_FONT_MONTSERRAT_22 0 -#define LV_FONT_MONTSERRAT_24 0 -#define LV_FONT_MONTSERRAT_26 0 -#define LV_FONT_MONTSERRAT_28 0 -#define LV_FONT_MONTSERRAT_30 0 -#define LV_FONT_MONTSERRAT_32 0 -#define LV_FONT_MONTSERRAT_34 0 -#define LV_FONT_MONTSERRAT_36 0 -#define LV_FONT_MONTSERRAT_38 0 -#define LV_FONT_MONTSERRAT_40 0 -#define LV_FONT_MONTSERRAT_42 0 -#define LV_FONT_MONTSERRAT_44 0 -#define LV_FONT_MONTSERRAT_46 0 -#define LV_FONT_MONTSERRAT_48 0 - -/*Demonstrate special features*/ -#define LV_FONT_MONTSERRAT_12_SUBPX 0 -#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ -#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ -#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ - -/*Pixel perfect monospace fonts*/ -#define LV_FONT_UNSCII_8 0 -#define LV_FONT_UNSCII_16 0 - -/*Optionally declare custom fonts here. - *You can use these fonts as default font too and they will be available globally. - *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ -#define LV_FONT_CUSTOM_DECLARE - -/*Always set a default font*/ -#define LV_FONT_DEFAULT &lv_font_montserrat_14 - -/*Enable handling large font and/or fonts with a lot of characters. - *The limit depends on the font size, font face and bpp. - *Compiler error will be triggered if a font needs it.*/ -#define LV_FONT_FMT_TXT_LARGE 0 - -/*Enables/disables support for compressed fonts.*/ -#define LV_USE_FONT_COMPRESSED 0 - -/*Enable subpixel rendering*/ -#define LV_USE_FONT_SUBPX 0 -#if LV_USE_FONT_SUBPX - /*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/ - #define LV_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/ -#endif - -/*Enable drawing placeholders when glyph dsc is not found*/ -#define LV_USE_FONT_PLACEHOLDER 1 - -/*================= - * TEXT SETTINGS - *=================*/ - -/** - * Select a character encoding for strings. - * Your IDE or editor should have the same character encoding - * - LV_TXT_ENC_UTF8 - * - LV_TXT_ENC_ASCII - */ -#define LV_TXT_ENC LV_TXT_ENC_UTF8 - -/*Can break (wrap) texts on these chars*/ -#define LV_TXT_BREAK_CHARS " ,.;:-_" - -/*If a word is at least this long, will break wherever "prettiest" - *To disable, set to a value <= 0*/ -#define LV_TXT_LINE_BREAK_LONG_LEN 0 - -/*Minimum number of characters in a long word to put on a line before a break. - *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ -#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 - -/*Minimum number of characters in a long word to put on a line after a break. - *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ -#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 - -/*The control character to use for signalling text recoloring.*/ -#define LV_TXT_COLOR_CMD "#" - -/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. - *The direction will be processed according to the Unicode Bidirectional Algorithm: - *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ -#define LV_USE_BIDI 0 -#if LV_USE_BIDI - /*Set the default direction. Supported values: - *`LV_BASE_DIR_LTR` Left-to-Right - *`LV_BASE_DIR_RTL` Right-to-Left - *`LV_BASE_DIR_AUTO` detect texts base direction*/ - #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO -#endif - -/*Enable Arabic/Persian processing - *In these languages characters should be replaced with an other form based on their position in the text*/ -#define LV_USE_ARABIC_PERSIAN_CHARS 0 - -/*================== - * WIDGET USAGE - *================*/ - -/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ - -#define LV_USE_ARC 1 - -#define LV_USE_BAR 1 - -#define LV_USE_BTN 1 - -#define LV_USE_BTNMATRIX 1 - -#define LV_USE_CANVAS 1 - -#define LV_USE_CHECKBOX 1 - -#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ - -#define LV_USE_IMG 1 /*Requires: lv_label*/ - -#define LV_USE_LABEL 1 -#if LV_USE_LABEL - #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ - #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ -#endif - -#define LV_USE_LINE 1 - -#define LV_USE_ROLLER 1 /*Requires: lv_label*/ -#if LV_USE_ROLLER - #define LV_ROLLER_INF_PAGES 7 /*Number of extra "pages" when the roller is infinite*/ -#endif - -#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ - -#define LV_USE_SWITCH 1 - -#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ -#if LV_USE_TEXTAREA != 0 - #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ -#endif - -#define LV_USE_TABLE 1 - -/*================== - * EXTRA COMPONENTS - *==================*/ - -/*----------- - * Widgets - *----------*/ -#define LV_USE_ANIMIMG 1 - -#define LV_USE_CALENDAR 1 -#if LV_USE_CALENDAR - #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 - #if LV_CALENDAR_WEEK_STARTS_MONDAY - #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} - #else - #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} - #endif - - #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} - #define LV_USE_CALENDAR_HEADER_ARROW 1 - #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 -#endif /*LV_USE_CALENDAR*/ - -#define LV_USE_CHART 1 - -#define LV_USE_COLORWHEEL 1 - -#define LV_USE_IMGBTN 1 - -#define LV_USE_KEYBOARD 1 - -#define LV_USE_LED 1 - -#define LV_USE_LIST 1 - -#define LV_USE_MENU 1 - -#define LV_USE_METER 1 - -#define LV_USE_MSGBOX 1 - -#define LV_USE_SPAN 1 -#if LV_USE_SPAN - /*A line text can contain maximum num of span descriptor */ - #define LV_SPAN_SNIPPET_STACK_SIZE 64 -#endif - -#define LV_USE_SPINBOX 1 - -#define LV_USE_SPINNER 1 - -#define LV_USE_TABVIEW 1 - -#define LV_USE_TILEVIEW 1 - -#define LV_USE_WIN 1 - -/*----------- - * Themes - *----------*/ - -/*A simple, impressive and very complete theme*/ -#define LV_USE_THEME_DEFAULT 1 -#if LV_USE_THEME_DEFAULT - - /*0: Light mode; 1: Dark mode*/ - #define LV_THEME_DEFAULT_DARK 0 - - /*1: Enable grow on press*/ - #define LV_THEME_DEFAULT_GROW 1 - - /*Default transition time in [ms]*/ - #define LV_THEME_DEFAULT_TRANSITION_TIME 80 -#endif /*LV_USE_THEME_DEFAULT*/ - -/*A very simple theme that is a good starting point for a custom theme*/ -#define LV_USE_THEME_BASIC 1 - -/*A theme designed for monochrome displays*/ -#define LV_USE_THEME_MONO 1 - -/*----------- - * Layouts - *----------*/ - -/*A layout similar to Flexbox in CSS.*/ -#define LV_USE_FLEX 1 - -/*A layout similar to Grid in CSS.*/ -#define LV_USE_GRID 1 - -/*--------------------- - * 3rd party libraries - *--------------------*/ - -/*File system interfaces for common APIs */ - -/*API for fopen, fread, etc*/ -#define LV_USE_FS_STDIO 0 -#if LV_USE_FS_STDIO - #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ - #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ -#endif - -/*API for open, read, etc*/ -#define LV_USE_FS_POSIX 0 -#if LV_USE_FS_POSIX - #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ - #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ -#endif - -/*API for CreateFile, ReadFile, etc*/ -#define LV_USE_FS_WIN32 0 -#if LV_USE_FS_WIN32 - #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ - #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ -#endif - -/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ -#define LV_USE_FS_FATFS 0 -#if LV_USE_FS_FATFS - #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ -#endif - -/*PNG decoder library*/ -#define LV_USE_PNG 0 - -/*BMP decoder library*/ -#define LV_USE_BMP 0 - -/* JPG + split JPG decoder library. - * Split JPG is a custom format optimized for embedded systems. */ -#define LV_USE_SJPG 0 - -/*GIF decoder library*/ -#define LV_USE_GIF 0 - -/*QR code library*/ -#define LV_USE_QRCODE 0 - -/*FreeType library*/ -#define LV_USE_FREETYPE 0 -#if LV_USE_FREETYPE - /*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/ - #define LV_FREETYPE_CACHE_SIZE (16 * 1024) - #if LV_FREETYPE_CACHE_SIZE >= 0 - /* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */ - /* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */ - /* if font size >= 256, must be configured as image cache */ - #define LV_FREETYPE_SBIT_CACHE 0 - /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ - /* (0:use system defaults) */ - #define LV_FREETYPE_CACHE_FT_FACES 0 - #define LV_FREETYPE_CACHE_FT_SIZES 0 - #endif -#endif - -/*Rlottie library*/ -#define LV_USE_RLOTTIE 0 - -/*FFmpeg library for image decoding and playing videos - *Supports all major image formats so do not enable other image decoder with it*/ -#define LV_USE_FFMPEG 0 -#if LV_USE_FFMPEG - /*Dump input information to stderr*/ - #define LV_FFMPEG_DUMP_FORMAT 0 -#endif - -/*----------- - * Others - *----------*/ - -/*1: Enable API to take snapshot for object*/ -#define LV_USE_SNAPSHOT 0 - -/*1: Enable Monkey test*/ -#define LV_USE_MONKEY 0 - -/*1: Enable grid navigation*/ -#define LV_USE_GRIDNAV 0 - -/*1: Enable lv_obj fragment*/ -#define LV_USE_FRAGMENT 0 - -/*1: Support using images as font in label or span widgets */ -#define LV_USE_IMGFONT 0 - -/*1: Enable a published subscriber based messaging system */ -#define LV_USE_MSG 0 - -/*1: Enable Pinyin input method*/ -/*Requires: lv_keyboard*/ -#define LV_USE_IME_PINYIN 0 -#if LV_USE_IME_PINYIN - /*1: Use default thesaurus*/ - /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ - #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 - /*Set the maximum number of candidate panels that can be displayed*/ - /*This needs to be adjusted according to the size of the screen*/ - #define LV_IME_PINYIN_CAND_TEXT_NUM 6 - - /*Use 9 key input(k9)*/ - #define LV_IME_PINYIN_USE_K9_MODE 1 - #if LV_IME_PINYIN_USE_K9_MODE == 1 - #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 - #endif // LV_IME_PINYIN_USE_K9_MODE -#endif - -/*================== -* EXAMPLES -*==================*/ - -/*Enable the examples to be built with the library*/ -#define LV_BUILD_EXAMPLES 1 - -/*=================== - * DEMO USAGE - ====================*/ - -/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ -#define LV_USE_DEMO_WIDGETS 0 -#if LV_USE_DEMO_WIDGETS -#define LV_DEMO_WIDGETS_SLIDESHOW 0 -#endif - -/*Demonstrate the usage of encoder and keyboard*/ -#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 - -/*Benchmark your system*/ -#define LV_USE_DEMO_BENCHMARK 0 -#if LV_USE_DEMO_BENCHMARK -/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ -#define LV_DEMO_BENCHMARK_RGB565A8 0 -#endif - -/*Stress test for LVGL*/ -#define LV_USE_DEMO_STRESS 0 - -/*Music player demo*/ -#define LV_USE_DEMO_MUSIC 0 -#if LV_USE_DEMO_MUSIC - #define LV_DEMO_MUSIC_SQUARE 0 - #define LV_DEMO_MUSIC_LANDSCAPE 0 - #define LV_DEMO_MUSIC_ROUND 0 - #define LV_DEMO_MUSIC_LARGE 0 - #define LV_DEMO_MUSIC_AUTO_PLAY 0 -#endif - -/*--END OF LV_CONF_H--*/ - -#endif /*LV_CONF_H*/ - -#endif /*End of "Content enable"*/ +//#if (LVGL_VERSION_MAJOR == 9) +#if __has_include("draw/sw/blend/neon/lv_blend_neon.h") +#include "lv_conf_9.h" +#else +#include "lv_conf_8.h" +#endif \ No newline at end of file diff --git a/libraries/Arduino_H7_Video/src/lv_conf_8.h b/libraries/Arduino_H7_Video/src/lv_conf_8.h new file mode 100644 index 000000000..c69b43e27 --- /dev/null +++ b/libraries/Arduino_H7_Video/src/lv_conf_8.h @@ -0,0 +1,762 @@ +/** + * @file lv_conf.h + * Configuration file for v8.3.5 + */ + +/* + * Copy this file as `lv_conf.h` + * 1. simply next to the `lvgl` folder + * 2. or any other places and + * - define `LV_CONF_INCLUDE_SIMPLE` + * - add the path as include path + */ + +/* clang-format off */ +#if 1 /*Set it to "1" to enable content*/ + +#ifndef LV_CONF_H +#define LV_CONF_H + +#include + +/*==================== + COLOR SETTINGS + *====================*/ + +/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ +#define LV_COLOR_DEPTH 16 + +/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/ +#define LV_COLOR_16_SWAP 0 + +/*Enable features to draw on transparent background. + *It's required if opa, and transform_* style properties are used. + *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/ +#define LV_COLOR_SCREEN_TRANSP 0 + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#define LV_COLOR_MIX_ROUND_OFS 0 + +/*Images pixels with this color will not be drawn if they are chroma keyed)*/ +#define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/ + +/*========================= + MEMORY SETTINGS + *=========================*/ + +/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/ +#define LV_MEM_CUSTOM 0 +#if LV_MEM_CUSTOM == 0 + /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/ + #define LV_MEM_SIZE (48U * 1024U) /*[bytes]*/ + + /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ + #define LV_MEM_ADR 0 /*0: unused*/ + /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ + #if LV_MEM_ADR == 0 + #undef LV_MEM_POOL_INCLUDE + #undef LV_MEM_POOL_ALLOC + #endif + +#else /*LV_MEM_CUSTOM*/ + #define LV_MEM_CUSTOM_INCLUDE /*Header for the dynamic memory function*/ + #define LV_MEM_CUSTOM_ALLOC malloc + #define LV_MEM_CUSTOM_FREE free + #define LV_MEM_CUSTOM_REALLOC realloc +#endif /*LV_MEM_CUSTOM*/ + +/*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms. + *You will see an error log message if there wasn't enough buffers. */ +#define LV_MEM_BUF_MAX_NUM 16 + +/*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/ +#define LV_MEMCPY_MEMSET_STD 0 + +/*==================== + HAL SETTINGS + *====================*/ + +/*Default display refresh period. LVG will redraw changed areas with this period time*/ +#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/ + +/*Input device read period in milliseconds*/ +#define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/ + +/*Use a custom tick source that tells the elapsed time in milliseconds. + *It removes the need to manually update the tick with `lv_tick_inc()`)*/ +#define LV_TICK_CUSTOM 1 +#if LV_TICK_CUSTOM + #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ + #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ + /*If using lvgl as ESP32 component*/ + // #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" + // #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL)) +#endif /*LV_TICK_CUSTOM*/ + +/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + *(Not so important, you can adjust it to modify default sizes and spaces)*/ +#define LV_DPI_DEF 130 /*[px/inch]*/ + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Drawing + *-----------*/ + +/*Enable complex draw engine. + *Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/ +#define LV_DRAW_COMPLEX 1 +#if LV_DRAW_COMPLEX != 0 + + /*Allow buffering some shadow calculation. + *LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` + *Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/ + #define LV_SHADOW_CACHE_SIZE 0 + + /* Set number of maximally cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing + * radius * 4 bytes are used per circle (the most often used radiuses are saved) + * 0: to disable caching */ + #define LV_CIRCLE_CACHE_SIZE 4 +#endif /*LV_DRAW_COMPLEX*/ + +/** + * "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer + * and blend it as an image with the given opacity. + * Note that `bg_opa`, `text_opa` etc don't require buffering into layer) + * The widget can be buffered in smaller chunks to avoid using large buffers. + * + * - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it + * - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated. + * + * Both buffer sizes are in bytes. + * "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers + * and can't be drawn in chunks. So these settings affects only widgets with opacity. + */ +#define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024) +#define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024) + +/*Default image cache size. Image caching keeps the images opened. + *If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added) + *With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images. + *However the opened images might consume additional RAM. + *0: to disable caching*/ +#define LV_IMG_CACHE_DEF_SIZE 0 + +/*Number of stops allowed per gradient. Increase this to allow more stops. + *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ +#define LV_GRADIENT_MAX_STOPS 2 + +/*Default gradient buffer size. + *When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again. + *LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes. + *If the cache is too small the map will be allocated only while it's required for the drawing. + *0 mean no caching.*/ +#define LV_GRAD_CACHE_DEF_SIZE 0 + +/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display) + *LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface + *The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */ +#define LV_DITHER_GRADIENT 0 +#if LV_DITHER_GRADIENT + /*Add support for error diffusion dithering. + *Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing. + *The increase in memory consumption is (24 bits * object's width)*/ + #define LV_DITHER_ERROR_DIFFUSION 0 +#endif + +/*Maximum buffer size to allocate for rotation. + *Only used if software rotation is enabled in the display driver.*/ +#define LV_DISP_ROT_MAX_BUF (10*1024) + +/*------------- + * GPU + *-----------*/ + +/*Use Arm's 2D acceleration library Arm-2D */ +#define LV_USE_GPU_ARM2D 0 + +/*Use STM32's DMA2D (aka Chrom Art) GPU*/ +#define LV_USE_GPU_STM32_DMA2D 0 +#if LV_USE_GPU_STM32_DMA2D + /*Must be defined to include path of CMSIS header of target processor + e.g. "stm32f769xx.h" or "stm32f429xx.h"*/ + #define LV_GPU_DMA2D_CMSIS_INCLUDE +#endif + +/*Use SWM341's DMA2D GPU*/ +#define LV_USE_GPU_SWM341_DMA2D 0 +#if LV_USE_GPU_SWM341_DMA2D + #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h" +#endif + +/*Use NXP's PXP GPU iMX RTxxx platforms*/ +#define LV_USE_GPU_NXP_PXP 0 +#if LV_USE_GPU_NXP_PXP + /*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c) + * and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS + * has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected. + *0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init() + */ + #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0 +#endif + +/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/ +#define LV_USE_GPU_NXP_VG_LITE 0 + +/*Use SDL renderer API*/ +#define LV_USE_GPU_SDL 0 +#if LV_USE_GPU_SDL + #define LV_GPU_SDL_INCLUDE_PATH + /*Texture cache size, 8MB by default*/ + #define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8) + /*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/ + #define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6)) +#endif + +/*------------- + * Logging + *-----------*/ + +/*Enable the log module*/ +#define LV_USE_LOG 0 +#if LV_USE_LOG + + /*How important log should be added: + *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information + *LV_LOG_LEVEL_INFO Log important events + *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem + *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail + *LV_LOG_LEVEL_USER Only logs added by the user + *LV_LOG_LEVEL_NONE Do not log anything*/ + #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + + /*1: Print the log with 'printf'; + *0: User need to register a callback with `lv_log_register_print_cb()`*/ + #define LV_LOG_PRINTF 0 + + /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ + #define LV_LOG_TRACE_MEM 1 + #define LV_LOG_TRACE_TIMER 1 + #define LV_LOG_TRACE_INDEV 1 + #define LV_LOG_TRACE_DISP_REFR 1 + #define LV_LOG_TRACE_EVENT 1 + #define LV_LOG_TRACE_OBJ_CREATE 1 + #define LV_LOG_TRACE_LAYOUT 1 + #define LV_LOG_TRACE_ANIM 1 + +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/*Enable asserts if an operation is failed or an invalid data is found. + *If LV_USE_LOG is enabled an error message will be printed on failure*/ +#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ +#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ +#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ + +/*Add a custom handler when assert happens e.g. to restart the MCU*/ +#define LV_ASSERT_HANDLER_INCLUDE +#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ + +/*------------- + * Others + *-----------*/ + +/*1: Show CPU usage and FPS count*/ +#define LV_USE_PERF_MONITOR 0 +#if LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT +#endif + +/*1: Show the used memory and the memory fragmentation + * Requires LV_MEM_CUSTOM = 0*/ +#define LV_USE_MEM_MONITOR 0 +#if LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT +#endif + +/*1: Draw random colored rectangles over the redrawn areas*/ +#define LV_USE_REFR_DEBUG 0 + +/*Change the built in (v)snprintf functions*/ +#define LV_SPRINTF_CUSTOM 0 +#if LV_SPRINTF_CUSTOM + #define LV_SPRINTF_INCLUDE + #define lv_snprintf snprintf + #define lv_vsnprintf vsnprintf +#else /*LV_SPRINTF_CUSTOM*/ + #define LV_SPRINTF_USE_FLOAT 0 +#endif /*LV_SPRINTF_CUSTOM*/ + +#define LV_USE_USER_DATA 1 + +/*Garbage Collector settings + *Used if lvgl is bound to higher level language and the memory is managed by that language*/ +#define LV_ENABLE_GC 0 +#if LV_ENABLE_GC != 0 + #define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/ +#endif /*LV_ENABLE_GC*/ + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/*For big endian systems set to 1*/ +#define LV_BIG_ENDIAN_SYSTEM 0 + +/*Define a custom attribute to `lv_tick_inc` function*/ +#define LV_ATTRIBUTE_TICK_INC + +/*Define a custom attribute to `lv_timer_handler` function*/ +#define LV_ATTRIBUTE_TIMER_HANDLER + +/*Define a custom attribute to `lv_disp_flush_ready` function*/ +#define LV_ATTRIBUTE_FLUSH_READY + +/*Required alignment size for buffers*/ +#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + +/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#define LV_ATTRIBUTE_MEM_ALIGN + +/*Attribute to mark large constant arrays for example font's bitmaps*/ +#define LV_ATTRIBUTE_LARGE_CONST + +/*Compiler prefix for a big array declaration in RAM*/ +#define LV_ATTRIBUTE_LARGE_RAM_ARRAY + +/*Place performance critical functions into a faster memory (e.g RAM)*/ +#define LV_ATTRIBUTE_FAST_MEM + +/*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/ +#define LV_ATTRIBUTE_DMA + +/*Export integer constant to binding. This macro is used with constants in the form of LV_ that + *should also appear on LVGL binding API such as Micropython.*/ +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ + +/*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/ +#define LV_USE_LARGE_COORD 0 + +/*================== + * FONT USAGE + *===================*/ + +/*Montserrat fonts with ASCII range and some symbols using bpp = 4 + *https://fonts.google.com/specimen/Montserrat*/ +#define LV_FONT_MONTSERRAT_8 0 +#define LV_FONT_MONTSERRAT_10 0 +#define LV_FONT_MONTSERRAT_12 0 +#define LV_FONT_MONTSERRAT_14 1 +#define LV_FONT_MONTSERRAT_16 0 +#define LV_FONT_MONTSERRAT_18 0 +#define LV_FONT_MONTSERRAT_20 0 +#define LV_FONT_MONTSERRAT_22 0 +#define LV_FONT_MONTSERRAT_24 0 +#define LV_FONT_MONTSERRAT_26 0 +#define LV_FONT_MONTSERRAT_28 0 +#define LV_FONT_MONTSERRAT_30 0 +#define LV_FONT_MONTSERRAT_32 0 +#define LV_FONT_MONTSERRAT_34 0 +#define LV_FONT_MONTSERRAT_36 0 +#define LV_FONT_MONTSERRAT_38 0 +#define LV_FONT_MONTSERRAT_40 0 +#define LV_FONT_MONTSERRAT_42 0 +#define LV_FONT_MONTSERRAT_44 0 +#define LV_FONT_MONTSERRAT_46 0 +#define LV_FONT_MONTSERRAT_48 0 + +/*Demonstrate special features*/ +#define LV_FONT_MONTSERRAT_12_SUBPX 0 +#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ +#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ +#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ + +/*Pixel perfect monospace fonts*/ +#define LV_FONT_UNSCII_8 0 +#define LV_FONT_UNSCII_16 0 + +/*Optionally declare custom fonts here. + *You can use these fonts as default font too and they will be available globally. + *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ +#define LV_FONT_CUSTOM_DECLARE + +/*Always set a default font*/ +#define LV_FONT_DEFAULT &lv_font_montserrat_14 + +/*Enable handling large font and/or fonts with a lot of characters. + *The limit depends on the font size, font face and bpp. + *Compiler error will be triggered if a font needs it.*/ +#define LV_FONT_FMT_TXT_LARGE 0 + +/*Enables/disables support for compressed fonts.*/ +#define LV_USE_FONT_COMPRESSED 0 + +/*Enable subpixel rendering*/ +#define LV_USE_FONT_SUBPX 0 +#if LV_USE_FONT_SUBPX + /*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/ + #define LV_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/ +#endif + +/*Enable drawing placeholders when glyph dsc is not found*/ +#define LV_USE_FONT_PLACEHOLDER 1 + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#define LV_TXT_ENC LV_TXT_ENC_UTF8 + +/*Can break (wrap) texts on these chars*/ +#define LV_TXT_BREAK_CHARS " ,.;:-_" + +/*If a word is at least this long, will break wherever "prettiest" + *To disable, set to a value <= 0*/ +#define LV_TXT_LINE_BREAK_LONG_LEN 0 + +/*Minimum number of characters in a long word to put on a line before a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + +/*Minimum number of characters in a long word to put on a line after a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + +/*The control character to use for signalling text recoloring.*/ +#define LV_TXT_COLOR_CMD "#" + +/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. + *The direction will be processed according to the Unicode Bidirectional Algorithm: + *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#define LV_USE_BIDI 0 +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect texts base direction*/ + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +/*Enable Arabic/Persian processing + *In these languages characters should be replaced with an other form based on their position in the text*/ +#define LV_USE_ARABIC_PERSIAN_CHARS 0 + +/*================== + * WIDGET USAGE + *================*/ + +/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ + +#define LV_USE_ARC 1 + +#define LV_USE_BAR 1 + +#define LV_USE_BTN 1 + +#define LV_USE_BTNMATRIX 1 + +#define LV_USE_CANVAS 1 + +#define LV_USE_CHECKBOX 1 + +#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ + +#define LV_USE_IMG 1 /*Requires: lv_label*/ + +#define LV_USE_LABEL 1 +#if LV_USE_LABEL + #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ + #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ +#endif + +#define LV_USE_LINE 1 + +#define LV_USE_ROLLER 1 /*Requires: lv_label*/ +#if LV_USE_ROLLER + #define LV_ROLLER_INF_PAGES 7 /*Number of extra "pages" when the roller is infinite*/ +#endif + +#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ + +#define LV_USE_SWITCH 1 + +#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ +#if LV_USE_TEXTAREA != 0 + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_USE_TABLE 1 + +/*================== + * EXTRA COMPONENTS + *==================*/ + +/*----------- + * Widgets + *----------*/ +#define LV_USE_ANIMIMG 1 + +#define LV_USE_CALENDAR 1 +#if LV_USE_CALENDAR + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 +#endif /*LV_USE_CALENDAR*/ + +#define LV_USE_CHART 1 + +#define LV_USE_COLORWHEEL 1 + +#define LV_USE_IMGBTN 1 + +#define LV_USE_KEYBOARD 1 + +#define LV_USE_LED 1 + +#define LV_USE_LIST 1 + +#define LV_USE_MENU 1 + +#define LV_USE_METER 1 + +#define LV_USE_MSGBOX 1 + +#define LV_USE_SPAN 1 +#if LV_USE_SPAN + /*A line text can contain maximum num of span descriptor */ + #define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +#define LV_USE_SPINBOX 1 + +#define LV_USE_SPINNER 1 + +#define LV_USE_TABVIEW 1 + +#define LV_USE_TILEVIEW 1 + +#define LV_USE_WIN 1 + +/*----------- + * Themes + *----------*/ + +/*A simple, impressive and very complete theme*/ +#define LV_USE_THEME_DEFAULT 1 +#if LV_USE_THEME_DEFAULT + + /*0: Light mode; 1: Dark mode*/ + #define LV_THEME_DEFAULT_DARK 0 + + /*1: Enable grow on press*/ + #define LV_THEME_DEFAULT_GROW 1 + + /*Default transition time in [ms]*/ + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 +#endif /*LV_USE_THEME_DEFAULT*/ + +/*A very simple theme that is a good starting point for a custom theme*/ +#define LV_USE_THEME_BASIC 1 + +/*A theme designed for monochrome displays*/ +#define LV_USE_THEME_MONO 1 + +/*----------- + * Layouts + *----------*/ + +/*A layout similar to Flexbox in CSS.*/ +#define LV_USE_FLEX 1 + +/*A layout similar to Grid in CSS.*/ +#define LV_USE_GRID 1 + +/*--------------------- + * 3rd party libraries + *--------------------*/ + +/*File system interfaces for common APIs */ + +/*API for fopen, fread, etc*/ +#define LV_USE_FS_STDIO 0 +#if LV_USE_FS_STDIO + #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for open, read, etc*/ +#define LV_USE_FS_POSIX 0 +#if LV_USE_FS_POSIX + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for CreateFile, ReadFile, etc*/ +#define LV_USE_FS_WIN32 0 +#if LV_USE_FS_WIN32 + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#define LV_USE_FS_FATFS 0 +#if LV_USE_FS_FATFS + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*PNG decoder library*/ +#define LV_USE_PNG 0 + +/*BMP decoder library*/ +#define LV_USE_BMP 0 + +/* JPG + split JPG decoder library. + * Split JPG is a custom format optimized for embedded systems. */ +#define LV_USE_SJPG 0 + +/*GIF decoder library*/ +#define LV_USE_GIF 0 + +/*QR code library*/ +#define LV_USE_QRCODE 0 + +/*FreeType library*/ +#define LV_USE_FREETYPE 0 +#if LV_USE_FREETYPE + /*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/ + #define LV_FREETYPE_CACHE_SIZE (16 * 1024) + #if LV_FREETYPE_CACHE_SIZE >= 0 + /* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */ + /* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */ + /* if font size >= 256, must be configured as image cache */ + #define LV_FREETYPE_SBIT_CACHE 0 + /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ + /* (0:use system defaults) */ + #define LV_FREETYPE_CACHE_FT_FACES 0 + #define LV_FREETYPE_CACHE_FT_SIZES 0 + #endif +#endif + +/*Rlottie library*/ +#define LV_USE_RLOTTIE 0 + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#define LV_USE_FFMPEG 0 +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #define LV_FFMPEG_DUMP_FORMAT 0 +#endif + +/*----------- + * Others + *----------*/ + +/*1: Enable API to take snapshot for object*/ +#define LV_USE_SNAPSHOT 0 + +/*1: Enable Monkey test*/ +#define LV_USE_MONKEY 0 + +/*1: Enable grid navigation*/ +#define LV_USE_GRIDNAV 0 + +/*1: Enable lv_obj fragment*/ +#define LV_USE_FRAGMENT 0 + +/*1: Support using images as font in label or span widgets */ +#define LV_USE_IMGFONT 0 + +/*1: Enable a published subscriber based messaging system */ +#define LV_USE_MSG 0 + +/*1: Enable Pinyin input method*/ +/*Requires: lv_keyboard*/ +#define LV_USE_IME_PINYIN 0 +#if LV_USE_IME_PINYIN + /*1: Use default thesaurus*/ + /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + /*Set the maximum number of candidate panels that can be displayed*/ + /*This needs to be adjusted according to the size of the screen*/ + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + + /*Use 9 key input(k9)*/ + #define LV_IME_PINYIN_USE_K9_MODE 1 + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif // LV_IME_PINYIN_USE_K9_MODE +#endif + +/*================== +* EXAMPLES +*==================*/ + +/*Enable the examples to be built with the library*/ +#define LV_BUILD_EXAMPLES 1 + +/*=================== + * DEMO USAGE + ====================*/ + +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#define LV_USE_DEMO_WIDGETS 0 +#if LV_USE_DEMO_WIDGETS +#define LV_DEMO_WIDGETS_SLIDESHOW 0 +#endif + +/*Demonstrate the usage of encoder and keyboard*/ +#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + +/*Benchmark your system*/ +#define LV_USE_DEMO_BENCHMARK 0 +#if LV_USE_DEMO_BENCHMARK +/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ +#define LV_DEMO_BENCHMARK_RGB565A8 0 +#endif + +/*Stress test for LVGL*/ +#define LV_USE_DEMO_STRESS 0 + +/*Music player demo*/ +#define LV_USE_DEMO_MUSIC 0 +#if LV_USE_DEMO_MUSIC + #define LV_DEMO_MUSIC_SQUARE 0 + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #define LV_DEMO_MUSIC_ROUND 0 + #define LV_DEMO_MUSIC_LARGE 0 + #define LV_DEMO_MUSIC_AUTO_PLAY 0 +#endif + +/*--END OF LV_CONF_H--*/ + +#endif /*LV_CONF_H*/ + +#endif /*End of "Content enable"*/ \ No newline at end of file diff --git a/libraries/Arduino_H7_Video/src/lv_conf_9.h b/libraries/Arduino_H7_Video/src/lv_conf_9.h new file mode 100644 index 000000000..635a2816c --- /dev/null +++ b/libraries/Arduino_H7_Video/src/lv_conf_9.h @@ -0,0 +1,973 @@ +/** + * @file lv_conf.h + * Configuration file for v9.0.1-dev + */ + +/* + * Copy this file as `lv_conf.h` + * 1. simply next to the `lvgl` folder + * 2. or any other places and + * - define `LV_CONF_INCLUDE_SIMPLE` + * - add the path as include path + */ + +/* clang-format off */ +#if 1 /*Set it to "1" to enable content*/ + +#ifndef LV_CONF_H +#define LV_CONF_H + +/*==================== + COLOR SETTINGS + *====================*/ + +/*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/ +#define LV_COLOR_DEPTH 16 + +/*========================= + STDLIB WRAPPER SETTINGS + *=========================*/ + +/* Possible values + * - LV_STDLIB_BUILTIN: LVGL's built in implementation + * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc + * - LV_STDLIB_MICROPYTHON: MicroPython implementation + * - LV_STDLIB_RTTHREAD: RT-Thread implementation + * - LV_STDLIB_CUSTOM: Implement the functions externally + */ +#define LV_USE_STDLIB_MALLOC LV_STDLIB_BUILTIN +#define LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN +#define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN + + +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + /*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/ + #define LV_MEM_SIZE (64 * 1024U) /*[bytes]*/ + + /*Size of the memory expand for `lv_malloc()` in bytes*/ + #define LV_MEM_POOL_EXPAND_SIZE 0 + + /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ + #define LV_MEM_ADR 0 /*0: unused*/ + /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ + #if LV_MEM_ADR == 0 + #undef LV_MEM_POOL_INCLUDE + #undef LV_MEM_POOL_ALLOC + #endif +#endif /*LV_USE_MALLOC == LV_STDLIB_BUILTIN*/ + +/*==================== + HAL SETTINGS + *====================*/ + +/*Default display refresh, input device read and animation step period.*/ +#define LV_DEF_REFR_PERIOD 33 /*[ms]*/ + +/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + *(Not so important, you can adjust it to modify default sizes and spaces)*/ +#define LV_DPI_DEF 130 /*[px/inch]*/ + +/*================= + * OPERATING SYSTEM + *=================*/ +/*Select an operating system to use. Possible options: + * - LV_OS_NONE + * - LV_OS_PTHREAD + * - LV_OS_FREERTOS + * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD + * - LV_OS_WINDOWS + * - LV_OS_CUSTOM */ +#define LV_USE_OS LV_OS_NONE + +#if LV_USE_OS == LV_OS_CUSTOM + #define LV_OS_CUSTOM_INCLUDE +#endif + +/*======================== + * RENDERING CONFIGURATION + *========================*/ + +/*Align the stride of all layers and images to this bytes*/ +#define LV_DRAW_BUF_STRIDE_ALIGN 1 + +/*Align the start address of draw_buf addresses to this bytes*/ +#define LV_DRAW_BUF_ALIGN 4 + +#define LV_USE_DRAW_SW 1 +#if LV_USE_DRAW_SW == 1 + /* Set the number of draw unit. + * > 1 requires an operating system enabled in `LV_USE_OS` + * > 1 means multiply threads will render the screen in parallel */ + #define LV_DRAW_SW_DRAW_UNIT_CNT 1 + + /* Use Arm-2D to accelerate the sw render */ + #define LV_USE_DRAW_ARM2D_SYNC 1 + + /* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode + * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. + * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers + * and can't be drawn in chunks. */ + + /*The target buffer size for simple layer chunks.*/ + #define LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/ + + /* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only + * 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */ + #define LV_DRAW_SW_COMPLEX 1 + + #if LV_DRAW_SW_COMPLEX == 1 + /*Allow buffering some shadow calculation. + *LV_DRAW_SW_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` + *Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost*/ + #define LV_DRAW_SW_SHADOW_CACHE_SIZE 0 + + /* Set number of maximally cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing + * radius * 4 bytes are used per circle (the most often used radiuses are saved) + * 0: to disable caching */ + #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 + #endif + + #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE + + #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE "" + #endif +#endif + +/* Use NXP's VG-Lite GPU on iMX RTxxx platforms. */ +#define LV_USE_DRAW_VGLITE 0 + +#if LV_USE_DRAW_VGLITE + /* Enable blit quality degradation workaround recommended for screen's dimension > 352 pixels. */ + #define LV_USE_VGLITE_BLIT_SPLIT 0 + + #if LV_USE_OS + /* Enable VGLite draw async. Queue multiple tasks and flash them once to the GPU. */ + #define LV_USE_VGLITE_DRAW_ASYNC 1 + #endif + + /* Enable VGLite asserts. */ + #define LV_USE_VGLITE_ASSERT 0 +#endif + +/* Use NXP's PXP on iMX RTxxx platforms. */ +#define LV_USE_DRAW_PXP 0 + +#if LV_USE_DRAW_PXP + /* Enable PXP asserts. */ + #define LV_USE_PXP_ASSERT 0 +#endif + +/* Use Renesas Dave2D on RA platforms. */ +#define LV_USE_DRAW_DAVE2D 0 + +/* Draw using cached SDL textures*/ +#define LV_USE_DRAW_SDL 0 + +/* Use VG-Lite GPU. */ +#define LV_USE_DRAW_VG_LITE 0 + +#if LV_USE_DRAW_VG_LITE +/* Enable VG-Lite custom external 'gpu_init()' function */ +#define LV_VG_LITE_USE_GPU_INIT 0 + +/* Enable VG-Lite assert. */ +#define LV_VG_LITE_USE_ASSERT 0 + +/* VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */ +#define LV_VG_LITE_FLUSH_MAX_COUNT 8 + +/* Enable border to simulate shadow + * NOTE: which usually improves performance, + * but does not guarantee the same rendering quality as the software. */ +#define LV_VG_LITE_USE_BOX_SHADOW 0 + +#endif + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Logging + *-----------*/ + +/*Enable the log module*/ +#define LV_USE_LOG 0 +#if LV_USE_LOG + + /*How important log should be added: + *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information + *LV_LOG_LEVEL_INFO Log important events + *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem + *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail + *LV_LOG_LEVEL_USER Only logs added by the user + *LV_LOG_LEVEL_NONE Do not log anything*/ + #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + + /*1: Print the log with 'printf'; + *0: User need to register a callback with `lv_log_register_print_cb()`*/ + #define LV_LOG_PRINTF 0 + + /*1: Enable print timestamp; + *0: Disable print timestamp*/ + #define LV_LOG_USE_TIMESTAMP 1 + + /*1: Print file and line number of the log; + *0: Do not print file and line number of the log*/ + #define LV_LOG_USE_FILE_LINE 1 + + /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ + #define LV_LOG_TRACE_MEM 1 + #define LV_LOG_TRACE_TIMER 1 + #define LV_LOG_TRACE_INDEV 1 + #define LV_LOG_TRACE_DISP_REFR 1 + #define LV_LOG_TRACE_EVENT 1 + #define LV_LOG_TRACE_OBJ_CREATE 1 + #define LV_LOG_TRACE_LAYOUT 1 + #define LV_LOG_TRACE_ANIM 1 + #define LV_LOG_TRACE_CACHE 1 + +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/*Enable asserts if an operation is failed or an invalid data is found. + *If LV_USE_LOG is enabled an error message will be printed on failure*/ +#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ +#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ +#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ + +/*Add a custom handler when assert happens e.g. to restart the MCU*/ +#define LV_ASSERT_HANDLER_INCLUDE +#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ + +/*------------- + * Debug + *-----------*/ + +/*1: Draw random colored rectangles over the redrawn areas*/ +#define LV_USE_REFR_DEBUG 0 + +/*1: Draw a red overlay for ARGB layers and a green overlay for RGB layers*/ +#define LV_USE_LAYER_DEBUG 0 + +/*1: Draw overlays with different colors for each draw_unit's tasks. + *Also add the index number of the draw unit on white background. + *For layers add the index number of the draw unit on black background.*/ +#define LV_USE_PARALLEL_DRAW_DEBUG 0 + +/*------------- + * Others + *-----------*/ + +#define LV_ENABLE_GLOBAL_CUSTOM 0 +#if LV_ENABLE_GLOBAL_CUSTOM + /*Header to include for the custom 'lv_global' function"*/ + #define LV_GLOBAL_CUSTOM_INCLUDE +#endif + +/*Default cache size in bytes. + *Used by image decoders such as `lv_lodepng` to keep the decoded image in the memory. + *If size is not set to 0, the decoder will fail to decode when the cache is full. + *If size is 0, the cache function is not enabled and the decoded mem will be released immediately after use.*/ +#define LV_CACHE_DEF_SIZE 0 + +/*Default number of image header cache entries. The cache is used to store the headers of images + *The main logic is like `LV_CACHE_DEF_SIZE` but for image headers.*/ +#define LV_IMAGE_HEADER_CACHE_DEF_CNT 0 + +/*Number of stops allowed per gradient. Increase this to allow more stops. + *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ +#define LV_GRADIENT_MAX_STOPS 2 + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#define LV_COLOR_MIX_ROUND_OFS 0 + +/* Add 2 x 32 bit variables to each lv_obj_t to speed up getting style properties */ +#define LV_OBJ_STYLE_CACHE 0 + +/* Add `id` field to `lv_obj_t` */ +#define LV_USE_OBJ_ID 0 + +/* Use lvgl builtin method for obj ID */ +#define LV_USE_OBJ_ID_BUILTIN 0 + +/*Use obj property set/get API*/ +#define LV_USE_OBJ_PROPERTY 0 + +/* VG-Lite Simulator */ +/*Requires: LV_USE_THORVG_INTERNAL or LV_USE_THORVG_EXTERNAL */ +#define LV_USE_VG_LITE_THORVG 0 + +#if LV_USE_VG_LITE_THORVG + + /*Enable LVGL's blend mode support*/ + #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT 0 + + /*Enable YUV color format support*/ + #define LV_VG_LITE_THORVG_YUV_SUPPORT 0 + + /*Enable 16 pixels alignment*/ + #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1 + + /*Enable multi-thread render*/ + #define LV_VG_LITE_THORVG_THREAD_RENDER 0 + +#endif + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/*For big endian systems set to 1*/ +#define LV_BIG_ENDIAN_SYSTEM 0 + +/*Define a custom attribute to `lv_tick_inc` function*/ +#define LV_ATTRIBUTE_TICK_INC + +/*Define a custom attribute to `lv_timer_handler` function*/ +#define LV_ATTRIBUTE_TIMER_HANDLER + +/*Define a custom attribute to `lv_display_flush_ready` function*/ +#define LV_ATTRIBUTE_FLUSH_READY + +/*Required alignment size for buffers*/ +#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + +/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#define LV_ATTRIBUTE_MEM_ALIGN + +/*Attribute to mark large constant arrays for example font's bitmaps*/ +#define LV_ATTRIBUTE_LARGE_CONST + +/*Compiler prefix for a big array declaration in RAM*/ +#define LV_ATTRIBUTE_LARGE_RAM_ARRAY + +/*Place performance critical functions into a faster memory (e.g RAM)*/ +#define LV_ATTRIBUTE_FAST_MEM + +/*Export integer constant to binding. This macro is used with constants in the form of LV_ that + *should also appear on LVGL binding API such as Micropython.*/ +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ + +/*Prefix all global extern data with this*/ +#define LV_ATTRIBUTE_EXTERN_DATA + +/* Use `float` as `lv_value_precise_t` */ +#define LV_USE_FLOAT 0 + +/*================== + * FONT USAGE + *===================*/ + +/*Montserrat fonts with ASCII range and some symbols using bpp = 4 + *https://fonts.google.com/specimen/Montserrat*/ +#define LV_FONT_MONTSERRAT_8 0 +#define LV_FONT_MONTSERRAT_10 0 +#define LV_FONT_MONTSERRAT_12 0 +#define LV_FONT_MONTSERRAT_14 1 +#define LV_FONT_MONTSERRAT_16 0 +#define LV_FONT_MONTSERRAT_18 0 +#define LV_FONT_MONTSERRAT_20 0 +#define LV_FONT_MONTSERRAT_22 0 +#define LV_FONT_MONTSERRAT_24 0 +#define LV_FONT_MONTSERRAT_26 0 +#define LV_FONT_MONTSERRAT_28 0 +#define LV_FONT_MONTSERRAT_30 0 +#define LV_FONT_MONTSERRAT_32 0 +#define LV_FONT_MONTSERRAT_34 0 +#define LV_FONT_MONTSERRAT_36 0 +#define LV_FONT_MONTSERRAT_38 0 +#define LV_FONT_MONTSERRAT_40 0 +#define LV_FONT_MONTSERRAT_42 0 +#define LV_FONT_MONTSERRAT_44 0 +#define LV_FONT_MONTSERRAT_46 0 +#define LV_FONT_MONTSERRAT_48 0 + +/*Demonstrate special features*/ +#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ +#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ +#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ + +/*Pixel perfect monospace fonts*/ +#define LV_FONT_UNSCII_8 0 +#define LV_FONT_UNSCII_16 0 + +/*Optionally declare custom fonts here. + *You can use these fonts as default font too and they will be available globally. + *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ +#define LV_FONT_CUSTOM_DECLARE + +/*Always set a default font*/ +#define LV_FONT_DEFAULT &lv_font_montserrat_14 + +/*Enable handling large font and/or fonts with a lot of characters. + *The limit depends on the font size, font face and bpp. + *Compiler error will be triggered if a font needs it.*/ +#define LV_FONT_FMT_TXT_LARGE 0 + +/*Enables/disables support for compressed fonts.*/ +#define LV_USE_FONT_COMPRESSED 0 + +/*Enable drawing placeholders when glyph dsc is not found*/ +#define LV_USE_FONT_PLACEHOLDER 1 + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#define LV_TXT_ENC LV_TXT_ENC_UTF8 + +/*Can break (wrap) texts on these chars*/ +#define LV_TXT_BREAK_CHARS " ,.;:-_)]}" + +/*If a word is at least this long, will break wherever "prettiest" + *To disable, set to a value <= 0*/ +#define LV_TXT_LINE_BREAK_LONG_LEN 0 + +/*Minimum number of characters in a long word to put on a line before a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + +/*Minimum number of characters in a long word to put on a line after a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + +/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. + *The direction will be processed according to the Unicode Bidirectional Algorithm: + *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#define LV_USE_BIDI 0 +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect texts base direction*/ + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +/*Enable Arabic/Persian processing + *In these languages characters should be replaced with an other form based on their position in the text*/ +#define LV_USE_ARABIC_PERSIAN_CHARS 0 + +/*================== + * WIDGETS + *================*/ + +/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ + +#define LV_WIDGETS_HAS_DEFAULT_VALUE 1 + +#define LV_USE_ANIMIMG 1 + +#define LV_USE_ARC 1 + +#define LV_USE_BAR 1 + +#define LV_USE_BUTTON 1 + +#define LV_USE_BUTTONMATRIX 1 + +#define LV_USE_CALENDAR 1 +#if LV_USE_CALENDAR + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 +#endif /*LV_USE_CALENDAR*/ + +#define LV_USE_CANVAS 1 + +#define LV_USE_CHART 1 + +#define LV_USE_CHECKBOX 1 + +#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ + +#define LV_USE_IMAGE 1 /*Requires: lv_label*/ + +#define LV_USE_IMAGEBUTTON 1 + +#define LV_USE_KEYBOARD 1 + +#define LV_USE_LABEL 1 +#if LV_USE_LABEL + #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ + #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ + #define LV_LABEL_WAIT_CHAR_COUNT 3 /*The count of wait chart*/ +#endif + +#define LV_USE_LED 1 + +#define LV_USE_LINE 1 + +#define LV_USE_LIST 1 + +#define LV_USE_MENU 1 + +#define LV_USE_MSGBOX 1 + +#define LV_USE_ROLLER 1 /*Requires: lv_label*/ + +#define LV_USE_SCALE 1 + +#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ + +#define LV_USE_SPAN 1 +#if LV_USE_SPAN + /*A line text can contain maximum num of span descriptor */ + #define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +#define LV_USE_SPINBOX 1 + +#define LV_USE_SPINNER 1 + +#define LV_USE_SWITCH 1 + +#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ +#if LV_USE_TEXTAREA != 0 + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_USE_TABLE 1 + +#define LV_USE_TABVIEW 1 + +#define LV_USE_TILEVIEW 1 + +#define LV_USE_WIN 1 + +/*================== + * THEMES + *==================*/ + +/*A simple, impressive and very complete theme*/ +#define LV_USE_THEME_DEFAULT 1 +#if LV_USE_THEME_DEFAULT + + /*0: Light mode; 1: Dark mode*/ + #define LV_THEME_DEFAULT_DARK 0 + + /*1: Enable grow on press*/ + #define LV_THEME_DEFAULT_GROW 1 + + /*Default transition time in [ms]*/ + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 +#endif /*LV_USE_THEME_DEFAULT*/ + +/*A very simple theme that is a good starting point for a custom theme*/ +#define LV_USE_THEME_SIMPLE 1 + +/*A theme designed for monochrome displays*/ +#define LV_USE_THEME_MONO 1 + +/*================== + * LAYOUTS + *==================*/ + +/*A layout similar to Flexbox in CSS.*/ +#define LV_USE_FLEX 1 + +/*A layout similar to Grid in CSS.*/ +#define LV_USE_GRID 1 + +/*==================== + * 3RD PARTS LIBRARIES + *====================*/ + +/*File system interfaces for common APIs */ + +/*API for fopen, fread, etc*/ +#define LV_USE_FS_STDIO 0 +#if LV_USE_FS_STDIO + #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for open, read, etc*/ +#define LV_USE_FS_POSIX 0 +#if LV_USE_FS_POSIX + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for CreateFile, ReadFile, etc*/ +#define LV_USE_FS_WIN32 0 +#if LV_USE_FS_WIN32 + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#define LV_USE_FS_FATFS 0 +#if LV_USE_FS_FATFS + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for memory-mapped file access. */ +#define LV_USE_FS_MEMFS 0 +#if LV_USE_FS_MEMFS + #define LV_FS_MEMFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ +#endif + +/*LODEPNG decoder library*/ +#define LV_USE_LODEPNG 0 + +/*PNG decoder(libpng) library*/ +#define LV_USE_LIBPNG 0 + +/*BMP decoder library*/ +#define LV_USE_BMP 0 + +/* JPG + split JPG decoder library. + * Split JPG is a custom format optimized for embedded systems. */ +#define LV_USE_TJPGD 0 + +/* libjpeg-turbo decoder library. + * Supports complete JPEG specifications and high-performance JPEG decoding. */ +#define LV_USE_LIBJPEG_TURBO 0 + +/*GIF decoder library*/ +#define LV_USE_GIF 0 +#if LV_USE_GIF +/*GIF decoder accelerate*/ +#define LV_GIF_CACHE_DECODE_DATA 0 +#endif + + +/*Decode bin images to RAM*/ +#define LV_BIN_DECODER_RAM_LOAD 0 + +/*RLE decompress library*/ +#define LV_USE_RLE 0 + +/*QR code library*/ +#define LV_USE_QRCODE 0 + +/*Barcode code library*/ +#define LV_USE_BARCODE 0 + +/*FreeType library*/ +#define LV_USE_FREETYPE 0 +#if LV_USE_FREETYPE + /*Memory used by FreeType to cache characters in kilobytes*/ + #define LV_FREETYPE_CACHE_SIZE 768 + + /*Let FreeType to use LVGL memory and file porting*/ + #define LV_FREETYPE_USE_LVGL_PORT 0 + + /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ + /* (0:use system defaults) */ + #define LV_FREETYPE_CACHE_FT_FACES 8 + #define LV_FREETYPE_CACHE_FT_SIZES 8 + #define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256 +#endif + +/* Built-in TTF decoder */ +#define LV_USE_TINY_TTF 0 +#if LV_USE_TINY_TTF + /* Enable loading TTF data from files */ + #define LV_TINY_TTF_FILE_SUPPORT 0 +#endif + +/*Rlottie library*/ +#define LV_USE_RLOTTIE 0 + +/*Enable Vector Graphic APIs*/ +#define LV_USE_VECTOR_GRAPHIC 0 + +/* Enable ThorVG (vector graphics library) from the src/libs folder */ +#define LV_USE_THORVG_INTERNAL 0 + +/* Enable ThorVG by assuming that its installed and linked to the project */ +#define LV_USE_THORVG_EXTERNAL 0 + +/*Enable LZ4 compress/decompress lib*/ +#define LV_USE_LZ4 0 + +/*Use lvgl built-in LZ4 lib*/ +#define LV_USE_LZ4_INTERNAL 0 + +/*Use external LZ4 library*/ +#define LV_USE_LZ4_EXTERNAL 0 + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#define LV_USE_FFMPEG 0 +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #define LV_FFMPEG_DUMP_FORMAT 0 +#endif + +/*================== + * OTHERS + *==================*/ + +/*1: Enable API to take snapshot for object*/ +#define LV_USE_SNAPSHOT 0 + +/*1: Enable system monitor component*/ +#define LV_USE_SYSMON 0 +#if LV_USE_SYSMON + /*Get the idle percentage. E.g. uint32_t my_get_idle(void);*/ + #define LV_SYSMON_GET_IDLE lv_timer_get_idle + + /*1: Show CPU usage and FPS count + * Requires `LV_USE_SYSMON = 1`*/ + #define LV_USE_PERF_MONITOR 0 + #if LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT + + /*0: Displays performance data on the screen, 1: Prints performance data using log.*/ + #define LV_USE_PERF_MONITOR_LOG_MODE 0 + #endif + + /*1: Show the used memory and the memory fragmentation + * Requires `LV_USE_BUILTIN_MALLOC = 1` + * Requires `LV_USE_SYSMON = 1`*/ + #define LV_USE_MEM_MONITOR 0 + #if LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT + #endif + +#endif /*LV_USE_SYSMON*/ + +/*1: Enable the runtime performance profiler*/ +#define LV_USE_PROFILER 0 +#if LV_USE_PROFILER + /*1: Enable the built-in profiler*/ + #define LV_USE_PROFILER_BUILTIN 1 + #if LV_USE_PROFILER_BUILTIN + /*Default profiler trace buffer size*/ + #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /*[bytes]*/ + #endif + + /*Header to include for the profiler*/ + #define LV_PROFILER_INCLUDE "lvgl/src/misc/lv_profiler_builtin.h" + + /*Profiler start point function*/ + #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN + + /*Profiler end point function*/ + #define LV_PROFILER_END LV_PROFILER_BUILTIN_END + + /*Profiler start point function with custom tag*/ + #define LV_PROFILER_BEGIN_TAG LV_PROFILER_BUILTIN_BEGIN_TAG + + /*Profiler end point function with custom tag*/ + #define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG +#endif + +/*1: Enable Monkey test*/ +#define LV_USE_MONKEY 0 + +/*1: Enable grid navigation*/ +#define LV_USE_GRIDNAV 0 + +/*1: Enable lv_obj fragment*/ +#define LV_USE_FRAGMENT 0 + +/*1: Support using images as font in label or span widgets */ +#define LV_USE_IMGFONT 0 + +/*1: Enable an observer pattern implementation*/ +#define LV_USE_OBSERVER 1 + +/*1: Enable Pinyin input method*/ +/*Requires: lv_keyboard*/ +#define LV_USE_IME_PINYIN 0 +#if LV_USE_IME_PINYIN + /*1: Use default thesaurus*/ + /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + /*Set the maximum number of candidate panels that can be displayed*/ + /*This needs to be adjusted according to the size of the screen*/ + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + + /*Use 9 key input(k9)*/ + #define LV_IME_PINYIN_USE_K9_MODE 1 + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif /*LV_IME_PINYIN_USE_K9_MODE*/ +#endif + +/*1: Enable file explorer*/ +/*Requires: lv_table*/ +#define LV_USE_FILE_EXPLORER 0 +#if LV_USE_FILE_EXPLORER + /*Maximum length of path*/ + #define LV_FILE_EXPLORER_PATH_MAX_LEN (128) + /*Quick access bar, 1:use, 0:not use*/ + /*Requires: lv_list*/ + #define LV_FILE_EXPLORER_QUICK_ACCESS 1 +#endif + +/*================== + * DEVICES + *==================*/ + +/*Use SDL to open window on PC and handle mouse and keyboard*/ +#define LV_USE_SDL 0 +#if LV_USE_SDL + #define LV_SDL_INCLUDE_PATH + #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/ + #define LV_SDL_BUF_COUNT 1 /*1 or 2*/ + #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/ + #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/ +#endif + +/*Use X11 to open window on Linux desktop and handle mouse and keyboard*/ +#define LV_USE_X11 0 +#if LV_USE_X11 + #define LV_X11_DIRECT_EXIT 1 /*Exit the application when all X11 windows have been closed*/ + #define LV_X11_DOUBLE_BUFFER 1 /*Use double buffers for endering*/ + /*select only 1 of the following render modes (LV_X11_RENDER_MODE_PARTIAL preferred!)*/ + #define LV_X11_RENDER_MODE_PARTIAL 1 /*Partial render mode (preferred)*/ + #define LV_X11_RENDER_MODE_DIRECT 0 /*direct render mode*/ + #define LV_X11_RENDER_MODE_FULL 0 /*Full render mode*/ +#endif + +/*Driver for /dev/fb*/ +#define LV_USE_LINUX_FBDEV 0 +#if LV_USE_LINUX_FBDEV + #define LV_LINUX_FBDEV_BSD 0 + #define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL + #define LV_LINUX_FBDEV_BUFFER_COUNT 0 + #define LV_LINUX_FBDEV_BUFFER_SIZE 60 +#endif + +/*Use Nuttx to open window and handle touchscreen*/ +#define LV_USE_NUTTX 0 + +#if LV_USE_NUTTX + #define LV_USE_NUTTX_LIBUV 0 + + /*Use Nuttx custom init API to open window and handle touchscreen*/ + #define LV_USE_NUTTX_CUSTOM_INIT 0 + + /*Driver for /dev/lcd*/ + #define LV_USE_NUTTX_LCD 0 + #if LV_USE_NUTTX_LCD + #define LV_NUTTX_LCD_BUFFER_COUNT 0 + #define LV_NUTTX_LCD_BUFFER_SIZE 60 + #endif + + /*Driver for /dev/input*/ + #define LV_USE_NUTTX_TOUCHSCREEN 0 + +#endif + +/*Driver for /dev/dri/card*/ +#define LV_USE_LINUX_DRM 0 + +/*Interface for TFT_eSPI*/ +#define LV_USE_TFT_ESPI 0 + +/*Driver for evdev input devices*/ +#define LV_USE_EVDEV 0 + +/*Driver for libinput input devices*/ +#define LV_USE_LIBINPUT 0 + +#if LV_USE_LIBINPUT + #define LV_LIBINPUT_BSD 0 + + /*Full keyboard support*/ + #define LV_LIBINPUT_XKB 0 + #if LV_LIBINPUT_XKB + /*"setxkbmap -query" can help find the right values for your keyboard*/ + #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL } + #endif +#endif + +/*Drivers for LCD devices connected via SPI/parallel port*/ +#define LV_USE_ST7735 0 +#define LV_USE_ST7789 0 +#define LV_USE_ST7796 0 +#define LV_USE_ILI9341 0 + +#define LV_USE_GENERIC_MIPI (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341) + +/* LVGL Windows backend */ +#define LV_USE_WINDOWS 0 + +/*================== +* EXAMPLES +*==================*/ + +/*Enable the examples to be built with the library*/ +#define LV_BUILD_EXAMPLES 1 + +/*=================== + * DEMO USAGE + ====================*/ + +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#define LV_USE_DEMO_WIDGETS 0 + +/*Demonstrate the usage of encoder and keyboard*/ +#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + +/*Benchmark your system*/ +#define LV_USE_DEMO_BENCHMARK 0 + +/*Render test for each primitives. Requires at least 480x272 display*/ +#define LV_USE_DEMO_RENDER 0 + +/*Stress test for LVGL*/ +#define LV_USE_DEMO_STRESS 0 + +/*Music player demo*/ +#define LV_USE_DEMO_MUSIC 0 +#if LV_USE_DEMO_MUSIC + #define LV_DEMO_MUSIC_SQUARE 0 + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #define LV_DEMO_MUSIC_ROUND 0 + #define LV_DEMO_MUSIC_LARGE 0 + #define LV_DEMO_MUSIC_AUTO_PLAY 0 +#endif + +/*Flex layout demo*/ +#define LV_USE_DEMO_FLEX_LAYOUT 0 + +/*Smart-phone like multi-language demo*/ +#define LV_USE_DEMO_MULTILANG 0 + +/*Widget transformation demo*/ +#define LV_USE_DEMO_TRANSFORM 0 + +/*Demonstrate scroll settings*/ +#define LV_USE_DEMO_SCROLL 0 + +/*Vector graphic demo*/ +#define LV_USE_DEMO_VECTOR_GRAPHIC 0 +/*--END OF LV_CONF_H--*/ + +#endif /*LV_CONF_H*/ + +#endif /*End of "Content enable"*/ diff --git a/libraries/Camera/examples/CameraCaptureWebSerial/CameraCaptureWebSerial.ino b/libraries/Camera/examples/CameraCaptureWebSerial/CameraCaptureWebSerial.ino new file mode 100644 index 000000000..8347f725a --- /dev/null +++ b/libraries/Camera/examples/CameraCaptureWebSerial/CameraCaptureWebSerial.ino @@ -0,0 +1,160 @@ +/* + * This example shows how to capture images from the camera and send them over Web Serial. + * + * There is a companion web app that receives the images and displays them in a canvas. + * It can be found in the "extras" folder of this library. + * The on-board LED lights up while the image is being sent over serial. + * + * Instructions: + * 1. Make sure the correct camera is selected in the #include section below by uncommenting the correct line. + * 2. Upload this sketch to your camera-equipped board. + * 3. Open the web app in a browser (Chrome or Edge) by opening the index.html file + * in the "WebSerialCamera" folder which is located in the "extras" folder. + * + * Initial author: Sebastian Romero @sebromero + */ + +#include "camera.h" + +#ifdef ARDUINO_NICLA_VISION + #include "gc2145.h" + GC2145 galaxyCore; + Camera cam(galaxyCore); + #define IMAGE_MODE CAMERA_RGB565 +#elif defined(ARDUINO_PORTENTA_H7_M7) + // uncomment the correct camera in use + #include "hm0360.h" + HM0360 himax; + // #include "himax.h"; + // HM01B0 himax; + Camera cam(himax); + #define IMAGE_MODE CAMERA_GRAYSCALE +#elif defined(ARDUINO_GIGA) + #include "ov767x.h" + // uncomment the correct camera in use + OV7670 ov767x; + // OV7675 ov767x; + Camera cam(ov767x); + #define IMAGE_MODE CAMERA_RGB565 +#else +#error "This board is unsupported." +#endif + +/* +Other buffer instantiation options: + FrameBuffer fb(0x30000000); + FrameBuffer fb(320,240,2); + +If resolution higher than 320x240 is required, please use external RAM via + #include "SDRAM.h" + FrameBuffer fb(SDRAM_START_ADDRESS); + ... + // and adding in setup() + SDRAM.begin(); +*/ +constexpr uint16_t CHUNK_SIZE = 512; // Size of chunks in bytes +constexpr uint8_t RESOLUTION = CAMERA_R320x240; // CAMERA_R160x120 +constexpr uint8_t CONFIG_SEND_REQUEST = 2; +constexpr uint8_t IMAGE_SEND_REQUEST = 1; + +uint8_t START_SEQUENCE[4] = { 0xfa, 0xce, 0xfe, 0xed }; +uint8_t STOP_SEQUENCE[4] = { 0xda, 0xbb, 0xad, 0x00 }; +FrameBuffer fb; + +/** + * Blinks the LED a specified number of times. + * @param ledPin The pin number of the LED. + * @param count The number of times to blink the LED. Default is 0xFFFFFFFF. + */ +void blinkLED(int ledPin, uint32_t count = 0xFFFFFFFF) { + while (count--) { + digitalWrite(ledPin, LOW); // turn the LED on (HIGH is the voltage level) + delay(50); // wait for a second + digitalWrite(ledPin, HIGH); // turn the LED off by making the voltage LOW + delay(50); // wait for a second + } +} + +void setup() { + pinMode(LED_BUILTIN, OUTPUT); + pinMode(LEDR, OUTPUT); + digitalWrite(LED_BUILTIN, HIGH); + digitalWrite(LEDR, HIGH); + + // Init the cam QVGA, 30FPS + if (!cam.begin(RESOLUTION, IMAGE_MODE, 30)) { + blinkLED(LEDR); + } + + blinkLED(LED_BUILTIN, 5); +} + +/** + * Sends a chunk of data over a serial connection. + * + * @param buffer The buffer containing the data to be sent. + * @param bufferSize The size of the buffer. + */ +void sendChunk(uint8_t* buffer, size_t bufferSize){ + Serial.write(buffer, bufferSize); + Serial.flush(); + delay(1); // Optional: Add a small delay to allow the receiver to process the chunk +} + +/** + * Sends a frame of camera image data over a serial connection. + */ +void sendFrame(){ + // Grab frame and write to serial + if (cam.grabFrame(fb, 3000) == 0) { + byte* buffer = fb.getBuffer(); + size_t bufferSize = cam.frameSize(); + digitalWrite(LED_BUILTIN, LOW); + + sendChunk(START_SEQUENCE, sizeof(START_SEQUENCE)); + + // Split buffer into chunks + for(size_t i = 0; i < bufferSize; i += CHUNK_SIZE) { + size_t chunkSize = min(bufferSize - i, CHUNK_SIZE); + sendChunk(buffer + i, chunkSize); + } + + sendChunk(STOP_SEQUENCE, sizeof(STOP_SEQUENCE)); + + digitalWrite(LED_BUILTIN, HIGH); + } else { + blinkLED(20); + } +} + +/** + * Sends the camera configuration over a serial connection. + * This is used to configure the web app to display the image correctly. + */ +void sendCameraConfig(){ + Serial.write(IMAGE_MODE); + Serial.write(RESOLUTION); + Serial.flush(); + delay(1); +} + +void loop() { + if(!Serial) { + Serial.begin(115200); + while(!Serial); + } + + if(!Serial.available()) return; + + byte request = Serial.read(); + + switch(request){ + case IMAGE_SEND_REQUEST: + sendFrame(); + break; + case CONFIG_SEND_REQUEST: + sendCameraConfig(); + break; + } + +} diff --git a/libraries/Camera/extras/WebSerialCamera/README.md b/libraries/Camera/extras/WebSerialCamera/README.md new file mode 100644 index 000000000..04888bbcc --- /dev/null +++ b/libraries/Camera/extras/WebSerialCamera/README.md @@ -0,0 +1,12 @@ +# 📹 WebSerial Camera Stream + +This folder contains a web application that provides a camera stream over WebSerial. +This is an experimental feature not supported in all browsers. It's recommended to use Google Chrome. +See [Browser Compatibility](https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API#browser_compatibility) + +## Instructions + +1. Upload the companion [Arduino sketch](../../examples/CameraCaptureWebSerial/CameraCaptureWebSerial.ino) to your board. +2. Open the web app either by directly opening the index.html file or serving it via a webserver and opening the URL provided by the webserver. +3. Click "Connect". Your board's serial port should show up in the popup. Select it. Click once again "Connect". The camera feed should start. If the board has been previously connected to the browser, it will connect automatically. +4. (Optional) click "Save Image" if you want to save individual camera frames to your computer. \ No newline at end of file diff --git a/libraries/Camera/extras/WebSerialCamera/app.js b/libraries/Camera/extras/WebSerialCamera/app.js new file mode 100644 index 000000000..364a7d1d5 --- /dev/null +++ b/libraries/Camera/extras/WebSerialCamera/app.js @@ -0,0 +1,166 @@ +/** + * @fileoverview This file contains the main application logic. + * + * The application uses the Web Serial API to connect to the serial port. + * Check the following links for more information on the Web Serial API: + * https://developer.chrome.com/articles/serial/ + * https://wicg.github.io/serial/ + * + * The flow of the application is as follows: + * 1. The user clicks the "Connect" button or the browser automatically connects + * to the serial port if it has been previously connected. + * 2. The application requests the camera configuration (mode and resolution) from the board. + * 3. The application starts reading the image data stream from the serial port. + * It waits until the expected amount of bytes have been read and then processes the data. + * 4. The processed image data is rendered on the canvas. + * + * @author Sebastian Romero + */ + +const connectButton = document.getElementById('connect'); +const refreshButton = document.getElementById('refresh'); +const startButton = document.getElementById('start'); +const saveImageButton = document.getElementById('save-image'); +const filterSelector = document.getElementById('filter-selector'); +const canvas = document.getElementById('bitmapCanvas'); +const ctx = canvas.getContext('2d'); + +const imageDataTransfomer = new ImageDataTransformer(ctx); +imageDataTransfomer.setStartSequence([0xfa, 0xce, 0xfe, 0xed]); +imageDataTransfomer.setStopSequence([0xda, 0xbb, 0xad, 0x00]); + +const connectionHandler = new SerialConnectionHandler(); + + +// Connection handler event listeners + +connectionHandler.onConnect = async () => { + connectButton.textContent = 'Disconnect'; + cameraConfig = await connectionHandler.getConfig(); + if(!cameraConfig){ + console.error('🚫 Could not read camera configuration. Aborting...'); + return; + } + const imageMode = CAMERA_MODES[cameraConfig[0]]; + const imageResolution = CAMERA_RESOLUTIONS[cameraConfig[1]]; + if(!imageMode || !imageResolution){ + console.error(`🚫 Invalid camera configuration: ${cameraConfig[0]}, ${cameraConfig[1]}. Aborting...`); + return; + } + imageDataTransfomer.setImageMode(imageMode); + imageDataTransfomer.setResolution(imageResolution.width, imageResolution.height); + + // Filters are only available for color images + if(imageMode !== 'GRAYSCALE'){ + filterSelector.disabled = false; + } + + renderStream(); +}; + +connectionHandler.onDisconnect = () => { + imageDataTransfomer.reset(); + connectButton.textContent = 'Connect'; + filterSelector.disabled = true; + filterSelector.value = 'none'; +}; + + +// Rendering logic + +async function renderStream(){ + while(connectionHandler.isConnected()){ + if(imageDataTransfomer.isConfigured()) await renderFrame(); + } +} + +/** + * Renders the image data for one frame from the board and renders it. + * @returns {Promise} True if a frame was rendered, false otherwise. + */ +async function renderFrame(){ + if(!connectionHandler.isConnected()) return; + const imageData = await connectionHandler.getFrame(imageDataTransfomer); + if(!imageData) return false; // Nothing to render + if(!(imageData instanceof ImageData)) throw new Error('🚫 Image data is not of type ImageData'); + renderBitmap(ctx, imageData); + return true; +} + +/** + * Renders the image data on the canvas. + * @param {CanvasRenderingContext2D} context The canvas context to render on. + * @param {ImageData} imageData The image data to render. + */ +function renderBitmap(context, imageData) { + context.canvas.width = imageData.width; + context.canvas.height = imageData.height; + context.clearRect(0, 0, canvas.width, canvas.height); + context.putImageData(imageData, 0, 0); +} + + +// UI Event listeners + +startButton.addEventListener('click', renderStream); + +connectButton.addEventListener('click', async () => { + if(connectionHandler.isConnected()){ + connectionHandler.disconnectSerial(); + } else { + await connectionHandler.requestSerialPort(); + await connectionHandler.connectSerial(); + } +}); + +refreshButton.addEventListener('click', () => { + if(imageDataTransfomer.isConfigured()) renderFrame(); +}); + +saveImageButton.addEventListener('click', () => { + const link = document.createElement('a'); + link.download = 'image.png'; + link.href = canvas.toDataURL(); + link.click(); + link.remove(); +}); + +filterSelector.addEventListener('change', () => { + const filter = filterSelector.value; + switch(filter){ + case 'none': + imageDataTransfomer.filter = null; + break; + case 'gray-scale': + imageDataTransfomer.filter = new GrayScaleFilter(); + break; + case 'black-and-white': + imageDataTransfomer.filter = new BlackAndWhiteFilter(); + break; + case 'sepia': + imageDataTransfomer.filter = new SepiaColorFilter(); + break; + case 'pixelate': + imageDataTransfomer.filter = new PixelateFilter(8); + break; + case 'blur': + imageDataTransfomer.filter = new BlurFilter(8); + break; + default: + imageDataTransfomer.filter = null; + } +}); + +// On page load event, try to connect to the serial port +window.addEventListener('load', async () => { + filterSelector.disabled = true; + console.log('🚀 Page loaded. Trying to connect to serial port...'); + + setTimeout(() => { + connectionHandler.autoConnect(); + }, 1000); +}); + +if (!("serial" in navigator)) { + alert("The Web Serial API is not supported in your browser."); +} \ No newline at end of file diff --git a/libraries/Camera/extras/WebSerialCamera/cameraConfig.js b/libraries/Camera/extras/WebSerialCamera/cameraConfig.js new file mode 100644 index 000000000..1c0474473 --- /dev/null +++ b/libraries/Camera/extras/WebSerialCamera/cameraConfig.js @@ -0,0 +1,51 @@ +/** + * @fileoverview This file contains the configuration for the camera. + * @author Sebastian Romero + */ + +/** + * The available camera (color) modes. + * The Arduino sketch uses the same values to communicate which mode should be used. + **/ +const CAMERA_MODES = { + 0: "GRAYSCALE", + 1: "BAYER", + 2: "RGB565" +}; + +/** + * The available camera resolutions. + * The Arduino sketch uses the same values to communicate which resolution should be used. + */ +const CAMERA_RESOLUTIONS = { + 0: { + "name": "QQVGA", + "width": 160, + "height": 120 + }, + 1: { + "name": "QVGA", + "width": 320, + "height": 240 + }, + 2: { + "name": "320x320", + "width": 320, + "height": 320 + }, + 3: { + "name": "VGA", + "width": 640, + "height": 480 + }, + 5: { + "name": "SVGA", + "width": 800, + "height": 600 + }, + 6: { + "name": "UXGA", + "width": 1600, + "height": 1200 + } +}; \ No newline at end of file diff --git a/libraries/Camera/extras/WebSerialCamera/filters.js b/libraries/Camera/extras/WebSerialCamera/filters.js new file mode 100644 index 000000000..0b7622898 --- /dev/null +++ b/libraries/Camera/extras/WebSerialCamera/filters.js @@ -0,0 +1,207 @@ +/** + * @fileoverview This file contains the filters that can be applied to an image. + * @author Sebastian Romero + */ + +/** + * Represents an image filter interface. This class is meant to be extended by subclasses. + */ +class ImageFilter { +/** + * Applies a filter to the given pixel data. + * @param {Uint8Array} pixelData - The pixel data to apply the filter to. The pixel data gets modified in place. + * @param {number} [width=null] - The width of the image. Defaults to null. + * @param {number} [height=null] - The height of the image. Defaults to null. + * @throws {Error} - Throws an error if the applyFilter method is not implemented. + */ + applyFilter(pixelData, width = null, height = null) { + throw new Error('applyFilter not implemented'); + } +} + +/** + * Represents a grayscale filter that converts an image to grayscale. + * @extends ImageFilter + */ +class GrayScaleFilter extends ImageFilter { + /** + * Applies the grayscale filter to the given pixel data. + * @param {Uint8ClampedArray} pixelData - The pixel data to apply the filter to. + * @param {number} [width=null] - The width of the image. + * @param {number} [height=null] - The height of the image. + */ + applyFilter(pixelData, width = null, height = null) { + for (let i = 0; i < pixelData.length; i += 4) { + const r = pixelData[i]; + const g = pixelData[i + 1]; + const b = pixelData[i + 2]; + const gray = (r + g + b) / 3; + pixelData[i] = gray; + pixelData[i + 1] = gray; + pixelData[i + 2] = gray; + } + } +} + +/** + * A class representing a black and white image filter. + * @extends ImageFilter + */ +class BlackAndWhiteFilter extends ImageFilter { + applyFilter(pixelData, width = null, height = null) { + for (let i = 0; i < pixelData.length; i += 4) { + const r = pixelData[i]; + const g = pixelData[i + 1]; + const b = pixelData[i + 2]; + const gray = (r + g + b) / 3; + const bw = gray > 127 ? 255 : 0; + pixelData[i] = bw; + pixelData[i + 1] = bw; + pixelData[i + 2] = bw; + } + } +} + +/** + * Represents a color filter that applies a sepia tone effect to an image. + * @extends ImageFilter + */ +class SepiaColorFilter extends ImageFilter { + applyFilter(pixelData, width = null, height = null) { + for (let i = 0; i < pixelData.length; i += 4) { + const r = pixelData[i]; + const g = pixelData[i + 1]; + const b = pixelData[i + 2]; + const gray = (r + g + b) / 3; + pixelData[i] = gray + 100; + pixelData[i + 1] = gray + 50; + pixelData[i + 2] = gray; + } + } +} + +/** + * Represents a filter that applies a pixelation effect to an image. + * @extends ImageFilter + */ +class PixelateFilter extends ImageFilter { + + constructor(blockSize = 8){ + super(); + this.blockSize = blockSize; + } + + applyFilter(pixelData, width, height) { + for (let y = 0; y < height; y += this.blockSize) { + for (let x = 0; x < width; x += this.blockSize) { + const blockAverage = this.getBlockAverage(x, y, width, height, pixelData, this.blockSize); + + // Set all pixels in the block to the calculated average color + for (let blockY = 0; blockY < this.blockSize && y + blockY < height; blockY++) { + for (let blockX = 0; blockX < this.blockSize && x + blockX < width; blockX++) { + const pixelIndex = ((y + blockY) * width + (x + blockX)) * 4; + pixelData[pixelIndex] = blockAverage.red; + pixelData[pixelIndex + 1] = blockAverage.green; + pixelData[pixelIndex + 2] = blockAverage.blue; + } + } + } + } + } + + /** + * Calculates the average RGB values of a block of pixels. + * + * @param {number} x - The x-coordinate of the top-left corner of the block. + * @param {number} y - The y-coordinate of the top-left corner of the block. + * @param {number} width - The width of the image. + * @param {number} height - The height of the image. + * @param {Uint8ClampedArray} pixels - The array of pixel data. + * @returns {Object} - An object containing the average red, green, and blue values. + */ + getBlockAverage(x, y, width, height, pixels) { + let totalRed = 0; + let totalGreen = 0; + let totalBlue = 0; + const blockSizeSquared = this.blockSize * this.blockSize; + + for (let blockY = 0; blockY < this.blockSize && y + blockY < height; blockY++) { + for (let blockX = 0; blockX < this.blockSize && x + blockX < width; blockX++) { + const pixelIndex = ((y + blockY) * width + (x + blockX)) * 4; + totalRed += pixels[pixelIndex]; + totalGreen += pixels[pixelIndex + 1]; + totalBlue += pixels[pixelIndex + 2]; + } + } + + return { + red: totalRed / blockSizeSquared, + green: totalGreen / blockSizeSquared, + blue: totalBlue / blockSizeSquared, + }; + } + +} + +/** + * Represents a filter that applies a blur effect to an image. + * @extends ImageFilter + */ +class BlurFilter extends ImageFilter { + constructor(radius = 8) { + super(); + this.radius = radius; + } + + applyFilter(pixelData, width, height) { + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + const pixelIndex = (y * width + x) * 4; + + const averageColor = this.getAverageColor(x, y, width, height, pixelData, this.radius); + pixelData[pixelIndex] = averageColor.red; + pixelData[pixelIndex + 1] = averageColor.green; + pixelData[pixelIndex + 2] = averageColor.blue; + } + } + } + + /** + * Calculates the average color of a rectangular region in an image. + * + * @param {number} x - The x-coordinate of the top-left corner of the region. + * @param {number} y - The y-coordinate of the top-left corner of the region. + * @param {number} width - The width of the region. + * @param {number} height - The height of the region. + * @param {Uint8ClampedArray} pixels - The pixel data of the image. + * @param {number} radius - The radius of the neighborhood to consider for each pixel. + * @returns {object} - An object representing the average color of the region, with red, green, and blue components. + */ + getAverageColor(x, y, width, height, pixels, radius) { + let totalRed = 0; + let totalGreen = 0; + let totalBlue = 0; + let pixelCount = 0; + + for (let offsetY = -radius; offsetY <= radius; offsetY++) { + for (let offsetX = -radius; offsetX <= radius; offsetX++) { + const neighborX = x + offsetX; + const neighborY = y + offsetY; + + if (neighborX >= 0 && neighborX < width && neighborY >= 0 && neighborY < height) { + const pixelIndex = (neighborY * width + neighborX) * 4; + totalRed += pixels[pixelIndex]; + totalGreen += pixels[pixelIndex + 1]; + totalBlue += pixels[pixelIndex + 2]; + pixelCount++; + } + } + } + + return { + red: totalRed / pixelCount, + green: totalGreen / pixelCount, + blue: totalBlue / pixelCount, + }; + } +} diff --git a/libraries/Camera/extras/WebSerialCamera/imageDataProcessor.js b/libraries/Camera/extras/WebSerialCamera/imageDataProcessor.js new file mode 100644 index 000000000..83ff2a650 --- /dev/null +++ b/libraries/Camera/extras/WebSerialCamera/imageDataProcessor.js @@ -0,0 +1,162 @@ +/** + * Represents an image data processor that converts raw image data to a specified pixel format. + * + * @author Sebastian Romero + */ +class ImageDataProcessor { + pixelFormatInfo = { + "RGB565": { + "convert": this.convertRGB565ToRGB888, + "bytesPerPixel": 2 + }, + "GRAYSCALE": { + "convert": this.convertGrayScaleToRGB888, + "bytesPerPixel": 1 + }, + "RGB888": { + "convert": this.convertToRGB888, + "bytesPerPixel": 3 + }, + "BAYER": { + "convert": () => {throw new Error("BAYER conversion not implemented.")}, + "bytesPerPixel": 1 + } + }; + + /** + * Creates a new instance of the imageDataProcessor class. + * @param {string|null} mode - The image mode of the image data processor. (Optional) + * Possible values: RGB565, GRAYSCALE, RGB888, BAYER + * @param {number|null} width - The width of the image data processor. (Optional) + * @param {number|null} height - The height of the image data processor. (Optional) + */ + constructor(mode = null, width = null, height = null) { + if(mode) this.setImageMode(mode); + if(width && height) this.setResolution(width, height); + } + + /** + * Sets the image mode of the image data processor. + * Possible values: RGB565, GRAYSCALE, RGB888, BAYER + * + * @param {string} mode - The image mode of the image data processor. + */ + setImageMode(mode) { + this.mode = mode; + this.bytesPerPixel = this.pixelFormatInfo[mode].bytesPerPixel; + } + + /** + * Sets the resolution of the target image. + * @param {number} width - The width of the resolution. + * @param {number} height - The height of the resolution. + */ + setResolution(width, height) { + this.width = width; + this.height = height; + } + + /** + * Calculates the total number of bytes in the image data + * based on the current image mode and resolution. + * + * @returns {number} The total number of bytes. + */ + getTotalBytes() { + return this.width * this.height * this.bytesPerPixel; + } + + /** + * Resets the state of the imageDataProcessor. + * This resets the image mode, resolution, and bytes per pixel. + */ + reset() { + this.mode = null; + this.bytesPerPixel = null; + this.width = null; + this.height = null; + } + + /** + * Converts a pixel value from RGB565 format to RGB888 format. + * @param {number} pixelValue - The pixel value in RGB565 format. + * @returns {number[]} - The RGB888 pixel value as an array of three values [R, G, B]. + */ + convertRGB565ToRGB888(pixelValue) { + // RGB565 + let r = (pixelValue >> (6 + 5)) & 0x1F; + let g = (pixelValue >> 5) & 0x3F; + let b = pixelValue & 0x1F; + // RGB888 - amplify + r <<= 3; + g <<= 2; + b <<= 3; + return [r, g, b]; + } + + /** + * Converts a grayscale pixel value to RGB888 format. + * @param {number} pixelValue - The grayscale pixel value. + * @returns {number[]} - The RGB888 pixel value as an array of three values [R, G, B]. + */ + convertGrayScaleToRGB888(pixelValue) { + return [pixelValue, pixelValue, pixelValue]; + } + + /** + * Converts a pixel value to RGB888 format. + * @param {number} pixelValue - The pixel value to convert. + * @returns {number[]} - The RGB888 pixel value as an array of three values [R, G, B]. + */ + convertToRGB888(pixelValue){ + return pixelValue; + } + + /** + * Retrieves the pixel value from the source data at the specified index + * using big endian: the most significant byte comes first. + * + * @param {Uint8Array} sourceData - The source data array. + * @param {number} index - The index of the pixel value in the source data array. + * @returns {number} The pixel value. + */ + getPixelValue(sourceData, index) { + if (this.bytesPerPixel == 1) { + return sourceData[index]; + } else if (this.bytesPerPixel == 2) { + return (sourceData[index] << 8) | sourceData[index + 1]; + } else if (this.bytesPerPixel == 3) { + return (sourceData[index] << 16) | (sourceData[index + 1] << 8) | sourceData[index + 2]; + } else if (this.bytesPerPixel == 4) { + return (sourceData[index] << 24) | (sourceData[index + 1] << 16) | (sourceData[index + 2] << 8) | sourceData[index + 3]; + } + + return 0; + } + + /** + * Retrieves the image data from the given bytes by converting each pixel value. + * + * @param {Uint8Array} bytes - The raw byte array containing the image data. + * @returns {Uint8ClampedArray} The image data as a Uint8ClampedArray containing RGBA values. + */ + convertToPixelData(bytes) { + const BYTES_PER_ROW = this.width * this.bytesPerPixel; + const dataContainer = new Uint8ClampedArray(this.width * this.height * 4); // 4 channels: R, G, B, A + + for (let row = 0; row < this.height; row++) { + for (let col = 0; col < this.width; col++) { + const sourceDataIndex = (row * BYTES_PER_ROW) + (col * this.bytesPerPixel); + const pixelValue = this.getPixelValue(bytes, sourceDataIndex, this.bytesPerPixel); + const [r, g, b] = this.pixelFormatInfo[this.mode].convert(pixelValue); + + const pixelIndex = ((row * this.width) + col) * 4; // 4 channels: R, G, B, A + dataContainer[pixelIndex] = r; // Red channel + dataContainer[pixelIndex + 1] = g; // Green channel + dataContainer[pixelIndex + 2] = b; // Blue channel + dataContainer[pixelIndex + 3] = 255; // Alpha channel (opacity) + } + } + return dataContainer; + } + } \ No newline at end of file diff --git a/libraries/Camera/extras/WebSerialCamera/index.html b/libraries/Camera/extras/WebSerialCamera/index.html new file mode 100644 index 000000000..ba70c1b43 --- /dev/null +++ b/libraries/Camera/extras/WebSerialCamera/index.html @@ -0,0 +1,37 @@ + + + + + + Web Serial Bitmap Reader + + + +
+ +
+ + + + +
+
+ + +
+
+ + + + + + + + diff --git a/libraries/Camera/extras/WebSerialCamera/serialConnectionHandler.js b/libraries/Camera/extras/WebSerialCamera/serialConnectionHandler.js new file mode 100644 index 000000000..6f23c644f --- /dev/null +++ b/libraries/Camera/extras/WebSerialCamera/serialConnectionHandler.js @@ -0,0 +1,285 @@ +/** + * @fileoverview This file contains the SerialConnectionHandler class. + * It handles the connection between the browser and the Arduino board via Web Serial. + * @author Sebastian Romero + */ + +const ArduinoUSBVendorId = 0x2341; +const UserActionAbortError = 8; + +/** + * Handles the connection between the browser and the Arduino board via Web Serial. + * Please note that for board with software serial over USB, the baud rate and other serial settings have no effect. + */ +class SerialConnectionHandler { + /** + * Represents a serial connection handler. + * @constructor + * @param {number} [baudRate=115200] - The baud rate of the serial connection. + * @param {number} [dataBits=8] - The number of data bits. + * @param {number} [stopBits=1] - The number of stop bits. + * @param {string} [parity="none"] - The parity setting. + * @param {string} [flowControl="none"] - The flow control setting. + * @param {number} [bufferSize=2097152] - The size of the buffer in bytes. The default value is 2 MB. Max buffer size is 16MB. + * @param {number} [timeout=2000] - The connection timeout value in milliseconds. The default value is 2000 ms. + */ + constructor(baudRate = 115200, dataBits = 8, stopBits = 1, parity = "none", flowControl = "none", bufferSize = 2 * 1024 * 1024, timeout = 2000) { + this.baudRate = baudRate; + this.dataBits = dataBits; + this.stopBits = stopBits; + this.flowControl = flowControl; + this.bufferSize = bufferSize; + this.parity = parity; + this.timeout = timeout; + this.currentPort = null; + this.currentReader = null; + this.currentTransformer = null; + this.readableStreamClosed = null; + this.registerEvents(); + } + + /** + * Sets the connection timeout for the serial connection. + * @param {number} timeout - The timeout value in milliseconds. + */ + setConnectionTimeout(timeout) { + this.timeout = timeout; + } + + /** + * Prompts the user to select a serial port. + * @returns {Promise} The serial port that the user has selected. + */ + async requestSerialPort() { + try { + const port = await navigator.serial.requestPort({ filters: [{ usbVendorId: ArduinoUSBVendorId }] }); + this.currentPort = port; + return port; + } catch (error) { + if (error.code != UserActionAbortError) { + console.log(error); + } + return null; + } + } + + /** + * Checks if the browser is connected to a serial port. + * @returns {boolean} True if the browser is connected, false otherwise. + */ + isConnected() { + return this.currentPort?.readable != null; + } + + /** + * Opens a connection to the given serial port by using the settings specified in the constructor. + * If the port is already open, it will be closed first. + * This method will call the `onConnect` callback before it returns. + * @returns {boolean} True if the connection was successfully opened, false otherwise. + */ + async connectSerial() { + try { + // If the port is already open, close it + if (this.isConnected()) await this.currentPort.close(); + await this.currentPort.open({ + baudRate: this.baudRate, + parity: this.parity, + dataBits: this.dataBits, + stopBits: this.stopBits, + bufferSize: this.bufferSize, + flowControl: this.flowControl + }); + console.log('✅ Connected to serial port.'); + if(this.onConnect) this.onConnect(); + return true; + } catch (error) { + return false; + } + } + + /** + * Disconnects from the current serial port. + * If a reading operation is in progress, it will be canceled. + * This function will call the `onDisconnect` callback before it returns. + * @returns {Promise} A promise that resolves when the port has been closed. + */ + async disconnectSerial() { + if (!this.currentPort) return; + try { + const port = this.currentPort; + this.currentPort = null; + await this.currentReader?.cancel(); + await this.readableStreamClosed.catch(() => { }); // Ignores the error + this.currentTransformer?.flush(); + await port.close(); + console.log('🔌 Disconnected from serial port.'); + if(this.onDisconnect) this.onDisconnect(); + } catch (error) { + console.error('💣 Error occurred while disconnecting: ' + error.message); + }; + } + + /** + * Tries to establish a connection to the first available serial port that has the Arduino USB vendor ID. + * This only works if the user has previously granted the website access to that serial port. + * @returns {Promise} True if the connection was successfully opened, false otherwise. + */ + async autoConnect() { + if (this.currentPort) { + console.log('🔌 Already connected to a serial port.'); + return false; + } + + // Get all serial ports the user has previously granted the website access to. + const ports = await navigator.serial.getPorts(); + + for (const port of ports) { + console.log('👀 Serial port found with VID: 0x' + port.getInfo().usbVendorId.toString(16)); + if (port.getInfo().usbVendorId === ArduinoUSBVendorId) { + this.currentPort = port; + return await this.connectSerial(this.currentPort); + } + } + return false; + } + + + /** + * Reads a specified number of bytes from the serial connection. + * @param {number} numBytes - The number of bytes to read. + * @returns {Promise} - A promise that resolves to a Uint8Array containing the read bytes. + */ + async readBytes(numBytes) { + return await this.readData(new BytesWaitTransformer(numBytes)); + } + + /** + * Reads the specified number of bytes from the serial port. + * @param {Transformer} transformer The transformer that is used to process the bytes. + * If the timeout is reached, the reader will be canceled and the read lock will be released. + */ + async readData(transformer) { + if(!transformer) throw new Error('Transformer is null'); + if(!this.currentPort) return null; + if(this.currentPort.readable.locked) { + console.log('🔒 Stream is already locked. Ignoring request...'); + return null; + } + + const transformStream = new TransformStream(transformer); + this.currentTransformer = transformer; + // pipeThrough() cannot be used because we need a promise that resolves when the stream is closed + // to be able to close the port. pipeTo() returns such a promise. + // SEE: https://stackoverflow.com/questions/71262432/how-can-i-close-a-web-serial-port-that-ive-piped-through-a-transformstream + this.readableStreamClosed = this.currentPort.readable.pipeTo(transformStream.writable); + const reader = transformStream.readable.getReader(); + this.currentReader = reader; + let timeoutID = null; + + try { + if (this.timeout) { + timeoutID = setTimeout(() => { + console.log('⌛️ Timeout occurred while reading.'); + if (this.currentPort?.readable) reader?.cancel(); + this.currentTransformer.flush(); + }, this.timeout); + } + const { value, done } = await reader.read(); + if (timeoutID) clearTimeout(timeoutID); + + if (done) { + console.log('🚫 Reader has been canceled'); + return null; + } + return value; + } catch (error) { + console.error('💣 Error occurred while reading: ' + error.message); + } finally { + // console.log('🔓 Releasing reader lock...'); + await reader?.cancel(); // Discards any enqueued data + await this.readableStreamClosed.catch(() => { }); // Ignores the error + reader?.releaseLock(); + this.currentReader = null; + this.currentTransformer = null; + } + } + + /** + * Sends the provided byte array data through the current serial port. + * + * @param {ArrayBuffer} byteArray - The byte array data to send. + * @returns {Promise} - A promise that resolves when the data has been sent. + */ + async sendData(byteArray) { + if (!this.currentPort?.writable) { + console.log('🚫 Port is not writable. Ignoring request...'); + return; + } + const writer = this.currentPort.writable.getWriter(); + await writer.write(new Uint8Array(byteArray)); + await writer.close(); + } + + /** + * Reqests an image frame from the Arduino board by writing a 1 to the serial port. + * @returns {Promise} A promise that resolves when the frame has been requested and the write stream has been closed. + */ + async requestFrame() { + // console.log('Writing 1 to the serial port...'); + // Write a 1 to the serial port + return this.sendData([1]); + } + + /** + * Requests the camera configuration from the board by writing a 2 to the serial port. + * @returns {Promise} A promise that resolves with the configuration data. + */ + async requestConfig() { + return this.sendData([2]); + } + + /** + * Requests the camera resolution from the board and reads it back from the serial port. + * The configuration simply consists of two bytes: the mode and the resolution. + * @returns {Promise} The raw configuration data as an ArrayBuffer. + */ + async getConfig() { + if (!this.currentPort) return; + + await this.requestConfig(); + // console.log(`Trying to read 2 bytes...`); + return await this.readBytes(2, this.timeout); + } + + /** + * Requests a frame from the Arduino board and reads the specified number of bytes from the serial port afterwards. + * Times out after the timeout in milliseconds specified in the constructor. + * @param {Transformer} transformer The transformer that is used to process the bytes. + */ + async getFrame(transformer) { + if (!this.currentPort) return; + await this.requestFrame(); + return await this.readData(transformer, this.timeout); + } + + /** + * Registers event listeners for the `connect` and `disconnect` events of the serial port. + * The `connect` event is fired when a serial port becomes available not when it is opened. + * When the `connect` event is fired, `autoConnect()` is called. + * The `disconnect` event is fired when a serial port is lost. + * When the `disconnect` event is fired, the `onDisconnect` callback is called. + **/ + registerEvents() { + navigator.serial.addEventListener("connect", (e) => { + // Connect to `e.target` or add it to a list of available ports. + console.log('🔌 Serial port became available. VID: 0x' + e.target.getInfo().usbVendorId.toString(16)); + this.autoConnect(); + }); + + navigator.serial.addEventListener("disconnect", (e) => { + console.log('❌ Serial port lost. VID: 0x' + e.target.getInfo().usbVendorId.toString(16)); + this.currentPort = null; + if(this.onDisconnect) this.onDisconnect(); + }); + } +} \ No newline at end of file diff --git a/libraries/Camera/extras/WebSerialCamera/style.css b/libraries/Camera/extras/WebSerialCamera/style.css new file mode 100644 index 000000000..71fe2c19c --- /dev/null +++ b/libraries/Camera/extras/WebSerialCamera/style.css @@ -0,0 +1,82 @@ +:root { + --main-control-color: #008184; + --main-control-color-hover: #005c5f; + --main-flexbox-gap: 16px; + --secondary-text-color: #87898b; +} + +html { + font-size: 14px; +} + +body { + font-family: 'Open Sans', sans-serif; + text-align: center; +} + +#main-container { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + margin-top: 20px; +} + +.controls { + display: flex; + flex-direction: row; + align-items: center; + gap: 1rem; + margin-top: 20px; +} + +canvas { + border-radius: 5px; +} + +button { + font-family: 'Open Sans', sans-serif; + font-weight: 700; + font-size: 1rem; + justify-content: center; + background-color: var(--main-control-color); + color: #fff; + cursor: pointer; + letter-spacing: 1.28px; + line-height: normal; + outline: none; + padding: 8px 18px; + text-align: center; + text-decoration: none; + border: 2px solid transparent; + border-radius: 32px; + text-transform: uppercase; + box-sizing: border-box; +} + +button:hover { + background-color: var(--main-control-color-hover); +} + +label { + font-family: 'Open Sans', sans-serif; + font-size: 1rem; + font-weight: bold; + color: var(--secondary-text-color); +} + +select { + font-family: 'Open Sans', sans-serif; + font-size: 1rem; + border: 1px solid #ccc; + padding: 5px 10px; + border-radius: 5px; +} + +#refresh { + display: none; +} + +#start { + display: none; +} \ No newline at end of file diff --git a/libraries/Camera/extras/WebSerialCamera/transformers.js b/libraries/Camera/extras/WebSerialCamera/transformers.js new file mode 100644 index 000000000..ac32c43c4 --- /dev/null +++ b/libraries/Camera/extras/WebSerialCamera/transformers.js @@ -0,0 +1,330 @@ +/** + * @fileoverview This file contains classes that transform incoming data into higher-level data types. + * @author Sebastian Romero + */ + + +/** + * Represents a transformer that processes incoming data between start and stop sequences. + */ +class StartStopSequenceTransformer { + constructor(startSequence = null, stopSequence = null, expectedBytes = null) { + this.startSequence = new Uint8Array(startSequence); + this.stopSequence = new Uint8Array(stopSequence); + this.expectedBytes = expectedBytes; + this.buffer = new Uint8Array(0); + this.controller = undefined; + this.waitingForStart = true; + } + + /** + * Sets the start sequence for the received data. + * This is used to disregard any data before the start sequence. + * @param {Array} startSequence - The start sequence as an array of numbers. + */ + setStartSequence(startSequence) { + this.startSequence = new Uint8Array(startSequence); + } + + /** + * Sets the stop sequence for the received data. + * This is used to know when the data has finished being sent and should be processed. + * @param {Array} stopSequence - The stop sequence as an array of numbers. + */ + setStopSequence(stopSequence) { + this.stopSequence = new Uint8Array(stopSequence); + } + + /** + * Sets the expected number of bytes for the received data. + * This is used to check if the number of bytes matches the expected amount + * and discard the data if it doesn't. + * + * @param {number} expectedBytes - The expected number of bytes. + */ + setExpectedBytes(expectedBytes) { + this.expectedBytes = expectedBytes; + } + + /** + * Transforms the incoming chunk of data and enqueues the processed bytes to the controller + * between start and stop sequences. + * + * @param {Uint8Array} chunk - The incoming chunk of data. + * @param {TransformStreamDefaultController} controller - The controller for enqueuing processed bytes. + * @returns {Promise} - A promise that resolves when the transformation is complete. + */ + async transform(chunk, controller) { + this.controller = controller; + + // Concatenate incoming chunk with existing buffer + this.buffer = new Uint8Array([...this.buffer, ...chunk]); + let startIndex = 0; + + // Only process data if at least one start and stop sequence is present in the buffer + const minimumRequiredBytes = Math.min(this.startSequence.length, this.stopSequence.length); + + while (this.buffer.length >= minimumRequiredBytes) { + if (this.waitingForStart) { + // Look for the start sequence + startIndex = this.indexOfSequence(this.buffer, this.startSequence, startIndex); + + if (startIndex === -1) { + // No start sequence found, discard the buffer + this.buffer = new Uint8Array(0); + return; + } + + // Remove bytes before the start sequence including the start sequence + this.buffer = this.buffer.slice(startIndex + this.startSequence.length); + startIndex = 0; // Reset startIndex after removing bytes + this.waitingForStart = false; + } + + // Look for the stop sequence + const stopIndex = this.indexOfSequence(this.buffer, this.stopSequence, startIndex); + + if (stopIndex === -1) { + // No stop sequence found, wait for more data + return; + } + + // Extract bytes between start and stop sequences + const bytesToProcess = this.buffer.slice(startIndex, stopIndex); + // Remove processed bytes from the buffer including the stop sequence. + this.buffer = this.buffer.slice(stopIndex + this.stopSequence.length); + + // Check if the number of bytes matches the expected amount + if (this.expectedBytes !== null && bytesToProcess.length !== this.expectedBytes) { + // Skip processing the bytes, but keep the remaining data in the buffer + console.error(`🚫 Expected ${this.expectedBytes} bytes, but got ${bytesToProcess.length} bytes instead. Dropping data.`); + this.waitingForStart = true; + return; + } + + // Notify the controller that bytes have been processed + controller.enqueue(this.convertBytes(bytesToProcess)); + this.waitingForStart = true; + } + } + + /** + * Flushes the buffer and discards any remaining bytes when the stream is closed. + * + * @param {WritableStreamDefaultController} controller - The controller for the writable stream. + */ + flush(controller) { + // Discard the remaining data in the buffer + this.buffer = new Uint8Array(0); + } + + + /** + * Finds the index of the given sequence in the buffer. + * + * @param {Uint8Array} buffer - The buffer to search. + * @param {Uint8Array} sequence - The sequence to find. + * @param {number} startIndex - The index to start searching from. + * @returns {number} - The index of the sequence in the buffer, or -1 if not found. + */ + indexOfSequence(buffer, sequence, startIndex) { + for (let i = startIndex; i <= buffer.length - sequence.length; i++) { + if (this.isSubarray(buffer, sequence, i)) { + return i; + } + } + return -1; + } + + /** + * Checks if a subarray is present at a given index in the buffer. + * + * @param {Uint8Array} buffer - The buffer to check. + * @param {Uint8Array} subarray - The subarray to check. + * @param {number} index - The index to start checking from. + * @returns {boolean} - True if the subarray is present at the given index, false otherwise. + */ + isSubarray(buffer, subarray, index) { + for (let i = 0; i < subarray.length; i++) { + if (buffer[index + i] !== subarray[i]) { + return false; + } + } + return true; + } + + /** + * Converts bytes into higher-level data types. + * This method is meant to be overridden by subclasses. + * @param {Uint8Array} bytes + * @returns + */ + convertBytes(bytes) { + return bytes; + } + +} + + +/** + * A transformer class that waits for a specific number of bytes before processing them. + */ +class BytesWaitTransformer { + constructor(waitBytes = 1) { + this.waitBytes = waitBytes; + this.buffer = new Uint8Array(0); + this.controller = undefined; + } + + /** + * Sets the number of bytes to wait before processing the data. + * @param {number} waitBytes - The number of bytes to wait. + */ + setBytesToWait(waitBytes) { + this.waitBytes = waitBytes; + } + + /** + * Converts bytes into higher-level data types. + * This method is meant to be overridden by subclasses. + * @param {Uint8Array} bytes + * @returns + */ + convertBytes(bytes) { + return bytes; + } + + /** + * Transforms the incoming chunk of data and enqueues the processed bytes to the controller. + * It does so when the buffer contains at least the specified number of bytes. + * @param {Uint8Array} chunk - The incoming chunk of data. + * @param {TransformStreamDefaultController} controller - The controller for enqueuing processed bytes. + * @returns {Promise} - A promise that resolves when the transformation is complete. + */ + async transform(chunk, controller) { + this.controller = controller; + + // Concatenate incoming chunk with existing buffer + this.buffer = new Uint8Array([...this.buffer, ...chunk]); + + while (this.buffer.length >= this.waitBytes) { + // Extract the required number of bytes + const bytesToProcess = this.buffer.slice(0, this.waitBytes); + + // Remove processed bytes from the buffer + this.buffer = this.buffer.slice(this.waitBytes); + + // Notify the controller that bytes have been processed + controller.enqueue(this.convertBytes(bytesToProcess)); + } + } + + /** + * Flushes the buffer and processes any remaining bytes when the stream is closed. + * + * @param {WritableStreamDefaultController} controller - The controller for the writable stream. + */ + flush(controller) { + if (this.buffer.length > 0) { + // Handle remaining bytes (if any) when the stream is closed + const remainingBytes = this.buffer.slice(); + console.log("Remaining bytes:", remainingBytes); + + // Notify the controller that remaining bytes have been processed + controller?.enqueue(remainingBytes); + } + } +} + +/** + * Represents an Image Data Transformer that converts bytes into image data. + * See other example for PNGs here: https://github.com/mdn/dom-examples/blob/main/streams/png-transform-stream/png-transform-stream.js + * @extends StartStopSequenceTransformer + */ +class ImageDataTransformer extends StartStopSequenceTransformer { + /** + * Creates a new instance of the Transformer class. + * @param {CanvasRenderingContext2D} context - The canvas rendering context. + * @param {number} [width=null] - The width of the image. + * @param {number} [height=null] - The height of the image. + * @param {string} [imageMode=null] - The image mode. + */ + constructor(context, width = null, height = null, imageMode = null) { + super(); + this.context = context; + this.imageDataProcessor = new ImageDataProcessor(); + if (width && height){ + this.setResolution(width, height); + } + if (imageMode){ + this.setImageMode(imageMode); + } + } + + /** + * Sets the resolution of the camera image that is being processed. + * + * @param {number} width - The width of the resolution. + * @param {number} height - The height of the resolution. + */ + setResolution(width, height) { + this.width = width; + this.height = height; + this.imageDataProcessor.setResolution(width, height); + if(this.isConfigured()){ + this.setExpectedBytes(this.imageDataProcessor.getTotalBytes()); + } + } + + /** + * Sets the image mode of the camera image that is being processed. + * Possible values: RGB565, GRAYSCALE, RGB888, BAYER + * + * @param {string} imageMode - The image mode to set. + */ + setImageMode(imageMode) { + this.imageMode = imageMode; + this.imageDataProcessor.setImageMode(imageMode); + if(this.isConfigured()){ + this.setBytesToWait(this.imageDataProcessor.getTotalBytes()); + } + } + + /** + * Checks if the image data processor is configured. + * This is true if the image mode and resolution are set. + * @returns {boolean} True if the image data processor is configured, false otherwise. + */ + isConfigured() { + return this.imageMode && this.width && this.height; + } + + /** + * Resets the state of the transformer. + */ + reset() { + this.imageMode = null; + this.width = null; + this.height = null; + this.filter = null; + this.imageDataProcessor.reset(); + } + + /** + * Converts the given raw bytes into an ImageData object by using the ImageDataProcessor. + * + * @param {Uint8Array} bytes - The bytes to convert. + * @returns {ImageData} The converted ImageData object. + */ + convertBytes(bytes) { + let pixelData = this.imageDataProcessor.convertToPixelData(bytes); + + if(this.filter){ + this.filter.applyFilter(pixelData, imageDataTransfomer.width, imageDataTransfomer.height); + } + + const imageData = this.context.createImageData(imageDataTransfomer.width, imageDataTransfomer.height); + imageData.data.set(pixelData); + return imageData; + } +} \ No newline at end of file diff --git a/libraries/Camera/src/camera.cpp b/libraries/Camera/src/camera.cpp index 2cc3da2ef..050ea3772 100644 --- a/libraries/Camera/src/camera.cpp +++ b/libraries/Camera/src/camera.cpp @@ -27,6 +27,12 @@ #define ALIGN_PTR(p,a) ((p & (a-1)) ?(((uintptr_t)p + a) & ~(uintptr_t)(a-1)) : p) +#ifdef __SCB_DCACHE_LINE_SIZE +#define FB_ALIGNMENT __SCB_DCACHE_LINE_SIZE +#else +#define FB_ALIGNMENT 32 +#endif + // Include all image sensor drivers here. #if defined (ARDUINO_PORTENTA_H7_M7) @@ -337,15 +343,16 @@ FrameBuffer::FrameBuffer(int32_t x, int32_t y, int32_t bpp) : _fb_size(x*y*bpp), _isAllocated(true) { - uint8_t *buffer = (uint8_t *)malloc(x*y*bpp); - _fb = (uint8_t *)ALIGN_PTR((uintptr_t)buffer, 32); + uint8_t *buffer = (uint8_t *) malloc(x * y * bpp + FB_ALIGNMENT); + _fb = (uint8_t *) ALIGN_PTR((uintptr_t) buffer, FB_ALIGNMENT); } FrameBuffer::FrameBuffer(int32_t address) : _fb_size(0), - _isAllocated(true) + _isAllocated(true), + _fb((uint8_t *) address) { - _fb = (uint8_t *)ALIGN_PTR((uintptr_t)address, 32); + // Assume that `address` is aligned, this will be verified later in grabFrame. } FrameBuffer::FrameBuffer() : @@ -688,17 +695,17 @@ int Camera::grabFrame(FrameBuffer &fb, uint32_t timeout) } } } else { - uint8_t *buffer = (uint8_t *)malloc(framesize+32); - uint8_t *alignedBuff = (uint8_t *)ALIGN_PTR((uintptr_t)buffer, 32); - fb.setBuffer(alignedBuff); + uint8_t *buffer = (uint8_t *) malloc(framesize + FB_ALIGNMENT); + uint8_t *aligned_buffer = (uint8_t *) ALIGN_PTR((uintptr_t) buffer, FB_ALIGNMENT); + fb.setBuffer(aligned_buffer); } uint8_t *framebuffer = fb.getBuffer(); - // Ensure FB is aligned to 32 bytes cache lines. - if ((uint32_t) framebuffer & 0x1F) { + // Ensure that the framebuffer is aligned. + if ((uint32_t) framebuffer & (FB_ALIGNMENT - 1)) { if (_debug) { - _debug->println("Framebuffer not aligned to 32 bytes cache lines"); + _debug->println("The framebuffer memory is not aligned!"); } return -1; } diff --git a/libraries/Ethernet/examples/AdvancedChatServer/AdvancedChatServer.ino b/libraries/Ethernet/examples/AdvancedChatServer/AdvancedChatServer.ino index 630f27240..890787130 100644 --- a/libraries/Ethernet/examples/AdvancedChatServer/AdvancedChatServer.ino +++ b/libraries/Ethernet/examples/AdvancedChatServer/AdvancedChatServer.ino @@ -4,11 +4,6 @@ A more advanced server that distributes any incoming messages to all connected clients but the client the message comes from. To use, telnet to your device's IP address and type. - You can see the client's input in the serial monitor as well. - Using an Arduino Wiznet Ethernet shield. - - Circuit: - * Ethernet shield attached to pins 10, 11, 12, 13 created 18 Dec 2009 by David A. Mellis @@ -67,7 +62,7 @@ void setup() { void loop() { // check for any new client connecting, and say hello (before any incoming data) - EthernetClient newClient = server.available(); + EthernetClient newClient = server.accept(); if (newClient) { for (byte i=0; i < 8; i++) { if (!clients[i]) { diff --git a/libraries/Ethernet/examples/BarometricPressureWebServer/BarometricPressureWebServer.ino b/libraries/Ethernet/examples/BarometricPressureWebServer/BarometricPressureWebServer.ino index 6f26ef888..37ba334c4 100644 --- a/libraries/Ethernet/examples/BarometricPressureWebServer/BarometricPressureWebServer.ino +++ b/libraries/Ethernet/examples/BarometricPressureWebServer/BarometricPressureWebServer.ino @@ -141,7 +141,7 @@ void getData() { void listenForEthernetClients() { // listen for incoming clients - EthernetClient client = server.available(); + EthernetClient client = server.accept(); if (client) { Serial.println("Got a client"); // an http request ends with a blank line diff --git a/libraries/Ethernet/examples/ChatServer/ChatServer.ino b/libraries/Ethernet/examples/ChatServer/ChatServer.ino deleted file mode 100644 index bfc310b9c..000000000 --- a/libraries/Ethernet/examples/ChatServer/ChatServer.ino +++ /dev/null @@ -1,97 +0,0 @@ -/* - Chat Server - - A simple server that distributes any incoming messages to all - connected clients. To use, telnet to your device's IP address and type. - You can see the client's input in the serial monitor as well. - Using an Arduino Wiznet Ethernet shield. - - Circuit: - * Ethernet shield attached to pins 10, 11, 12, 13 - - created 18 Dec 2009 - by David A. Mellis - modified 9 Apr 2012 - by Tom Igoe - - */ - -#include -#include -#include - -// The IP address will be dependent on your local network. -// gateway and subnet are optional: -IPAddress ip(192, 168, 1, 177); -IPAddress myDns(192, 168, 1, 1); -IPAddress gateway(192, 168, 1, 1); -IPAddress subnet(255, 255, 0, 0); - - -// telnet defaults to port 23 -EthernetServer server(23); -boolean alreadyConnected = false; // whether or not the client was connected previously - -void setup() { - // You can use Ethernet.init(pin) to configure the CS pin - //Ethernet.init(10); // Most Arduino shields - //Ethernet.init(5); // MKR ETH shield - //Ethernet.init(0); // Teensy 2.0 - //Ethernet.init(20); // Teensy++ 2.0 - //Ethernet.init(15); // ESP8266 with Adafruit Featherwing Ethernet - //Ethernet.init(33); // ESP32 with Adafruit Featherwing Ethernet - - // initialize the ethernet device - Ethernet.begin(ip, myDns, gateway, subnet); - - // Open serial communications and wait for port to open: - Serial.begin(9600); - while (!Serial) { - ; // wait for serial port to connect. Needed for native USB port only - } - - // Check for Ethernet hardware present - if (Ethernet.hardwareStatus() == EthernetNoHardware) { - Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :("); - while (true) { - delay(1); // do nothing, no point running without Ethernet hardware - } - } - if (Ethernet.linkStatus() == LinkOFF) { - Serial.println("Ethernet cable is not connected."); - } - - // start listening for clients - server.begin(); - - Serial.print("Chat server address:"); - Serial.println(Ethernet.localIP()); -} - -void loop() { - // wait for a new client: - EthernetClient client = server.available(); - - // when the client sends the first byte, say hello: - if (client) { - if (!alreadyConnected) { - // clear out the input buffer: - client.flush(); - Serial.println("We have a new client"); - client.println("Hello, client!"); - alreadyConnected = true; - } - - if (client.available() > 0) { - // read the bytes incoming from the client: - char thisChar = client.read(); - // echo the bytes back to the client: - server.write(thisChar); - // echo the bytes to the server as well: - Serial.write(thisChar); - } - } -} - - - diff --git a/libraries/Ethernet/examples/DhcpChatServer/DhcpChatServer.ino b/libraries/Ethernet/examples/DhcpChatServer/DhcpChatServer.ino deleted file mode 100644 index cbf2deadd..000000000 --- a/libraries/Ethernet/examples/DhcpChatServer/DhcpChatServer.ino +++ /dev/null @@ -1,91 +0,0 @@ -/* - DHCP Chat Server - - A simple server that distributes any incoming messages to all - connected clients. To use, telnet to your device's IP address and type. - You can see the client's input in the serial monitor as well. - Using an Arduino Wiznet Ethernet shield. - - THis version attempts to get an IP address using DHCP - - Circuit: - * Ethernet shield attached to pins 10, 11, 12, 13 - - created 21 May 2011 - modified 9 Apr 2012 - by Tom Igoe - modified 02 Sept 2015 - by Arturo Guadalupi - Based on ChatServer example by David A. Mellis - - */ - -#include -#include -#include - -// The IP address will be dependent on your local network. -// gateway and subnet are optional: -IPAddress ip(192, 168, 1, 177); -IPAddress myDns(192, 168, 1, 1); -IPAddress gateway(192, 168, 1, 1); -IPAddress subnet(255, 255, 0, 0); - -// telnet defaults to port 23 -EthernetServer server(23); -boolean gotAMessage = false; // whether or not you got a message from the client yet - -void setup() { - - // Open serial communications and wait for port to open: - Serial.begin(9600); - while (!Serial) { - ; // wait for serial port to connect. Needed for native USB port only - } - - // start the Ethernet connection: - Serial.println("Trying to get an IP address using DHCP"); - if (Ethernet.begin() == 0) { - Serial.println("Failed to configure Ethernet using DHCP"); - // Check for Ethernet hardware present - if (Ethernet.hardwareStatus() == EthernetNoHardware) { - Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :("); - while (true) { - delay(1); // do nothing, no point running without Ethernet hardware - } - } - if (Ethernet.linkStatus() == LinkOFF) { - Serial.println("Ethernet cable is not connected."); - } - // initialize the Ethernet device not using DHCP: - Ethernet.begin(ip, myDns, gateway, subnet); - } - // print your local IP address: - Serial.print("My IP address: "); - Serial.println(Ethernet.localIP()); - - // start listening for clients - server.begin(); -} - -void loop() { - // wait for a new client: - EthernetClient client = server.available(); - - // when the client sends the first byte, say hello: - if (client) { - if (!gotAMessage) { - Serial.println("We have a new client"); - client.println("Hello, client!"); - gotAMessage = true; - } - - // read the bytes incoming from the client: - char thisChar = client.read(); - // echo the bytes back to the client: - server.write(thisChar); - // echo the bytes to the server as well: - Serial.print(thisChar); - } -} - diff --git a/libraries/Ethernet/examples/WebServer/WebServer.ino b/libraries/Ethernet/examples/WebServer/WebServer.ino index 6201495f7..8c712fd02 100644 --- a/libraries/Ethernet/examples/WebServer/WebServer.ino +++ b/libraries/Ethernet/examples/WebServer/WebServer.ino @@ -61,7 +61,7 @@ void setup() { void loop() { // listen for incoming clients - EthernetClient client = server.available(); + EthernetClient client = server.accept(); if (client) { Serial.println("new client"); // an http request ends with a blank line diff --git a/libraries/Ethernet/src/Ethernet.cpp b/libraries/Ethernet/src/Ethernet.cpp index 8d9c51a88..ab720fcaf 100644 --- a/libraries/Ethernet/src/Ethernet.cpp +++ b/libraries/Ethernet/src/Ethernet.cpp @@ -1,14 +1,14 @@ #include "Ethernet.h" -#define SSID_MAX_LENGTH 32 - int arduino::EthernetClass::begin(uint8_t *mac, unsigned long timeout, unsigned long responseTimeout) { if (eth_if == nullptr) { - //Q: What is the callback for? - _initializerCallback(); - if (eth_if == nullptr) return 0; + return 0; } + eth_if->set_dhcp(true); + return _begin(mac, timeout, responseTimeout); +} +int arduino::EthernetClass::_begin(uint8_t *mac, unsigned long timeout, unsigned long responseTimeout) { if (mac != nullptr) { eth_if->get_emac().set_hwaddr(mac); } @@ -47,13 +47,21 @@ int arduino::EthernetClass::begin(uint8_t *mac, IPAddress ip, IPAddress dns, IPA } int arduino::EthernetClass::begin(uint8_t *mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet, unsigned long timeout, unsigned long responseTimeout) { + if(eth_if == nullptr) { + return 0; + } + config(ip, dns, gateway, subnet); eth_if->set_dhcp(false); eth_if->set_network(_ip, _netmask, _gateway); - eth_if->add_dns_server(_dnsServer1, nullptr); - auto ret = begin(mac, timeout, responseTimeout); + auto ret = _begin(mac, timeout, responseTimeout); + + char if_name[5]; + eth_if->get_interface_name(if_name); + eth_if->add_dns_server(_dnsServer1, if_name); + return ret; } @@ -62,6 +70,9 @@ void arduino::EthernetClass::end() { } EthernetLinkStatus arduino::EthernetClass::linkStatus() { + if(eth_if == nullptr) { + return LinkOFF; + } return (eth_if->get_connection_status() == NSAPI_STATUS_GLOBAL_UP ? LinkON : LinkOFF); } @@ -71,7 +82,9 @@ EthernetHardwareStatus arduino::EthernetClass::hardwareStatus() { int arduino::EthernetClass::disconnect() { - eth_if->disconnect(); + if(eth_if != nullptr) { + eth_if->disconnect(); + } return 1; } @@ -93,4 +106,4 @@ void arduino::EthernetClass::MACAddress(uint8_t *mac_address) macAddress(mac_address); } -arduino::EthernetClass Ethernet; +arduino::EthernetClass Ethernet(static_cast(EthInterface::get_default_instance())); diff --git a/libraries/Ethernet/src/Ethernet.h b/libraries/Ethernet/src/Ethernet.h index 336621cbf..8783d651c 100644 --- a/libraries/Ethernet/src/Ethernet.h +++ b/libraries/Ethernet/src/Ethernet.h @@ -50,21 +50,15 @@ enum { // compatibility with Arduino ::maintain() DHCP_CHECK_REBIND_OK = 4 }; -typedef void *(*voidPrtFuncPtr)(void); - class EthernetClass : public MbedSocketClass { public: - // Initialise the Ethernet shield to use the provided MAC address and - // gain the rest of the configuration through DHCP. - // Returns 0 if the DHCP configuration failed, and 1 if it succeeded EthernetClass(EthernetInterface *_if) : eth_if(_if){}; - EthernetClass(){}; - - EthernetClass(voidPrtFuncPtr _cb) - : _initializerCallback(_cb){}; + // Initialise the Ethernet shield to use the provided MAC address and + // gain the rest of the configuration through DHCP. + // Returns 0 if the DHCP configuration failed, and 1 if it succeeded int begin(uint8_t *mac = nullptr, unsigned long timeout = 60000, unsigned long responseTimeout = 4000); EthernetLinkStatus linkStatus(); EthernetHardwareStatus hardwareStatus(); @@ -91,8 +85,6 @@ class EthernetClass : public MbedSocketClass { void MACAddress(uint8_t *mac_address); - void setHostname(const char *name); - int disconnect(void); void end(void); @@ -118,12 +110,11 @@ class EthernetClass : public MbedSocketClass { constexpr static int maintain () { return DHCP_CHECK_NONE; } private: + int _begin(uint8_t *mac, unsigned long timeout, unsigned long responseTimeout); + volatile EthernetLinkStatus _currentNetworkStatus = Unknown; - EthernetInterface net; - EthernetInterface *eth_if = &net; - voidPrtFuncPtr _initializerCallback; + EthernetInterface *eth_if = nullptr; arduino::IPAddress ipAddressFromSocketAddress(SocketAddress socketAddress); - SocketAddress socketAddressFromIpAddress(arduino::IPAddress ip, uint16_t port); }; } diff --git a/libraries/Ethernet/src/EthernetClient.h b/libraries/Ethernet/src/EthernetClient.h index 9d9f9b77a..4eae838a8 100644 --- a/libraries/Ethernet/src/EthernetClient.h +++ b/libraries/Ethernet/src/EthernetClient.h @@ -21,11 +21,11 @@ #define ethernetclient_h #include "Ethernet.h" -#include "MbedClient.h" +#include "AClient.h" namespace arduino { -class EthernetClient : public MbedClient { +class EthernetClient : public AClient { NetworkInterface *getNetwork() { return Ethernet.getNetwork(); } diff --git a/libraries/Ethernet/src/EthernetSSLClient.h b/libraries/Ethernet/src/EthernetSSLClient.h index aa6fbfebc..79f26d3ed 100644 --- a/libraries/Ethernet/src/EthernetSSLClient.h +++ b/libraries/Ethernet/src/EthernetSSLClient.h @@ -21,13 +21,13 @@ #define ETHERNETSSLCLIENT_H #include "EthernetClient.h" -#include "MbedSSLClient.h" +#include "AClient.h" extern const char CA_CERTIFICATES[]; namespace arduino { -class EthernetSSLClient : public arduino::MbedSSLClient { +class EthernetSSLClient : public arduino::ASslClient { NetworkInterface *getNetwork() { return Ethernet.getNetwork(); } diff --git a/libraries/Ethernet/src/EthernetServer.cpp b/libraries/Ethernet/src/EthernetServer.cpp index 94f5854b6..7a383198a 100644 --- a/libraries/Ethernet/src/EthernetServer.cpp +++ b/libraries/Ethernet/src/EthernetServer.cpp @@ -1,6 +1,10 @@ #include "EthernetServer.h" arduino::EthernetClient arduino::EthernetServer::available(uint8_t* status) { + return accept(status); +} + +arduino::EthernetClient arduino::EthernetServer::accept(uint8_t* status) { EthernetClient client; nsapi_error_t error; diff --git a/libraries/Ethernet/src/EthernetServer.h b/libraries/Ethernet/src/EthernetServer.h index 3ddec326f..9374c3023 100644 --- a/libraries/Ethernet/src/EthernetServer.h +++ b/libraries/Ethernet/src/EthernetServer.h @@ -31,9 +31,11 @@ class EthernetServer : public MbedServer { } public: + EthernetServer() {} EthernetServer(uint16_t port) : MbedServer(port) {} - EthernetClient available(uint8_t* status = nullptr); + EthernetClient accept(uint8_t* status = nullptr); + EthernetClient available(uint8_t* status = nullptr) __attribute__((deprecated("Use accept()."))); }; } diff --git a/libraries/GPS/src/GPS.h b/libraries/GPS/src/GPS.h index 998430ecc..e02d5e9db 100644 --- a/libraries/GPS/src/GPS.h +++ b/libraries/GPS/src/GPS.h @@ -25,8 +25,6 @@ namespace arduino { -typedef void* (*voidPrtFuncPtr)(void); - class GPSClass : public HardwareSerial { public: diff --git a/libraries/GSM/examples/GSMClient/GSMClient.ino b/libraries/GSM/examples/GSMClient/GSMClient.ino index 14b031b0b..287cac24c 100644 --- a/libraries/GSM/examples/GSMClient/GSMClient.ino +++ b/libraries/GSM/examples/GSMClient/GSMClient.ino @@ -1,6 +1,16 @@ +/* + GSMClient + + This sketch connects to a website (https://example.com) + using the Portenta CAT.M1/NB IoT GNSS Shield. + + */ + #include +#include +#include +#include "arduino_secrets.h" -#include "arduino_secrets.h" char pin[] = SECRET_PIN; char apn[] = SECRET_APN; char username[] = SECRET_USERNAME; @@ -13,19 +23,22 @@ GSMClient client; void setup() { + Serial.begin(9600); + while(!Serial) {} + #if defined(ARDUINO_EDGE_CONTROL) // Power ON MKR2 pinMode(ON_MKR2, OUTPUT); digitalWrite(ON_MKR2, HIGH); #endif - Serial.begin(115200); - while(!Serial) {} - // To enable AT Trace debug uncomment the following lines //GSM.trace(Serial); //GSM.setTraceLevel(4); + Debug.setDebugOutputStream(&Serial); + Debug.setDebugLevel(4); + Serial.println("Starting Carrier Network registration"); if(!GSM.begin(pin, apn, username, pass, CATNB, BAND_20 | BAND_19)){ Serial.println("The board was not able to register to the network..."); diff --git a/libraries/GSM/examples/GSMSSLClient/GSMSSLClient.ino b/libraries/GSM/examples/GSMSSLClient/GSMSSLClient.ino index 0aa85f669..721b8ea12 100644 --- a/libraries/GSM/examples/GSMSSLClient/GSMSSLClient.ino +++ b/libraries/GSM/examples/GSMSSLClient/GSMSSLClient.ino @@ -1,5 +1,5 @@ /* - GSMSSLlient + GSMSSLClient This sketch connects to a website (https://example.com) using the Portenta CAT.M1/NB IoT GNSS Shield and TLS. @@ -7,6 +7,8 @@ */ #include +#include +#include #include "arduino_secrets.h" #if defined(ARDUINO_EDGE_CONTROL) @@ -25,6 +27,9 @@ GSMSSLClient client; void setup() { + Serial.begin(9600); + while(!Serial) {} + #if defined(ARDUINO_EDGE_CONTROL) // Power ON MKR2 pinMode(ON_MKR2, OUTPUT); @@ -34,13 +39,14 @@ void setup() { client.appendCustomCACert(root_ca); #endif - Serial.begin(115200); - while(!Serial) {} - // To enable AT Trace debug uncomment the following lines //GSM.trace(Serial); //GSM.setTraceLevel(4); + // Enable GSM library debug + Debug.setDebugOutputStream(&Serial); + Debug.setDebugLevel(4); + Serial.println("Starting Carrier Network registration"); if(!GSM.begin(pin, apn, username, pass, CATM1, BAND_3 | BAND_20 | BAND_19)){ Serial.println("The board was not able to register to the network..."); diff --git a/libraries/GSM/examples/GSMSSLClient/root_ca.h b/libraries/GSM/examples/GSMSSLClient/root_ca.h index c314f4cc2..581338be2 100644 --- a/libraries/GSM/examples/GSMSSLClient/root_ca.h +++ b/libraries/GSM/examples/GSMSSLClient/root_ca.h @@ -1,23 +1,29 @@ static const char root_ca[] = "-----BEGIN CERTIFICATE-----\n" -"MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\n" +"MIIEyDCCA7CgAwIBAgIQDPW9BitWAvR6uFAsI8zwZjANBgkqhkiG9w0BAQsFADBh\n" "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n" -"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\n" -"QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\n" -"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n" -"b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n" -"9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\n" -"CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\n" -"nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n" -"43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\n" -"T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\n" -"gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\n" -"BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\n" -"TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\n" -"DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\n" -"hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n" -"06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\n" -"PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\n" -"YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\n" -"CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n" +"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n" +"MjAeFw0yMTAzMzAwMDAwMDBaFw0zMTAzMjkyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\n" +"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMzAxBgNVBAMTKkRpZ2lDZXJ0IEdsb2Jh\n" +"bCBHMiBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTCCASIwDQYJKoZIhvcNAQEBBQAD\n" +"ggEPADCCAQoCggEBAMz3EGJPprtjb+2QUlbFbSd7ehJWivH0+dbn4Y+9lavyYEEV\n" +"cNsSAPonCrVXOFt9slGTcZUOakGUWzUb+nv6u8W+JDD+Vu/E832X4xT1FE3LpxDy\n" +"FuqrIvAxIhFhaZAmunjZlx/jfWardUSVc8is/+9dCopZQ+GssjoP80j812s3wWPc\n" +"3kbW20X+fSP9kOhRBx5Ro1/tSUZUfyyIxfQTnJcVPAPooTncaQwywa8WV0yUR0J8\n" +"osicfebUTVSvQpmowQTCd5zWSOTOEeAqgJnwQ3DPP3Zr0UxJqyRewg2C/Uaoq2yT\n" +"zGJSQnWS+Jr6Xl6ysGHlHx+5fwmY6D36g39HaaECAwEAAaOCAYIwggF+MBIGA1Ud\n" +"EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFHSFgMBmx9833s+9KTeqAx2+7c0XMB8G\n" +"A1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485MA4GA1UdDwEB/wQEAwIBhjAd\n" +"BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYIKwYBBQUHAQEEajBoMCQG\n" +"CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQAYIKwYBBQUHMAKG\n" +"NGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RH\n" +"Mi5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29t\n" +"L0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDA9BgNVHSAENjA0MAsGCWCGSAGG/WwC\n" +"ATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgGBmeBDAECAzANBgkqhkiG\n" +"9w0BAQsFAAOCAQEAkPFwyyiXaZd8dP3A+iZ7U6utzWX9upwGnIrXWkOH7U1MVl+t\n" +"wcW1BSAuWdH/SvWgKtiwla3JLko716f2b4gp/DA/JIS7w7d7kwcsr4drdjPtAFVS\n" +"slme5LnQ89/nD/7d+MS5EHKBCQRfz5eeLjJ1js+aWNJXMX43AYGyZm0pGrFmCW3R\n" +"bpD0ufovARTFXFZkAdl9h6g4U5+LXUZtXMYnhIHUfoyMo5tS58aI7Dd8KvvwVVo4\n" +"chDYABPPTHPbqjc1qCmBaZx2vN4Ye5DUys/vZwP9BFohFrH/6j/f3IL16/RZkiMN\n" +"JCqVJUzKoZHm1Lesh3Sz8W2jmdv51b2EQJ8HmA==\n" "-----END CERTIFICATE-----\n"; diff --git a/libraries/GSM/src/GSM.cpp b/libraries/GSM/src/GSM.cpp index e510697b4..cf5f5b975 100644 --- a/libraries/GSM/src/GSM.cpp +++ b/libraries/GSM/src/GSM.cpp @@ -18,6 +18,7 @@ */ #include "GSM.h" +#include "GSMDebug.h" #include "mbed.h" #include "CellularLog.h" @@ -49,7 +50,9 @@ int arduino::GSMClass::begin(const char* pin, const char* apn, const char* usern reset(); } - _context = mbed::CellularContext::get_default_instance(); + if (!_context) { + _context = mbed::CellularContext::get_default_instance(); + } if (_context == nullptr) { DEBUG_ERROR("Invalid mbed::CellularContext"); @@ -70,9 +73,7 @@ int arduino::GSMClass::begin(const char* pin, const char* apn, const char* usern _device->set_cmux_status_flag(_cmuxGSMenable); _device->set_retry_timeout_array(_retry_timeout, sizeof(_retry_timeout) / sizeof(_retry_timeout[0])); -#if GSM_DEBUG_ENABLE _device->attach(mbed::callback(this, &GSMClass::onStatusChange)); -#endif _device->init(); _pin = pin; @@ -118,7 +119,10 @@ void arduino::GSMClass::end() { } int arduino::GSMClass::disconnect() { - return _context->disconnect(); + if (_context) { + return _context->disconnect(); + } + return 0; } unsigned long arduino::GSMClass::getTime() @@ -145,9 +149,12 @@ bool arduino::GSMClass::isConnected() } } - - NetworkInterface* arduino::GSMClass::getNetwork() { + /* Can happen this is called before GSM.begin( .. ) when configuring GSMSSLClient + * from sketch calling client.appendCustomCACert( .. ) */ + if (!_context) { + _context = mbed::CellularContext::get_default_instance(); + } return _context; } diff --git a/libraries/GSM/src/GSM.h b/libraries/GSM/src/GSM.h index 43512cec1..0b724f284 100644 --- a/libraries/GSM/src/GSM.h +++ b/libraries/GSM/src/GSM.h @@ -63,31 +63,8 @@ #endif #endif -#if defined __has_include - #if __has_include ("Arduino_DebugUtils.h") - #include "Arduino_DebugUtils.h" - #define GSM_DEBUG_ENABLE 1 - #else - #define DEBUG_ERROR(fmt, ...) - #define DEBUG_WARNING(fmt, ...) - #define DEBUG_INFO(fmt, ...) - #define DEBUG_DEBUG(fmt, ...) - #define DEBUG_VERBOSE(fmt, ...) - #define GSM_DEBUG_ENABLE 0 - #endif -#else - #define DEBUG_ERROR(fmt, ...) - #define DEBUG_WARNING(fmt, ...) - #define DEBUG_INFO(fmt, ...) - #define DEBUG_DEBUG(fmt, ...) - #define DEBUG_VERBOSE(fmt, ...) - #define GSM_DEBUG_ENABLE 0 -#endif - namespace arduino { -typedef void* (*voidPrtFuncPtr)(void); - class GSMClass : public MbedSocketClass { public: @@ -131,9 +108,6 @@ class GSMClass : public MbedSocketClass { void trace(Stream& stream); void setTraceLevel(int trace_level, bool timestamp = false, bool at_trace = false); #endif - int ping(const char* hostname, uint8_t ttl = 128); - int ping(const String& hostname, uint8_t ttl = 128); - int ping(IPAddress host, uint8_t ttl = 128); bool isConnected(); friend class GSMClient; @@ -159,7 +133,6 @@ class GSMClass : public MbedSocketClass { */ const uint16_t _retry_timeout[6] = {1, 2, 4, 8, 16, 32}; -#if GSM_DEBUG_ENABLE static constexpr int RSSI_UNKNOWN = 99; static const char * const sim_state_str[]; static const char * const reg_type_str[]; @@ -172,7 +145,7 @@ class GSMClass : public MbedSocketClass { static const char * getSIMStateString(const mbed::CellularDevice::SimState state); static const char * getRegistrationStateString(const mbed::CellularNetwork::RegistrationStatus state); void onStatusChange(nsapi_event_t ev, intptr_t in); -#endif + void reset(); bool isReady(const int timeout = 5000); }; diff --git a/libraries/GSM/src/GSMClient.h b/libraries/GSM/src/GSMClient.h index 8ac465975..f29292fb9 100644 --- a/libraries/GSM/src/GSMClient.h +++ b/libraries/GSM/src/GSMClient.h @@ -21,15 +21,11 @@ #define gsmclient_h #include "GSM.h" -#include "MbedClient.h" +#include "AClient.h" namespace arduino { -class GSMClient : public MbedClient { -public: - GSMClient(); - -private: +class GSMClient : public AClient { NetworkInterface *getNetwork() { return GSM.getNetwork(); } diff --git a/libraries/GSM/src/GSMDebug.cpp b/libraries/GSM/src/GSMDebug.cpp index 5ec49324d..0d96c180c 100644 --- a/libraries/GSM/src/GSMDebug.cpp +++ b/libraries/GSM/src/GSMDebug.cpp @@ -18,6 +18,7 @@ */ #include +#include #if GSM_DEBUG_ENABLE @@ -183,11 +184,20 @@ const char * arduino::GSMClass::getRegistrationStateString(const mbed::CellularN } } +#endif + void arduino::GSMClass::onStatusChange(nsapi_event_t ev, intptr_t in) { + cellular_event_status event = (cellular_event_status)ev; + + if(event == CellularStateRetryEvent) { + feedWatchdog(); + } + +#if GSM_DEBUG_ENABLE const cell_callback_data_t *data = (const cell_callback_data_t *)in; - switch(ev) + switch(event) { case CellularDeviceReady: { @@ -269,6 +279,5 @@ void arduino::GSMClass::onStatusChange(nsapi_event_t ev, intptr_t in) { } break; } -} - #endif +} diff --git a/libraries/GSM/src/GSMClient.cpp b/libraries/GSM/src/GSMDebug.h similarity index 50% rename from libraries/GSM/src/GSMClient.cpp rename to libraries/GSM/src/GSMDebug.h index 71043da70..c3ab7e6b1 100644 --- a/libraries/GSM/src/GSMClient.cpp +++ b/libraries/GSM/src/GSMDebug.h @@ -1,6 +1,6 @@ /* - GSMClient.cpp - Copyright (c) 2023 Arduino SA. All right reserved. + GSMDebug.h + Copyright (c) 2021 Arduino SA. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -17,8 +17,28 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "GSMClient.h" +#ifndef GSMDEBUG_H +#define GSMDEBUG_H -arduino::GSMClient::GSMClient(): MbedClient(100) { +#if defined __has_include + #if __has_include ("Arduino_DebugUtils.h") + #include "Arduino_DebugUtils.h" + #define GSM_DEBUG_ENABLE 1 + #else + #define DEBUG_ERROR(fmt, ...) + #define DEBUG_WARNING(fmt, ...) + #define DEBUG_INFO(fmt, ...) + #define DEBUG_DEBUG(fmt, ...) + #define DEBUG_VERBOSE(fmt, ...) + #define GSM_DEBUG_ENABLE 0 + #endif +#else + #define DEBUG_ERROR(fmt, ...) + #define DEBUG_WARNING(fmt, ...) + #define DEBUG_INFO(fmt, ...) + #define DEBUG_DEBUG(fmt, ...) + #define DEBUG_VERBOSE(fmt, ...) + #define GSM_DEBUG_ENABLE 0 +#endif -} +#endif /* GSMDEBUG_H*/ diff --git a/libraries/GSM/src/GSMSSLClient.cpp b/libraries/GSM/src/GSMSSLClient.cpp deleted file mode 100644 index c953adb4f..000000000 --- a/libraries/GSM/src/GSMSSLClient.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/* - GSMSSLClient.cpp - Copyright (c) 2023 Arduino SA. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "GSMSSLClient.h" - -arduino::GSMSSLClient::GSMSSLClient(): MbedSSLClient(100) { - -} diff --git a/libraries/GSM/src/GSMSSLClient.h b/libraries/GSM/src/GSMSSLClient.h index 2ea0ae713..cc7d3c194 100644 --- a/libraries/GSM/src/GSMSSLClient.h +++ b/libraries/GSM/src/GSMSSLClient.h @@ -21,16 +21,13 @@ #define GSMSSLCLIENT_H #include "GSM.h" -#include "MbedSSLClient.h" +#include "AClient.h" extern const char CA_CERTIFICATES[]; namespace arduino { -class GSMSSLClient : public arduino::MbedSSLClient { -public: - GSMSSLClient(); - +class GSMSSLClient : public arduino::ASslClient { private: NetworkInterface *getNetwork() { return GSM.getNetwork(); diff --git a/libraries/OV7670/ov7670.cpp b/libraries/OV7670/ov7670.cpp index f6fd3255b..15c1caa9d 100644 --- a/libraries/OV7670/ov7670.cpp +++ b/libraries/OV7670/ov7670.cpp @@ -699,12 +699,16 @@ int OV7670::setFrameRate(int32_t framerate) int OV7670::setVerticalFlip(bool flip_enable) { - return -1; + uint8_t currentRegisterValue = regRead(getID(), MVFP); + uint8_t newRegisterValue = flip_enable ? currentRegisterValue | MVFP_VFLIP : currentRegisterValue & ~MVFP_VFLIP; + return regWrite(getID(), MVFP, newRegisterValue); } int OV7670::setHorizontalMirror(bool mirror_enable) { - return -1; + uint8_t currentRegisterValue = regRead(getID(), MVFP); + uint8_t newRegisterValue = mirror_enable ? currentRegisterValue | MVFP_MIRROR : currentRegisterValue & ~MVFP_MIRROR; + return regWrite(getID(), MVFP, newRegisterValue); } int OV7670::setResolution(int32_t resolution) diff --git a/libraries/PDM/src/STM32H747_dfsdm/audio.c b/libraries/PDM/src/STM32H747_dfsdm/audio.c index ab8d6e902..23c4cacb1 100644 --- a/libraries/PDM/src/STM32H747_dfsdm/audio.c +++ b/libraries/PDM/src/STM32H747_dfsdm/audio.c @@ -391,7 +391,10 @@ int py_audio_init(size_t channels, uint32_t frequency) void py_audio_gain_set(int gain_db) { - attenuation = 8 - gain_db; + attenuation = 8 - (gain_db / 3); + if (attenuation < 0) { + attenuation = 0; + } } void py_audio_deinit() diff --git a/libraries/Portenta_SDRAM/src/SDRAM.cpp b/libraries/Portenta_SDRAM/src/SDRAM.cpp index 4090a0b3f..aff4dad88 100644 --- a/libraries/Portenta_SDRAM/src/SDRAM.cpp +++ b/libraries/Portenta_SDRAM/src/SDRAM.cpp @@ -3,11 +3,34 @@ extern "C" { #include "ram_internal.h" } +static void MPU_Config() { + MPU_Region_InitTypeDef MPU_InitStruct; + + /* Disable the MPU */ + HAL_MPU_Disable(); + + // Initialize SDRAM Start as shareable + MPU_InitStruct.Enable = MPU_REGION_ENABLE; + MPU_InitStruct.BaseAddress = SDRAM_START_ADDRESS; + MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_8MB; + //MPU_InitStruct.SubRegionDisable = 0x00; + MPU_InitStruct.Number = MPU_REGION_NUMBER5; + MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; + MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; + MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; + MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE; + MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; + MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; + + HAL_MPU_ConfigRegion(&MPU_InitStruct); + + /* Enable the MPU */ + HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); +} + int SDRAMClass::begin(uint32_t start_address) { - printf("FMC_SDRAM_DEVICE->SDCMR: %x\n", FMC_SDRAM_DEVICE->SDCMR); if (FMC_SDRAM_DEVICE->SDCMR == 0x00000000U) { - printf("initializing external ram\n"); bool ret = sdram_init(); if (ret == false) { return 0; @@ -18,51 +41,16 @@ int SDRAMClass::begin(uint32_t start_address) { then enable access/caching for the size used */ - if (SDRAM_START_ADDRESS != 0xC0000000) { - printf("remap ram to 0x60000000\n"); + if (SDRAM_START_ADDRESS == 0x60000000) { HAL_SetFMCMemorySwappingConfig(FMC_SWAPBMAP_SDRAM_SRAM); } -#if 0 - - printf("setup mpu\n"); - #define MPU_SDRAM_EXEC_REGION_NUMBER MPU_REGION_SDRAM1 - #define MPU_SDRAM_REGION_TEX (0x4 << MPU_RASR_TEX_Pos) /* Cached memory */ - #define MPU_SDRAM_EXEC_REGION_SIZE (22 << MPU_RASR_SIZE_Pos) /* 2^(22+1) = 8Mo */ - #define MPU_SDRAM_ACCESS_PERMSSION (0x03UL << MPU_RASR_AP_Pos) - #define MPU_SDRAM_REGION_CACHABLE (0x01UL << MPU_RASR_C_Pos) - #define MPU_SDRAM_REGION_BUFFERABLE (0x01UL << MPU_RASR_B_Pos) - - MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; - /* Configure SDARM region as first region */ - MPU->RNR = MPU_SDRAM_EXEC_REGION_NUMBER; - /* Set MPU SDARM base address (0xD0000000) */ - MPU->RBAR = SDRAM_START_ADDRESS; - /* - - Execute region: RASR[size] = 22 -> 2^(22+1) -> size 8MB - - Access permission: Full access: RASR[AP] = 0b011 - - Cached memory: RASR[TEX] = 0b0100 - - Disable the Execute Never option: to allow the code execution on SDRAM: RASR[XN] = 0 - - Enable the region MPU: RASR[EN] = 1 - */ - MPU->RASR = (MPU_SDRAM_EXEC_REGION_SIZE | MPU_SDRAM_ACCESS_PERMSSION | MPU_SDRAM_REGION_TEX | \ - MPU_RASR_ENABLE_Msk | MPU_SDRAM_REGION_BUFFERABLE) & ~MPU_RASR_XN_Msk ; - - /* Enable MPU and leave the predefined regions to default configuration */ - MPU->CTRL |= MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_ENABLE_Msk; -#endif - -#if 0 - mpu_config_start(); - mpu_config_region(MPU_REGION_SDRAM1, SDRAM_START_ADDRESS, MPU_CONFIG_DISABLE(0x00, MPU_REGION_SIZE_512MB)); - mpu_config_region(MPU_REGION_SDRAM2, SDRAM_START_ADDRESS, MPU_CONFIG_SDRAM(SDRAM_MPU_REGION_SIZE)); - mpu_config_end(); -#endif - + #ifdef CORE_CM4 + MPU_Config(); + #endif } if (start_address) { - printf("malloc_addblock: allocate %d bytes\n", SDRAM_END_ADDRESS - start_address); malloc_addblock((void*)start_address, SDRAM_END_ADDRESS - start_address); } @@ -77,7 +65,7 @@ void SDRAMClass::free(void* ptr) { ea_free(ptr); } -bool __attribute__((optimize("O0"))) SDRAMClass::test(bool fast) { +bool __attribute__((optimize("O0"))) SDRAMClass::test(bool fast, Stream& _serial) { uint8_t const pattern = 0xaa; uint8_t const antipattern = 0x55; uint8_t *const mem_base = (uint8_t*)SDRAM_START_ADDRESS; @@ -86,7 +74,7 @@ bool __attribute__((optimize("O0"))) SDRAMClass::test(bool fast) { for (uint8_t i = 1; i; i <<= 1) { *mem_base = i; if (*mem_base != i) { - printf("data bus lines test failed! data (%d)\n", i); + _serial.println("data bus lines test failed! data (" + String(i) + ")"); __asm__ volatile ("BKPT"); } } @@ -96,7 +84,7 @@ bool __attribute__((optimize("O0"))) SDRAMClass::test(bool fast) { for (uint32_t i = 1; i < HW_SDRAM_SIZE; i <<= 1) { mem_base[i] = pattern; if (mem_base[i] != pattern) { - printf("address bus lines test failed! address (%p)\n", &mem_base[i]); + _serial.println("address bus lines test failed! address ("+ String((uint32_t)&mem_base[i], HEX) + ")"); __asm__ volatile ("BKPT"); } } @@ -105,7 +93,7 @@ bool __attribute__((optimize("O0"))) SDRAMClass::test(bool fast) { mem_base[0] = antipattern; for (uint32_t i = 1; i < HW_SDRAM_SIZE; i <<= 1) { if (mem_base[i] != pattern) { - printf("address bus overlap %p\n", &mem_base[i]); + _serial.println("address bus overlap! address ("+ String((uint32_t)&mem_base[i], HEX) + ")"); __asm__ volatile ("BKPT"); } } @@ -115,7 +103,7 @@ bool __attribute__((optimize("O0"))) SDRAMClass::test(bool fast) { for (uint32_t i = 0; i < HW_SDRAM_SIZE; ++i) { mem_base[i] = pattern; if (mem_base[i] != pattern) { - printf("address bus test failed! address (%p)\n", &mem_base[i]); + _serial.println("address bus test failed! address ("+ String((uint32_t)&mem_base[i], HEX) + ")"); __asm__ volatile ("BKPT"); } } diff --git a/libraries/Portenta_SDRAM/src/SDRAM.h b/libraries/Portenta_SDRAM/src/SDRAM.h index 5c75c1f01..0d8808f2d 100644 --- a/libraries/Portenta_SDRAM/src/SDRAM.h +++ b/libraries/Portenta_SDRAM/src/SDRAM.h @@ -1,16 +1,14 @@ +#ifndef __SDRAM_H +#define __SDRAM_H + #include "ea_malloc.h" #ifdef __cplusplus #include "Arduino.h" -#if !defined(CORE_CM4) #define SDRAM_END_ADDRESS (0x60800000) #define SDRAM_START_ADDRESS (0x60000000) -#else -#define SDRAM_END_ADDRESS (0xC0800000) -#define SDRAM_START_ADDRESS (0xC0000000) -#endif class SDRAMClass { public: @@ -18,7 +16,7 @@ class SDRAMClass { int begin(uint32_t start_address = SDRAM_START_ADDRESS); void* malloc(size_t size); void free(void* ptr); - bool test(bool fast = false); + bool test(bool fast = false, Stream& _serial = Serial); private: void mpu_config_start(void) { __disable_irq(); @@ -40,4 +38,5 @@ class SDRAMClass { extern SDRAMClass SDRAM; -#endif \ No newline at end of file +#endif +#endif // __SDRAM_H diff --git a/libraries/Portenta_SDRAM/src/ram_internal.h b/libraries/Portenta_SDRAM/src/ram_internal.h index 497ffb020..1d6ff0721 100644 --- a/libraries/Portenta_SDRAM/src/ram_internal.h +++ b/libraries/Portenta_SDRAM/src/ram_internal.h @@ -1,3 +1,6 @@ +#ifndef __RAM_INTERNAL_H +#define __RAM_INTERNAL_H + bool sdram_init(void); #define MPU_REGION_SDRAM1 (MPU_REGION_NUMBER4) @@ -56,3 +59,5 @@ bool sdram_init(void); | (size) << MPU_RASR_SIZE_Pos \ | MPU_REGION_ENABLE << MPU_RASR_ENABLE_Pos \ ) + +#endif // __RAM_INTERNAL_H diff --git a/libraries/RPC/LICENSE b/libraries/RPC/LICENSE new file mode 100644 index 000000000..a612ad981 --- /dev/null +++ b/libraries/RPC/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/libraries/RPC/examples/Basic_AddSub/Basic_AddSub.ino b/libraries/RPC/examples/Basic_AddSub/Basic_AddSub.ino new file mode 100644 index 000000000..61f96d53f --- /dev/null +++ b/libraries/RPC/examples/Basic_AddSub/Basic_AddSub.ino @@ -0,0 +1,49 @@ +#include "RPC.h" + +int add(int a, int b) { + return a + b; +} + +int sub(int a, int b) { + return a - b; +} + +void setup() { + Serial.begin(115200); + while (!Serial) { + + } + + RPC.begin(); + RPC.bind("add", add); + RPC.bind("sub", sub); + if (RPC.cpu_id() == CM7_CPUID) { + // Introduce a brief delay to allow the M4 sufficient time + // to bind remote functions before invoking them. + delay(100); + } + pinMode(LEDG, OUTPUT); +} + +void loop() { + static size_t loop_count = 0; + + // Blink every 512 iterations + if (RPC.cpu_id() == CM4_CPUID && (loop_count++ % 512) == 0) { + digitalWrite(LEDG, LOW); + delay(10); + digitalWrite(LEDG, HIGH); + delay(10); + } + + int res = RPC.call("add", 1, 2).as(); + if (RPC.cpu_id() == CM7_CPUID) { + Serial.println("add(1, 2) = " + String(res)); + } + + res = RPC.call("sub", res, 1).as(); + if (RPC.cpu_id() == CM7_CPUID) { + Serial.println("sub(3, 1) = " + String(res)); + } + delay(250); +} diff --git a/libraries/RPC/examples/MD5_Checksum/MD5.cpp b/libraries/RPC/examples/MD5_Checksum/MD5.cpp new file mode 100644 index 000000000..d8d31fbf1 --- /dev/null +++ b/libraries/RPC/examples/MD5_Checksum/MD5.cpp @@ -0,0 +1,302 @@ +#include "MD5.h" + +MD5::MD5() +{ + //nothing + return; +} + +char* MD5::make_digest(const unsigned char *digest, int len) /* {{{ */ +{ + char * md5str = (char*) malloc(sizeof(char)*(len*2+1)); + static const char hexits[17] = "0123456789abcdef"; + int i; + + for (i = 0; i < len; i++) { + md5str[i * 2] = hexits[digest[i] >> 4]; + md5str[(i * 2) + 1] = hexits[digest[i] & 0x0F]; + } + md5str[len * 2] = '\0'; + return md5str; +} + +/* + * The basic MD5 functions. + * + * E and G are optimized compared to their RFC 1321 definitions for + * architectures that lack an AND-NOT instruction, just like in Colin Plumb's + * implementation. + * E() has been used instead of F() because F() is already defined in the Arduino core + */ +#define E(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) +#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y)))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | ~(z))) + +/* + * The MD5 transformation for all four rounds. + */ +#define STEP(f, a, b, c, d, x, t, s) \ + (a) += f((b), (c), (d)) + (x) + (t); \ + (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \ + (a) += (b); + +/* + * SET reads 4 input bytes in little-endian byte order and stores them + * in a properly aligned word in host byte order. + * + * The check for little-endian architectures that tolerate unaligned + * memory accesses is just an optimization. Nothing will break if it + * doesn't work. + */ +#if defined(__i386__) || defined(__x86_64__) || defined(__vax__) +# define SET(n) \ + (*(MD5_u32plus *)&ptr[(n) * 4]) +# define GET(n) \ + SET(n) +#else +# define SET(n) \ + (ctx->block[(n)] = \ + (MD5_u32plus)ptr[(n) * 4] | \ + ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \ + ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \ + ((MD5_u32plus)ptr[(n) * 4 + 3] << 24)) +# define GET(n) \ + (ctx->block[(n)]) +#endif + +/* + * This processes one or more 64-byte data blocks, but does NOT update + * the bit counters. There are no alignment requirements. + */ +const void *MD5::body(void *ctxBuf, const void *data, size_t size) +{ + MD5_CTX *ctx = (MD5_CTX*)ctxBuf; + const unsigned char *ptr; + MD5_u32plus a, b, c, d; + MD5_u32plus saved_a, saved_b, saved_c, saved_d; + + ptr = (unsigned char*)data; + + a = ctx->a; + b = ctx->b; + c = ctx->c; + d = ctx->d; + + do { + saved_a = a; + saved_b = b; + saved_c = c; + saved_d = d; + +/* Round 1 + * E() has been used instead of F() because F() is already defined in the Arduino core + */ + STEP(E, a, b, c, d, SET(0), 0xd76aa478, 7) + STEP(E, d, a, b, c, SET(1), 0xe8c7b756, 12) + STEP(E, c, d, a, b, SET(2), 0x242070db, 17) + STEP(E, b, c, d, a, SET(3), 0xc1bdceee, 22) + STEP(E, a, b, c, d, SET(4), 0xf57c0faf, 7) + STEP(E, d, a, b, c, SET(5), 0x4787c62a, 12) + STEP(E, c, d, a, b, SET(6), 0xa8304613, 17) + STEP(E, b, c, d, a, SET(7), 0xfd469501, 22) + STEP(E, a, b, c, d, SET(8), 0x698098d8, 7) + STEP(E, d, a, b, c, SET(9), 0x8b44f7af, 12) + STEP(E, c, d, a, b, SET(10), 0xffff5bb1, 17) + STEP(E, b, c, d, a, SET(11), 0x895cd7be, 22) + STEP(E, a, b, c, d, SET(12), 0x6b901122, 7) + STEP(E, d, a, b, c, SET(13), 0xfd987193, 12) + STEP(E, c, d, a, b, SET(14), 0xa679438e, 17) + STEP(E, b, c, d, a, SET(15), 0x49b40821, 22) + +/* Round 2 */ + STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5) + STEP(G, d, a, b, c, GET(6), 0xc040b340, 9) + STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14) + STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20) + STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5) + STEP(G, d, a, b, c, GET(10), 0x02441453, 9) + STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14) + STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20) + STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5) + STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9) + STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14) + STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20) + STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5) + STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9) + STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14) + STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20) + +/* Round 3 */ + STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4) + STEP(H, d, a, b, c, GET(8), 0x8771f681, 11) + STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16) + STEP(H, b, c, d, a, GET(14), 0xfde5380c, 23) + STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4) + STEP(H, d, a, b, c, GET(4), 0x4bdecfa9, 11) + STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16) + STEP(H, b, c, d, a, GET(10), 0xbebfbc70, 23) + STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4) + STEP(H, d, a, b, c, GET(0), 0xeaa127fa, 11) + STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16) + STEP(H, b, c, d, a, GET(6), 0x04881d05, 23) + STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4) + STEP(H, d, a, b, c, GET(12), 0xe6db99e5, 11) + STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16) + STEP(H, b, c, d, a, GET(2), 0xc4ac5665, 23) + +/* Round 4 */ + STEP(I, a, b, c, d, GET(0), 0xf4292244, 6) + STEP(I, d, a, b, c, GET(7), 0x432aff97, 10) + STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15) + STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21) + STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6) + STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10) + STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15) + STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21) + STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6) + STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10) + STEP(I, c, d, a, b, GET(6), 0xa3014314, 15) + STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21) + STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6) + STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10) + STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15) + STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21) + + a += saved_a; + b += saved_b; + c += saved_c; + d += saved_d; + + ptr += 64; + } while (size -= 64); + + ctx->a = a; + ctx->b = b; + ctx->c = c; + ctx->d = d; + + return ptr; +} + +void MD5::MD5Init(void *ctxBuf) +{ + MD5_CTX *ctx = (MD5_CTX*)ctxBuf; + ctx->a = 0x67452301; + ctx->b = 0xefcdab89; + ctx->c = 0x98badcfe; + ctx->d = 0x10325476; + + ctx->lo = 0; + ctx->hi = 0; + + memset(ctx->block, 0, sizeof(ctx->block)); + memset(ctx->buffer, 0, sizeof(ctx->buffer)); +} + +void MD5::MD5Update(void *ctxBuf, const void *data, size_t size) +{ + MD5_CTX *ctx = (MD5_CTX*)ctxBuf; + MD5_u32plus saved_lo; + MD5_u32plus used, free; + + saved_lo = ctx->lo; + if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo) { + ctx->hi++; + } + ctx->hi += size >> 29; + + used = saved_lo & 0x3f; + + if (used) { + free = 64 - used; + + if (size < free) { + memcpy(&ctx->buffer[used], data, size); + return; + } + + memcpy(&ctx->buffer[used], data, free); + data = (unsigned char *)data + free; + size -= free; + body(ctx, ctx->buffer, 64); + } + + if (size >= 64) { + data = body(ctx, data, size & ~(size_t)0x3f); + size &= 0x3f; + } + + memcpy(ctx->buffer, data, size); +} + +void MD5::MD5Final(unsigned char *result, void *ctxBuf) +{ + MD5_CTX *ctx = (MD5_CTX*)ctxBuf; + MD5_u32plus used, free; + + used = ctx->lo & 0x3f; + + ctx->buffer[used++] = 0x80; + + free = 64 - used; + + if (free < 8) { + memset(&ctx->buffer[used], 0, free); + body(ctx, ctx->buffer, 64); + used = 0; + free = 64; + } + + memset(&ctx->buffer[used], 0, free - 8); + + ctx->lo <<= 3; + ctx->buffer[56] = ctx->lo; + ctx->buffer[57] = ctx->lo >> 8; + ctx->buffer[58] = ctx->lo >> 16; + ctx->buffer[59] = ctx->lo >> 24; + ctx->buffer[60] = ctx->hi; + ctx->buffer[61] = ctx->hi >> 8; + ctx->buffer[62] = ctx->hi >> 16; + ctx->buffer[63] = ctx->hi >> 24; + + body(ctx, ctx->buffer, 64); + + result[0] = ctx->a; + result[1] = ctx->a >> 8; + result[2] = ctx->a >> 16; + result[3] = ctx->a >> 24; + result[4] = ctx->b; + result[5] = ctx->b >> 8; + result[6] = ctx->b >> 16; + result[7] = ctx->b >> 24; + result[8] = ctx->c; + result[9] = ctx->c >> 8; + result[10] = ctx->c >> 16; + result[11] = ctx->c >> 24; + result[12] = ctx->d; + result[13] = ctx->d >> 8; + result[14] = ctx->d >> 16; + result[15] = ctx->d >> 24; + + memset(ctx, 0, sizeof(*ctx)); +} +unsigned char* MD5::make_hash(char *arg) +{ + MD5_CTX context; + unsigned char * hash = (unsigned char *) malloc(16); + MD5Init(&context); + MD5Update(&context, arg, strlen(arg)); + MD5Final(hash, &context); + return hash; +} +unsigned char* MD5::make_hash(char *arg,size_t size) +{ + MD5_CTX context; + unsigned char * hash = (unsigned char *) malloc(16); + MD5Init(&context); + MD5Update(&context, arg, size); + MD5Final(hash, &context); + return hash; +} + diff --git a/libraries/RPC/examples/MD5_Checksum/MD5.h b/libraries/RPC/examples/MD5_Checksum/MD5.h new file mode 100644 index 000000000..3ec8d8122 --- /dev/null +++ b/libraries/RPC/examples/MD5_Checksum/MD5.h @@ -0,0 +1,52 @@ +#ifndef MD5_h +#define MD5_h + +#include "Arduino.h" + +/* + * This is an OpenSSL-compatible implementation of the RSA Data Security, + * Inc. MD5 Message-Digest Algorithm (RFC 1321). + * + * Written by Solar Designer in 2001, and placed + * in the public domain. There's absolutely no warranty. + * + * This differs from Colin Plumb's older public domain implementation in + * that no 32-bit integer data type is required, there's no compile-time + * endianness configuration, and the function prototypes match OpenSSL's. + * The primary goals are portability and ease of use. + * + * This implementation is meant to be fast, but not as fast as possible. + * Some known optimizations are not included to reduce source code size + * and avoid compile-time configuration. + */ + +/* + * Updated by Scott MacVicar for arduino + * + */ + +#include + +typedef unsigned long MD5_u32plus; + +typedef struct { + MD5_u32plus lo, hi; + MD5_u32plus a, b, c, d; + unsigned char buffer[64]; + MD5_u32plus block[16]; +} MD5_CTX; + +class MD5 +{ +public: + MD5(); + static unsigned char* make_hash(char *arg); + static unsigned char* make_hash(char *arg,size_t size); + static char* make_digest(const unsigned char *digest, int len); + static const void *body(void *ctxBuf, const void *data, size_t size); + static void MD5Init(void *ctxBuf); + static void MD5Final(unsigned char *result, void *ctxBuf); + static void MD5Update(void *ctxBuf, const void *data, size_t size); +}; + +#endif \ No newline at end of file diff --git a/libraries/RPC/examples/MD5_Checksum/MD5_Checksum.ino b/libraries/RPC/examples/MD5_Checksum/MD5_Checksum.ino new file mode 100644 index 000000000..ea6ffc502 --- /dev/null +++ b/libraries/RPC/examples/MD5_Checksum/MD5_Checksum.ino @@ -0,0 +1,115 @@ +#include "RPC.h" +#include "MD5.h" + +size_t hash_in_count = 0; +size_t hash_out_count = 0; + +#ifdef CORE_CM4 +size_t data_buf_size = 0; +#else +size_t data_buf_size = 256; +#endif + +typedef std::vector vec_t; + +void fatal_error() { + while (true) { + digitalWrite(LEDR, LOW); + delay(500); + digitalWrite(LEDR, HIGH); + delay(500); + } +} + +vec_t hash_block(vec_t &buf) { + MD5_CTX context; + MD5::MD5Init(&context); + MD5::MD5Update(&context, buf.data(), buf.size()); + + vec_t hash(16); + MD5::MD5Final(&hash[0], &context); + return hash; +} + +vec_t md5hash(vec_t &buf) { + hash_out_count++; + return hash_block(buf); +} + +#ifdef CORE_CM4 +// Called by the host to set the data buffer size. +size_t set_buffer_size(size_t size) { + data_buf_size = size; + return 0; +} +#endif + +void setup() { + #ifdef CORE_CM7 + Serial.begin(115200); + while (!Serial) { + + } + #endif + + if (!RPC.begin()) { + fatal_error(); + } + RPC.bind("md5hash", md5hash); + #ifdef CORE_CM4 + RPC.bind("set_buffer_size", set_buffer_size); + #else + // Introduce a brief delay to allow the M4 sufficient time + // to bind remote functions before invoking them. + delay(100); + auto ret = RPC.call("set_buffer_size", data_buf_size).as(); + #endif + + pinMode(LEDR, OUTPUT); + pinMode(LEDG, OUTPUT); +} + +void loop() { + static vec_t data; + static uint32_t ticks_start = millis(); + + // Wait for the host processor to set the data buffer size. + if (data_buf_size == 0) { + return; + } else if (data.size() == 0) { + data.resize(data_buf_size, 0); + } + + // Fill the buffer with random data. + for (int i=0; i(); + + // Calculate checksum and compare with the received checksum. + vec_t hash = hash_block(data); + if (memcmp(&hash[0], &ret[0], 16) != 0) { + fatal_error(); + } + + #ifdef CORE_CM4 + if ((hash_in_count % 512) == 0) { + digitalWrite(LEDG, LOW); + delay(10); + digitalWrite(LEDG, HIGH); + delay(10); + } + #endif + + #ifdef CORE_CM7 + if ((hash_in_count % 16) == 0) { + float khs = (hash_in_count + hash_out_count) / (float) (millis() - ticks_start); + Serial.println("Generated: " + String(hash_out_count) + " Received: " + String(hash_in_count) + " " + String(khs) +" KH/S"); + } + //delay(1); + #endif + + hash_in_count++; +} diff --git a/libraries/RPC/examples/PingPong_RAW/PingPong_RAW.ino b/libraries/RPC/examples/PingPong_RAW/PingPong_RAW.ino new file mode 100644 index 000000000..af2b1b111 --- /dev/null +++ b/libraries/RPC/examples/PingPong_RAW/PingPong_RAW.ino @@ -0,0 +1,49 @@ +#include "RPC.h" + +void fatal_error() { + while (true) { + digitalWrite(LEDR, LOW); + delay(500); + digitalWrite(LEDR, HIGH); + delay(500); + } +} + +void recv_callback(const uint8_t *buf, size_t len) { + #ifdef CORE_CM7 + Serial.print("<= "); + Serial.write(buf, len); + Serial.println(); + #else + const uint8_t msg[] = "Pong!"; + RPC.write(&msg[0], sizeof(msg), true); + #endif +} + +void setup() { + #ifdef CORE_CM7 + Serial.begin(115200); + while (!Serial) { + + } + #endif + + if (!RPC.begin()) { + fatal_error(); + } + RPC.attach(recv_callback); + + pinMode(LEDR, OUTPUT); + pinMode(LEDG, OUTPUT); +} + +void loop() { + #ifdef CORE_CM7 + const uint8_t buf[] = "Ping!"; + Serial.print("=> "); + Serial.write(buf, sizeof(buf)); + Serial.println(); + RPC.write(&buf[0], sizeof(buf)); + delay(100); + #endif +} diff --git a/libraries/RPC/examples/PortentaX8_EchoServer/PortentaX8_EchoServer.ino b/libraries/RPC/examples/PortentaX8_EchoServer/PortentaX8_EchoServer.ino index 6ea35282a..9915925a3 100644 --- a/libraries/RPC/examples/PortentaX8_EchoServer/PortentaX8_EchoServer.ino +++ b/libraries/RPC/examples/PortentaX8_EchoServer/PortentaX8_EchoServer.ino @@ -1,21 +1,24 @@ -#include "RPC.h" #include "SerialRPC.h" +#include "RPC.h" /* - * This sketch demonstrates how to interact with the Portenta X8 Serial port (over USB) - * On the board, launch both 'proxy' and 'example' binaries (from https://github.com/arduino/portentax8-m4-proxy) - * The M4 provides the 'subtract' API (which will be invoked by 'example' - * It also provides a full duplex Serial-like interface that is proxies through the serial monitor - * Last but not leas, when you write 'echo' the corresponding function in 'example' will be triggered - */ + This sketch demonstrates how to interact with the Portenta X8 Serial port (over USB) + On the board, launch both 'proxy' and 'example' binaries (from https://github.com/arduino/portentax8-m4-proxy) + The M4 provides the 'subtract' API (which will be invoked by 'example' + It also provides a full duplex Serial-like interface that is proxies through the serial monitor + Last but not leas, when you write 'echo' the corresponding function in 'example' will be triggered +*/ int subtract(int a, int b) { - return a-b; + return a - b; } +int led_status = 0; + void setup() { // put your setup code here, to run once: Serial.begin(115200); + pinMode(LED_BUILTIN, OUTPUT); RPC.bind("subtract", subtract); delay(1000); } @@ -23,20 +26,44 @@ void setup() { int i = 0; void loop() { - //RPC.print("hello"); - //RPC.send("echo", "test"); - //auto res = RPC.call("add", 5, 8).as(); - //RPC.send("echo", String(res).c_str()); + if (millis() % 1000 == 0) { + Serial.println("loop"); + delay(2); + } String str = ""; while (Serial.available()) { str += (char)Serial.read(); } if (str != "") { - Serial.print(str); + //Serial.print(str); + } + + if (str.startsWith("whoami")) { + digitalWrite(LED_BUILTIN, HIGH); + auto res = RPC.call("whoami").as(); + Serial.println(res.c_str()); + digitalWrite(LED_BUILTIN, LOW); } + + if (str.startsWith("divide")) { + float a = random() % 15000; + float b = random() % 15000; + Serial.println(String(a) + " / " + String(b)); + auto res = RPC.call("divide", a, b).as(); + Serial.println(String(a) + " / " + String(b) + " = " + String(res)); + } + + if (str.startsWith("add")) { + int a = random() % 15000; + int b = random() % 15000; + Serial.println(String(a) + " + " + String(b)); + auto res = RPC.call("add", a, b).as(); + Serial.println(String(a) + " + " + String(b) + " = " + String(res)); + } + if (str.startsWith("echo")) { - delay(100); - RPC.send("echo", "test"); + auto res = RPC.call("echo", "X8").as(); + Serial.println(res.c_str()); } -} +} \ No newline at end of file diff --git a/libraries/RPC/examples/RPC_m4/RPC_m4.ino b/libraries/RPC/examples/RPC_m4/RPC_m4.ino index 5d40f382d..439a85caf 100644 --- a/libraries/RPC/examples/RPC_m4/RPC_m4.ino +++ b/libraries/RPC/examples/RPC_m4/RPC_m4.ino @@ -1,16 +1,17 @@ #include "Arduino.h" #include "RPC.h" +#include "SerialRPC.h" using namespace rtos; Thread subtractThread; /** - * Returns the CPU that's currently running the sketch (M7 or M4) - * Note that the sketch has to be uploaded to both cores. + Returns the CPU that's currently running the sketch (M7 or M4) + Note that the sketch has to be uploaded to both cores. **/ String currentCPU() { - if (HAL_GetCurrentCPUID() == CM7_CPUID) { + if (RPC.cpu_id() == CM7_CPUID) { return "M7"; } else { return "M4"; @@ -18,7 +19,7 @@ String currentCPU() { } /** - * Adds two numbers and returns the sum + Adds two numbers and returns the sum **/ int addOnM7(int a, int b) { Serial.println(currentCPU() + ": executing add with " + String(a) + " and " + String(b)); @@ -27,7 +28,7 @@ int addOnM7(int a, int b) { } /** - * Subtracts two numbers and returns the difference + Subtracts two numbers and returns the difference **/ int subtractOnM7(int a, int b) { Serial.println(currentCPU() + ": executing subtract with " + String(a) + " and " + String(b)); @@ -40,11 +41,11 @@ void callSubstractFromM4() { delay(700); // Wait 700ms with the next calculation int a = random(100); // Generate a random number int b = random(100); // Generate a random number - RPC.println(currentCPU() + ": calling subtract with " + String(a) + " and " + String(b)); - + SerialRPC.println(currentCPU() + ": calling subtract with " + String(a) + " and " + String(b)); + auto result = RPC.call("remoteSubtract", a, b).as(); // Prints the result of the calculation - RPC.println(currentCPU() + ": Result is " + String(a) + " - " + String(b) + " = " + String(result)); + SerialRPC.println(currentCPU() + ": Result is " + String(a) + " - " + String(b) + " = " + String(result)); } } @@ -53,18 +54,17 @@ void setup() { pinMode(LED_BUILTIN, OUTPUT); // Initialize RPC library; this also boots the M4 core - RPC.begin(); Serial.begin(115200); - //while (!Serial) {} // Uncomment this to wait until the Serial connection is ready - - // Both CPUs will execute this instruction, just at different times - randomSeed(analogRead(A0)); // Initializes the pseudo-random number generator + while (!Serial) {} // Uncomment this to wait until the Serial connection is ready + if (!SerialRPC.begin()) { + Serial.println("RPC initialization fail"); + } if (currentCPU() == "M7") { // M7 CPU becomes the server, so it makes two functions available under the defined names RPC.bind("remoteAdd", addOnM7); RPC.bind("remoteSubtract", subtractOnM7); - } + } if (currentCPU() == "M4") { // M4 CPU becomes the client, so spawns a thread that will call subtractOnM7() every 700ms @@ -75,7 +75,7 @@ void setup() { void loop() { if (currentCPU() == "M4") { - // On M4 let's blink an LED. While it's blinking, the callSubstractFromM4() thread is running, + // On M4 let's blink an LED. While it's blinking, the callSubstractFromM4() thread is running, // so it will execute roughly 3 times (2000 / 700 ms) digitalWrite(LED_BUILTIN, LOW); delay(1000); @@ -84,27 +84,26 @@ void loop() { int a = random(100); int b = random(100); - // PRC.print works like a Serial port, but it needs a receiver (in this case the M7) + // SerialRPC.print works like a Serial port, but it needs a receiver (in this case the M7) // to actually print the strings to the Serial port - RPC.println(currentCPU() + ": calling add with " + String(a) + " and " + String(b)); + SerialRPC.println(currentCPU() + ": calling add with " + String(a) + " and " + String(b)); // Let's invoke addOnM7() and wait for a result. // This will be delayed by the forced delay() in addOnM7() function // Exercise: if you are not interested in the result of the operation, what operation would you invoke? - auto result = RPC.call("remoteAdd", a, b).as(); - RPC.println(currentCPU() + ": Result is " + String(a) + " + " + String(b) + " = " + String(result)); + auto result = RPC.call("remoteAdd", a, b).as(); + SerialRPC.println(currentCPU() + ": Result is " + String(a) + " + " + String(b) + " = " + String(result)); } - + if (currentCPU() == "M7") { - // On M7, let's print everything that is received over the RPC1 stream interface + // On M7, let's print everything that is received over the SerialRPC stream interface // Buffer it, otherwise all characters will be interleaved by other prints String buffer = ""; - while (RPC.available()) { - buffer += (char)RPC.read(); // Fill the buffer with characters + while (SerialRPC.available()) { + buffer += (char)SerialRPC.read(); // Fill the buffer with characters } if (buffer.length() > 0) { Serial.print(buffer); } } - } diff --git a/libraries/RPC/examples/SerialPassthrough_RPC/SerialPassthrough_RPC.ino b/libraries/RPC/examples/SerialPassthrough_RPC/SerialPassthrough_RPC.ino index 38cf7d331..eb8917bb7 100644 --- a/libraries/RPC/examples/SerialPassthrough_RPC/SerialPassthrough_RPC.ino +++ b/libraries/RPC/examples/SerialPassthrough_RPC/SerialPassthrough_RPC.ino @@ -3,22 +3,18 @@ void setup() { Serial.begin(115200); + while (!Serial) { + } RPC.begin(); } void loop() { - String data = ""; - while (RPC.available()) { - data += (char)RPC.read(); - } - if (data != "") { - Serial.write(data.c_str(), data.length()); - } - data = ""; - while (Serial.available()) { - data += (char)Serial.read(); - } - if (data != "") { - RPC.write(data.c_str(), data.length()); + if (RPC.cpu_id() == CM4_CPUID) { + RPC.println("Printed from M4 core"); + delay(1000); + } else { + while (RPC.available()) { + Serial.print((char) RPC.read()); + } } } diff --git a/libraries/RPC/src/RPC.cpp b/libraries/RPC/src/RPC.cpp index 0c327ff82..65d0c2b5a 100644 --- a/libraries/RPC/src/RPC.cpp +++ b/libraries/RPC/src/RPC.cpp @@ -1,373 +1,288 @@ +// Copyright (c) 2024 Arduino SA +// SPDX-License-Identifier: MPL-2.0 #include "RPC.h" -static struct rpmsg_endpoint rp_endpoints[4]; +#define ENDPOINT_ID_RAW 0 +#define ENDPOINT_ID_RPC 1 -enum endpoints_t { - ENDPOINT_RAW = 0, - ENDPOINT_RESPONSE = 1 -}; - -void rpc::client::send_msgpack(RPCLIB_MSGPACK::sbuffer *buffer) { - OPENAMP_send(&rp_endpoints[ENDPOINT_RAW], (const uint8_t*)buffer->data(), buffer->size()); -} +#define MSGPACK_TYPE_REQUEST 0 +#define MSGPACK_TYPE_RESPONSE 1 +#define MSGPACK_TYPE_NOTIFY 2 -static RingBufferN intermediate_buffer; -static RingBufferN intermediate_buffer_resp; -//static uint8_t intermediate_buffer_resp[256]; -static rtos::Mutex rx_mtx; - -static bool _init_recv_message = true; - -int RPCClass::rpmsg_recv_callback(struct rpmsg_endpoint *ept, void *data, - size_t len, uint32_t src, void *priv) -{ - RPCClass* rpc = (RPCClass*)priv; +arduino::RPCClass RPC; +osThreadId eventHandlerThreadId; +static rtos::Mutex mutex; +static struct rpmsg_endpoint endpoints[2]; #ifdef CORE_CM4 - if (_init_recv_message) { - _init_recv_message = false; - return 0; - } +static bool endpoints_init[2] = { 0 }; #endif - rx_mtx.lock(); - for (size_t i = 0; i < len; i++) { - intermediate_buffer.store_char(((uint8_t*)data)[i]); - } - rx_mtx.unlock(); - - //memcpy(intermediate_buffer, data, len); +void RPCClass::new_service_cb(struct rpmsg_device *rdev, const char *name, uint32_t dest) { + uint8_t buffer[1] = {0}; + struct rpmsg_endpoint *ept = NULL; - osSignalSet(rpc->dispatcherThreadId, len); + if (strcmp(name, "rpc") == 0) { + ept = &endpoints[ENDPOINT_ID_RPC]; + } else if (strcmp(name, "raw") == 0) { + ept = &endpoints[ENDPOINT_ID_RAW]; + } - return 0; + if (ept) { + OPENAMP_create_endpoint(ept, name, dest, rpmsg_recv_callback, NULL); + OPENAMP_send(ept, buffer, sizeof(buffer)); + } } -static bool _init_resp_message = true; - -int RPCClass::rpmsg_recv_response_callback(struct rpmsg_endpoint *ept, void *data, - size_t len, uint32_t src, void *priv) -{ - RPCClass* rpc = (RPCClass*)priv; - -#ifdef CORE_CM4 - if (_init_resp_message) { - _init_resp_message = false; +int RPCClass::rpmsg_recv_callback(struct rpmsg_endpoint *ept, void *data, size_t len, uint32_t src, void *priv) { + #ifdef CORE_CM4 + if (!endpoints_init[ENDPOINT_ID_RPC] && ept == &endpoints[ENDPOINT_ID_RPC]) { + endpoints_init[ENDPOINT_ID_RPC] = true; return 0; - } -#endif - - rx_mtx.lock(); - for (size_t i = 0; i < len; i++) { - intermediate_buffer_resp.store_char(((uint8_t*)data)[i]); - } - //memcpy(intermediate_buffer_resp, data, len); - rx_mtx.unlock(); + } else if (!endpoints_init[ENDPOINT_ID_RAW] && ept == &endpoints[ENDPOINT_ID_RAW]) { + endpoints_init[ENDPOINT_ID_RAW] = true; + return 0; + } + #endif - osSignalSet(rpc->responseThreadId, len); + if (ept == &endpoints[ENDPOINT_ID_RAW]) { + // data on raw endpoint + if (RPC.raw_callback) { + RPC.raw_callback.call((uint8_t *) data, len); + } else { + for (size_t i=0; istart(&eventHandler); + // Allow the event thread to run once to set the thread ID, and get into a known state. + osDelay(1); - eventThread = new rtos::Thread(osPriorityHigh, 4096, nullptr, "rpc_evt"); - eventThread->start(&eventHandler); - - dispatcherThread = new rtos::Thread(osPriorityNormal, 4096, nullptr, "rpc_dispatch"); - dispatcherThread->start(mbed::callback(this, &RPCClass::dispatch)); - - responseThread = new rtos::Thread(osPriorityNormal, 4096, nullptr, "rpc_response"); - responseThread->start(mbed::callback(this, &RPCClass::response)); - - /* Initialize OpenAmp and libmetal libraries */ - if (MX_OPENAMP_Init(RPMSG_MASTER, new_service_cb) != HAL_OK) { - return 0; - } - - //metal_set_log_handler(metal_default_log_handler); - - /* Initialize the rpmsg endpoint to set default addresses to RPMSG_ADDR_ANY */ - rpmsg_init_ept(&rp_endpoints[ENDPOINT_RAW], "raw", RPMSG_ADDR_ANY, RPMSG_ADDR_ANY, NULL, NULL); - rpmsg_init_ept(&rp_endpoints[ENDPOINT_RESPONSE], "response", RPMSG_ADDR_ANY, RPMSG_ADDR_ANY, NULL, NULL); - - rp_endpoints[ENDPOINT_RAW].priv = this; - rp_endpoints[ENDPOINT_RESPONSE].priv = this; - - bootM4(); - - /* - * The rpmsg service is initiate by the remote processor, on H7 new_service_cb - * callback is received on service creation. Wait for the callback - */ - auto err = OPENAMP_Wait_EndPointready(&rp_endpoints[ENDPOINT_RAW], millis() + 500); - err |= OPENAMP_Wait_EndPointready(&rp_endpoints[ENDPOINT_RESPONSE], millis() + 500); + // Initialize OpenAmp and libmetal libraries + if (MX_OPENAMP_Init(RPMSG_HOST, new_service_cb) != HAL_OK) { + return 0; + } - if (err == 0) { - initialized = true; - } else { - return 0; - } + // Initialize rpmsg endpoints. + memset(endpoints, 0, sizeof(endpoints)); - // Send first dummy message to enable the channel - uint8_t message = 0x00; - write(ENDPOINT_RAW, &message, sizeof(message)); - write(ENDPOINT_RESPONSE, &message, sizeof(message)); + // Boot the CM4. + cm4_kick(); - return 1; + // Wait for the remote to announce the services with a timeout. + uint32_t millis_start = millis(); + while (endpoints[ENDPOINT_ID_RPC].rdev == NULL || endpoints[ENDPOINT_ID_RAW].rdev == NULL) { + if ((millis() - millis_start) >= 5000) { + return 0; + } + osDelay(10); + } + return 1; } - #endif - #ifdef CORE_CM4 +#if (CM4_BINARY_START >= 0x60000000) && (CM4_BINARY_START < 0xe0000000) +class M4Init { +public: + M4Init() { + // If the Cortex-M4 core is booting from SDRAM, the memory region must be + // configured as Strongly Ordered. Note that the Cortex-M4 core does not + // seem to implement speculative prefetching, so there is no need to protect + // the whole region from speculative prefetching with a second MPU region. + HAL_MPU_Disable(); + MPU_Region_InitTypeDef MPU_InitStruct; + MPU_InitStruct.Number = MPU_REGION_NUMBER1; + MPU_InitStruct.Enable = MPU_REGION_ENABLE; + MPU_InitStruct.BaseAddress = CM4_BINARY_START; + MPU_InitStruct.Size = MPU_REGION_SIZE_1MB; + MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; + MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; + MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; + MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; + MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; + MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; + MPU_InitStruct.SubRegionDisable = 0x00; + HAL_MPU_ConfigRegion(&MPU_InitStruct); + HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); + } +}; -int RPCClass::begin(long unsigned int np, uint16_t nd) { - - eventThread = new rtos::Thread(osPriorityHigh, 4096, nullptr, "rpc_evt"); - eventThread->start(&eventHandler); - - dispatcherThread = new rtos::Thread(osPriorityNormal, 4096, nullptr, "rpc_dispatch"); - dispatcherThread->start(mbed::callback(this, &RPCClass::dispatch)); - - responseThread = new rtos::Thread(osPriorityNormal, 4096, nullptr, "rpc_response"); - responseThread->start(mbed::callback(this, &RPCClass::response)); - - /* Initialize OpenAmp and libmetal libraries */ - if (MX_OPENAMP_Init(RPMSG_REMOTE, NULL) != 0) { - return 0; - } +M4Init __m4init __attribute__ ((init_priority (101))); +#endif - rp_endpoints[ENDPOINT_RAW].priv = this; - rp_endpoints[ENDPOINT_RESPONSE].priv = this; +int RPCClass::begin() { + eventThread = new rtos::Thread(osPriorityHigh, 16*1024, nullptr, "rpc_evt"); + eventThread->start(&eventHandler); + // Allow the event thread to run once to set the thread ID, and get into a known state. + osDelay(1); - /* create a endpoint for raw rmpsg communication */ - int status = OPENAMP_create_endpoint(&rp_endpoints[ENDPOINT_RAW], "raw", RPMSG_ADDR_ANY, - rpmsg_recv_callback, NULL); - if (status < 0) { - return 0; - } + // Initialize OpenAmp and libmetal libraries + if (MX_OPENAMP_Init(RPMSG_REMOTE, NULL) != 0) { + return 0; + } - status = OPENAMP_create_endpoint(&rp_endpoints[ENDPOINT_RESPONSE], "response", RPMSG_ADDR_ANY, - rpmsg_recv_response_callback, NULL); - if (status < 0) { - return 0; - } + // Create RAW endpoint. + if (OPENAMP_create_endpoint(&endpoints[ENDPOINT_ID_RAW], "raw", RPMSG_ADDR_ANY, rpmsg_recv_callback, NULL) < 0) { + return 0; + } + + // Create RPC endpoint. + if (OPENAMP_create_endpoint(&endpoints[ENDPOINT_ID_RPC], "rpc", RPMSG_ADDR_ANY, rpmsg_recv_callback, NULL) < 0) { + return 0; + } - initialized = true; + // Wait for endpoints to be initialized first by the host before allowing + // the remote to use the endpoints. + uint32_t millis_start = millis(); + while (!endpoints_init[ENDPOINT_ID_RPC] || !endpoints_init[ENDPOINT_ID_RAW]) { + if ((millis() - millis_start) >= 5000) { + return 0; + } + osDelay(10); + } - return 1; + return 1; } - #endif -using raw_call_t = std::tuple; +void RPCClass::response(uint8_t *buf, size_t len) { + unpacker.reset(); + unpacker.reserve_buffer(len); + memcpy(unpacker.buffer(), buf, len); + unpacker.buffer_consumed(len); -void RPCClass::response() { - responseThreadId = osThreadGetId(); - - for (int i = 0; i< 10; i++) { - clients[i] = NULL; - } - - while (true) { - osSignalWait(0, osWaitForever); - -{ - - RPCLIB_MSGPACK::unpacker pac; - - rx_mtx.lock(); - int len = intermediate_buffer_resp.available(); - for (int i = 0; i < len; i++) { - pac.buffer()[i] = intermediate_buffer_resp.read_char(); - } - pac.buffer_consumed(len); - rx_mtx.unlock(); - - //memcpy(pac.buffer(), intermediate_buffer_resp, v.value.signals); - //pac.buffer_consumed(v.value.signals); - - RPCLIB_MSGPACK::unpacked result; - while (pac.next(result)) { + RPCLIB_MSGPACK::unpacked result; + while (unpacker.next(result)) { auto r = rpc::detail::response(std::move(result)); auto id = r.get_id(); // fill the correct client stuff rpc::client* client = NULL; for (int i = 0; i < 10; i++) { - if (clients[i] != NULL) { - if ((uint)clients[i]->callThreadId == id) { - client = clients[i]; - break; + if (clients[i] != NULL) { + if ((uint)clients[i]->callThreadId == id) { + client = clients[i]; + break; + } } - } } if (client != NULL) { - client->result = std::move(*r.get_result()); - // Unlock callThreadId thread - osSignalSet(client->callThreadId, 0x1); + client->result = std::move(*r.get_result()); + // Unlock callThreadId thread + osSignalSet(client->callThreadId, 0x1); } - } } - } } -void RPCClass::dispatch() { - - dispatcherThreadId = osThreadGetId(); - - while (true) { - osSignalWait(0, osWaitForever); - -{ - RPCLIB_MSGPACK::unpacker pac; - rx_mtx.lock(); - int len = intermediate_buffer.available(); - for (int i = 0; i< len; i++) { - pac.buffer()[i] = intermediate_buffer.read_char(); - } - pac.buffer_consumed(len); - rx_mtx.unlock(); - - //memcpy(pac.buffer(), intermediate_buffer, v.value.signals); - //pac.buffer_consumed(v.value.signals); +void RPCClass::request(uint8_t *buf, size_t len) { + unpacker.reset(); + unpacker.reserve_buffer(len); + memcpy(unpacker.buffer(), buf, len); + unpacker.buffer_consumed(len); RPCLIB_MSGPACK::unpacked result; - while (pac.next(result)) { - auto msg = result.get(); - if (msg.via.array.size == 1) { - // raw array - raw_call_t arr; - msg.convert(arr); - - std::vector buf; - std::get<0>(arr).convert(buf); - - for (size_t i = 0; i < buf.size(); i++) { - rx_buffer.store_char(buf[i]); - } - // call attached function - if (_rx) { - _rx.call(); - } - } - - if (msg.via.array.size > 2) { - auto resp = rpc::detail::dispatcher::dispatch(msg, true); + while (unpacker.next(result)) { + auto msg = result.get(); + auto resp = rpc::detail::dispatcher::dispatch(msg, false); auto data = resp.get_data(); - if (resp.is_empty()) { - //printf("no response\n"); - } else { - OPENAMP_send(&rp_endpoints[ENDPOINT_RESPONSE], (const uint8_t*)data.data(), data.size()); + if (!resp.is_empty()) { + OPENAMP_send(&endpoints[ENDPOINT_ID_RPC], data.data(), data.size()); } - } } - } -} } - size_t RPCClass::write(uint8_t c) { - write(&c, 1); - return 1; + return write(&c, 1, true); } -size_t RPCClass::write(const uint8_t* buf, size_t len) { - return write(ENDPOINT_RAW, buf, len); +void rpc::client::write(RPCLIB_MSGPACK::sbuffer *buffer) { + RPC.write((const uint8_t *) buffer->data(), buffer->size(), false); } -size_t RPCClass::write(uint8_t ep, const uint8_t* buf, size_t len) { - - std::vector tx_buffer; - for (size_t i = 0; i < len; i++) { - tx_buffer.push_back(buf[i]); - } - auto call_obj = std::make_tuple(tx_buffer); - - auto buffer = new RPCLIB_MSGPACK::sbuffer; - RPCLIB_MSGPACK::pack(*buffer, call_obj); - - OPENAMP_send(&rp_endpoints[ep], (const uint8_t*)buffer->data(), buffer->size()); - delete buffer; - return len; +size_t RPCClass::write(const uint8_t *buf, size_t len, bool raw) { + mutex.lock(); + OPENAMP_send(&endpoints[raw ? ENDPOINT_ID_RAW : ENDPOINT_ID_RPC], buf, len); + mutex.unlock(); + return len; } - -arduino::RPCClass RPC; \ No newline at end of file diff --git a/libraries/RPC/src/RPC.h b/libraries/RPC/src/RPC.h index 8aa8fa7e7..92255f4c8 100644 --- a/libraries/RPC/src/RPC.h +++ b/libraries/RPC/src/RPC.h @@ -1,3 +1,5 @@ +// Copyright (c) 2024 Arduino SA +// SPDX-License-Identifier: MPL-2.0 #ifdef __cplusplus #ifndef __ARDUINO_RPC_IMPLEMENTATION__ @@ -35,127 +37,107 @@ extern "C" { #include "mbed.h" -typedef struct _service_request { - uint8_t* data; -} service_request; - namespace arduino { - class RPCClass : public Stream, public rpc::detail::dispatcher { - public: - RPCClass() {}; - int begin(long unsigned int = 0, uint16_t = 0); - void end() {}; - int available(void) { - return rx_buffer.available(); - }; - int peek(void) { - return rx_buffer.peek(); - } - int read(void) { - return rx_buffer.read_char(); - } - void flush(void) {}; - size_t write(uint8_t c); - size_t write(const uint8_t*, size_t); - size_t write(uint8_t ep, const uint8_t* buf, size_t len); - - using Print::write; // pull in write(str) and write(buf, size) from Print - operator bool() { - return initialized; - } - - void attach(void (*fptr)(void)) - { - if (fptr != NULL) { - _rx = mbed::Callback(fptr); - } - } - - template - void send(std::string const &func_name, - Args... args) { - - auto client = new rpc::client(); - client->send(func_name, args...); - delete client; - } - - void setTimeout(uint32_t milliseconds) { - _timeout = milliseconds; - } - - template - RPCLIB_MSGPACK::object_handle call(std::string const &func_name, - Args... args) { - // find a free spot in clients[] - // create new object - // protect this with mutex - - mtx.lock(); - int i = 0; - for (i=0; i<10; i++) { - if (clients[i] == NULL) { - clients[i] = new rpc::client(); - break; - } - } - mtx.unlock(); - - clients[i]->setTimeout(_timeout); - has_timed_out = false; - - // thread start and client .call - clients[i]->call(func_name, args...); - - if (clients[i]->timedOut()) { - has_timed_out = true; - } - RPCLIB_MSGPACK::object_handle ret = std::move(clients[i]->result); - - mtx.lock(); - delete clients[i]; - clients[i] = NULL; - mtx.unlock(); - return ret; - } - - rpc::client* clients[10]; - - bool timedOut() { - return has_timed_out; - } - - private: - RingBufferN<256> rx_buffer; - bool initialized = false; - - static int rpmsg_recv_callback(struct rpmsg_endpoint *ept, void *data, - size_t len, uint32_t src, void *priv); - static int rpmsg_recv_response_callback(struct rpmsg_endpoint *ept, void *data, - size_t len, uint32_t src, void *priv); - - static void new_service_cb(struct rpmsg_device *rdev, const char *name, uint32_t dest); - - void dispatch(); - void response(); - events::EventQueue eventQueue; - mbed::Ticker ticker; - rtos::Thread* eventThread; - rtos::Thread* dispatcherThread; - rtos::Thread* responseThread; - rtos::Mutex mtx; - - mbed::Callback _rx; - - uint32_t _timeout = osWaitForever; - bool has_timed_out = false; - - //rpc::detail::response response; - RPCLIB_MSGPACK::object_handle call_result; - - osThreadId dispatcherThreadId; - osThreadId responseThreadId; + public: + RPCClass() { + for (int i = 0; i< 10; i++) { + clients[i] = NULL; + } + } + int begin(); + void end() { + + } + int available(void) { + return rx_buffer.available(); + } + int peek(void) { + return rx_buffer.peek(); + } + int read(void) { + return rx_buffer.read_char(); + } + void flush(void) { + + } + uint32_t cpu_id() { + return HAL_GetCurrentCPUID(); + } + size_t write(uint8_t c); + size_t write(const uint8_t *buf, size_t len, bool raw = true); + + using Print::write; // pull in write(str) and write(buf, size) from Print + operator bool() { + return initialized; + } + + void attach(void (*fptr)(const uint8_t *buf, size_t len)) { + if (fptr != NULL) { + raw_callback = mbed::Callback(fptr); + } + } + + template + void send(std::string const &func_name, Args... args) { + auto client = new rpc::client(); + client->send(func_name, args...); + delete client; + } + + void setTimeout(uint32_t milliseconds) { + _timeout = milliseconds; + } + + template + RPCLIB_MSGPACK::object_handle call(std::string const &func_name, Args... args) { + // find a free spot in clients[] + // create new object + // protect this with mutex + + int i = 0; + for (i=0; i<10; i++) { + if (clients[i] == NULL) { + clients[i] = new rpc::client(); + break; + } + } + + clients[i]->setTimeout(_timeout); + has_timed_out = false; + + // thread start and client .call + clients[i]->call(func_name, args...); + + if (clients[i]->timedOut()) { + has_timed_out = true; + } + RPCLIB_MSGPACK::object_handle ret = std::move(clients[i]->result); + + delete clients[i]; + clients[i] = NULL; + return ret; + } + + bool timedOut() { + return has_timed_out; + } + + rpc::client* clients[10]; + RingBufferN<512> rx_buffer; + mbed::Callback raw_callback; + + private: + bool initialized = false; + uint32_t _timeout = osWaitForever; + bool has_timed_out = false; + rtos::Thread* eventThread; + RPCLIB_MSGPACK::unpacker unpacker; + + static void new_service_cb(struct rpmsg_device *rdev, const char *name, uint32_t dest); + static int rpmsg_recv_callback(struct rpmsg_endpoint *ept, void *data, size_t len, uint32_t src, void *priv); + void request(uint8_t *buf, size_t len); + void response(uint8_t *buf, size_t len); }; } diff --git a/libraries/RPC/src/RPC_client.h b/libraries/RPC/src/RPC_client.h index b1e0ed34c..64bbf55b1 100644 --- a/libraries/RPC/src/RPC_client.h +++ b/libraries/RPC/src/RPC_client.h @@ -1,3 +1,5 @@ +// Copyright (c) 2024 Arduino SA +// SPDX-License-Identifier: MPL-2.0 #include "Arduino.h" #include "mbed.h" #include "rpc/dispatcher.h" @@ -26,7 +28,7 @@ class client { auto buffer = new RPCLIB_MSGPACK::sbuffer; RPCLIB_MSGPACK::pack(*buffer, call_obj); - send_msgpack(buffer); + write(buffer); auto e = osSignalWait(0, timeout); delete buffer; @@ -58,7 +60,7 @@ class client { auto buffer = new RPCLIB_MSGPACK::sbuffer; RPCLIB_MSGPACK::pack(*buffer, call_obj); - send_msgpack(buffer); + write(buffer); delete buffer; } @@ -81,7 +83,7 @@ class client { private: enum class request_type { call = 0, notification = 2 };; - void send_msgpack(RPCLIB_MSGPACK::sbuffer *buffer); + void write(RPCLIB_MSGPACK::sbuffer *buffer); void getResult(RPCLIB_MSGPACK::object_handle& res); }; } diff --git a/libraries/RPC/src/SerialRPC.cpp b/libraries/RPC/src/SerialRPC.cpp index 1965e0cba..0b2d57348 100644 --- a/libraries/RPC/src/SerialRPC.cpp +++ b/libraries/RPC/src/SerialRPC.cpp @@ -1,3 +1,5 @@ +// Copyright (c) 2024 Arduino SA +// SPDX-License-Identifier: MPL-2.0 #include "SerialRPC.h" #include "RPC.h" @@ -22,4 +24,4 @@ arduino::SerialRPCClass::operator bool() { return RPC; } -arduino::SerialRPCClass SerialRPC; \ No newline at end of file +arduino::SerialRPCClass SerialRPC; diff --git a/libraries/RPC/src/SerialRPC.h b/libraries/RPC/src/SerialRPC.h index e732f19db..7c7a4768c 100644 --- a/libraries/RPC/src/SerialRPC.h +++ b/libraries/RPC/src/SerialRPC.h @@ -1,3 +1,5 @@ +// Copyright (c) 2024 Arduino SA +// SPDX-License-Identifier: MPL-2.0 #ifndef __SERIAL_RPC__ #define __SERIAL_RPC__ @@ -69,4 +71,4 @@ class SerialRPCClass : public Stream { extern arduino::SerialRPCClass SerialRPC; -#endif \ No newline at end of file +#endif diff --git a/libraries/SE05X/src/SE05X.cpp b/libraries/SE05X/src/SE05X.cpp index c9a322bc4..1fb3dfe22 100644 --- a/libraries/SE05X/src/SE05X.cpp +++ b/libraries/SE05X/src/SE05X.cpp @@ -26,7 +26,6 @@ #define SE05X_EC_SIGNATURE_HEADER_LENGTH 6 #define SE05X_EC_SIGNATURE_DER_LENGTH SE05X_EC_SIGNATURE_HEADER_LENGTH + SE05X_EC_SIGNATURE_RAW_LENGTH #define SE05X_SHA256_LENGTH 32 -#define SE05X_SN_LENGTH 18 #define SE05X_DER_BUFFER_SIZE 256 #define SE05X_TEMP_OBJECT 9999 @@ -111,8 +110,6 @@ static void setECSignatureRsValuesInDER(const byte* rawSignature, byte* signatur int SE05XClass::begin() { - sss_status_t status; - memset(&_boot_ctx, 0, sizeof(ex_sss_boot_ctx_t)); se05x_ic_power_on(); @@ -158,17 +155,39 @@ int SE05XClass::readConfiguration(byte data[]) return 1; } +int SE05XClass::serialNumber(byte sn[]) +{ + return serialNumber(sn, SE05X_SN_LENGTH); +} + +int SE05XClass::serialNumber(byte sn[], size_t length) +{ + size_t uidLen = SE05X_SN_LENGTH; + byte UID[SE05X_SN_LENGTH]; + + if(!sn) { + return 0; + } + + sss_status_t status = sss_session_prop_get_au8(&_boot_ctx.session, kSSS_SessionProp_UID, UID, &uidLen); + if ((status != kStatus_SSS_Success)) { + SE05X_PRINT_ERROR("Error in Se05x_API_ReadObject \n"); + return 0; + } + memcpy(sn, UID, length < SE05X_SN_LENGTH ? length : SE05X_SN_LENGTH); + return 1; +} + String SE05XClass::serialNumber() { String result = (char*)NULL; byte UID[SE05X_SN_LENGTH]; - size_t uidLen = 18; - sss_session_prop_get_au8(&_boot_ctx.session, kSSS_SessionProp_UID, UID, &uidLen); + serialNumber(UID, sizeof(UID)); - result.reserve(uidLen*2); + result.reserve(SE05X_SN_LENGTH * 2); - for (int i = 0; i < uidLen; i++) { + for (size_t i = 0; i < SE05X_SN_LENGTH; i++) { byte b = UID[i]; if (b < 16) { @@ -591,8 +610,6 @@ int SE05XClass::deleteAllObjects(void) int SE05XClass::getObjectHandle(int objectId, sss_object_t * object) { - sss_status_t status; - if(kStatus_SSS_Success != sss_key_object_init(object, &_boot_ctx.ks)) { SE05X_PRINT_ERROR("sss_key_object_init Failed"); return 0; diff --git a/libraries/SE05X/src/SE05X.h b/libraries/SE05X/src/SE05X.h index a01eb8b01..e955491ba 100644 --- a/libraries/SE05X/src/SE05X.h +++ b/libraries/SE05X/src/SE05X.h @@ -27,11 +27,13 @@ #include "se05x_APDU.h" #if defined SE05X_PRINT_ERROR_ENABLE -#define SE05X_PRINT_ERROR Serial.println +#define SE05X_PRINT_ERROR(x) Serial.println(x) #else -#define SE05X_PRINT_ERROR +#define SE05X_PRINT_ERROR(x) #endif +#define SE05X_SN_LENGTH 18 + class SE05XClass { public: @@ -41,6 +43,8 @@ class SE05XClass int begin(); void end(); + int serialNumber(byte sn[]); + int serialNumber(byte sn[], size_t length); String serialNumber(); long random(long max); @@ -76,8 +80,8 @@ class SE05XClass int readSlot(int slot, byte data[], int length); int writeSlot(int slot, const byte data[], int length); inline int locked() { return 1; } - inline int writeConfiguration(const byte data[]); - inline int readConfiguration(byte data[]); + int writeConfiguration(const byte data[]); + int readConfiguration(byte data[]); inline int lock() { return 1; } private: diff --git a/libraries/SE05X/src/WiFiSSLSE050Client.cpp b/libraries/SE05X/src/WiFiSSLSE050Client.cpp index e0d78db5d..7a3b88555 100644 --- a/libraries/SE05X/src/WiFiSSLSE050Client.cpp +++ b/libraries/SE05X/src/WiFiSSLSE050Client.cpp @@ -19,13 +19,25 @@ #include "WiFiSSLSE050Client.h" -arduino::WiFiSSLSE050Client::WiFiSSLSE050Client() { - onBeforeConnect(mbed::callback(this, &WiFiSSLSE050Client::setRootCAClientCertKey)); +arduino::MbedSSLSE050Client::MbedSSLSE050Client() { + onBeforeConnect(mbed::callback(this, &MbedSSLSE050Client::setRootCAClientCertKey)); }; -void arduino::WiFiSSLSE050Client::setEccSlot(int KeySlot, const byte cert[], int certLen) { +void arduino::MbedSSLSE050Client::setEccSlot(int KeySlot, const byte cert[], int certLen) { _keySlot = KeySlot; _client_cert_len = certLen; _client_cert = cert; } + +void WiFiSSLSE050Client::setEccSlot(int KeySlot, const byte cert[], int certLen) { + if (!client) { + newMbedClient(); + } + static_cast(client.get())->setEccSlot(KeySlot, cert, certLen); +} + +void WiFiSSLSE050Client::newMbedClient() { + client.reset(new MbedSSLSE050Client()); + client->setNetwork(getNetwork()); +} diff --git a/libraries/SE05X/src/WiFiSSLSE050Client.h b/libraries/SE05X/src/WiFiSSLSE050Client.h index cb223255f..6d3409652 100644 --- a/libraries/SE05X/src/WiFiSSLSE050Client.h +++ b/libraries/SE05X/src/WiFiSSLSE050Client.h @@ -23,18 +23,17 @@ #include "SE05X.h" #include "WiFiSSLClient.h" +#include "MbedSSLClient.h" extern const char CA_CERTIFICATES[]; namespace arduino { -class WiFiSSLSE050Client : public arduino::WiFiSSLClient { +class MbedSSLSE050Client : public arduino::MbedSSLClient { public: - WiFiSSLSE050Client(); - virtual ~WiFiSSLSE050Client() { - stop(); - } + MbedSSLSE050Client(); + void setEccSlot(int KeySlot, const byte cert[], int certLen); private: @@ -49,6 +48,10 @@ class WiFiSSLSE050Client : public arduino::WiFiSSLClient { return 0; } + if(_hostname && !_disableSNI) { + ((TLSSocket*)sock)->set_hostname(_hostname); + } + if( NSAPI_ERROR_OK != ((TLSSocket*)sock)->append_root_ca_cert(_ca_cert_custom)) { return 0; } @@ -57,7 +60,10 @@ class WiFiSSLSE050Client : public arduino::WiFiSSLClient { return 0; } - if( NSAPI_ERROR_OK != ((TLSSocket*)sock)->set_client_cert_key((void*)_client_cert, (size_t)_client_cert_len, &_keyObject, SE05X.getDeviceCtx())) { + if( NSAPI_ERROR_OK != ((TLSSocket*)sock)->set_client_cert_key((void*)_client_cert, + (size_t)_client_cert_len, + &_keyObject, + SE05X.getDeviceCtx())) { return 0; } @@ -65,6 +71,16 @@ class WiFiSSLSE050Client : public arduino::WiFiSSLClient { } }; +class WiFiSSLSE050Client : public arduino::WiFiSSLClient { + +public: + + void setEccSlot(int KeySlot, const byte cert[], int certLen); + +protected: + virtual void newMbedClient(); +}; + } #endif /* WIFISSLSE050CLIENT_H */ diff --git a/libraries/SFU/src/SFU.cpp b/libraries/SFU/src/SFU.cpp index 4f56b536e..b9c1a1a6d 100644 --- a/libraries/SFU/src/SFU.cpp +++ b/libraries/SFU/src/SFU.cpp @@ -21,14 +21,17 @@ int SFU::begin() { if (err) { err = getFileSystem().reformat(&bd); } + return err; } int SFU::download(const char* url) { - // No download at the moment, allow the user to upload a file via mass storage + // No download at the moment, allow the user to upload a file via mass storage + return 0; } int SFU::apply() { - // No autoreboot + // No autoreboot + return 0; } #ifdef ADD_USB_MSD diff --git a/libraries/STM32H747_System/src/STM32H747_System.cpp b/libraries/STM32H747_System/src/STM32H747_System.cpp index e54736b95..8789dfae7 100644 --- a/libraries/STM32H747_System/src/STM32H747_System.cpp +++ b/libraries/STM32H747_System/src/STM32H747_System.cpp @@ -6,7 +6,6 @@ extern RTC_HandleTypeDef RTCHandle; uint8_t STM32H747::readReg(uint8_t subAddress) { - char response = 0xFF; Wire1.beginTransmission(PMIC_ADDRESS); Wire1.write(subAddress); Wire1.endTransmission(false); @@ -115,4 +114,4 @@ bool STM32H747::useInternalOscillator(bool lowspeed) { digitalWrite(PH_1, LOW); return true; -} \ No newline at end of file +} diff --git a/libraries/Scheduler/src/Scheduler.h b/libraries/Scheduler/src/Scheduler.h index fc8999b42..a43b2d4e9 100644 --- a/libraries/Scheduler/src/Scheduler.h +++ b/libraries/Scheduler/src/Scheduler.h @@ -27,12 +27,14 @@ extern "C" { typedef void (*SchedulerParametricTask)(void *); } +// This class exists for only backwards compatibility with arduino-libraries/Scheduler. +// You are encouraged to use mbed::Thread directly rather than using this. class SchedulerClass { public: SchedulerClass(); - void startLoop(SchedulerTask task, uint32_t stackSize = 1024); - void start(SchedulerTask task, uint32_t stackSize = 1024); - void start(SchedulerParametricTask task, void *data, uint32_t stackSize = 1024); + void startLoop(SchedulerTask task, uint32_t stackSize = OS_STACK_SIZE); + void start(SchedulerTask task, uint32_t stackSize = OS_STACK_SIZE); + void start(SchedulerParametricTask task, void *data, uint32_t stackSize = OS_STACK_SIZE); void yield() { ::yield(); }; private: diff --git a/libraries/SocketWrapper/src/AClient.cpp b/libraries/SocketWrapper/src/AClient.cpp new file mode 100644 index 000000000..9ffa9137a --- /dev/null +++ b/libraries/SocketWrapper/src/AClient.cpp @@ -0,0 +1,145 @@ + +#include "AClient.h" +#include "MbedSSLClient.h" + +void arduino::AClient::newMbedClient() { + client.reset(new MbedClient()); + client->setNetwork(getNetwork()); +} + +arduino::AClient::operator bool() { + return client && *client; +} + +void arduino::AClient::setSocket(Socket *sock) { + if (!client) { + newMbedClient(); + } + client->setSocket(sock); +} + +void arduino::AClient::setSocketTimeout(unsigned long timeout) { + if (!client) { + newMbedClient(); + } + client->setSocketTimeout(timeout); +} + +int arduino::AClient::connect(IPAddress ip, uint16_t port) { + if (!client) { + newMbedClient(); + } + return client->connect(ip, port); +} + +int arduino::AClient::connect(const char *host, uint16_t port) { + if (!client) { + newMbedClient(); + } + return client->connect(host, port); +} + +int arduino::AClient::connectSSL(IPAddress ip, uint16_t port) { + if (!client) { + newMbedClient(); + } + return client->connectSSL(ip, port); +} + +int arduino::AClient::connectSSL(const char *host, uint16_t port) { + if (!client) { + newMbedClient(); + } + return client->connectSSL(host, port); +} + +void arduino::AClient::stop() { + if (!client) + return; + client->stop(); +} + +uint8_t arduino::AClient::connected() { + if (!client) + return false; + return client->connected(); +} + +uint8_t arduino::AClient::status() { + if (!client) + return false; + return client->status(); +} + +IPAddress arduino::AClient::remoteIP() { + if (!client) + return INADDR_NONE; + return client->remoteIP(); +} + +uint16_t arduino::AClient::remotePort() { + if (!client) + return 0; + return client->remotePort(); +} + +size_t arduino::AClient::write(uint8_t b) { + if (!client) + return 0; + return client->write(b); +} + +size_t arduino::AClient::write(const uint8_t *buf, size_t size) { + if (!client) + return 0; + return client->write(buf, size); +} + +void arduino::AClient::flush() { + if (!client) + return; + client->flush(); +} + +int arduino::AClient::available() { + if (!client) + return 0; + return client->available(); +} + +int arduino::AClient::read() { + if (!client) + return -1; + return client->read(); +} + +int arduino::AClient::read(uint8_t *buf, size_t size) { + if (!client) + return 0; + return client->read(buf, size); +} + +int arduino::AClient::peek() { + if (!client) + return -1; + return client->peek(); +} + +void arduino::ASslClient::newMbedClient() { + client.reset(new MbedSSLClient()); + client->setNetwork(getNetwork()); +} + +void arduino::ASslClient::disableSNI(bool statusSNI) { + if (!client) { + newMbedClient(); + } + static_cast(client.get())->disableSNI(statusSNI); +} + +void arduino::ASslClient::appendCustomCACert(const char* ca_cert) { + if (!client) { + newMbedClient(); + } + static_cast(client.get())->appendCustomCACert(ca_cert); +} diff --git a/libraries/SocketWrapper/src/AClient.h b/libraries/SocketWrapper/src/AClient.h new file mode 100644 index 000000000..4f72020ee --- /dev/null +++ b/libraries/SocketWrapper/src/AClient.h @@ -0,0 +1,83 @@ +/* + AClient.h - Copyable Client implementation for Mbed Core + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef MBEDACLIENT_H +#define MBEDACLIENT_H + +#include +#include "MbedClient.h" + +namespace arduino { + +class AClient : public Client { +public: + + AClient() {} + + virtual int connect(IPAddress ip, uint16_t port); + virtual int connect(const char *host, uint16_t port); + int connectSSL(IPAddress ip, uint16_t port); + int connectSSL(const char* host, uint16_t port); + virtual void stop(); + + virtual explicit operator bool(); + virtual uint8_t connected(); + uint8_t status(); + + IPAddress remoteIP(); + uint16_t remotePort(); + + virtual size_t write(uint8_t); + virtual size_t write(const uint8_t *buf, size_t size); + virtual void flush(); + + virtual int available(); + virtual int read(); + virtual int read(uint8_t *buf, size_t size); + virtual int peek(); + + using Print::write; + + void setSocketTimeout(unsigned long timeout); + +protected: + friend class EthernetServer; + friend class WiFiServer; + + std::shared_ptr client; + virtual NetworkInterface* getNetwork() = 0; + virtual void newMbedClient(); + void setSocket(Socket* sock); + +}; + +class ASslClient : public AClient { +public: + + ASslClient() {} + + void disableSNI(bool statusSNI); + + void appendCustomCACert(const char* ca_cert); + +protected: + virtual void newMbedClient(); +}; + +} +#endif diff --git a/libraries/SocketWrapper/src/MbedClient.cpp b/libraries/SocketWrapper/src/MbedClient.cpp index 49265c002..296b64943 100644 --- a/libraries/SocketWrapper/src/MbedClient.cpp +++ b/libraries/SocketWrapper/src/MbedClient.cpp @@ -6,25 +6,27 @@ arduino::MbedClient::MbedClient() : _status(false), - _timeout(0) { + _timeout(SOCKET_TIMEOUT) { } uint8_t arduino::MbedClient::status() { - return _status; + return (_status && (getNetwork()->get_connection_status() < NSAPI_STATUS_DISCONNECTED)); } + void arduino::MbedClient::readSocket() { - while (1) { + uint8_t data[SOCKET_BUFFER_SIZE]; + + while (sock != nullptr) { event->wait_any(0xFF, 100); - uint8_t data[SOCKET_BUFFER_SIZE]; int ret = NSAPI_ERROR_WOULD_BLOCK; do { - if (rxBuffer.availableForStore() == 0) { + mutex->lock(); + if (sock != nullptr && rxBuffer.availableForStore() == 0) { + mutex->unlock(); yield(); continue; - } - mutex->lock(); - if (sock == nullptr || (closing && borrowed_socket)) { + } else if (sock == nullptr) { goto cleanup; } ret = sock->recv(data, rxBuffer.availableForStore()); @@ -58,10 +60,9 @@ void arduino::MbedClient::setSocket(Socket *_sock) { } void arduino::MbedClient::configureSocket(Socket *_s) { - _s->set_timeout(_timeout); _s->set_blocking(false); _s->getpeername(&address); - + if (event == nullptr) { event = new rtos::EventFlags; } @@ -79,14 +80,8 @@ void arduino::MbedClient::configureSocket(Socket *_s) { } int arduino::MbedClient::connect(SocketAddress socketAddress) { - - if (sock && reader_th) { - // trying to reuse a connection, let's call stop() to cleanup the state - char c; - if (sock->recv(&c, 1) < 0) { - stop(); - } - } + // if a connection is aready ongoing, a disconnection must be enforced before starting another one + stop(); if (sock == nullptr) { sock = new TCPSocket(); @@ -129,11 +124,14 @@ int arduino::MbedClient::connect(IPAddress ip, uint16_t port) { int arduino::MbedClient::connect(const char *host, uint16_t port) { SocketAddress socketAddress = SocketAddress(); socketAddress.set_port(port); - getNetwork()->gethostbyname(host, &socketAddress); + SocketHelpers::gethostbyname(getNetwork(), host, &socketAddress); return connect(socketAddress); } int arduino::MbedClient::connectSSL(SocketAddress socketAddress) { + // if a connection is aready ongoing, a disconnection must be enforced before starting another one + stop(); + if (sock == nullptr) { sock = new TLSSocket(); _own_socket = true; @@ -188,18 +186,10 @@ int arduino::MbedClient::connectSSL(IPAddress ip, uint16_t port) { return connectSSL(SocketHelpers::socketAddressFromIpAddress(ip, port)); } -int arduino::MbedClient::connectSSL(const char *host, uint16_t port, bool disableSNI) { - if (!disableSNI) { - if (sock == nullptr) { - sock = new TLSSocket(); - _own_socket = true; - } - static_cast(sock)->set_hostname(host); - } - +int arduino::MbedClient::connectSSL(const char *host, uint16_t port) { SocketAddress socketAddress = SocketAddress(); socketAddress.set_port(port); - getNetwork()->gethostbyname(host, &socketAddress); + SocketHelpers::gethostbyname(getNetwork(), host, &socketAddress); return connectSSL(socketAddress); } @@ -211,14 +201,10 @@ size_t arduino::MbedClient::write(const uint8_t *buf, size_t size) { if (sock == nullptr) return 0; - sock->set_blocking(true); - sock->set_timeout(SOCKET_TIMEOUT); - int ret = NSAPI_ERROR_WOULD_BLOCK; - do { - ret = sock->send(buf, size); - } while ((ret != size && ret == NSAPI_ERROR_WOULD_BLOCK) && connected()); - configureSocket(sock); - return size; + sock->set_timeout(_timeout); + int ret = sock->send(buf, size); + sock->set_blocking(false); + return ret >= 0 ? ret : 0; } int arduino::MbedClient::available() { @@ -227,6 +213,8 @@ int arduino::MbedClient::available() { } int arduino::MbedClient::read() { + if (sock == nullptr) + return -1; mutex->lock(); if (!available()) { mutex->unlock(); @@ -239,6 +227,8 @@ int arduino::MbedClient::read() { } int arduino::MbedClient::read(uint8_t *data, size_t len) { + if (sock == nullptr) + return 0; mutex->lock(); int avail = available(); @@ -270,15 +260,15 @@ void arduino::MbedClient::stop() { if (mutex != nullptr) { mutex->lock(); } - if (sock != nullptr && borrowed_socket == false) { + if (sock != nullptr) { if (_own_socket) { delete sock; } else { + sock->set_timeout(_timeout); sock->close(); } sock = nullptr; } - closing = true; if (mutex != nullptr) { mutex->unlock(); } @@ -296,10 +286,11 @@ void arduino::MbedClient::stop() { mutex = nullptr; } _status = false; + rxBuffer.clear(); } uint8_t arduino::MbedClient::connected() { - return _status; + return ((status() == true) || (available() > 0)); } IPAddress arduino::MbedClient::remoteIP() { @@ -310,6 +301,6 @@ uint16_t arduino::MbedClient::remotePort() { return address.get_port(); } -void arduino::MbedClient::setTimeout(unsigned long timeout) { +void arduino::MbedClient::setSocketTimeout(unsigned long timeout) { _timeout = timeout; } diff --git a/libraries/SocketWrapper/src/MbedClient.h b/libraries/SocketWrapper/src/MbedClient.h index eca0e5a34..573c4d5b1 100644 --- a/libraries/SocketWrapper/src/MbedClient.h +++ b/libraries/SocketWrapper/src/MbedClient.h @@ -35,16 +35,7 @@ namespace arduino { -class MbedClient : public arduino::Client { -private: - // Helper for copy constructor and assignment operator - void copyClient(const MbedClient& orig) { - auto _sock = orig.sock; - auto _m = (MbedClient*)&orig; - _m->borrowed_socket = true; - _m->stop(); - this->setSocket(_sock); - } +class MbedClient { public: MbedClient(); @@ -53,31 +44,21 @@ class MbedClient : public arduino::Client { _timeout = timeout; } - // Copy constructor, to be used when a Client returned by server.available() - // needs to "survive" event if it goes out of scope - // Sample usage: Client* new_client = new Client(existing_client) - MbedClient(const MbedClient& orig) { - copyClient(orig); - } - - MbedClient& operator=(const MbedClient& orig) { - copyClient(orig); - return *this; - } - virtual ~MbedClient() { stop(); } + void setNetwork(NetworkInterface* network) {_network = network;} + uint8_t status(); int connect(SocketAddress socketAddress); - int connect(IPAddress ip, uint16_t port); - int connect(const char* host, uint16_t port); + virtual int connect(IPAddress ip, uint16_t port); + virtual int connect(const char* host, uint16_t port); int connectSSL(SocketAddress socketAddress); int connectSSL(IPAddress ip, uint16_t port); - int connectSSL(const char* host, uint16_t port, bool disableSNI = false); + int connectSSL(const char* host, uint16_t port); size_t write(uint8_t); - size_t write(const uint8_t* buf, size_t size) override; + size_t write(const uint8_t* buf, size_t size); int available(); int read(); int read(uint8_t* buf, size_t size); @@ -97,16 +78,16 @@ class MbedClient : public arduino::Client { IPAddress remoteIP(); uint16_t remotePort(); - void setTimeout(unsigned long timeout); + void setSocketTimeout(unsigned long timeout); friend class MbedServer; friend class MbedSSLClient; friend class MbedSocketClass; - using Print::write; - protected: - virtual NetworkInterface* getNetwork() = 0; + NetworkInterface* getNetwork() {return _network;} + + NetworkInterface* _network = nullptr; Socket* sock = nullptr; void onBeforeConnect(mbed::Callback cb) { @@ -114,11 +95,12 @@ class MbedClient : public arduino::Client { } private: + + MbedClient(const MbedClient&) : _timeout(0) {} + RingBufferN rxBuffer; bool _status = false; - bool borrowed_socket = false; bool _own_socket = false; - bool closing = false; mbed::Callback beforeConnect; SocketAddress address; rtos::Thread* reader_th = nullptr; diff --git a/libraries/SocketWrapper/src/MbedSSLClient.cpp b/libraries/SocketWrapper/src/MbedSSLClient.cpp index 3233c8dba..ce4cc9fca 100644 --- a/libraries/SocketWrapper/src/MbedSSLClient.cpp +++ b/libraries/SocketWrapper/src/MbedSSLClient.cpp @@ -1,9 +1,9 @@ #include "MbedSSLClient.h" -arduino::MbedSSLClient::MbedSSLClient(unsigned long timeout): MbedClient(timeout), _disableSNI{false} { - onBeforeConnect(mbed::callback(this, &MbedSSLClient::setRootCA)); -} +arduino::MbedSSLClient::MbedSSLClient() + : _ca_cert_custom(nullptr), + _hostname(nullptr), + _disableSNI(false) { -arduino::MbedSSLClient::MbedSSLClient(): _disableSNI{false} { onBeforeConnect(mbed::callback(this, &MbedSSLClient::setRootCA)); }; diff --git a/libraries/SocketWrapper/src/MbedSSLClient.h b/libraries/SocketWrapper/src/MbedSSLClient.h index ddedcb563..d4c48fc82 100644 --- a/libraries/SocketWrapper/src/MbedSSLClient.h +++ b/libraries/SocketWrapper/src/MbedSSLClient.h @@ -33,8 +33,6 @@ class MbedSSLClient : public arduino::MbedClient { public: MbedSSLClient(); - MbedSSLClient(unsigned long timeout); - virtual ~MbedSSLClient() { stop(); } @@ -43,7 +41,8 @@ class MbedSSLClient : public arduino::MbedClient { return connectSSL(ip, port); } int connect(const char* host, uint16_t port) { - return connectSSL(host, port, _disableSNI); + _hostname = host; + return connectSSL(host, port); } void disableSNI(bool statusSNI) { _disableSNI = statusSNI; @@ -54,7 +53,9 @@ class MbedSSLClient : public arduino::MbedClient { } protected: - const char* _ca_cert_custom = NULL; + const char* _ca_cert_custom; + const char* _hostname; + bool _disableSNI; private: int setRootCA() { @@ -81,13 +82,15 @@ class MbedSSLClient : public arduino::MbedClient { } #endif + if(_hostname && !_disableSNI) { + ((TLSSocket*)sock)->set_hostname(_hostname); + } + if(_ca_cert_custom != NULL) { err = ((TLSSocket*)sock)->append_root_ca_cert(_ca_cert_custom); } return err; } - - bool _disableSNI; }; } diff --git a/libraries/SocketWrapper/src/MbedServer.cpp b/libraries/SocketWrapper/src/MbedServer.cpp index 758c0208c..5f0881d3f 100644 --- a/libraries/SocketWrapper/src/MbedServer.cpp +++ b/libraries/SocketWrapper/src/MbedServer.cpp @@ -5,39 +5,29 @@ uint8_t arduino::MbedServer::status() { return 0; } +void arduino::MbedServer::begin(uint16_t port) { + _port = port; + begin(); +} + void arduino::MbedServer::begin() { if (sock == nullptr) { sock = new TCPSocket(); ((TCPSocket *)sock)->open(getNetwork()); } if (sock) { + int enable = 1; + sock->setsockopt(NSAPI_SOCKET, NSAPI_REUSEADDR, &enable, sizeof(int)); sock->bind(_port); sock->listen(5); sock->set_blocking(false); } } -size_t arduino::MbedServer::write(uint8_t c) { - if (sock) { - sock->send(&c, 1); - return 1; - } - return 0; -} - -size_t arduino::MbedServer::write(const uint8_t *buf, size_t size) { - if (sock) { - sock->send(buf, size); - return size; - } - return 0; -} - - // MUST be reimplemented (just copy/paste and replace MbedClient to *Client) since MbedClient is abstract /* -arduino::MbedClient arduino::MbedServer::available(uint8_t* status) { +arduino::MbedClient arduino::MbedServer::accept(uint8_t* status) { MbedClient client; nsapi_error_t error; if (sock == nullptr) { diff --git a/libraries/SocketWrapper/src/MbedServer.h b/libraries/SocketWrapper/src/MbedServer.h index 23017e296..c6a844e15 100644 --- a/libraries/SocketWrapper/src/MbedServer.h +++ b/libraries/SocketWrapper/src/MbedServer.h @@ -30,7 +30,7 @@ namespace arduino { class MbedClient; -class MbedServer : public arduino::Server { +class MbedServer { protected: virtual NetworkInterface *getNetwork() = 0; @@ -38,23 +38,26 @@ class MbedServer : public arduino::Server { uint16_t _port; public: + MbedServer() + : _port(80){}; MbedServer(uint16_t port) : _port(port){}; virtual ~MbedServer() { + end(); + } + void end() { if (sock) { delete sock; sock = nullptr; } } + void begin(uint16_t port); void begin(); - virtual size_t write(uint8_t); - virtual size_t write(const uint8_t *buf, size_t size); uint8_t status(); - - //virtual MbedClient available(uint8_t* status) = 0; - - using Print::write; + explicit operator bool() { + return sock != nullptr; + } friend class MbedSocketClass; friend class MbedClient; diff --git a/libraries/SocketWrapper/src/MbedUdp.cpp b/libraries/SocketWrapper/src/MbedUdp.cpp index 2a02daee1..56d40f06f 100644 --- a/libraries/SocketWrapper/src/MbedUdp.cpp +++ b/libraries/SocketWrapper/src/MbedUdp.cpp @@ -42,7 +42,7 @@ uint8_t arduino::MbedUDP::beginMulticast(IPAddress ip, uint16_t port) { SocketAddress socketAddress = SocketHelpers::socketAddressFromIpAddress(ip, port); if (_socket.join_multicast_group(socketAddress) != NSAPI_ERROR_OK) { - printf("Error joining the multicast group\n"); + //printf("Error joining the multicast group\n"); return 0; } @@ -63,7 +63,7 @@ int arduino::MbedUDP::beginPacket(IPAddress ip, uint16_t port) { int arduino::MbedUDP::beginPacket(const char *host, uint16_t port) { _host = SocketAddress(host, port); txBuffer.clear(); - getNetwork()->gethostbyname(host, &_host); + SocketHelpers::gethostbyname(getNetwork(), host, &_host); //If IP is null and port is 0 the initialization failed return (_host.get_ip_address() == nullptr && _host.get_port() == 0) ? 0 : 1; } diff --git a/libraries/SocketWrapper/src/SocketHelpers.cpp b/libraries/SocketWrapper/src/SocketHelpers.cpp index f40f76348..9360f9988 100644 --- a/libraries/SocketWrapper/src/SocketHelpers.cpp +++ b/libraries/SocketWrapper/src/SocketHelpers.cpp @@ -1,19 +1,33 @@ #include "SocketHelpers.h" +#include uint8_t* arduino::MbedSocketClass::macAddress(uint8_t* mac) { const char* mac_str = getNetwork()->get_mac_address(); for (int b = 0; b < 6; b++) { uint32_t tmp; sscanf(&mac_str[b * 2 + (b)], "%02x", (unsigned int*)&tmp); - mac[5 - b] = (uint8_t)tmp; + mac[b] = (uint8_t)tmp; } - //sscanf(mac_str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx", &mac[5], &mac[4], &mac[3], &mac[2], &mac[1], &mac[0]); return mac; } +String arduino::MbedSocketClass::macAddress() { + const char* mac_str = getNetwork()->get_mac_address(); + if (!mac_str) { + return String("ff:ff:ff:ff:ff:ff"); + } + return String(mac_str); +} + +int arduino::MbedSocketClass::setHostname(const char* hostname) { + NetworkInterface* interface = getNetwork(); + interface->set_hostname(hostname); + return 1; +} + int arduino::MbedSocketClass::hostByName(const char* aHostname, IPAddress& aResult) { SocketAddress socketAddress = SocketAddress(); - nsapi_error_t returnCode = getNetwork()->gethostbyname(aHostname, &socketAddress); + nsapi_error_t returnCode = gethostbyname(getNetwork(), aHostname, &socketAddress); nsapi_addr_t address = socketAddress.get_addr(); aResult[0] = address.bytes[0]; aResult[1] = address.bytes[1]; @@ -46,20 +60,43 @@ arduino::IPAddress arduino::MbedSocketClass::gatewayIP() { arduino::IPAddress arduino::MbedSocketClass::dnsServerIP() { SocketAddress ip; NetworkInterface* interface = getNetwork(); - interface->get_dns_server(0, &ip, nullptr); + char _if_name[5] {}; + interface->get_interface_name(_if_name); + interface->get_dns_server(0, &ip, _if_name); return ipAddressFromSocketAddress(ip); } arduino::IPAddress arduino::MbedSocketClass::dnsIP(int n) { SocketAddress ip; NetworkInterface* interface = getNetwork(); - interface->get_dns_server(n, &ip, nullptr); + char _if_name[5] {}; + interface->get_interface_name(_if_name); + interface->get_dns_server(n, &ip, _if_name); return ipAddressFromSocketAddress(ip); } +int arduino::MbedSocketClass::ping(const char *hostname, uint8_t ttl) +{ + SocketAddress socketAddress; + gethostbyname(getNetwork(),hostname, &socketAddress); + return ping(socketAddress, ttl); +} + +int arduino::MbedSocketClass::ping(const String &hostname, uint8_t ttl) +{ + return ping(hostname.c_str(), ttl); +} + +int arduino::MbedSocketClass::ping(IPAddress host, uint8_t ttl) +{ + SocketAddress socketAddress = socketAddressFromIpAddress(host, 0); + return ping(socketAddress, ttl); +} + void arduino::MbedSocketClass::config(arduino::IPAddress local_ip) { - nsapi_addr_t convertedIP = { NSAPI_IPv4, { local_ip[0], local_ip[1], local_ip[2], local_ip[3] } }; - _ip = SocketAddress(convertedIP); + IPAddress dns = local_ip; + dns[3] = 1; + config(local_ip, dns); } void arduino::MbedSocketClass::config(const char* local_ip) { @@ -67,20 +104,27 @@ void arduino::MbedSocketClass::config(const char* local_ip) { } void arduino::MbedSocketClass::config(IPAddress local_ip, IPAddress dns_server) { - config(local_ip); - setDNS(dns_server); + IPAddress gw = local_ip; + gw[3] = 1; + config(local_ip, dns_server, gw); } void arduino::MbedSocketClass::config(IPAddress local_ip, IPAddress dns_server, IPAddress gateway) { - config(local_ip, dns_server); - nsapi_addr_t convertedGatewayIP = { NSAPI_IPv4, { gateway[0], gateway[1], gateway[2], gateway[3] } }; - _gateway = SocketAddress(convertedGatewayIP); + IPAddress nm(255, 255, 255, 0); + config(local_ip, dns_server, gateway, nm); } void arduino::MbedSocketClass::config(IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet) { - config(local_ip, dns_server, gateway); + _useStaticIP = (local_ip != INADDR_NONE); + if (!_useStaticIP) + return; + nsapi_addr_t convertedIP = { NSAPI_IPv4, { local_ip[0], local_ip[1], local_ip[2], local_ip[3] } }; + _ip = SocketAddress(convertedIP); + nsapi_addr_t convertedGatewayIP = { NSAPI_IPv4, { gateway[0], gateway[1], gateway[2], gateway[3] } }; + _gateway = SocketAddress(convertedGatewayIP); nsapi_addr_t convertedSubnetMask = { NSAPI_IPv4, { subnet[0], subnet[1], subnet[2], subnet[3] } }; _netmask = SocketAddress(convertedSubnetMask); + setDNS(dns_server); } void arduino::MbedSocketClass::setDNS(IPAddress dns_server1) { @@ -94,6 +138,22 @@ void arduino::MbedSocketClass::setDNS(IPAddress dns_server1, IPAddress dns_serve _dnsServer2 = SocketAddress(convertedDNSServer2); } +int arduino::MbedSocketClass::ping(SocketAddress &socketAddress, uint8_t ttl, uint32_t timeout) +{ + /* ttl is not supported by mbed ICMPSocket. Default value used is 255 */ + (void)ttl; + int response = -1; +#if MBED_CONF_LWIP_RAW_SOCKET_ENABLED + ICMPSocket s; + s.set_timeout(timeout); + s.open(getNetwork()); + response = s.ping(socketAddress, timeout); + s.close(); +#endif + + return response; +} + arduino::IPAddress arduino::MbedSocketClass::ipAddressFromSocketAddress(SocketAddress socketAddress) { nsapi_addr_t address = socketAddress.get_addr(); return IPAddress(address.bytes[0], address.bytes[1], address.bytes[2], address.bytes[3]); @@ -104,6 +164,15 @@ SocketAddress arduino::MbedSocketClass::socketAddressFromIpAddress(arduino::IPAd return SocketAddress(convertedIP, port); } +nsapi_error_t arduino::MbedSocketClass::gethostbyname(NetworkInterface* interface, const char* aHostname, SocketAddress* socketAddress) { + char ifname[5] {}; + interface->get_interface_name(ifname); + nsapi_version_t version = NSAPI_IPv4; +#if MBED_CONF_LWIP_IPV6_ENABLED + version = NSAPI_UNSPEC; +#endif + return interface->gethostbyname(aHostname, socketAddress, version, ifname); +} // Download helper @@ -121,29 +190,44 @@ void MbedSocketClass::feedWatchdog() { void MbedSocketClass::body_callback(const char* data, uint32_t data_len) { feedWatchdog(); - fwrite(data, 1, data_len, download_target); + fwrite(data, sizeof(data[0]), data_len, download_target); } -int MbedSocketClass::download(char* url, const char* target_file, bool const is_https) { +int MbedSocketClass::download(const char* url, const char* target_file, bool const is_https) { download_target = fopen(target_file, "wb"); + int res = this->download(url, is_https, mbed::callback(this, &MbedSocketClass::body_callback)); + + fclose(download_target); + download_target = nullptr; + + return res; +} + +int MbedSocketClass::download(const char* url, bool const is_https, mbed::Callback cbk) { + if(cbk == nullptr) { + return 0; // a call back must be set + } + HttpRequest* req_http = nullptr; HttpsRequest* req_https = nullptr; HttpResponse* rsp = nullptr; + int res=0; + std::vector header_fields; if (is_https) { - req_https = new HttpsRequest(getNetwork(), nullptr, HTTP_GET, url, mbed::callback(this, &MbedSocketClass::body_callback)); + req_https = new HttpsRequest(getNetwork(), nullptr, HTTP_GET, url, cbk); rsp = req_https->send(NULL, 0); if (rsp == NULL) { - fclose(download_target); - return req_https->get_error(); + res = req_https->get_error(); + goto exit; } } else { - req_http = new HttpRequest(getNetwork(), HTTP_GET, url, mbed::callback(this, &MbedSocketClass::body_callback)); + req_http = new HttpRequest(getNetwork(), HTTP_GET, url, cbk); rsp = req_http->send(NULL, 0); if (rsp == NULL) { - fclose(download_target); - return req_http->get_error(); + res = req_http->get_error(); + goto exit; } } @@ -151,7 +235,21 @@ int MbedSocketClass::download(char* url, const char* target_file, bool const is_ delay(10); } - int const size = ftell(download_target); - fclose(download_target); - return size; + // find the header containing the "Content-Length" value and return that + header_fields = rsp->get_headers_fields(); + for(int i=0; ic_str(), "Content-Length") == 0) { + res = std::stoi(*rsp->get_headers_values()[i]); + break; + } + } + +exit: + if(req_http) delete req_http; + if(req_https) delete req_https; + // no need to delete rsp, it is already deleted by deleting the request + // this may be harmful since it can allow dangling pointers existence + + return res; } diff --git a/libraries/SocketWrapper/src/SocketHelpers.h b/libraries/SocketWrapper/src/SocketHelpers.h index eea38386d..e285d166c 100644 --- a/libraries/SocketWrapper/src/SocketHelpers.h +++ b/libraries/SocketWrapper/src/SocketHelpers.h @@ -28,92 +28,142 @@ class MbedSocketClass { void config(IPAddress local_ip); /* Change Ip configuration settings disabling the dhcp client - * - * param local_ip: Static ip configuration as string - */ + * + * param local_ip: Static ip configuration as string + */ void config(const char* local_ip); /* Change Ip configuration settings disabling the dhcp client - * - * param local_ip: Static ip configuration - * param dns_server: IP configuration for DNS server 1 - */ + * + * param local_ip: Static ip configuration + * param dns_server: IP configuration for DNS server 1 + */ void config(IPAddress local_ip, IPAddress dns_server); /* Change Ip configuration settings disabling the dhcp client - * - * param local_ip: Static ip configuration - * param dns_server: IP configuration for DNS server 1 - * param gateway : Static gateway configuration - */ + * + * param local_ip: Static ip configuration + * param dns_server: IP configuration for DNS server 1 + * param gateway : Static gateway configuration + */ void config(IPAddress local_ip, IPAddress dns_server, IPAddress gateway); /* Change Ip configuration settings disabling the dhcp client - * - * param local_ip: Static ip configuration - * param dns_server: IP configuration for DNS server 1 - * param gateway: Static gateway configuration - * param subnet: Static Subnet mask - */ + * + * param local_ip: Static ip configuration + * param dns_server: IP configuration for DNS server 1 + * param gateway: Static gateway configuration + * param subnet: Static Subnet mask + */ void config(IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet); + // When using DHCP the hostname provided will be used. + int setHostname(const char* hostname); + /* Change DNS Ip configuration - * - * param dns_server1: ip configuration for DNS server 1 - */ + * + * param dns_server1: ip configuration for DNS server 1 + */ void setDNS(IPAddress dns_server1); /* Change DNS Ip configuration - * - * param dns_server1: ip configuration for DNS server 1 - * param dns_server2: ip configuration for DNS server 2 - * - */ + * + * param dns_server1: ip configuration for DNS server 1 + * param dns_server2: ip configuration for DNS server 2 + * + */ void setDNS(IPAddress dns_server1, IPAddress dns_server2); /* - * Get the interface IP address. - * - * return: Ip address value - */ + * Get the interface IP address. + * + * return: Ip address value + */ IPAddress localIP(); /* - * Get the interface subnet mask address. - * - * return: subnet mask address value - */ + * Get the interface subnet mask address. + * + * return: subnet mask address value + */ IPAddress subnetMask(); /* - * Get the gateway ip address. - * - * return: gateway ip address value - */ + * Get the gateway ip address. + * + * return: gateway ip address value + */ IPAddress gatewayIP(); /* - * Get the DNS Server ip address. - * - * return: DNS Server ip address value - */ + * Get the DNS Server ip address. + * + * return: DNS Server ip address value + */ IPAddress dnsServerIP(); /* - * Get the DNS Server ip address. - * - * return: DNS Server ip address value - */ + * Get the DNS Server ip address. + * + * return: DNS Server ip address value + */ IPAddress dnsIP(int n = 0); virtual NetworkInterface* getNetwork() = 0; - int download(char* url, const char* target, bool const is_https = false); + /* + * Ping the specified target. + * + * ttl value is unused, but kept for API compatibility + * + * return: RTT in milliseconds or -1 on error + */ + int ping(const char* hostname, uint8_t ttl = 255); + int ping(const String &hostname, uint8_t ttl = 255); + int ping(IPAddress host, uint8_t ttl = 255); + + /* + * Download a file from an HTTP endpoint and save it in the provided `target` location on the fs + * The parameter cbk can be used to perform actions on the buffer before saving on the fs + * + * return: on success the size of the downloaded file, on error -status code + */ + int download( + const char* url, const char* target, bool const is_https = false); + /* + * Download a file from an HTTP endpoint and handle the body of the request on a callback + * passed as an argument + * + * return: on success the size of the downloaded file, on error -status code + */ + int download( + const char* url, bool const is_https = false, + mbed::Callback cbk = nullptr); int hostByName(const char* aHostname, IPAddress& aResult); + /* + * Get the interface MAC address. + * + * Network interface should be ready to get a valid mac address. + * Call WiFi.begin("",""); or Ethernet.begin(); before issuing a mac address + * request, otherwhise returned value will be ff:ff:ff:ff:ff:ff + * + * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + */ uint8_t* macAddress(uint8_t* mac); + /* + * Get the interface MAC address String. + * + * Network interface should be ready to get a valid MAC address. + * Call WiFi.begin("",""); or Ethernet.begin(); before issuing a mac address + * request, otherwhise returned value will be ff:ff:ff:ff:ff:ff + * + * return: MAC Address String + */ + String macAddress(); + void setFeedWatchdogFunc(voidFuncPtr func); void feedWatchdog(); @@ -127,6 +177,7 @@ class MbedSocketClass { SocketAddress _netmask = nullptr; SocketAddress _dnsServer1 = nullptr; SocketAddress _dnsServer2 = nullptr; + bool _useStaticIP = false; voidFuncPtr _feed_watchdog_func = nullptr; @@ -134,8 +185,10 @@ class MbedSocketClass { void body_callback(const char* data, uint32_t data_len); + int ping(SocketAddress &socketAddress, uint8_t ttl, uint32_t timeout = 5000); static arduino::IPAddress ipAddressFromSocketAddress(SocketAddress socketAddress); static SocketAddress socketAddressFromIpAddress(arduino::IPAddress ip, uint16_t port); + static nsapi_error_t gethostbyname(NetworkInterface* interface, const char* aHostname, SocketAddress* socketAddress); }; using SocketHelpers = MbedSocketClass; diff --git a/libraries/SocketWrapper/src/utility/wl_definitions.h b/libraries/SocketWrapper/src/utility/wl_definitions.h deleted file mode 100644 index 9ea1f9fe4..000000000 --- a/libraries/SocketWrapper/src/utility/wl_definitions.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - wl_definitions.h - Library for Arduino Wifi shield. - Copyright (c) 2011-2014 Arduino. All right reserved. - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ -/* - * wl_definitions.h - * - * Created on: Mar 6, 2011 - * Author: dlafauci - */ - -#ifndef WL_DEFINITIONS_H_ -#define WL_DEFINITIONS_H_ - -// Maximum size of a SSID -#define WL_SSID_MAX_LENGTH 32 -// Length of passphrase. Valid lengths are 8-63. -#define WL_WPA_KEY_MAX_LENGTH 63 -// Length of key in bytes. Valid values are 5 and 13. -#define WL_WEP_KEY_MAX_LENGTH 13 -// Size of a MAC-address or BSSID -#define WL_MAC_ADDR_LENGTH 6 -// Size of a MAC-address or BSSID -#define WL_IPV4_LENGTH 4 -// Maximum size of a SSID list -#define WL_NETWORKS_LIST_MAXNUM 10 -// Maxmium number of socket -#define MAX_SOCK_NUM 4 -// Socket not available constant -#define SOCK_NOT_AVAIL 255 -// Default state value for Wifi state field -#define NA_STATE -1 -//Maximum number of attempts to establish wifi connection -#define WL_MAX_ATTEMPT_CONNECTION 10 - -typedef enum { - WL_NO_SHIELD = 255, - WL_NO_MODULE = 255, - WL_IDLE_STATUS = 0, - WL_NO_SSID_AVAIL, - WL_SCAN_COMPLETED, - WL_CONNECTED, - WL_CONNECT_FAILED, - WL_CONNECTION_LOST, - WL_DISCONNECTED, - WL_AP_LISTENING, - WL_AP_CONNECTED, - WL_AP_FAILED -} wl_status_t; - -/* Encryption modes */ -enum wl_enc_type { /* Values map to 802.11 encryption suites... */ - ENC_TYPE_WEP = 5, - ENC_TYPE_TKIP = 2, - ENC_TYPE_CCMP = 4, - /* ... except these two, 7 and 8 are reserved in 802.11-2007 */ - ENC_TYPE_NONE = 7, - ENC_TYPE_UNKNOWN = 9, - ENC_TYPE_AUTO = 8 -}; - -#if defined(ARDUINO_PORTENTA_H7_M7) -#include "whd_version.h" -#define WIFI_FIRMWARE_LATEST_VERSION WHD_VERSION -#endif - -#endif /* WL_DEFINITIONS_H_ */ diff --git a/libraries/SocketWrapper/src/utility/wl_types.h b/libraries/SocketWrapper/src/utility/wl_types.h deleted file mode 100644 index 65f8caae2..000000000 --- a/libraries/SocketWrapper/src/utility/wl_types.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - wl_types.h - Library for Arduino Wifi shield. - Copyright (c) 2011-2014 Arduino. All right reserved. - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ -/* - * wl_types.h - * - * Created on: Jul 30, 2010 - * Author: dlafauci - */ - - -#ifndef _WL_TYPES_H_ -#define _WL_TYPES_H_ - -#include - -typedef enum { - WL_FAILURE = -1, - WL_SUCCESS = 1, -} wl_error_code_t; - -/* Authentication modes */ -enum wl_auth_mode { - AUTH_MODE_INVALID, - AUTH_MODE_AUTO, - AUTH_MODE_OPEN_SYSTEM, - AUTH_MODE_SHARED_KEY, - AUTH_MODE_WPA, - AUTH_MODE_WPA2, - AUTH_MODE_WPA_PSK, - AUTH_MODE_WPA2_PSK -}; - -typedef enum { - WL_PING_DEST_UNREACHABLE = -1, - WL_PING_TIMEOUT = -2, - WL_PING_UNKNOWN_HOST = -3, - WL_PING_ERROR = -4 -} wl_ping_result_t; - -#endif //_WL_TYPES_H_ \ No newline at end of file diff --git a/libraries/USBHOST/src/USB251xB.cpp b/libraries/USBHOST/src/USB251xB.cpp index 48b34813a..55953771a 100644 --- a/libraries/USBHOST/src/USB251xB.cpp +++ b/libraries/USBHOST/src/USB251xB.cpp @@ -133,8 +133,8 @@ void write_hub_configuration(struct usb251xb* hub) { wbuf[0] = USB251XB_I2C_WRITE_SZ; memcpy(&wbuf[1], &i2c_wb[offset], USB251XB_I2C_WRITE_SZ); - printf("writing %d byte block %d to 0x%02X\n", - USB251XB_I2C_WRITE_SZ, i, offset); + //printf("writing %d byte block %d to 0x%02X\n", + // USB251XB_I2C_WRITE_SZ, i, offset); Wire.beginTransmission(0x2C); Wire.write(offset); diff --git a/libraries/WiFi/examples/AP_SimpleWebServer/AP_SimpleWebServer.ino b/libraries/WiFi/examples/AP_SimpleWebServer/AP_SimpleWebServer.ino new file mode 100644 index 000000000..8dc0678b8 --- /dev/null +++ b/libraries/WiFi/examples/AP_SimpleWebServer/AP_SimpleWebServer.ino @@ -0,0 +1,152 @@ +/* + WiFi Web Server LED Blink + + A simple web server that lets you blink an LED via the web. + This sketch will create a new access point (with no password). + It will then launch a new server and print out the IP address + to the Serial Monitor. From there, you can open that address in a web browser + to turn on and off the LED on pin 13. + + If the IP address of your board is yourAddress: + http://yourAddress/H turns the LED on + http://yourAddress/L turns it off + + created 25 Nov 2012 + by Tom Igoe + adapted to WiFi AP by Adafruit + */ + +#include +#include "arduino_secrets.h" +///////please enter your sensitive data in the Secret tab/arduino_secrets.h +char ssid[] = SECRET_SSID; // your network SSID (name) +char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP) +int keyIndex = 0; // your network key index number (needed only for WEP) + +int led = LED_BUILTIN; +int status = WL_IDLE_STATUS; +WiFiServer server(80); + +void setup() { + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + Serial.println("Access Point Web Server"); + + pinMode(led, OUTPUT); // set the LED pin mode + + // check for the WiFi module: + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with WiFi module failed!"); + // don't continue + while (true); + } + + WiFi.config(IPAddress(10, 0, 0, 1)); + + // print the network name (SSID); + Serial.print("Creating access point named: "); + Serial.println(ssid); + + // Create open network. Change this line if you want to create an open network: + status = WiFi.beginAP(ssid, pass); + if (status != WL_AP_LISTENING) { + Serial.println("Creating access point failed"); + // don't continue + while (true); + } + + // start the web server on port 80 + server.begin(); + + // you're connected now, so print out the status + printWiFiStatus(); +} + + +void loop() { + // compare the previous status to the current status + if (status != WiFi.status()) { + // it has changed update the variable + status = WiFi.status(); + + if (status == WL_AP_CONNECTED) { + // a device has connected to the AP + Serial.println("Device connected to AP"); + } else { + // a device has disconnected from the AP, and we are back in listening mode + Serial.println("Device disconnected from AP"); + } + } + + WiFiClient client = server.accept(); // listen for incoming clients + + if (client) { // if you get a client, + Serial.println("new client"); // print a message out the serial port + String currentLine = ""; // make a String to hold incoming data from the client + while (client.connected()) { // loop while the client's connected + delayMicroseconds(10); // This is required for the Arduino Nano RP2040 Connect - otherwise it will loop so fast that SPI will never be served. + if (client.available()) { // if there's bytes to read from the client, + char c = client.read(); // read a byte, then + Serial.write(c); // print it out to the serial monitor + if (c == '\n') { // if the byte is a newline character + + // if the current line is blank, you got two newline characters in a row. + // that's the end of the client HTTP request, so send a response: + if (currentLine.length() == 0) { + // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) + // and a content-type so the client knows what's coming, then a blank line: + client.println("HTTP/1.1 200 OK"); + client.println("Content-type:text/html"); + client.println(); + + // the content of the HTTP response follows the header: + client.print("Click here turn the LED on
"); + client.print("Click here turn the LED off
"); + + // The HTTP response ends with another blank line: + client.println(); + // break out of the while loop: + break; + } + else { // if you got a newline, then clear currentLine: + currentLine = ""; + } + } + else if (c != '\r') { // if you got anything else but a carriage return character, + currentLine += c; // add it to the end of the currentLine + } + + // Check to see if the client request was "GET /H" or "GET /L": + if (currentLine.endsWith("GET /H")) { + digitalWrite(led, HIGH); // GET /H turns the LED on + } + if (currentLine.endsWith("GET /L")) { + digitalWrite(led, LOW); // GET /L turns the LED off + } + } + } + // close the connection: + client.stop(); + Serial.println("client disconnected"); + } +} + +void printWiFiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your WiFi shield's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print where to go in a browser: + Serial.print("To see this page in action, open a browser to http://"); + Serial.println(ip); + +} diff --git a/libraries/WiFi/examples/AP_SimpleWebServer/arduino_secrets.h b/libraries/WiFi/examples/AP_SimpleWebServer/arduino_secrets.h new file mode 100644 index 000000000..493b719ca --- /dev/null +++ b/libraries/WiFi/examples/AP_SimpleWebServer/arduino_secrets.h @@ -0,0 +1,3 @@ +// Both SSID and password must be 8 characters or longer +#define SECRET_SSID "" +#define SECRET_PASS "" diff --git a/libraries/WiFi/examples/ScanNetworksAdvanced/ScanNetworksAdvanced.ino b/libraries/WiFi/examples/ScanNetworksAdvanced/ScanNetworksAdvanced.ino new file mode 100644 index 000000000..51326b98c --- /dev/null +++ b/libraries/WiFi/examples/ScanNetworksAdvanced/ScanNetworksAdvanced.ino @@ -0,0 +1,132 @@ +/* + This example prints the board's MAC address, and + scans for available WiFi networks using the NINA module. + Every ten seconds, it scans again. It doesn't actually + connect to any network, so no encryption scheme is specified. + BSSID and WiFi channel are printed + + This example is based on ScanNetworks + + created 1 Mar 2017 + by Arturo Guadalupi +*/ + + + +#include + +void setup() { + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the WiFi module: + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with WiFi module failed!"); + // don't continue + while (true); + } + + // scan for existing networks: + Serial.println(); + Serial.println("Scanning available networks..."); + listNetworks(); + + // print your MAC address: + byte mac[6]; + WiFi.macAddress(mac); + Serial.print("MAC: "); + printMacAddress(mac); +} + +void loop() { + delay(10000); + // scan for existing networks: + Serial.println("Scanning available networks..."); + listNetworks(); +} + +void listNetworks() { + // scan for nearby networks: + Serial.println("** Scan Networks **"); + int numSsid = WiFi.scanNetworks(); + if (numSsid == -1) + { + Serial.println("Couldn't get a WiFi connection"); + while (true); + } + + // print the list of networks seen: + Serial.print("number of available networks: "); + Serial.println(numSsid); + + // print the network number and name for each network found: + for (int thisNet = 0; thisNet < numSsid; thisNet++) { + Serial.print(thisNet + 1); + Serial.print(") "); + Serial.print("Signal: "); + Serial.print(WiFi.RSSI(thisNet)); + Serial.print(" dBm"); + Serial.print("\tChannel: "); + Serial.print(WiFi.channel(thisNet)); + byte bssid[6]; + Serial.print("\t\tBSSID: "); + printMacAddress(WiFi.BSSID(thisNet, bssid)); + Serial.print("\tEncryption: "); + printEncryptionType(WiFi.encryptionType(thisNet)); + Serial.print("\t\tSSID: "); + Serial.println(WiFi.SSID(thisNet)); + Serial.flush(); + } + Serial.println(); +} + +void printEncryptionType(int thisType) { + // read the encryption type and print out the name: + switch (thisType) { + case ENC_TYPE_WEP: + Serial.print("WEP"); + break; + case ENC_TYPE_WPA: + Serial.print("WPA"); + break; + case ENC_TYPE_WPA2: + Serial.print("WPA2"); + break; + case ENC_TYPE_NONE: + Serial.print("None"); + break; + case ENC_TYPE_AUTO: + Serial.print("Auto"); + break; + case ENC_TYPE_WPA3: + Serial.print("WPA3"); + break; + case ENC_TYPE_UNKNOWN: + default: + Serial.print("Unknown"); + break; + } +} + +void print2Digits(byte thisByte) { + if (thisByte < 0xF) { + Serial.print("0"); + } + Serial.print(thisByte, HEX); +} + +void printMacAddress(byte mac[]) { + for (int i = 0; i < 6; i++) { + if (i > 0) { + Serial.print(":"); + } + if (mac[i] < 16) { + Serial.print("0"); + } + Serial.print(mac[i], HEX); + } + Serial.println(); +} diff --git a/libraries/WiFi/examples/SimpleWebServerWiFi/SimpleWebServerWiFi.ino b/libraries/WiFi/examples/SimpleWebServerWiFi/SimpleWebServerWiFi.ino new file mode 100644 index 000000000..5fe110116 --- /dev/null +++ b/libraries/WiFi/examples/SimpleWebServerWiFi/SimpleWebServerWiFi.ino @@ -0,0 +1,130 @@ +/* + WiFi Web Server LED Blink + + A simple web server that lets you blink an LED via the web. + This sketch will print the IP address of your WiFi module (once connected) + to the Serial Monitor. From there, you can open that address in a web browser + to turn on and off the LED on pin 9. + + If the IP address of your board is yourAddress: + http://yourAddress/H turns the LED on + http://yourAddress/L turns it off + + This example is written for a network using WPA encryption. For + WEP or WPA, change the WiFi.begin() call accordingly. + + Circuit: + * Board with WiFi + * LED attached to pin 9 + + created 25 Nov 2012 + by Tom Igoe + */ + +#include + +#include "arduino_secrets.h" +///////please enter your sensitive data in the Secret tab/arduino_secrets.h +char ssid[] = SECRET_SSID; // your network SSID (name) +char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP) +int keyIndex = 0; // your network key index number (needed only for WEP) + +int status = WL_IDLE_STATUS; +WiFiServer server(80); + +void setup() { + Serial.begin(9600); // initialize serial communication + pinMode(LED_BUILTIN, OUTPUT); // set the LED pin mode + + // check for the WiFi module: + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with WiFi module failed!"); + // don't continue + while (true); + } + + // attempt to connect to WiFi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to Network named: "); + Serial.println(ssid); // print the network name (SSID); + + // Connect to WPA/WPA2 network. Change this line if using open or WEP network: + status = WiFi.begin(ssid, pass); + // wait 3 seconds for connection: + delay(3000); + } + server.begin(); // start the web server on port 80 + printWifiStatus(); // you're connected now, so print out the status +} + + +void loop() { + WiFiClient client = server.accept(); // listen for incoming clients + + if (client) { // if you get a client, + Serial.println("new client"); // print a message out the serial port + String currentLine = ""; // make a String to hold incoming data from the client + while (client.connected()) { // loop while the client's connected + if (client.available()) { // if there's bytes to read from the client, + char c = client.read(); // read a byte, then + Serial.write(c); // print it out to the serial monitor + if (c == '\n') { // if the byte is a newline character + + // if the current line is blank, you got two newline characters in a row. + // that's the end of the client HTTP request, so send a response: + if (currentLine.length() == 0) { + // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) + // and a content-type so the client knows what's coming, then a blank line: + client.println("HTTP/1.1 200 OK"); + client.println("Content-type:text/html"); + client.println(); + + // the content of the HTTP response follows the header: + client.print("Click here turn the LED on
"); + client.print("Click here turn the LED off
"); + + // The HTTP response ends with another blank line: + client.println(); + // break out of the while loop: + break; + } else { // if you got a newline, then clear currentLine: + currentLine = ""; + } + } else if (c != '\r') { // if you got anything else but a carriage return character, + currentLine += c; // add it to the end of the currentLine + } + + // Check to see if the client request was "GET /H" or "GET /L": + if (currentLine.endsWith("GET /H")) { + digitalWrite(LED_BUILTIN, HIGH); // GET /H turns the LED on + } + if (currentLine.endsWith("GET /L")) { + digitalWrite(LED_BUILTIN, LOW); // GET /L turns the LED off + } + } + } + // close the connection: + client.stop(); + Serial.println("client disconnected"); + } +} + +void printWifiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your board's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); + // print where to go in a browser: + Serial.print("To see this page in action, open a browser to http://"); + Serial.println(ip); +} diff --git a/libraries/WiFi/examples/SimpleWebServerWiFi/arduino_secrets.h b/libraries/WiFi/examples/SimpleWebServerWiFi/arduino_secrets.h new file mode 100644 index 000000000..0c9fdd556 --- /dev/null +++ b/libraries/WiFi/examples/SimpleWebServerWiFi/arduino_secrets.h @@ -0,0 +1,2 @@ +#define SECRET_SSID "" +#define SECRET_PASS "" diff --git a/libraries/WiFi/examples/WiFiAdvancedChatServer/WiFiAdvancedChatServer.ino b/libraries/WiFi/examples/WiFiAdvancedChatServer/WiFiAdvancedChatServer.ino new file mode 100644 index 000000000..4d09fdab2 --- /dev/null +++ b/libraries/WiFi/examples/WiFiAdvancedChatServer/WiFiAdvancedChatServer.ino @@ -0,0 +1,101 @@ +/* + Advanced WiFi Chat Server + + A more advanced server that distributes any incoming messages + to all connected clients but the client the message comes from. + To use, telnet to your device's IP address and type. + + Circuit: + * Board with WiFi + + */ + +#include + +#include "arduino_secrets.h" +///////please enter your sensitive data in the Secret tab/arduino_secrets.h +char ssid[] = SECRET_SSID; // your network SSID (name) +char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP) + +int status = WL_IDLE_STATUS; + +// telnet defaults to port 23 +WiFiServer server(23); + +WiFiClient clients[8]; + +void setup() { + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the WiFi module: + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with WiFi module failed!"); + // don't continue + while (true); + } + + // attempt to connect to WiFi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + // Connect to WPA/WPA2 network. Change this line if using open network: + status = WiFi.begin(ssid, pass); + + // wait 3 seconds for connection: + delay(3000); + } + + // start the server: + server.begin(); + + Serial.print("Chat server address:"); + Serial.println(WiFi.localIP()); +} + +void loop() { + // check for any new client connecting, and say hello (before any incoming data) + WiFiClient newClient = server.accept(); + if (newClient) { + for (byte i=0; i < 8; i++) { + if (!clients[i]) { + Serial.print("We have a new client #"); + Serial.println(i); + newClient.print("Hello, client number: "); + newClient.println(i); + // Once we "accept", the client is no longer tracked by WiFiServer + // so we must store it into our list of clients + clients[i] = newClient; + break; + } + } + } + + // check for incoming data from all clients + for (byte i=0; i < 8; i++) { + if (clients[i] && clients[i].available() > 0) { + // read bytes from a client + byte buffer[80]; + int count = clients[i].read(buffer, 80); + // write the bytes to all other connected clients + for (byte j=0; j < 8; j++) { + if (j != i && clients[j].connected()) { + clients[j].write(buffer, count); + } + } + } + } + + // stop any clients which disconnect + for (byte i=0; i < 8; i++) { + if (clients[i] && !clients[i].connected()) { + Serial.print("disconnect client #"); + Serial.println(i); + clients[i].stop(); + } + } + +} diff --git a/libraries/WiFi/examples/WiFiAdvancedChatServer/arduino_secrets.h b/libraries/WiFi/examples/WiFiAdvancedChatServer/arduino_secrets.h new file mode 100644 index 000000000..0c9fdd556 --- /dev/null +++ b/libraries/WiFi/examples/WiFiAdvancedChatServer/arduino_secrets.h @@ -0,0 +1,2 @@ +#define SECRET_SSID "" +#define SECRET_PASS "" diff --git a/libraries/WiFi/examples/WiFiPing/WiFiPing.ino b/libraries/WiFi/examples/WiFiPing/WiFiPing.ino new file mode 100644 index 000000000..db81e1ce7 --- /dev/null +++ b/libraries/WiFi/examples/WiFiPing/WiFiPing.ino @@ -0,0 +1,114 @@ +/* + Web ICMP Ping + + This sketch pings a device based on the IP address or the hostname + using the WiFi module. + + This example is written for a network using WPA encryption. For + WEP or WPA, change the WiFi.begin() call accordingly. + + created 14 February 2024 + by paulvha + modified 8 Jenuary 2025 + by fabik111 + + */ + +#include +#include "arduino_secrets.h" + +///////please enter your sensitive data in the Secret tab/arduino_secrets.h +char ssid[] = SECRET_SSID; // your network SSID (name) +char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP) + +int status = WL_IDLE_STATUS; + +/* -------------------------------------------------------------------------- */ +void setup() { +/* -------------------------------------------------------------------------- */ + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the WiFi module: + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with WiFi module failed."); + // don't continue + while (true); + } + + // attempt to connect to WiFi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + // Connect to WPA/WPA2 network. Change this line if using open or WEP network: + status = WiFi.begin(ssid, pass); + + // wait 3 seconds for connection: + delay(3000); + } + + printWifiStatus(); +} + +/* -------------------------------------------------------------------------- */ +void loop() { +/* -------------------------------------------------------------------------- */ + + // Ping IP + const IPAddress remote_ip(140,82,121,4); + Serial.print("Trying to ping github.com on IP: "); + Serial.println(remote_ip); + + // using default ping count of 1 + int res = WiFi.ping(remote_ip); + + if (res > 0) { + Serial.print("Ping response time: "); + Serial.print(res); + Serial.println(" ms"); + } + else { + Serial.println("Timeout on IP!"); + } + + // Ping Host + const char* remote_host = "www.google.com"; + Serial.print("Trying to ping host: "); + Serial.println(remote_host); + + int res1 = WiFi.ping(remote_host); + + if (res1 > 0) { + Serial.print("Ping response time: "); + Serial.print(res1); + Serial.println(" ms"); + } + else { + Serial.println("Timeout on host!"); + } + + Serial.println(); + delay(5000); +} + +/* -------------------------------------------------------------------------- */ +void printWifiStatus() { +/* -------------------------------------------------------------------------- */ + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your board's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} diff --git a/libraries/WiFi/examples/WiFiPing/arduino_secrets.h b/libraries/WiFi/examples/WiFiPing/arduino_secrets.h new file mode 100644 index 000000000..0c9fdd556 --- /dev/null +++ b/libraries/WiFi/examples/WiFiPing/arduino_secrets.h @@ -0,0 +1,2 @@ +#define SECRET_SSID "" +#define SECRET_PASS "" diff --git a/libraries/WiFi/examples/WiFiSSLClient/WiFiSSLClient.ino b/libraries/WiFi/examples/WiFiSSLClient/WiFiSSLClient.ino new file mode 100644 index 000000000..be1875f84 --- /dev/null +++ b/libraries/WiFi/examples/WiFiSSLClient/WiFiSSLClient.ino @@ -0,0 +1,106 @@ +/* +This example creates a client object that connects and transfers +data using always SSL. + +It is compatible with the methods normally related to plain +connections, like client.connect(host, port). + +Written by Arturo Guadalupi +last revision November 2015 + +*/ + +#include + +#include "arduino_secrets.h" +///////please enter your sensitive data in the Secret tab/arduino_secrets.h +char ssid[] = SECRET_SSID; // your network SSID (name) +char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP) +int keyIndex = 0; // your network key index number (needed only for WEP) + +int status = WL_IDLE_STATUS; +// if you don't want to use DNS (and reduce your sketch size) +// use the numeric IP instead of the name for the server: +//IPAddress server(74,125,232,128); // numeric IP for Google (no DNS) +char server[] = "www.google.com"; // name address for Google (using DNS) + +// Initialize the Ethernet client library +// with the IP address and port of the server +// that you want to connect to (port 80 is default for HTTP): +WiFiSSLClient client; + +void setup() { + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the WiFi module: + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with WiFi module failed!"); + // don't continue + while (true); + } + + // attempt to connect to WiFi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + // Connect to WPA/WPA2 network. Change this line if using open network: + status = WiFi.begin(ssid, pass); + + // wait 3 seconds for connection: + delay(3000); + } + Serial.println("Connected to WiFi"); + printWiFiStatus(); + + Serial.println("\nStarting connection to server..."); + // if you get a connection, report back via serial: + if (client.connect(server, 443)) { + Serial.println("connected to server"); + // Make a HTTP request: + client.println("GET /search?q=arduino HTTP/1.1"); + client.println("Host: www.google.com"); + client.println("Connection: close"); + client.println(); + } +} + +void loop() { + // if there are incoming bytes available + // from the server, read them and print them: + while (client.available()) { + char c = client.read(); + Serial.write(c); + } + + // if the server's disconnected, stop the client: + if (!client.connected()) { + Serial.println(); + Serial.println("disconnecting from server."); + client.stop(); + + // do nothing forevermore: + while (true); + } +} + + +void printWiFiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your board's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} diff --git a/libraries/WiFi/examples/WiFiSSLClient/arduino_secrets.h b/libraries/WiFi/examples/WiFiSSLClient/arduino_secrets.h new file mode 100644 index 000000000..0c9fdd556 --- /dev/null +++ b/libraries/WiFi/examples/WiFiSSLClient/arduino_secrets.h @@ -0,0 +1,2 @@ +#define SECRET_SSID "" +#define SECRET_PASS "" diff --git a/libraries/WiFi/examples/WiFiUdpNtpClient/WiFiUdpNtpClient.ino b/libraries/WiFi/examples/WiFiUdpNtpClient/WiFiUdpNtpClient.ino new file mode 100644 index 000000000..2c799a442 --- /dev/null +++ b/libraries/WiFi/examples/WiFiUdpNtpClient/WiFiUdpNtpClient.ino @@ -0,0 +1,166 @@ +/* + Udp NTP Client + + Get the time from a Network Time Protocol (NTP) time server + Demonstrates use of UDP sendPacket and ReceivePacket + For more on NTP time servers and the messages needed to communicate with them, + see http://en.wikipedia.org/wiki/Network_Time_Protocol + + created 4 Sep 2010 + by Michael Margolis + modified 9 Apr 2012 + by Tom Igoe + + This code is in the public domain. + + */ + +#include + +int status = WL_IDLE_STATUS; +#include "arduino_secrets.h" +///////please enter your sensitive data in the Secret tab/arduino_secrets.h +char ssid[] = SECRET_SSID; // your network SSID (name) +char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP) +int keyIndex = 0; // your network key index number (needed only for WEP) + +unsigned int localPort = 2390; // local port to listen for UDP packets + +IPAddress timeServer(162, 159, 200, 123); // pool.ntp.org NTP server + +const int NTP_PACKET_SIZE = 48; // NTP timestamp is in the first 48 bytes of the message + +byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets + +// A UDP instance to let us send and receive packets over UDP +WiFiUDP Udp; + +void setup() { + // Open serial communications and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the WiFi module: + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with WiFi module failed!"); + // don't continue + while (true); + } + + // attempt to connect to WiFi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + // Connect to WPA/WPA2 network. Change this line if using open network: + status = WiFi.begin(ssid, pass); + + // wait 3 seconds for connection: + delay(3000); + } + + Serial.println("Connected to WiFi"); + printWifiStatus(); + + Serial.println("\nStarting connection to server..."); + Udp.begin(localPort); +} + +void loop() { + sendNTPpacket(timeServer); // send an NTP packet to a time server + // wait to see if a reply is available + delay(1000); + if (Udp.parsePacket()) { + Serial.println("packet received"); + // We've received a packet, read the data from it + Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer + + //the timestamp starts at byte 40 of the received packet and is four bytes, + // or two words, long. First, extract the two words: + + unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); + unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); + // combine the four bytes (two words) into a long integer + // this is NTP time (seconds since Jan 1 1900): + unsigned long secsSince1900 = highWord << 16 | lowWord; + Serial.print("Seconds since Jan 1 1900 = "); + Serial.println(secsSince1900); + + // now convert NTP time into everyday time: + Serial.print("Unix time = "); + // Unix time starts on Jan 1 1970. In seconds, that's 2208988800: + const unsigned long seventyYears = 2208988800UL; + // subtract seventy years: + unsigned long epoch = secsSince1900 - seventyYears; + // print Unix time: + Serial.println(epoch); + + + // print the hour, minute and second: + Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT) + Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day) + Serial.print(':'); + if (((epoch % 3600) / 60) < 10) { + // In the first 10 minutes of each hour, we'll want a leading '0' + Serial.print('0'); + } + Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute) + Serial.print(':'); + if ((epoch % 60) < 10) { + // In the first 10 seconds of each minute, we'll want a leading '0' + Serial.print('0'); + } + Serial.println(epoch % 60); // print the second + } + // wait ten seconds before asking for the time again + delay(10000); +} + +// send an NTP request to the time server at the given address +unsigned long sendNTPpacket(IPAddress& address) { + //Serial.println("1"); + // set all bytes in the buffer to 0 + memset(packetBuffer, 0, NTP_PACKET_SIZE); + // Initialize values needed to form NTP request + // (see URL above for details on the packets) + //Serial.println("2"); + packetBuffer[0] = 0b11100011; // LI, Version, Mode + packetBuffer[1] = 0; // Stratum, or type of clock + packetBuffer[2] = 6; // Polling Interval + packetBuffer[3] = 0xEC; // Peer Clock Precision + // 8 bytes of zero for Root Delay & Root Dispersion + packetBuffer[12] = 49; + packetBuffer[13] = 0x4E; + packetBuffer[14] = 49; + packetBuffer[15] = 52; + + //Serial.println("3"); + + // all NTP fields have been given values, now + // you can send a packet requesting a timestamp: + Udp.beginPacket(address, 123); //NTP requests are to port 123 + //Serial.println("4"); + Udp.write(packetBuffer, NTP_PACKET_SIZE); + //Serial.println("5"); + Udp.endPacket(); + //Serial.println("6"); +} + + +void printWifiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your board's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} diff --git a/libraries/WiFi/examples/WiFiUdpNtpClient/arduino_secrets.h b/libraries/WiFi/examples/WiFiUdpNtpClient/arduino_secrets.h new file mode 100644 index 000000000..0c9fdd556 --- /dev/null +++ b/libraries/WiFi/examples/WiFiUdpNtpClient/arduino_secrets.h @@ -0,0 +1,2 @@ +#define SECRET_SSID "" +#define SECRET_PASS "" diff --git a/libraries/WiFi/examples/WiFiUdpSendReceiveString/WiFiUdpSendReceiveString.ino b/libraries/WiFi/examples/WiFiUdpSendReceiveString/WiFiUdpSendReceiveString.ino new file mode 100644 index 000000000..9a42aad4c --- /dev/null +++ b/libraries/WiFi/examples/WiFiUdpSendReceiveString/WiFiUdpSendReceiveString.ino @@ -0,0 +1,105 @@ +/* + WiFi UDP Send and Receive String + + This sketch waits for a UDP packet on localPort using the WiFi module. + When a packet is received an Acknowledge packet is sent to the client on port remotePort + + created 30 December 2012 + by dlf (Metodo2 srl) + + */ + + +#include + +int status = WL_IDLE_STATUS; +#include "arduino_secrets.h" +///////please enter your sensitive data in the Secret tab/arduino_secrets.h +char ssid[] = SECRET_SSID; // your network SSID (name) +char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP) +int keyIndex = 0; // your network key index number (needed only for WEP) + +unsigned int localPort = 2390; // local port to listen on + +char packetBuffer[256]; //buffer to hold incoming packet +char ReplyBuffer[] = "acknowledged"; // a string to send back + +WiFiUDP Udp; + +void setup() { + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the WiFi module: + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with WiFi module failed!"); + // don't continue + while (true); + } + + // attempt to connect to WiFi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + // Connect to WPA/WPA2 network. Change this line if using open network: + status = WiFi.begin(ssid, pass); + + // wait 3 seconds for connection: + delay(3000); + } + Serial.println("Connected to WiFi"); + printWifiStatus(); + + Serial.println("\nStarting connection to server..."); + // if you get a connection, report back via serial: + Udp.begin(localPort); +} + +void loop() { + + // if there's data available, read a packet + int packetSize = Udp.parsePacket(); + if (packetSize) { + Serial.print("Received packet of size "); + Serial.println(packetSize); + Serial.print("From "); + IPAddress remoteIp = Udp.remoteIP(); + Serial.print(remoteIp); + Serial.print(", port "); + Serial.println(Udp.remotePort()); + + // read the packet into packetBuffer + int len = Udp.read(packetBuffer, 255); + if (len > 0) { + packetBuffer[len] = 0; + } + Serial.println("Contents:"); + Serial.println(packetBuffer); + + // send a reply, to the IP address and port that sent us the packet we received + Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); + Udp.write(ReplyBuffer); + Udp.endPacket(); + } +} + + +void printWifiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your board's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} diff --git a/libraries/WiFi/examples/WiFiUdpSendReceiveString/arduino_secrets.h b/libraries/WiFi/examples/WiFiUdpSendReceiveString/arduino_secrets.h new file mode 100644 index 000000000..0c9fdd556 --- /dev/null +++ b/libraries/WiFi/examples/WiFiUdpSendReceiveString/arduino_secrets.h @@ -0,0 +1,2 @@ +#define SECRET_SSID "" +#define SECRET_PASS "" diff --git a/libraries/WiFi/src/WiFi.cpp b/libraries/WiFi/src/WiFi.cpp index cea1949ae..6ad89d619 100644 --- a/libraries/WiFi/src/WiFi.cpp +++ b/libraries/WiFi/src/WiFi.cpp @@ -3,6 +3,39 @@ #define SSID_MAX_LENGTH 32 #define SSID_MAX_COUNT 64 +static uint8_t sec2enum(nsapi_security_t sec) { + switch (sec) { + case NSAPI_SECURITY_NONE: + return ENC_TYPE_NONE; + case NSAPI_SECURITY_WEP: + return ENC_TYPE_WEP; + case NSAPI_SECURITY_WPA: + return ENC_TYPE_TKIP; + case NSAPI_SECURITY_WPA2: + return ENC_TYPE_CCMP; + case NSAPI_SECURITY_WPA_WPA2: + return ENC_TYPE_CCMP; + case NSAPI_SECURITY_UNKNOWN: + default: + return ENC_TYPE_AUTO; + } +} + +static nsapi_security_t enum2sec(wl_enc_type sec) { + switch (sec) { + case ENC_TYPE_NONE: + return NSAPI_SECURITY_NONE; + case ENC_TYPE_WEP: + return NSAPI_SECURITY_WEP; + case ENC_TYPE_TKIP: + return NSAPI_SECURITY_WPA; + case ENC_TYPE_CCMP: + return NSAPI_SECURITY_WPA_WPA2; + default: + return NSAPI_SECURITY_UNKNOWN; + } +} + bool arduino::WiFiClass::isVisible(const char* ssid) { for (int i = 0; i < SSID_MAX_COUNT; i++) { if (strncmp(ap_list[i].get_ssid(), ssid, SSID_MAX_LENGTH) == 0) { @@ -13,34 +46,59 @@ bool arduino::WiFiClass::isVisible(const char* ssid) { return false; } -int arduino::WiFiClass::begin(const char* ssid, const char* passphrase) { +int arduino::WiFiClass::begin(const char* ssid, const char* passphrase, wl_enc_type security) { if (wifi_if == nullptr) { return 0; } wifi_if->attach(&arduino::WiFiClass::statusCallback); - scanNetworks(); - // use scan result to populate security field - if (!isVisible(ssid)) { - _currentNetworkStatus = WL_CONNECT_FAILED; - return _currentNetworkStatus; + if(security == ENC_TYPE_UNKNOWN) { + scanNetworks(); + if (isVisible(ssid)) { + // Set the network security mode from the scan result. + _security = ap_list[connected_ap].get_security(); + } else { + // For hidden networks, the security mode must be set explicitly. + // if ENC_TYPE_UNKNOWN this means that is the default value and so the user + // has not set it... no worth trying, it is probably an unknown (not hidden) + // interface + _currentNetworkStatus = WL_CONNECT_FAILED; + return _currentNetworkStatus; + } + } else { + _security = enum2sec(security); + } + + wifi_if->set_dhcp(!_useStaticIP); + if (_useStaticIP) { + wifi_if->set_network(_ip, _netmask, _gateway); } - nsapi_error_t result = wifi_if->connect(ssid, passphrase, ap_list[connected_ap].get_security()); + wifi_if->set_timeout(_timeout); + nsapi_error_t result = wifi_if->connect(ssid, passphrase, _security); if(result == NSAPI_ERROR_IS_CONNECTED) { wifi_if->disconnect(); + } else + if (_useStaticIP) { + char if_name[5]; + wifi_if->get_interface_name(if_name); + wifi_if->add_dns_server(_dnsServer2, if_name); + wifi_if->add_dns_server(_dnsServer1, if_name); // pushes dnsServer2 at index 1 } _currentNetworkStatus = (result == NSAPI_ERROR_OK && setSSID(ssid)) ? WL_CONNECTED : WL_CONNECT_FAILED; return _currentNetworkStatus; } +int arduino::WiFiClass::begin(const char* ssid) { + return begin(ssid, NULL, ENC_TYPE_NONE); +} + //Config Wifi to set Static IP && Disable DHCP void arduino::WiFiClass::config(const char* localip, const char* netmask, const char* gateway){ - wifi_if->set_network(localip, netmask, gateway); - wifi_if->set_dhcp(false); + SocketHelpers::config(IPAddress(localip), dnsIP(0), IPAddress(gateway), IPAddress(netmask)); } int arduino::WiFiClass::beginAP(const char* ssid, const char* passphrase, uint8_t channel) { @@ -61,6 +119,10 @@ int arduino::WiFiClass::beginAP(const char* ssid, const char* passphrase, uint8_ //Set ap ssid, password and channel softAPInterface->set_network(_ip, _netmask, _gateway); nsapi_error_t result = softAPInterface->start(ssid, passphrase, NSAPI_SECURITY_WPA2, channel, true /* dhcp server */, NULL, true /* cohexistance */); + if (result != NSAPI_ERROR_OK) { + _currentNetworkStatus = WL_AP_FAILED; + return _currentNetworkStatus; + } nsapi_error_t registrationResult; softAPInterface->unregister_event_handler(); @@ -90,7 +152,7 @@ void* arduino::WiFiClass::handleAPEvents(whd_interface_t ifp, const whd_event_he if (osSemaphoreGetCount(whd_driver->ap_info.whd_wifi_sleep_flag) < 1) { osStatus_t result = osSemaphoreRelease(whd_driver->ap_info.whd_wifi_sleep_flag); if (result != osOK) { - printf("Release whd_wifi_sleep_flag ERROR: %d", result); + //printf("Release whd_wifi_sleep_flag ERROR: %d", result); } } } @@ -149,25 +211,8 @@ int arduino::WiFiClass::setSSID(const char* ssid) { return 1; } -static uint8_t sec2enum(nsapi_security_t sec) { - switch (sec) { - case NSAPI_SECURITY_NONE: - return ENC_TYPE_NONE; - case NSAPI_SECURITY_WEP: - return ENC_TYPE_WEP; - case NSAPI_SECURITY_WPA: - return ENC_TYPE_TKIP; - case NSAPI_SECURITY_WPA2: - return ENC_TYPE_CCMP; - case NSAPI_SECURITY_WPA_WPA2: - return ENC_TYPE_CCMP; - case NSAPI_SECURITY_UNKNOWN: - default: - return ENC_TYPE_AUTO; - } -} - int8_t arduino::WiFiClass::scanNetworks() { + connected_ap = SSID_MAX_COUNT; uint8_t count = SSID_MAX_COUNT; if (ap_list != nullptr) { free(ap_list); @@ -177,17 +222,42 @@ int8_t arduino::WiFiClass::scanNetworks() { } char* arduino::WiFiClass::SSID(uint8_t networkItem) { + if (networkItem >= SSID_MAX_COUNT) { + return NULL; + } return (char*)ap_list[networkItem].get_ssid(); } int32_t arduino::WiFiClass::RSSI(uint8_t networkItem) { + if (networkItem >= SSID_MAX_COUNT) { + return 0; + } return ap_list[networkItem].get_rssi(); } uint8_t arduino::WiFiClass::encryptionType(uint8_t networkItem) { + if (networkItem >= SSID_MAX_COUNT) { + return ENC_TYPE_UNKNOWN; + } return sec2enum(ap_list[networkItem].get_security()); } +uint8_t* arduino::WiFiClass::BSSID(uint8_t networkItem, uint8_t* bssid) { + if (networkItem >= SSID_MAX_COUNT) { + memset(bssid, 0, 6); + } else { + memcpy(bssid, ap_list[networkItem].get_bssid(), 6); + } + return bssid; +} + +uint8_t arduino::WiFiClass::channel(uint8_t networkItem) { + if (networkItem >= SSID_MAX_COUNT) { + return -1; + } + return ap_list[networkItem].get_channel(); +} + int32_t arduino::WiFiClass::RSSI() { return wifi_if->get_rssi(); } @@ -197,13 +267,21 @@ uint8_t arduino::WiFiClass::status() { } uint8_t arduino::WiFiClass::encryptionType() { - return sec2enum(ap_list[connected_ap].get_security()); + if (connected_ap >= SSID_MAX_COUNT) { + return sec2enum(_security); + } else { + return sec2enum(ap_list[connected_ap].get_security()); + } } uint8_t* arduino::WiFiClass::BSSID(unsigned char* bssid) { - const uint8_t* reverse_bssid = ap_list[connected_ap].get_bssid(); - for (int b = 0; b < 6; b++) { - bssid[b] = reverse_bssid[5 - b]; + if (connected_ap >= SSID_MAX_COUNT) { + memset(bssid, 0, 6); + } else { + const uint8_t* reverse_bssid = ap_list[connected_ap].get_bssid(); + for (int b = 0; b < 6; b++) { + bssid[b] = reverse_bssid[5 - b]; + } } return bssid; } @@ -220,6 +298,10 @@ unsigned long arduino::WiFiClass::getTime() { return 0; } +void arduino::WiFiClass::setTimeout(unsigned long timeout) { + _timeout = timeout; +} + void arduino::WiFiClass::statusCallback(nsapi_event_t status, intptr_t param) { if (((param == NSAPI_STATUS_DISCONNECTED) || @@ -296,12 +378,17 @@ wiced_result_t whd_firmware_check_hook(const char* mounted_name, int mount_err) #include "whd_version.h" const char* arduino::WiFiClass::firmwareVersion() { - if ((wiced_filesystem_init() != WICED_ERROR) && (wiced_filesystem_mount_default() != WICED_ERROR)) { - if (firmware_available) { - return WHD_VERSION; - } + if (!firmware_available) { + /* Try to mount WiFi firmware filesystem */ + wiced_filesystem_init(); + wiced_filesystem_mount_default(); + } + + if (firmware_available) { + return WHD_VERSION; + } else { + return "v0.0.0"; } - return "v0.0.0"; } arduino::WiFiClass WiFi(WiFiInterface::get_default_instance()); diff --git a/libraries/WiFi/src/WiFi.h b/libraries/WiFi/src/WiFi.h index 774cb68a1..a3a8a6ea9 100644 --- a/libraries/WiFi/src/WiFi.h +++ b/libraries/WiFi/src/WiFi.h @@ -46,8 +46,6 @@ extern "C" { namespace arduino { -typedef void* (*voidPrtFuncPtr)(void); - class WiFiClass : public MbedSocketClass { public: static int16_t _state[MAX_SOCK_NUM]; @@ -57,37 +55,27 @@ class WiFiClass : public MbedSocketClass { : wifi_if(_if){}; /* - * Get firmware version - */ + * Get firmware version + */ static const char* firmwareVersion(); /* Start Wifi connection for OPEN networks - * - * param ssid: Pointer to the SSID string. - */ + * + * param ssid: Pointer to the SSID string. + */ int begin(const char* ssid); - /* Start Wifi connection with WEP encryption. - * Configure a key into the device. The key type (WEP-40, WEP-104) - * is determined by the size of the key (5 bytes for WEP-40, 13 bytes for WEP-104). - * - * param ssid: Pointer to the SSID string. - * param key_idx: The key index to set. Valid values are 0-3. - * param key: Key input buffer. - */ - int begin(const char* ssid, uint8_t key_idx, const char* key); - - void MACAddress(uint8_t *mac_address); + void MACAddress(uint8_t *mac_address) __attribute__((deprecated("Use macAddress(uint8_t *mac_address)"))); /* Start Wifi connection with passphrase - * the most secure supported mode will be automatically selected - * - * param ssid: Pointer to the SSID string. - * param passphrase: Passphrase. Valid characters in a passphrase - * must be between ASCII 32-126 (decimal). - */ - int begin(const char* ssid, const char* passphrase); - + * the most secure supported mode will be automatically selected + * + * param ssid: Pointer to the SSID string. + * param passphrase: Passphrase. Valid characters in a passphrase + * must be between ASCII 32-126 (decimal). + */ + int begin(const char* ssid, const char* passphrase, wl_enc_type security = ENC_TYPE_UNKNOWN); + // Inherit config methods from the parent class using MbedSocketClass::config; @@ -95,108 +83,100 @@ class WiFiClass : public MbedSocketClass { int beginAP(const char* ssid, const char* passphrase, uint8_t channel = DEFAULT_AP_CHANNEL); - /* Set the hostname used for DHCP requests - * - * param name: hostname to set - * - */ - void setHostname(const char* name); - /* - * Disconnect from the network - * - * return: one value of wl_status_t enum - */ + * Disconnect from the network + * + * return: one value of wl_status_t enum + */ int disconnect(void); void end(void); /* - * Return the current SSID associated with the network - * - * return: ssid string - */ + * Return the current SSID associated with the network + * + * return: ssid string + */ char* SSID(); /* - * Return the current BSSID associated with the network. - * It is the MAC address of the Access Point - * - * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH - */ + * Return the current BSSID associated with the network. + * It is the MAC address of the Access Point + * + * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + */ uint8_t* BSSID(uint8_t* bssid); /* - * Return the current RSSI /Received Signal Strength in dBm) - * associated with the network - * - * return: signed value - */ + * Return the current RSSI /Received Signal Strength in dBm) + * associated with the network + * + * return: signed value + */ int32_t RSSI(); /* - * Return the Encryption Type associated with the network - * - * return: one value of wl_enc_type enum - */ + * Return the Encryption Type associated with the network + * + * return: one value of wl_enc_type enum + */ uint8_t encryptionType(); /* - * Start scan WiFi networks available - * - * return: Number of discovered networks - */ + * Start scan WiFi networks available + * + * return: Number of discovered networks + */ int8_t scanNetworks(); /* - * Return the SSID discovered during the network scan. - * - * param networkItem: specify from which network item want to get the information - * - * return: ssid string of the specified item on the networks scanned list - */ + * Return the SSID discovered during the network scan. + * + * param networkItem: specify from which network item want to get the information + * + * return: ssid string of the specified item on the networks scanned list + */ char* SSID(uint8_t networkItem); /* - * Return the encryption type of the networks discovered during the scanNetworks - * - * param networkItem: specify from which network item want to get the information - * - * return: encryption type (enum wl_enc_type) of the specified item on the networks scanned list - */ + * Return the encryption type of the networks discovered during the scanNetworks + * + * param networkItem: specify from which network item want to get the information + * + * return: encryption type (enum wl_enc_type) of the specified item on the networks scanned list + */ uint8_t encryptionType(uint8_t networkItem); uint8_t* BSSID(uint8_t networkItem, uint8_t* bssid); uint8_t channel(uint8_t networkItem); /* - * Return the RSSI of the networks discovered during the scanNetworks - * - * param networkItem: specify from which network item want to get the information - * - * return: signed value of RSSI of the specified item on the networks scanned list - */ + * Return the RSSI of the networks discovered during the scanNetworks + * + * param networkItem: specify from which network item want to get the information + * + * return: signed value of RSSI of the specified item on the networks scanned list + */ int32_t RSSI(uint8_t networkItem); /* - * Return Connection status. - * - * return: one of the value defined in wl_status_t - */ + * Return Connection status. + * + * return: one of the value defined in wl_status_t + */ uint8_t status(); unsigned long getTime(); - void lowPowerMode(); - void noLowPowerMode(); - - int ping(const char* hostname, uint8_t ttl = 128); - int ping(const String& hostname, uint8_t ttl = 128); - int ping(IPAddress host, uint8_t ttl = 128); + /* + * Configure WiFi join timeout in milliseconds. Default value is 7s. + */ + void setTimeout(unsigned long timeout); friend class WiFiClient; friend class WiFiServer; friend class WiFiUDP; + friend class WiFiSSLClient; NetworkInterface* getNetwork(); @@ -207,6 +187,8 @@ class WiFiClass : public MbedSocketClass { WiFiInterface* wifi_if = nullptr; WiFiAccessPoint* ap_list = nullptr; uint8_t connected_ap; + nsapi_security_t _security; + unsigned long _timeout = 7000; int setSSID(const char* ssid); void ensureDefaultAPNetworkConfiguration(); static void* handleAPEvents(whd_interface_t ifp, const whd_event_header_t* event_header, const uint8_t* event_data, void* handler_user_data); @@ -221,5 +203,6 @@ extern WiFiClass WiFi; #include "WiFiClient.h" #include "WiFiServer.h" #include "WiFiUdp.h" +#include "WiFiSSLClient.h" #endif diff --git a/libraries/WiFi/src/WiFiClient.h b/libraries/WiFi/src/WiFiClient.h index f60a978d3..0cb6781ab 100644 --- a/libraries/WiFi/src/WiFiClient.h +++ b/libraries/WiFi/src/WiFiClient.h @@ -21,11 +21,11 @@ #define wificlient_h #include "WiFi.h" -#include "MbedClient.h" +#include "AClient.h" namespace arduino { -class WiFiClient : public MbedClient { +class WiFiClient : public AClient { NetworkInterface *getNetwork() { return WiFi.getNetwork(); } diff --git a/libraries/WiFi/src/WiFiSSLClient.h b/libraries/WiFi/src/WiFiSSLClient.h index c4751e10a..366eda4b5 100644 --- a/libraries/WiFi/src/WiFiSSLClient.h +++ b/libraries/WiFi/src/WiFiSSLClient.h @@ -21,13 +21,14 @@ #define WIFISSLCLIENT_H #include "WiFi.h" -#include "MbedSSLClient.h" +#include "AClient.h" extern const char CA_CERTIFICATES[]; namespace arduino { -class WiFiSSLClient : public arduino::MbedSSLClient { +class WiFiSSLClient : public arduino::ASslClient { +protected: NetworkInterface *getNetwork() { return WiFi.getNetwork(); } diff --git a/libraries/WiFi/src/WiFiServer.cpp b/libraries/WiFi/src/WiFiServer.cpp index cefbd0214..fb919eff9 100644 --- a/libraries/WiFi/src/WiFiServer.cpp +++ b/libraries/WiFi/src/WiFiServer.cpp @@ -1,6 +1,10 @@ #include "WiFiServer.h" arduino::WiFiClient arduino::WiFiServer::available(uint8_t* status) { + return accept(status); +} + +arduino::WiFiClient arduino::WiFiServer::accept(uint8_t* status) { WiFiClient client; nsapi_error_t error; if (sock == nullptr) { diff --git a/libraries/WiFi/src/WiFiServer.h b/libraries/WiFi/src/WiFiServer.h index ae293b374..3e20d7959 100644 --- a/libraries/WiFi/src/WiFiServer.h +++ b/libraries/WiFi/src/WiFiServer.h @@ -31,9 +31,11 @@ class WiFiServer : public MbedServer { } public: + WiFiServer() {} WiFiServer(uint16_t port) : MbedServer(port) {} - WiFiClient available(uint8_t* status = nullptr); + WiFiClient accept(uint8_t* status = nullptr); + WiFiClient available(uint8_t* status = nullptr) __attribute__((deprecated("Use accept()."))); }; } diff --git a/libraries/WiFi/src/utility/wl_definitions.h b/libraries/WiFi/src/utility/wl_definitions.h index 9ea1f9fe4..43091d590 100644 --- a/libraries/WiFi/src/utility/wl_definitions.h +++ b/libraries/WiFi/src/utility/wl_definitions.h @@ -60,17 +60,22 @@ typedef enum { } wl_status_t; /* Encryption modes */ -enum wl_enc_type { /* Values map to 802.11 encryption suites... */ +enum wl_enc_type { /* Values map to 802.11 Cipher Algorithm Identifier */ ENC_TYPE_WEP = 5, ENC_TYPE_TKIP = 2, + ENC_TYPE_WPA = ENC_TYPE_TKIP, ENC_TYPE_CCMP = 4, + ENC_TYPE_WPA2 = ENC_TYPE_CCMP, + ENC_TYPE_GCMP = 6, + ENC_TYPE_WPA3 = ENC_TYPE_GCMP, /* ... except these two, 7 and 8 are reserved in 802.11-2007 */ ENC_TYPE_NONE = 7, ENC_TYPE_UNKNOWN = 9, ENC_TYPE_AUTO = 8 }; -#if defined(ARDUINO_PORTENTA_H7_M7) +#if defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || \ + defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA) #include "whd_version.h" #define WIFI_FIRMWARE_LATEST_VERSION WHD_VERSION #endif diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index 38c6f7e91..9b345d3e1 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -93,6 +93,7 @@ uint8_t arduino::MbedI2C::endTransmission(void) { size_t arduino::MbedI2C::requestFrom(uint8_t address, size_t len, bool stopBit) { char buf[256]; + len = min(len, sizeof(buf)); int ret = master->read(address << 1, buf, len, !stopBit); if (ret != 0) { return 0; @@ -121,14 +122,22 @@ size_t arduino::MbedI2C::write(const uint8_t* data, int len) { } int arduino::MbedI2C::read() { + int rv = -1; + core_util_critical_section_enter(); + if (rxBuffer.available()) { - return rxBuffer.read_char(); + + rv = rxBuffer.read_char(); } - return -1; + core_util_critical_section_exit(); + return rv; } int arduino::MbedI2C::available() { - return rxBuffer.available(); + core_util_critical_section_enter(); + int rv = rxBuffer.available(); + core_util_critical_section_exit(); + return rv; } int arduino::MbedI2C::peek() { @@ -150,13 +159,16 @@ void arduino::MbedI2C::receiveThd() { onRequestCb(); } if (usedTxBuffer != 0) { + core_util_critical_section_enter(); slave->write((const char *) txBuffer, usedTxBuffer); + core_util_critical_section_exit(); usedTxBuffer = 0; } //slave->stop(); break; case mbed::I2CSlave::WriteGeneral: case mbed::I2CSlave::WriteAddressed: + core_util_critical_section_enter(); rxBuffer.clear(); char buf[240]; c = slave->read(buf, sizeof(buf)); @@ -167,8 +179,9 @@ void arduino::MbedI2C::receiveThd() { break; } } - if (rxBuffer.available() > 0 && onReceiveCb != NULL) { - onReceiveCb(rxBuffer.available()); + core_util_critical_section_exit(); + if (available() > 0 && onReceiveCb != NULL) { + onReceiveCb(available()); } //slave->stop(); break; diff --git a/libraries/ea_malloc/malloc_freelist.c b/libraries/ea_malloc/malloc_freelist.c index 833597baa..aa6fed5f9 100644 --- a/libraries/ea_malloc/malloc_freelist.c +++ b/libraries/ea_malloc/malloc_freelist.c @@ -20,7 +20,7 @@ /* * This is the container for our free-list. - * Node the usage of the linked list here: the library uses offsetof + * Note the usage of the linked list here: the library uses offsetof * and container_of to manage the list and get back to the parent struct. */ typedef struct @@ -67,7 +67,7 @@ void defrag_free_list(void) { if((((uintptr_t)&lb->block) + lb->size) == (uintptr_t)b) { - lb->size += sizeof(*b) + b->size; + lb->size += ALLOC_HEADER_SZ + b->size; list_del(&b->node); continue; } diff --git a/libraries/openamp_arduino/src/device.c b/libraries/openamp_arduino/src/device.c index a3bc12caf..45e08eccd 100644 --- a/libraries/openamp_arduino/src/device.c +++ b/libraries/openamp_arduino/src/device.c @@ -5,9 +5,9 @@ */ #include -#include #include #include +#include #include #include #include @@ -43,11 +43,10 @@ int metal_bus_find(const char *name, struct metal_bus **result) metal_list_for_each(&_metal.common.bus_list, node) { bus = metal_container_of(node, struct metal_bus, node); - if (strcmp(bus->name, name) != 0) - continue; - if (result) + if (strcmp(bus->name, name) == 0 && result) { *result = bus; - return 0; + return 0; + } } return -ENOENT; } @@ -106,10 +105,10 @@ int metal_generic_dev_open(struct metal_bus *bus, const char *dev_name, metal_list_for_each(&_metal.common.generic_device_list, node) { dev = metal_container_of(node, struct metal_device, node); - if (strcmp(dev->name, dev_name) != 0) - continue; - *device = dev; - return metal_generic_dev_sys_open(dev); + if (strcmp(dev->name, dev_name) == 0) { + *device = dev; + return metal_generic_dev_sys_open(dev); + } } return -ENODEV; @@ -122,9 +121,9 @@ int metal_generic_dev_dma_map(struct metal_bus *bus, int nents_in, struct metal_sg *sg_out) { + int i; (void)bus; (void)device; - int i; if (sg_out != sg_in) memcpy(sg_out, sg_in, nents_in*(sizeof(struct metal_sg))); @@ -144,10 +143,10 @@ void metal_generic_dev_dma_unmap(struct metal_bus *bus, struct metal_sg *sg, int nents) { + int i; (void)bus; (void)device; (void)dir; - int i; for (i = 0; i < nents; i++) { metal_cache_invalidate(sg[i].virt, sg[i].len); diff --git a/libraries/openamp_arduino/src/dma.c b/libraries/openamp_arduino/src/dma.c new file mode 100644 index 000000000..7edaa549c --- /dev/null +++ b/libraries/openamp_arduino/src/dma.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include +#include +#include +#include + +int metal_dma_map(struct metal_device *dev, + uint32_t dir, + struct metal_sg *sg_in, + int nents_in, + struct metal_sg *sg_out) +{ + int nents_out; + + if (!dev || !sg_in || !sg_out) + return -EINVAL; + if (!dev->bus->ops.dev_dma_map) + return -ENODEV; + + /* memory barrier */ + if (dir == METAL_DMA_DEV_R) + /* If it is device read, apply memory write fence. */ + atomic_thread_fence(memory_order_release); + else + /* If it is device write or r/w, apply memory r/w fence. */ + atomic_thread_fence(memory_order_acq_rel); + nents_out = dev->bus->ops.dev_dma_map(dev->bus, + dev, dir, sg_in, nents_in, sg_out); + return nents_out; +} + +void metal_dma_unmap(struct metal_device *dev, + uint32_t dir, + struct metal_sg *sg, + int nents) +{ + /* memory barrier */ + if (dir == METAL_DMA_DEV_R) + /* If it is device read, apply memory write fence. */ + atomic_thread_fence(memory_order_release); + else + /*If it is device write or r/w, apply memory r/w fence */ + atomic_thread_fence(memory_order_acq_rel); + + if (!dev || !dev->bus->ops.dev_dma_unmap || !sg) + return; + dev->bus->ops.dev_dma_unmap(dev->bus, + dev, dir, sg, nents); +} diff --git a/libraries/openamp_arduino/src/elf_loader.c b/libraries/openamp_arduino/src/elf_loader.c new file mode 100644 index 000000000..c90b8d46b --- /dev/null +++ b/libraries/openamp_arduino/src/elf_loader.c @@ -0,0 +1,707 @@ +/* + * Copyright (c) 2014, Mentor Graphics Corporation + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include +#include +#include + +static int elf_is_64(const void *elf_info) +{ + const unsigned char *tmp = elf_info; + + if (tmp[EI_CLASS] == ELFCLASS64) + return 1; + else + return 0; +} + +static size_t elf_ehdr_size(const void *elf_info) +{ + if (!elf_info) + return sizeof(Elf64_Ehdr); + else if (elf_is_64(elf_info) != 0) + return sizeof(Elf64_Ehdr); + else + return sizeof(Elf32_Ehdr); +} + +static size_t elf_phoff(const void *elf_info) +{ + if (elf_is_64(elf_info) == 0) { + const Elf32_Ehdr *ehdr = elf_info; + + return ehdr->e_phoff; + } else { + const Elf64_Ehdr *ehdr = elf_info; + + return ehdr->e_phoff; + } +} + +static size_t elf_phentsize(const void *elf_info) +{ + if (elf_is_64(elf_info) == 0) { + const Elf32_Ehdr *ehdr = elf_info; + + return ehdr->e_phentsize; + } else { + const Elf64_Ehdr *ehdr = elf_info; + + return ehdr->e_phentsize; + } +} + +static int elf_phnum(const void *elf_info) +{ + if (elf_is_64(elf_info) == 0) { + const Elf32_Ehdr *ehdr = elf_info; + + return ehdr->e_phnum; + } else { + const Elf64_Ehdr *ehdr = elf_info; + + return ehdr->e_phnum; + } +} + +static size_t elf_shoff(const void *elf_info) +{ + if (elf_is_64(elf_info) == 0) { + const Elf32_Ehdr *ehdr = elf_info; + + return ehdr->e_shoff; + } else { + const Elf64_Ehdr *ehdr = elf_info; + + return ehdr->e_shoff; + } +} + +static size_t elf_shentsize(const void *elf_info) +{ + if (elf_is_64(elf_info) == 0) { + const Elf32_Ehdr *ehdr = elf_info; + + return ehdr->e_shentsize; + } else { + const Elf64_Ehdr *ehdr = elf_info; + + return ehdr->e_shentsize; + } +} + +static int elf_shnum(const void *elf_info) +{ + if (elf_is_64(elf_info) == 0) { + const Elf32_Ehdr *ehdr = elf_info; + + return ehdr->e_shnum; + } else { + const Elf64_Ehdr *ehdr = elf_info; + + return ehdr->e_shnum; + } +} + +static int elf_shstrndx(const void *elf_info) +{ + if (elf_is_64(elf_info) == 0) { + const Elf32_Ehdr *ehdr = elf_info; + + return ehdr->e_shstrndx; + } else { + const Elf64_Ehdr *ehdr = elf_info; + + return ehdr->e_shstrndx; + } +} + +static void **elf_phtable_ptr(void *elf_info) +{ + if (elf_is_64(elf_info) == 0) { + struct elf32_info *einfo = elf_info; + + return (void **)&einfo->phdrs; + } else { + struct elf64_info *einfo = elf_info; + + return (void **)&einfo->phdrs; + } +} + +static void **elf_shtable_ptr(void *elf_info) +{ + if (elf_is_64(elf_info) == 0) { + struct elf32_info *einfo = elf_info; + + return (void **)&einfo->shdrs; + } else { + struct elf64_info *einfo = elf_info; + + return (void **)&einfo->shdrs; + } +} + +static void **elf_shstrtab_ptr(void *elf_info) +{ + if (elf_is_64(elf_info) == 0) { + struct elf32_info *einfo = elf_info; + + return &einfo->shstrtab; + } else { + struct elf64_info *einfo = elf_info; + + return &einfo->shstrtab; + } +} + +static int *elf_load_state(void *elf_info) +{ + if (elf_is_64(elf_info) == 0) { + struct elf32_info *einfo = elf_info; + + return &einfo->load_state; + } else { + struct elf64_info *einfo = elf_info; + + return &einfo->load_state; + } +} + +static void elf_parse_segment(void *elf_info, const void *elf_phdr, + unsigned int *p_type, size_t *p_offset, + metal_phys_addr_t *p_vaddr, + metal_phys_addr_t *p_paddr, + size_t *p_filesz, size_t *p_memsz) +{ + if (elf_is_64(elf_info) == 0) { + const Elf32_Phdr *phdr = elf_phdr; + + if (p_type) + *p_type = (unsigned int)phdr->p_type; + if (p_offset) + *p_offset = (size_t)phdr->p_offset; + if (p_vaddr) + *p_vaddr = (metal_phys_addr_t)phdr->p_vaddr; + if (p_paddr) + *p_paddr = (metal_phys_addr_t)phdr->p_paddr; + if (p_filesz) + *p_filesz = (size_t)phdr->p_filesz; + if (p_memsz) + *p_memsz = (size_t)phdr->p_memsz; + } else { + const Elf64_Phdr *phdr = elf_phdr; + + if (p_type) + *p_type = (unsigned int)phdr->p_type; + if (p_offset) + *p_offset = (size_t)phdr->p_offset; + if (p_vaddr) + *p_vaddr = (metal_phys_addr_t)phdr->p_vaddr; + if (p_paddr) + *p_paddr = (metal_phys_addr_t)phdr->p_paddr; + if (p_filesz) + *p_filesz = (size_t)phdr->p_filesz; + if (p_memsz) + *p_memsz = (size_t)phdr->p_memsz; + } +} + +static const void *elf_get_segment_from_index(void *elf_info, int index) +{ + if (elf_is_64(elf_info) == 0) { + const struct elf32_info *einfo = elf_info; + const Elf32_Ehdr *ehdr = &einfo->ehdr; + const Elf32_Phdr *phdrs = einfo->phdrs; + + if (!phdrs) + return NULL; + if (index < 0 || index >= ehdr->e_phnum) + return NULL; + return &phdrs[index]; + } else { + const struct elf64_info *einfo = elf_info; + const Elf64_Ehdr *ehdr = &einfo->ehdr; + const Elf64_Phdr *phdrs = einfo->phdrs; + + if (!phdrs) + return NULL; + if (index < 0 || index >= ehdr->e_phnum) + return NULL; + return &phdrs[index]; + } +} + +static void *elf_get_section_from_name(void *elf_info, const char *name) +{ + unsigned int i; + const char *name_table; + + if (elf_is_64(elf_info) == 0) { + struct elf32_info *einfo = elf_info; + Elf32_Ehdr *ehdr = &einfo->ehdr; + Elf32_Shdr *shdr = einfo->shdrs; + + name_table = einfo->shstrtab; + if (!shdr || !name_table) + return NULL; + for (i = 0; i < ehdr->e_shnum; i++, shdr++) { + if (strcmp(name, name_table + shdr->sh_name)) + continue; + else + return shdr; + } + } else { + struct elf64_info *einfo = elf_info; + Elf64_Ehdr *ehdr = &einfo->ehdr; + Elf64_Shdr *shdr = einfo->shdrs; + + name_table = einfo->shstrtab; + if (!shdr || !name_table) + return NULL; + for (i = 0; i < ehdr->e_shnum; i++, shdr++) { + if (strcmp(name, name_table + shdr->sh_name)) + continue; + else + return shdr; + } + } + return NULL; +} + +static void *elf_get_section_from_index(void *elf_info, int index) +{ + if (elf_is_64(elf_info) == 0) { + struct elf32_info *einfo = elf_info; + Elf32_Ehdr *ehdr = &einfo->ehdr; + Elf32_Shdr *shdr = einfo->shdrs; + + if (!shdr) + return NULL; + if (index < 0 || index >= ehdr->e_shnum) + return NULL; + return &einfo->shdrs[index]; + } else { + struct elf64_info *einfo = elf_info; + Elf64_Ehdr *ehdr = &einfo->ehdr; + Elf64_Shdr *shdr = einfo->shdrs; + + if (!shdr) + return NULL; + if (index < 0 || index >= ehdr->e_shnum) + return NULL; + return &einfo->shdrs[index]; + } +} + +static void elf_parse_section(void *elf_info, void *elf_shdr, + unsigned int *sh_type, unsigned int *sh_flags, + metal_phys_addr_t *sh_addr, + size_t *sh_offset, size_t *sh_size, + unsigned int *sh_link, unsigned int *sh_info, + unsigned int *sh_addralign, + size_t *sh_entsize) +{ + if (elf_is_64(elf_info) == 0) { + Elf32_Shdr *shdr = elf_shdr; + + if (sh_type) + *sh_type = shdr->sh_type; + if (sh_flags) + *sh_flags = shdr->sh_flags; + if (sh_addr) + *sh_addr = (metal_phys_addr_t)shdr->sh_addr; + if (sh_offset) + *sh_offset = shdr->sh_offset; + if (sh_size) + *sh_size = shdr->sh_size; + if (sh_link) + *sh_link = shdr->sh_link; + if (sh_info) + *sh_info = shdr->sh_info; + if (sh_addralign) + *sh_addralign = shdr->sh_addralign; + if (sh_entsize) + *sh_entsize = shdr->sh_entsize; + } else { + Elf64_Shdr *shdr = elf_shdr; + + if (sh_type) + *sh_type = shdr->sh_type; + if (sh_flags) + *sh_flags = shdr->sh_flags; + if (sh_addr) + *sh_addr = (metal_phys_addr_t)shdr->sh_addr; + if (sh_offset) + *sh_offset = shdr->sh_offset; + if (sh_size) + *sh_size = shdr->sh_size; + if (sh_link) + *sh_link = shdr->sh_link; + if (sh_info) + *sh_info = shdr->sh_info; + if (sh_addralign) + *sh_addralign = shdr->sh_addralign; + if (sh_entsize) + *sh_entsize = shdr->sh_entsize; + } +} + +static const void *elf_next_load_segment(void *elf_info, int *nseg, + metal_phys_addr_t *da, + size_t *noffset, size_t *nfsize, + size_t *nmsize) +{ + const void *phdr = PT_NULL; + unsigned int p_type = PT_NULL; + + if (!elf_info || !nseg) + return NULL; + while (p_type != PT_LOAD) { + phdr = elf_get_segment_from_index(elf_info, *nseg); + if (!phdr) + return NULL; + elf_parse_segment(elf_info, phdr, &p_type, noffset, + da, NULL, nfsize, nmsize); + *nseg = *nseg + 1; + } + return phdr; +} + +static size_t elf_info_size(const void *img_data) +{ + if (elf_is_64(img_data) == 0) + return sizeof(struct elf32_info); + else + return sizeof(struct elf64_info); +} + +int elf_identify(const void *img_data, size_t len) +{ + if (len < SELFMAG || !img_data) + return -RPROC_EINVAL; + if (memcmp(img_data, ELFMAG, SELFMAG) != 0) + return -RPROC_EINVAL; + else + return 0; +} + +int elf_load_header(const void *img_data, size_t offset, size_t len, + void **img_info, int last_load_state, + size_t *noffset, size_t *nlen) +{ + int *load_state; + + metal_assert(noffset); + metal_assert(nlen); + /* Get ELF header */ + if (last_load_state == ELF_STATE_INIT) { + size_t tmpsize; + + metal_log(METAL_LOG_DEBUG, "Loading ELF headering\r\n"); + tmpsize = elf_ehdr_size(img_data); + if (len < tmpsize) { + *noffset = 0; + *nlen = tmpsize; + return ELF_STATE_INIT; + } else { + size_t infosize = elf_info_size(img_data); + + if (!*img_info) { + *img_info = metal_allocate_memory(infosize); + if (!*img_info) + return -RPROC_ENOMEM; + memset(*img_info, 0, infosize); + } + memcpy(*img_info, img_data, tmpsize); + load_state = elf_load_state(*img_info); + *load_state = ELF_STATE_WAIT_FOR_PHDRS; + last_load_state = ELF_STATE_WAIT_FOR_PHDRS; + } + } + metal_assert(*img_info); + load_state = elf_load_state(*img_info); + if (last_load_state != *load_state) + return -RPROC_EINVAL; + /* Get ELF program headers */ + if (*load_state == ELF_STATE_WAIT_FOR_PHDRS) { + size_t phdrs_size; + size_t phdrs_offset; + void **phdrs; + const void *img_phdrs; + + metal_log(METAL_LOG_DEBUG, "Loading ELF program header.\r\n"); + phdrs_offset = elf_phoff(*img_info); + phdrs_size = elf_phnum(*img_info) * elf_phentsize(*img_info); + if (offset > phdrs_offset || + offset + len < phdrs_offset + phdrs_size) { + *noffset = phdrs_offset; + *nlen = phdrs_size; + return *load_state; + } + /* calculate the programs headers offset to the image_data */ + phdrs_offset -= offset; + img_phdrs = (const char *)img_data + phdrs_offset; + phdrs = elf_phtable_ptr(*img_info); + *phdrs = metal_allocate_memory(phdrs_size); + if (!*phdrs) + return -RPROC_ENOMEM; + memcpy(*phdrs, img_phdrs, phdrs_size); + *load_state = ELF_STATE_WAIT_FOR_SHDRS | + RPROC_LOADER_READY_TO_LOAD; + } + /* Get ELF Section Headers */ + if ((*load_state & ELF_STATE_WAIT_FOR_SHDRS) != 0) { + size_t shdrs_size; + size_t shdrs_offset; + void **shdrs; + const void *img_shdrs; + + metal_log(METAL_LOG_DEBUG, "Loading ELF section header.\r\n"); + shdrs_offset = elf_shoff(*img_info); + if (elf_shnum(*img_info) == 0) { + *load_state = (*load_state & (~ELF_STATE_MASK)) | + ELF_STATE_HDRS_COMPLETE; + *nlen = 0; + return *load_state; + } + shdrs_size = elf_shnum(*img_info) * elf_shentsize(*img_info); + if (offset > shdrs_offset || + offset + len < shdrs_offset + shdrs_size) { + *noffset = shdrs_offset; + *nlen = shdrs_size; + return *load_state; + } + /* calculate the sections headers offset to the image_data */ + shdrs_offset -= offset; + img_shdrs = (const char *)img_data + shdrs_offset; + shdrs = elf_shtable_ptr(*img_info); + *shdrs = metal_allocate_memory(shdrs_size); + if (!*shdrs) + return -RPROC_ENOMEM; + memcpy(*shdrs, img_shdrs, shdrs_size); + *load_state = (*load_state & (~ELF_STATE_MASK)) | + ELF_STATE_WAIT_FOR_SHSTRTAB; + metal_log(METAL_LOG_DEBUG, + "Loading ELF section header complete.\r\n"); + } + /* Get ELF SHSTRTAB section */ + if ((*load_state & ELF_STATE_WAIT_FOR_SHSTRTAB) != 0) { + size_t shstrtab_size; + size_t shstrtab_offset; + int shstrndx; + void *shdr; + void **shstrtab; + + metal_log(METAL_LOG_DEBUG, "Loading ELF shstrtab.\r\n"); + shstrndx = elf_shstrndx(*img_info); + shdr = elf_get_section_from_index(*img_info, shstrndx); + if (!shdr) + return -RPROC_EINVAL; + elf_parse_section(*img_info, shdr, NULL, NULL, + NULL, &shstrtab_offset, + &shstrtab_size, NULL, NULL, + NULL, NULL); + if (offset > shstrtab_offset || + offset + len < shstrtab_offset + shstrtab_size) { + *noffset = shstrtab_offset; + *nlen = shstrtab_size; + return *load_state; + } + /* Calculate shstrtab section offset to the input image data */ + shstrtab_offset -= offset; + shstrtab = elf_shstrtab_ptr(*img_info); + *shstrtab = metal_allocate_memory(shstrtab_size); + if (!*shstrtab) + return -RPROC_ENOMEM; + memcpy(*shstrtab, + (const char *)img_data + shstrtab_offset, + shstrtab_size); + *load_state = (*load_state & (~ELF_STATE_MASK)) | + ELF_STATE_HDRS_COMPLETE; + *nlen = 0; + return *load_state; + } + return last_load_state; +} + +int elf_load(struct remoteproc *rproc, + const void *img_data, size_t offset, size_t len, + void **img_info, int last_load_state, + metal_phys_addr_t *da, + size_t *noffset, size_t *nlen, + unsigned char *padding, size_t *nmemsize) +{ + int *load_state; + const void *phdr; + + (void)rproc; + metal_assert(da); + metal_assert(noffset); + metal_assert(nlen); + if ((last_load_state & RPROC_LOADER_MASK) == RPROC_LOADER_NOT_READY) { + metal_log(METAL_LOG_DEBUG, + "needs to load header first\r\n"); + last_load_state = elf_load_header(img_data, offset, len, + img_info, last_load_state, + noffset, nlen); + if ((last_load_state & RPROC_LOADER_MASK) == + RPROC_LOADER_NOT_READY) { + *da = RPROC_LOAD_ANYADDR; + return last_load_state; + } + } + metal_assert(img_info && *img_info); + load_state = elf_load_state(*img_info); + /* For ELF, segment padding value is 0 */ + if (padding) + *padding = 0; + if ((*load_state & RPROC_LOADER_READY_TO_LOAD) != 0) { + int nsegment; + size_t nsegmsize = 0; + size_t nsize = 0; + int phnums = 0; + + nsegment = *load_state & ELF_NEXT_SEGMENT_MASK; + phdr = elf_next_load_segment(*img_info, &nsegment, da, + noffset, &nsize, &nsegmsize); + if (!phdr) { + metal_log(METAL_LOG_DEBUG, "cannot find more segment\r\n"); + *load_state = (*load_state & (~ELF_NEXT_SEGMENT_MASK)) | + (nsegment & ELF_NEXT_SEGMENT_MASK); + return *load_state; + } + *nlen = nsize; + *nmemsize = nsegmsize; + phnums = elf_phnum(*img_info); + metal_log(METAL_LOG_DEBUG, "segment: %d, total segs %d\r\n", + nsegment, phnums); + if (nsegment == phnums) { + *load_state = (*load_state & (~RPROC_LOADER_MASK)) | + RPROC_LOADER_POST_DATA_LOAD; + } + *load_state = (*load_state & (~ELF_NEXT_SEGMENT_MASK)) | + (nsegment & ELF_NEXT_SEGMENT_MASK); + } else if ((*load_state & RPROC_LOADER_POST_DATA_LOAD) != 0) { + if ((*load_state & ELF_STATE_HDRS_COMPLETE) == 0) { + last_load_state = elf_load_header(img_data, offset, + len, img_info, + last_load_state, + noffset, nlen); + if (last_load_state < 0) + return last_load_state; + if ((last_load_state & ELF_STATE_HDRS_COMPLETE) != 0) { + *load_state = (*load_state & + (~RPROC_LOADER_MASK)) | + RPROC_LOADER_LOAD_COMPLETE; + *nlen = 0; + } + *da = RPROC_LOAD_ANYADDR; + } else { + /* TODO: will handle relocate later */ + *nlen = 0; + *load_state = (*load_state & + (~RPROC_LOADER_MASK)) | + RPROC_LOADER_LOAD_COMPLETE; + } + } + return *load_state; +} + +void elf_release(void *img_info) +{ + if (!img_info) + return; + if (elf_is_64(img_info) == 0) { + struct elf32_info *elf_info = img_info; + + if (elf_info->phdrs) + metal_free_memory(elf_info->phdrs); + if (elf_info->shdrs) + metal_free_memory(elf_info->shdrs); + if (elf_info->shstrtab) + metal_free_memory(elf_info->shstrtab); + metal_free_memory(img_info); + + } else { + struct elf64_info *elf_info = img_info; + + if (elf_info->phdrs) + metal_free_memory(elf_info->phdrs); + if (elf_info->shdrs) + metal_free_memory(elf_info->shdrs); + if (elf_info->shstrtab) + metal_free_memory(elf_info->shstrtab); + metal_free_memory(img_info); + } +} + +metal_phys_addr_t elf_get_entry(void *elf_info) +{ + if (!elf_info) + return METAL_BAD_PHYS; + + if (elf_is_64(elf_info) == 0) { + Elf32_Ehdr *elf_ehdr = elf_info; + Elf32_Addr e_entry; + + e_entry = elf_ehdr->e_entry; + return (metal_phys_addr_t)e_entry; + } else { + Elf64_Ehdr *elf_ehdr = elf_info; + Elf64_Addr e_entry; + + e_entry = elf_ehdr->e_entry; + return (metal_phys_addr_t)e_entry; + } +} + +int elf_locate_rsc_table(void *elf_info, metal_phys_addr_t *da, + size_t *offset, size_t *size) +{ + char *sect_name = ".resource_table"; + void *shdr; + int *load_state; + + if (!elf_info) + return -RPROC_EINVAL; + + load_state = elf_load_state(elf_info); + if ((*load_state & ELF_STATE_HDRS_COMPLETE) == 0) + return -RPROC_ERR_LOADER_STATE; + shdr = elf_get_section_from_name(elf_info, sect_name); + if (!shdr) { + metal_assert(size); + *size = 0; + return 0; + } + elf_parse_section(elf_info, shdr, NULL, NULL, + da, offset, size, + NULL, NULL, NULL, NULL); + return 0; +} + +int elf_get_load_state(void *img_info) +{ + int *load_state; + + if (!img_info) + return -RPROC_EINVAL; + load_state = elf_load_state(img_info); + return *load_state; +} + +const struct loader_ops elf_ops = { + .load_header = elf_load_header, + .load_data = elf_load, + .locate_rsc_table = elf_locate_rsc_table, + .release = elf_release, + .get_entry = elf_get_entry, + .get_load_state = elf_get_load_state, +}; diff --git a/libraries/openamp_arduino/src/generic_device.c b/libraries/openamp_arduino/src/generic_device.c index d01fd3cd7..ec6e53834 100644 --- a/libraries/openamp_arduino/src/generic_device.c +++ b/libraries/openamp_arduino/src/generic_device.c @@ -17,7 +17,7 @@ int metal_generic_dev_sys_open(struct metal_device *dev) { struct metal_io_region *io; - unsigned i; + unsigned int i; /* map I/O memory regions */ for (i = 0; i < dev->num_regions; i++) { diff --git a/libraries/openamp_arduino/src/generic_io.c b/libraries/openamp_arduino/src/generic_io.c index 670f239d5..966bfc561 100644 --- a/libraries/openamp_arduino/src/generic_io.c +++ b/libraries/openamp_arduino/src/generic_io.c @@ -17,8 +17,8 @@ void metal_sys_io_mem_map(struct metal_io_region *io) size_t psize; size_t *va; - va = (size_t *)io->virt; - psize = io->size; + va = io->virt; + psize = (size_t)io->size; if (psize) { if (psize >> io->page_shift) psize = (size_t)1 << io->page_shift; diff --git a/libraries/openamp_arduino/src/init.c b/libraries/openamp_arduino/src/init.c index 315217741..5a6a0063d 100644 --- a/libraries/openamp_arduino/src/init.c +++ b/libraries/openamp_arduino/src/init.c @@ -11,6 +11,9 @@ int metal_init(const struct metal_init_params *params) { int error = 0; + if (_metal.common.ref_count++ != 0) + return 0; + memset(&_metal, 0, sizeof(_metal)); _metal.common.log_handler = params->log_handler; @@ -24,11 +27,15 @@ int metal_init(const struct metal_init_params *params) if (error) return error; + ++_metal.common.ref_count; return error; } void metal_finish(void) { + if (--_metal.common.ref_count != 0) + return; + metal_sys_finish(); memset(&_metal, 0, sizeof(_metal)); } diff --git a/libraries/openamp_arduino/src/io.c b/libraries/openamp_arduino/src/io.c index fccf1100e..7faf40502 100644 --- a/libraries/openamp_arduino/src/io.c +++ b/libraries/openamp_arduino/src/io.c @@ -4,17 +4,19 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#include #include +#include #include #include void metal_io_init(struct metal_io_region *io, void *virt, const metal_phys_addr_t *physmap, size_t size, - unsigned page_shift, unsigned int mem_flags, + unsigned int page_shift, unsigned int mem_flags, const struct metal_io_ops *ops) { - const struct metal_io_ops nops = {NULL, NULL, NULL, NULL, NULL, NULL}; + const struct metal_io_ops nops = { + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + }; io->virt = virt; io->physmap = physmap; @@ -37,7 +39,7 @@ int metal_io_block_read(struct metal_io_region *io, unsigned long offset, unsigned char *dest = dst; int retlen; - if (offset > io->size) + if (!ptr) return -ERANGE; if ((offset + len) > io->size) len = io->size - offset; @@ -74,7 +76,7 @@ int metal_io_block_write(struct metal_io_region *io, unsigned long offset, const unsigned char *source = src; int retlen; - if (offset > io->size) + if (!ptr) return -ERANGE; if ((offset + len) > io->size) len = io->size - offset; @@ -110,7 +112,7 @@ int metal_io_block_set(struct metal_io_region *io, unsigned long offset, unsigned char *ptr = metal_io_virt(io, offset); int retlen = len; - if (offset > io->size) + if (!ptr) return -ERANGE; if ((offset + len) > io->size) len = io->size - offset; @@ -123,7 +125,7 @@ int metal_io_block_set(struct metal_io_region *io, unsigned long offset, unsigned int i; for (i = 1; i < sizeof(int); i++) - cint |= ((unsigned int)value << (8 * i)); + cint |= ((unsigned int)value << (CHAR_BIT * i)); for (; len && ((uintptr_t)ptr % sizeof(int)); ptr++, len--) *(unsigned char *)ptr = (unsigned char) value; diff --git a/libraries/openamp_arduino/src/irq.c b/libraries/openamp_arduino/src/irq.c index e61bc7e83..c8578fa3c 100644 --- a/libraries/openamp_arduino/src/irq.c +++ b/libraries/openamp_arduino/src/irq.c @@ -1,279 +1,140 @@ /* - * Copyright (c) 2016 - 2017, Xilinx Inc. and Contributors. All rights reserved. + * Copyright (c) 2019, Xilinx Inc. and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ -/* - * @file generic/irq.c - * @brief generic libmetal irq definitions. - */ - #include #include -#include -#include -#include +#include #include #include -#include - -/** IRQ handlers descriptor structure */ -struct metal_irq_hddesc { - metal_irq_handler hd; /**< irq handler */ - void *drv_id; /**< id to identify the driver - of the irq handler */ - struct metal_device *dev; /**< device identifier */ - struct metal_list node; /**< node on irq handlers list */ -}; - -/** IRQ descriptor structure */ -struct metal_irq_desc { - int irq; /**< interrupt number */ - struct metal_list hdls; /**< interrupt handlers */ - struct metal_list node; /**< node on irqs list */ -}; -/** IRQ state structure */ -struct metal_irqs_state { - struct metal_list irqs; /**< interrupt descriptors */ - metal_mutex_t irq_lock; /**< access lock */ -}; +/** List of registered IRQ controller */ +static METAL_DECLARE_LIST(irq_cntrs); -static struct metal_irqs_state _irqs = { - .irqs = METAL_INIT_LIST(_irqs.irqs), - .irq_lock = METAL_MUTEX_INIT(_irqs.irq_lock), -}; - -int metal_irq_register(int irq, - metal_irq_handler hd, - struct metal_device *dev, - void *drv_id) +static int metal_irq_allocate(int irq_base, int irq_num) { - struct metal_irq_desc *irq_p = NULL; - struct metal_irq_hddesc *hdl_p; struct metal_list *node; - unsigned int irq_flags_save; + struct metal_irq_controller *cntr; + int irq_tocheck = irq_base, irq_end_tocheck; - if (irq < 0) { - metal_log(METAL_LOG_ERROR, - "%s: irq %d need to be a positive number\n", - __func__, irq); - return -EINVAL; + if (irq_num == 0) { + return METAL_IRQ_ANY; } - - if ((drv_id == NULL) || (hd == NULL)) { - metal_log(METAL_LOG_ERROR, "%s: irq %d need drv_id and hd.\n", - __func__, irq); - return -EINVAL; + if (irq_tocheck == METAL_IRQ_ANY) { + irq_tocheck = 0; } - - /* Search for irq in list */ - metal_mutex_acquire(&_irqs.irq_lock); - metal_list_for_each(&_irqs.irqs, node) { - irq_p = metal_container_of(node, struct metal_irq_desc, node); - - if (irq_p->irq == irq) { - struct metal_list *h_node; - - /* Check if drv_id already exist */ - metal_list_for_each(&irq_p->hdls, h_node) { - hdl_p = metal_container_of(h_node, - struct metal_irq_hddesc, - node); - - /* if drv_id already exist reject */ - if ((hdl_p->drv_id == drv_id) && - ((dev == NULL) || (hdl_p->dev == dev))) { - metal_log(METAL_LOG_ERROR, - "%s: irq %d already registered." - "Will not register again.\n", - __func__, irq); - metal_mutex_release(&_irqs.irq_lock); - return -EINVAL; - } + irq_end_tocheck = irq_tocheck + irq_num; + + metal_list_for_each(&irq_cntrs, node) { + int cntr_irq_base, cntr_irq_end; + + cntr = metal_container_of(node, + struct metal_irq_controller, node); + cntr_irq_base = cntr->irq_base; + cntr_irq_end = cntr_irq_base + cntr->irq_num; + if (irq_tocheck < cntr_irq_end && + irq_end_tocheck > cntr_irq_base) { + if (irq_base != METAL_IRQ_ANY) { + /* IRQ has been allocated */ + return METAL_IRQ_ANY; } - /* irq found and drv_id not used, get out of metal_list_for_each */ - break; + irq_tocheck = cntr_irq_end; + irq_end_tocheck = irq_tocheck + irq_num; } } - - /* Either need to add handler to an existing list or to a new one */ - hdl_p = metal_allocate_memory(sizeof(struct metal_irq_hddesc)); - if (hdl_p == NULL) { - metal_log(METAL_LOG_ERROR, - "%s: irq %d cannot allocate mem for drv_id %d.\n", - __func__, irq, drv_id); - metal_mutex_release(&_irqs.irq_lock); - return -ENOMEM; - } - hdl_p->hd = hd; - hdl_p->drv_id = drv_id; - hdl_p->dev = dev; - - /* interrupt already registered, add handler to existing list*/ - if ((irq_p != NULL) && (irq_p->irq == irq)) { - irq_flags_save = metal_irq_save_disable(); - metal_list_add_tail(&irq_p->hdls, &hdl_p->node); - metal_irq_restore_enable(irq_flags_save); - - metal_log(METAL_LOG_DEBUG, "%s: success, irq %d add drv_id %p \n", - __func__, irq, drv_id); - metal_mutex_release(&_irqs.irq_lock); - return 0; - } - - /* interrupt was not already registered, add */ - irq_p = metal_allocate_memory(sizeof(struct metal_irq_desc)); - if (irq_p == NULL) { - metal_log(METAL_LOG_ERROR, "%s: irq %d cannot allocate mem.\n", - __func__, irq); - metal_mutex_release(&_irqs.irq_lock); - return -ENOMEM; - } - irq_p->irq = irq; - metal_list_init(&irq_p->hdls); - metal_list_add_tail(&irq_p->hdls, &hdl_p->node); - - irq_flags_save = metal_irq_save_disable(); - metal_list_add_tail(&_irqs.irqs, &irq_p->node); - metal_irq_restore_enable(irq_flags_save); - - metal_log(METAL_LOG_DEBUG, "%s: success, added irq %d\n", __func__, irq); - metal_mutex_release(&_irqs.irq_lock); - return 0; -} - -/* helper function for metal_irq_unregister() */ -static void metal_irq_delete_node(struct metal_list *node, void *p_to_free) -{ - unsigned int irq_flags_save; - - irq_flags_save=metal_irq_save_disable(); - metal_list_del(node); - metal_irq_restore_enable(irq_flags_save); - metal_free_memory(p_to_free); + return irq_tocheck; } -int metal_irq_unregister(int irq, - metal_irq_handler hd, - struct metal_device *dev, - void *drv_id) +int metal_irq_register_controller(struct metal_irq_controller *cntr) { - struct metal_irq_desc *irq_p; + int irq_base; struct metal_list *node; - if (irq < 0) { - metal_log(METAL_LOG_ERROR, "%s: irq %d need to be a positive number\n", - __func__, irq); + if (cntr == NULL) { return -EINVAL; } - - /* Search for irq in list */ - metal_mutex_acquire(&_irqs.irq_lock); - metal_list_for_each(&_irqs.irqs, node) { - - irq_p = metal_container_of(node, struct metal_irq_desc, node); - - if (irq_p->irq == irq) { - struct metal_list *h_node, *h_prenode; - struct metal_irq_hddesc *hdl_p; - unsigned int delete_count = 0; - - metal_log(METAL_LOG_DEBUG, "%s: found irq %d\n", - __func__, irq); - - /* Search through handlers */ - metal_list_for_each(&irq_p->hdls, h_node) { - hdl_p = metal_container_of(h_node, - struct metal_irq_hddesc, - node); - - if (((hd == NULL) || (hdl_p->hd == hd)) && - ((drv_id == NULL) || (hdl_p->drv_id == drv_id)) && - ((dev == NULL) || (hdl_p->dev == dev))) { - metal_log(METAL_LOG_DEBUG, - "%s: unregister hd=%p drv_id=%p dev=%p\n", - __func__, hdl_p->hd, hdl_p->drv_id, hdl_p->dev); - h_prenode = h_node->prev; - metal_irq_delete_node(h_node, hdl_p); - h_node = h_prenode; - delete_count++; - } - } - - /* we did not find any handler to delete */ - if (!delete_count) { - metal_log(METAL_LOG_DEBUG, "%s: No matching entry\n", - __func__); - metal_mutex_release(&_irqs.irq_lock); - return -ENOENT; - - } - - /* if interrupt handlers list is empty, unregister interrupt */ - if (metal_list_is_empty(&irq_p->hdls)) { - metal_log(METAL_LOG_DEBUG, - "%s: handlers list empty, unregister interrupt\n", - __func__); - metal_irq_delete_node(node, irq_p); - } - - metal_log(METAL_LOG_DEBUG, "%s: success\n", __func__); - - metal_mutex_release(&_irqs.irq_lock); + metal_list_for_each(&irq_cntrs, node) { + if (node == &cntr->node) { return 0; } } - metal_log(METAL_LOG_DEBUG, "%s: No matching IRQ entry\n", __func__); + /* + * Allocate IRQ numbers which are not yet used by any IRQ + * controllers. + */ + irq_base = metal_irq_allocate(cntr->irq_base, cntr->irq_num); + if (irq_base == METAL_IRQ_ANY) { + return -EINVAL; + } + cntr->irq_base = irq_base; - metal_mutex_release(&_irqs.irq_lock); - return -ENOENT; + metal_list_add_tail(&irq_cntrs, &cntr->node); + return 0; } -unsigned int metal_irq_save_disable(void) +static struct metal_irq_controller *metal_irq_get_controller(int irq) { - return sys_irq_save_disable(); + struct metal_list *node; + struct metal_irq_controller *cntr; + + metal_list_for_each(&irq_cntrs, node) { + int irq_base, irq_end; + + cntr = (struct metal_irq_controller *) + metal_container_of(node, struct metal_irq_controller, + node); + irq_base = cntr->irq_base; + irq_end = irq_base + cntr->irq_num; + if (irq >= irq_base && irq < irq_end) { + return cntr; + } + } + return NULL; } -void metal_irq_restore_enable(unsigned int flags) +static void _metal_irq_set_enable(int irq, unsigned int state) { - sys_irq_restore_enable(flags); + struct metal_irq_controller *cntr; + + cntr = metal_irq_get_controller(irq); + if (cntr == NULL) { + return; + } + cntr->irq_set_enable(cntr, irq, state); } -void metal_irq_enable(unsigned int vector) +int metal_irq_register(int irq, + metal_irq_handler irq_handler, + void *arg) { - sys_irq_enable(vector); + struct metal_irq_controller *cntr; + struct metal_irq *irq_data; + + cntr = metal_irq_get_controller(irq); + if (cntr == NULL) { + return -EINVAL; + } + if (cntr->irq_register != NULL) { + return cntr->irq_register(cntr, irq, irq_handler, arg); + } + if (cntr->irqs == NULL) { + return -EINVAL; + } + irq_data = &cntr->irqs[irq - cntr->irq_base]; + irq_data->hd = irq_handler; + irq_data->arg = arg; + return 0; } -void metal_irq_disable(unsigned int vector) +void metal_irq_enable(unsigned int vector) { - sys_irq_disable(vector); + _metal_irq_set_enable((int)vector, METAL_IRQ_ENABLE); } -/** - * @brief default handler - */ -void metal_irq_isr(unsigned int vector) +void metal_irq_disable(unsigned int vector) { - struct metal_list *node; - struct metal_irq_desc *irq_p; - - metal_list_for_each(&_irqs.irqs, node) { - irq_p = metal_container_of(node, struct metal_irq_desc, node); - - if ((unsigned int)irq_p->irq == vector) { - struct metal_list *h_node; - struct metal_irq_hddesc *hdl_p; - - metal_list_for_each(&irq_p->hdls, h_node) { - hdl_p = metal_container_of(h_node, - struct metal_irq_hddesc, - node); - - (hdl_p->hd)(vector, hdl_p->drv_id); - } - } - } + _metal_irq_set_enable((int)vector, METAL_IRQ_DISABLE); } diff --git a/libraries/openamp_arduino/src/log.c b/libraries/openamp_arduino/src/log.c index 719fbd82b..22c8b9bd5 100644 --- a/libraries/openamp_arduino/src/log.c +++ b/libraries/openamp_arduino/src/log.c @@ -10,15 +10,13 @@ #include #include -#define DEFAULT_LOGGER_ON - void metal_default_log_handler(enum metal_log_level level, const char *format, ...) { #ifdef DEFAULT_LOGGER_ON char msg[1024]; va_list args; - static const char *level_strs[] = { + static const char * const level_strs[] = { "metal: emergency: ", "metal: alert: ", "metal: critical: ", @@ -36,7 +34,7 @@ void metal_default_log_handler(enum metal_log_level level, if (level <= METAL_LOG_EMERGENCY || level > METAL_LOG_DEBUG) level = METAL_LOG_EMERGENCY; - printf("%s%s", level_strs[level], msg); + fprintf(stderr, "%s%s", level_strs[level], msg); #else (void)level; (void)format; diff --git a/libraries/openamp_arduino/src/mailbox_hsem_if.c b/libraries/openamp_arduino/src/mailbox_hsem_if.c index 04ab7f583..851ca98a5 100644 --- a/libraries/openamp_arduino/src/mailbox_hsem_if.c +++ b/libraries/openamp_arduino/src/mailbox_hsem_if.c @@ -77,14 +77,14 @@ void HAL_HSEM_FreeCallback(uint32_t SemMask) UNUSED(SemMask); msg_received = RX_NEW_MSG; - osSignalSet(eventHandlerThreadId, 0x1); - #ifdef CORE_CM7 HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_1)); #endif #ifdef CORE_CM4 HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_0)); #endif + + osSignalSet(eventHandlerThreadId, 0x1); } /** diff --git a/libraries/openamp_arduino/src/metal/alloc.h b/libraries/openamp_arduino/src/metal/alloc.h index b82a09af1..02f860b12 100755 --- a/libraries/openamp_arduino/src/metal/alloc.h +++ b/libraries/openamp_arduino/src/metal/alloc.h @@ -1,46 +1,53 @@ -/* - * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file alloc.h - * @brief Memory allocation handling primitives for libmetal. - */ - -#ifndef __METAL_ALLOC__H__ -#define __METAL_ALLOC__H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup Memory Allocation Interfaces - * @{ */ - -/** - * @brief allocate requested memory size - * return a pointer to the allocated memory - * - * @param[in] size size in byte of requested memory - * @return memory pointer, or 0 if it failed to allocate - */ -static inline void *metal_allocate_memory(unsigned int size); - -/** - * @brief free the memory previously allocated - * - * @param[in] ptr pointer to memory - */ -static inline void metal_free_memory(void *ptr); - -#include - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_ALLOC__H__ */ +/* + * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file alloc.h + * @brief Memory allocation handling primitives for libmetal. + */ + +#ifndef __METAL_ALLOC__H__ +#define __METAL_ALLOC__H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup Memory Allocation Interfaces + * @{ + */ + +/** + * @brief allocate requested memory size + * return a pointer to the allocated memory + * + * @param[in] size size in byte of requested memory + * @return memory pointer, or 0 if it failed to allocate + */ +static inline void *metal_allocate_memory(unsigned int size) +{ + return __metal_allocate_memory(size); +} + +/** + * @brief free the memory previously allocated + * + * @param[in] ptr pointer to memory + */ +static inline void metal_free_memory(void *ptr) +{ + __metal_free_memory(ptr); +} + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_ALLOC__H__ */ diff --git a/libraries/openamp_arduino/src/metal/assert.h b/libraries/openamp_arduino/src/metal/assert.h index 8357fdf5b..4476b641a 100755 --- a/libraries/openamp_arduino/src/metal/assert.h +++ b/libraries/openamp_arduino/src/metal/assert.h @@ -1,26 +1,24 @@ -/* - * Copyright (c) 2018, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file assert.h - * @brief Assertion support. - */ - -#ifndef __METAL_ASSERT__H__ -#define __METAL_ASSERT__H__ - -//#include -//#include -#include - -/** - * @brief Assertion macro. - * @param cond Condition to test. - */ -#define metal_assert(cond) metal_sys_assert(cond) - -#endif /* __METAL_ASSERT_H__ */ - +/* + * Copyright (c) 2018, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file assert.h + * @brief Assertion support. + */ + +#ifndef __METAL_ASSERT__H__ +#define __METAL_ASSERT__H__ + +#include + +/** + * @brief Assertion macro. + * @param cond Condition to test. + */ +#define metal_assert(cond) metal_sys_assert(cond) + +#endif /* __METAL_ASSERT_H__ */ + diff --git a/libraries/openamp_arduino/src/metal/atomic.h b/libraries/openamp_arduino/src/metal/atomic.h index 14f771eb8..ce8595dbf 100755 --- a/libraries/openamp_arduino/src/metal/atomic.h +++ b/libraries/openamp_arduino/src/metal/atomic.h @@ -1,32 +1,113 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file atomic.h - * @brief Atomic primitives for libmetal. - */ - -#ifndef __METAL_ATOMIC__H__ -#define __METAL_ATOMIC__H__ - -#include - -#if defined(HAVE_STDATOMIC_H) && !defined (__CC_ARM) && \ - !defined(__STDC_NO_ATOMICS__) && !defined(__cplusplus) - -# include - -#ifndef atomic_thread_fence -#define atomic_thread_fence(order) -#endif - -#elif defined(__GNUC__) -# include -#else -# include -#endif - -#endif /* __METAL_ATOMIC__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file atomic.h + * @brief Atomic primitives for libmetal. + */ + +#ifndef __METAL_ATOMIC__H__ +#define __METAL_ATOMIC__H__ + +#include + +#if defined(__cplusplus) +# include + +/* + * has the same functionality as but all members are only + * accessible in the std namespace. As the rest of libmetal is pure C, it does + * not know about namespaces, even when compiled as part of a C++ file. So we + * just export the members of into the global namespace. + */ +# include +using std::atomic_flag; +using std::memory_order; +using std::memory_order_relaxed; +using std::memory_order_consume; +using std::memory_order_acquire; +using std::memory_order_release; +using std::memory_order_acq_rel; +using std::memory_order_seq_cst; + +using std::atomic_bool; +using std::atomic_char; +using std::atomic_schar; +using std::atomic_uchar; +using std::atomic_short; +using std::atomic_ushort; +using std::atomic_int; +using std::atomic_uint; +using std::atomic_long; +using std::atomic_ulong; +using std::atomic_llong; +using std::atomic_ullong; +using std::atomic_char16_t; +using std::atomic_char32_t; +using std::atomic_wchar_t; +using std::atomic_int_least8_t; +using std::atomic_uint_least8_t; +using std::atomic_int_least16_t; +using std::atomic_uint_least16_t; +using std::atomic_int_least32_t; +using std::atomic_uint_least32_t; +using std::atomic_int_least64_t; +using std::atomic_uint_least64_t; +using std::atomic_int_fast8_t; +using std::atomic_uint_fast8_t; +using std::atomic_int_fast16_t; +using std::atomic_uint_fast16_t; +using std::atomic_int_fast32_t; +using std::atomic_uint_fast32_t; +using std::atomic_int_fast64_t; +using std::atomic_uint_fast64_t; +using std::atomic_intptr_t; +using std::atomic_uintptr_t; +using std::atomic_size_t; +using std::atomic_ptrdiff_t; +using std::atomic_intmax_t; +using std::atomic_uintmax_t; + +using std::atomic_flag_test_and_set; +using std::atomic_flag_test_and_set_explicit; +using std::atomic_flag_clear; +using std::atomic_flag_clear_explicit; +using std::atomic_init; +using std::atomic_is_lock_free; +using std::atomic_store; +using std::atomic_store_explicit; +using std::atomic_load; +using std::atomic_load_explicit; +using std::atomic_exchange; +using std::atomic_exchange_explicit; +using std::atomic_compare_exchange_strong; +using std::atomic_compare_exchange_strong_explicit; +using std::atomic_compare_exchange_weak; +using std::atomic_compare_exchange_weak_explicit; +using std::atomic_fetch_add; +using std::atomic_fetch_add_explicit; +using std::atomic_fetch_sub; +using std::atomic_fetch_sub_explicit; +using std::atomic_fetch_or; +using std::atomic_fetch_or_explicit; +using std::atomic_fetch_xor; +using std::atomic_fetch_xor_explicit; +using std::atomic_fetch_and; +using std::atomic_fetch_and_explicit; +using std::atomic_thread_fence; +using std::atomic_signal_fence; + +#elif defined(HAVE_STDATOMIC_H) && !defined(__CC_ARM) && \ + !defined(__STDC_NO_ATOMICS__) +# include +# include +#elif defined(__GNUC__) +# include +#else +# include +#endif + +#endif /* __METAL_ATOMIC__H__ */ diff --git a/libraries/openamp_arduino/src/metal/cache.h b/libraries/openamp_arduino/src/metal/cache.h index 54a015594..02917b411 100755 --- a/libraries/openamp_arduino/src/metal/cache.h +++ b/libraries/openamp_arduino/src/metal/cache.h @@ -1,57 +1,57 @@ -/* - * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file cache.h - * @brief CACHE operation primitives for libmetal. - */ - -#ifndef __METAL_CACHE__H__ -#define __METAL_CACHE__H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/** \defgroup cache CACHE Interfaces - * @{ */ - -/** - * @brief flush specified data cache - * - * @param[in] addr start memory logical address - * @param[in] len length of memory - * If addr is NULL, and len is 0, - * It will flush the whole data cache. - */ -static inline void metal_cache_flush(void *addr, unsigned int len) -{ - __metal_cache_flush(addr, len); -} - -/** - * @brief invalidate specified data cache - * - * @param[in] addr start memory logical address - * @param[in] len length of memory - * If addr is NULL, and len is 0, - * It will invalidate the whole data cache. - */ -static inline void metal_cache_invalidate(void *addr, unsigned int len) -{ - __metal_cache_invalidate(addr, len); -} - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_CACHE__H__ */ +/* + * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file cache.h + * @brief CACHE operation primitives for libmetal. + */ + +#ifndef __METAL_CACHE__H__ +#define __METAL_CACHE__H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup cache CACHE Interfaces + * @{ + */ + +/** + * @brief flush specified data cache + * + * @param[in] addr start memory logical address + * @param[in] len length of memory + * If addr is NULL, and len is 0, + * It will flush the whole data cache. + */ +static inline void metal_cache_flush(void *addr, unsigned int len) +{ + __metal_cache_flush(addr, len); +} + +/** + * @brief invalidate specified data cache + * + * @param[in] addr start memory logical address + * @param[in] len length of memory + * If addr is NULL, and len is 0, + * It will invalidate the whole data cache. + */ +static inline void metal_cache_invalidate(void *addr, unsigned int len) +{ + __metal_cache_invalidate(addr, len); +} + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_CACHE__H__ */ diff --git a/libraries/openamp_arduino/src/metal/compiler.h b/libraries/openamp_arduino/src/metal/compiler.h index ec4c67517..08c20943d 100755 --- a/libraries/openamp_arduino/src/metal/compiler.h +++ b/libraries/openamp_arduino/src/metal/compiler.h @@ -1,25 +1,25 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file compiler.h - * @brief Compiler specific primitives for libmetal. - */ - -#ifndef __METAL_COMPILER__H__ -#define __METAL_COMPILER__H__ - -#if defined(__GNUC__) -# include -#elif defined(__ICCARM__) -# include -#elif defined (__CC_ARM) -# error "MDK-ARM ARMCC compiler requires the GNU extentions to work correctly" -#else -# error "Missing compiler support" -#endif - -#endif /* __METAL_COMPILER__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file compiler.h + * @brief Compiler specific primitives for libmetal. + */ + +#ifndef __METAL_COMPILER__H__ +#define __METAL_COMPILER__H__ + +#if defined(__GNUC__) +# include +#elif defined(__ICCARM__) +# include +#elif defined(__CC_ARM) +# error "MDK-ARM ARMCC compiler requires the GNU extensions to work correctly" +#else +# error "Missing compiler support" +#endif + +#endif /* __METAL_COMPILER__H__ */ diff --git a/libraries/openamp_arduino/src/metal/compiler/gcc/atomic.h b/libraries/openamp_arduino/src/metal/compiler/gcc/atomic.h index 4470342db..7d662992e 100755 --- a/libraries/openamp_arduino/src/metal/compiler/gcc/atomic.h +++ b/libraries/openamp_arduino/src/metal/compiler/gcc/atomic.h @@ -1,123 +1,124 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file gcc/atomic.h - * @brief GCC specific atomic primitives for libmetal. - */ - -#ifndef __METAL_GCC_ATOMIC__H__ -#define __METAL_GCC_ATOMIC__H__ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef int atomic_flag; -typedef char atomic_char; -typedef unsigned char atomic_uchar; -typedef short atomic_short; -typedef unsigned short atomic_ushort; -typedef int atomic_int; -typedef unsigned int atomic_uint; -typedef long atomic_long; -typedef unsigned long atomic_ulong; -typedef long long atomic_llong; -typedef unsigned long long atomic_ullong; - -#define ATOMIC_FLAG_INIT 0 -#define ATOMIC_VAR_INIT(VAL) (VAL) - -typedef enum { - memory_order_relaxed, - memory_order_consume, - memory_order_acquire, - memory_order_release, - memory_order_acq_rel, - memory_order_seq_cst, -} memory_order; - -#define atomic_flag_test_and_set(FLAG) \ - __sync_lock_test_and_set((FLAG), 1) -#define atomic_flag_test_and_set_explicit(FLAG, MO) \ - atomic_flag_test_and_set(FLAG) -#define atomic_flag_clear(FLAG) \ - __sync_lock_release((FLAG)) -#define atomic_flag_clear_explicit(FLAG, MO) \ - atomic_flag_clear(FLAG) -#define atomic_init(OBJ, VAL) \ - do { *(OBJ) = (VAL); } while (0) -#define atomic_is_lock_free(OBJ) \ - (sizeof(*(OBJ)) <= sizeof(long)) -#define atomic_store(OBJ, VAL) \ - do { *(OBJ) = (VAL); __sync_synchronize(); } while (0) -#define atomic_store_explicit(OBJ, VAL, MO) \ - atomic_store((OBJ), (VAL)) -#define atomic_load(OBJ) \ - ({ __sync_synchronize(); *(OBJ); }) -#define atomic_load_explicit(OBJ, MO) \ - atomic_load(OBJ) -#define atomic_exchange(OBJ, DES) \ - ({ \ - typeof(OBJ) obj = (OBJ); \ - typeof(*obj) des = (DES); \ - typeof(*obj) expval; \ - typeof(*obj) oldval = atomic_load(obj); \ - do { \ - expval = oldval; \ - oldval = __sync_val_compare_and_swap( \ - obj, expval, des); \ - } while (oldval != expval); \ - oldval; \ - }) -#define atomic_exchange_explicit(OBJ, DES, MO) \ - atomic_exchange((OBJ), (DES)) -#define atomic_compare_exchange_strong(OBJ, EXP, DES) \ - ({ \ - typeof(OBJ) obj = (OBJ); \ - typeof(EXP) exp = (EXP); \ - typeof(*obj) expval = *exp; \ - typeof(*obj) oldval = __sync_val_compare_and_swap( \ - obj, expval, (DES)); \ - *exp = oldval; \ - oldval == expval; \ - }) -#define atomic_compare_exchange_strong_explicit(OBJ, EXP, DES, MO) \ - atomic_compare_exchange_strong((OBJ), (EXP), (DES)) -#define atomic_compare_exchange_weak(OBJ, EXP, DES) \ - atomic_compare_exchange_strong((OBJ), (EXP), (DES)) -#define atomic_compare_exchange_weak_explicit(OBJ, EXP, DES, MO) \ - atomic_compare_exchange_weak((OBJ), (EXP), (DES)) -#define atomic_fetch_add(OBJ, VAL) \ - __sync_fetch_and_add((OBJ), (VAL)) -#define atomic_fetch_add_explicit(OBJ, VAL, MO) \ - atomic_fetch_add((OBJ), (VAL)) -#define atomic_fetch_sub(OBJ, VAL) \ - __sync_fetch_and_sub((OBJ), (VAL)) -#define atomic_fetch_sub_explicit(OBJ, VAL, MO) \ - atomic_fetch_sub((OBJ), (VAL)) -#define atomic_fetch_or(OBJ, VAL) \ - __sync_fetch_and_or((OBJ), (VAL)) -#define atomic_fetch_or_explicit(OBJ, VAL, MO) \ - atomic_fetch_or((OBJ), (VAL)) -#define atomic_fetch_xor(OBJ, VAL) \ - __sync_fetch_and_xor((OBJ), (VAL)) -#define atomic_fetch_xor_explicit(OBJ, VAL, MO) \ - atomic_fetch_xor((OBJ), (VAL)) -#define atomic_fetch_and(OBJ, VAL) \ - __sync_fetch_and_and((OBJ), (VAL)) -#define atomic_fetch_and_explicit(OBJ, VAL, MO) \ - atomic_fetch_and((OBJ), (VAL)) -#define atomic_thread_fence(MO) \ - __sync_synchronize() -#define atomic_signal_fence(MO) \ - __sync_synchronize() - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_GCC_ATOMIC__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file gcc/atomic.h + * @brief GCC specific atomic primitives for libmetal. + */ + +#ifndef __METAL_GCC_ATOMIC__H__ +#define __METAL_GCC_ATOMIC__H__ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef int atomic_flag; +typedef char atomic_char; +typedef unsigned char atomic_uchar; +typedef short atomic_short; +typedef unsigned short atomic_ushort; +typedef int atomic_int; +typedef unsigned int atomic_uint; +typedef atomic_uint atomic_uintptr_t; +typedef long atomic_long; +typedef unsigned long atomic_ulong; +typedef long long atomic_llong; +typedef unsigned long long atomic_ullong; + +#define ATOMIC_FLAG_INIT 0 +#define ATOMIC_VAR_INIT(VAL) (VAL) + +typedef enum { + memory_order_relaxed, + memory_order_consume, + memory_order_acquire, + memory_order_release, + memory_order_acq_rel, + memory_order_seq_cst, +} memory_order; + +#define atomic_flag_test_and_set(FLAG) \ + __sync_lock_test_and_set((FLAG), 1) +#define atomic_flag_test_and_set_explicit(FLAG, MO) \ + atomic_flag_test_and_set(FLAG) +#define atomic_flag_clear(FLAG) \ + __sync_lock_release((FLAG)) +#define atomic_flag_clear_explicit(FLAG, MO) \ + atomic_flag_clear(FLAG) +#define atomic_init(OBJ, VAL) \ + do { *(OBJ) = (VAL); } while (0) +#define atomic_is_lock_free(OBJ) \ + (sizeof(*(OBJ)) <= sizeof(long)) +#define atomic_store(OBJ, VAL) \ + do { *(OBJ) = (VAL); __sync_synchronize(); } while (0) +#define atomic_store_explicit(OBJ, VAL, MO) \ + atomic_store((OBJ), (VAL)) +#define atomic_load(OBJ) \ + ({ __sync_synchronize(); *(OBJ); }) +#define atomic_load_explicit(OBJ, MO) \ + atomic_load(OBJ) +#define atomic_exchange(OBJ, DES) \ + ({ \ + __typeof__(OBJ) obj = (OBJ); \ + __typeof__(*obj) des = (DES); \ + __typeof__(*obj) expval; \ + __typeof__(*obj) oldval = atomic_load(obj); \ + do { \ + expval = oldval; \ + oldval = __sync_val_compare_and_swap( \ + obj, expval, des); \ + } while (oldval != expval); \ + oldval; \ + }) +#define atomic_exchange_explicit(OBJ, DES, MO) \ + atomic_exchange((OBJ), (DES)) +#define atomic_compare_exchange_strong(OBJ, EXP, DES) \ + ({ \ + __typeof__(OBJ) obj = (OBJ); \ + __typeof__(EXP) exp = (EXP); \ + __typeof__(*obj) expval = *exp; \ + __typeof__(*obj) oldval = __sync_val_compare_and_swap( \ + obj, expval, (DES)); \ + *exp = oldval; \ + oldval == expval; \ + }) +#define atomic_compare_exchange_strong_explicit(OBJ, EXP, DES, MO) \ + atomic_compare_exchange_strong((OBJ), (EXP), (DES)) +#define atomic_compare_exchange_weak(OBJ, EXP, DES) \ + atomic_compare_exchange_strong((OBJ), (EXP), (DES)) +#define atomic_compare_exchange_weak_explicit(OBJ, EXP, DES, MO) \ + atomic_compare_exchange_weak((OBJ), (EXP), (DES)) +#define atomic_fetch_add(OBJ, VAL) \ + __sync_fetch_and_add((OBJ), (VAL)) +#define atomic_fetch_add_explicit(OBJ, VAL, MO) \ + atomic_fetch_add((OBJ), (VAL)) +#define atomic_fetch_sub(OBJ, VAL) \ + __sync_fetch_and_sub((OBJ), (VAL)) +#define atomic_fetch_sub_explicit(OBJ, VAL, MO) \ + atomic_fetch_sub((OBJ), (VAL)) +#define atomic_fetch_or(OBJ, VAL) \ + __sync_fetch_and_or((OBJ), (VAL)) +#define atomic_fetch_or_explicit(OBJ, VAL, MO) \ + atomic_fetch_or((OBJ), (VAL)) +#define atomic_fetch_xor(OBJ, VAL) \ + __sync_fetch_and_xor((OBJ), (VAL)) +#define atomic_fetch_xor_explicit(OBJ, VAL, MO) \ + atomic_fetch_xor((OBJ), (VAL)) +#define atomic_fetch_and(OBJ, VAL) \ + __sync_fetch_and_and((OBJ), (VAL)) +#define atomic_fetch_and_explicit(OBJ, VAL, MO) \ + atomic_fetch_and((OBJ), (VAL)) +#define atomic_thread_fence(MO) \ + __sync_synchronize() +#define atomic_signal_fence(MO) \ + __sync_synchronize() + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_GCC_ATOMIC__H__ */ diff --git a/libraries/openamp_arduino/src/metal/compiler/gcc/compiler.h b/libraries/openamp_arduino/src/metal/compiler/gcc/compiler.h index 7295ca899..e4d1bc9b1 100755 --- a/libraries/openamp_arduino/src/metal/compiler/gcc/compiler.h +++ b/libraries/openamp_arduino/src/metal/compiler/gcc/compiler.h @@ -1,27 +1,45 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file gcc/compiler.h - * @brief GCC specific primitives for libmetal. - */ - -#ifndef __METAL_GCC_COMPILER__H__ -#define __METAL_GCC_COMPILER__H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define restrict __restrict__ -#define metal_align(n) __attribute__((aligned(n))) -#define metal_weak __attribute__((weak)) - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_GCC_COMPILER__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file gcc/compiler.h + * @brief GCC specific primitives for libmetal. + */ + +#ifndef __METAL_GCC_COMPILER__H__ +#define __METAL_GCC_COMPILER__H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define restrict __restrict__ +#define metal_align(n) __attribute__((aligned(n))) +#define metal_weak __attribute__((weak)) + +#if defined(__STRICT_ANSI__) +#define metal_asm __asm__ +#else +/* + * Even though __asm__ is always available in mainline GCC, we use asm in + * the non-strict modes for compatibility with other compilers that define + * __GNUC__ + */ +#define metal_asm asm +#endif + +#define METAL_PACKED_BEGIN +#define METAL_PACKED_END __attribute__((__packed__)) + +#ifndef __deprecated +#define __deprecated __attribute__((deprecated)) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_GCC_COMPILER__H__ */ diff --git a/libraries/openamp_arduino/src/metal/condition.h b/libraries/openamp_arduino/src/metal/condition.h index 953293680..b5c7b2dbe 100755 --- a/libraries/openamp_arduino/src/metal/condition.h +++ b/libraries/openamp_arduino/src/metal/condition.h @@ -1,73 +1,74 @@ -/* - * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file condition.h - * @brief Condition variable for libmetal. - */ - -#ifndef __METAL_CONDITION__H__ -#define __METAL_CONDITION__H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup condition Condition Variable Interfaces - * @{ */ - -/** Opaque libmetal condition variable data structure. */ -struct metal_condition; - -/** - * @brief Initialize a libmetal condition variable. - * @param[in] cv condition variable to initialize. - */ -static inline void metal_condition_init(struct metal_condition *cv); - -/** - * @brief Notify one waiter. - * Before calling this function, the caller - * should have acquired the mutex. - * @param[in] cv condition variable - * @return zero on no errors, non-zero on errors - * @see metal_condition_wait, metal_condition_broadcast - */ -static inline int metal_condition_signal(struct metal_condition *cv); - -/** - * @brief Notify all waiters. - * Before calling this function, the caller - * should have acquired the mutex. - * @param[in] cv condition variable - * @return zero on no errors, non-zero on errors - * @see metal_condition_wait, metal_condition_signal - */ -static inline int metal_condition_broadcast(struct metal_condition *cv); - -/** - * @brief Block until the condition variable is notified. - * Before calling this function, the caller should - * have acquired the mutex. - * @param[in] cv condition variable - * @param[in] m mutex - * @return 0 on success, non-zero on failure. - * @see metal_condition_signal - */ -int metal_condition_wait(struct metal_condition *cv, metal_mutex_t *m); - -#include - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_CONDITION__H__ */ +/* + * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file condition.h + * @brief Condition variable for libmetal. + */ + +#ifndef __METAL_CONDITION__H__ +#define __METAL_CONDITION__H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup condition Condition Variable Interfaces + * @{ + */ + +/** Opaque libmetal condition variable data structure. */ +struct metal_condition; + +/** + * @brief Initialize a libmetal condition variable. + * @param[in] cv condition variable to initialize. + */ +static inline void metal_condition_init(struct metal_condition *cv); + +/** + * @brief Notify one waiter. + * Before calling this function, the caller + * should have acquired the mutex. + * @param[in] cv condition variable + * @return zero on no errors, non-zero on errors + * @see metal_condition_wait, metal_condition_broadcast + */ +static inline int metal_condition_signal(struct metal_condition *cv); + +/** + * @brief Notify all waiters. + * Before calling this function, the caller + * should have acquired the mutex. + * @param[in] cv condition variable + * @return zero on no errors, non-zero on errors + * @see metal_condition_wait, metal_condition_signal + */ +static inline int metal_condition_broadcast(struct metal_condition *cv); + +/** + * @brief Block until the condition variable is notified. + * Before calling this function, the caller should + * have acquired the mutex. + * @param[in] cv condition variable + * @param[in] m mutex + * @return 0 on success, non-zero on failure. + * @see metal_condition_signal + */ +int metal_condition_wait(struct metal_condition *cv, metal_mutex_t *m); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#include + +#endif /* __METAL_CONDITION__H__ */ diff --git a/libraries/openamp_arduino/src/metal/config.h b/libraries/openamp_arduino/src/metal/config.h index ce08057fc..3de906067 100755 --- a/libraries/openamp_arduino/src/metal/config.h +++ b/libraries/openamp_arduino/src/metal/config.h @@ -20,13 +20,13 @@ extern "C" { #define METAL_VER_MAJOR 0 /** Library minor version number. */ -#define METAL_VER_MINOR 1 +#define METAL_VER_MINOR 5 /** Library patch level. */ #define METAL_VER_PATCH 0 /** Library version string. */ -#define METAL_VER "0.1.0" +#define METAL_VER "0.5.0" /** System type (linux, generic, ...). */ #define METAL_SYSTEM "generic" diff --git a/libraries/openamp_arduino/src/metal/cpu.h b/libraries/openamp_arduino/src/metal/cpu.h index 5537afba4..26dbaa2af 100755 --- a/libraries/openamp_arduino/src/metal/cpu.h +++ b/libraries/openamp_arduino/src/metal/cpu.h @@ -1,17 +1,17 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file cpu.h - * @brief CPU primitives for libmetal. - */ - -#ifndef __METAL_CPU__H__ -#define __METAL_CPU__H__ - -# include - -#endif /* __METAL_CPU__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file cpu.h + * @brief CPU primitives for libmetal. + */ + +#ifndef __METAL_CPU__H__ +#define __METAL_CPU__H__ + +# include + +#endif /* __METAL_CPU__H__ */ diff --git a/libraries/openamp_arduino/src/metal/device.h b/libraries/openamp_arduino/src/metal/device.h index c78b50dd1..fab1c147d 100755 --- a/libraries/openamp_arduino/src/metal/device.h +++ b/libraries/openamp_arduino/src/metal/device.h @@ -1,176 +1,177 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file device.h - * @brief Bus abstraction for libmetal. - */ - -#ifndef __METAL_BUS__H__ -#define __METAL_BUS__H__ - -#include -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup device Bus Abstraction - * @{ */ - -#ifndef METAL_MAX_DEVICE_REGIONS -#define METAL_MAX_DEVICE_REGIONS 32 -#endif - -struct metal_bus; -struct metal_device; - -/** Bus operations. */ -struct metal_bus_ops { - void (*bus_close)(struct metal_bus *bus); - int (*dev_open)(struct metal_bus *bus, - const char *dev_name, - struct metal_device **device); - void (*dev_close)(struct metal_bus *bus, - struct metal_device *device); - void (*dev_irq_ack)(struct metal_bus *bus, - struct metal_device *device, - int irq); - int (*dev_dma_map)(struct metal_bus *bus, - struct metal_device *device, - uint32_t dir, - struct metal_sg *sg_in, - int nents_in, - struct metal_sg *sg_out); - void (*dev_dma_unmap)(struct metal_bus *bus, - struct metal_device *device, - uint32_t dir, - struct metal_sg *sg, - int nents); -}; - -/** Libmetal bus structure. */ -struct metal_bus { - const char *name; - struct metal_bus_ops ops; - struct metal_list devices; - struct metal_list node; -}; - -/** Libmetal generic bus. */ -extern struct metal_bus metal_generic_bus; - -/** Libmetal device structure. */ -struct metal_device { - const char *name; /**< Device name */ - struct metal_bus *bus; /**< Bus that contains device */ - unsigned num_regions; /**< Number of I/O regions in - device */ - struct metal_io_region regions[METAL_MAX_DEVICE_REGIONS]; /**< Array of - I/O regions in device*/ - struct metal_list node; /**< Node on bus' list of devices */ - int irq_num; /**< Number of IRQs per device */ - void *irq_info; /**< IRQ ID */ -}; - -/** - * @brief Register a libmetal bus. - * @param[in] bus Pre-initialized bus structure. - * @return 0 on success, or -errno on failure. - */ -extern int metal_bus_register(struct metal_bus *bus); - -/** - * @brief Unregister a libmetal bus. - * @param[in] bus Pre-registered bus structure. - * @return 0 on success, or -errno on failure. - */ -extern int metal_bus_unregister(struct metal_bus *bus); - -/** - * @brief Find a libmetal bus by name. - * @param[in] name Bus name. - * @param[out] bus Returned bus handle. - * @return 0 on success, or -errno on failure. - */ -extern int metal_bus_find(const char *name, struct metal_bus **bus); - -/** - * @brief Statically register a generic libmetal device. - * - * In non-Linux systems, devices are always required to be statically - * registered at application initialization. - * In Linux system, devices can be dynamically opened via sysfs or libfdt based - * enumeration at runtime. - * This interface is used for static registration of devices. Subsequent calls - * to metal_device_open() look up in this list of pre-registered devices on the - * "generic" bus. - * "generic" bus is used on non-Linux system to group the memory mapped devices. - * - * @param[in] device Generic device. - * @return 0 on success, or -errno on failure. - */ -extern int metal_register_generic_device(struct metal_device *device); - -/** - * @brief Open a libmetal device by name. - * @param[in] bus_name Bus name. - * @param[in] dev_name Device name. - * @param[out] device Returned device handle. - * @return 0 on success, or -errno on failure. - */ -extern int metal_device_open(const char *bus_name, const char *dev_name, - struct metal_device **device); - -/** - * @brief Close a libmetal device. - * @param[in] device Device handle. - */ -extern void metal_device_close(struct metal_device *device); - -/** - * @brief Get an I/O region accessor for a device region. - * - * @param[in] device Device handle. - * @param[in] index Region index. - * @return I/O accessor handle, or NULL on failure. - */ -static inline struct metal_io_region * -metal_device_io_region(struct metal_device *device, unsigned index) -{ - return (index < device->num_regions - ? &device->regions[index] - : NULL); -} - -/** @} */ - -#ifdef METAL_INTERNAL -extern int metal_generic_dev_sys_open(struct metal_device *dev); -extern int metal_generic_dev_open(struct metal_bus *bus, const char *dev_name, - struct metal_device **device); -extern int metal_generic_dev_dma_map(struct metal_bus *bus, - struct metal_device *device, - uint32_t dir, - struct metal_sg *sg_in, - int nents_in, - struct metal_sg *sg_out); -extern void metal_generic_dev_dma_unmap(struct metal_bus *bus, - struct metal_device *device, - uint32_t dir, - struct metal_sg *sg, - int nents); -#endif /* METAL_INTERNAL */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_BUS__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file device.h + * @brief Bus abstraction for libmetal. + */ + +#ifndef __METAL_BUS__H__ +#define __METAL_BUS__H__ + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup device Bus Abstraction + * @{ + */ + +#ifndef METAL_MAX_DEVICE_REGIONS +#define METAL_MAX_DEVICE_REGIONS 32 +#endif + +struct metal_bus; +struct metal_device; + +/** Bus operations. */ +struct metal_bus_ops { + void (*bus_close)(struct metal_bus *bus); + int (*dev_open)(struct metal_bus *bus, + const char *dev_name, + struct metal_device **device); + void (*dev_close)(struct metal_bus *bus, + struct metal_device *device); + void (*dev_irq_ack)(struct metal_bus *bus, + struct metal_device *device, + int irq); + int (*dev_dma_map)(struct metal_bus *bus, + struct metal_device *device, + uint32_t dir, + struct metal_sg *sg_in, + int nents_in, + struct metal_sg *sg_out); + void (*dev_dma_unmap)(struct metal_bus *bus, + struct metal_device *device, + uint32_t dir, + struct metal_sg *sg, + int nents); +}; + +/** Libmetal bus structure. */ +struct metal_bus { + const char *name; + struct metal_bus_ops ops; + struct metal_list devices; + struct metal_list node; +}; + +/** Libmetal generic bus. */ +extern struct metal_bus metal_generic_bus; + +/** Libmetal device structure. */ +struct metal_device { + const char *name; /**< Device name */ + struct metal_bus *bus; /**< Bus that contains device */ + unsigned int num_regions; /**< Number of I/O regions in + device */ + struct metal_io_region regions[METAL_MAX_DEVICE_REGIONS]; /**< Array of + I/O regions in device*/ + struct metal_list node; /**< Node on bus' list of devices */ + int irq_num; /**< Number of IRQs per device */ + void *irq_info; /**< IRQ ID */ +}; + +/** + * @brief Register a libmetal bus. + * @param[in] bus Pre-initialized bus structure. + * @return 0 on success, or -errno on failure. + */ +extern int metal_bus_register(struct metal_bus *bus); + +/** + * @brief Unregister a libmetal bus. + * @param[in] bus Pre-registered bus structure. + * @return 0 on success, or -errno on failure. + */ +extern int metal_bus_unregister(struct metal_bus *bus); + +/** + * @brief Find a libmetal bus by name. + * @param[in] name Bus name. + * @param[out] bus Returned bus handle. + * @return 0 on success, or -errno on failure. + */ +extern int metal_bus_find(const char *name, struct metal_bus **bus); + +/** + * @brief Statically register a generic libmetal device. + * + * In non-Linux systems, devices are always required to be statically + * registered at application initialization. + * In Linux system, devices can be dynamically opened via sysfs or libfdt based + * enumeration at runtime. + * This interface is used for static registration of devices. Subsequent calls + * to metal_device_open() look up in this list of pre-registered devices on the + * "generic" bus. + * "generic" bus is used on non-Linux system to group the memory mapped devices. + * + * @param[in] device Generic device. + * @return 0 on success, or -errno on failure. + */ +extern int metal_register_generic_device(struct metal_device *device); + +/** + * @brief Open a libmetal device by name. + * @param[in] bus_name Bus name. + * @param[in] dev_name Device name. + * @param[out] device Returned device handle. + * @return 0 on success, or -errno on failure. + */ +extern int metal_device_open(const char *bus_name, const char *dev_name, + struct metal_device **device); + +/** + * @brief Close a libmetal device. + * @param[in] device Device handle. + */ +extern void metal_device_close(struct metal_device *device); + +/** + * @brief Get an I/O region accessor for a device region. + * + * @param[in] device Device handle. + * @param[in] index Region index. + * @return I/O accessor handle, or NULL on failure. + */ +static inline struct metal_io_region * +metal_device_io_region(struct metal_device *device, unsigned int index) +{ + return (index < device->num_regions + ? &device->regions[index] + : NULL); +} + +/** @} */ + +#ifdef METAL_INTERNAL +extern int metal_generic_dev_sys_open(struct metal_device *dev); +extern int metal_generic_dev_open(struct metal_bus *bus, const char *dev_name, + struct metal_device **device); +extern int metal_generic_dev_dma_map(struct metal_bus *bus, + struct metal_device *device, + uint32_t dir, + struct metal_sg *sg_in, + int nents_in, + struct metal_sg *sg_out); +extern void metal_generic_dev_dma_unmap(struct metal_bus *bus, + struct metal_device *device, + uint32_t dir, + struct metal_sg *sg, + int nents); +#endif /* METAL_INTERNAL */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_BUS__H__ */ diff --git a/libraries/openamp_arduino/src/metal/dma.h b/libraries/openamp_arduino/src/metal/dma.h index 1c8e8b11c..9bb7e54c8 100755 --- a/libraries/openamp_arduino/src/metal/dma.h +++ b/libraries/openamp_arduino/src/metal/dma.h @@ -1,79 +1,80 @@ -/* - * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file dma.h - * @brief DMA primitives for libmetal. - */ - -#ifndef __METAL_DMA__H__ -#define __METAL_DMA__H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup dma DMA Interfaces - * @{ */ - -#include -#include - -#define METAL_DMA_DEV_R 1 /**< DMA direction, device read */ -#define METAL_DMA_DEV_W 2 /**< DMA direction, device write */ -#define METAL_DMA_DEV_WR 3 /**< DMA direction, device read/write */ - -/** - * @brief scatter/gather list element structure - */ -struct metal_sg { - void *virt; /**< CPU virtual address */ - struct metal_io_region *io; /**< IO region */ - int len; /**< length */ -}; - -struct metal_device; - -/** - * @brief Map memory for DMA transaction. - * After the memory is DMA mapped, the memory should be - * accessed by the DMA device but not the CPU. - * - * @param[in] dev DMA device - * @param[in] dir DMA direction - * @param[in] sg_in sg list of memory to map - * @param[in] nents_in number of sg list entries of memory to map - * @param[out] sg_out sg list of mapped memory - * @return number of mapped sg entries, -error on failure. - */ -int metal_dma_map(struct metal_device *dev, - uint32_t dir, - struct metal_sg *sg_in, - int nents_in, - struct metal_sg *sg_out); - -/** - * @brief Unmap DMA memory - * After the memory is DMA unmapped, the memory should - * be accessed by the CPU but not the DMA device. - * - * @param[in] dev DMA device - * @param[in] dir DMA direction - * @param[in] sg sg list of mapped DMA memory - * @param[in] nents number of sg list entries of DMA memory - */ -void metal_dma_unmap(struct metal_device *dev, - uint32_t dir, - struct metal_sg *sg, - int nents); - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_DMA__H__ */ +/* + * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file dma.h + * @brief DMA primitives for libmetal. + */ + +#ifndef __METAL_DMA__H__ +#define __METAL_DMA__H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup dma DMA Interfaces + * @{ + */ + +#define METAL_DMA_DEV_R 1 /**< DMA direction, device read */ +#define METAL_DMA_DEV_W 2 /**< DMA direction, device write */ +#define METAL_DMA_DEV_WR 3 /**< DMA direction, device read/write */ + +/** + * @brief scatter/gather list element structure + */ +struct metal_sg { + void *virt; /**< CPU virtual address */ + struct metal_io_region *io; /**< IO region */ + int len; /**< length */ +}; + +struct metal_device; + +/** + * @brief Map memory for DMA transaction. + * After the memory is DMA mapped, the memory should be + * accessed by the DMA device but not the CPU. + * + * @param[in] dev DMA device + * @param[in] dir DMA direction + * @param[in] sg_in sg list of memory to map + * @param[in] nents_in number of sg list entries of memory to map + * @param[out] sg_out sg list of mapped memory + * @return number of mapped sg entries, -error on failure. + */ +int metal_dma_map(struct metal_device *dev, + uint32_t dir, + struct metal_sg *sg_in, + int nents_in, + struct metal_sg *sg_out); + +/** + * @brief Unmap DMA memory + * After the memory is DMA unmapped, the memory should + * be accessed by the CPU but not the DMA device. + * + * @param[in] dev DMA device + * @param[in] dir DMA direction + * @param[in] sg sg list of mapped DMA memory + * @param[in] nents number of sg list entries of DMA memory + */ +void metal_dma_unmap(struct metal_device *dev, + uint32_t dir, + struct metal_sg *sg, + int nents); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_DMA__H__ */ diff --git a/libraries/openamp_arduino/src/metal/errno.h b/libraries/openamp_arduino/src/metal/errno.h index 2f200e8b7..e84a2bc7d 100755 --- a/libraries/openamp_arduino/src/metal/errno.h +++ b/libraries/openamp_arduino/src/metal/errno.h @@ -1,24 +1,23 @@ -/* - * * Copyright (c) 2019 STMicrolectonics , Xilinx Inc. and Contributors. All rights reserved. - * * - * * SPDX-License-Identifier: BSD-3-Clause - * */ - -/* - * * @file metal/errno.h - * * @brief error specific primitives for libmetal. - * */ - -#ifndef __METAL_ERRNO__H__ -#define __METAL_ERRNO__H__ - -#if defined (__CC_ARM) -# include -#elif defined (__ICCARM__) -# include -#else -#include -#endif - -#endif /* __METAL_ERRNO__H__ */ - +/* + * Copyright (c) 2020 STMicroelectronnics. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file metal/errno.h + * @brief error specific primitives for libmetal. + */ + +#ifndef __METAL_ERRNO__H__ +#define __METAL_ERRNO__H__ + +#if defined(__ICCARM__) +# include +#elif defined(__CC_ARM) +# include +#else +# include +#endif + +#endif /* __METAL_ERRNO__H__ */ diff --git a/libraries/openamp_arduino/src/metal/io.h b/libraries/openamp_arduino/src/metal/io.h index 95512d826..e534d1765 100755 --- a/libraries/openamp_arduino/src/metal/io.h +++ b/libraries/openamp_arduino/src/metal/io.h @@ -1,354 +1,374 @@ -/* - * Copyright (c) 2015 - 2017, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file io.h - * @brief I/O access primitives for libmetal. - */ - -#ifndef __METAL_IO__H__ -#define __METAL_IO__H__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup io IO Interfaces - * @{ */ - -#ifdef __MICROBLAZE__ -#define NO_ATOMIC_64_SUPPORT -#endif - -struct metal_io_region; - -/** Generic I/O operations. */ -struct metal_io_ops { - uint64_t (*read)(struct metal_io_region *io, - unsigned long offset, - memory_order order, - int width); - void (*write)(struct metal_io_region *io, - unsigned long offset, - uint64_t value, - memory_order order, - int width); - int (*block_read)(struct metal_io_region *io, - unsigned long offset, - void *restrict dst, - memory_order order, - int len); - int (*block_write)(struct metal_io_region *io, - unsigned long offset, - const void *restrict src, - memory_order order, - int len); - void (*block_set)(struct metal_io_region *io, - unsigned long offset, - unsigned char value, - memory_order order, - int len); - void (*close)(struct metal_io_region *io); -}; - -/** Libmetal I/O region structure. */ -struct metal_io_region { - void *virt; /**< base virtual address */ - const metal_phys_addr_t *physmap; /**< table of base physical address - of each of the pages in the I/O - region */ - size_t size; /**< size of the I/O region */ - unsigned long page_shift; /**< page shift of I/O region */ - metal_phys_addr_t page_mask; /**< page mask of I/O region */ - unsigned int mem_flags; /**< memory attribute of the - I/O region */ - struct metal_io_ops ops; /**< I/O region operations */ -}; - -/** - * @brief Open a libmetal I/O region. - * - * @param[in, out] io I/O region handle. - * @param[in] virt Virtual address of region. - * @param[in] physmap Array of physical addresses per page. - * @param[in] size Size of region. - * @param[in] page_shift Log2 of page size (-1 for single page). - * @param[in] mem_flags Memory flags - * @param[in] ops ops - */ -void -metal_io_init(struct metal_io_region *io, void *virt, - const metal_phys_addr_t *physmap, size_t size, - unsigned page_shift, unsigned int mem_flags, - const struct metal_io_ops *ops); - -/** - * @brief Close a libmetal shared memory segment. - * @param[in] io I/O region handle. - */ -static inline void metal_io_finish(struct metal_io_region *io) -{ - if (io->ops.close) - (*io->ops.close)(io); - memset(io, 0, sizeof(*io)); -} - -/** - * @brief Get size of I/O region. - * - * @param[in] io I/O region handle. - * @return Size of I/O region. - */ -static inline size_t metal_io_region_size(struct metal_io_region *io) -{ - return io->size; -} - -/** - * @brief Get virtual address for a given offset into the I/O region. - * @param[in] io I/O region handle. - * @param[in] offset Offset into shared memory segment. - * @return NULL if offset is out of range, or pointer to offset. - */ -static inline void * -metal_io_virt(struct metal_io_region *io, unsigned long offset) -{ - return (io->virt != METAL_BAD_VA && offset <= io->size - ? (uint8_t *)io->virt + offset - : NULL); -} - -/** - * @brief Convert a virtual address to offset within I/O region. - * @param[in] io I/O region handle. - * @param[in] virt Virtual address within segment. - * @return METAL_BAD_OFFSET if out of range, or offset. - */ -static inline unsigned long -metal_io_virt_to_offset(struct metal_io_region *io, void *virt) -{ - size_t offset = (uint8_t *)virt - (uint8_t *)io->virt; - return (offset < io->size ? offset : METAL_BAD_OFFSET); -} - -/** - * @brief Get physical address for a given offset into the I/O region. - * @param[in] io I/O region handle. - * @param[in] offset Offset into shared memory segment. - * @return METAL_BAD_PHYS if offset is out of range, or physical address - * of offset. - */ -static inline metal_phys_addr_t -metal_io_phys(struct metal_io_region *io, unsigned long offset) -{ - unsigned long page = (io->page_shift >= - sizeof(offset) * CHAR_BIT ? - 0 : offset >> io->page_shift); - return (io->physmap != NULL && offset <= io->size - ? io->physmap[page] + (offset & io->page_mask) - : METAL_BAD_PHYS); -} - -/** - * @brief Convert a physical address to offset within I/O region. - * @param[in] io I/O region handle. - * @param[in] phys Physical address within segment. - * @return METAL_BAD_OFFSET if out of range, or offset. - */ -static inline unsigned long -metal_io_phys_to_offset(struct metal_io_region *io, metal_phys_addr_t phys) -{ - unsigned long offset = - (io->page_mask == (metal_phys_addr_t)(-1) ? - phys - io->physmap[0] : phys & io->page_mask); - do { - if (metal_io_phys(io, offset) == phys) - return offset; - offset += io->page_mask + 1; - } while (offset < io->size); - return METAL_BAD_OFFSET; -} - -/** - * @brief Convert a physical address to virtual address. - * @param[in] io Shared memory segment handle. - * @param[in] phys Physical address within segment. - * @return NULL if out of range, or corresponding virtual address. - */ -static inline void * -metal_io_phys_to_virt(struct metal_io_region *io, metal_phys_addr_t phys) -{ - return metal_io_virt(io, metal_io_phys_to_offset(io, phys)); -} - -/** - * @brief Convert a virtual address to physical address. - * @param[in] io Shared memory segment handle. - * @param[in] virt Virtual address within segment. - * @return METAL_BAD_PHYS if out of range, or corresponding - * physical address. - */ -static inline metal_phys_addr_t -metal_io_virt_to_phys(struct metal_io_region *io, void *virt) -{ - return metal_io_phys(io, metal_io_virt_to_offset(io, virt)); -} - -/** - * @brief Read a value from an I/O region. - * @param[in] io I/O region handle. - * @param[in] offset Offset into I/O region. - * @param[in] order Memory ordering. - * @param[in] width Width in bytes of datatype to read. This must be 1, 2, - * 4, or 8, and a compile time constant for this function - * to inline cleanly. - * @return Value. - */ -static inline uint64_t -metal_io_read(struct metal_io_region *io, unsigned long offset, - memory_order order, int width) -{ - void *ptr = metal_io_virt(io, offset); - - if (io->ops.read) - return (*io->ops.read)(io, offset, order, width); - else if (ptr && sizeof(atomic_uchar) == width) - return atomic_load_explicit((atomic_uchar *)ptr, order); - else if (ptr && sizeof(atomic_ushort) == width) - return atomic_load_explicit((atomic_ushort *)ptr, order); - else if (ptr && sizeof(atomic_uint) == width) - return atomic_load_explicit((atomic_uint *)ptr, order); - else if (ptr && sizeof(atomic_ulong) == width) - return atomic_load_explicit((atomic_ulong *)ptr, order); -#ifndef NO_ATOMIC_64_SUPPORT - else if (ptr && sizeof(atomic_ullong) == width) - return atomic_load_explicit((atomic_ullong *)ptr, order); -#endif - metal_assert(0); - return 0; /* quiet compiler */ -} - -/** - * @brief Write a value into an I/O region. - * @param[in] io I/O region handle. - * @param[in] offset Offset into I/O region. - * @param[in] value Value to write. - * @param[in] order Memory ordering. - * @param[in] width Width in bytes of datatype to read. This must be 1, 2, - * 4, or 8, and a compile time constant for this function - * to inline cleanly. - */ -static inline void -metal_io_write(struct metal_io_region *io, unsigned long offset, - uint64_t value, memory_order order, int width) -{ - void *ptr = metal_io_virt(io, offset); - if (io->ops.write) - (*io->ops.write)(io, offset, value, order, width); - else if (ptr && sizeof(atomic_uchar) == width) - atomic_store_explicit((atomic_uchar *)ptr, value, order); - else if (ptr && sizeof(atomic_ushort) == width) - atomic_store_explicit((atomic_ushort *)ptr, value, order); - else if (ptr && sizeof(atomic_uint) == width) - atomic_store_explicit((atomic_uint *)ptr, value, order); - else if (ptr && sizeof(atomic_ulong) == width) - atomic_store_explicit((atomic_ulong *)ptr, value, order); -#ifndef NO_ATOMIC_64_SUPPORT - else if (ptr && sizeof(atomic_ullong) == width) - atomic_store_explicit((atomic_ullong *)ptr, value, order); -#endif - else - metal_assert (0); -} - -#define metal_io_read8_explicit(_io, _ofs, _order) \ - metal_io_read((_io), (_ofs), (_order), 1) -#define metal_io_read8(_io, _ofs) \ - metal_io_read((_io), (_ofs), memory_order_seq_cst, 1) -#define metal_io_write8_explicit(_io, _ofs, _val, _order) \ - metal_io_write((_io), (_ofs), (_val), (_order), 1) -#define metal_io_write8(_io, _ofs, _val) \ - metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 1) - -#define metal_io_read16_explicit(_io, _ofs, _order) \ - metal_io_read((_io), (_ofs), (_order), 2) -#define metal_io_read16(_io, _ofs) \ - metal_io_read((_io), (_ofs), memory_order_seq_cst, 2) -#define metal_io_write16_explicit(_io, _ofs, _val, _order) \ - metal_io_write((_io), (_ofs), (_val), (_order), 2) -#define metal_io_write16(_io, _ofs, _val) \ - metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 2) - -#define metal_io_read32_explicit(_io, _ofs, _order) \ - metal_io_read((_io), (_ofs), (_order), 4) -#define metal_io_read32(_io, _ofs) \ - metal_io_read((_io), (_ofs), memory_order_seq_cst, 4) -#define metal_io_write32_explicit(_io, _ofs, _val, _order) \ - metal_io_write((_io), (_ofs), (_val), (_order), 4) -#define metal_io_write32(_io, _ofs, _val) \ - metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 4) - -#define metal_io_read64_explicit(_io, _ofs, _order) \ - metal_io_read((_io), (_ofs), (_order), 8) -#define metal_io_read64(_io, _ofs) \ - metal_io_read((_io), (_ofs), memory_order_seq_cst, 8) -#define metal_io_write64_explicit(_io, _ofs, _val, _order) \ - metal_io_write((_io), (_ofs), (_val), (_order), 8) -#define metal_io_write64(_io, _ofs, _val) \ - metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 8) - -/** - * @brief Read a block from an I/O region. - * @param[in] io I/O region handle. - * @param[in] offset Offset into I/O region. - * @param[in] dst destination to store the read data. - * @param[in] len length in bytes to read. - * @return On success, number of bytes read. On failure, negative value - */ -int metal_io_block_read(struct metal_io_region *io, unsigned long offset, - void *restrict dst, int len); - -/** - * @brief Write a block into an I/O region. - * @param[in] io I/O region handle. - * @param[in] offset Offset into I/O region. - * @param[in] src source to write. - * @param[in] len length in bytes to write. - * @return On success, number of bytes written. On failure, negative value - */ -int metal_io_block_write(struct metal_io_region *io, unsigned long offset, - const void *restrict src, int len); - -/** - * @brief fill a block of an I/O region. - * @param[in] io I/O region handle. - * @param[in] offset Offset into I/O region. - * @param[in] value value to fill into the block - * @param[in] len length in bytes to fill. - * @return On success, number of bytes filled. On failure, negative value - */ -int metal_io_block_set(struct metal_io_region *io, unsigned long offset, - unsigned char value, int len); - -#include - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_IO__H__ */ +/* + * Copyright (c) 2015 - 2017, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file io.h + * @brief I/O access primitives for libmetal. + */ + +#ifndef __METAL_IO__H__ +#define __METAL_IO__H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup io IO Interfaces + * @{ + */ + +#ifdef __MICROBLAZE__ +#define NO_ATOMIC_64_SUPPORT +#endif + +struct metal_io_region; + +/** Generic I/O operations. */ +struct metal_io_ops { + uint64_t (*read)(struct metal_io_region *io, + unsigned long offset, + memory_order order, + int width); + void (*write)(struct metal_io_region *io, + unsigned long offset, + uint64_t value, + memory_order order, + int width); + int (*block_read)(struct metal_io_region *io, + unsigned long offset, + void *restrict dst, + memory_order order, + int len); + int (*block_write)(struct metal_io_region *io, + unsigned long offset, + const void *restrict src, + memory_order order, + int len); + void (*block_set)(struct metal_io_region *io, + unsigned long offset, + unsigned char value, + memory_order order, + int len); + void (*close)(struct metal_io_region *io); + metal_phys_addr_t (*offset_to_phys)(struct metal_io_region *io, + unsigned long offset); + unsigned long (*phys_to_offset)(struct metal_io_region *io, + metal_phys_addr_t phys); +}; + +/** Libmetal I/O region structure. */ +struct metal_io_region { + void *virt; /**< base virtual address */ + const metal_phys_addr_t *physmap; /**< table of base physical address + of each of the pages in the I/O + region */ + size_t size; /**< size of the I/O region */ + unsigned long page_shift; /**< page shift of I/O region */ + metal_phys_addr_t page_mask; /**< page mask of I/O region */ + unsigned int mem_flags; /**< memory attribute of the + I/O region */ + struct metal_io_ops ops; /**< I/O region operations */ +}; + +/** + * @brief Open a libmetal I/O region. + * + * @param[in, out] io I/O region handle. + * @param[in] virt Virtual address of region. + * @param[in] physmap Array of physical addresses per page. + * @param[in] size Size of region. + * @param[in] page_shift Log2 of page size (-1 for single page). + * @param[in] mem_flags Memory flags + * @param[in] ops ops + */ +void +metal_io_init(struct metal_io_region *io, void *virt, + const metal_phys_addr_t *physmap, size_t size, + unsigned int page_shift, unsigned int mem_flags, + const struct metal_io_ops *ops); + +/** + * @brief Close a libmetal shared memory segment. + * @param[in] io I/O region handle. + */ +static inline void metal_io_finish(struct metal_io_region *io) +{ + if (io->ops.close) + (*io->ops.close)(io); + memset(io, 0, sizeof(*io)); +} + +/** + * @brief Get size of I/O region. + * + * @param[in] io I/O region handle. + * @return Size of I/O region. + */ +static inline size_t metal_io_region_size(struct metal_io_region *io) +{ + return io->size; +} + +/** + * @brief Get virtual address for a given offset into the I/O region. + * @param[in] io I/O region handle. + * @param[in] offset Offset into shared memory segment. + * @return NULL if offset is out of range, or pointer to offset. + */ +static inline void * +metal_io_virt(struct metal_io_region *io, unsigned long offset) +{ + return (io->virt != METAL_BAD_VA && offset < io->size + ? (void *)((uintptr_t)io->virt + offset) + : NULL); +} + +/** + * @brief Convert a virtual address to offset within I/O region. + * @param[in] io I/O region handle. + * @param[in] virt Virtual address within segment. + * @return METAL_BAD_OFFSET if out of range, or offset. + */ +static inline unsigned long +metal_io_virt_to_offset(struct metal_io_region *io, void *virt) +{ + size_t offset = (uintptr_t)virt - (uintptr_t)io->virt; + + return (offset < io->size ? offset : METAL_BAD_OFFSET); +} + +/** + * @brief Get physical address for a given offset into the I/O region. + * @param[in] io I/O region handle. + * @param[in] offset Offset into shared memory segment. + * @return METAL_BAD_PHYS if offset is out of range, or physical address + * of offset. + */ +static inline metal_phys_addr_t +metal_io_phys(struct metal_io_region *io, unsigned long offset) +{ + if (!io->ops.offset_to_phys) { + unsigned long page = (io->page_shift >= + sizeof(offset) * CHAR_BIT ? + 0 : offset >> io->page_shift); + return (io->physmap && offset < io->size + ? io->physmap[page] + (offset & io->page_mask) + : METAL_BAD_PHYS); + } + + return io->ops.offset_to_phys(io, offset); +} + +/** + * @brief Convert a physical address to offset within I/O region. + * @param[in] io I/O region handle. + * @param[in] phys Physical address within segment. + * @return METAL_BAD_OFFSET if out of range, or offset. + */ +static inline unsigned long +metal_io_phys_to_offset(struct metal_io_region *io, metal_phys_addr_t phys) +{ + if (!io->ops.phys_to_offset) { + unsigned long offset = + (io->page_mask == (metal_phys_addr_t)(-1) ? + phys - io->physmap[0] : phys & io->page_mask); + do { + if (metal_io_phys(io, offset) == phys) + return offset; + offset += io->page_mask + 1; + } while (offset < io->size); + return METAL_BAD_OFFSET; + } + + return (*io->ops.phys_to_offset)(io, phys); +} + +/** + * @brief Convert a physical address to virtual address. + * @param[in] io Shared memory segment handle. + * @param[in] phys Physical address within segment. + * @return NULL if out of range, or corresponding virtual address. + */ +static inline void * +metal_io_phys_to_virt(struct metal_io_region *io, metal_phys_addr_t phys) +{ + return metal_io_virt(io, metal_io_phys_to_offset(io, phys)); +} + +/** + * @brief Convert a virtual address to physical address. + * @param[in] io Shared memory segment handle. + * @param[in] virt Virtual address within segment. + * @return METAL_BAD_PHYS if out of range, or corresponding + * physical address. + */ +static inline metal_phys_addr_t +metal_io_virt_to_phys(struct metal_io_region *io, void *virt) +{ + return metal_io_phys(io, metal_io_virt_to_offset(io, virt)); +} + +/** + * @brief Read a value from an I/O region. + * @param[in] io I/O region handle. + * @param[in] offset Offset into I/O region. + * @param[in] order Memory ordering. + * @param[in] width Width in bytes of datatype to read. This must be 1, 2, + * 4, or 8, and a compile time constant for this function + * to inline cleanly. + * @return Value. + */ +static inline uint64_t +metal_io_read(struct metal_io_region *io, unsigned long offset, + memory_order order, int width) +{ + void *ptr = metal_io_virt(io, offset); + + if (io->ops.read) + return (*io->ops.read)(io, offset, order, width); + else if (ptr && sizeof(atomic_uchar) == width) + return atomic_load_explicit((atomic_uchar *)ptr, order); + else if (ptr && sizeof(atomic_ushort) == width) + return atomic_load_explicit((atomic_ushort *)ptr, order); + else if (ptr && sizeof(atomic_uint) == width) + return atomic_load_explicit((atomic_uint *)ptr, order); + else if (ptr && sizeof(atomic_ulong) == width) + return atomic_load_explicit((atomic_ulong *)ptr, order); +#ifndef NO_ATOMIC_64_SUPPORT + else if (ptr && sizeof(atomic_ullong) == width) + return atomic_load_explicit((atomic_ullong *)ptr, order); +#endif + metal_assert(0); + return 0; /* quiet compiler */ +} + +/** + * @brief Write a value into an I/O region. + * @param[in] io I/O region handle. + * @param[in] offset Offset into I/O region. + * @param[in] value Value to write. + * @param[in] order Memory ordering. + * @param[in] width Width in bytes of datatype to read. This must be 1, 2, + * 4, or 8, and a compile time constant for this function + * to inline cleanly. + */ +static inline void +metal_io_write(struct metal_io_region *io, unsigned long offset, + uint64_t value, memory_order order, int width) +{ + void *ptr = metal_io_virt(io, offset); + + if (io->ops.write) + (*io->ops.write)(io, offset, value, order, width); + else if (ptr && sizeof(atomic_uchar) == width) + atomic_store_explicit((atomic_uchar *)ptr, (unsigned char)value, + order); + else if (ptr && sizeof(atomic_ushort) == width) + atomic_store_explicit((atomic_ushort *)ptr, + (unsigned short)value, order); + else if (ptr && sizeof(atomic_uint) == width) + atomic_store_explicit((atomic_uint *)ptr, (unsigned int)value, + order); + else if (ptr && sizeof(atomic_ulong) == width) + atomic_store_explicit((atomic_ulong *)ptr, (unsigned long)value, + order); +#ifndef NO_ATOMIC_64_SUPPORT + else if (ptr && sizeof(atomic_ullong) == width) + atomic_store_explicit((atomic_ullong *)ptr, + (unsigned long long)value, order); +#endif + else + metal_assert(0); +} + +#define metal_io_read8_explicit(_io, _ofs, _order) \ + metal_io_read((_io), (_ofs), (_order), 1) +#define metal_io_read8(_io, _ofs) \ + metal_io_read((_io), (_ofs), memory_order_seq_cst, 1) +#define metal_io_write8_explicit(_io, _ofs, _val, _order) \ + metal_io_write((_io), (_ofs), (_val), (_order), 1) +#define metal_io_write8(_io, _ofs, _val) \ + metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 1) + +#define metal_io_read16_explicit(_io, _ofs, _order) \ + metal_io_read((_io), (_ofs), (_order), 2) +#define metal_io_read16(_io, _ofs) \ + metal_io_read((_io), (_ofs), memory_order_seq_cst, 2) +#define metal_io_write16_explicit(_io, _ofs, _val, _order) \ + metal_io_write((_io), (_ofs), (_val), (_order), 2) +#define metal_io_write16(_io, _ofs, _val) \ + metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 2) + +#define metal_io_read32_explicit(_io, _ofs, _order) \ + metal_io_read((_io), (_ofs), (_order), 4) +#define metal_io_read32(_io, _ofs) \ + metal_io_read((_io), (_ofs), memory_order_seq_cst, 4) +#define metal_io_write32_explicit(_io, _ofs, _val, _order) \ + metal_io_write((_io), (_ofs), (_val), (_order), 4) +#define metal_io_write32(_io, _ofs, _val) \ + metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 4) + +#define metal_io_read64_explicit(_io, _ofs, _order) \ + metal_io_read((_io), (_ofs), (_order), 8) +#define metal_io_read64(_io, _ofs) \ + metal_io_read((_io), (_ofs), memory_order_seq_cst, 8) +#define metal_io_write64_explicit(_io, _ofs, _val, _order) \ + metal_io_write((_io), (_ofs), (_val), (_order), 8) +#define metal_io_write64(_io, _ofs, _val) \ + metal_io_write((_io), (_ofs), (_val), memory_order_seq_cst, 8) + +/** + * @brief Read a block from an I/O region. + * @param[in] io I/O region handle. + * @param[in] offset Offset into I/O region. + * @param[in] dst destination to store the read data. + * @param[in] len length in bytes to read. + * @return On success, number of bytes read. On failure, negative value + */ +int metal_io_block_read(struct metal_io_region *io, unsigned long offset, + void *restrict dst, int len); + +/** + * @brief Write a block into an I/O region. + * @param[in] io I/O region handle. + * @param[in] offset Offset into I/O region. + * @param[in] src source to write. + * @param[in] len length in bytes to write. + * @return On success, number of bytes written. On failure, negative value + */ +int metal_io_block_write(struct metal_io_region *io, unsigned long offset, + const void *restrict src, int len); + +/** + * @brief fill a block of an I/O region. + * @param[in] io I/O region handle. + * @param[in] offset Offset into I/O region. + * @param[in] value value to fill into the block + * @param[in] len length in bytes to fill. + * @return On success, number of bytes filled. On failure, negative value + */ +int metal_io_block_set(struct metal_io_region *io, unsigned long offset, + unsigned char value, int len); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#include + +#endif /* __METAL_IO__H__ */ diff --git a/libraries/openamp_arduino/src/metal/irq.h b/libraries/openamp_arduino/src/metal/irq.h index 9f0344e7f..43562abe1 100755 --- a/libraries/openamp_arduino/src/metal/irq.h +++ b/libraries/openamp_arduino/src/metal/irq.h @@ -1,116 +1,104 @@ -/* - * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file irq.h - * @brief Interrupt handling primitives for libmetal. - */ - -#ifndef __METAL_IRQ__H__ -#define __METAL_IRQ__H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup irq Interrupt Handling Interfaces - * @{ */ - -#include - -/** IRQ handled status */ -#define METAL_IRQ_NOT_HANDLED 0 -#define METAL_IRQ_HANDLED 1 - -/** - * @brief type of interrupt handler - * @param[in] irq interrupt id - * @param[in] priv private data - * @return irq handled status - */ -typedef int (*metal_irq_handler) (int irq, void *priv); - -struct metal_device; - -/** - * @brief Register interrupt handler for driver ID/device. - * - * @param[in] irq interrupt id - * @param[in] irq_handler interrupt handler - * @param[in] dev metal device this irq belongs to (can be NULL). - * @param[in] drv_id driver id is a unique interrupt handler identifier. - * It can also be used for driver data. - * @return 0 for success, non-zero on failure - */ -int metal_irq_register(int irq, - metal_irq_handler irq_handler, - struct metal_device *dev, - void *drv_id); - -/** - * @brief Unregister interrupt handler for driver ID and/or device. - * - * If interrupt handler (hd), driver ID (drv_id) and device (dev) - * are NULL, unregister all handlers for this interrupt. - * - * If interrupt handler (hd), device (dev) or driver ID (drv_id), - * are not NULL, unregister handlers matching non NULL criterias. - * e.g: when call is made with drv_id and dev non NULL, - * all handlers matching both are unregistered. - * - * If interrupt is not found, or other criterias not matching, - * return -ENOENT - * - * @param[in] irq interrupt id - * @param[in] irq_handler interrupt handler - * @param[in] dev metal device this irq belongs to - * @param[in] drv_id driver id. It can be used for driver data. - * @return 0 for success, non-zero on failure - */ -int metal_irq_unregister(int irq, - metal_irq_handler irq_handler, - struct metal_device *dev, - void *drv_id); - -/** - * @brief disable interrupts - * @return interrupts state - */ -unsigned int metal_irq_save_disable(void); - -/** - * @brief restore interrupts to their previous state - * @param[in] flags previous interrupts state - */ -void metal_irq_restore_enable(unsigned int flags); - -/** - * @brief metal_irq_enable - * - * Enables the given interrupt - * - * @param vector - interrupt vector number - */ -void metal_irq_enable(unsigned int vector); - -/** - * @brief metal_irq_disable - * - * Disables the given interrupt - * - * @param vector - interrupt vector number - */ -void metal_irq_disable(unsigned int vector); - -#include - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_IRQ__H__ */ +/* + * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file irq.h + * @brief Interrupt handling primitives for libmetal. + */ + +#ifndef __METAL_IRQ__H__ +#define __METAL_IRQ__H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup irq Interrupt Handling Interfaces + * @{ + */ + +/** IRQ handled status */ +#define METAL_IRQ_NOT_HANDLED 0 +#define METAL_IRQ_HANDLED 1 + +/** + * @brief type of interrupt handler + * @param[in] irq interrupt id + * @param[in] arg argument to pass to the handler + * @return irq handled status + */ +typedef int (*metal_irq_handler) (int irq, void *arg); + +/** + * @brief Register interrupt handler for interrupt. + * Only allow single interrupt handler for a interrupt. + * + * If irq_handler is NULL, it will unregister interrupt + * handler from interrupt + * + * @param[in] irq interrupt id + * @param[in] irq_handler interrupt handler + * @param[in] arg arg is the argument pointing to the data which + * will be passed to the interrupt handler. + * @return 0 for success, non-zero on failure + */ +int metal_irq_register(int irq, + metal_irq_handler irq_handler, + void *arg); + +/** + * @brief Unregister interrupt handler for interrupt. + * + * @param[in] irq interrupt id + */ +static inline +void metal_irq_unregister(int irq) +{ + metal_irq_register(irq, 0, NULL); +} + +/** + * @brief disable interrupts + * @return interrupts state + */ +unsigned int metal_irq_save_disable(void); + +/** + * @brief restore interrupts to their previous state + * @param[in] flags previous interrupts state + */ +void metal_irq_restore_enable(unsigned int flags); + +/** + * @brief metal_irq_enable + * + * Enables the given interrupt + * + * @param vector - interrupt vector number + */ +void metal_irq_enable(unsigned int vector); + +/** + * @brief metal_irq_disable + * + * Disables the given interrupt + * + * @param vector - interrupt vector number + */ +void metal_irq_disable(unsigned int vector); + +#include + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_IRQ__H__ */ diff --git a/libraries/openamp_arduino/src/metal/irq_controller.h b/libraries/openamp_arduino/src/metal/irq_controller.h new file mode 100644 index 000000000..c821ef48c --- /dev/null +++ b/libraries/openamp_arduino/src/metal/irq_controller.h @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file irq.h + * @brief Interrupt handling primitives for libmetal. + */ + +#ifndef __METAL_IRQ_CONTROLLER__H__ +#define __METAL_IRQ_CONTROLLER__H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup irq Interrupt Handling Interfaces + * @{ + */ + +#include +#include +#include + +/** IRQ ANY ID */ +#define METAL_IRQ_ANY (-1) + +/** IRQ state macro which will be passed to metal irq set state function + * to indicate which state the caller want the IRQ to change to. + */ +#define METAL_IRQ_DISABLE 0U +#define METAL_IRQ_ENABLE 1U + +struct metal_irq_controller; + +/** + * @brief type of interrupt controller to set irq enable + * @param[in] irq_cntr pointer to interrupt controller + * @param[in] irq interrupt id + * @param[in] enable IRQ state + */ +typedef void (*metal_irq_set_enable) (struct metal_irq_controller *irq_cntr, + int irq, unsigned int enable); + +/** + * @brief type of controller specific registering interrupt function + * @param[in] irq_cntr pointer to interrupt controller + * @param[in] irq interrupt id + * @param[in] hd interrupt handler + * @param[in] arg argument which will be passed to the interrupt handler + * @return 0 for success, negative value for failure + */ +typedef int (*metal_cntr_irq_register) (struct metal_irq_controller *irq_cntr, + int irq, metal_irq_handler hd, + void *arg); + +/** Libmetal interrupt structure */ +struct metal_irq { + metal_irq_handler hd; /**< Interrupt handler */ + void *arg; /**< Argument to pass to the interrupt handler */ +}; + +/** Libmetal interrupt controller structure */ +struct metal_irq_controller { + int irq_base; /**< Start of IRQ number of the range managed by + * the IRQ controller + */ + int irq_num; /**< Number of IRQs managed by the IRQ controller */ + void *arg; /**< Argument to pass to interrupt controller function */ + metal_irq_set_enable irq_set_enable; /**< function to set IRQ enable */ + metal_cntr_irq_register irq_register; /**< function to register IRQ + * handler + */ + struct metal_list node; /**< list node */ + struct metal_irq *irqs; /**< Array of IRQs managed by the controller */ +}; + +#define METAL_IRQ_CONTROLLER_DECLARE(_irq_controller, \ + _irq_base, _irq_num, \ + _arg, \ + _irq_set_enable, \ + _irq_register, \ + _irqs) \ + struct metal_irq_controller _irq_controller = { \ + .irq_base = _irq_base, \ + .irq_num = _irq_num, \ + .arg = _arg, \ + .irq_set_enable = _irq_set_enable, \ + .irq_register = _irq_register, \ + .irqs = _irqs,\ + } + +/** + * @brief metal_irq_register_controller + * + * Register IRQ controller + * This function will allocate IRQ ids if it was + * not predefined in the irq controller. There is no + * locking in the function, it is not supposed to be + * called by multiple threads. + * + * @param[in] cntr Interrupt controller to register + * @return 0 on success, or negative value for failure. + */ +int metal_irq_register_controller(struct metal_irq_controller *cntr); + +/** + * @brief metal_irq_handle + * + * Call registered IRQ handler + * + * @param[in] irq_data metal IRQ structure + * @param[in] irq IRQ id which will be passed to handler + * @return IRQ handler status + */ +static inline +int metal_irq_handle(struct metal_irq *irq_data, int irq) +{ + if (irq_data && irq_data->hd) { + return irq_data->hd(irq, irq_data->arg); + } else { + return METAL_IRQ_NOT_HANDLED; + } +} + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_IRQ__H__ */ diff --git a/libraries/openamp_arduino/src/metal/list.h b/libraries/openamp_arduino/src/metal/list.h index a9395ba77..eb0e7b339 100755 --- a/libraries/openamp_arduino/src/metal/list.h +++ b/libraries/openamp_arduino/src/metal/list.h @@ -1,102 +1,118 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file list.h - * @brief List primitives for libmetal. - */ - -#ifndef __METAL_LIST__H__ -#define __METAL_LIST__H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup list List Primitives - * @{ */ - -struct metal_list { - struct metal_list *next, *prev; -}; - -/* - * METAL_INIT_LIST - used for initializing an list elmenet in a static struct - * or global - */ -#define METAL_INIT_LIST(name) { .next = &name, .prev = &name } -/* - * METAL_DECLARE_LIST - used for defining and initializing a global or - * static singleton list - */ -#define METAL_DECLARE_LIST(name) \ - struct metal_list name = METAL_INIT_LIST(name) - -static inline void metal_list_init(struct metal_list *list) -{ - list->next = list->prev = list; -} - -static inline void metal_list_add_before(struct metal_list *node, - struct metal_list *new_node) -{ - new_node->prev = node->prev; - new_node->next = node; - new_node->next->prev = new_node; - new_node->prev->next = new_node; -} - -static inline void metal_list_add_after(struct metal_list *node, - struct metal_list *new_node) -{ - new_node->prev = node; - new_node->next = node->next; - new_node->next->prev = new_node; - new_node->prev->next = new_node; -} - -static inline void metal_list_add_head(struct metal_list *list, - struct metal_list *node) -{ - metal_list_add_after(list, node); -} - -static inline void metal_list_add_tail(struct metal_list *list, - struct metal_list *node) -{ - metal_list_add_before(list, node); -} - -static inline int metal_list_is_empty(struct metal_list *list) -{ - return list->next == list; -} - -static inline void metal_list_del(struct metal_list *node) -{ - node->next->prev = node->prev; - node->prev->next = node->next; - node->next = node->prev = node; -} - -static inline struct metal_list *metal_list_first(struct metal_list *list) -{ - return metal_list_is_empty(list) ? NULL : list->next; -} - -#define metal_list_for_each(list, node) \ - for ((node) = (list)->next; \ - (node) != (list); \ - (node) = (node)->next) -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_LIST__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file list.h + * @brief List primitives for libmetal. + */ + +#ifndef __METAL_LIST__H__ +#define __METAL_LIST__H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup list List Primitives + * @{ + */ + +struct metal_list { + struct metal_list *next, *prev; +}; + +/* + * METAL_INIT_LIST - used for initializing an list element in a static struct + * or global + */ +#define METAL_INIT_LIST(name) { .next = &name, .prev = &name } +/* + * METAL_DECLARE_LIST - used for defining and initializing a global or + * static singleton list + */ +#define METAL_DECLARE_LIST(name) \ + struct metal_list name = METAL_INIT_LIST(name) + +static inline void metal_list_init(struct metal_list *list) +{ + list->prev = list; + list->next = list; +} + +static inline void metal_list_add_before(struct metal_list *node, + struct metal_list *new_node) +{ + new_node->prev = node->prev; + new_node->next = node; + new_node->next->prev = new_node; + new_node->prev->next = new_node; +} + +static inline void metal_list_add_after(struct metal_list *node, + struct metal_list *new_node) +{ + new_node->prev = node; + new_node->next = node->next; + new_node->next->prev = new_node; + new_node->prev->next = new_node; +} + +static inline void metal_list_add_head(struct metal_list *list, + struct metal_list *node) +{ + metal_list_add_after(list, node); +} + +static inline void metal_list_add_tail(struct metal_list *list, + struct metal_list *node) +{ + metal_list_add_before(list, node); +} + +static inline int metal_list_is_empty(struct metal_list *list) +{ + return list->next == list; +} + +static inline void metal_list_del(struct metal_list *node) +{ + node->next->prev = node->prev; + node->prev->next = node->next; + node->prev = node; + node->next = node; +} + +static inline struct metal_list *metal_list_first(struct metal_list *list) +{ + return metal_list_is_empty(list) ? NULL : list->next; +} + +#define metal_list_for_each(list, node) \ + for ((node) = (list)->next; \ + (node) != (list); \ + (node) = (node)->next) + +static inline bool metal_list_find_node(struct metal_list *list, + struct metal_list *node) +{ + struct metal_list *n; + + metal_list_for_each(list, n) { + if (n == node) + return true; + } + return false; +} +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_LIST__H__ */ diff --git a/libraries/openamp_arduino/src/metal/log.h b/libraries/openamp_arduino/src/metal/log.h index d439ef8f4..528e4c6b0 100755 --- a/libraries/openamp_arduino/src/metal/log.h +++ b/libraries/openamp_arduino/src/metal/log.h @@ -1,93 +1,116 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file log.h - * @brief Logging support for libmetal. - */ - -#ifndef __METAL_METAL_LOG__H__ -#define __METAL_METAL_LOG__H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup logging Library Logging Interfaces - * @{ */ - -/** Log message priority levels for libmetal. */ -enum metal_log_level { - METAL_LOG_EMERGENCY, /**< system is unusable. */ - METAL_LOG_ALERT, /**< action must be taken immediately. */ - METAL_LOG_CRITICAL, /**< critical conditions. */ - METAL_LOG_ERROR, /**< error conditions. */ - METAL_LOG_WARNING, /**< warning conditions. */ - METAL_LOG_NOTICE, /**< normal but significant condition. */ - METAL_LOG_INFO, /**< informational messages. */ - METAL_LOG_DEBUG, /**< debug-level messages. */ -}; - -/** Log message handler type. */ -typedef void (*metal_log_handler)(enum metal_log_level level, - const char *format, ...); - -/** - * @brief Set libmetal log handler. - * @param[in] handler log message handler. - * @return 0 on success, or -errno on failure. - */ -extern void metal_set_log_handler(metal_log_handler handler); - -/** - * @brief Get the current libmetal log handler. - * @return Current log handler. - */ -extern metal_log_handler metal_get_log_handler(void); - -/** - * @brief Set the level for libmetal logging. - * @param[in] level log message level. - */ -extern void metal_set_log_level(enum metal_log_level level); - -/** - * @brief Get the current level for libmetal logging. - * @return Current log level. - */ -extern enum metal_log_level metal_get_log_level(void); - -/** - * @brief Default libmetal log handler. This handler prints libmetal log - * mesages to stderr. - * @param[in] level log message level. - * @param[in] format log message format string. - * @return 0 on success, or -errno on failure. - */ -extern void metal_default_log_handler(enum metal_log_level level, - const char *format, ...); - - -/** - * Emit a log message if the log level permits. - * - * @param level Log level. - * @param ... Format string and arguments. - */ -#define metal_log(level, ...) \ - ((level <= _metal.common.log_level && _metal.common.log_handler) \ - ? (void)_metal.common.log_handler(level, __VA_ARGS__) \ - : (void)0) - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#include - -#endif /* __METAL_METAL_LOG__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file log.h + * @brief Logging support for libmetal. + */ + +#ifndef __METAL_METAL_LOG__H__ +#define __METAL_METAL_LOG__H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup logging Library Logging Interfaces + * @{ + */ + +/** Log message priority levels for libmetal. */ +enum metal_log_level { + METAL_LOG_EMERGENCY, /**< system is unusable. */ + METAL_LOG_ALERT, /**< action must be taken immediately. */ + METAL_LOG_CRITICAL, /**< critical conditions. */ + METAL_LOG_ERROR, /**< error conditions. */ + METAL_LOG_WARNING, /**< warning conditions. */ + METAL_LOG_NOTICE, /**< normal but significant condition. */ + METAL_LOG_INFO, /**< informational messages. */ + METAL_LOG_DEBUG, /**< debug-level messages. */ +}; + +/** Log message handler type. */ +typedef void (*metal_log_handler)(enum metal_log_level level, + const char *format, ...); + +/** + * @brief Set libmetal log handler. + * @param[in] handler log message handler. + * @return 0 on success, or -errno on failure. + */ +extern void metal_set_log_handler(metal_log_handler handler); + +/** + * @brief Get the current libmetal log handler. + * @return Current log handler. + */ +extern metal_log_handler metal_get_log_handler(void); + +/** + * @brief Set the level for libmetal logging. + * @param[in] level log message level. + */ +extern void metal_set_log_level(enum metal_log_level level); + +/** + * @brief Get the current level for libmetal logging. + * @return Current log level. + */ +extern enum metal_log_level metal_get_log_level(void); + +/** + * @brief Default libmetal log handler. This handler prints libmetal log + * messages to stderr. + * @param[in] level log message level. + * @param[in] format log message format string. + * @return 0 on success, or -errno on failure. + */ +extern void metal_default_log_handler(enum metal_log_level level, + const char *format, ...); + +/** + * @internal + * + * @brief used by the metal_log() macro to update the format string + * + * If ML_FUNC_LINE is defined this macro generates a unified format + * string for metal_log() and its convenience metal_*() macros, i.e. it + * adds function-name:line-number prefix to all log messages. + * + * @param[in] fmt format string passed from the metal_log() macro + */ +#if defined(ML_FUNC_LINE) +#define metal_fmt(fmt) "%s:%u " fmt, __func__, __LINE__ +#else /* ML_FUNC_LINE */ +#define metal_fmt(fmt) fmt +#endif /* ML_FUNC_LINE */ + +/** + * @brief Emit a log message if the log level permits. + * + * @param level Log level. + * @param fmt Format string. + * @param args... Variable number of arguments. + */ +#define metal_log(level, fmt, args...) ({ \ + if (_metal.common.log_handler && level <= _metal.common.log_level) \ + _metal.common.log_handler(level, metal_fmt(fmt), ##args); \ +}) + +#define metal_err(fmt, args...) metal_log(METAL_LOG_ERROR, fmt, ##args) +#define metal_warn(fmt, args...) metal_log(METAL_LOG_WARNING, fmt, ##args) +#define metal_info(fmt, args...) metal_log(METAL_LOG_INFO, fmt, ##args) +#define metal_dbg(fmt, args...) metal_log(METAL_LOG_DEBUG, fmt, ##args) + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#include + +#endif /* __METAL_METAL_LOG__H__ */ diff --git a/libraries/openamp_arduino/src/metal/mutex.h b/libraries/openamp_arduino/src/metal/mutex.h index c241bd0db..71d9eaa21 100755 --- a/libraries/openamp_arduino/src/metal/mutex.h +++ b/libraries/openamp_arduino/src/metal/mutex.h @@ -1,87 +1,88 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file mutex.h - * @brief Mutex primitives for libmetal. - */ - -#ifndef __METAL_MUTEX__H__ -#define __METAL_MUTEX__H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup mutex Mutex Interfaces - * @{ */ - -#include - -/** - * @brief Initialize a libmetal mutex. - * @param[in] mutex Mutex to initialize. - */ -static inline void metal_mutex_init(metal_mutex_t *mutex) -{ - __metal_mutex_init(mutex); -} - -/** - * @brief Deinitialize a libmetal mutex. - * @param[in] mutex Mutex to deinitialize. - */ -static inline void metal_mutex_deinit(metal_mutex_t *mutex) -{ - __metal_mutex_deinit(mutex); -} - -/** - * @brief Try to acquire a mutex - * @param[in] mutex Mutex to mutex. - * @return 0 on failure to acquire, non-zero on success. - */ -static inline int metal_mutex_try_acquire(metal_mutex_t *mutex) -{ - return __metal_mutex_try_acquire(mutex); -} - -/** - * @brief Acquire a mutex - * @param[in] mutex Mutex to mutex. - */ -static inline void metal_mutex_acquire(metal_mutex_t *mutex) -{ - __metal_mutex_acquire(mutex); -} - -/** - * @brief Release a previously acquired mutex. - * @param[in] mutex Mutex to mutex. - * @see metal_mutex_try_acquire, metal_mutex_acquire - */ -static inline void metal_mutex_release(metal_mutex_t *mutex) -{ - __metal_mutex_release(mutex); -} - -/** - * @brief Checked if a mutex has been acquired. - * @param[in] mutex mutex to check. - * @see metal_mutex_try_acquire, metal_mutex_acquire - */ -static inline int metal_mutex_is_acquired(metal_mutex_t *mutex) -{ - return __metal_mutex_is_acquired(mutex); -} - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_MUTEX__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file mutex.h + * @brief Mutex primitives for libmetal. + */ + +#ifndef __METAL_MUTEX__H__ +#define __METAL_MUTEX__H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup mutex Mutex Interfaces + * @{ + */ + +/** + * @brief Initialize a libmetal mutex. + * @param[in] mutex Mutex to initialize. + */ +static inline void metal_mutex_init(metal_mutex_t *mutex) +{ + __metal_mutex_init(mutex); +} + +/** + * @brief Deinitialize a libmetal mutex. + * @param[in] mutex Mutex to deinitialize. + */ +static inline void metal_mutex_deinit(metal_mutex_t *mutex) +{ + __metal_mutex_deinit(mutex); +} + +/** + * @brief Try to acquire a mutex + * @param[in] mutex Mutex to mutex. + * @return 0 on failure to acquire, non-zero on success. + */ +static inline int metal_mutex_try_acquire(metal_mutex_t *mutex) +{ + return __metal_mutex_try_acquire(mutex); +} + +/** + * @brief Acquire a mutex + * @param[in] mutex Mutex to mutex. + */ +static inline void metal_mutex_acquire(metal_mutex_t *mutex) +{ + __metal_mutex_acquire(mutex); +} + +/** + * @brief Release a previously acquired mutex. + * @param[in] mutex Mutex to mutex. + * @see metal_mutex_try_acquire, metal_mutex_acquire + */ +static inline void metal_mutex_release(metal_mutex_t *mutex) +{ + __metal_mutex_release(mutex); +} + +/** + * @brief Checked if a mutex has been acquired. + * @param[in] mutex mutex to check. + * @see metal_mutex_try_acquire, metal_mutex_acquire + */ +static inline int metal_mutex_is_acquired(metal_mutex_t *mutex) +{ + return __metal_mutex_is_acquired(mutex); +} + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_MUTEX__H__ */ diff --git a/libraries/openamp_arduino/src/metal/processor/arm/atomic.h b/libraries/openamp_arduino/src/metal/processor/arm/atomic.h index c5e25cdfb..ab5ee4060 100755 --- a/libraries/openamp_arduino/src/metal/processor/arm/atomic.h +++ b/libraries/openamp_arduino/src/metal/processor/arm/atomic.h @@ -1,15 +1,15 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file arm/atomic.h - * @brief ARM specific atomic primitives for libmetal. - */ - -#ifndef __METAL_ARM_ATOMIC__H__ -#define __METAL_ARM_ATOMIC__H__ - -#endif /* __METAL_ARM_ATOMIC__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file arm/atomic.h + * @brief Arm specific atomic primitives for libmetal. + */ + +#ifndef __METAL_ARM_ATOMIC__H__ +#define __METAL_ARM_ATOMIC__H__ + +#endif /* __METAL_ARM_ATOMIC__H__ */ diff --git a/libraries/openamp_arduino/src/metal/processor/arm/cpu.h b/libraries/openamp_arduino/src/metal/processor/arm/cpu.h index 3e4f8483b..0ea96102a 100755 --- a/libraries/openamp_arduino/src/metal/processor/arm/cpu.h +++ b/libraries/openamp_arduino/src/metal/processor/arm/cpu.h @@ -1,17 +1,17 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file cpu.h - * @brief CPU specific primatives - */ - -#ifndef __METAL_ARM_CPU__H__ -#define __METAL_ARM_CPU__H__ - -#define metal_cpu_yield() - -#endif /* __METAL_ARM_CPU__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file cpu.h + * @brief CPU specific primitives + */ + +#ifndef __METAL_ARM_CPU__H__ +#define __METAL_ARM_CPU__H__ + +#define metal_cpu_yield() + +#endif /* __METAL_ARM_CPU__H__ */ diff --git a/libraries/openamp_arduino/src/metal/shmem.h b/libraries/openamp_arduino/src/metal/shmem.h index 19f282caf..561a2c85d 100755 --- a/libraries/openamp_arduino/src/metal/shmem.h +++ b/libraries/openamp_arduino/src/metal/shmem.h @@ -1,83 +1,84 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file shmem.h - * @brief Shared memory primitives for libmetal. - */ - -#ifndef __METAL_SHMEM__H__ -#define __METAL_SHMEM__H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup shmem Shared Memory Interfaces - * @{ */ - -/** Generic shared memory data structure. */ -struct metal_generic_shmem { - const char *name; - struct metal_io_region io; - struct metal_list node; -}; - -/** - * @brief Open a libmetal shared memory segment. - * - * Open a shared memory segment. - * - * @param[in] name Name of segment to open. - * @param[in] size Size of segment. - * @param[out] io I/O region handle, if successful. - * @return 0 on success, or -errno on failure. - * - * @see metal_shmem_create - */ -extern int metal_shmem_open(const char *name, size_t size, - struct metal_io_region **io); - -/** - * @brief Statically register a generic shared memory region. - * - * Shared memory regions may be statically registered at application - * initialization, or may be dynamically opened. This interface is used for - * static registration of regions. Subsequent calls to metal_shmem_open() look - * up in this list of pre-registered regions. - * - * @param[in] shmem Generic shmem structure. - * @return 0 on success, or -errno on failure. - */ -extern int metal_shmem_register_generic(struct metal_generic_shmem *shmem); - -#ifdef METAL_INTERNAL - -/** - * @brief Open a statically registered shmem segment. - * - * This interface is meant for internal libmetal use within system specific - * shmem implementations. - * - * @param[in] name Name of segment to open. - * @param[in] size Size of segment. - * @param[out] io I/O region handle, if successful. - * @return 0 on success, or -errno on failure. - */ -int metal_shmem_open_generic(const char *name, size_t size, - struct metal_io_region **result); - -#endif - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_SHMEM__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file shmem.h + * @brief Shared memory primitives for libmetal. + */ + +#ifndef __METAL_SHMEM__H__ +#define __METAL_SHMEM__H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup shmem Shared Memory Interfaces + * @{ + */ + +/** Generic shared memory data structure. */ +struct metal_generic_shmem { + const char *name; + struct metal_io_region io; + struct metal_list node; +}; + +/** + * @brief Open a libmetal shared memory segment. + * + * Open a shared memory segment. + * + * @param[in] name Name of segment to open. + * @param[in] size Size of segment. + * @param[out] io I/O region handle, if successful. + * @return 0 on success, or -errno on failure. + * + * @see metal_shmem_create + */ +extern int metal_shmem_open(const char *name, size_t size, + struct metal_io_region **io); + +/** + * @brief Statically register a generic shared memory region. + * + * Shared memory regions may be statically registered at application + * initialization, or may be dynamically opened. This interface is used for + * static registration of regions. Subsequent calls to metal_shmem_open() look + * up in this list of pre-registered regions. + * + * @param[in] shmem Generic shmem structure. + * @return 0 on success, or -errno on failure. + */ +extern int metal_shmem_register_generic(struct metal_generic_shmem *shmem); + +#ifdef METAL_INTERNAL + +/** + * @brief Open a statically registered shmem segment. + * + * This interface is meant for internal libmetal use within system specific + * shmem implementations. + * + * @param[in] name Name of segment to open. + * @param[in] size Size of segment. + * @param[out] io I/O region handle, if successful. + * @return 0 on success, or -errno on failure. + */ +int metal_shmem_open_generic(const char *name, size_t size, + struct metal_io_region **result); + +#endif + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_SHMEM__H__ */ diff --git a/libraries/openamp_arduino/src/metal/sleep.h b/libraries/openamp_arduino/src/metal/sleep.h index 0dad40129..b366ee5b1 100755 --- a/libraries/openamp_arduino/src/metal/sleep.h +++ b/libraries/openamp_arduino/src/metal/sleep.h @@ -1,44 +1,45 @@ -/* - * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file sleep.h - * @brief Sleep primitives for libmetal. - */ - -#ifndef __METAL_SLEEP__H__ -#define __METAL_SLEEP__H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup sleep Sleep Interfaces - * @{ */ - -/** - * @brief delay in microseconds - * delay the next execution in the calling thread - * fo usec microseconds. - * - * @param[in] usec microsecond intervals - * @return 0 on success, non-zero for failures - */ -static inline int metal_sleep_usec(unsigned int usec) -{ - return __metal_sleep_usec(usec); -} - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_SLEEP__H__ */ - +/* + * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file sleep.h + * @brief Sleep primitives for libmetal. + */ + +#ifndef __METAL_SLEEP__H__ +#define __METAL_SLEEP__H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup sleep Sleep Interfaces + * @{ + */ + +/** + * @brief delay in microseconds + * delay the next execution in the calling thread + * fo usec microseconds. + * + * @param[in] usec microsecond intervals + * @return 0 on success, non-zero for failures + */ +static inline int metal_sleep_usec(unsigned int usec) +{ + return __metal_sleep_usec(usec); +} + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_SLEEP__H__ */ + diff --git a/libraries/openamp_arduino/src/metal/softirq.h b/libraries/openamp_arduino/src/metal/softirq.h new file mode 100644 index 000000000..52ea00f18 --- /dev/null +++ b/libraries/openamp_arduino/src/metal/softirq.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2019, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file softirq.h + * @brief Soft Interrupt handling primitives for libmetal. + */ + +#ifndef __METAL_SOFTIRQ__H__ +#define __METAL_SOFTIRQ__H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup soft irq Interrupt Handling Interfaces + * @{ + */ + +/** + * @brief metal_softirq_init + * + * Initialize libmetal soft IRQs controller + * + * @return 0 on success, or negative value for failure + */ +int metal_softirq_init(void); + +/** + * @brief metal_softirq_dispatch + * + * Dispatch the pending soft IRQs + */ +void metal_softirq_dispatch(void); + +/** + * @brief metal_softirq_allocate + * + * Allocate soft IRQs + * + * This function doesn't have any locking, it is not supposed + * to be called by multiple threads. + * + * @param[in] num number of soft irqs requested + * @return soft irq base for success, or negative value for failure + */ +int metal_softirq_allocate(int num); + +/** + * @brief metal_softirq_set + * + * Set soft IRQ to pending + * + * @param[in] irq soft IRQ ID to set + */ +void metal_softirq_set(int irq); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_SOFTIRQ__H__ */ diff --git a/libraries/openamp_arduino/src/metal/spinlock.h b/libraries/openamp_arduino/src/metal/spinlock.h index f6a711eb7..6992267e6 100755 --- a/libraries/openamp_arduino/src/metal/spinlock.h +++ b/libraries/openamp_arduino/src/metal/spinlock.h @@ -1,71 +1,70 @@ -/* - * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file spinlock.h - * @brief Spinlock primitives for libmetal. - */ - -#ifndef __METAL_SPINLOCK__H__ -#define __METAL_SPINLOCK__H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup spinlock Spinlock Interfaces - * @{ */ -struct metal_spinlock { - union{ - atomic_int v; - atomic_flag w; - }; -}; - -/** Static metal spinlock initialization. */ -#define METAL_SPINLOCK_INIT {ATOMIC_VAR_INIT(0)} - -/** - * @brief Initialize a libmetal spinlock. - * @param[in] slock Spinlock to initialize. - */ -static inline void metal_spinlock_init(struct metal_spinlock *slock) -{ - atomic_store(&slock->v, 0); -} - -/** - * @brief Acquire a spinlock. - * @param[in] slock Spinlock to acquire. - * @see metal_spinlock_release - */ -static inline void metal_spinlock_acquire(struct metal_spinlock *slock) -{ - while (atomic_flag_test_and_set(&slock->w)) { - metal_cpu_yield(); - } -} - -/** - * @brief Release a previously acquired spinlock. - * @param[in] slock Spinlock to release. - * @see metal_spinlock_acquire - */ -static inline void metal_spinlock_release(struct metal_spinlock *slock) -{ - atomic_flag_clear(&slock->w); -} - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_SPINLOCK__H__ */ +/* + * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file spinlock.h + * @brief Spinlock primitives for libmetal. + */ + +#ifndef __METAL_SPINLOCK__H__ +#define __METAL_SPINLOCK__H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup spinlock Spinlock Interfaces + * @{ + */ + +struct metal_spinlock { + atomic_flag v; +}; + +/** Static metal spinlock initialization. */ +#define METAL_SPINLOCK_INIT {ATOMIC_FLAG_INIT} + +/** + * @brief Initialize a libmetal spinlock. + * @param[in] slock Spinlock to initialize. + */ +static inline void metal_spinlock_init(struct metal_spinlock *slock) +{ + atomic_flag_clear(&slock->v); +} + +/** + * @brief Acquire a spinlock. + * @param[in] slock Spinlock to acquire. + * @see metal_spinlock_release + */ +static inline void metal_spinlock_acquire(struct metal_spinlock *slock) +{ + while (atomic_flag_test_and_set(&slock->v)) { + metal_cpu_yield(); + } +} + +/** + * @brief Release a previously acquired spinlock. + * @param[in] slock Spinlock to release. + * @see metal_spinlock_acquire + */ +static inline void metal_spinlock_release(struct metal_spinlock *slock) +{ + atomic_flag_clear(&slock->v); +} + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_SPINLOCK__H__ */ diff --git a/libraries/openamp_arduino/src/metal/sys.h b/libraries/openamp_arduino/src/metal/sys.h index 12f7f6995..24822ca14 100755 --- a/libraries/openamp_arduino/src/metal/sys.h +++ b/libraries/openamp_arduino/src/metal/sys.h @@ -1,148 +1,152 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file sys.h - * @brief System primitives for libmetal. - * @brief Top level include internal to libmetal library code. - */ - -#ifndef __METAL_SYS__H__ -#define __METAL_SYS__H__ - -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup system Top Level Interfaces - * @{ */ - -/** Physical address type. */ -typedef unsigned long metal_phys_addr_t; - -/** Interrupt request number. */ -typedef int metal_irq_t; - -/** Bad offset into shared memory or I/O region. */ -#define METAL_BAD_OFFSET ((unsigned long)-1) - -/** Bad physical address value. */ -#define METAL_BAD_PHYS ((metal_phys_addr_t)-1) - -/** Bad virtual address value. */ -#define METAL_BAD_VA ((void *)-1) - -/** Bad IRQ. */ -#define METAL_BAD_IRQ ((metal_irq_t)-1) - -/** - * Initialization configuration for libmetal. - */ -struct metal_init_params { - - /** log message handler (defaults to stderr). */ - metal_log_handler log_handler; - - /** default log message level (defaults to emergency). */ - enum metal_log_level log_level; -}; - -/** - * System independent runtime state for libmetal. This is part of a system - * specific singleton data structure (@see _metal). - */ -struct metal_common_state { - /** Current log level. */ - enum metal_log_level log_level; - - /** Current log handler (null for none). */ - metal_log_handler log_handler; - - /** List of registered buses. */ - struct metal_list bus_list; - - /** Generic statically defined shared memory segments. */ - struct metal_list generic_shmem_list; - - /** Generic statically defined devices. */ - struct metal_list generic_device_list; -}; - -struct metal_state; - -#include - -#ifndef METAL_INIT_DEFAULTS -#define METAL_INIT_DEFAULTS \ -{ \ - .log_handler = metal_default_log_handler, \ - .log_level = METAL_LOG_INFO, \ -} -#endif - -/** System specific runtime data. */ -extern struct metal_state _metal; - -/** - * @brief Initialize libmetal. - * - * Initialize the libmetal library. - * - * @param[in] params Initialization params (@see metal_init_params). - * - * @return 0 on success, or -errno on failure. - * - * @see metal_finish - */ -extern int metal_init(const struct metal_init_params *params); - -/** - * @brief Shutdown libmetal. - * - * Shutdown the libmetal library, and release all reserved resources. - * - * @see metal_init - */ -extern void metal_finish(void); - -#ifdef METAL_INTERNAL - -/** - * @brief libmetal system initialization. - * - * This function initializes libmetal on Linux or Generic platforms. This - * involves obtaining necessary pieces of system information (sysfs mount path, - * page size, etc.). - * - * @param[in] params Initialization parameters (@see metal_init_params). - * @return 0 on success, or -errno on failure. - */ -extern int metal_sys_init(const struct metal_init_params *params); - -/** - * @brief libmetal system shutdown. - * - * This function shuts down and releases resources held by libmetal Linux or - * Generic platform layers. - * - * @see metal_sys_init - */ -extern void metal_sys_finish(void); - -#endif - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_SYS__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file sys.h + * @brief System primitives for libmetal. + * @brief Top level include internal to libmetal library code. + */ + +#ifndef __METAL_SYS__H__ +#define __METAL_SYS__H__ + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup system Top Level Interfaces + * @{ + */ + +/** Physical address type. */ +typedef unsigned long metal_phys_addr_t; + +/** Interrupt request number. */ +typedef int metal_irq_t; + +/** Bad offset into shared memory or I/O region. */ +#define METAL_BAD_OFFSET ((unsigned long)-1) + +/** Bad physical address value. */ +#define METAL_BAD_PHYS ((metal_phys_addr_t)-1) + +/** Bad virtual address value. */ +#define METAL_BAD_VA ((void *)-1) + +/** Bad IRQ. */ +#define METAL_BAD_IRQ ((metal_irq_t)-1) + +/** + * Initialization configuration for libmetal. + */ +struct metal_init_params { + + /** log message handler (defaults to stderr). */ + metal_log_handler log_handler; + + /** default log message level (defaults to emergency). */ + enum metal_log_level log_level; +}; + +/** + * System independent runtime state for libmetal. This is part of a system + * specific singleton data structure (@see _metal). + */ +struct metal_common_state { + /** reference count to track metal_init/metal_finish. */ + int ref_count; + + /** Current log level. */ + enum metal_log_level log_level; + + /** Current log handler (null for none). */ + metal_log_handler log_handler; + + /** List of registered buses. */ + struct metal_list bus_list; + + /** Generic statically defined shared memory segments. */ + struct metal_list generic_shmem_list; + + /** Generic statically defined devices. */ + struct metal_list generic_device_list; +}; + +struct metal_state; + +#include + +#ifndef METAL_INIT_DEFAULTS +#define METAL_INIT_DEFAULTS \ +{ \ + .log_handler = metal_default_log_handler, \ + .log_level = METAL_LOG_INFO, \ +} +#endif + +/** System specific runtime data. */ +extern struct metal_state _metal; + +/** + * @brief Initialize libmetal. + * + * Initialize the libmetal library. + * + * @param[in] params Initialization params (@see metal_init_params). + * + * @return 0 on success, or -errno on failure. + * + * @see metal_finish + */ +extern int metal_init(const struct metal_init_params *params); + +/** + * @brief Shutdown libmetal. + * + * Shutdown the libmetal library, and release all reserved resources. + * + * @see metal_init + */ +extern void metal_finish(void); + +#ifdef METAL_INTERNAL + +/** + * @brief libmetal system initialization. + * + * This function initializes libmetal on Linux or Generic platforms. This + * involves obtaining necessary pieces of system information (sysfs mount path, + * page size, etc.). + * + * @param[in] params Initialization parameters (@see metal_init_params). + * @return 0 on success, or -errno on failure. + */ +extern int metal_sys_init(const struct metal_init_params *params); + +/** + * @brief libmetal system shutdown. + * + * This function shuts down and releases resources held by libmetal Linux or + * Generic platform layers. + * + * @see metal_sys_init + */ +extern void metal_sys_finish(void); + +#endif + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_SYS__H__ */ diff --git a/libraries/openamp_arduino/src/metal/system/generic/alloc.h b/libraries/openamp_arduino/src/metal/system/generic/alloc.h index 5338dd7de..6dc767fa1 100755 --- a/libraries/openamp_arduino/src/metal/system/generic/alloc.h +++ b/libraries/openamp_arduino/src/metal/system/generic/alloc.h @@ -22,12 +22,12 @@ extern "C" { #endif -static inline void *metal_allocate_memory(unsigned int size) +static inline void *__metal_allocate_memory(unsigned int size) { return (malloc(size)); } -static inline void metal_free_memory(void *ptr) +static inline void __metal_free_memory(void *ptr) { free(ptr); } diff --git a/libraries/openamp_arduino/src/metal/system/generic/cortexm/sys.h b/libraries/openamp_arduino/src/metal/system/generic/cortexm/sys.h deleted file mode 100755 index 35597d616..000000000 --- a/libraries/openamp_arduino/src/metal/system/generic/cortexm/sys.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. Neither the name of Xilinx nor the names of its contributors may be used - * to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * @file generic/mp1_m4/sys.h - * @brief generic mp1_m4 system primitives for libmetal. - */ - -#ifndef __METAL_GENERIC_SYS__H__ -#error "Include metal/sys.h instead of metal/generic/cortexm/sys.h" -#endif - -#ifndef __METAL_GENERIC_MP1_M4_SYS__H__ -#define __METAL_GENERIC_MP1_M4_SYS__H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#if !defined(MAX_IRQS) -#define MAX_IRQS 8 /**< maximum number of irqs */ -#endif - -static inline void sys_irq_enable(unsigned int vector) -{ - (void)vector; -} - -static inline void sys_irq_disable(unsigned int vector) -{ - (void)vector; -} - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_GENERIC_MP1_M4_SYS__H__ */ diff --git a/libraries/openamp_arduino/src/metal/system/generic/sys.h b/libraries/openamp_arduino/src/metal/system/generic/sys.h index f5a236852..0a19b2362 100755 --- a/libraries/openamp_arduino/src/metal/system/generic/sys.h +++ b/libraries/openamp_arduino/src/metal/system/generic/sys.h @@ -25,8 +25,6 @@ #include #include -#include "./cortexm/sys.h" - #ifdef __cplusplus extern "C" { #endif diff --git a/libraries/openamp_arduino/src/metal/time.h b/libraries/openamp_arduino/src/metal/time.h index b05e6794a..bc24e6134 100755 --- a/libraries/openamp_arduino/src/metal/time.h +++ b/libraries/openamp_arduino/src/metal/time.h @@ -1,41 +1,42 @@ -/* - * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file time.h - * @brief Time primitives for libmetal. - */ - -#ifndef __METAL_TIME__H__ -#define __METAL_TIME__H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup time TIME Interfaces - * @{ */ - -#include -#include - -/** - * @brief get timestamp - * This function returns the timestampe as unsigned long long - * value. - * - * @return timestamp - */ -unsigned long long metal_get_timestamp(void); - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_TIME__H__ */ - +/* + * Copyright (c) 2016, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file time.h + * @brief Time primitives for libmetal. + */ + +#ifndef __METAL_TIME__H__ +#define __METAL_TIME__H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup time TIME Interfaces + * @{ + */ + +/** + * @brief get timestamp + * This function returns the timestampe as unsigned long long + * value. + * + * @return timestamp + */ +unsigned long long metal_get_timestamp(void); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_TIME__H__ */ + diff --git a/libraries/openamp_arduino/src/metal/utilities.h b/libraries/openamp_arduino/src/metal/utilities.h index 95a6670a9..6b592e017 100755 --- a/libraries/openamp_arduino/src/metal/utilities.h +++ b/libraries/openamp_arduino/src/metal/utilities.h @@ -1,152 +1,165 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file utilities.h - * @brief Utility routines for libmetal. - */ - -#ifndef __METAL_UTILITIES__H__ -#define __METAL_UTILITIES__H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup utilities Simple Utilities - * @{ */ - -/** Marker for unused function arguments/variables. */ -#define metal_unused(x) do { (x) = (x); } while (0) - -/** Figure out number of elements in an array. */ -#define metal_dim(x) (sizeof(x) / sizeof(x[0])) - -/** Minimum of two numbers (warning: multiple evaluation!). */ -#define metal_min(x, y) ((x) < (y) ? (x) : (y)) - -/** Maximum of two numbers (warning: multiple evaluation!). */ -#define metal_max(x, y) ((x) > (y) ? (x) : (y)) - -/** Sign of a number [-1, 0, or 1] (warning: multiple evaluation!). */ -#define metal_sign(x) ((x) < 0 ? -1 : ((x) > 0 ? 1 : 0)) - -/** Align 'size' down to a multiple of 'align' (must be a power of two). */ -#define metal_align_down(size, align) \ - ((size) & ~((align) - 1)) - -/** Align 'size' up to a multiple of 'align' (must be a power of two). */ -#define metal_align_up(size, align) \ - metal_align_down((size) + (align) - 1, align) - -/** Divide (and round down). */ -#define metal_div_round_down(num, den) \ - ((num) / (den)) - -/** Divide (and round up). */ -#define metal_div_round_up(num, den) \ - metal_div_round_down((num) + (den) - 1, (den)) - -/** Align 'ptr' down to a multiple of 'align' (must be a power of two). */ -#define metal_ptr_align_down(ptr, align) \ - (void *)(metal_align_down((uintptr_t)(ptr), (uintptr_t)(align))) - -/** Align 'ptr' up to a multiple of 'align' (must be a power of two). */ -#define metal_ptr_align_up(ptr, align) \ - (void *)(metal_align_up((uintptr_t)(ptr), (uintptr_t)(align))) - -/** Compute offset of a field within a structure. */ -#define metal_offset_of(structure, member) \ - ((uintptr_t) &(((structure *) 0)->member)) - -/** Compute pointer to a structure given a pointer to one of its fields. */ -#define metal_container_of(ptr, structure, member) \ - (void *)((uintptr_t)(ptr) - metal_offset_of(structure, member)) - -#define METAL_BITS_PER_ULONG (8 * sizeof(unsigned long)) - -#define metal_bit(bit) (1UL << (bit)) - -#define metal_bitmap_longs(x) metal_div_round_up((x), METAL_BITS_PER_ULONG) - -static inline void metal_bitmap_set_bit(unsigned long *bitmap, int bit) -{ - bitmap[bit / METAL_BITS_PER_ULONG] |= - metal_bit(bit & (METAL_BITS_PER_ULONG - 1)); -} - -static inline int metal_bitmap_is_bit_set(unsigned long *bitmap, int bit) -{ - return bitmap[bit / METAL_BITS_PER_ULONG] & - metal_bit(bit & (METAL_BITS_PER_ULONG - 1)); -} - -static inline void metal_bitmap_clear_bit(unsigned long *bitmap, int bit) -{ - bitmap[bit / METAL_BITS_PER_ULONG] &= - ~metal_bit(bit & (METAL_BITS_PER_ULONG - 1)); -} - -static inline int metal_bitmap_is_bit_clear(unsigned long *bitmap, int bit) -{ - return !metal_bitmap_is_bit_set(bitmap, bit); -} - -static inline unsigned int -metal_bitmap_next_set_bit(unsigned long *bitmap, unsigned int start, - unsigned int max) -{ - unsigned int bit; - for (bit = start; - bit < max && !metal_bitmap_is_bit_set(bitmap, bit); - bit ++) - ; - return bit; -} - -#define metal_bitmap_for_each_set_bit(bitmap, bit, max) \ - for ((bit) = metal_bitmap_next_set_bit((bitmap), 0, (max)); \ - (bit) < (max); \ - (bit) = metal_bitmap_next_set_bit((bitmap), (bit), (max))) - -static inline unsigned int -metal_bitmap_next_clear_bit(unsigned long *bitmap, unsigned int start, - unsigned int max) -{ - unsigned int bit; - for (bit = start; - bit < max && !metal_bitmap_is_bit_clear(bitmap, bit); - bit ++) - ; - return bit; -} - -#define metal_bitmap_for_each_clear_bit(bitmap, bit, max) \ - for ((bit) = metal_bitmap_next_clear_bit((bitmap), 0, (max)); \ - (bit) < (max); \ - (bit) = metal_bitmap_next_clear_bit((bitmap), (bit), (max))) - -static inline unsigned long metal_log2(unsigned long in) -{ - unsigned long result; - - metal_assert((in & (in - 1)) == 0); - - for (result = 0; (1UL << result) < in; result ++) - ; - return result; -} - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_UTILITIES__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * Copyright (c) 2022-2023 Advanced Micro Devices, Inc. All Rights Reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file utilities.h + * @brief Utility routines for libmetal. + */ + +#ifndef __METAL_UTILITIES__H__ +#define __METAL_UTILITIES__H__ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup utilities Simple Utilities + * @{ + */ + +#ifndef MB +#define MB (1024UL << 10UL) +#endif + +#ifndef GB +#define GB (MB << 10UL) +#endif + +/** Marker for unused function arguments/variables. */ +#define metal_unused(x) do { (x) = (x); } while (0) + +/** Figure out number of elements in an array. */ +#define metal_dim(x) (sizeof(x) / sizeof(x[0])) + +/** Minimum of two numbers (warning: multiple evaluation!). */ +#define metal_min(x, y) ((x) < (y) ? (x) : (y)) + +/** Maximum of two numbers (warning: multiple evaluation!). */ +#define metal_max(x, y) ((x) > (y) ? (x) : (y)) + +/** Sign of a number [-1, 0, or 1] (warning: multiple evaluation!). */ +#define metal_sign(x) ((x) < 0 ? -1 : ((x) > 0 ? 1 : 0)) + +/** Align 'size' down to a multiple of 'align' (must be a power of two). */ +#define metal_align_down(size, align) \ + ((size) & ~((align) - 1)) + +/** Align 'size' up to a multiple of 'align' (must be a power of two). */ +#define metal_align_up(size, align) \ + metal_align_down((size) + (align) - 1, align) + +/** Divide (and round down). */ +#define metal_div_round_down(num, den) \ + ((num) / (den)) + +/** Divide (and round up). */ +#define metal_div_round_up(num, den) \ + metal_div_round_down((num) + (den) - 1, (den)) + +/** Align 'ptr' down to a multiple of 'align' (must be a power of two). */ +#define metal_ptr_align_down(ptr, align) \ + (void *)(metal_align_down((uintptr_t)(ptr), (uintptr_t)(align))) + +/** Align 'ptr' up to a multiple of 'align' (must be a power of two). */ +#define metal_ptr_align_up(ptr, align) \ + (void *)(metal_align_up((uintptr_t)(ptr), (uintptr_t)(align))) + +/** Compute offset of a field within a structure. */ +#define metal_offset_of(structure, member) \ + ((uintptr_t)&(((structure *)0)->member)) + +/** Compute pointer to a structure given a pointer to one of its fields. */ +#define metal_container_of(ptr, structure, member) \ + (void *)((uintptr_t)(ptr) - metal_offset_of(structure, member)) + +#define METAL_BITS_PER_ULONG (CHAR_BIT * sizeof(unsigned long)) + +#define metal_bit(bit) (1UL << (bit)) + +#define metal_bitmap_longs(x) metal_div_round_up((x), METAL_BITS_PER_ULONG) + +static inline void metal_bitmap_set_bit(unsigned long *bitmap, int bit) +{ + bitmap[bit / METAL_BITS_PER_ULONG] |= + metal_bit(bit & (METAL_BITS_PER_ULONG - 1)); +} + +static inline int metal_bitmap_is_bit_set(unsigned long *bitmap, int bit) +{ + return ((bitmap[bit / METAL_BITS_PER_ULONG] & + metal_bit(bit & (METAL_BITS_PER_ULONG - 1))) == 0) ? 0 : 1; +} + +static inline void metal_bitmap_clear_bit(unsigned long *bitmap, int bit) +{ + bitmap[bit / METAL_BITS_PER_ULONG] &= + ~metal_bit(bit & (METAL_BITS_PER_ULONG - 1)); +} + +static inline int metal_bitmap_is_bit_clear(unsigned long *bitmap, int bit) +{ + return !metal_bitmap_is_bit_set(bitmap, bit); +} + +static inline unsigned int +metal_bitmap_next_set_bit(unsigned long *bitmap, unsigned int start, + unsigned int max) +{ + unsigned int bit; + + for (bit = start; + bit < max && !metal_bitmap_is_bit_set(bitmap, bit); + bit++) + ; + return bit; +} + +#define metal_bitmap_for_each_set_bit(bitmap, bit, max) \ + for ((bit) = metal_bitmap_next_set_bit((bitmap), 0, (max)); \ + (bit) < (max); \ + (bit) = metal_bitmap_next_set_bit((bitmap), (bit + 1), (max))) + +static inline unsigned int +metal_bitmap_next_clear_bit(unsigned long *bitmap, unsigned int start, + unsigned int max) +{ + unsigned int bit; + + for (bit = start; + bit < max && !metal_bitmap_is_bit_clear(bitmap, bit); + bit++) + ; + return bit; +} + +#define metal_bitmap_for_each_clear_bit(bitmap, bit, max) \ + for ((bit) = metal_bitmap_next_clear_bit((bitmap), 0, (max)); \ + (bit) < (max); \ + (bit) = metal_bitmap_next_clear_bit((bitmap), (bit + 1), (max))) + +static inline unsigned long metal_log2(unsigned long in) +{ + unsigned long result; + + metal_assert((in & (in - 1)) == 0); + + for (result = 0; (1UL << result) < in; result++) + ; + return result; +} + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_UTILITIES__H__ */ diff --git a/libraries/openamp_arduino/src/metal/version.h b/libraries/openamp_arduino/src/metal/version.h index 96666b3aa..32be7ae69 100755 --- a/libraries/openamp_arduino/src/metal/version.h +++ b/libraries/openamp_arduino/src/metal/version.h @@ -1,76 +1,77 @@ -/* - * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - * @file version.h - * @brief Library version information for libmetal. - */ - -#ifndef __METAL_VERSION__H__ -#define __METAL_VERSION__H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** \defgroup versions Library Version Interfaces - * @{ */ - -/** - * @brief Library major version number. - * - * Return the major version number of the library linked into the application. - * This is required to match the value of METAL_VER_MAJOR, which is the major - * version of the library that the application was compiled against. - * - * @return Library major version number. - * @see METAL_VER_MAJOR - */ -extern int metal_ver_major(void); - -/** - * @brief Library minor version number. - * - * Return the minor version number of the library linked into the application. - * This could differ from the value of METAL_VER_MINOR, which is the minor - * version of the library that the application was compiled against. - * - * @return Library minor version number. - * @see METAL_VER_MINOR - */ -extern int metal_ver_minor(void); - -/** - * @brief Library patch level. - * - * Return the patch level of the library linked into the application. This - * could differ from the value of METAL_VER_PATCH, which is the patch level of - * the library that the application was compiled against. - * - * @return Library patch level. - * @see METAL_VER_PATCH - */ -extern int metal_ver_patch(void); - -/** - * @brief Library version string. - * - * Return the version string of the library linked into the application. This - * could differ from the value of METAL_VER, which is the version string of - * the library that the application was compiled against. - * - * @return Library version string. - * @see METAL_VER - */ -extern const char *metal_ver(void); - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* __METAL_VERSION__H__ */ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file version.h + * @brief Library version information for libmetal. + */ + +#ifndef __METAL_VERSION__H__ +#define __METAL_VERSION__H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup versions Library Version Interfaces + * @{ + */ + +/** + * @brief Library major version number. + * + * Return the major version number of the library linked into the application. + * This is required to match the value of METAL_VER_MAJOR, which is the major + * version of the library that the application was compiled against. + * + * @return Library major version number. + * @see METAL_VER_MAJOR + */ +extern int metal_ver_major(void); + +/** + * @brief Library minor version number. + * + * Return the minor version number of the library linked into the application. + * This could differ from the value of METAL_VER_MINOR, which is the minor + * version of the library that the application was compiled against. + * + * @return Library minor version number. + * @see METAL_VER_MINOR + */ +extern int metal_ver_minor(void); + +/** + * @brief Library patch level. + * + * Return the patch level of the library linked into the application. This + * could differ from the value of METAL_VER_PATCH, which is the patch level of + * the library that the application was compiled against. + * + * @return Library patch level. + * @see METAL_VER_PATCH + */ +extern int metal_ver_patch(void); + +/** + * @brief Library version string. + * + * Return the version string of the library linked into the application. This + * could differ from the value of METAL_VER, which is the version string of + * the library that the application was compiled against. + * + * @return Library version string. + * @see METAL_VER + */ +extern const char *metal_ver(void); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __METAL_VERSION__H__ */ diff --git a/libraries/openamp_arduino/src/openamp.c b/libraries/openamp_arduino/src/openamp.c index 62c26bbc0..0ead7620b 100644 --- a/libraries/openamp_arduino/src/openamp.c +++ b/libraries/openamp_arduino/src/openamp.c @@ -135,7 +135,7 @@ int MX_OPENAMP_Init(int RPMsgRole, rpmsg_ns_bind_cb ns_bind_cb) } rpmsg_virtio_init_shm_pool(&shpool, (void *)VRING_BUFF_ADDRESS, - (size_t)SHM_SIZE); + (size_t)VRING_BUFF_SIZE); rpmsg_init_vdev(&rvdev, vdev, ns_bind_cb, shm_io, &shpool); @@ -175,7 +175,7 @@ int OPENAMP_Wait_EndPointready(struct rpmsg_endpoint *rp_ept, size_t deadline) MAILBOX_Poll(rvdev.vdev); } if (millis() >= deadline) { - printf("OPENAMP_Wait_EndPointready %X timed out\n\r", (unsigned int)rp_ept); + //printf("OPENAMP_Wait_EndPointready %X timed out\n\r", (unsigned int)rp_ept); return -1; } return 0; diff --git a/libraries/openamp_arduino/src/openamp/elf_loader.h b/libraries/openamp_arduino/src/openamp/elf_loader.h index acf3d2991..a2950f8d7 100755 --- a/libraries/openamp_arduino/src/openamp/elf_loader.h +++ b/libraries/openamp_arduino/src/openamp/elf_loader.h @@ -1,428 +1,445 @@ -/* - * Copyright (c) 2014, Mentor Graphics Corporation - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef ELF_LOADER_H_ -#define ELF_LOADER_H_ - -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -/* ELF32 base types - 32-bit. */ -typedef uint32_t Elf32_Addr; -typedef uint16_t Elf32_Half; -typedef uint32_t Elf32_Off; -typedef int32_t Elf32_Sword; -typedef uint32_t Elf32_Word; - -/* ELF64 base types - 64-bit. */ -typedef uint64_t Elf64_Addr; -typedef uint16_t Elf64_Half; -typedef uint64_t Elf64_Off; -typedef int32_t Elf64_Sword; -typedef uint32_t Elf64_Word; -typedef uint64_t Elf64_Xword; -typedef int64_t Elf64_Sxword; - -/* Size of ELF identifier field in the ELF file header. */ -#define EI_NIDENT 16 - -/* ELF32 file header */ -typedef struct { - unsigned char e_ident[EI_NIDENT]; - Elf32_Half e_type; - Elf32_Half e_machine; - Elf32_Word e_version; - Elf32_Addr e_entry; - Elf32_Off e_phoff; - Elf32_Off e_shoff; - Elf32_Word e_flags; - Elf32_Half e_ehsize; - Elf32_Half e_phentsize; - Elf32_Half e_phnum; - Elf32_Half e_shentsize; - Elf32_Half e_shnum; - Elf32_Half e_shstrndx; -} Elf32_Ehdr; - -/* ELF64 file header */ -typedef struct { - unsigned char e_ident[EI_NIDENT]; - Elf64_Half e_type; - Elf64_Half e_machine; - Elf64_Word e_version; - Elf64_Addr e_entry; - Elf64_Off e_phoff; - Elf64_Off e_shoff; - Elf64_Word e_flags; - Elf64_Half e_ehsize; - Elf64_Half e_phentsize; - Elf64_Half e_phnum; - Elf64_Half e_shentsize; - Elf64_Half e_shnum; - Elf64_Half e_shstrndx; -} Elf64_Ehdr; - -/* e_ident */ -#define ET_NONE 0 -#define ET_REL 1 /* Re-locatable file */ -#define ET_EXEC 2 /* Executable file */ -#define ET_DYN 3 /* Shared object file */ -#define ET_CORE 4 /* Core file */ -#define ET_LOOS 0xfe00 /* Operating system-specific */ -#define ET_HIOS 0xfeff /* Operating system-specific */ -#define ET_LOPROC 0xff00 /* remote_proc-specific */ -#define ET_HIPROC 0xffff /* remote_proc-specific */ - -/* e_machine */ -#define EM_ARM 40 /* ARM/Thumb Architecture */ - -/* e_version */ -#define EV_CURRENT 1 /* Current version */ - -/* e_ident[] Identification Indexes */ -#define EI_MAG0 0 /* File identification */ -#define EI_MAG1 1 /* File identification */ -#define EI_MAG2 2 /* File identification */ -#define EI_MAG3 3 /* File identification */ -#define EI_CLASS 4 /* File class */ -#define EI_DATA 5 /* Data encoding */ -#define EI_VERSION 6 /* File version */ -#define EI_OSABI 7 /* Operating system/ABI identification */ -#define EI_ABIVERSION 8 /* ABI version */ -#define EI_PAD 9 /* Start of padding bytes */ -#define EI_NIDENT 16 /* Size of e_ident[] */ - -/* - * EI_MAG0 to EI_MAG3 - A file's first 4 bytes hold amagic number, identifying - * the file as an ELF object file - */ -#define ELFMAG0 0x7f /* e_ident[EI_MAG0] */ -#define ELFMAG1 'E' /* e_ident[EI_MAG1] */ -#define ELFMAG2 'L' /* e_ident[EI_MAG2] */ -#define ELFMAG3 'F' /* e_ident[EI_MAG3] */ -#define ELFMAG "\177ELF" -#define SELFMAG 4 - -/* - * EI_CLASS - The next byte, e_ident[EI_CLASS], identifies the file's class, or - * capacity. - */ -#define ELFCLASSNONE 0 /* Invalid class */ -#define ELFCLASS32 1 /* 32-bit objects */ -#define ELFCLASS64 2 /* 64-bit objects */ - -/* - * EI_DATA - Byte e_ident[EI_DATA] specifies the data encoding of the - * remote_proc-specific data in the object file. The following encodings are - * currently defined. - */ -#define ELFDATANONE 0 /* Invalid data encoding */ -#define ELFDATA2LSB 1 /* See Data encodings, below */ -#define ELFDATA2MSB 2 /* See Data encodings, below */ - -/* EI_OSABI - We do not define an OS specific ABI */ -#define ELFOSABI_NONE 0 - -/* ELF32 program header */ -typedef struct elf32_phdr{ - Elf32_Word p_type; - Elf32_Off p_offset; - Elf32_Addr p_vaddr; - Elf32_Addr p_paddr; - Elf32_Word p_filesz; - Elf32_Word p_memsz; - Elf32_Word p_flags; - Elf32_Word p_align; -} Elf32_Phdr; - -/* ELF64 program header */ -typedef struct elf64_phdr { - Elf64_Word p_type; - Elf64_Word p_flags; - Elf64_Off p_offset; - Elf64_Addr p_vaddr; - Elf64_Addr p_paddr; - Elf64_Xword p_filesz; - Elf64_Xword p_memsz; - Elf64_Xword p_align; -} Elf64_Phdr; - -/* segment types */ -#define PT_NULL 0 -#define PT_LOAD 1 -#define PT_DYNAMIC 2 -#define PT_INTERP 3 -#define PT_NOTE 4 -#define PT_SHLIB 5 -#define PT_PHDR 6 -#define PT_TLS 7 /* Thread local storage segment */ -#define PT_LOOS 0x60000000 /* OS-specific */ -#define PT_HIOS 0x6fffffff /* OS-specific */ -#define PT_LOPROC 0x70000000 -#define PT_HIPROC 0x7fffffff - -/* ELF32 section header. */ -typedef struct { - Elf32_Word sh_name; - Elf32_Word sh_type; - Elf32_Word sh_flags; - Elf32_Addr sh_addr; - Elf32_Off sh_offset; - Elf32_Word sh_size; - Elf32_Word sh_link; - Elf32_Word sh_info; - Elf32_Word sh_addralign; - Elf32_Word sh_entsize; -} Elf32_Shdr; - -/* ELF64 section header. */ -typedef struct { - Elf64_Word sh_name; - Elf64_Word sh_type; - Elf64_Xword sh_flags; - Elf64_Addr sh_addr; - Elf64_Off sh_offset; - Elf64_Xword sh_size; - Elf64_Word sh_link; - Elf64_Word sh_info; - Elf64_Xword sh_addralign; - Elf64_Xword sh_entsize; -} Elf64_Shdr; - -/* sh_type */ -#define SHT_NULL 0 -#define SHT_PROGBITS 1 -#define SHT_SYMTAB 2 -#define SHT_STRTAB 3 -#define SHT_RELA 4 -#define SHT_HASH 5 -#define SHT_DYNAMIC 6 -#define SHT_NOTE 7 -#define SHT_NOBITS 8 -#define SHT_REL 9 -#define SHT_SHLIB 10 -#define SHT_DYNSYM 11 -#define SHT_INIT_ARRAY 14 -#define SHT_FINI_ARRAY 15 -#define SHT_PREINIT_ARRAY 16 -#define SHT_GROUP 17 -#define SHT_SYMTAB_SHNDX 18 -#define SHT_LOOS 0x60000000 -#define SHT_HIOS 0x6fffffff -#define SHT_LOPROC 0x70000000 -#define SHT_HIPROC 0x7fffffff -#define SHT_LOUSER 0x80000000 -#define SHT_HIUSER 0xffffffff - -/* sh_flags */ -#define SHF_WRITE 0x1 -#define SHF_ALLOC 0x2 -#define SHF_EXECINSTR 0x4 -#define SHF_MASKPROC 0xf0000000 - -/* Relocation entry (without addend) */ -typedef struct { - Elf32_Addr r_offset; - Elf32_Word r_info; - -} Elf32_Rel; - -typedef struct { - Elf64_Addr r_offset; - Elf64_Xword r_info; - -} Elf64_Rel; - -/* Relocation entry with addend */ -typedef struct { - Elf32_Addr r_offset; - Elf32_Word r_info; - Elf32_Sword r_addend; - -} Elf32_Rela; - -typedef struct elf64_rela { - Elf64_Addr r_offset; - Elf64_Xword r_info; - Elf64_Sxword r_addend; -} Elf64_Rela; - -/* Macros to extract information from 'r_info' field of relocation entries */ -#define ELF32_R_SYM(i) ((i) >> 8) -#define ELF32_R_TYPE(i) ((unsigned char)(i)) -#define ELF64_R_SYM(i) ((i) >> 32) -#define ELF64_R_TYPE(i) ((i) & 0xffffffff) - -/* Symbol table entry */ -typedef struct { - Elf32_Word st_name; - Elf32_Addr st_value; - Elf32_Word st_size; - unsigned char st_info; - unsigned char st_other; - Elf32_Half st_shndx; - -} Elf32_Sym; - -typedef struct elf64_sym { - Elf64_Word st_name; - unsigned char st_info; - unsigned char st_other; - Elf64_Half st_shndx; - Elf64_Addr st_value; - Elf64_Xword st_size; -} Elf64_Sym; - -/* ARM specific dynamic relocation codes */ -#define R_ARM_GLOB_DAT 21 /* 0x15 */ -#define R_ARM_JUMP_SLOT 22 /* 0x16 */ -#define R_ARM_RELATIVE 23 /* 0x17 */ -#define R_ARM_ABS32 2 /* 0x02 */ - -/* ELF decoding information */ -struct elf32_info { - Elf32_Ehdr ehdr; - unsigned int load_state; - Elf32_Phdr *phdrs; - Elf32_Shdr *shdrs; - void *shstrtab; -}; - -struct elf64_info { - Elf64_Ehdr ehdr; - unsigned int load_state; - Elf64_Phdr *phdrs; - Elf64_Shdr *shdrs; - void *shstrtab; -}; - -#define ELF_STATE_INIT 0x0UL -#define ELF_STATE_WAIT_FOR_PHDRS 0x100UL -#define ELF_STATE_WAIT_FOR_SHDRS 0x200UL -#define ELF_STATE_WAIT_FOR_SHSTRTAB 0x400UL -#define ELF_STATE_HDRS_COMPLETE 0x800UL -#define ELF_STATE_MASK 0xFF00UL -#define ELF_NEXT_SEGMENT_MASK 0x00FFUL - -extern struct loader_ops elf_ops; - -/** - * elf_identify - check if it is an ELF file - * - * It will check if the input image header is an ELF header. - * - * @img_data: firmware private data which will be passed to user defined loader - * operations - * @len: firmware header length - * - * return 0 for success or negative value for failure. - */ -int elf_identify(const void *img_data, size_t len); - -/** - * elf_load_header - Load ELF headers - * - * It will get the ELF header, the program header, and the section header. - * - * @img_data: image data - * @offset: input image data offset to the start of image file - * @len: input image data length - * @img_info: pointer to store image information data - * @last_load_state: last state return by this function - * @noffset: pointer to next offset required by loading ELF header - * @nlen: pointer to next data length required by loading ELF header - * - * return ELF loading header state, or negative value for failure - */ -int elf_load_header(const void *img_data, size_t offset, size_t len, - void **img_info, int last_load_state, - size_t *noffset, size_t *nlen); - -/** - * elf_load - load ELF data - * - * It will parse the ELF image and return the target device address, - * offset to the start of the ELF image of the data to load and the - * length of the data to load. - * - * @rproc: pointer to remoteproc instance - * @img_data: image data which will passed to the function. - * it can be NULL, if image data doesn't need to be handled - * by the load function. E.g. binary data which was - * loaded to the target memory. - * @offset: last loaded image data offset to the start of image file - * @len: last loaded image data length - * @img_info: pointer to store image information data - * @last_load_state: the returned state of the last function call. - * @da: target device address, if the data to load is not for target memory - * the da will be set to ANY. - * @noffset: pointer to next offset required by loading ELF header - * @nlen: pointer to next data length required by loading ELF header - * @padding: value to pad it is possible that a size of a segment in memory - * is larger than what it is in the ELF image. e.g. a segment - * can have stack section .bss. It doesn't need to copy image file - * space, in this case, it will be packed with 0. - * @nmemsize: pointer to next data target memory size. The size of a segment - * in the target memory can be larger than the its size in the - * image file. - * - * return 0 for success, otherwise negative value for failure - */ -int elf_load(struct remoteproc *rproc, const void *img_data, - size_t offset, size_t len, - void **img_info, int last_load_state, - metal_phys_addr_t *da, - size_t *noffset, size_t *nlen, - unsigned char *padding, size_t *nmemsize); - -/** - * elf_release - Release ELF image information - * - * It will release ELF image information data. - * - * @img_info: pointer to ELF image information - */ -void elf_release(void *img_info); - -/** - * elf_get_entry - Get entry point - * - * It will return entry point specified in the ELF file. - * - * @img_info: pointer to ELF image information - * - * return entry address - */ -metal_phys_addr_t elf_get_entry(void *img_info); - -/** - * elf_locate_rsc_table - locate the resource table information - * - * It will return the length of the resource table, and the device address of - * the resource table. - * - * @img_info: pointer to ELF image information - * @da: pointer to the device address - * @offset: pointer to the offset to in the ELF image of the resource - * table section. - * @size: pointer to the size of the resource table section. - * - * return 0 if successfully locate the resource table, negative value for - * failure. - */ -int elf_locate_rsc_table(void *img_info, metal_phys_addr_t *da, - size_t *offset, size_t *size); - -#if defined __cplusplus -} -#endif - -#endif /* ELF_LOADER_H_ */ +/* + * Copyright (c) 2014, Mentor Graphics Corporation + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ELF_LOADER_H_ +#define ELF_LOADER_H_ + +#include +#include + +#if defined __cplusplus +extern "C" { +#endif + +/* ELF32 base types - 32-bit. */ +typedef uint32_t Elf32_Addr; +typedef uint16_t Elf32_Half; +typedef uint32_t Elf32_Off; +typedef int32_t Elf32_Sword; +typedef uint32_t Elf32_Word; + +/* ELF64 base types - 64-bit. */ +typedef uint64_t Elf64_Addr; +typedef uint16_t Elf64_Half; +typedef uint64_t Elf64_Off; +typedef int32_t Elf64_Sword; +typedef uint32_t Elf64_Word; +typedef uint64_t Elf64_Xword; +typedef int64_t Elf64_Sxword; + +/* Size of ELF identifier field in the ELF file header. */ +#define EI_NIDENT 16 + +/* ELF32 file header */ +typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; +} Elf32_Ehdr; + +/* ELF64 file header */ +typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf64_Half e_type; + Elf64_Half e_machine; + Elf64_Word e_version; + Elf64_Addr e_entry; + Elf64_Off e_phoff; + Elf64_Off e_shoff; + Elf64_Word e_flags; + Elf64_Half e_ehsize; + Elf64_Half e_phentsize; + Elf64_Half e_phnum; + Elf64_Half e_shentsize; + Elf64_Half e_shnum; + Elf64_Half e_shstrndx; +} Elf64_Ehdr; + +/* e_ident */ +#define ET_NONE 0 +#define ET_REL 1 /* Re-locatable file */ +#define ET_EXEC 2 /* Executable file */ +#define ET_DYN 3 /* Shared object file */ +#define ET_CORE 4 /* Core file */ +#define ET_LOOS 0xfe00 /* Operating system-specific */ +#define ET_HIOS 0xfeff /* Operating system-specific */ +#define ET_LOPROC 0xff00 /* remote_proc-specific */ +#define ET_HIPROC 0xffff /* remote_proc-specific */ + +/* e_machine */ +#define EM_ARM 40 /* ARM/Thumb Architecture */ + +/* e_version */ +#define EV_CURRENT 1 /* Current version */ + +/* e_ident[] Identification Indexes */ +#define EI_MAG0 0 /* File identification */ +#define EI_MAG1 1 /* File identification */ +#define EI_MAG2 2 /* File identification */ +#define EI_MAG3 3 /* File identification */ +#define EI_CLASS 4 /* File class */ +#define EI_DATA 5 /* Data encoding */ +#define EI_VERSION 6 /* File version */ +#define EI_OSABI 7 /* Operating system/ABI identification */ +#define EI_ABIVERSION 8 /* ABI version */ +#define EI_PAD 9 /* Start of padding bytes */ +#define EI_NIDENT 16 /* Size of e_ident[] */ + +/* + * EI_MAG0 to EI_MAG3 - A file's first 4 bytes hold amagic number, identifying + * the file as an ELF object file + */ +#define ELFMAG0 0x7f /* e_ident[EI_MAG0] */ +#define ELFMAG1 'E' /* e_ident[EI_MAG1] */ +#define ELFMAG2 'L' /* e_ident[EI_MAG2] */ +#define ELFMAG3 'F' /* e_ident[EI_MAG3] */ +#define ELFMAG "\177ELF" +#define SELFMAG 4 + +/* + * EI_CLASS - The next byte, e_ident[EI_CLASS], identifies the file's class, or + * capacity. + */ +#define ELFCLASSNONE 0 /* Invalid class */ +#define ELFCLASS32 1 /* 32-bit objects */ +#define ELFCLASS64 2 /* 64-bit objects */ + +/* + * EI_DATA - Byte e_ident[EI_DATA] specifies the data encoding of the + * remote_proc-specific data in the object file. The following encodings are + * currently defined. + */ +#define ELFDATANONE 0 /* Invalid data encoding */ +#define ELFDATA2LSB 1 /* See Data encodings, below */ +#define ELFDATA2MSB 2 /* See Data encodings, below */ + +/* EI_OSABI - We do not define an OS specific ABI */ +#define ELFOSABI_NONE 0 + +/* ELF32 program header */ +typedef struct elf32_phdr { + Elf32_Word p_type; + Elf32_Off p_offset; + Elf32_Addr p_vaddr; + Elf32_Addr p_paddr; + Elf32_Word p_filesz; + Elf32_Word p_memsz; + Elf32_Word p_flags; + Elf32_Word p_align; +} Elf32_Phdr; + +/* ELF64 program header */ +typedef struct elf64_phdr { + Elf64_Word p_type; + Elf64_Word p_flags; + Elf64_Off p_offset; + Elf64_Addr p_vaddr; + Elf64_Addr p_paddr; + Elf64_Xword p_filesz; + Elf64_Xword p_memsz; + Elf64_Xword p_align; +} Elf64_Phdr; + +/* segment types */ +#define PT_NULL 0 +#define PT_LOAD 1 +#define PT_DYNAMIC 2 +#define PT_INTERP 3 +#define PT_NOTE 4 +#define PT_SHLIB 5 +#define PT_PHDR 6 +#define PT_TLS 7 /* Thread local storage segment */ +#define PT_LOOS 0x60000000 /* OS-specific */ +#define PT_HIOS 0x6fffffff /* OS-specific */ +#define PT_LOPROC 0x70000000 +#define PT_HIPROC 0x7fffffff + +/* ELF32 section header. */ +typedef struct { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; +} Elf32_Shdr; + +/* ELF64 section header. */ +typedef struct { + Elf64_Word sh_name; + Elf64_Word sh_type; + Elf64_Xword sh_flags; + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + Elf64_Word sh_link; + Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; +} Elf64_Shdr; + +/* sh_type */ +#define SHT_NULL 0 +#define SHT_PROGBITS 1 +#define SHT_SYMTAB 2 +#define SHT_STRTAB 3 +#define SHT_RELA 4 +#define SHT_HASH 5 +#define SHT_DYNAMIC 6 +#define SHT_NOTE 7 +#define SHT_NOBITS 8 +#define SHT_REL 9 +#define SHT_SHLIB 10 +#define SHT_DYNSYM 11 +#define SHT_INIT_ARRAY 14 +#define SHT_FINI_ARRAY 15 +#define SHT_PREINIT_ARRAY 16 +#define SHT_GROUP 17 +#define SHT_SYMTAB_SHNDX 18 +#define SHT_LOOS 0x60000000 +#define SHT_HIOS 0x6fffffff +#define SHT_LOPROC 0x70000000 +#define SHT_HIPROC 0x7fffffff +#define SHT_LOUSER 0x80000000 +#define SHT_HIUSER 0xffffffff + +/* sh_flags */ +#define SHF_WRITE 0x1 +#define SHF_ALLOC 0x2 +#define SHF_EXECINSTR 0x4 +#define SHF_MASKPROC 0xf0000000 + +/* Relocation entry (without addend) */ +typedef struct { + Elf32_Addr r_offset; + Elf32_Word r_info; +} Elf32_Rel; + +typedef struct { + Elf64_Addr r_offset; + Elf64_Xword r_info; +} Elf64_Rel; + +/* Relocation entry with addend */ +typedef struct { + Elf32_Addr r_offset; + Elf32_Word r_info; + Elf32_Sword r_addend; +} Elf32_Rela; + +typedef struct elf64_rela { + Elf64_Addr r_offset; + Elf64_Xword r_info; + Elf64_Sxword r_addend; +} Elf64_Rela; + +/* Macros to extract information from 'r_info' field of relocation entries */ +#define ELF32_R_SYM(i) ((i) >> 8) +#define ELF32_R_TYPE(i) ((unsigned char)(i)) +#define ELF64_R_SYM(i) ((i) >> 32) +#define ELF64_R_TYPE(i) ((i) & 0xffffffff) + +/* Symbol table entry */ +typedef struct { + Elf32_Word st_name; + Elf32_Addr st_value; + Elf32_Word st_size; + unsigned char st_info; + unsigned char st_other; + Elf32_Half st_shndx; +} Elf32_Sym; + +typedef struct elf64_sym { + Elf64_Word st_name; + unsigned char st_info; + unsigned char st_other; + Elf64_Half st_shndx; + Elf64_Addr st_value; + Elf64_Xword st_size; +} Elf64_Sym; + +/* ARM specific dynamic relocation codes */ +#define R_ARM_GLOB_DAT 21 /* 0x15 */ +#define R_ARM_JUMP_SLOT 22 /* 0x16 */ +#define R_ARM_RELATIVE 23 /* 0x17 */ +#define R_ARM_ABS32 2 /* 0x02 */ + +/* ELF decoding information */ +struct elf32_info { + Elf32_Ehdr ehdr; + int load_state; + Elf32_Phdr *phdrs; + Elf32_Shdr *shdrs; + void *shstrtab; +}; + +struct elf64_info { + Elf64_Ehdr ehdr; + int load_state; + Elf64_Phdr *phdrs; + Elf64_Shdr *shdrs; + void *shstrtab; +}; + +#define ELF_STATE_INIT 0x0L +#define ELF_STATE_WAIT_FOR_PHDRS 0x100L +#define ELF_STATE_WAIT_FOR_SHDRS 0x200L +#define ELF_STATE_WAIT_FOR_SHSTRTAB 0x400L +#define ELF_STATE_HDRS_COMPLETE 0x800L +#define ELF_STATE_MASK 0xFF00L +#define ELF_NEXT_SEGMENT_MASK 0x00FFL + +extern const struct loader_ops elf_ops; + +/** + * @internal + * + * @brief Check if it is an ELF file + * + * It will check if the input image header is an ELF header. + * + * @param img_data Firmware private data which will be passed to user + * defined loader operations + * @param len Firmware header length + * + * @return 0 for success or negative value for failure. + */ +int elf_identify(const void *img_data, size_t len); + +/** + * @internal + * + * @brief Load ELF headers + * + * It will get the ELF header, the program header, and the section header. + * + * @param img_data Image data + * @param offset Input image data offset to the start of image + * file + * @param len Input image data length + * @param img_info Pointer to store image information data + * @param last_load_state Last state return by this function + * @param noffset Pointer to next offset required by loading ELF + * header + * @param nlen Pointer to next data length required by loading + * ELF header + * + * @return ELF loading header state, or negative value for failure + */ +int elf_load_header(const void *img_data, size_t offset, size_t len, + void **img_info, int last_load_state, + size_t *noffset, size_t *nlen); + +/** + * @internal + * + * @brief Load ELF data + * + * It will parse the ELF image and return the target device address, + * offset to the start of the ELF image of the data to load and the + * length of the data to load. + * + * @param rproc Pointer to remoteproc instance + * @param img_data Image data which will passed to the function. + * it can be NULL, if image data doesn't need to + * be handled by the load function. E.g. binary + * data which was loaded to the target memory. + * @param offset Last loaded image data offset to the start of + * image file + * @param len Last loaded image data length + * @param img_info Pointer to store image information data + * @param last_load_state The returned state of the last function call. + * @param da Target device address, if the data to load is + * not for target memory the da will be set to + * ANY. + * @param noffset Pointer to next offset required by loading ELF + * header + * @param nlen Pointer to next data length required by loading + * ELF header + * @param padding Value to pad it is possible that a size of a + * segment in memory is larger than what it is in + * the ELF image. e.g. a segment can have stack + * section .bss. It doesn't need to copy image + * file space, in this case, it will be packed + * with 0. + * @param nmemsize Pointer to next data target memory size. The + * size of a segment in the target memory can be + * larger than the its size in the image file. + * + * @return 0 for success, otherwise negative value for failure + */ +int elf_load(struct remoteproc *rproc, const void *img_data, + size_t offset, size_t len, + void **img_info, int last_load_state, + metal_phys_addr_t *da, + size_t *noffset, size_t *nlen, + unsigned char *padding, size_t *nmemsize); + +/** + * @internal + * + * @brief Release ELF image information + * + * It will release ELF image information data. + * + * @param img_info Pointer to ELF image information + */ +void elf_release(void *img_info); + +/** + * @internal + * + * @brief Get entry point + * + * It will return entry point specified in the ELF file. + * + * @param img_info Pointer to ELF image information + * + * @return Entry address + */ +metal_phys_addr_t elf_get_entry(void *img_info); + +/** + * @internal + * + * @brief Locate the resource table information + * + * It will return the length of the resource table, and the device address of + * the resource table. + * + * @param img_info Pointer to ELF image information + * @param da Pointer to the device address + * @param offset Pointer to the offset to in the ELF image of the + * resource table section. + * @param size Pointer to the size of the resource table section. + * + * @return 0 if successfully locate the resource table, negative value for + * failure. + */ +int elf_locate_rsc_table(void *img_info, metal_phys_addr_t *da, + size_t *offset, size_t *size); + +#if defined __cplusplus +} +#endif + +#endif /* ELF_LOADER_H_ */ diff --git a/libraries/openamp_arduino/src/openamp/open_amp.h b/libraries/openamp_arduino/src/openamp/open_amp.h index 1b0eeac2d..f5d93ede5 100755 --- a/libraries/openamp_arduino/src/openamp/open_amp.h +++ b/libraries/openamp_arduino/src/openamp/open_amp.h @@ -1,17 +1,16 @@ -/* - * Copyright (c) 2014, Mentor Graphics Corporation - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef OPEN_AMP_H_ -#define OPEN_AMP_H_ - -#include "rpmsg.h" -#include "rpmsg_virtio.h" -#include "remoteproc.h" -#include "remoteproc_virtio.h" - - -#endif /* OPEN_AMP_H_ */ +/* + * Copyright (c) 2014, Mentor Graphics Corporation + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef OPEN_AMP_H_ +#define OPEN_AMP_H_ + +#include +#include +#include +#include + +#endif /* OPEN_AMP_H_ */ diff --git a/libraries/openamp_arduino/src/openamp/remoteproc.h b/libraries/openamp_arduino/src/openamp/remoteproc.h index 6b2495c37..23f917861 100755 --- a/libraries/openamp_arduino/src/openamp/remoteproc.h +++ b/libraries/openamp_arduino/src/openamp/remoteproc.h @@ -1,871 +1,858 @@ -/* - * Remoteproc Framework - * - * Copyright(c) 2018 Xilinx Ltd. - * Copyright(c) 2011 Texas Instruments, Inc. - * Copyright(c) 2011 Google, Inc. - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef REMOTEPROC_H -#define REMOTEPROC_H - -#include -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -#define RSC_NOTIFY_ID_ANY 0xFFFFFFFFUL - -/** - * struct resource_table - firmware resource table header - * @ver: version number - * @num: number of resource entries - * @reserved: reserved (must be zero) - * @offset: array of offsets pointing at the various resource entries - * - * A resource table is essentially a list of system resources required - * by the remote remote_proc. It may also include configuration entries. - * If needed, the remote remote_proc firmware should contain this table - * as a dedicated ".resource_table" ELF section. - * - * Some resources entries are mere announcements, where the host is informed - * of specific remoteproc configuration. Other entries require the host to - * do something (e.g. allocate a system resource). Sometimes a negotiation - * is expected, where the firmware requests a resource, and once allocated, - * the host should provide back its details (e.g. address of an allocated - * memory region). - * - * The header of the resource table, as expressed by this structure, - * contains a version number (should we need to change this format in the - * future), the number of available resource entries, and their offsets - * in the table. - * - * Immediately following this header are the resource entries themselves, - * each of which begins with a resource entry header (as described below). - */ -OPENAMP_PACKED_BEGIN -struct resource_table { - uint32_t ver; - uint32_t num; - uint32_t reserved[2]; - uint32_t offset[0]; -} OPENAMP_PACKED_END; - -/** - * struct fw_rsc_hdr - firmware resource entry header - * @type: resource type - * @data: resource data - * - * Every resource entry begins with a 'struct fw_rsc_hdr' header providing - * its @type. The content of the entry itself will immediately follow - * this header, and it should be parsed according to the resource type. - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_hdr { - uint32_t type; - uint8_t data[0]; -} OPENAMP_PACKED_END; - -/** - * enum fw_resource_type - types of resource entries - * - * @RSC_CARVEOUT: request for allocation of a physically contiguous - * memory region. - * @RSC_DEVMEM: request to iommu_map a memory-based peripheral. - * @RSC_TRACE: announces the availability of a trace buffer into which - * the remote remote_proc will be writing logs. - * @RSC_VDEV: declare support for a virtio device, and serve as its - * virtio header. - * @RSC_VENDOR_START: start of the vendor specific resource types range - * @RSC_VENDOR_END : end of the vendor specific resource types range - * @RSC_LAST: just keep this one at the end - * - * For more details regarding a specific resource type, please see its - * dedicated structure below. - * - * Please note that these values are used as indices to the rproc_handle_rsc - * lookup table, so please keep them sane. Moreover, @RSC_LAST is used to - * check the validity of an index before the lookup table is accessed, so - * please update it as needed. - */ -enum fw_resource_type { - RSC_CARVEOUT = 0, - RSC_DEVMEM = 1, - RSC_TRACE = 2, - RSC_VDEV = 3, - RSC_RPROC_MEM = 4, - RSC_FW_CHKSUM = 5, - RSC_LAST = 6, - RSC_VENDOR_START = 128, - RSC_VENDOR_END = 512, -}; - -#define FW_RSC_ADDR_ANY (0xFFFFFFFFFFFFFFFF) -#define FW_RSC_U32_ADDR_ANY (0xFFFFFFFF) - -/** - * struct fw_rsc_carveout - physically contiguous memory request - * @da: device address - * @pa: physical address - * @len: length (in bytes) - * @flags: iommu protection flags - * @reserved: reserved (must be zero) - * @name: human-readable name of the requested memory region - * - * This resource entry requests the host to allocate a physically contiguous - * memory region. - * - * These request entries should precede other firmware resource entries, - * as other entries might request placing other data objects inside - * these memory regions (e.g. data/code segments, trace resource entries, ...). - * - * Allocating memory this way helps utilizing the reserved physical memory - * (e.g. CMA) more efficiently, and also minimizes the number of TLB entries - * needed to map it (in case @rproc is using an IOMMU). Reducing the TLB - * pressure is important; it may have a substantial impact on performance. - * - * If the firmware is compiled with static addresses, then @da should specify - * the expected device address of this memory region. If @da is set to - * FW_RSC_ADDR_ANY, then the host will dynamically allocate it, and then - * overwrite @da with the dynamically allocated address. - * - * We will always use @da to negotiate the device addresses, even if it - * isn't using an iommu. In that case, though, it will obviously contain - * physical addresses. - * - * Some remote remote_procs needs to know the allocated physical address - * even if they do use an iommu. This is needed, e.g., if they control - * hardware accelerators which access the physical memory directly (this - * is the case with OMAP4 for instance). In that case, the host will - * overwrite @pa with the dynamically allocated physical address. - * Generally we don't want to expose physical addresses if we don't have to - * (remote remote_procs are generally _not_ trusted), so we might want to - * change this to happen _only_ when explicitly required by the hardware. - * - * @flags is used to provide IOMMU protection flags, and @name should - * (optionally) contain a human readable name of this carveout region - * (mainly for debugging purposes). - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_carveout { - uint32_t type; - uint32_t da; - uint32_t pa; - uint32_t len; - uint32_t flags; - uint32_t reserved; - uint8_t name[32]; -} OPENAMP_PACKED_END; - -/** - * struct fw_rsc_devmem - iommu mapping request - * @da: device address - * @pa: physical address - * @len: length (in bytes) - * @flags: iommu protection flags - * @reserved: reserved (must be zero) - * @name: human-readable name of the requested region to be mapped - * - * This resource entry requests the host to iommu map a physically contiguous - * memory region. This is needed in case the remote remote_proc requires - * access to certain memory-based peripherals; _never_ use it to access - * regular memory. - * - * This is obviously only needed if the remote remote_proc is accessing memory - * via an iommu. - * - * @da should specify the required device address, @pa should specify - * the physical address we want to map, @len should specify the size of - * the mapping and @flags is the IOMMU protection flags. As always, @name may - * (optionally) contain a human readable name of this mapping (mainly for - * debugging purposes). - * - * Note: at this point we just "trust" those devmem entries to contain valid - * physical addresses, but this isn't safe and will be changed: eventually we - * want remoteproc implementations to provide us ranges of physical addresses - * the firmware is allowed to request, and not allow firmwares to request - * access to physical addresses that are outside those ranges. - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_devmem { - uint32_t type; - uint32_t da; - uint32_t pa; - uint32_t len; - uint32_t flags; - uint32_t reserved; - uint8_t name[32]; -} OPENAMP_PACKED_END; - -/** - * struct fw_rsc_trace - trace buffer declaration - * @da: device address - * @len: length (in bytes) - * @reserved: reserved (must be zero) - * @name: human-readable name of the trace buffer - * - * This resource entry provides the host information about a trace buffer - * into which the remote remote_proc will write log messages. - * - * @da specifies the device address of the buffer, @len specifies - * its size, and @name may contain a human readable name of the trace buffer. - * - * After booting the remote remote_proc, the trace buffers are exposed to the - * user via debugfs entries (called trace0, trace1, etc..). - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_trace { - uint32_t type; - uint32_t da; - uint32_t len; - uint32_t reserved; - uint8_t name[32]; -} OPENAMP_PACKED_END; - -/** - * struct fw_rsc_vdev_vring - vring descriptor entry - * @da: device address - * @align: the alignment between the consumer and producer parts of the vring - * @num: num of buffers supported by this vring (must be power of two) - * @notifyid is a unique rproc-wide notify index for this vring. This notify - * index is used when kicking a remote remote_proc, to let it know that this - * vring is triggered. - * @reserved: reserved (must be zero) - * - * This descriptor is not a resource entry by itself; it is part of the - * vdev resource type (see below). - * - * Note that @da should either contain the device address where - * the remote remote_proc is expecting the vring, or indicate that - * dynamically allocation of the vring's device address is supported. - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_vdev_vring { - uint32_t da; - uint32_t align; - uint32_t num; - uint32_t notifyid; - uint32_t reserved; -} OPENAMP_PACKED_END; - -/** - * struct fw_rsc_vdev - virtio device header - * @id: virtio device id (as in virtio_ids.h) - * @notifyid is a unique rproc-wide notify index for this vdev. This notify - * index is used when kicking a remote remote_proc, to let it know that the - * status/features of this vdev have changes. - * @dfeatures specifies the virtio device features supported by the firmware - * @gfeatures is a place holder used by the host to write back the - * negotiated features that are supported by both sides. - * @config_len is the size of the virtio config space of this vdev. The config - * space lies in the resource table immediate after this vdev header. - * @status is a place holder where the host will indicate its virtio progress. - * @num_of_vrings indicates how many vrings are described in this vdev header - * @reserved: reserved (must be zero) - * @vring is an array of @num_of_vrings entries of 'struct fw_rsc_vdev_vring'. - * - * This resource is a virtio device header: it provides information about - * the vdev, and is then used by the host and its peer remote remote_procs - * to negotiate and share certain virtio properties. - * - * By providing this resource entry, the firmware essentially asks remoteproc - * to statically allocate a vdev upon registration of the rproc (dynamic vdev - * allocation is not yet supported). - * - * Note: unlike virtualization systems, the term 'host' here means - * the Linux side which is running remoteproc to control the remote - * remote_procs. We use the name 'gfeatures' to comply with virtio's terms, - * though there isn't really any virtualized guest OS here: it's the host - * which is responsible for negotiating the final features. - * Yeah, it's a bit confusing. - * - * Note: immediately following this structure is the virtio config space for - * this vdev (which is specific to the vdev; for more info, read the virtio - * spec). the size of the config space is specified by @config_len. - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_vdev { - uint32_t type; - uint32_t id; - uint32_t notifyid; - uint32_t dfeatures; - uint32_t gfeatures; - uint32_t config_len; - uint8_t status; - uint8_t num_of_vrings; - uint8_t reserved[2]; - struct fw_rsc_vdev_vring vring[0]; -} OPENAMP_PACKED_END; - -/** - * struct fw_rsc_vendor - remote processor vendor specific resource - * @len: length of the resource - * - * This resource entry tells the host the vendor specific resource - * required by the remote. - * - * These request entries should precede other shared resource entries - * such as vdevs, vrings. - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_vendor { - uint32_t type; - uint32_t len; -} OPENAMP_PACKED_END; - -/** - * struct fw_rsc_rproc_mem - remote processor memory - * @da: device address - * @pa: physical address - * @len: length (in bytes) - * @reserved: reserved (must be zero) - * - * This resource entry tells the host to the remote processor - * memory that the host can be used as shared memory. - * - * These request entries should precede other shared resource entries - * such as vdevs, vrings. - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_rproc_mem { - uint32_t type; - uint32_t da; - uint32_t pa; - uint32_t len; - uint32_t reserved; -} OPENAMP_PACKED_END; - -/* - * struct fw_rsc_fw_chksum - firmware checksum - * @algo: algorithm to generate the cheksum - * @chksum: checksum of the firmware loadable sections. - * - * This resource entry provides checksum for the firmware loadable sections. - * It is used to check if the remote already runs with the expected firmware to - * decide if it needs to start the remote if the remote is already running. - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_fw_chksum { - uint32_t type; - uint8_t algo[16]; - uint8_t chksum[64]; -} OPENAMP_PACKED_END; - -struct loader_ops; -struct image_store_ops; -struct remoteproc_ops; - -/** - * struct remoteproc_mem - * - * This structure presents the memory used by the remote processor - * - * @da: device memory - * @pa: physical memory - * @size: size of the memory - * @io: pointer to the I/O region - * @node: list node - */ -struct remoteproc_mem { - metal_phys_addr_t da; - metal_phys_addr_t pa; - size_t size; - char name[32]; - struct metal_io_region *io; - struct metal_list node; -}; - -/** - * struct remoteproc - * - * This structure is maintained by the remoteproc to represent the remote - * processor instance. This structure acts as a prime parameter to use - * the remoteproc APIs. - * - * @bootadd: boot address - * @loader: executable loader - * @lock: mutext lock - * @ops: remoteproc operations - * @rsc_table: pointer to resource table - * @rsc_len: length of resource table - * @rsc_io: metal I/O region of resource table - * @mems: remoteproc memories - * @vdevs: remoteproc virtio devices - * @bitmap: bitmap for notify IDs for remoteproc subdevices - * @state: remote processor state - * @priv: private data - */ -struct remoteproc { - metal_mutex_t lock; - void *rsc_table; - size_t rsc_len; - struct metal_io_region *rsc_io; - struct metal_list mems; - struct metal_list vdevs; - unsigned long bitmap; - struct remoteproc_ops *ops; - metal_phys_addr_t bootaddr; - struct loader_ops *loader; - unsigned int state; - void *priv; -}; - -/** - * struct remoteproc_ops - * - * remoteproc operations needs to be implemented by each remoteproc driver - * - * @init: initialize the remoteproc instance - * @remove: remove the remoteproc instance - * @mmap: memory mapped the mempory with physical address or destination - * address as input. - * @handle_rsc: handle the vendor specific resource - * @config: configure the remoteproc to make it ready to load and run - * executable - * @start: kick the remoteproc to run application - * @stop: stop the remoteproc from running application, the resource such as - * memory may not be off. - * @shutdown: shutdown the remoteproc and release its resources. - * @notify: notify the remote - */ -struct remoteproc_ops { - struct remoteproc *(*init)(struct remoteproc *rproc, - struct remoteproc_ops *ops, void *arg); - void (*remove)(struct remoteproc *rproc); - void *(*mmap)(struct remoteproc *rproc, - metal_phys_addr_t *pa, metal_phys_addr_t *da, - size_t size, unsigned int attribute, - struct metal_io_region **io); - int (*handle_rsc)(struct remoteproc *rproc, void *rsc, size_t len); - int (*config)(struct remoteproc *rproc, void *data); - int (*start)(struct remoteproc *rproc); - int (*stop)(struct remoteproc *rproc); - int (*shutdown)(struct remoteproc *rproc); - int (*notify)(struct remoteproc *rproc, uint32_t id); -}; - -/* Remoteproc error codes */ -#define RPROC_EBASE 0 -#define RPROC_ENOMEM (RPROC_EBASE + 1) -#define RPROC_EINVAL (RPROC_EBASE + 2) -#define RPROC_ENODEV (RPROC_EBASE + 3) -#define RPROC_EAGAIN (RPROC_EBASE + 4) -#define RPROC_ERR_RSC_TAB_TRUNC (RPROC_EBASE + 5) -#define RPROC_ERR_RSC_TAB_VER (RPROC_EBASE + 6) -#define RPROC_ERR_RSC_TAB_RSVD (RPROC_EBASE + 7) -#define RPROC_ERR_RSC_TAB_VDEV_NRINGS (RPROC_EBASE + 9) -#define RPROC_ERR_RSC_TAB_NP (RPROC_EBASE + 10) -#define RPROC_ERR_RSC_TAB_NS (RPROC_EBASE + 11) -#define RPROC_ERR_LOADER_STATE (RPROC_EBASE + 12) -#define RPROC_EMAX (RPROC_EBASE + 16) -#define RPROC_EPTR (void *)(-1) -#define RPROC_EOF (void *)(-1) - -static inline long RPROC_PTR_ERR(const void *ptr) -{ - return (long)ptr; -} - -static inline int RPROC_IS_ERR(const void *ptr) -{ - if ((unsigned long)ptr >= (unsigned long)(-RPROC_EMAX)) - return 1; - else - return 0; -} - -static inline void *RPROC_ERR_PTR(long error) -{ - return (void *)error; -} - -/** - * enum rproc_state - remote processor states - * @RPROC_OFFLINE: remote is offline - * @RPROC_READY: remote is ready to start - * @RPROC_RUNNING: remote is up and running - * @RPROC_SUSPENDED: remote is suspended - * @RPROC_ERROR: remote has error; need to recover - * @RPROC_STOPPED: remote is stopped - * @RPROC_LAST: just keep this one at the end - */ -enum remoteproc_state { - RPROC_OFFLINE = 0, - RPROC_CONFIGURED = 1, - RPROC_READY = 2, - RPROC_RUNNING = 3, - RPROC_SUSPENDED = 4, - RPROC_ERROR = 5, - RPROC_STOPPED = 6, - RPROC_LAST = 7, -}; - -/** - * remoteproc_init - * - * Initializes remoteproc resource. - * - * @rproc - pointer to remoteproc instance - * @ops - pointer to remoteproc operations - * @priv - pointer to private data - * - * @returns created remoteproc pointer - */ -struct remoteproc *remoteproc_init(struct remoteproc *rproc, - struct remoteproc_ops *ops, void *priv); - -/** - * remoteproc_remove - * - * Remove remoteproc resource - * - * @rproc - pointer to remoteproc instance - * - * returns 0 for success, negative value for failure - */ -int remoteproc_remove(struct remoteproc *rproc); - -/** - * remoteproc_init_mem - * - * Initialize remoteproc memory - * - * @mem - pointer to remoteproc memory - * @char - memory name - * @pa - physcial address - * @da - device address - * @size - memory size - * @io - pointer to the I/O region - */ -static inline void -remoteproc_init_mem(struct remoteproc_mem *mem, const char *name, - metal_phys_addr_t pa, metal_phys_addr_t da, - size_t size, struct metal_io_region *io) -{ - if (!mem) - return; - if (name) - strncpy(mem->name, name, sizeof(mem->name)); - else - mem->name[0] = 0; - mem->pa = pa; - mem->da = da; - mem->io = io; - mem->size = size; -} - -/** - * remoteproc_add_mem - * - * Add remoteproc memory - * - * @rproc - pointer to remoteproc - * @mem - pointer to remoteproc memory - */ -static inline void -remoteproc_add_mem(struct remoteproc *rproc, struct remoteproc_mem *mem) -{ - if (!rproc || !mem) - return; - metal_list_add_tail(&rproc->mems, &mem->node); -} - -/** - * remoteproc_get_io_with_name - * - * get remoteproc memory I/O region with name - * - * @rproc - pointer to the remote processor - * @name - name of the shared memory - * @io - pointer to the pointer of the I/O region - * - * returns metal I/O region pointer, NULL for failure - */ -struct metal_io_region * -remoteproc_get_io_with_name(struct remoteproc *rproc, - const char *name); - -/** - * remoteproc_get_io_with_pa - * - * get remoteproc memory I/O region with physical address - * - * @rproc - pointer to the remote processor - * @pa - physical address - * - * returns metal I/O region pointer, NULL for failure - */ -struct metal_io_region * -remoteproc_get_io_with_pa(struct remoteproc *rproc, - metal_phys_addr_t pa); - -/** - * remoteproc_get_io_with_da - * - * get remoteproc memory I/O region with device address - * - * @rproc - pointer to the remote processor - * @da - device address - * @offset - I/O region offset of the device address - * - * returns metal I/O region pointer, NULL for failure - */ -struct metal_io_region * -remoteproc_get_io_with_da(struct remoteproc *rproc, - metal_phys_addr_t da, - unsigned long *offset); - -/** - * remoteproc_get_io_with_va - * - * get remoteproc memory I/O region with virtual address - * - * @rproc - pointer to the remote processor - * @va - virtual address - * - * returns metal I/O region pointer, NULL for failure - */ -struct metal_io_region * -remoteproc_get_io_with_va(struct remoteproc *rproc, - void *va); - -/** - * remoteproc_mmap - * - * remoteproc mmap memory - * - * @rproc - pointer to the remote processor - * @pa - physical address pointer - * @da - device address pointer - * @size - size of the memory - * @attribute - memory attribute - * @io - pointer to the I/O region - * - * returns pointer to the memory - */ -void *remoteproc_mmap(struct remoteproc *rproc, - metal_phys_addr_t *pa, metal_phys_addr_t *da, - size_t size, unsigned int attribute, - struct metal_io_region **io); - -/** - * remoteproc_parse_rsc_table - * - * Parse resource table of remoteproc - * - * @rproc - pointer to remoteproc instance - * @rsc_table - pointer to resource table - * @rsc_size - resource table size - * - * returns 0 for success and negative value for errors - */ -int remoteproc_parse_rsc_table(struct remoteproc *rproc, - struct resource_table *rsc_table, - size_t rsc_size); - -/** - * remoteproc_set_rsc_table - * - * Parse and set resource table of remoteproc - * - * @rproc - pointer to remoteproc instance - * @rsc_table - pointer to resource table - * @rsc_size - resource table size - * - * returns 0 for success and negative value for errors - */ -int remoteproc_set_rsc_table(struct remoteproc *rproc, - struct resource_table *rsc_table, - size_t rsc_size); - -/** - * remoteproc_config - * - * This function configures the remote processor to get it - * ready to load and run executable. - * - * @rproc - pointer to remoteproc instance to start - * @data - configuration data - * - * returns 0 for success and negative value for errors - */ -int remoteproc_config(struct remoteproc *rproc, void *data); - -/** - * remoteproc_start - * - * This function starts the remote processor. - * It assumes the firmware is already loaded, - * - * @rproc - pointer to remoteproc instance to start - * - * returns 0 for success and negative value for errors - */ -int remoteproc_start(struct remoteproc *rproc); - -/** - * remoteproc_stop - * - * This function stops the remote processor but it - * will not release its resource. - * - * @rproc - pointer to remoteproc instance - * - * returns 0 for success and negative value for errors - */ -int remoteproc_stop(struct remoteproc *rproc); - -/** - * remoteproc_shutdown - * - * This function shutdown the remote processor and - * release its resources. - * - * @rproc - pointer to remoteproc instance - * - * returns 0 for success and negative value for errors - */ -int remoteproc_shutdown(struct remoteproc *rproc); - -/** - * remoteproc_load - * - * load executable, it expects the user application defines how to - * open the executable file and how to get data from the executable file - * and how to load data to the target memory. - * - * @rproc: pointer to the remoteproc instance - * @path: optional path to the image file - * @store: pointer to user defined image store argument - * @store_ops: pointer to image store operations - * @image_info: pointer to memory which stores image information used - * by remoteproc loader - * - * return 0 for success and negative value for failure - */ -int remoteproc_load(struct remoteproc *rproc, const char *path, - void *store, struct image_store_ops *store_ops, - void **img_info); - -/** - * remoteproc_load_noblock - * - * load executable, it expects the caller has loaded image data to local - * memory and passed to the this function. If the function needs more - * image data it will return the next expected image data offset and - * the next expected image data length. If the function requires the - * caller to download image data to the target memory, it will also - * return the target physical address besides the offset and length. - * This function can be used to load firmware in stream mode. In this - * mode, you cannot do seek to the executable file. If the executable - * is ELF, it cannot get the resource table section before it loads - * the full ELF file. Furthermore, application usually don't store - * the data which is loaded to local memory in streaming mode, and - * thus, in this mode, it will load the binrary to the target memory - * before it gets the resource table. And thus, when calling this funciton - * don't put the target exectuable memory in the resource table, as - * this function will parse the resource table after it loads the binary - * to target memory. - * - * @rproc: pointer to the remoteproc instance - * @img_data: pointer to image data for remoteproc loader to parse - * @offset: image data offset to the beginning of the image file - * @len: image data length - * @image_info: pointer to memory which stores image information used - * by remoteproc loader - * @pa: pointer to the target memory physical address. If the next expected - * data doesn't need to load to the target memory, the function will - * set it to ANY. - * @io: pointer to the target memory physical address. If the next expected - * data doesn't need to load to the target memory, the function will - * set it to ANY. - * @noffset: pointer to the next image data offset to the beginning of - * the image file needs to load to local or to the target - * memory. - * @nlen: pointer to the next image data length needs to load to local - * or to the target memory. - * @nmlen: pointer to the memory size. It is only used when the next - * expected data is going to be loaded to the target memory. E.g. - * in ELF, it is possible that loadable segment in memory is - * larger that the segment data in the ELF file. In this case, - * application will need to pad the rest of the memory with - * padding. - * @padding: pointer to the padding value. It is only used when the next - * expected data is going to be loaded to the target memory. - * and the target memory size is larger than the segment data in - * the executable file. - * - * return 0 for success and negative value for failure - */ -int remoteproc_load_noblock(struct remoteproc *rproc, - const void *img_data, size_t offset, size_t len, - void **img_info, - metal_phys_addr_t *pa, struct metal_io_region **io, - size_t *noffset, size_t *nlen, - size_t *nmlen, unsigned char *padding); - -/** - * remoteproc_allocate_id - * - * allocate notifyid for resource - * - * @rproc - pointer to the remoteproc instance - * @start - start of the id range - * @end - end of the id range - * - * return allocated notify id - */ -unsigned int remoteproc_allocate_id(struct remoteproc *rproc, - unsigned int start, - unsigned int end); - -/* remoteproc_create_virtio - * - * create virtio device, it returns pointer to the created virtio device. - * - * @rproc: pointer to the remoteproc instance - * @vdev_id: virtio device ID - * @role: virtio device role - * @rst_cb: virtio device reset callback - * - * return pointer to the created virtio device, NULL for failure. - */ -struct virtio_device * -remoteproc_create_virtio(struct remoteproc *rproc, - int vdev_id, unsigned int role, - void (*rst_cb)(struct virtio_device *vdev)); - -/* remoteproc_remove_virtio - * - * Remove virtio device - * - * @rproc: pointer to the remoteproc instance - * @vdev: pointer to the virtio device - * - */ -void remoteproc_remove_virtio(struct remoteproc *rproc, - struct virtio_device *vdev); - -/* remoteproc_get_notification - * - * remoteproc is got notified, it will check its subdevices - * for the notification - * - * @rproc - pointer to the remoteproc instance - * @notifyid - notificatin id - * - * return 0 for succeed, negative value for failure - */ -int remoteproc_get_notification(struct remoteproc *rproc, - uint32_t notifyid); -#if defined __cplusplus -} -#endif - -#endif /* REMOTEPROC_H_ */ +/* + * Remoteproc Framework + * + * Copyright(c) 2018 Xilinx Ltd. + * Copyright(c) 2011 Texas Instruments, Inc. + * Copyright(c) 2011 Google, Inc. + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef REMOTEPROC_H +#define REMOTEPROC_H + +#include +#include +#include + +#if defined __cplusplus +extern "C" { +#endif + +#define RSC_NOTIFY_ID_ANY 0xFFFFFFFFU + +#define RPROC_MAX_NAME_LEN 32 + +/** + * @brief Resource table header + * + * A resource table is essentially a list of system resources required + * by the remote remoteproc. It may also include configuration entries. + * If needed, the remote remoteproc firmware should contain this table + * as a dedicated ".resource_table" ELF section. + * + * Some resource entries are mere announcements, where the host is informed + * of specific remoteproc configurations. Other entries require the host to + * do something (e.g. allocate a system resource). Sometimes a negotiation + * is expected, where the firmware requests a resource, and once allocated, + * the host should provide back its details (e.g. address of an allocated + * memory region). + * + * The header of the resource table, as expressed by this structure, + * contains a version number (should we need to change this format in the + * future), the number of available resource entries, and their offsets + * in the table. + * + * Immediately following this header are the resource entries themselves, + * each of which begins with a resource entry header. + */ +METAL_PACKED_BEGIN +struct resource_table { + /** Version number */ + uint32_t ver; + + /** Number of resource entries */ + uint32_t num; + + /** Reserved (must be zero) */ + uint32_t reserved[2]; + + /** Array of offsets pointing at the various resource entries */ + uint32_t offset[0]; +} METAL_PACKED_END; + +/** + * @brief Resource table entry header + * + * Every resource entry begins with this firmware resource header providing + * its \ref type. The content of the entry itself will immediately follow + * this header, and it should be parsed according to the resource type. + */ +METAL_PACKED_BEGIN +struct fw_rsc_hdr { + /** Resource type matching the type field of the structure in \ref data */ + uint32_t type; + + /** Resource data */ + uint8_t data[0]; +} METAL_PACKED_END; + +/** + * enum fw_resource_type - types of resource entries + * + * @RSC_CARVEOUT: request for allocation of a physically contiguous + * memory region. + * @RSC_DEVMEM: request to iommu_map a memory-based peripheral. + * @RSC_TRACE: announces the availability of a trace buffer into which + * the remote remoteproc will be writing logs. + * @RSC_VDEV: declare support for a virtio device, and serve as its + * virtio header. + * @RSC_VENDOR_START: start of the vendor specific resource types range + * @RSC_VENDOR_END : end of the vendor specific resource types range + * @RSC_LAST: just keep this one at the end + * + * For more details regarding a specific resource type, please see its + * dedicated structure below. + * + * Please note that these values are used as indices to the rproc_handle_rsc + * lookup table, so please keep them sane. Moreover, @RSC_LAST is used to + * check the validity of an index before the lookup table is accessed, so + * please update it as needed. + */ +enum fw_resource_type { + RSC_CARVEOUT = 0, + RSC_DEVMEM = 1, + RSC_TRACE = 2, + RSC_VDEV = 3, + RSC_LAST = 4, + RSC_VENDOR_START = 128, + RSC_VENDOR_END = 512, +}; + +#define FW_RSC_U64_ADDR_ANY 0xFFFFFFFFFFFFFFFFUL +#define FW_RSC_U32_ADDR_ANY 0xFFFFFFFFUL + +/** + * @brief Resource table physically contiguous memory request entry + * + * This resource entry requests the host to allocate a physically contiguous + * memory region. + * + * These request entries should precede other firmware resource entries, + * as other entries might request placing other data objects inside + * these memory regions (e.g. data/code segments, trace resource entries, ...). + * + * Allocating memory this way helps utilizing the reserved physical memory + * (e.g. CMA) more efficiently, and also minimizes the number of TLB entries + * needed to map it (in case rproc is using an IOMMU). Reducing the TLB + * pressure is important; it may have a substantial impact on performance. + * + * If the firmware is compiled with static addresses, then \ref da should specify + * the expected device address of this memory region. If \ref da is set to + * FW_RSC_ADDR_ANY, then the host will dynamically allocate it, and then + * overwrite \ref da with the dynamically allocated address. + * + * We will always use \ref da to negotiate the device addresses, even if it + * isn't using an IOMMU. In that case, though, it will obviously contain + * physical addresses. + * + * Some remote remoteprocs need to know the allocated physical address + * even if they do use an IOMMU. This is needed, e.g., if they control + * hardware accelerators which access the physical memory directly (this + * is the case with OMAP4 for instance). In that case, the host will + * overwrite \ref pa with the dynamically allocated physical address. + * Generally we don't want to expose physical addresses if we don't have to + * (remote remoteprocs are generally _not_ trusted), so we might want to + * change this to happen _only_ when explicitly required by the hardware. + */ +METAL_PACKED_BEGIN +struct fw_rsc_carveout { + /** Resource carveout has type 0 */ + uint32_t type; + + /** Device address */ + uint32_t da; + + /** Physical address */ + uint32_t pa; + + /** Length in bytes */ + uint32_t len; + + /** IOMMU protection flags */ + uint32_t flags; + + /** Reserved (must be zero) */ + uint32_t reserved; + + /** Optional human-readable name of the requested memory region used for debugging */ + uint8_t name[RPROC_MAX_NAME_LEN]; +} METAL_PACKED_END; + +/** + * @brief Resource table IOMMU mapping request entry + * + * This resource entry requests the host to IOMMU map a physically contiguous + * memory region. This is needed in case the remote remoteproc requires + * access to certain memory-based peripherals; _never_ use it to access + * regular memory. + * + * This is obviously only needed if the remote remoteproc is accessing memory + * via an IOMMU. + * + * Note: at this point we just "trust" those devmem entries to contain valid + * physical addresses, but this isn't safe and will be changed: eventually we + * want remoteproc implementations to provide us ranges of physical addresses + * the firmware is allowed to request, and not allow firmwares to request + * access to physical addresses that are outside those ranges. + */ +METAL_PACKED_BEGIN +struct fw_rsc_devmem { + /** IOMMU mapping request has type 1 */ + uint32_t type; + + /** Device address */ + uint32_t da; + + /** Physical address to map */ + uint32_t pa; + + /** Length of the mapping in bytes */ + uint32_t len; + + /** IOMMU protection flags */ + uint32_t flags; + + /** Reserved (must be zero) */ + uint32_t reserved; + + /** Optional human-readable name of the requested memory region used for debugging */ + uint8_t name[RPROC_MAX_NAME_LEN]; +} METAL_PACKED_END; + +/** + * @brief Resource table trace buffer declaration entry + * + * This resource entry provides the host information about a trace buffer + * into which the remote remoteproc will write log messages. + * + * After booting the remote remoteproc, the trace buffers are exposed to the + * user via debugfs entries (called trace0, trace1, etc..). + */ +METAL_PACKED_BEGIN +struct fw_rsc_trace { + /** Trace buffer entry has type 2 */ + uint32_t type; + + /** Device address of the buffer */ + uint32_t da; + + /** Length of the buffer in bytes */ + uint32_t len; + + /** Reserved (must be zero) */ + uint32_t reserved; + + /** Optional human-readable name of the requested memory region used for debugging */ + uint8_t name[RPROC_MAX_NAME_LEN]; +} METAL_PACKED_END; + +/** + * @brief Resource table vring descriptor entry + * + * This descriptor is not a resource entry by itself; it is part of the + * \ref fw_rsc_vdev resource type. + */ +METAL_PACKED_BEGIN +struct fw_rsc_vdev_vring { + /** + * The device address where the remoteproc is expecting the vring, or + * FW_RSC_U32_ADDR_ANY/FW_RSC_U64_ADDR_ANY to indicate that dynamic + * allocation of the vring's device address is supported + */ + uint32_t da; + + /** The alignment between the consumer and producer parts of the vring */ + uint32_t align; + + /** Number of buffers supported by this vring (must be power of two) */ + uint32_t num; + + /** + * A unique rproc-wide notify index for this vring. This notify index is + * used when kicking a remote remoteproc, to let it know that this vring + * is triggered + */ + uint32_t notifyid; + + /** Reserved (must be zero) */ + uint32_t reserved; +} METAL_PACKED_END; + +/** + * @brief Resource table virtio device entry + * + * This resource is a virtio device header: it provides information about + * the vdev, and is then used by the host and its peer remote remoteprocs + * to negotiate and share certain virtio properties. + * + * By providing this resource entry, the firmware essentially asks remoteproc + * to statically allocate a vdev upon registration of the rproc (dynamic vdev + * allocation is not yet supported). + * + * Note: unlike virtualization systems, the term 'host' here means + * the Linux side which is running remoteproc to control the remote + * remoteprocs. We use the name 'gfeatures' to comply with virtio's terms, + * though there isn't really any virtualized guest OS here: it's the host + * which is responsible for negotiating the final features. + * + * Note: immediately following this structure is the virtio config space for + * this vdev (which is specific to the vdev; for more info, read the virtio + * spec). + */ +METAL_PACKED_BEGIN +struct fw_rsc_vdev { + /** Virtio device header has type 3 */ + uint32_t type; + + /** Virtio device id (as in virtio_ids.h) */ + uint32_t id; + + /** + * A unique rproc-wide notify index for this vdev. This notify index is + * used when kicking a remote remoteproc, to let it know that the + * status/features of this vdev have changes. + */ + uint32_t notifyid; + + /** The virtio device features supported by the firmware */ + uint32_t dfeatures; + + /** + * A place holder used by the host to write back the negotiated features + * that are supported by both sides + */ + uint32_t gfeatures; + + /** + * The size of the virtio config space of this vdev. The config space lies + * in the resource table immediate after this vdev header + */ + uint32_t config_len; + + /** A place holder where the host will indicate its virtio progress */ + uint8_t status; + + /** Number of vrings described in this vdev header */ + uint8_t num_of_vrings; + + /** Reserved (must be zero) */ + uint8_t reserved[2]; + + /** An array of \ref num_of_vrings entries of \ref fw_rsc_vdev_vring */ + struct fw_rsc_vdev_vring vring[0]; +} METAL_PACKED_END; + +/** + * @brief Resource table remote processor vendor specific entry + * + * This resource entry tells the host the vendor specific resource + * required by the remote. + * + * These request entries should precede other shared resource entries + * such as vdevs, vrings. + */ +METAL_PACKED_BEGIN +struct fw_rsc_vendor { + /** Vendor specific resource type can be values 128-512 */ + uint32_t type; + + /** Length of the resource */ + uint32_t len; +} METAL_PACKED_END; + +struct loader_ops; +struct image_store_ops; +struct remoteproc_ops; + +/** @brief Memory used by the remote processor */ +struct remoteproc_mem { + /** Device memory */ + metal_phys_addr_t da; + + /** Physical memory */ + metal_phys_addr_t pa; + + /** Size of the memory */ + size_t size; + + /** Optional human-readable name of the memory region */ + char name[RPROC_MAX_NAME_LEN]; + + /** Pointer to the I/O region */ + struct metal_io_region *io; + + /** List node */ + struct metal_list node; +}; + +/** + * @brief A remote processor instance + * + * This structure is maintained by the remoteproc to represent the remote + * processor instance. This structure acts as a prime parameter to use + * the remoteproc APIs. + */ +struct remoteproc { + /** Mutex lock */ + metal_mutex_t lock; + + /** Pointer to the resource table */ + void *rsc_table; + + /** Length of the resource table */ + size_t rsc_len; + + /** Metal I/O region of the resource table */ + struct metal_io_region *rsc_io; + + /** Remoteproc memories */ + struct metal_list mems; + + /** Remoteproc virtio devices */ + struct metal_list vdevs; + + /** Bitmap for notify IDs for remoteproc subdevices */ + unsigned long bitmap; + + /** Remoteproc operations */ + const struct remoteproc_ops *ops; + + /** Boot address */ + metal_phys_addr_t bootaddr; + + /** Executable loader */ + const struct loader_ops *loader; + + /** Remote processor state */ + unsigned int state; + + /** Private data */ + void *priv; +}; + +/** + * @brief Remoteproc operations to manage a remoteproc instance + * + * Remoteproc operations need to be implemented by each remoteproc driver + */ +struct remoteproc_ops { + /** Initialize the remoteproc instance */ + struct remoteproc *(*init)(struct remoteproc *rproc, + const struct remoteproc_ops *ops, void *arg); + + /** Remove the remoteproc instance */ + void (*remove)(struct remoteproc *rproc); + + /** Memory map the memory with physical address or destination address as input */ + void *(*mmap)(struct remoteproc *rproc, + metal_phys_addr_t *pa, metal_phys_addr_t *da, + size_t size, unsigned int attribute, + struct metal_io_region **io); + + /** Handle the vendor specific resource */ + int (*handle_rsc)(struct remoteproc *rproc, void *rsc, size_t len); + + /** Configure the remoteproc to make it ready to load and run the executable */ + int (*config)(struct remoteproc *rproc, void *data); + + /** Kick the remoteproc to run the application */ + int (*start)(struct remoteproc *rproc); + + /** + * Stop the remoteproc from running the application, the resource such as + * memory may not be off + */ + int (*stop)(struct remoteproc *rproc); + + /** Shutdown the remoteproc and release its resources */ + int (*shutdown)(struct remoteproc *rproc); + + /** Notify the remote */ + int (*notify)(struct remoteproc *rproc, uint32_t id); + + /** + * @brief Get remoteproc memory I/O region by either name, virtual + * address, physical address or device address. + * + * @param rproc Pointer to remoteproc instance + * @param name Memory name + * @param pa Physical address + * @param da Device address + * @param va Virtual address + * @param size Memory size + * @param buf Pointer to remoteproc_mem struct object to store result + * + * @return remoteproc memory pointed by buf if success, otherwise NULL + */ + struct remoteproc_mem *(*get_mem)(struct remoteproc *rproc, + const char *name, + metal_phys_addr_t pa, + metal_phys_addr_t da, + void *va, size_t size, + struct remoteproc_mem *buf); +}; + +/* Remoteproc error codes */ +#define RPROC_EBASE 0 +#define RPROC_ENOMEM (RPROC_EBASE + 1) +#define RPROC_EINVAL (RPROC_EBASE + 2) +#define RPROC_ENODEV (RPROC_EBASE + 3) +#define RPROC_EAGAIN (RPROC_EBASE + 4) +#define RPROC_ERR_RSC_TAB_TRUNC (RPROC_EBASE + 5) +#define RPROC_ERR_RSC_TAB_VER (RPROC_EBASE + 6) +#define RPROC_ERR_RSC_TAB_RSVD (RPROC_EBASE + 7) +#define RPROC_ERR_RSC_TAB_VDEV_NRINGS (RPROC_EBASE + 9) +#define RPROC_ERR_RSC_TAB_NP (RPROC_EBASE + 10) +#define RPROC_ERR_RSC_TAB_NS (RPROC_EBASE + 11) +#define RPROC_ERR_LOADER_STATE (RPROC_EBASE + 12) +#define RPROC_EMAX (RPROC_EBASE + 16) +#define RPROC_EPTR (void *)(-1) +#define RPROC_EOF (void *)(-1) + +static inline long RPROC_PTR_ERR(const void *ptr) +{ + return (long)ptr; +} + +static inline int RPROC_IS_ERR(const void *ptr) +{ + if ((unsigned long)ptr >= (unsigned long)(-RPROC_EMAX)) + return 1; + else + return 0; +} + +static inline void *RPROC_ERR_PTR(long error) +{ + return (void *)error; +} + +/** + * enum rproc_state - remote processor states + * @RPROC_OFFLINE: remote is offline + * @RPROC_CONFIGURED: remote is configured + * @RPROC_READY: remote is ready to start + * @RPROC_RUNNING: remote is up and running + * @RPROC_SUSPENDED: remote is suspended + * @RPROC_ERROR: remote has error; need to recover + * @RPROC_STOPPED: remote is stopped + * @RPROC_LAST: just keep this one at the end + */ +enum remoteproc_state { + RPROC_OFFLINE = 0, + RPROC_CONFIGURED = 1, + RPROC_READY = 2, + RPROC_RUNNING = 3, + RPROC_SUSPENDED = 4, + RPROC_ERROR = 5, + RPROC_STOPPED = 6, + RPROC_LAST = 7, +}; + +/** + * @brief Initializes remoteproc resource. + * + * @param rproc Pointer to remoteproc instance + * @param ops Pointer to remoteproc operations + * @param priv Pointer to private data + * + * @return Created remoteproc pointer + */ +struct remoteproc *remoteproc_init(struct remoteproc *rproc, + const struct remoteproc_ops *ops, + void *priv); + +/** + * @brief Remove remoteproc resource + * + * @param rproc Pointer to remoteproc instance + * + * @return 0 for success, negative value for failure + */ +int remoteproc_remove(struct remoteproc *rproc); + +/** + * @brief Initialize remoteproc memory + * + * @param mem Pointer to remoteproc memory + * @param name Memory name + * @param pa Physical address + * @param da Device address + * @param size Memory size + * @param io Pointer to the I/O region + */ +static inline void +remoteproc_init_mem(struct remoteproc_mem *mem, const char *name, + metal_phys_addr_t pa, metal_phys_addr_t da, + size_t size, struct metal_io_region *io) +{ + if (!mem || !io || size == 0) + return; + if (name) + strncpy(mem->name, name, sizeof(mem->name)); + else + mem->name[0] = 0; + mem->pa = pa; + mem->da = da; + mem->io = io; + mem->size = size; +} + +/** + * @brief Add remoteproc memory + * + * @param rproc Pointer to remoteproc + * @param mem Pointer to remoteproc memory + */ +static inline void +remoteproc_add_mem(struct remoteproc *rproc, struct remoteproc_mem *mem) +{ + if (!rproc || !mem) + return; + metal_list_add_tail(&rproc->mems, &mem->node); +} + +/** + * @brief Get remoteproc memory I/O region with name + * + * @param rproc Pointer to the remote processor + * @param name Name of the shared memory + * + * @return Metal I/O region pointer, NULL for failure + */ +struct metal_io_region * +remoteproc_get_io_with_name(struct remoteproc *rproc, + const char *name); + +/** + * @brief Get remoteproc memory I/O region with physical address + * + * @param rproc Pointer to the remote processor + * @param pa Physical address + * + * @return Metal I/O region pointer, NULL for failure + */ +struct metal_io_region * +remoteproc_get_io_with_pa(struct remoteproc *rproc, + metal_phys_addr_t pa); + +/** + * @brief Get remoteproc memory I/O region with device address + * + * @param rproc Pointer to the remote processor + * @param da Device address + * @param offset I/O region offset of the device address + * + * @return Metal I/O region pointer, NULL for failure + */ +struct metal_io_region * +remoteproc_get_io_with_da(struct remoteproc *rproc, + metal_phys_addr_t da, + unsigned long *offset); + +/** + * @brief Get remoteproc memory I/O region with virtual address + * + * @param rproc Pointer to the remote processor + * @param va Virtual address + * + * @return Metal I/O region pointer, NULL for failure + */ +struct metal_io_region * +remoteproc_get_io_with_va(struct remoteproc *rproc, + void *va); + +/** + * @brief Remoteproc mmap memory + * + * @param rproc Pointer to the remote processor + * @param pa Physical address pointer + * @param da Device address pointer + * @param size Size of the memory + * @param attribute Memory attribute + * @param io Pointer to the I/O region + * + * @return Pointer to the memory + */ +void *remoteproc_mmap(struct remoteproc *rproc, + metal_phys_addr_t *pa, metal_phys_addr_t *da, + size_t size, unsigned int attribute, + struct metal_io_region **io); + +/** + * @brief Parse and set resource table of remoteproc + * + * @param rproc Pointer to remoteproc instance + * @param rsc_table Pointer to resource table + * @param rsc_size Resource table size + * + * @return 0 for success and negative value for errors + */ +int remoteproc_set_rsc_table(struct remoteproc *rproc, + struct resource_table *rsc_table, + size_t rsc_size); + +/** + * @brief This function configures the remote processor to get it + * ready to load and run executable. + * + * @param rproc Pointer to remoteproc instance to start + * @param data Configuration data + * + * @return 0 for success and negative value for errors + */ +int remoteproc_config(struct remoteproc *rproc, void *data); + +/** + * @brief This function starts the remote processor. + * It assumes the firmware is already loaded. + * + * @param rproc Pointer to remoteproc instance to start + * + * @return 0 for success and negative value for errors + */ +int remoteproc_start(struct remoteproc *rproc); + +/** + * @brief This function stops the remote processor but it + * will not release its resource. + * + * @param rproc Pointer to remoteproc instance + * + * @return 0 for success and negative value for errors + */ +int remoteproc_stop(struct remoteproc *rproc); + +/** + * @brief This function shuts down the remote processor and + * releases its resources. + * + * @param rproc Pointer to remoteproc instance + * + * @return 0 for success and negative value for errors + */ +int remoteproc_shutdown(struct remoteproc *rproc); + +/** + * @brief Loads the executable + * + * Expects the user application defines how to open the executable file and how + * to get data from the executable file and how to load data to the target + * memory. + * + * @param rproc Pointer to the remoteproc instance + * @param path Optional path to the image file + * @param store Pointer to user defined image store argument + * @param store_ops Pointer to image store operations + * @param img_info Pointer to memory which stores image information used + * by remoteproc loader + * + * @return 0 for success and negative value for failure + */ +int remoteproc_load(struct remoteproc *rproc, const char *path, + void *store, const struct image_store_ops *store_ops, + void **img_info); + +/** + * @brief Loads the executable + * + * Expects the caller has loaded image data to local + * memory and passed to the this function. If the function needs more + * image data it will return the next expected image data offset and + * the next expected image data length. If the function requires the + * caller to download image data to the target memory, it will also + * return the target physical address besides the offset and length. + * This function can be used to load firmware in stream mode. In this + * mode, you cannot do seek to the executable file. If the executable + * is ELF, it cannot get the resource table section before it loads + * the full ELF file. Furthermore, application usually don't store + * the data which is loaded to local memory in streaming mode, and + * thus, in this mode, it will load the binary to the target memory + * before it gets the resource table. And thus, when calling this function + * don't put the target executable memory in the resource table, as + * this function will parse the resource table after it loads the binary + * to target memory. + * + * @param rproc Pointer to the remoteproc instance + * @param img_data Pointer to image data for remoteproc loader to parse + * @param offset Image data offset to the beginning of the image file + * @param len Image data length + * @param img_info Pointer to memory which stores image information used + * by remoteproc loader + * @param pa Pointer to the target memory physical address. If the + * next expected data doesn't need to load to the target + * memory, the function will set it to ANY. + * @param io Pointer to the io region. If the next expected data + * doesn't need to load to the target memory, the function + * will set it to NULL. + * @param noffset Pointer to the next image data offset to the beginning + * of the image file needs to load to local or to the + * target memory. + * @param nlen Pointer to the next image data length needs to load to + * local or to the target memory. + * @param nmlen Pointer to the memory size. It is only used when the + * next expected data is going to be loaded to the target + * memory. E.g. in ELF, it is possible that loadable + * segment in memory is larger that the segment data in + * the ELF file. In this case, application will need to + * pad the rest of the memory with padding. + * @param padding Pointer to the padding value. It is only used when the + * next expected data is going to be loaded to the target + * memory and the target memory size is larger than the + * segment data in the executable file. + * + * @return 0 for success and negative value for failure + */ +int remoteproc_load_noblock(struct remoteproc *rproc, + const void *img_data, size_t offset, size_t len, + void **img_info, + metal_phys_addr_t *pa, struct metal_io_region **io, + size_t *noffset, size_t *nlen, + size_t *nmlen, unsigned char *padding); + +/** + * @brief Allocate notifyid for resource + * + * @param rproc Pointer to the remoteproc instance + * @param start Start of the id range + * @param end End of the id range + * + * @return Allocated notify id + */ +unsigned int remoteproc_allocate_id(struct remoteproc *rproc, + unsigned int start, + unsigned int end); + +/** + * @brief Create virtio device, it returns pointer to the created virtio + * device. + * + * @param rproc Pointer to the remoteproc instance + * @param vdev_id virtio device ID + * @param role virtio device role + * @param rst_cb virtio device reset callback + * + * @return Pointer to the created virtio device, NULL for failure. + */ +struct virtio_device * +remoteproc_create_virtio(struct remoteproc *rproc, + int vdev_id, unsigned int role, + void (*rst_cb)(struct virtio_device *vdev)); + +/** + * @brief Remove virtio device + * + * @param rproc Pointer to the remoteproc instance + * @param vdev Pointer to the virtio device + */ +void remoteproc_remove_virtio(struct remoteproc *rproc, + struct virtio_device *vdev); + +/** + * @brief remoteproc is got notified, it will check its subdevices + * for the notification + * + * @param rproc Pointer to the remoteproc instance + * @param notifyid Notification id + * + * @return 0 for succeed, negative value for failure + */ +int remoteproc_get_notification(struct remoteproc *rproc, + uint32_t notifyid); +#if defined __cplusplus +} +#endif + +#endif /* REMOTEPROC_H_ */ diff --git a/libraries/openamp_arduino/src/openamp/remoteproc_loader.h b/libraries/openamp_arduino/src/openamp/remoteproc_loader.h index dce3dbb0b..d928fcfce 100755 --- a/libraries/openamp_arduino/src/openamp/remoteproc_loader.h +++ b/libraries/openamp_arduino/src/openamp/remoteproc_loader.h @@ -1,108 +1,111 @@ -/* - * Copyright (c) 2014, Mentor Graphics Corporation - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/************************************************************************** - * FILE NAME - * - * remoteproc_loader.h - * - * COMPONENT - * - * OpenAMP stack. - * - * DESCRIPTION - * - * This file provides definitions for remoteproc loader - * - * - **************************************************************************/ -#ifndef REMOTEPROC_LOADER_H_ -#define REMOTEPROC_LOADER_H_ - -#include -#include -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -/* Loader feature macros */ -#define SUPPORT_SEEK 1UL - -/* Remoteproc loader any address */ -#define RPROC_LOAD_ANYADDR ((metal_phys_addr_t)-1) - -/* Remoteproc loader Exectuable Image Parsing States */ -/* Remoteproc loader parser intial state */ -#define RPROC_LOADER_NOT_READY 0x0UL -/* Remoteproc loader ready to load, even it can be not finish parsing */ -#define RPROC_LOADER_READY_TO_LOAD 0x10000UL -/* Remoteproc loader post data load */ -#define RPROC_LOADER_POST_DATA_LOAD 0x20000UL -/* Remoteproc loader finished loading */ -#define RPROC_LOADER_LOAD_COMPLETE 0x40000UL -/* Remoteproc loader state mask */ -#define RPROC_LOADER_MASK 0x00FF0000UL -/* Remoteproc loader private mask */ -#define RPROC_LOADER_PRIVATE_MASK 0x0000FFFFUL -/* Remoteproc loader reserved mask */ -#define RPROC_LOADER_RESERVED_MASK 0x0F000000UL - -/** - * struct image_store_ops - user defined image store operations - * @open: user defined callback to open the "firmware" to prepare loading - * @close: user defined callback to close the "firmware" to clean up - * after loading - * @load: user defined callback to load the firmware contents to target - * memory or local memory - * @features: loader supported features. e.g. seek - */ -struct image_store_ops { - int (*open)(void *store, const char *path, const void **img_data); - void (*close)(void *store); - int (*load)(void *store, size_t offset, size_t size, - const void **data, - metal_phys_addr_t pa, - struct metal_io_region *io, char is_blocking); - unsigned int features; -}; - -/** - * struct loader_ops - loader oeprations - * @load_header: define how to get the executable headers - * @load_data: define how to load the target data - * @locate_rsc_table: define how to get the resource table target address, - * offset to the ELF image file and size of the resource - * table. - * @release: define how to release the loader - * @get_entry: get entry address - * @get_load_state: get load state from the image information - */ -struct loader_ops { - int (*load_header)(const void *img_data, size_t offset, size_t len, - void **img_info, int last_state, - size_t *noffset, size_t *nlen); - int (*load_data)(struct remoteproc *rproc, - const void *img_data, size_t offset, size_t len, - void **img_info, int last_load_state, - metal_phys_addr_t *da, - size_t *noffset, size_t *nlen, - unsigned char *padding, size_t *nmemsize); - int (*locate_rsc_table)(void *img_info, metal_phys_addr_t *da, - size_t *offset, size_t *size); - void (*release)(void *img_info); - metal_phys_addr_t (*get_entry)(void *img_info); - int (*get_load_state)(void *img_info); -}; - -#if defined __cplusplus -} -#endif - -#endif /* REMOTEPROC_LOADER_H_ */ +/* + * Copyright (c) 2014, Mentor Graphics Corporation + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/************************************************************************** + * FILE NAME + * + * remoteproc_loader.h + * + * COMPONENT + * + * OpenAMP stack. + * + * DESCRIPTION + * + * This file provides definitions for remoteproc loader + * + * + **************************************************************************/ +#ifndef REMOTEPROC_LOADER_H_ +#define REMOTEPROC_LOADER_H_ + +#include +#include +#include +#include + +#if defined __cplusplus +extern "C" { +#endif + +/* Loader feature macros */ +#define SUPPORT_SEEK 1UL + +/* Remoteproc loader any address */ +#define RPROC_LOAD_ANYADDR ((metal_phys_addr_t)-1) + +/* Remoteproc loader Executable Image Parsing States */ +/* Remoteproc loader parser initial state */ +#define RPROC_LOADER_NOT_READY 0x0L +/* Remoteproc loader ready to load, even it can be not finish parsing */ +#define RPROC_LOADER_READY_TO_LOAD 0x10000L +/* Remoteproc loader post data load */ +#define RPROC_LOADER_POST_DATA_LOAD 0x20000L +/* Remoteproc loader finished loading */ +#define RPROC_LOADER_LOAD_COMPLETE 0x40000L +/* Remoteproc loader state mask */ +#define RPROC_LOADER_MASK 0x00FF0000L +/* Remoteproc loader private mask */ +#define RPROC_LOADER_PRIVATE_MASK 0x0000FFFFL +/* Remoteproc loader reserved mask */ +#define RPROC_LOADER_RESERVED_MASK 0x0F000000L + +/** @brief User-defined image store operations */ +struct image_store_ops { + /** User-defined callback to open the "firmware" to prepare loading */ + int (*open)(void *store, const char *path, const void **img_data); + + /** User-defined callback to close the "firmware" to clean up after loading */ + void (*close)(void *store); + + /** User-defined callback to load the firmware contents to target memory or local memory */ + int (*load)(void *store, size_t offset, size_t size, + const void **data, + metal_phys_addr_t pa, + struct metal_io_region *io, char is_blocking); + + /** Loader supported features. e.g. seek */ + unsigned int features; +}; + +/** @brief Loader operations */ +struct loader_ops { + /** Define how to get the executable headers */ + int (*load_header)(const void *img_data, size_t offset, size_t len, + void **img_info, int last_state, + size_t *noffset, size_t *nlen); + + /** Define how to load the target data */ + int (*load_data)(struct remoteproc *rproc, + const void *img_data, size_t offset, size_t len, + void **img_info, int last_load_state, + metal_phys_addr_t *da, + size_t *noffset, size_t *nlen, + unsigned char *padding, size_t *nmemsize); + + /** + * Define how to get the resource table target address, offset to the ELF + * image file and size of the resource table + */ + int (*locate_rsc_table)(void *img_info, metal_phys_addr_t *da, + size_t *offset, size_t *size); + + /** Define how to release the loader */ + void (*release)(void *img_info); + + /** Get entry address */ + metal_phys_addr_t (*get_entry)(void *img_info); + + /** Get load state from the image information */ + int (*get_load_state)(void *img_info); +}; + +#if defined __cplusplus +} +#endif + +#endif /* REMOTEPROC_LOADER_H_ */ diff --git a/libraries/openamp_arduino/src/openamp/remoteproc_virtio.h b/libraries/openamp_arduino/src/openamp/remoteproc_virtio.h index fc1627e45..0b747cacc 100755 --- a/libraries/openamp_arduino/src/openamp/remoteproc_virtio.h +++ b/libraries/openamp_arduino/src/openamp/remoteproc_virtio.h @@ -1,150 +1,133 @@ -/* - * Remoteproc Virtio Framework - * - * Copyright(c) 2018 Xilinx Ltd. - * Copyright(c) 2011 Texas Instruments, Inc. - * Copyright(c) 2011 Google, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name Texas Instruments nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef REMOTEPROC_VIRTIO_H -#define REMOTEPROC_VIRTIO_H - -#include -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -/* define vdev notification funciton user should implement */ -typedef int (*rpvdev_notify_func)(void *priv, uint32_t id); - -/** - * struct remoteproc_virtio - * @priv pointer to private data - * @notifyid notification id - * @vdev_rsc address of vdev resource - * @vdev_rsc_io metal I/O region of vdev_info, can be NULL - * @notify notification function - * @vdev virtio device - * @node list node - */ -struct remoteproc_virtio { - void *priv; - uint32_t notify_id; - void *vdev_rsc; - struct metal_io_region *vdev_rsc_io; - rpvdev_notify_func notify; - struct virtio_device vdev; - struct metal_list node; -}; - -/** - * rproc_virtio_create_vdev - * - * Create rproc virtio vdev - * - * @role: 0 - virtio master, 1 - virtio slave - * @notifyid: virtio device notification id - * @rsc: pointer to the virtio device resource - * @rsc_io: pointer to the virtio device resource I/O region - * @priv: pointer to the private data - * @notify: vdev and virtqueue notification function - * @rst_cb: reset virtio device callback - * - * return pointer to the created virtio device for success, - * NULL for failure. - */ -struct virtio_device * -rproc_virtio_create_vdev(unsigned int role, unsigned int notifyid, - void *rsc, struct metal_io_region *rsc_io, - void *priv, - rpvdev_notify_func notify, - virtio_dev_reset_cb rst_cb); - -/** - * rproc_virtio_remove_vdev - * - * Create rproc virtio vdev - * - * @vdev - pointer to the virtio device - */ -void rproc_virtio_remove_vdev(struct virtio_device *vdev); - -/** - * rproc_virtio_create_vring - * - * Create rproc virtio vring - * - * @vdev: pointer to the virtio device - * @index: vring index in the virtio device - * @notifyid: remoteproc vring notification id - * @va: vring virtual address - * @io: pointer to vring I/O region - * @num_desc: number of descriptors - * @align: vring alignment - * - * return 0 for success, negative value for failure. - */ -int rproc_virtio_init_vring(struct virtio_device *vdev, unsigned int index, - unsigned int notifyid, void *va, - struct metal_io_region *io, - unsigned int num_descs, unsigned int align); - -/** - * rproc_virtio_notified - * - * remoteproc virtio is got notified - * - * @vdev - pointer to the virtio device - * @notifyid - notify id - * - * return 0 for successful, negative value for failure - */ -int rproc_virtio_notified(struct virtio_device *vdev, uint32_t notifyid); - -/** - * rproc_virtio_wait_remote_ready - * - * Blocking function, waiting for the remote core is ready to start - * communications. - * - * @vdev - pointer to the virtio device - * - * return true when remote processor is ready. - */ -void rproc_virtio_wait_remote_ready(struct virtio_device *vdev); - -#if defined __cplusplus -} -#endif - -#endif /* REMOTEPROC_VIRTIO_H */ +/* + * Remoteproc Virtio Framework + * + * Copyright(c) 2018 Xilinx Ltd. + * Copyright(c) 2011 Texas Instruments, Inc. + * Copyright(c) 2011 Google, Inc. + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef REMOTEPROC_VIRTIO_H +#define REMOTEPROC_VIRTIO_H + +#include +#include +#include +#include + +#if defined __cplusplus +extern "C" { +#endif + +/* maximum number of vring descriptors for a vdev limited by 16-bit data type */ +#define RPROC_MAX_VRING_DESC USHRT_MAX + +/* cache invalidation helpers for resource table */ +#ifdef VIRTIO_CACHED_RSC_TABLE +#warning "VIRTIO_CACHED_RSC_TABLE is deprecated, please use VIRTIO_USE_DCACHE" +#endif +#if defined(VIRTIO_CACHED_RSC_TABLE) || defined(VIRTIO_USE_DCACHE) +#define RSC_TABLE_FLUSH(x, s) CACHE_FLUSH(x, s) +#define RSC_TABLE_INVALIDATE(x, s) CACHE_INVALIDATE(x, s) +#else +#define RSC_TABLE_FLUSH(x, s) do { } while (0) +#define RSC_TABLE_INVALIDATE(x, s) do { } while (0) +#endif /* VIRTIO_CACHED_RSC_TABLE || VIRTIO_USE_DCACHE */ + +/* define vdev notification function user should implement */ +typedef int (*rpvdev_notify_func)(void *priv, uint32_t id); + +/** @brief Virtio structure for remoteproc instance */ +struct remoteproc_virtio { + /** Pointer to private data */ + void *priv; + + /** Address of vdev resource */ + void *vdev_rsc; + + /** Metal I/O region of vdev_info, can be NULL */ + struct metal_io_region *vdev_rsc_io; + + /** Notification function */ + rpvdev_notify_func notify; + + /** Virtio device */ + struct virtio_device vdev; + + /** List node */ + struct metal_list node; +}; + +/** + * @brief Create rproc virtio vdev + * + * @param role VIRTIO_DEV_DRIVER or VIRTIO_DEV_DEVICE + * @param notifyid Virtio device notification id + * @param rsc Pointer to the virtio device resource + * @param rsc_io Pointer to the virtio device resource I/O region + * @param priv Pointer to the private data + * @param notify vdev and virtqueue notification function + * @param rst_cb Reset virtio device callback + * + * @return pointer to the created virtio device for success, + * NULL for failure. + */ +struct virtio_device * +rproc_virtio_create_vdev(unsigned int role, unsigned int notifyid, + void *rsc, struct metal_io_region *rsc_io, + void *priv, + rpvdev_notify_func notify, + virtio_dev_reset_cb rst_cb); + +/** + * @brief Remove rproc virtio vdev + * + * @param vdev Pointer to the virtio device + */ +void rproc_virtio_remove_vdev(struct virtio_device *vdev); + +/** + * @brief Initialize rproc virtio vring + * + * @param vdev Pointer to the virtio device + * @param index vring index in the virtio device + * @param notifyid remoteproc vring notification id + * @param va vring virtual address + * @param io Pointer to vring I/O region + * @param num_descs Number of descriptors + * @param align vring alignment + * + * @return 0 for success, negative value for failure. + */ +int rproc_virtio_init_vring(struct virtio_device *vdev, unsigned int index, + unsigned int notifyid, void *va, + struct metal_io_region *io, + unsigned int num_descs, unsigned int align); + +/** + * @brief remoteproc virtio is got notified + * + * @param vdev Pointer to the virtio device + * @param notifyid Notify id + * + * @return 0 for successful, negative value for failure + */ +int rproc_virtio_notified(struct virtio_device *vdev, uint32_t notifyid); + +/** + * @brief Blocking function, waiting for the remote core is ready to start + * communications. + * + * @param vdev Pointer to the virtio device + * + * @return true when remote processor is ready. + */ +void rproc_virtio_wait_remote_ready(struct virtio_device *vdev); + +#if defined __cplusplus +} +#endif + +#endif /* REMOTEPROC_VIRTIO_H */ diff --git a/libraries/openamp_arduino/src/openamp/rpmsg.h b/libraries/openamp_arduino/src/openamp/rpmsg.h index a9f47c26d..9cf1e7444 100755 --- a/libraries/openamp_arduino/src/openamp/rpmsg.h +++ b/libraries/openamp_arduino/src/openamp/rpmsg.h @@ -1,357 +1,568 @@ -/* - * Remote processor messaging - * - * Copyright (C) 2011 Texas Instruments, Inc. - * Copyright (C) 2011 Google, Inc. - * All rights reserved. - * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _RPMSG_H_ -#define _RPMSG_H_ - -#include "compiler.h" -#include -#include -#include -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -/* Configurable parameters */ -#define RPMSG_NAME_SIZE (32) -#define RPMSG_ADDR_BMP_SIZE (4) - -#define RPMSG_NS_EPT_ADDR (0x35) -#define RPMSG_ADDR_ANY 0xFFFFFFFF - -/* Error macros. */ -#define RPMSG_SUCCESS 0 -#define RPMSG_ERROR_BASE -2000 -#define RPMSG_ERR_NO_MEM (RPMSG_ERROR_BASE - 1) -#define RPMSG_ERR_NO_BUFF (RPMSG_ERROR_BASE - 2) -#define RPMSG_ERR_PARAM (RPMSG_ERROR_BASE - 3) -#define RPMSG_ERR_DEV_STATE (RPMSG_ERROR_BASE - 4) -#define RPMSG_ERR_BUFF_SIZE (RPMSG_ERROR_BASE - 5) -#define RPMSG_ERR_INIT (RPMSG_ERROR_BASE - 6) -#define RPMSG_ERR_ADDR (RPMSG_ERROR_BASE - 7) - -struct rpmsg_endpoint; -struct rpmsg_device; - -typedef int (*rpmsg_ept_cb)(struct rpmsg_endpoint *ept, void *data, - size_t len, uint32_t src, void *priv); -typedef void (*rpmsg_ns_unbind_cb)(struct rpmsg_endpoint *ept); -typedef void (*rpmsg_ns_bind_cb)(struct rpmsg_device *rdev, - const char *name, uint32_t dest); - -/** - * struct rpmsg_endpoint - binds a local rpmsg address to its user - * @name:name of the service supported - * @rdev: pointer to the rpmsg device - * @addr: local address of the endpoint - * @dest_addr: address of the default remote endpoint binded. - * @cb: user rx callback, return value of this callback is reserved - * for future use, for now, only allow RPMSG_SUCCESS as return value. - * @ns_unbind_cb: end point service service unbind callback, called when remote - * ept is destroyed. - * @node: end point node. - * @addr: local rpmsg address - * @priv: private data for the driver's use - * - * In essence, an rpmsg endpoint represents a listener on the rpmsg bus, as - * it binds an rpmsg address with an rx callback handler. - */ -struct rpmsg_endpoint { - char name[RPMSG_NAME_SIZE]; - struct rpmsg_device *rdev; - uint32_t addr; - uint32_t dest_addr; - rpmsg_ept_cb cb; - rpmsg_ns_unbind_cb ns_unbind_cb; - struct metal_list node; - void *priv; -}; - -/** - * struct rpmsg_device_ops - RPMsg device operations - * @send_offchannel_raw: send RPMsg data - */ -struct rpmsg_device_ops { - int (*send_offchannel_raw)(struct rpmsg_device *rdev, - uint32_t src, uint32_t dst, - const void *data, int size, int wait); -}; - -/** - * struct rpmsg_device - representation of a RPMsg device - * @endpoints: list of endpoints - * @ns_ept: name service endpoint - * @bitmap: table endpoin address allocation. - * @lock: mutex lock for rpmsg management - * @ns_bind_cb: callback handler for name service announcement without local - * endpoints waiting to bind. - * @ops: RPMsg device operations - */ -struct rpmsg_device { - struct metal_list endpoints; - struct rpmsg_endpoint ns_ept; - unsigned long bitmap[RPMSG_ADDR_BMP_SIZE]; - metal_mutex_t lock; - rpmsg_ns_bind_cb ns_bind_cb; - struct rpmsg_device_ops ops; -}; - -/** - * rpmsg_send_offchannel_raw() - send a message across to the remote processor, - * specifying source and destination address. - * @ept: the rpmsg endpoint - * @data: payload of the message - * @len: length of the payload - * - * This function sends @data of length @len to the remote @dst address from - * the source @src address. - * The message will be sent to the remote processor which the channel belongs - * to. - * In case there are no TX buffers available, the function will block until - * one becomes available, or a timeout of 15 seconds elapses. When the latter - * happens, -ERESTARTSYS is returned. - * - * Returns number of bytes it has sent or negative error value on failure. - */ -int rpmsg_send_offchannel_raw(struct rpmsg_endpoint *ept, uint32_t src, - uint32_t dst, const void *data, int size, - int wait); - -/** - * rpmsg_send() - send a message across to the remote processor - * @ept: the rpmsg endpoint - * @data: payload of the message - * @len: length of the payload - * - * This function sends @data of length @len based on the @ept. - * The message will be sent to the remote processor which the channel belongs - * to, using @ept's source and destination addresses. - * In case there are no TX buffers available, the function will block until - * one becomes available, or a timeout of 15 seconds elapses. When the latter - * happens, -ERESTARTSYS is returned. - * - * Returns number of bytes it has sent or negative error value on failure. - */ -static inline int rpmsg_send(struct rpmsg_endpoint *ept, const void *data, - int len) -{ - if (ept->dest_addr == RPMSG_ADDR_ANY) - return RPMSG_ERR_ADDR; - return rpmsg_send_offchannel_raw(ept, ept->addr, ept->dest_addr, data, - len, true); -} - -/** - * rpmsg_sendto() - send a message across to the remote processor, specify dst - * @ept: the rpmsg endpoint - * @data: payload of message - * @len: length of payload - * @dst: destination address - * - * This function sends @data of length @len to the remote @dst address. - * The message will be sent to the remote processor which the @ept - * channel belongs to, using @ept's source address. - * In case there are no TX buffers available, the function will block until - * one becomes available, or a timeout of 15 seconds elapses. When the latter - * happens, -ERESTARTSYS is returned. - * - * Returns number of bytes it has sent or negative error value on failure. - */ -static inline int rpmsg_sendto(struct rpmsg_endpoint *ept, const void *data, - int len, uint32_t dst) -{ - return rpmsg_send_offchannel_raw(ept, ept->addr, dst, data, len, true); -} - -/** - * rpmsg_send_offchannel() - send a message using explicit src/dst addresses - * @ept: the rpmsg endpoint - * @src: source address - * @dst: destination address - * @data: payload of message - * @len: length of payload - * - * This function sends @data of length @len to the remote @dst address, - * and uses @src as the source address. - * The message will be sent to the remote processor which the @ept - * channel belongs to. - * In case there are no TX buffers available, the function will block until - * one becomes available, or a timeout of 15 seconds elapses. When the latter - * happens, -ERESTARTSYS is returned. - * - * Returns number of bytes it has sent or negative error value on failure. - */ -static inline int rpmsg_send_offchannel(struct rpmsg_endpoint *ept, - uint32_t src, uint32_t dst, - const void *data, int len) -{ - return rpmsg_send_offchannel_raw(ept, src, dst, data, len, true); -} - -/** - * rpmsg_trysend() - send a message across to the remote processor - * @ept: the rpmsg endpoint - * @data: payload of message - * @len: length of payload - * - * This function sends @data of length @len on the @ept channel. - * The message will be sent to the remote processor which the @ept - * channel belongs to, using @ept's source and destination addresses. - * In case there are no TX buffers available, the function will immediately - * return -ENOMEM without waiting until one becomes available. - * - * Returns number of bytes it has sent or negative error value on failure. - */ -static inline int rpmsg_trysend(struct rpmsg_endpoint *ept, const void *data, - int len) -{ - if (ept->dest_addr == RPMSG_ADDR_ANY) - return RPMSG_ERR_ADDR; - return rpmsg_send_offchannel_raw(ept, ept->addr, ept->dest_addr, data, - len, false); -} - -/** - * rpmsg_trysendto() - send a message across to the remote processor, - * specify dst - * @ept: the rpmsg endpoint - * @data: payload of message - * @len: length of payload - * @dst: destination address - * - * This function sends @data of length @len to the remote @dst address. - * The message will be sent to the remote processor which the @ept - * channel belongs to, using @ept's source address. - * In case there are no TX buffers available, the function will immediately - * return -ENOMEM without waiting until one becomes available. - * - * Returns number of bytes it has sent or negative error value on failure. - */ -static inline int rpmsg_trysendto(struct rpmsg_endpoint *ept, const void *data, - int len, uint32_t dst) -{ - return rpmsg_send_offchannel_raw(ept, ept->addr, dst, data, len, false); -} - -/** - * rpmsg_trysend_offchannel() - send a message using explicit src/dst addresses - * @ept: the rpmsg endpoint - * @src: source address - * @dst: destination address - * @data: payload of message - * @len: length of payload - * - * This function sends @data of length @len to the remote @dst address, - * and uses @src as the source address. - * The message will be sent to the remote processor which the @ept - * channel belongs to. - * In case there are no TX buffers available, the function will immediately - * return -ENOMEM without waiting until one becomes available. - * - * Returns number of bytes it has sent or negative error value on failure. - */ -static inline int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, - uint32_t src, uint32_t dst, - const void *data, int len) -{ - return rpmsg_send_offchannel_raw(ept, src, dst, data, len, false); -} - -/** - * rpmsg_init_ept - initialize rpmsg endpoint - * - * Initialize an RPMsg endpoint with a name, source address, - * remoteproc address, endpoitn callback, and destroy endpoint callback. - * - * @ept: pointer to rpmsg endpoint - * @name: service name associated to the endpoint - * @src: local address of the endpoint - * @dest: target address of the endpoint - * @cb: endpoint callback - * @ns_unbind_cb: end point service unbind callback, called when remote ept is - * destroyed. - */ -static inline void rpmsg_init_ept(struct rpmsg_endpoint *ept, - const char *name, - uint32_t src, uint32_t dest, - rpmsg_ept_cb cb, - rpmsg_ns_unbind_cb ns_unbind_cb) -{ - strncpy(ept->name, name, sizeof(ept->name)); - ept->addr = src; - ept->dest_addr = dest; - ept->cb = cb; - ept->ns_unbind_cb = ns_unbind_cb; -} - -/** - * rpmsg_create_ept - create rpmsg endpoint and register it to rpmsg device - * - * Create a RPMsg endpoint, initialize it with a name, source address, - * remoteproc address, endpoitn callback, and destroy endpoint callback, - * and register it to the RPMsg device. - * - * @ept: pointer to rpmsg endpoint - * @name: service name associated to the endpoint - * @src: local address of the endpoint - * @dest: target address of the endpoint - * @cb: endpoint callback - * @ns_unbind_cb: end point service unbind callback, called when remote ept is - * destroyed. - * - * In essence, an rpmsg endpoint represents a listener on the rpmsg bus, as - * it binds an rpmsg address with an rx callback handler. - * - * Rpmsg client should create an endpoint to discuss with remote. rpmsg client - * provide at least a channel name, a callback for message notification and by - * default endpoint source address should be set to RPMSG_ADDR_ANY. - * - * As an option Some rpmsg clients can specify an endpoint with a specific - * source address. - */ - -int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev, - const char *name, uint32_t src, uint32_t dest, - rpmsg_ept_cb cb, rpmsg_ns_unbind_cb ns_unbind_cb); - -/** - * rpmsg_destroy_ept - destroy rpmsg endpoint and unregister it from rpmsg - * device - * - * @ept: pointer to the rpmsg endpoint - * - * It unregisters the rpmsg endpoint from the rpmsg device and calls the - * destroy endpoint callback if it is provided. - */ -void rpmsg_destroy_ept(struct rpmsg_endpoint *ept); - -/** - * is_rpmsg_ept_ready - check if the rpmsg endpoint ready to send - * - * @ept: pointer to rpmsg endpoint - * - * Returns 1 if the rpmsg endpoint has both local addr and destination - * addr set, 0 otherwise - */ -static inline unsigned int is_rpmsg_ept_ready(struct rpmsg_endpoint *ept) -{ - return (ept->dest_addr != RPMSG_ADDR_ANY && - ept->addr != RPMSG_ADDR_ANY); -} - -#if defined __cplusplus -} -#endif - -#endif /* _RPMSG_H_ */ +/* + * Remote processor messaging + * + * Copyright (C) 2011 Texas Instruments, Inc. + * Copyright (C) 2011 Google, Inc. + * All rights reserved. + * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _RPMSG_H_ +#define _RPMSG_H_ + +#include +#include +#include +#include +#include +#include +#include + +#if defined __cplusplus +extern "C" { +#endif + +/* Configurable parameters */ +#define RPMSG_NAME_SIZE (32) +#define RPMSG_ADDR_BMP_SIZE (128) + +#define RPMSG_NS_EPT_ADDR (0x35) +#define RPMSG_RESERVED_ADDRESSES (1024) +#define RPMSG_ADDR_ANY 0xFFFFFFFF + +/* Error macros. */ +#define RPMSG_SUCCESS 0 +#define RPMSG_ERROR_BASE -2000 +#define RPMSG_ERR_NO_MEM (RPMSG_ERROR_BASE - 1) +#define RPMSG_ERR_NO_BUFF (RPMSG_ERROR_BASE - 2) +#define RPMSG_ERR_PARAM (RPMSG_ERROR_BASE - 3) +#define RPMSG_ERR_DEV_STATE (RPMSG_ERROR_BASE - 4) +#define RPMSG_ERR_BUFF_SIZE (RPMSG_ERROR_BASE - 5) +#define RPMSG_ERR_INIT (RPMSG_ERROR_BASE - 6) +#define RPMSG_ERR_ADDR (RPMSG_ERROR_BASE - 7) +#define RPMSG_ERR_PERM (RPMSG_ERROR_BASE - 8) + +struct rpmsg_endpoint; +struct rpmsg_device; + +/* Returns positive value on success or negative error value on failure */ +typedef int (*rpmsg_ept_cb)(struct rpmsg_endpoint *ept, void *data, + size_t len, uint32_t src, void *priv); +typedef void (*rpmsg_ns_unbind_cb)(struct rpmsg_endpoint *ept); +typedef void (*rpmsg_ns_bind_cb)(struct rpmsg_device *rdev, + const char *name, uint32_t dest); + +/** + * @brief Structure that binds a local RPMsg address to its user + * + * In essence, an RPMsg endpoint represents a listener on the RPMsg bus, as + * it binds an RPMsg address with an rx callback handler. + */ +struct rpmsg_endpoint { + /** Name of the service supported */ + char name[RPMSG_NAME_SIZE]; + + /** Pointer to the RPMsg device */ + struct rpmsg_device *rdev; + + /** Local address of the endpoint */ + uint32_t addr; + + /** Address of the default remote endpoint binded */ + uint32_t dest_addr; + + /** + * User rx callback, return value of this callback is reserved for future + * use, for now, only allow RPMSG_SUCCESS as return value + */ + rpmsg_ept_cb cb; + + /** Endpoint service unbind callback, called when remote ept is destroyed */ + rpmsg_ns_unbind_cb ns_unbind_cb; + + /** Endpoint node */ + struct metal_list node; + + /** Private data for the driver's use */ + void *priv; +}; + +/** @brief RPMsg device operations */ +struct rpmsg_device_ops { + /** Send RPMsg data */ + int (*send_offchannel_raw)(struct rpmsg_device *rdev, + uint32_t src, uint32_t dst, + const void *data, int len, int wait); + + /** Hold RPMsg RX buffer */ + void (*hold_rx_buffer)(struct rpmsg_device *rdev, void *rxbuf); + + /** Release RPMsg RX buffer */ + void (*release_rx_buffer)(struct rpmsg_device *rdev, void *rxbuf); + + /** Get RPMsg TX buffer */ + void *(*get_tx_payload_buffer)(struct rpmsg_device *rdev, + uint32_t *len, int wait); + + /** Send RPMsg data without copy */ + int (*send_offchannel_nocopy)(struct rpmsg_device *rdev, + uint32_t src, uint32_t dst, + const void *data, int len); + + /** Release RPMsg TX buffer */ + int (*release_tx_buffer)(struct rpmsg_device *rdev, void *txbuf); +}; + +/** @brief Representation of a RPMsg device */ +struct rpmsg_device { + /** List of endpoints */ + struct metal_list endpoints; + + /** Name service endpoint */ + struct rpmsg_endpoint ns_ept; + + /** Table endpoint address allocation */ + unsigned long bitmap[metal_bitmap_longs(RPMSG_ADDR_BMP_SIZE)]; + + /** Mutex lock for RPMsg management */ + metal_mutex_t lock; + + /** Callback handler for name service announcement without local epts waiting to bind */ + rpmsg_ns_bind_cb ns_bind_cb; + + /** Callback handler for name service announcement, called when remote ept is destroyed */ + rpmsg_ns_bind_cb ns_unbind_cb; + + /** RPMsg device operations */ + struct rpmsg_device_ops ops; + + /** Create/destroy namespace message */ + bool support_ns; +}; + +/** + * @brief Send a message across to the remote processor, + * specifying source and destination address. + * + * This function sends @data of length @len to the remote @dst address from + * the source @src address. + * The message will be sent to the remote processor which the channel belongs + * to. + * + * @param ept The rpmsg endpoint + * @param src Source endpoint address of the message + * @param dst Destination endpoint address of the message + * @param data Payload of the message + * @param len Length of the payload + * @param wait Boolean value indicating whether to wait on buffers + * + * @return Number of bytes it has sent or negative error value on failure. + */ +int rpmsg_send_offchannel_raw(struct rpmsg_endpoint *ept, uint32_t src, + uint32_t dst, const void *data, int len, + int wait); + +/** + * @brief Send a message across to the remote processor + * + * This function sends @data of length @len based on the @ept. + * The message will be sent to the remote processor which the channel belongs + * to, using @ept's source and destination addresses. + * In case there are no TX buffers available, the function will block until + * one becomes available, or a timeout of 15 seconds elapses. When the latter + * happens, -ERESTARTSYS is returned. + * + * @param ept The rpmsg endpoint + * @param data Payload of the message + * @param len Length of the payload + * + * @return Number of bytes it has sent or negative error value on failure. + */ +static inline int rpmsg_send(struct rpmsg_endpoint *ept, const void *data, + int len) +{ + if (!ept) + return RPMSG_ERR_PARAM; + + return rpmsg_send_offchannel_raw(ept, ept->addr, ept->dest_addr, data, + len, true); +} + +/** + * @brief Send a message across to the remote processor, specify dst + * + * This function sends @data of length @len to the remote @dst address. + * The message will be sent to the remote processor which the @ept + * channel belongs to, using @ept's source address. + * In case there are no TX buffers available, the function will block until + * one becomes available, or a timeout of 15 seconds elapses. When the latter + * happens, -ERESTARTSYS is returned. + * + * @param ept The rpmsg endpoint + * @param data Payload of message + * @param len Length of payload + * @param dst Destination address + * + * @return Number of bytes it has sent or negative error value on failure. + */ +static inline int rpmsg_sendto(struct rpmsg_endpoint *ept, const void *data, + int len, uint32_t dst) +{ + if (!ept) + return RPMSG_ERR_PARAM; + + return rpmsg_send_offchannel_raw(ept, ept->addr, dst, data, len, true); +} + +/** + * @brief Send a message using explicit src/dst addresses + * + * This function sends @data of length @len to the remote @dst address, + * and uses @src as the source address. + * The message will be sent to the remote processor which the @ept + * channel belongs to. + * In case there are no TX buffers available, the function will block until + * one becomes available, or a timeout of 15 seconds elapses. When the latter + * happens, -ERESTARTSYS is returned. + * + * @param ept The rpmsg endpoint + * @param src Source address + * @param dst Destination address + * @param data Payload of message + * @param len Length of payload + * + * @return Number of bytes it has sent or negative error value on failure. + */ +static inline int rpmsg_send_offchannel(struct rpmsg_endpoint *ept, + uint32_t src, uint32_t dst, + const void *data, int len) +{ + return rpmsg_send_offchannel_raw(ept, src, dst, data, len, true); +} + +/** + * @brief Send a message across to the remote processor + * + * This function sends @data of length @len on the @ept channel. + * The message will be sent to the remote processor which the @ept + * channel belongs to, using @ept's source and destination addresses. + * In case there are no TX buffers available, the function will immediately + * return -ENOMEM without waiting until one becomes available. + * + * @param ept The rpmsg endpoint + * @param data Payload of message + * @param len Length of payload + * + * @return Number of bytes it has sent or negative error value on failure. + */ +static inline int rpmsg_trysend(struct rpmsg_endpoint *ept, const void *data, + int len) +{ + if (!ept) + return RPMSG_ERR_PARAM; + + return rpmsg_send_offchannel_raw(ept, ept->addr, ept->dest_addr, data, + len, false); +} + +/** + * @brief Send a message across to the remote processor, specify dst + * + * This function sends @data of length @len to the remote @dst address. + * The message will be sent to the remote processor which the @ept + * channel belongs to, using @ept's source address. + * In case there are no TX buffers available, the function will immediately + * return -ENOMEM without waiting until one becomes available. + * + * @param ept The rpmsg endpoint + * @param data Payload of message + * @param len Length of payload + * @param dst Destination address + * + * @return Number of bytes it has sent or negative error value on failure. + */ +static inline int rpmsg_trysendto(struct rpmsg_endpoint *ept, const void *data, + int len, uint32_t dst) +{ + if (!ept) + return RPMSG_ERR_PARAM; + + return rpmsg_send_offchannel_raw(ept, ept->addr, dst, data, len, false); +} + +/** + * @brief Send a message using explicit src/dst addresses + * + * This function sends @data of length @len to the remote @dst address, + * and uses @src as the source address. + * The message will be sent to the remote processor which the @ept + * channel belongs to. + * In case there are no TX buffers available, the function will immediately + * return -ENOMEM without waiting until one becomes available. + * + * @param ept The rpmsg endpoint + * @param src Source address + * @param dst Destination address + * @param data Payload of message + * @param len Length of payload + * + * @return Number of bytes it has sent or negative error value on failure. + */ +static inline int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, + uint32_t src, uint32_t dst, + const void *data, int len) +{ + return rpmsg_send_offchannel_raw(ept, src, dst, data, len, false); +} + +/** + * @brief Holds the rx buffer for usage outside the receive callback. + * + * Calling this function prevents the RPMsg receive buffer from being released + * back to the pool of shmem buffers. This API can only be called at rx + * callback context (rpmsg_rx_cb_t). With this API, the application doesn't + * need to copy the message in rx callback. Instead, the rx buffer base address + * is saved in application context and further processed in application + * process. After the message is processed, the application can release the rx + * buffer for future reuse in vring by calling the rpmsg_release_rx_buffer() + * function. + * + * @param ept The rpmsg endpoint + * @param rxbuf RX buffer with message payload + * + * @see rpmsg_release_rx_buffer + */ +void rpmsg_hold_rx_buffer(struct rpmsg_endpoint *ept, void *rxbuf); + +/** + * @brief Releases the rx buffer for future reuse in vring. + * + * This API can be called at process context when the message in rx buffer is + * processed. + * + * @param ept The rpmsg endpoint + * @param rxbuf rx buffer with message payload + * + * @see rpmsg_hold_rx_buffer + */ +void rpmsg_release_rx_buffer(struct rpmsg_endpoint *ept, void *rxbuf); + +/** + * @brief Gets the tx buffer for message payload. + * + * This API can only be called at process context to get the tx buffer in vring. + * By this way, the application can directly put its message into the vring tx + * buffer without copy from an application buffer. + * It is the application responsibility to correctly fill the allocated tx + * buffer by data and passing correct parameters to the rpmsg_send_nocopy() or + * rpmsg_sendto_nocopy() function to perform data no-copy-send mechanism. + * + * @param ept Pointer to rpmsg endpoint + * @param len Pointer to store tx buffer size + * @param wait Boolean, wait or not for buffer to become available + * + * @return The tx buffer address on success and NULL on failure + * + * @see rpmsg_send_offchannel_nocopy + * @see rpmsg_sendto_nocopy + * @see rpmsg_send_nocopy + */ +void *rpmsg_get_tx_payload_buffer(struct rpmsg_endpoint *ept, + uint32_t *len, int wait); + +/** + * @brief Releases unused buffer. + * + * This API can be called when the Tx buffer reserved by + * rpmsg_get_tx_payload_buffer needs to be released without having been sent to + * the remote side. + * + * Note that the rpmsg virtio is not able to detect if a buffer has already + * been released. The user must prevent a double release (e.g. by resetting its + * buffer pointer to zero after the release). + * + * @param ept The rpmsg endpoint + * @param txbuf tx buffer with message payload + * + * @return + * - RPMSG_SUCCESS on success + * - RPMSG_ERR_PARAM on invalid parameter + * - RPMSG_ERR_PERM if service not implemented + * + * @see rpmsg_get_tx_payload_buffer + */ +int rpmsg_release_tx_buffer(struct rpmsg_endpoint *ept, void *txbuf); + +/** + * @brief Send a message in tx buffer reserved by + * rpmsg_get_tx_payload_buffer() across to the remote processor. + * + * This function sends buf of length len to the remote dst address, + * and uses src as the source address. + * The message will be sent to the remote processor which the ept + * endpoint belongs to. + * The application has to take the responsibility for: + * 1. tx buffer reserved (rpmsg_get_tx_payload_buffer() ) + * 2. filling the data to be sent into the pre-allocated tx buffer + * 3. not exceeding the buffer size when filling the data + * 4. data cache coherency + * + * After the rpmsg_send_offchannel_nocopy() function is issued the tx buffer is + * no more owned by the sending task and must not be touched anymore unless the + * rpmsg_send_offchannel_nocopy() function fails and returns an error. In that + * case application should try to re-issue the rpmsg_send_offchannel_nocopy() + * again. + * + * @param ept The rpmsg endpoint + * @param src The rpmsg endpoint local address + * @param dst The rpmsg endpoint remote address + * @param data TX buffer with message filled + * @param len Length of payload + * + * @return Number of bytes it has sent or negative error value on failure. + * + * @see rpmsg_get_tx_payload_buffer + * @see rpmsg_sendto_nocopy + * @see rpmsg_send_nocopy + */ +int rpmsg_send_offchannel_nocopy(struct rpmsg_endpoint *ept, uint32_t src, + uint32_t dst, const void *data, int len); + +/** + * @brief Sends a message in tx buffer allocated by + * rpmsg_get_tx_payload_buffer() across to the remote processor, specify dst. + * + * This function sends buf of length len to the remote dst address. + * The message will be sent to the remote processor which the ept + * endpoint belongs to, using ept's source address. + * The application has to take the responsibility for: + * 1. tx buffer allocation (rpmsg_get_tx_payload_buffer() ) + * 2. filling the data to be sent into the pre-allocated tx buffer + * 3. not exceeding the buffer size when filling the data + * 4. data cache coherency + * + * After the rpmsg_sendto_nocopy() function is issued the tx buffer is no more + * owned by the sending task and must not be touched anymore unless the + * rpmsg_sendto_nocopy() function fails and returns an error. In that case the + * application should try to re-issue the rpmsg_sendto_nocopy() again. + * + * @param ept The rpmsg endpoint + * @param data TX buffer with message filled + * @param len Length of payload + * @param dst Destination address + * + * @return Number of bytes it has sent or negative error value on failure. + * + * @see rpmsg_get_tx_payload_buffer + * @see rpmsg_send_offchannel_nocopy + * @see rpmsg_send_nocopy + */ +static inline int rpmsg_sendto_nocopy(struct rpmsg_endpoint *ept, + const void *data, int len, uint32_t dst) +{ + if (!ept) + return RPMSG_ERR_PARAM; + + return rpmsg_send_offchannel_nocopy(ept, ept->addr, dst, data, len); +} + +/** + * @brief Send a message in tx buffer reserved by + * rpmsg_get_tx_payload_buffer() across to the remote processor. + * + * This function sends buf of length len on the ept endpoint. + * The message will be sent to the remote processor which the ept + * endpoint belongs to, using ept's source and destination addresses. + * The application has to take the responsibility for: + * 1. tx buffer reserved (rpmsg_get_tx_payload_buffer() ) + * 2. filling the data to be sent into the pre-allocated tx buffer + * 3. not exceeding the buffer size when filling the data + * 4. data cache coherency + * + * After the rpmsg_send_nocopy() function is issued the tx buffer is no more + * owned by the sending task and must not be touched anymore unless the + * rpmsg_send_nocopy() function fails and returns an error. In that case the + * application should try to re-issue the rpmsg_send_nocopy() again. + * + * @param ept The rpmsg endpoint + * @param data TX buffer with message filled + * @param len Length of payload + * + * @return Number of bytes it has sent or negative error value on failure. + * + * @see rpmsg_get_tx_payload_buffer + * @see rpmsg_send_offchannel_nocopy + * @see rpmsg_sendto_nocopy + */ +static inline int rpmsg_send_nocopy(struct rpmsg_endpoint *ept, + const void *data, int len) +{ + if (!ept) + return RPMSG_ERR_PARAM; + + return rpmsg_send_offchannel_nocopy(ept, ept->addr, + ept->dest_addr, data, len); +} + +/** + * @brief Create rpmsg endpoint and register it to rpmsg device + * + * Create a RPMsg endpoint, initialize it with a name, source address, + * remoteproc address, endpoint callback, and destroy endpoint callback, + * and register it to the RPMsg device. + * + * In essence, an rpmsg endpoint represents a listener on the rpmsg bus, as + * it binds an rpmsg address with an rx callback handler. + * + * Rpmsg client should create an endpoint to discuss with remote. rpmsg client + * provide at least a channel name, a callback for message notification and by + * default endpoint source address should be set to RPMSG_ADDR_ANY. + * + * As an option Some rpmsg clients can specify an endpoint with a specific + * source address. + * + * @param ept Pointer to rpmsg endpoint + * @param rdev RPMsg device associated with the endpoint + * @param name Service name associated to the endpoint + * @param src Local address of the endpoint + * @param dest Target address of the endpoint + * @param cb Endpoint callback + * @param ns_unbind_cb Endpoint service unbind callback, called when remote + * ept is destroyed. + * + * @return 0 on success, or negative error value on failure. + */ +int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev, + const char *name, uint32_t src, uint32_t dest, + rpmsg_ept_cb cb, rpmsg_ns_unbind_cb ns_unbind_cb); + +/** + * @brief Destroy rpmsg endpoint and unregister it from rpmsg device + * + * It unregisters the rpmsg endpoint from the rpmsg device and calls the + * destroy endpoint callback if it is provided. + * + * @param ept Pointer to the rpmsg endpoint + */ +void rpmsg_destroy_ept(struct rpmsg_endpoint *ept); + +/** + * @brief Check if the rpmsg endpoint ready to send + * + * @param ept Pointer to rpmsg endpoint + * + * @return 1 if the rpmsg endpoint has both local addr and destination + * addr set, 0 otherwise + */ +static inline unsigned int is_rpmsg_ept_ready(struct rpmsg_endpoint *ept) +{ + return ept && ept->rdev && ept->dest_addr != RPMSG_ADDR_ANY; +} + +#if defined __cplusplus +} +#endif + +#endif /* _RPMSG_H_ */ diff --git a/libraries/openamp_arduino/src/openamp/rpmsg_retarget.h b/libraries/openamp_arduino/src/openamp/rpmsg_retarget.h index 0df3a794a..f020f6a79 100755 --- a/libraries/openamp_arduino/src/openamp/rpmsg_retarget.h +++ b/libraries/openamp_arduino/src/openamp/rpmsg_retarget.h @@ -1,119 +1,134 @@ -#ifndef RPMSG_RETARGET_H -#define RPMSG_RETARGET_H - -#include -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -/* File Operations System call definitions */ -#define OPEN_SYSCALL_ID 0x1UL -#define CLOSE_SYSCALL_ID 0x2UL -#define WRITE_SYSCALL_ID 0x3UL -#define READ_SYSCALL_ID 0x4UL -#define ACK_STATUS_ID 0x5UL - -#define TERM_SYSCALL_ID 0x6UL - -#define DEFAULT_PROXY_ENDPOINT 0xFFUL - -struct rpmsg_rpc_data; - -typedef int (*rpmsg_rpc_poll)(void *arg); -typedef void (*rpmsg_rpc_shutdown_cb)(struct rpmsg_rpc_data *rpc); - -struct rpmsg_rpc_syscall_header { - int32_t int_field1; - int32_t int_field2; - uint32_t data_len; -}; - -struct rpmsg_rpc_syscall { - uint32_t id; - struct rpmsg_rpc_syscall_header args; -}; - -struct rpmsg_rpc_data { - struct rpmsg_endpoint ept; - int ept_destroyed; - atomic_int nacked; - void *respbuf; - size_t respbuf_len; - rpmsg_rpc_poll poll; - void *poll_arg; - rpmsg_rpc_shutdown_cb shutdown_cb; - metal_mutex_t lock; - struct metal_spinlock buflock; -}; - -/** - * rpmsg_rpc_init - initialize RPMsg remote procedure call - * - * This function is to intialize the remote procedure call - * global data. RPMsg RPC will send request to remote and - * wait for callback. - * - * @rpc: pointer to the global remote procedure call data - * @rdev: pointer to the rpmsg device - * @ept_name: name of the endpoint used by RPC - * @ept_addr: address of the endpoint used by RPC - * @ept_raddr: remote address of the endpoint used by RPC - * @poll_arg: pointer to poll function argument - * @poll: poll function - * @shutdown_cb: shutdown callback function - * - * return 0 for success, and negative value for failure. - */ -int rpmsg_rpc_init(struct rpmsg_rpc_data *rpc, - struct rpmsg_device *rdev, - const char *ept_name, uint32_t ept_addr, - uint32_t ept_raddr, - void *poll_arg, rpmsg_rpc_poll poll, - rpmsg_rpc_shutdown_cb shutdown_cb); - -/** - * rpmsg_rpc_release - release RPMsg remote procedure call - * - * This function is to release remoteproc procedure call - * global data. - * - * @rpc: pointer to the globacl remote procedure call - */ -void rpmsg_rpc_release(struct rpmsg_rpc_data *rpc); - -/** - * rpmsg_rpc_send - Request RPMsg RPC call - * - * This function sends RPC request it will return with the length - * of data and the response buffer. - * - * @rpc: pointer to remoteproc procedure call data struct - * @req: pointer to request buffer - * @len: length of the request data - * @resp: pointer to where store the response buffer - * @resp_len: length of the response buffer - * - * return length of the received response, negative value for failure. - */ -int rpmsg_rpc_send(struct rpmsg_rpc_data *rpc, - void *req, size_t len, - void *resp, size_t resp_len); - -/** - * rpmsg_set_default_rpc - set default RPMsg RPC data - * - * The default RPC data is used to redirect standard C file operations - * to RPMsg channels. - * - * @rpc: pointer to remoteproc procedure call data struct - */ -void rpmsg_set_default_rpc(struct rpmsg_rpc_data *rpc); - -#if defined __cplusplus -} -#endif - -#endif /* RPMSG_RETARGET_H */ +/* + * Copyright (c) 2014, Mentor Graphics Corporation + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef RPMSG_RETARGET_H +#define RPMSG_RETARGET_H + +#include +#include +#include + +#if defined __cplusplus +extern "C" { +#endif + +/* File Operations System call definitions */ +#define OPEN_SYSCALL_ID 0x1UL +#define CLOSE_SYSCALL_ID 0x2UL +#define WRITE_SYSCALL_ID 0x3UL +#define READ_SYSCALL_ID 0x4UL +#define ACK_STATUS_ID 0x5UL + +#define TERM_SYSCALL_ID 0x6UL + +#define DEFAULT_PROXY_ENDPOINT 0xFFUL + +struct rpmsg_rpc_data; + +typedef int (*rpmsg_rpc_poll)(void *arg); +typedef void (*rpmsg_rpc_shutdown_cb)(struct rpmsg_rpc_data *rpc); + +struct rpmsg_rpc_syscall_header { + int32_t int_field1; + int32_t int_field2; + uint32_t data_len; +}; + +struct rpmsg_rpc_syscall { + uint32_t id; + struct rpmsg_rpc_syscall_header args; +}; + +struct rpmsg_rpc_data { + struct rpmsg_endpoint ept; + int ept_destroyed; + atomic_flag nacked; + void *respbuf; + size_t respbuf_len; + rpmsg_rpc_poll poll; + void *poll_arg; + rpmsg_rpc_shutdown_cb shutdown_cb; + metal_mutex_t lock; + struct metal_spinlock buflock; +}; + +/** + * @internal + * + * @brief Initialize RPMsg remote procedure call + * + * This function is to initialize the remote procedure call + * global data. RPMsg RPC will send request to remote and + * wait for callback. + * + * @param rpc Pointer to the global remote procedure call data + * @param rdev Pointer to the rpmsg device + * @param ept_name Name of the endpoint used by RPC + * @param ept_addr Address of the endpoint used by RPC + * @param ept_raddr Remote address of the endpoint used by RPC + * @param poll_arg Pointer to poll function argument + * @param poll Poll function + * @param shutdown_cb Shutdown callback function + * + * @return 0 for success, and negative value for failure. + */ +int rpmsg_rpc_init(struct rpmsg_rpc_data *rpc, + struct rpmsg_device *rdev, + const char *ept_name, uint32_t ept_addr, + uint32_t ept_raddr, + void *poll_arg, rpmsg_rpc_poll poll, + rpmsg_rpc_shutdown_cb shutdown_cb); + +/** + * @internal + * + * @brief Release RPMsg remote procedure call + * + * This function is to release remoteproc procedure call + * global data. + * + * @param rpc Pointer to the global remote procedure call + */ +void rpmsg_rpc_release(struct rpmsg_rpc_data *rpc); + +/** + * @internal + * + * @brief Request RPMsg RPC call + * + * This function sends RPC request it will return with the length + * of data and the response buffer. + * + * @param rpc Pointer to remoteproc procedure call data struct + * @param req Pointer to request buffer + * @param len Length of the request data + * @param resp Pointer to where store the response buffer + * @param resp_len Length of the response buffer + * + * @return Length of the received response, negative value for failure. + */ +int rpmsg_rpc_send(struct rpmsg_rpc_data *rpc, + void *req, size_t len, + void *resp, size_t resp_len); + +/** + * @internal + * + * @brief Set default RPMsg RPC data + * + * The default RPC data is used to redirect standard C file operations + * to RPMsg channels. + * + * @param rpc Pointer to remoteproc procedure call data struct + */ +void rpmsg_set_default_rpc(struct rpmsg_rpc_data *rpc); + +#if defined __cplusplus +} +#endif + +#endif /* RPMSG_RETARGET_H */ diff --git a/libraries/openamp_arduino/src/openamp/rpmsg_rpc_client_server.h b/libraries/openamp_arduino/src/openamp/rpmsg_rpc_client_server.h new file mode 100644 index 000000000..f9407849e --- /dev/null +++ b/libraries/openamp_arduino/src/openamp/rpmsg_rpc_client_server.h @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2021, L&T Technology Services Ltd. + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef RPMSG_RPC_CLIENT_SERVER_H +#define RPMSG_RPC_CLIENT_SERVER_H + +#include +#include + +#if defined __cplusplus +extern "C" { +#endif + +#define RPMSG_RPC_OK 0 +#define RPMSG_RPC_INVALID_ID (-1L) +#define RPMSG_RPC_SERVICE_NAME "rpmsg-rpc" + +/* RPMSG_BUFFER_SIZE = 512 + * sizeof(struct rpmsg_hdr) = 16 + * RPMSG_BUFFER_SIZE - sizeof(struct rpmsg_hdr) - 1 = 495 + * Aligning to 64 bits -> 488UL + */ +#define MAX_BUF_LEN 488UL +#define MAX_FUNC_ID_LEN sizeof(unsigned long int) + +struct rpmsg_rpc_clt; +struct rpmsg_rpc_svr; + +typedef void (*rpmsg_rpc_shutdown_cb)(struct rpmsg_rpc_clt *rpc); +typedef void (*app_cb)(struct rpmsg_rpc_clt *rpc, int statust, void *data, + size_t len); +typedef int (*rpmsg_rpc_syscall_cb)(void *data, struct rpmsg_rpc_svr *rpcs); + +/** + * struct rpmsg_rpc_request - rpc request message + * + * @id: service id + * @params: request params + * + */ +struct rpmsg_rpc_request { + uint32_t id; + unsigned char params[MAX_BUF_LEN]; +}; + +/** @brief RPC request message */ +METAL_PACKED_BEGIN +struct rpmsg_rpc_answer { + /** Service ID */ + uint32_t id; + + /** Status of RPC */ + int32_t status; + + /** Answer params */ + unsigned char params[MAX_BUF_LEN]; +} METAL_PACKED_END; + +/** @brief Table for services */ +struct rpmsg_rpc_services { + /** Service ID */ + uint32_t id; + + /** ID callback */ + rpmsg_rpc_syscall_cb cb_function; +}; + +/** @brief Table for client services */ +struct rpmsg_rpc_client_services { + /** Service ID */ + uint32_t id; + + /** ID callback */ + app_cb cb; +}; + +/** + * @brief Server remote procedure call data + * + * RPMsg RPC will send request to endpoint + */ +struct rpmsg_rpc_svr { + /** RPMsg destination endpoint structure */ + struct rpmsg_endpoint ept; + + /** Service table */ + const struct rpmsg_rpc_services *services; + + /** Number of services */ + unsigned int n_services; +}; + +/** + * @brief Client remote procedure call data + * + * RPMsg RPC will send request to remote and + * wait for callback. + */ +struct rpmsg_rpc_clt { + /** RPMsg endpoint associated with the call */ + struct rpmsg_endpoint ept; + + /** Shutdown callback function */ + rpmsg_rpc_shutdown_cb shutdown_cb; + + /** Service table */ + const struct rpmsg_rpc_client_services *services; + + /** Number of services */ + unsigned int n_services; +}; + +/** + * @internal + * + * @brief Release RPMsg remote procedure call + * + * This function is to release remoteproc procedure call service + * + * @param rpc Pointer to the client remote procedure call data + */ +void rpmsg_rpc_client_release(struct rpmsg_rpc_clt *rpc); + +/** + * @internal + * + * @brief Initialize RPMsg remote procedure call + * + * This function is to initialize the remote procedure call + * client data. RPMsg RPC will send request to remote and + * wait for callback and load services to table + * + * @param rpc Pointer to the client remote procedure call data + * @param rdev Pointer to the rpmsg device + * @param shutdown_cb Shutdown callback function + * @param services Pointer to service table + * @param len Length of table + * + * @return 0 for success, and negative value for failure + */ +int rpmsg_rpc_client_init(struct rpmsg_rpc_clt *rpc, + struct rpmsg_device *rdev, + rpmsg_rpc_shutdown_cb shutdown_cb, + const struct rpmsg_rpc_client_services *services, + int len); + +/** + * @internal + * + * @brief Initialize RPMsg rpc for server + * + * This function create endpoint and loads services into table + * + * @param rpcs Pointer to the server rpc + * @param rdev Pointer to the rpmsg device + * @param services Pointer to service table + * @param len Length of table + * @param rpmsg_service_server_unbind Unbind function callback + * + * @return 0 for success, and negative value for failure + */ +int rpmsg_rpc_server_init(struct rpmsg_rpc_svr *rpcs, struct rpmsg_device *rdev, + const struct rpmsg_rpc_services *services, int len, + rpmsg_ns_unbind_cb rpmsg_service_server_unbind); + +/** + * @internal + * + * @brief Request RPMsg RPC call + * + * @param rpc Pointer to client remoteproc procedure call + * data + * @param rpc_id Function id + * @param request_param Pointer to request buffer + * @param req_param_size Length of the request data + * + * @return Length of the received response, negative value for failure. + */ +int rpmsg_rpc_client_send(struct rpmsg_rpc_clt *rpc, + unsigned int rpc_id, void *request_param, + size_t req_param_size); + +/** + * @internal + * + * @brief Request RPMsg RPC call + * + * This function sends RPC request + * + * @param rpcs Pointer to server rpc data + * @param rpc_id Function id + * @param status Status of rpc + * @param request_param Pointer to request buffer + * @param param_size Length of the request data + * + * @return Length of the received response, negative value for failure. + */ +int rpmsg_rpc_server_send(struct rpmsg_rpc_svr *rpcs, uint32_t rpc_id, + int status, void *request_param, + size_t param_size); + +#if defined __cplusplus +} +#endif + +#endif /* RPMSG_RPC_CLIENT_SERVER_H */ diff --git a/libraries/openamp_arduino/src/openamp/rpmsg_virtio.h b/libraries/openamp_arduino/src/openamp/rpmsg_virtio.h index ea0a255d5..aea2edf56 100755 --- a/libraries/openamp_arduino/src/openamp/rpmsg_virtio.h +++ b/libraries/openamp_arduino/src/openamp/rpmsg_virtio.h @@ -1,190 +1,304 @@ -/* - * rpmsg based on virtio - * - * Copyright (C) 2018 Linaro, Inc. - * - * All rights reserved. - * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _RPMSG_VIRTIO_H_ -#define _RPMSG_VIRTIO_H_ - -#include -#include -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -/* Configurable parameters */ -#ifndef RPMSG_BUFFER_SIZE -#define RPMSG_BUFFER_SIZE (512) -#endif - -/* The feature bitmap for virtio rpmsg */ -#define VIRTIO_RPMSG_F_NS 0 /* RP supports name service notifications */ - -struct rpmsg_virtio_shm_pool; -/** - * struct rpmsg_virtio_shm_pool - shared memory pool used for rpmsg buffers - * @get_buffer: function to get buffer from the pool - * @base: base address of the memory pool - * @avail: available memory size - * @size: total pool size - */ -struct rpmsg_virtio_shm_pool { - void *base; - size_t avail; - size_t size; -}; - -/** - * struct rpmsg_virtio_device - representation of a rpmsg device based on virtio - * @rdev: rpmsg device, first property in the struct - * @vdev: pointer to the virtio device - * @rvq: pointer to receive virtqueue - * @svq: pointer to send virtqueue - * @shbuf_io: pointer to the shared buffer I/O region - * @shpool: pointer to the shared buffers pool - * @endpoints: list of endpoints. - */ -struct rpmsg_virtio_device { - struct rpmsg_device rdev; - struct virtio_device *vdev; - struct virtqueue *rvq; - struct virtqueue *svq; - struct metal_io_region *shbuf_io; - struct rpmsg_virtio_shm_pool *shpool; -}; - -#define RPMSG_REMOTE VIRTIO_DEV_SLAVE -#define RPMSG_MASTER VIRTIO_DEV_MASTER -static inline unsigned int - rpmsg_virtio_get_role(struct rpmsg_virtio_device *rvdev) -{ - return rvdev->vdev->role; -} - -static inline void rpmsg_virtio_set_status(struct rpmsg_virtio_device *rvdev, - uint8_t status) -{ - rvdev->vdev->func->set_status(rvdev->vdev, status); -} - -static inline uint8_t rpmsg_virtio_get_status(struct rpmsg_virtio_device *rvdev) -{ - return rvdev->vdev->func->get_status(rvdev->vdev); -} - -static inline uint32_t - rpmsg_virtio_get_features(struct rpmsg_virtio_device *rvdev) -{ - return rvdev->vdev->func->get_features(rvdev->vdev); -} - -static inline int - rpmsg_virtio_create_virtqueues(struct rpmsg_virtio_device *rvdev, - int flags, unsigned int nvqs, - const char *names[], - vq_callback * callbacks[]) -{ - return virtio_create_virtqueues(rvdev->vdev, flags, nvqs, names, - callbacks); -} - -/** - * rpmsg_virtio_get_buffer_size - get rpmsg virtio buffer size - * - * @rdev - pointer to the rpmsg device - * - * @return - next available buffer size for text, negative value for failure - */ -int rpmsg_virtio_get_buffer_size(struct rpmsg_device *rdev); - -/** - * rpmsg_init_vdev - initialize rpmsg virtio device - * Master side: - * Initialize RPMsg virtio queues and shared buffers, the address of shm can be - * ANY. In this case, function will get shared memory from system shared memory - * pools. If the vdev has RPMsg name service feature, this API will create an - * name service endpoint. - * - * Slave side: - * This API will not return until the driver ready is set by the master side. - * - * @param rvdev - pointer to the rpmsg virtio device - * @param vdev - pointer to the virtio device - * @param ns_bind_cb - callback handler for name service announcement without - * local endpoints waiting to bind. - * @param shm_io - pointer to the share memory I/O region. - * @param shpool - pointer to shared memory pool. rpmsg_virtio_init_shm_pool has - * to be called first to fill this structure. - * - * @return - status of function execution - */ -int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, - struct virtio_device *vdev, - rpmsg_ns_bind_cb ns_bind_cb, - struct metal_io_region *shm_io, - struct rpmsg_virtio_shm_pool *shpool); - -/** - * rpmsg_deinit_vdev - deinitialize rpmsg virtio device - * - * @param rvdev - pointer to the rpmsg virtio device - */ -void rpmsg_deinit_vdev(struct rpmsg_virtio_device *rvdev); - -/** - * rpmsg_virtio_init_shm_pool - initialize default shared buffers pool - * - * RPMsg virtio has default shared buffers pool implementation. - * The memory assigned to this pool will be dedicated to the RPMsg - * virtio. This function has to be called before calling rpmsg_init_vdev, - * to initialize the rpmsg_virtio_shm_pool structure. - * - * @param shpool - pointer to the shared buffers pool structure - * @param shbuf - pointer to the beginning of shared buffers - * @param size - shared buffers total size - */ -void rpmsg_virtio_init_shm_pool(struct rpmsg_virtio_shm_pool *shpool, - void *shbuf, size_t size); - -/** - * rpmsg_virtio_get_rpmsg_device - get RPMsg device from RPMsg virtio device - * - * @param rvdev - pointer to RPMsg virtio device - * @return - RPMsg device pointed by RPMsg virtio device - */ -static inline struct rpmsg_device * -rpmsg_virtio_get_rpmsg_device(struct rpmsg_virtio_device *rvdev) -{ - return &rvdev->rdev; -} - -/** - * rpmsg_virtio_shm_pool_get_buffer - get buffer in the shared memory pool - * - * RPMsg virtio has default shared buffers pool implementation. - * The memory assigned to this pool will be dedicated to the RPMsg - * virtio. If you prefer to have other shared buffers allocation, - * you can implement your rpmsg_virtio_shm_pool_get_buffer function. - * - * @param shpool - pointer to the shared buffers pool - * @param size - shared buffers total size - * @return - buffer pointer if free buffer is available, NULL otherwise. - */ -metal_weak void * -rpmsg_virtio_shm_pool_get_buffer(struct rpmsg_virtio_shm_pool *shpool, - size_t size); - -#if defined __cplusplus -} -#endif - -#endif /* _RPMSG_VIRTIO_H_ */ +/* + * rpmsg based on virtio + * + * Copyright (C) 2018 Linaro, Inc. + * + * All rights reserved. + * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _RPMSG_VIRTIO_H_ +#define _RPMSG_VIRTIO_H_ + +#include +#include +#include +#include +#include + +#if defined __cplusplus +extern "C" { +#endif + +/* Configurable parameters */ +#ifndef RPMSG_BUFFER_SIZE +#define RPMSG_BUFFER_SIZE (512) +#endif + +/* The feature bitmap for virtio rpmsg */ +#define VIRTIO_RPMSG_F_NS 0 /* RP supports name service notifications */ + +#ifdef VIRTIO_CACHED_BUFFERS +#warning "VIRTIO_CACHED_BUFFERS is deprecated, please use VIRTIO_USE_DCACHE" +#endif +#if defined(VIRTIO_CACHED_BUFFERS) || defined(VIRTIO_USE_DCACHE) +#define BUFFER_FLUSH(x, s) CACHE_FLUSH(x, s) +#define BUFFER_INVALIDATE(x, s) CACHE_INVALIDATE(x, s) +#else +#define BUFFER_FLUSH(x, s) do { } while (0) +#define BUFFER_INVALIDATE(x, s) do { } while (0) +#endif /* VIRTIO_CACHED_BUFFERS || VIRTIO_USE_DCACHE */ + +/** @brief Shared memory pool used for RPMsg buffers */ +struct rpmsg_virtio_shm_pool { + /** Base address of the memory pool */ + void *base; + + /** Available memory size */ + size_t avail; + + /** Total pool size */ + size_t size; +}; + +/** + * @brief Configuration of RPMsg device based on virtio + * + * This structure is used by the RPMsg virtio host to configure the virtiio + * layer. + */ +struct rpmsg_virtio_config { + /** The size of the buffer used to send data from host to remote */ + uint32_t h2r_buf_size; + + /** The size of the buffer used to send data from remote to host */ + uint32_t r2h_buf_size; + + /** The flag for splitting shared memory pool to TX and RX */ + bool split_shpool; +}; + +/** @brief Representation of a RPMsg device based on virtio */ +struct rpmsg_virtio_device { + /** RPMsg device */ + struct rpmsg_device rdev; + + /** Structure containing virtio configuration */ + struct rpmsg_virtio_config config; + + /** Pointer to the virtio device */ + struct virtio_device *vdev; + + /** Pointer to receive virtqueue */ + struct virtqueue *rvq; + + /** Pointer to send virtqueue */ + struct virtqueue *svq; + + /** Pointer to the shared buffer I/O region */ + struct metal_io_region *shbuf_io; + + /** Pointer to the shared buffers pool */ + struct rpmsg_virtio_shm_pool *shpool; + + /** + * RPMsg buffer reclaimer that contains buffers released by the + * \ref rpmsg_virtio_release_tx_buffer function + */ + struct metal_list reclaimer; +}; + +#define RPMSG_REMOTE VIRTIO_DEV_DEVICE +#define RPMSG_HOST VIRTIO_DEV_DRIVER + +#define RPMSG_SLAVE deprecated_rpmsg_slave() +#define RPMSG_MASTER deprecated_rpmsg_master() + +__deprecated static inline int deprecated_rpmsg_master(void) +{ + /* "RPMSG_MASTER is deprecated, please use RPMSG_HOST" */ + return RPMSG_HOST; +} + +__deprecated static inline int deprecated_rpmsg_slave(void) +{ + /* "RPMSG_SLAVE is deprecated, please use RPMSG_REMOTE" */ + return RPMSG_REMOTE; +} + +static inline unsigned int +rpmsg_virtio_get_role(struct rpmsg_virtio_device *rvdev) +{ + return rvdev->vdev->role; +} + +static inline void rpmsg_virtio_set_status(struct rpmsg_virtio_device *rvdev, + uint8_t status) +{ + rvdev->vdev->func->set_status(rvdev->vdev, status); +} + +static inline uint8_t rpmsg_virtio_get_status(struct rpmsg_virtio_device *rvdev) +{ + return rvdev->vdev->func->get_status(rvdev->vdev); +} + +static inline uint32_t +rpmsg_virtio_get_features(struct rpmsg_virtio_device *rvdev) +{ + return rvdev->vdev->func->get_features(rvdev->vdev); +} + +static inline void +rpmsg_virtio_read_config(struct rpmsg_virtio_device *rvdev, + uint32_t offset, void *dst, int length) +{ + rvdev->vdev->func->read_config(rvdev->vdev, offset, dst, length); +} + +static inline void +rpmsg_virtio_write_config(struct rpmsg_virtio_device *rvdev, + uint32_t offset, void *dst, int length) +{ + rvdev->vdev->func->write_config(rvdev->vdev, offset, dst, length); +} + +static inline int +rpmsg_virtio_create_virtqueues(struct rpmsg_virtio_device *rvdev, + int flags, unsigned int nvqs, + const char *names[], + vq_callback *callbacks) +{ + return virtio_create_virtqueues(rvdev->vdev, flags, nvqs, names, + callbacks, NULL); +} + +/** + * @brief Get rpmsg virtio buffer size + * + * @param rdev Pointer to the rpmsg device + * + * @return Next available buffer size for text, negative value for failure + */ +int rpmsg_virtio_get_buffer_size(struct rpmsg_device *rdev); + +/** + * @brief Initialize rpmsg virtio device + * + * Host side: + * Initialize RPMsg virtio queues and shared buffers, the address of shm can be + * ANY. In this case, function will get shared memory from system shared memory + * pools. If the vdev has the RPMsg name service feature, this API will create + * a name service endpoint. + * + * Remote side: + * This API will not return until the driver ready is set by the host side. + * + * @param rvdev Pointer to the rpmsg virtio device + * @param vdev Pointer to the virtio device + * @param ns_bind_cb Callback handler for name service announcement without + * local endpoints waiting to bind. + * @param shm_io Pointer to the share memory I/O region. + * @param shpool Pointer to shared memory pool. + * rpmsg_virtio_init_shm_pool has to be called first to + * fill this structure. + * + * @return Status of function execution + */ +int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, + struct virtio_device *vdev, + rpmsg_ns_bind_cb ns_bind_cb, + struct metal_io_region *shm_io, + struct rpmsg_virtio_shm_pool *shpool); + +/** + * @brief Initialize rpmsg virtio device with config + * + * Host side: + * Initialize RPMsg virtio queues and shared buffers, the address of shm can be + * ANY. In this case, function will get shared memory from system shared memory + * pools. If the vdev has the RPMsg name service feature, this API will create + * a name service endpoint. + * Sizes of virtio data buffers used by the initialized RPMsg instance are set + * to values read from the passed configuration structure. + * + * Remote side: + * This API will not return until the driver ready is set by the host side. + * Sizes of virtio data buffers are set by the host side. Values passed in the + * configuration structure have no effect. + * + * @param rvdev Pointer to the rpmsg virtio device + * @param vdev Pointer to the virtio device + * @param ns_bind_cb Callback handler for name service announcement without + * local endpoints waiting to bind. + * @param shm_io Pointer to the share memory I/O region. + * @param shpool Pointer to shared memory pool array. + * If the config->split_shpool is turn on, the array will + * contain two elements, the shpool of txshpool and + * rxshpool, Otherwise, the array has only one element, + * and txshpool rxshpool shares a shpool. + * And rpmsg_virtio_init_shm_pool has to be called first + * to fill each shpool in this array. + * @param config Pointer to configuration structure + * + * @return Status of function execution + */ +int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev, + struct virtio_device *vdev, + rpmsg_ns_bind_cb ns_bind_cb, + struct metal_io_region *shm_io, + struct rpmsg_virtio_shm_pool *shpool, + const struct rpmsg_virtio_config *config); + +/** + * @brief Deinitialize rpmsg virtio device + * + * @param rvdev Pointer to the rpmsg virtio device + */ +void rpmsg_deinit_vdev(struct rpmsg_virtio_device *rvdev); + +/** + * @brief Initialize default shared buffers pool + * + * RPMsg virtio has default shared buffers pool implementation. + * The memory assigned to this pool will be dedicated to the RPMsg + * virtio. This function has to be called before calling rpmsg_init_vdev, + * to initialize the rpmsg_virtio_shm_pool structure. + * + * @param shpool Pointer to the shared buffers pool structure + * @param shbuf Pointer to the beginning of shared buffers + * @param size Shared buffers total size + */ +void rpmsg_virtio_init_shm_pool(struct rpmsg_virtio_shm_pool *shpool, + void *shbuf, size_t size); + +/** + * @brief Get RPMsg device from RPMsg virtio device + * + * @param rvdev Pointer to RPMsg virtio device + * + * @return RPMsg device pointed by RPMsg virtio device + */ +static inline struct rpmsg_device * +rpmsg_virtio_get_rpmsg_device(struct rpmsg_virtio_device *rvdev) +{ + if (!rvdev) + return NULL; + + return &rvdev->rdev; +} + +/** + * @brief Get buffer in the shared memory pool + * + * RPMsg virtio has default shared buffers pool implementation. + * The memory assigned to this pool will be dedicated to the RPMsg + * virtio. If you prefer to have other shared buffers allocation, + * you can implement your rpmsg_virtio_shm_pool_get_buffer function. + * + * @param shpool Pointer to the shared buffers pool + * @param size Shared buffers total size + * + * @return Buffer pointer if free buffer is available, NULL otherwise. + */ +metal_weak void * +rpmsg_virtio_shm_pool_get_buffer(struct rpmsg_virtio_shm_pool *shpool, + size_t size); + +#if defined __cplusplus +} +#endif + +#endif /* _RPMSG_VIRTIO_H_ */ diff --git a/libraries/openamp_arduino/src/openamp/rsc_table_parser.h b/libraries/openamp_arduino/src/openamp/rsc_table_parser.h index 6802d03fd..d86da7497 100755 --- a/libraries/openamp_arduino/src/openamp/rsc_table_parser.h +++ b/libraries/openamp_arduino/src/openamp/rsc_table_parser.h @@ -1,64 +1,83 @@ -/* - * Copyright (c) 2014, Mentor Graphics Corporation - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef RSC_TABLE_PARSER_H -#define RSC_TABLE_PARSER_H - -#include - -#if defined __cplusplus -extern "C" { -#endif - -#define RSC_TAB_SUPPORTED_VERSION 1 -#define RSC_TAB_HEADER_SIZE 12 -#define RSC_TAB_MAX_VRINGS 2 - -/* Standard control request handling. */ -typedef int (*rsc_handler) (struct remoteproc *rproc, void *rsc); - -/** - * handle_rsc_table - * - * This function parses resource table. - * - * @param rproc - pointer to remote remoteproc - * @param rsc_table - resource table to parse - * @param size - size of rsc table - * @param io - pointer to the resource table I/O region - * It can be NULL if the resource table - * is in the local memory. - * - * @returns - execution status - * - */ -int handle_rsc_table(struct remoteproc *rproc, - struct resource_table *rsc_table, int len, - struct metal_io_region *io); -int handle_carve_out_rsc(struct remoteproc *rproc, void *rsc); -int handle_trace_rsc(struct remoteproc *rproc, void *rsc); -int handle_vdev_rsc(struct remoteproc *rproc, void *rsc); -int handle_vendor_rsc(struct remoteproc *rproc, void *rsc); - -/** - * find_rsc - * - * find out location of a resource type in the resource table. - * - * @rsc_table - pointer to the resource table - * @rsc_type - type of the resource - * @index - index of the resource of the specified type - * - * return the offset to the resource on success, or 0 on failure - */ -size_t find_rsc(void *rsc_table, unsigned int rsc_type, unsigned int index); - -#if defined __cplusplus -} -#endif - -#endif /* RSC_TABLE_PARSER_H */ +/* + * Copyright (c) 2014, Mentor Graphics Corporation + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef RSC_TABLE_PARSER_H +#define RSC_TABLE_PARSER_H + +#include + +#if defined __cplusplus +extern "C" { +#endif + +#define RSC_TAB_SUPPORTED_VERSION 1 + +/* Standard control request handling. */ +typedef int (*rsc_handler)(struct remoteproc *rproc, void *rsc); + +/** + * @internal + * + * @brief This function parses resource table. + * + * @param rproc Pointer to remote remoteproc + * @param rsc_table Resource table to parse + * @param len Size of rsc table + * @param io Pointer to the resource table I/O region + * It can be NULL if the resource table + * is in the local memory. + * + * @return Execution status + */ +int handle_rsc_table(struct remoteproc *rproc, + struct resource_table *rsc_table, size_t len, + struct metal_io_region *io); + +/** + * @internal + * + * @brief Carveout resource handler. + * + * @param rproc Pointer to remote remoteproc + * @param rsc Pointer to carveout resource + * + * @return 0 for success, or negative value for failure + */ +int handle_carve_out_rsc(struct remoteproc *rproc, void *rsc); + +/** + * @internal + * + * @brief Trace resource handler. + * + * @param rproc Pointer to remote remoteproc + * @param rsc Pointer to trace resource + * + * @return No service error + */ +int handle_trace_rsc(struct remoteproc *rproc, void *rsc); +int handle_vdev_rsc(struct remoteproc *rproc, void *rsc); +int handle_vendor_rsc(struct remoteproc *rproc, void *rsc); + +/** + * @internal + * + * @brief Find out location of a resource type in the resource table. + * + * @param rsc_table Pointer to the resource table + * @param rsc_type Type of the resource + * @param index Index of the resource of the specified type + * + * @return The offset to the resource on success, or 0 on failure + */ +size_t find_rsc(void *rsc_table, unsigned int rsc_type, unsigned int index); + +#if defined __cplusplus +} +#endif + +#endif /* RSC_TABLE_PARSER_H */ diff --git a/libraries/openamp_arduino/src/openamp/version.h b/libraries/openamp_arduino/src/openamp/version.h new file mode 100644 index 000000000..9ee78389d --- /dev/null +++ b/libraries/openamp_arduino/src/openamp/version.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2021, STMicroelectronics. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * @file version.h + * @brief Library version information for OpenAMP. + */ + +#ifndef __OPENAMP_VERSION__H__ +#define __OPENAMP_VERSION__H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup versions Library Version Interfaces + * @{ + */ + +/** + * @brief Library major version number. + * + * Return the major version number of the library linked into the application. + * This is required to match the value of LIB_VERSION_MAJOR, which is the major + * version of the library that the application was compiled against. + * + * @return Library major version number. + * + * @see PROJECT_VERSION_MAJOR + */ +extern int openamp_version_major(void); + +/** + * @brief Library minor version number. + * + * Return the minor version number of the library linked into the application. + * This could differ from the value of LIB_VERSION_MINOR, which is the minor + * version of the library that the application was compiled against. + * + * @return Library minor version number. + * + * @see PROJECT_VERSION_MINOR + */ +extern int openamp_version_minor(void); + +/** + * @brief Library patch level. + * + * Return the patch level of the library linked into the application. This + * could differ from the value of LIB_VERSION_PATCH, which is the patch level of + * the library that the application was compiled against. + * + * @return Library patch level. + * + * @see PROJECT_VERSION_PATCH + */ +extern int openamp_version_patch(void); + +/** + * @brief Library version string. + * + * Return the version string of the library linked into the application. This + * could differ from the value of LIB_VERSION, which is the version string of + * the library that the application was compiled against. + * + * @return Library version string. + * + * @see PROJECT_VERSION + */ +extern const char *openamp_version(void); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __OPENAMP_VERSION__H__ */ diff --git a/libraries/openamp_arduino/src/openamp/virtio.h b/libraries/openamp_arduino/src/openamp/virtio.h index 51a4740f5..9febd1eaf 100755 --- a/libraries/openamp_arduino/src/openamp/virtio.h +++ b/libraries/openamp_arduino/src/openamp/virtio.h @@ -1,176 +1,499 @@ -/* - * SPDX-License-Identifier: BSD-3-Clause - * - * $FreeBSD$ - */ - -#ifndef _VIRTIO_H_ -#define _VIRTIO_H_ - -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -/* TODO: define this as compiler flags */ -#ifndef VIRTIO_MAX_NUM_VRINGS -#define VIRTIO_MAX_NUM_VRINGS 2 -#endif - -/* VirtIO device IDs. */ -#define VIRTIO_ID_NETWORK 0x01UL -#define VIRTIO_ID_BLOCK 0x02UL -#define VIRTIO_ID_CONSOLE 0x03UL -#define VIRTIO_ID_ENTROPY 0x04UL -#define VIRTIO_ID_BALLOON 0x05UL -#define VIRTIO_ID_IOMEMORY 0x06UL -#define VIRTIO_ID_RPMSG 0x07UL /* remote processor messaging */ -#define VIRTIO_ID_SCSI 0x08UL -#define VIRTIO_ID_9P 0x09UL -#define VIRTIO_DEV_ANY_ID (-1)UL - -/* Status byte for guest to report progress. */ -#define VIRTIO_CONFIG_STATUS_ACK 0x01 -#define VIRTIO_CONFIG_STATUS_DRIVER 0x02 -#define VIRTIO_CONFIG_STATUS_DRIVER_OK 0x04 -#define VIRTIO_CONFIG_STATUS_NEEDS_RESET 0x40 -#define VIRTIO_CONFIG_STATUS_FAILED 0x80 - -/* Virtio device role */ -#define VIRTIO_DEV_MASTER 0UL -#define VIRTIO_DEV_SLAVE 1UL - -struct virtio_device_id { - uint32_t device; - uint32_t vendor; -}; - -/* - * Generate interrupt when the virtqueue ring is - * completely used, even if we've suppressed them. - */ -#define VIRTIO_F_NOTIFY_ON_EMPTY (1 << 24) - -/* - * The guest should never negotiate this feature; it - * is used to detect faulty drivers. - */ -#define VIRTIO_F_BAD_FEATURE (1 << 30) - -/* - * Some VirtIO feature bits (currently bits 28 through 31) are - * reserved for the transport being used (eg. virtio_ring), the - * rest are per-device feature bits. - */ -#define VIRTIO_TRANSPORT_F_START 28 -#define VIRTIO_TRANSPORT_F_END 32 - -typedef void (*virtio_dev_reset_cb)(struct virtio_device *vdev); - -struct virtio_dispatch; - -struct virtio_feature_desc { - uint32_t vfd_val; - const char *vfd_str; -}; - -/** - * struct proc_shm - * - * This structure is maintained by hardware interface layer for - * shared memory information. The shared memory provides buffers - * for use by the vring to exchange messages between the cores. - * - */ -struct virtio_buffer_info { - /* Start address of shared memory used for buffers. */ - void *vaddr; - /* Start physical address of shared memory used for buffers. */ - metal_phys_addr_t paddr; - /* sharmed memory I/O region */ - struct metal_io_region *io; - /* Size of shared memory. */ - unsigned long size; -}; - -/** - * struct remoteproc_vring - remoteproc vring structure - * @vq virtio queue - * @va logical address - * @notifyid vring notify id - * @num_descs number of descriptors - * @align vring alignment - * @io metal I/O region of the vring memory, can be NULL - */ -struct virtio_vring_info { - struct virtqueue *vq; - struct vring_alloc_info info; - uint32_t notifyid; - struct metal_io_region *io; -}; - -/* - * Structure definition for virtio devices for use by the - * applications/drivers - */ - -struct virtio_device { - uint32_t index; /**< unique position on the virtio bus */ - struct virtio_device_id id; /**< the device type identification - * (used to match it with a driver - */ - uint64_t features; /**< the features supported by both ends. */ - unsigned int role; /**< if it is virtio backend or front end. */ - virtio_dev_reset_cb reset_cb; /**< user registered device callback */ - const struct virtio_dispatch *func; /**< Virtio dispatch table */ - void *priv; /**< TODO: remove pointer to virtio_device private data */ - unsigned int vrings_num; /**< number of vrings */ - struct virtio_vring_info *vrings_info; -}; - -/* - * Helper functions. - */ -const char *virtio_dev_name(uint16_t devid); -void virtio_describe(struct virtio_device *dev, const char *msg, - uint32_t features, - struct virtio_feature_desc *feature_desc); - -/* - * Functions for virtio device configuration as defined in Rusty Russell's - * paper. - * Drivers are expected to implement these functions in their respective codes. - */ - -struct virtio_dispatch { - uint8_t (*get_status)(struct virtio_device *dev); - void (*set_status)(struct virtio_device *dev, uint8_t status); - uint32_t (*get_features)(struct virtio_device *dev); - void (*set_features)(struct virtio_device *dev, uint32_t feature); - uint32_t (*negotiate_features)(struct virtio_device *dev, - uint32_t features); - - /* - * Read/write a variable amount from the device specific (ie, network) - * configuration region. This region is encoded in the same endian as - * the guest. - */ - void (*read_config)(struct virtio_device *dev, uint32_t offset, - void *dst, int length); - void (*write_config)(struct virtio_device *dev, uint32_t offset, - void *src, int length); - void (*reset_device)(struct virtio_device *dev); - void (*notify)(struct virtqueue *vq); -}; - -int virtio_create_virtqueues(struct virtio_device *vdev, unsigned int flags, - unsigned int nvqs, const char *names[], - vq_callback *callbacks[]); - -#if defined __cplusplus -} -#endif - -#endif /* _VIRTIO_H_ */ +/* + * SPDX-License-Identifier: BSD-3-Clause + * + * $FreeBSD$ + */ + +#ifndef _VIRTIO_H_ +#define _VIRTIO_H_ + +#include +#include +#include + +#if defined __cplusplus +extern "C" { +#endif + +/* VirtIO device IDs. */ +#define VIRTIO_ID_NETWORK 1UL +#define VIRTIO_ID_BLOCK 2UL +#define VIRTIO_ID_CONSOLE 3UL +#define VIRTIO_ID_ENTROPY 4UL +#define VIRTIO_ID_BALLOON 5UL +#define VIRTIO_ID_IOMEMORY 6UL +#define VIRTIO_ID_RPMSG 7UL /* remote processor messaging */ +#define VIRTIO_ID_SCSI 8UL +#define VIRTIO_ID_9P 9UL +#define VIRTIO_ID_MAC80211_WLAN 10UL +#define VIRTIO_ID_RPROC_SERIAL 11UL +#define VIRTIO_ID_CAIF 12UL +#define VIRTIO_ID_MEMORY_BALLOON 13UL +#define VIRTIO_ID_GPU 16UL +#define VIRTIO_ID_CLOCK 17UL +#define VIRTIO_ID_INPUT 18UL +#define VIRTIO_ID_VSOCK 19UL +#define VIRTIO_ID_CRYPTO 20UL +#define VIRTIO_ID_SIGNAL_DIST 21UL +#define VIRTIO_ID_PSTORE 22UL +#define VIRTIO_ID_IOMMU 23UL +#define VIRTIO_ID_MEM 24UL +#define VIRTIO_ID_SOUND 25UL +#define VIRTIO_ID_FS 26UL +#define VIRTIO_ID_PMEM 27UL +#define VIRTIO_ID_RPMB 28UL +#define VIRTIO_ID_MAC80211_HWSIM 29UL +#define VIRTIO_ID_VIDEO_ENCODER 30UL +#define VIRTIO_ID_VIDEO_DECODER 31UL +#define VIRTIO_ID_SCMI 32UL +#define VIRTIO_ID_NITRO_SEC_MOD 33UL +#define VIRTIO_ID_I2C_ADAPTER 34UL +#define VIRTIO_ID_WATCHDOG 35UL +#define VIRTIO_ID_CAN 36UL +#define VIRTIO_ID_PARAM_SERV 38UL +#define VIRTIO_ID_AUDIO_POLICY 39UL +#define VIRTIO_ID_BT 40UL +#define VIRTIO_ID_GPIO 41UL +#define VIRTIO_ID_RDMA 42UL +#define VIRTIO_DEV_ANY_ID -1UL + +/* Status byte for guest to report progress. */ +#define VIRTIO_CONFIG_STATUS_RESET 0x00 +#define VIRTIO_CONFIG_STATUS_ACK 0x01 +#define VIRTIO_CONFIG_STATUS_DRIVER 0x02 +#define VIRTIO_CONFIG_STATUS_DRIVER_OK 0x04 +#define VIRTIO_CONFIG_FEATURES_OK 0x08 +#define VIRTIO_CONFIG_STATUS_NEEDS_RESET 0x40 +#define VIRTIO_CONFIG_STATUS_FAILED 0x80 + +/* Virtio device role */ +#define VIRTIO_DEV_DRIVER 0UL +#define VIRTIO_DEV_DEVICE 1UL + +#define VIRTIO_DEV_MASTER deprecated_virtio_dev_master() +#define VIRTIO_DEV_SLAVE deprecated_virtio_dev_slave() + +__deprecated static inline int deprecated_virtio_dev_master(void) +{ + /* "VIRTIO_DEV_MASTER is deprecated, please use VIRTIO_DEV_DRIVER" */ + return VIRTIO_DEV_DRIVER; +} + +__deprecated static inline int deprecated_virtio_dev_slave(void) +{ + /* "VIRTIO_DEV_SLAVE is deprecated, please use VIRTIO_DEV_DEVICE" */ + return VIRTIO_DEV_DEVICE; +} + +#ifdef VIRTIO_MASTER_ONLY +#define VIRTIO_DRIVER_ONLY +#warning "VIRTIO_MASTER_ONLY is deprecated, please use VIRTIO_DRIVER_ONLY" +#endif + +#ifdef VIRTIO_SLAVE_ONLY +#define VIRTIO_DEVICE_ONLY +#warning "VIRTIO_SLAVE_ONLY is deprecated, please use VIRTIO_DEVICE_ONLY" +#endif + +/** @brief Virtio device identifier. */ +struct virtio_device_id { + /** Virtio subsystem device ID. */ + uint32_t device; + + /** Virtio subsystem vendor ID. */ + uint32_t vendor; + + /** Virtio subsystem device version. */ + uint32_t version; +}; + +/* + * Generate interrupt when the virtqueue ring is + * completely used, even if we've suppressed them. + */ +#define VIRTIO_F_NOTIFY_ON_EMPTY (1 << 24) + +/* + * The guest should never negotiate this feature; it + * is used to detect faulty drivers. + */ +#define VIRTIO_F_BAD_FEATURE (1 << 30) + +/* + * Some VirtIO feature bits (currently bits 28 through 31) are + * reserved for the transport being used (eg. virtio_ring), the + * rest are per-device feature bits. + */ +#define VIRTIO_TRANSPORT_F_START 28 +#define VIRTIO_TRANSPORT_F_END 32 + +#ifdef VIRTIO_DEBUG +#include + +#define VIRTIO_ASSERT(_exp, _msg) do { \ + int exp = (_exp); \ + if (!(exp)) { \ + metal_log(METAL_LOG_EMERGENCY, \ + "FATAL: %s - " _msg, __func__); \ + metal_assert(exp); \ + } \ + } while (0) +#else +#define VIRTIO_ASSERT(_exp, _msg) metal_assert(_exp) +#endif /* VIRTIO_DEBUG */ + +#define VIRTIO_MMIO_VRING_ALIGNMENT 4096 + +typedef void (*virtio_dev_reset_cb)(struct virtio_device *vdev); + +struct virtio_dispatch; + +/** @brief Device features. */ +struct virtio_feature_desc { + /** Unique feature ID, defined in the virtio specification. */ + uint32_t vfd_val; + + /** Name of the feature (for debug). */ + const char *vfd_str; +}; + +/** @brief Virtio vring data structure */ +struct virtio_vring_info { + /** Virtio queue */ + struct virtqueue *vq; + + /** Vring alloc info */ + struct vring_alloc_info info; + + /** Vring notify id */ + uint32_t notifyid; + + /** Metal I/O region of the vring memory, can be NULL */ + struct metal_io_region *io; +}; + +/** @brief Structure definition for virtio devices for use by the applications/drivers */ +struct virtio_device { + /** Unique position on the virtio bus */ + uint32_t notifyid; + + /** The device type identification used to match it with a driver */ + struct virtio_device_id id; + + /** The features supported by both ends. */ + uint64_t features; + + /** If it is virtio backend or front end. */ + unsigned int role; + + /** User-registered device callback */ + virtio_dev_reset_cb reset_cb; + + /** Virtio dispatch table */ + const struct virtio_dispatch *func; + + /** Private data */ + void *priv; + + /** Number of vrings */ + unsigned int vrings_num; + + /** Pointer to the virtio vring structure */ + struct virtio_vring_info *vrings_info; +}; + +/* + * Helper functions. + */ + +/** + * @brief Get the name of a virtio device. + * + * @param devid Id of the device. + * + * @return pointer to the device name string if found, otherwise null. + */ +const char *virtio_dev_name(uint16_t devid); + +__deprecated void virtio_describe(struct virtio_device *dev, const char *msg, + uint32_t features, + struct virtio_feature_desc *feature_desc); + +/** + * @brief Virtio device dispatcher functions. + * + * Functions for virtio device configuration as defined in Rusty Russell's paper. + * The virtio transport layers are expected to implement these functions in their respective codes. + */ + +struct virtio_dispatch { + /** Create virtio queue instances. */ + int (*create_virtqueues)(struct virtio_device *vdev, + unsigned int flags, + unsigned int nvqs, const char *names[], + vq_callback callbacks[], + void *callback_args[]); + + /** Delete virtio queue instances. */ + void (*delete_virtqueues)(struct virtio_device *vdev); + + /** Get the status of the virtio device. */ + uint8_t (*get_status)(struct virtio_device *dev); + + /** Set the status of the virtio device. */ + void (*set_status)(struct virtio_device *dev, uint8_t status); + + /** Get the feature exposed by the virtio device. */ + uint32_t (*get_features)(struct virtio_device *dev); + + /** Set the supported feature (virtio driver only). */ + void (*set_features)(struct virtio_device *dev, uint32_t feature); + + /** + * Set the supported feature negotiate between the \ref features parameter and features + * supported by the device (virtio driver only). + */ + uint32_t (*negotiate_features)(struct virtio_device *dev, + uint32_t features); + + /** + * Read a variable amount from the device specific (ie, network) + * configuration region. + */ + void (*read_config)(struct virtio_device *dev, uint32_t offset, + void *dst, int length); + + /** + * Write a variable amount from the device specific (ie, network) + * configuration region. + */ + void (*write_config)(struct virtio_device *dev, uint32_t offset, + void *src, int length); + + /** Request a reset of the virtio device. */ + void (*reset_device)(struct virtio_device *dev); + + /** Notify the other side that a virtio vring as been updated. */ + void (*notify)(struct virtqueue *vq); +}; + +/** + * @brief Create the virtio device virtqueue. + * + * @param vdev Pointer to virtio device structure. + * @param flags Create flag. + * @param nvqs The virtqueue number. + * @param names Virtqueue names. + * @param callbacks Virtqueue callback functions. + * @param callback_args Virtqueue callback function arguments. + * + * @return 0 on success, otherwise error code. + */ +int virtio_create_virtqueues(struct virtio_device *vdev, unsigned int flags, + unsigned int nvqs, const char *names[], + vq_callback callbacks[], void *callback_args[]); + +/** + * @brief Delete the virtio device virtqueue. + * + * @param vdev Pointer to virtio device structure. + * + */ +static inline void virtio_delete_virtqueues(struct virtio_device *vdev) +{ + if (!vdev || !vdev->func || !vdev->func->delete_virtqueues) + return; + + vdev->func->delete_virtqueues(vdev); +} + +/** + * @brief Get device ID. + * + * @param dev Pointer to device structure. + * + * @return Device ID value. + */ +static inline uint32_t virtio_get_devid(const struct virtio_device *vdev) +{ + if (!vdev) + return 0; + return vdev->id.device; +} + +/** + * @brief Retrieve device status. + * + * @param dev Pointer to device structure. + * @param status Pointer to the virtio device status. + * + * @return 0 on success, otherwise error code. + */ +static inline int virtio_get_status(struct virtio_device *vdev, uint8_t *status) +{ + if (!vdev || !status) + return -EINVAL; + + if (!vdev->func || !vdev->func->get_status) + return -ENXIO; + + *status = vdev->func->get_status(vdev); + return 0; +} + +/** + * @brief Set device status. + * + * @param dev Pointer to device structure. + * @param status Value to be set as device status. + * + * @return 0 on success, otherwise error code. + */ +static inline int virtio_set_status(struct virtio_device *vdev, uint8_t status) +{ + if (!vdev) + return -EINVAL; + + if (!vdev->func || !vdev->func->set_status) + return -ENXIO; + + vdev->func->set_status(vdev, status); + return 0; +} + +/** + * @brief Retrieve configuration data from the device. + * + * @param dev Pointer to device structure. + * @param offset Offset of the data within the configuration area. + * @param dst Address of the buffer that will hold the data. + * @param len Length of the data to be retrieved. + * + * @return 0 on success, otherwise error code. + */ +static inline int virtio_read_config(struct virtio_device *vdev, + uint32_t offset, void *dst, int len) +{ + if (!vdev || !dst) + return -EINVAL; + + if (!vdev->func || !vdev->func->read_config) + return -ENXIO; + + vdev->func->read_config(vdev, offset, dst, len); + return 0; +} + +/** + * @brief Write configuration data to the device. + * + * @param dev Pointer to device structure. + * @param offset Offset of the data within the configuration area. + * @param src Address of the buffer that holds the data to write. + * @param len Length of the data to be written. + * + * @return 0 on success, otherwise error code. + */ +static inline int virtio_write_config(struct virtio_device *vdev, + uint32_t offset, void *src, int len) +{ + if (!vdev || !src) + return -EINVAL; + + if (!vdev->func || !vdev->func->write_config) + return -ENXIO; + + vdev->func->write_config(vdev, offset, src, len); + return 0; +} + +/** + * @brief Get the virtio device features. + * + * @param dev Pointer to device structure. + * @param features Pointer to features supported by both the driver and + * the device as a bitfield. + * + * @return 0 on success, otherwise error code. + */ +static inline int virtio_get_features(struct virtio_device *vdev, + uint32_t *features) +{ + if (!vdev || !features) + return -EINVAL; + + if (!vdev->func || !vdev->func->get_features) + return -ENXIO; + + *features = vdev->func->get_features(vdev); + return 0; +} + +/** + * @brief Set features supported by the VIRTIO driver. + * + * @param dev Pointer to device structure. + * @param features Features supported by the driver as a bitfield. + * + * @return 0 on success, otherwise error code. + */ +static inline int virtio_set_features(struct virtio_device *vdev, + uint32_t features) +{ + if (!vdev) + return -EINVAL; + + if (!vdev->func || !vdev->func->set_features) + return -ENXIO; + + vdev->func->set_features(vdev, features); + return 0; +} + +/** + * @brief Negotiate features between virtio device and driver. + * + * @param dev Pointer to device structure. + * @param features Supported features. + * @param final_features Pointer to the final features after negotiate. + * + * @return 0 on success, otherwise error code. + */ +static inline int virtio_negotiate_features(struct virtio_device *vdev, + uint32_t features, + uint32_t *final_features) +{ + if (!vdev || !final_features) + return -EINVAL; + + if (!vdev->func || !vdev->func->negotiate_features) + return -ENXIO; + + *final_features = vdev->func->negotiate_features(vdev, features); + return 0; +} + +/** + * @brief Reset virtio device. + * + * @param vdev Pointer to virtio_device structure. + * + * @return 0 on success, otherwise error code. + */ +static inline int virtio_reset_device(struct virtio_device *vdev) +{ + if (!vdev) + return -EINVAL; + + if (!vdev->func || !vdev->func->reset_device) + return -ENXIO; + + vdev->func->reset_device(vdev); + return 0; +} + +#if defined __cplusplus +} +#endif + +#endif /* _VIRTIO_H_ */ diff --git a/libraries/openamp_arduino/src/openamp/virtio_mmio.h b/libraries/openamp_arduino/src/openamp/virtio_mmio.h new file mode 100644 index 000000000..db678f6b5 --- /dev/null +++ b/libraries/openamp_arduino/src/openamp/virtio_mmio.h @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2022 Wind River Systems, Inc. + * Based on Virtio PCI driver by Anthony Liguori, copyright IBM Corp. 2007 + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef OPENAMP_VIRTIO_MMIO_H +#define OPENAMP_VIRTIO_MMIO_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Enable support for legacy devices */ +#define VIRTIO_MMIO_LEGACY + +/* Control registers */ + +/* Magic value ("virt" string) - Read Only */ +#define VIRTIO_MMIO_MAGIC_VALUE 0x000 + +#define VIRTIO_MMIO_MAGIC_VALUE_STRING ('v' | ('i' << 8) | ('r' << 16) | ('t' << 24)) + +/* Virtio device version - Read Only */ +#define VIRTIO_MMIO_VERSION 0x004 + +/* Virtio device ID - Read Only */ +#define VIRTIO_MMIO_DEVICE_ID 0x008 + +/* Virtio vendor ID - Read Only */ +#define VIRTIO_MMIO_VENDOR_ID 0x00c + +/* + * Bitmask of the features supported by the device (host) + * (32 bits per set) - Read Only + */ +#define VIRTIO_MMIO_DEVICE_FEATURES 0x010 + +/* Device (host) features set selector - Write Only */ +#define VIRTIO_MMIO_DEVICE_FEATURES_SEL 0x014 + +/* + * Bitmask of features activated by the driver (guest) + * (32 bits per set) - Write Only + */ +#define VIRTIO_MMIO_DRIVER_FEATURES 0x020 + +/* Activated features set selector - Write Only */ +#define VIRTIO_MMIO_DRIVER_FEATURES_SEL 0x024 + +#ifndef VIRTIO_MMIO_NO_LEGACY /* LEGACY DEVICES ONLY! */ +/* Guest's memory page size in bytes - Write Only */ +#define VIRTIO_MMIO_GUEST_PAGE_SIZE 0x028 +#endif + +/* Queue selector - Write Only */ +#define VIRTIO_MMIO_QUEUE_SEL 0x030 + +/* Maximum size of the currently selected queue - Read Only */ +#define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034 + +/* Queue size for the currently selected queue - Write Only */ +#define VIRTIO_MMIO_QUEUE_NUM 0x038 + +#ifdef VIRTIO_MMIO_LEGACY +/* Used Ring alignment for the currently selected queue - Write Only */ +#define VIRTIO_MMIO_QUEUE_ALIGN 0x03c +/* Guest's PFN for the currently selected queue - Read Write */ +#define VIRTIO_MMIO_QUEUE_PFN 0x040 +#endif + +/* Ready bit for the currently selected queue - Read Write */ +#define VIRTIO_MMIO_QUEUE_READY 0x044 + +/* Queue notifier - Write Only */ +#define VIRTIO_MMIO_QUEUE_NOTIFY 0x050 + +/* Interrupt status - Read Only */ +#define VIRTIO_MMIO_INTERRUPT_STATUS 0x060 + +/* Interrupt acknowledge - Write Only */ +#define VIRTIO_MMIO_INTERRUPT_ACK 0x064 + +/* Device status register - Read Write */ +#define VIRTIO_MMIO_STATUS 0x070 + +/* Selected queue's Descriptor Table address, 64 bits in two halves */ +#define VIRTIO_MMIO_QUEUE_DESC_LOW 0x080 +#define VIRTIO_MMIO_QUEUE_DESC_HIGH 0x084 + +/* Selected queue's Available Ring address, 64 bits in two halves */ +#define VIRTIO_MMIO_QUEUE_AVAIL_LOW 0x090 +#define VIRTIO_MMIO_QUEUE_AVAIL_HIGH 0x094 + +/* Selected queue's Used Ring address, 64 bits in two halves */ +#define VIRTIO_MMIO_QUEUE_USED_LOW 0x0a0 +#define VIRTIO_MMIO_QUEUE_USED_HIGH 0x0a4 + +/* Shared memory region id */ +#define VIRTIO_MMIO_SHM_SEL 0x0ac + +/* Shared memory region length, 64 bits in two halves */ +#define VIRTIO_MMIO_SHM_LEN_LOW 0x0b0 +#define VIRTIO_MMIO_SHM_LEN_HIGH 0x0b4 + +/* Shared memory region base address, 64 bits in two halves */ +#define VIRTIO_MMIO_SHM_BASE_LOW 0x0b8 +#define VIRTIO_MMIO_SHM_BASE_HIGH 0x0bc + +/* Configuration atomicity value */ +#define VIRTIO_MMIO_CONFIG_GENERATION 0x0fc + +/* + * The config space is defined by each driver as + * the per-driver configuration space - Read Write + */ +#define VIRTIO_MMIO_CONFIG 0x100 + +/* Interrupt flags (re: interrupt status & acknowledge registers) */ +#define VIRTIO_MMIO_INT_VRING (1 << 0) +#define VIRTIO_MMIO_INT_CONFIG (1 << 1) + +/* Data buffer size for preallocated buffers before vring */ +#define VIRTIO_MMIO_MAX_DATA_SIZE 128 + +/** @brief VIRTIO MMIO memory area */ +struct virtio_mmio_dev_mem { + /** Memory region physical address */ + void *base; + + /** Memory region size */ + size_t size; +}; + +/** @brief A VIRTIO MMIO device */ +struct virtio_mmio_device { + /** Base virtio device structure */ + struct virtio_device vdev; + + /** Device configuration space metal_io_region */ + struct metal_io_region *cfg_io; + + /** Pre-shared memory space metal_io_region */ + struct metal_io_region *shm_io; + + /** Shared memory device */ + struct metal_device shm_device; + + /** VIRTIO device configuration space */ + struct virtio_mmio_dev_mem cfg_mem; + + /** VIRTIO device pre-shared memory */ + struct virtio_mmio_dev_mem shm_mem; + + /** VIRTIO_DEV_DRIVER or VIRTIO_DEV_DEVICE */ + unsigned int device_mode; + + /** Interrupt number */ + unsigned int irq; + + /** Custom user data */ + void *user_data; +}; + +/** + * @brief Register a VIRTIO device with the VIRTIO stack. + * + * @param dev Pointer to device structure. + * @param vq_num Number of virtqueues the device uses. + * @param vqs Array of pointers to vthe virtqueues used by the device. + */ +void virtio_mmio_register_device(struct virtio_device *vdev, int vq_num, struct virtqueue **vqs); + +/** + * @brief Setup a virtqueue structure. + * + * @param dev Pointer to device structure. + * @param idx Index of the virtqueue. + * @param vq Pointer to virtqueue structure. + * @param cb Pointer to virtqueue callback. Can be NULL. + * @param cb_arg Argument for the virtqueue callback. + * + * @return pointer to virtqueue structure. + */ +struct virtqueue *virtio_mmio_setup_virtqueue(struct virtio_device *vdev, + unsigned int idx, + struct virtqueue *vq, + void (*cb)(void *), + void *cb_arg, + const char *vq_name); + +/** + * @brief VIRTIO MMIO device initialization. + * + * @param vmdev Pointer to virtio_mmio_device structure. + * @param virt_mem_ptr Guest virtio (shared) memory base address (virtual). + * @param cfg_mem_ptr Virtio device configuration memory base address (virtual). + * @param user_data Pointer to custom user data. + * + * @return int 0 for success. + */ +int virtio_mmio_device_init(struct virtio_mmio_device *vmdev, uintptr_t virt_mem_ptr, + uintptr_t cfg_mem_ptr, void *user_data); + +/** + * @brief VIRTIO MMIO interrupt service routine. + * + * @param vdev Pointer to virtio_device structure. + */ +void virtio_mmio_isr(struct virtio_device *vdev); + +#ifdef __cplusplus +} +#endif + +#endif /* OPENAMP_VIRTIO_MMIO_H */ diff --git a/libraries/openamp_arduino/src/openamp/virtio_ring.h b/libraries/openamp_arduino/src/openamp/virtio_ring.h index 3f348e3fa..60a9710dc 100755 --- a/libraries/openamp_arduino/src/openamp/virtio_ring.h +++ b/libraries/openamp_arduino/src/openamp/virtio_ring.h @@ -1,152 +1,218 @@ -/* - * Copyright Rusty Russell IBM Corporation 2007. - * - * SPDX-License-Identifier: BSD-3-Clause - * - * $FreeBSD$ - */ - -#ifndef VIRTIO_RING_H -#define VIRTIO_RING_H - -#if defined __cplusplus -extern "C" { -#endif - -/* This marks a buffer as continuing via the next field. */ -#define VRING_DESC_F_NEXT 1 -/* This marks a buffer as write-only (otherwise read-only). */ -#define VRING_DESC_F_WRITE 2 -/* This means the buffer contains a list of buffer descriptors. */ -#define VRING_DESC_F_INDIRECT 4 - -/* The Host uses this in used->flags to advise the Guest: don't kick me - * when you add a buffer. It's unreliable, so it's simply an - * optimization. Guest will still kick if it's out of buffers. - */ -#define VRING_USED_F_NO_NOTIFY 1 -/* The Guest uses this in avail->flags to advise the Host: don't - * interrupt me when you consume a buffer. It's unreliable, so it's - * simply an optimization. - */ -#define VRING_AVAIL_F_NO_INTERRUPT 1 - -/* VirtIO ring descriptors: 16 bytes. - * These can chain together via "next". - */ -struct vring_desc { - /* Address (guest-physical). */ - uint64_t addr; - /* Length. */ - uint32_t len; - /* The flags as indicated above. */ - uint16_t flags; - /* We chain unused descriptors via this, too. */ - uint16_t next; -}; - -struct vring_avail { - uint16_t flags; - uint16_t idx; - uint16_t ring[0]; -}; - -/* uint32_t is used here for ids for padding reasons. */ -struct vring_used_elem { - /* Index of start of used descriptor chain. */ - uint32_t id; - /* Total length of the descriptor chain which was written to. */ - uint32_t len; -}; - -struct vring_used { - uint16_t flags; - uint16_t idx; - struct vring_used_elem ring[0]; -}; - -struct vring { - unsigned int num; - - struct vring_desc *desc; - struct vring_avail *avail; - struct vring_used *used; -}; - -/* The standard layout for the ring is a continuous chunk of memory which - * looks like this. We assume num is a power of 2. - * - * struct vring { - * // The actual descriptors (16 bytes each) - * struct vring_desc desc[num]; - * - * // A ring of available descriptor heads with free-running index. - * __u16 avail_flags; - * __u16 avail_idx; - * __u16 available[num]; - * __u16 used_event_idx; - * - * // Padding to the next align boundary. - * char pad[]; - * - * // A ring of used descriptor heads with free-running index. - * __u16 used_flags; - * __u16 used_idx; - * struct vring_used_elem used[num]; - * __u16 avail_event_idx; - * }; - * - * NOTE: for VirtIO PCI, align is 4096. - */ - -/* - * We publish the used event index at the end of the available ring, and vice - * versa. They are at the end for backwards compatibility. - */ -#define vring_used_event(vr) ((vr)->avail->ring[(vr)->num]) -#define vring_avail_event(vr) ((vr)->used->ring[(vr)->num].id & 0xFFFF) - -static inline int vring_size(unsigned int num, unsigned long align) -{ - int size; - - size = num * sizeof(struct vring_desc); - size += sizeof(struct vring_avail) + (num * sizeof(uint16_t)) + - sizeof(uint16_t); - size = (size + align - 1) & ~(align - 1); - size += sizeof(struct vring_used) + - (num * sizeof(struct vring_used_elem)) + sizeof(uint16_t); - - return size; -} - -static inline void -vring_init(struct vring *vr, unsigned int num, uint8_t *p, unsigned long align) -{ - vr->num = num; - vr->desc = (struct vring_desc *)p; - vr->avail = (struct vring_avail *)(p + num * sizeof(struct vring_desc)); - vr->used = (struct vring_used *) - (((unsigned long)&vr->avail->ring[num] + sizeof(uint16_t) + - align - 1) & ~(align - 1)); -} - -/* - * The following is used with VIRTIO_RING_F_EVENT_IDX. - * - * Assuming a given event_idx value from the other size, if we have - * just incremented index from old to new_idx, should we trigger an - * event? - */ -static inline int -vring_need_event(uint16_t event_idx, uint16_t new_idx, uint16_t old) -{ - return (uint16_t)(new_idx - event_idx - 1) < - (uint16_t)(new_idx - old); -} - -#if defined __cplusplus -} -#endif - -#endif /* VIRTIO_RING_H */ +/* + * Copyright Rusty Russell IBM Corporation 2007. + * + * SPDX-License-Identifier: BSD-3-Clause + * + * $FreeBSD$ + */ + +#ifndef VIRTIO_RING_H +#define VIRTIO_RING_H + +#include + +#if defined __cplusplus +extern "C" { +#endif + +/* This marks a buffer as continuing via the next field. */ +#define VRING_DESC_F_NEXT 1 +/* This marks a buffer as write-only (otherwise read-only). */ +#define VRING_DESC_F_WRITE 2 +/* This means the buffer contains a list of buffer descriptors. */ +#define VRING_DESC_F_INDIRECT 4 + +/* The Host uses this in used->flags to advise the Guest: don't kick me + * when you add a buffer. It's unreliable, so it's simply an + * optimization. Guest will still kick if it's out of buffers. + */ +#define VRING_USED_F_NO_NOTIFY 1 +/* The Guest uses this in avail->flags to advise the Host: don't + * interrupt me when you consume a buffer. It's unreliable, so it's + * simply an optimization. + */ +#define VRING_AVAIL_F_NO_INTERRUPT 1 + +/** + * @brief VirtIO ring descriptors. + * + * The descriptor table refers to the buffers the driver is using for the + * device. addr is a physical address, and the buffers can be chained via \ref next. + * Each descriptor describes a buffer which is read-only for the device + * (“device-readable”) or write-only for the device (“device-writable”), but a + * chain of descriptors can contain both device-readable and device-writable + * buffers. + */ +METAL_PACKED_BEGIN +struct vring_desc { + /** Address (guest-physical) */ + uint64_t addr; + + /** Length */ + uint32_t len; + + /** Flags relevant to the descriptors */ + uint16_t flags; + + /** We chain unused descriptors via this, too */ + uint16_t next; +} METAL_PACKED_END; + +/** + * @brief Used to offer buffers to the device. + * + * Each ring entry refers to the head of a descriptor chain. It is only + * written by the driver and read by the device. + */ +METAL_PACKED_BEGIN +struct vring_avail { + /** Flag which determines whether device notifications are required */ + uint16_t flags; + + /** + * Indicates where the driver puts the next descriptor entry in the + * ring (modulo the queue size) + */ + uint16_t idx; + + /** The ring of descriptors */ + uint16_t ring[0]; +} METAL_PACKED_END; + +/* uint32_t is used here for ids for padding reasons. */ +METAL_PACKED_BEGIN +struct vring_used_elem { + union { + uint16_t event; + /* Index of start of used descriptor chain. */ + uint32_t id; + }; + /* Total length of the descriptor chain which was written to. */ + uint32_t len; +} METAL_PACKED_END; + +/** + * @brief The device returns buffers to this structure when done with them + * + * The structure is only written to by the device, and read by the driver. + */ +METAL_PACKED_BEGIN +struct vring_used { + /** Flag which determines whether device notifications are required */ + uint16_t flags; + + /** + * Indicates where the driver puts the next descriptor entry in the + * ring (modulo the queue size) + */ + uint16_t idx; + + /** The ring of descriptors */ + struct vring_used_elem ring[0]; +} METAL_PACKED_END; + +/** + * @brief The virtqueue layout structure + * + * Each virtqueue consists of; descriptor table, available ring, used ring, + * where each part is physically contiguous in guest memory. + * + * When the driver wants to send a buffer to the device, it fills in a slot in + * the descriptor table (or chains several together), and writes the descriptor + * index into the available ring. It then notifies the device. When the device + * has finished a buffer, it writes the descriptor index into the used ring, + * and sends an interrupt. + * + * The standard layout for the ring is a continuous chunk of memory which + * looks like this. We assume num is a power of 2. + * + * struct vring { + * // The actual descriptors (16 bytes each) + * struct vring_desc desc[num]; + * + * // A ring of available descriptor heads with free-running index. + * __u16 avail_flags; + * __u16 avail_idx; + * __u16 available[num]; + * __u16 used_event_idx; + * + * // Padding to the next align boundary. + * char pad[]; + * + * // A ring of used descriptor heads with free-running index. + * __u16 used_flags; + * __u16 used_idx; + * struct vring_used_elem used[num]; + * __u16 avail_event_idx; + * }; + * + * NOTE: for VirtIO PCI, align is 4096. + */ +struct vring { + /** + * The maximum number of buffer descriptors in the virtqueue. + * The value is always a power of 2. + */ + unsigned int num; + + /** The actual buffer descriptors, 16 bytes each */ + struct vring_desc *desc; + + /** A ring of available descriptor heads with free-running index */ + struct vring_avail *avail; + + /** A ring of used descriptor heads with free-running index */ + struct vring_used *used; +}; + +/* + * We publish the used event index at the end of the available ring, and vice + * versa. They are at the end for backwards compatibility. + */ +#define vring_used_event(vr) ((vr)->avail->ring[(vr)->num]) +#define vring_avail_event(vr) ((vr)->used->ring[(vr)->num].event) + +static inline int vring_size(unsigned int num, unsigned long align) +{ + int size; + + size = num * sizeof(struct vring_desc); + size += sizeof(struct vring_avail) + (num * sizeof(uint16_t)) + + sizeof(uint16_t); + size = (size + align - 1) & ~(align - 1); + size += sizeof(struct vring_used) + + (num * sizeof(struct vring_used_elem)) + sizeof(uint16_t); + + return size; +} + +static inline void +vring_init(struct vring *vr, unsigned int num, uint8_t *p, unsigned long align) +{ + vr->num = num; + vr->desc = (struct vring_desc *)p; + vr->avail = (struct vring_avail *)(p + num * sizeof(struct vring_desc)); + vr->used = (struct vring_used *) + (((unsigned long)&vr->avail->ring[num] + sizeof(uint16_t) + + align - 1) & ~(align - 1)); +} + +/* + * The following is used with VIRTIO_RING_F_EVENT_IDX. + * + * Assuming a given event_idx value from the other size, if we have + * just incremented index from old to new_idx, should we trigger an + * event? + */ +static inline int +vring_need_event(uint16_t event_idx, uint16_t new_idx, uint16_t old) +{ + return (uint16_t)(new_idx - event_idx - 1) < + (uint16_t)(new_idx - old); +} + +#if defined __cplusplus +} +#endif + +#endif /* VIRTIO_RING_H */ diff --git a/libraries/openamp_arduino/src/openamp/virtqueue.h b/libraries/openamp_arduino/src/openamp/virtqueue.h index 99d6ff580..1a9d2e8fe 100755 --- a/libraries/openamp_arduino/src/openamp/virtqueue.h +++ b/libraries/openamp_arduino/src/openamp/virtqueue.h @@ -1,238 +1,414 @@ -#ifndef VIRTQUEUE_H_ -#define VIRTQUEUE_H_ - -/*- - * Copyright (c) 2011, Bryan Venteicher - * All rights reserved. - * - * SPDX-License-Identifier: BSD-2-Clause - * - * $FreeBSD$ - */ - -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -typedef uint8_t boolean; - -#include -#include -#include - -/*Error Codes*/ -#define VQ_ERROR_BASE -3000 -#define ERROR_VRING_FULL (VQ_ERROR_BASE - 1) -#define ERROR_INVLD_DESC_IDX (VQ_ERROR_BASE - 2) -#define ERROR_EMPTY_RING (VQ_ERROR_BASE - 3) -#define ERROR_NO_MEM (VQ_ERROR_BASE - 4) -#define ERROR_VRING_MAX_DESC (VQ_ERROR_BASE - 5) -#define ERROR_VRING_ALIGN (VQ_ERROR_BASE - 6) -#define ERROR_VRING_NO_BUFF (VQ_ERROR_BASE - 7) -#define ERROR_VQUEUE_INVLD_PARAM (VQ_ERROR_BASE - 8) - -#define VQUEUE_SUCCESS 0 - -/* The maximum virtqueue size is 2^15. Use that value as the end of - * descriptor chain terminator since it will never be a valid index - * in the descriptor table. This is used to verify we are correctly - * handling vq_free_cnt. - */ -#define VQ_RING_DESC_CHAIN_END 32768 -#define VIRTQUEUE_FLAG_INDIRECT 0x0001 -#define VIRTQUEUE_FLAG_EVENT_IDX 0x0002 -#define VIRTQUEUE_MAX_NAME_SZ 32 - -/* Support for indirect buffer descriptors. */ -#define VIRTIO_RING_F_INDIRECT_DESC (1 << 28) - -/* Support to suppress interrupt until specific index is reached. */ -#define VIRTIO_RING_F_EVENT_IDX (1 << 29) - -struct virtqueue_buf { - void *buf; - int len; -}; - -struct virtqueue { - struct virtio_device *vq_dev; - const char *vq_name; - uint16_t vq_queue_index; - uint16_t vq_nentries; - uint32_t vq_flags; - void (*callback)(struct virtqueue *vq); - void (*notify)(struct virtqueue *vq); - struct vring vq_ring; - uint16_t vq_free_cnt; - uint16_t vq_queued_cnt; - void *shm_io; /* opaque pointer to data needed to allow v2p & p2v */ - - /* - * Head of the free chain in the descriptor table. If - * there are no free descriptors, this will be set to - * VQ_RING_DESC_CHAIN_END. - */ - uint16_t vq_desc_head_idx; - - /* - * Last consumed descriptor in the used table, - * trails vq_ring.used->idx. - */ - uint16_t vq_used_cons_idx; - - /* - * Last consumed descriptor in the available table - - * used by the consumer side. - */ - uint16_t vq_available_idx; - -#ifdef VQUEUE_DEBUG - boolean vq_inuse; -#endif - - /* - * Used by the host side during callback. Cookie - * holds the address of buffer received from other side. - * Other fields in this structure are not used currently. - */ - - struct vq_desc_extra { - void *cookie; - uint16_t ndescs; - } vq_descx[0]; -}; - -/* struct to hold vring specific information */ -struct vring_alloc_info { - void *vaddr; - uint32_t align; - uint16_t num_descs; - uint16_t pad; -}; - -typedef void vq_callback(struct virtqueue *); -typedef void vq_notify(struct virtqueue *); - -#ifdef VQUEUE_DEBUG -#include -#include - -#define VQASSERT(_vq, _exp, _msg) \ - do { \ - if (!(_exp)) { \ - metal_log(METAL_LOG_EMERGENCY, \ - "%s: %s - _msg", __func__, (_vq)->vq_name); \ - metal_assert(_exp); \ - } \ - } while (0) - -#define VQ_RING_ASSERT_VALID_IDX(_vq, _idx) \ - VQASSERT((_vq), (_idx) < (_vq)->vq_nentries, "invalid ring index") - -#define VQ_RING_ASSERT_CHAIN_TERM(_vq) \ - VQASSERT((_vq), (_vq)->vq_desc_head_idx == \ - VQ_RING_DESC_CHAIN_END, \ - "full ring terminated incorrectly: invalid head") - -#define VQ_PARAM_CHK(condition, status_var, status_err) \ - do { \ - if (((status_var) == 0) && (condition)) { \ - status_var = status_err; \ - } \ - } while (0) - -#define VQUEUE_BUSY(vq) \ - do { \ - if (!(vq)->vq_inuse) \ - (vq)->vq_inuse = true; \ - else \ - VQASSERT(vq, !(vq)->vq_inuse,\ - "VirtQueue already in use") \ - } while (0) - -#define VQUEUE_IDLE(vq) ((vq)->vq_inuse = false) - -#else - -#define KASSERT(cond, str) -#define VQASSERT(_vq, _exp, _msg) -#define VQ_RING_ASSERT_VALID_IDX(_vq, _idx) -#define VQ_RING_ASSERT_CHAIN_TERM(_vq) -#define VQ_PARAM_CHK(condition, status_var, status_err) -#define VQUEUE_BUSY(vq) -#define VQUEUE_IDLE(vq) - -#endif - -int virtqueue_create(struct virtio_device *device, unsigned short id, - const char *name, struct vring_alloc_info *ring, - void (*callback)(struct virtqueue *vq), - void (*notify)(struct virtqueue *vq), - struct virtqueue *v_queue); - -/* - * virtqueue_set_shmem_io - * - * set virtqueue shared memory I/O region - * - * @vq - virt queue - * @io - pointer to the shared memory I/O region - */ -static inline void virtqueue_set_shmem_io(struct virtqueue *vq, - struct metal_io_region *io) -{ - vq->shm_io = io; -} - -int virtqueue_add_buffer(struct virtqueue *vq, struct virtqueue_buf *buf_list, - int readable, int writable, void *cookie); - -void *virtqueue_get_buffer(struct virtqueue *vq, uint32_t *len, uint16_t *idx); - -void *virtqueue_get_available_buffer(struct virtqueue *vq, uint16_t *avail_idx, - uint32_t *len); - -int virtqueue_add_consumed_buffer(struct virtqueue *vq, uint16_t head_idx, - uint32_t len); - -void virtqueue_disable_cb(struct virtqueue *vq); - -int virtqueue_enable_cb(struct virtqueue *vq); - -void virtqueue_kick(struct virtqueue *vq); - -/* -static inline struct virtqueue *virtqueue_allocate(unsigned int num_desc_extra) -{ - struct virtqueue *vqs; - uint32_t vq_size = sizeof(struct virtqueue) + - num_desc_extra * sizeof(struct vq_desc_extra); - - vqs = (struct virtqueue *)metal_allocate_memory(vq_size); - - if (vqs) { - memset(vqs, 0x00, vq_size); - } - - return vqs; -} -*/ - -void virtqueue_free(struct virtqueue *vq); - -void virtqueue_dump(struct virtqueue *vq); - -void virtqueue_notification(struct virtqueue *vq); - -uint32_t virtqueue_get_desc_size(struct virtqueue *vq); - -uint32_t virtqueue_get_buffer_length(struct virtqueue *vq, uint16_t idx); - -#if defined __cplusplus -} -#endif - -#endif /* VIRTQUEUE_H_ */ +#ifndef VIRTQUEUE_H_ +#define VIRTQUEUE_H_ + +/*- + * Copyright (c) 2011, Bryan Venteicher + * All rights reserved. + * + * SPDX-License-Identifier: BSD-2-Clause + * + * $FreeBSD$ + */ + +#include +#include + +#if defined __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include + +/* Error Codes */ +#define VQ_ERROR_BASE -3000 +#define ERROR_VRING_FULL (VQ_ERROR_BASE - 1) +#define ERROR_INVLD_DESC_IDX (VQ_ERROR_BASE - 2) +#define ERROR_EMPTY_RING (VQ_ERROR_BASE - 3) +#define ERROR_NO_MEM (VQ_ERROR_BASE - 4) +#define ERROR_VRING_MAX_DESC (VQ_ERROR_BASE - 5) +#define ERROR_VRING_ALIGN (VQ_ERROR_BASE - 6) +#define ERROR_VRING_NO_BUFF (VQ_ERROR_BASE - 7) +#define ERROR_VQUEUE_INVLD_PARAM (VQ_ERROR_BASE - 8) + +#define VQUEUE_SUCCESS 0 + +/* The maximum virtqueue size is 2^15. Use that value as the end of + * descriptor chain terminator since it will never be a valid index + * in the descriptor table. This is used to verify we are correctly + * handling vq_free_cnt. + */ +#define VQ_RING_DESC_CHAIN_END 32768 + +/* Support for indirect buffer descriptors. */ +#define VIRTIO_RING_F_INDIRECT_DESC (1 << 28) + +/* Support to suppress interrupt until specific index is reached. */ +#define VIRTIO_RING_F_EVENT_IDX (1 << 29) + +/* cache invalidation helpers */ +#define CACHE_FLUSH(x, s) metal_cache_flush(x, s) +#define CACHE_INVALIDATE(x, s) metal_cache_invalidate(x, s) + +#ifdef VIRTIO_CACHED_VRINGS +#warning "VIRTIO_CACHED_VRINGS is deprecated, please use VIRTIO_USE_DCACHE" +#endif +#if defined(VIRTIO_CACHED_VRINGS) || defined(VIRTIO_USE_DCACHE) +#define VRING_FLUSH(x, s) CACHE_FLUSH(x, s) +#define VRING_INVALIDATE(x, s) CACHE_INVALIDATE(x, s) +#else +#define VRING_FLUSH(x, s) do { } while (0) +#define VRING_INVALIDATE(x, s) do { } while (0) +#endif /* VIRTIO_CACHED_VRINGS || VIRTIO_USE_DCACHE */ + +/** @brief Buffer descriptor. */ +struct virtqueue_buf { + /** Address of the buffer. */ + void *buf; + + /** Size of the buffer. */ + int len; +}; + +/** @brief Vring descriptor extra information for buffer list management. */ +struct vq_desc_extra { + /** Pointer to first descriptor. */ + void *cookie; + + /** Number of chained descriptors. */ + uint16_t ndescs; +}; + +/** @brief Local virtio queue to manage a virtio ring for sending or receiving. */ +struct virtqueue { + /** Associated virtio device. */ + struct virtio_device *vq_dev; + + /** Name of the virtio queue. */ + const char *vq_name; + + /** Index of the virtio queue. */ + uint16_t vq_queue_index; + + /** Max number of buffers in the virtio queue. */ + uint16_t vq_nentries; + + /** Function to invoke, when message is available on the virtio queue. */ + void (*callback)(struct virtqueue *vq); + + /** Private data associated to the virtio queue. */ + void *priv; + + /** Function to invoke, to inform the other side about an update in the virtio queue. */ + void (*notify)(struct virtqueue *vq); + + /** Associated virtio ring. */ + struct vring vq_ring; + + /** Number of free descriptor in the virtio ring. */ + uint16_t vq_free_cnt; + + /** Number of queued buffer in the virtio ring. */ + uint16_t vq_queued_cnt; + + /** + * Metal I/O region of the vrings and buffers. + * This structure is used for conversion between virtual and physical addresses. + */ + void *shm_io; + + /** + * Head of the free chain in the descriptor table. If there are no free descriptors, + * this will be set to VQ_RING_DESC_CHAIN_END. + */ + uint16_t vq_desc_head_idx; + + /** Last consumed descriptor in the used table, trails vq_ring.used->idx. */ + uint16_t vq_used_cons_idx; + + /** Last consumed descriptor in the available table, used by the consumer side. */ + uint16_t vq_available_idx; + +#ifdef VQUEUE_DEBUG + /** Debug counter for virtqueue reentrance check. */ + bool vq_inuse; +#endif + + /** + * Used by the host side during callback. Cookie holds the address of buffer received from + * other side. Other fields in this structure are not used currently. + */ + struct vq_desc_extra vq_descx[0]; +}; + +/** @brief Virtio ring specific information. */ +struct vring_alloc_info { + /** Vring address. */ + void *vaddr; + + /** Vring alignment. */ + uint32_t align; + + /** Number of descriptors in the vring. */ + uint16_t num_descs; + + /** Padding */ + uint16_t pad; +}; + +typedef void (*vq_callback)(struct virtqueue *); +typedef void (*vq_notify)(struct virtqueue *); + +#ifdef VQUEUE_DEBUG +#include +#include + +#define VQASSERT(_vq, _exp, _msg) \ + do { \ + if (!(_exp)) { \ + metal_log(METAL_LOG_EMERGENCY, \ + "%s: %s - "_msg, __func__, (_vq)->vq_name); \ + metal_assert(_exp); \ + } \ + } while (0) + +#define VQ_RING_ASSERT_VALID_IDX(_vq, _idx) \ + VQASSERT((_vq), (_idx) < (_vq)->vq_nentries, "invalid ring index") + +#define VQ_RING_ASSERT_CHAIN_TERM(_vq) \ + VQASSERT((_vq), (_vq)->vq_desc_head_idx == \ + VQ_RING_DESC_CHAIN_END, \ + "full ring terminated incorrectly: invalid head") + +#define VQ_PARAM_CHK(condition, status_var, status_err) \ + do { \ + if (((status_var) == 0) && (condition)) { \ + status_var = status_err; \ + } \ + } while (0) + +#define VQUEUE_BUSY(vq) \ + do { \ + if (!(vq)->vq_inuse) \ + (vq)->vq_inuse = true; \ + else \ + VQASSERT(vq, !(vq)->vq_inuse,\ + "VirtQueue already in use"); \ + } while (0) + +#define VQUEUE_IDLE(vq) ((vq)->vq_inuse = false) + +#else + +#define VQASSERT(_vq, _exp, _msg) +#define VQ_RING_ASSERT_VALID_IDX(_vq, _idx) +#define VQ_RING_ASSERT_CHAIN_TERM(_vq) +#define VQ_PARAM_CHK(condition, status_var, status_err) +#define VQUEUE_BUSY(vq) +#define VQUEUE_IDLE(vq) + +#endif + +/** + * @internal + * + * @brief Creates new VirtIO queue + * + * @param device Pointer to VirtIO device + * @param id VirtIO queue ID , must be unique + * @param name Name of VirtIO queue + * @param ring Pointer to vring_alloc_info control block + * @param callback Pointer to callback function, invoked + * when message is available on VirtIO queue + * @param notify Pointer to notify function, used to notify + * other side that there is job available for it + * @param vq Created VirtIO queue. + * + * @return Function status + */ +int virtqueue_create(struct virtio_device *device, unsigned short id, + const char *name, struct vring_alloc_info *ring, + void (*callback)(struct virtqueue *vq), + void (*notify)(struct virtqueue *vq), + struct virtqueue *vq); + +/* + * virtqueue_set_shmem_io + * + * set virtqueue shared memory I/O region + * + * @vq - virt queue + * @io - pointer to the shared memory I/O region + */ +static inline void virtqueue_set_shmem_io(struct virtqueue *vq, + struct metal_io_region *io) +{ + vq->shm_io = io; +} + +/** + * @internal + * + * @brief Enqueues new buffer in vring for consumption by other side. Readable + * buffers are always inserted before writable buffers + * + * @param vq Pointer to VirtIO queue control block. + * @param buf_list Pointer to a list of virtqueue buffers. + * @param readable Number of readable buffers + * @param writable Number of writable buffers + * @param cookie Pointer to hold call back data + * + * @return Function status + */ +int virtqueue_add_buffer(struct virtqueue *vq, struct virtqueue_buf *buf_list, + int readable, int writable, void *cookie); + +/** + * @internal + * + * @brief Returns used buffers from VirtIO queue + * + * @param vq Pointer to VirtIO queue control block + * @param len Length of conumed buffer + * @param idx Index of the buffer + * + * @return Pointer to used buffer + */ +void *virtqueue_get_buffer(struct virtqueue *vq, uint32_t *len, uint16_t *idx); + +/** + * @internal + * + * @brief Returns buffer available for use in the VirtIO queue + * + * @param vq Pointer to VirtIO queue control block + * @param avail_idx Pointer to index used in vring desc table + * @param len Length of buffer + * + * @return Pointer to available buffer + */ +void *virtqueue_get_available_buffer(struct virtqueue *vq, uint16_t *avail_idx, + uint32_t *len); + +/** + * @internal + * + * @brief Returns consumed buffer back to VirtIO queue + * + * @param vq Pointer to VirtIO queue control block + * @param head_idx Index of vring desc containing used buffer + * @param len Length of buffer + * + * @return Function status + */ +int virtqueue_add_consumed_buffer(struct virtqueue *vq, uint16_t head_idx, + uint32_t len); + +/** + * @internal + * + * @brief Disables callback generation + * + * @param vq Pointer to VirtIO queue control block + */ +void virtqueue_disable_cb(struct virtqueue *vq); + +/** + * @internal + * + * @brief Enables callback generation + * + * @param vq Pointer to VirtIO queue control block + * + * @return Function status + */ +int virtqueue_enable_cb(struct virtqueue *vq); + +/** + * @internal + * + * @brief Notifies other side that there is buffer available for it. + * + * @param vq Pointer to VirtIO queue control block + */ +void virtqueue_kick(struct virtqueue *vq); + +static inline struct virtqueue *virtqueue_allocate(unsigned int num_desc_extra) +{ + struct virtqueue *vqs; + uint32_t vq_size = sizeof(struct virtqueue) + + num_desc_extra * sizeof(struct vq_desc_extra); + + vqs = (struct virtqueue *)metal_allocate_memory(vq_size); + if (vqs) { + memset(vqs, 0x00, vq_size); + } + + return vqs; +} + +/** + * @internal + * + * @brief Frees VirtIO queue resources + * + * @param vq Pointer to VirtIO queue control block + */ +void virtqueue_free(struct virtqueue *vq); + +/** + * @internal + * + * @brief Dumps important virtqueue fields , use for debugging purposes + * + * @param vq Pointer to VirtIO queue control block + */ +void virtqueue_dump(struct virtqueue *vq); + +void virtqueue_notification(struct virtqueue *vq); + +/** + * @internal + * + * @brief Returns vring descriptor size + * + * @param vq Pointer to VirtIO queue control block + * + * @return Descriptor length + */ +uint32_t virtqueue_get_desc_size(struct virtqueue *vq); + +uint32_t virtqueue_get_buffer_length(struct virtqueue *vq, uint16_t idx); +void *virtqueue_get_buffer_addr(struct virtqueue *vq, uint16_t idx); + +/** + * @brief Test if virtqueue is empty + * + * @param vq Pointer to VirtIO queue control block + * + * @return 1 if virtqueue is empty, 0 otherwise + */ +static inline int virtqueue_empty(struct virtqueue *vq) +{ + return (vq->vq_nentries == vq->vq_free_cnt); +} + +/** + * @brief Test if virtqueue is full + * + * @param vq Pointer to VirtIO queue control block + * + * @return 1 if virtqueue is full, 0 otherwise + */ +static inline int virtqueue_full(struct virtqueue *vq) +{ + return (vq->vq_free_cnt == 0); +} + +#if defined __cplusplus +} +#endif + +#endif /* VIRTQUEUE_H_ */ diff --git a/libraries/openamp_arduino/src/openamp_conf.h b/libraries/openamp_arduino/src/openamp_conf.h index 57e2ae178..1eeacd81a 100644 --- a/libraries/openamp_arduino/src/openamp_conf.h +++ b/libraries/openamp_arduino/src/openamp_conf.h @@ -151,13 +151,17 @@ extern int __OPENAMP_region_end__[]; #define SHM_START_ADDRESS ((metal_phys_addr_t)__OPENAMP_region_start__) #define SHM_SIZE (size_t)((void *)__OPENAMP_region_end__ - (void *) __OPENAMP_region_start__) +#define SHM_RSC_SIZE (1024) +#define SHM_RSC_ADDR ((void *)__OPENAMP_region_start__ - SHM_RSC_SIZE) + #endif #define VRING_RX_ADDRESS SHM_START_ADDRESS -#define VRING_TX_ADDRESS (SHM_START_ADDRESS + 0x400) -#define VRING_BUFF_ADDRESS (SHM_START_ADDRESS + 0x800) -#define VRING_ALIGNMENT 4 -#define VRING_NUM_BUFFS 16 /* number of rpmsg buffers */ +#define VRING_TX_ADDRESS (SHM_START_ADDRESS + 0x1000) +#define VRING_BUFF_ADDRESS (SHM_START_ADDRESS + 0x2000) +#define VRING_BUFF_SIZE (SHM_SIZE - 0x2000) +#define VRING_ALIGNMENT 32 +#define VRING_NUM_BUFFS 64 /* number of rpmsg buffers */ /* Fixed parameter */ #define NUM_RESOURCE_ENTRIES 2 diff --git a/libraries/openamp_arduino/src/remoteproc.c b/libraries/openamp_arduino/src/remoteproc.c new file mode 100644 index 000000000..ad16a2d7e --- /dev/null +++ b/libraries/openamp_arduino/src/remoteproc.c @@ -0,0 +1,1030 @@ +/* + * Copyright (c) 2014, Mentor Graphics Corporation + * All rights reserved. + * Copyright (c) 2015 Xilinx, Inc. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/****************************************************************************** + * static functions + *****************************************************************************/ +static const struct loader_ops * +remoteproc_check_fw_format(const void *img_data, size_t img_len) +{ + if (img_len <= 0) + return NULL; + else if (elf_identify(img_data, img_len) == 0) + return &elf_ops; + else + return NULL; +} + +/* try the internal list added by remoteproc_add_mem first and then get_mem callback */ +static struct remoteproc_mem * +remoteproc_get_mem(struct remoteproc *rproc, const char *name, + metal_phys_addr_t pa, metal_phys_addr_t da, + void *va, size_t size, struct remoteproc_mem *buf) +{ + struct metal_list *node; + struct remoteproc_mem *mem; + + /* + * Check name length to avoid overflow. This test has to be kept for + * MISRA compliance + */ + if (name && strlen(name) > RPROC_MAX_NAME_LEN) + return NULL; + + metal_list_for_each(&rproc->mems, node) { + mem = metal_container_of(node, struct remoteproc_mem, node); + if (name) { + if (!strncmp(name, mem->name, RPROC_MAX_NAME_LEN)) + return mem; + } else if (pa != METAL_BAD_PHYS) { + metal_phys_addr_t pa_start, pa_end; + + pa_start = mem->pa; + pa_end = pa_start + mem->size; + if (pa >= pa_start && (pa + size) <= pa_end && pa < pa_end) + return mem; + } else if (da != METAL_BAD_PHYS) { + metal_phys_addr_t da_start, da_end; + + da_start = mem->da; + da_end = da_start + mem->size; + if (da >= da_start && (da + size) <= da_end && da < da_end) + return mem; + } else if (va) { + if (metal_io_virt_to_offset(mem->io, va) != + METAL_BAD_OFFSET) + return mem; + + } else { + return NULL; + } + } + + if (!rproc->ops->get_mem) + return NULL; + + return rproc->ops->get_mem(rproc, name, pa, da, va, size, buf); +} + +static metal_phys_addr_t +remoteproc_datopa(struct remoteproc_mem *mem, metal_phys_addr_t da) +{ + metal_phys_addr_t pa; + + pa = mem->pa + da - mem->da; + return pa; +} + +static metal_phys_addr_t +remoteproc_patoda(struct remoteproc_mem *mem, metal_phys_addr_t pa) +{ + metal_phys_addr_t da; + + da = mem->da + pa - mem->pa; + return da; +} + +static void *remoteproc_get_rsc_table(struct remoteproc *rproc, + void *store, + const struct image_store_ops *store_ops, + size_t offset, + size_t len) +{ + int ret; + void *rsc_table = NULL; + const void *img_data; + + /* Copy the resource table to local memory, + * the caller should be responsible to release the memory + */ + rsc_table = metal_allocate_memory(len); + if (!rsc_table) { + return RPROC_ERR_PTR(-RPROC_ENOMEM); + } + ret = store_ops->load(store, offset, len, &img_data, RPROC_LOAD_ANYADDR, + NULL, 1); + if (ret < 0 || ret < (int)len || !img_data) { + metal_log(METAL_LOG_ERROR, + "get rsc failed: 0x%llx, 0x%llx\r\n", offset, len); + ret = -RPROC_EINVAL; + goto error; + } + memcpy(rsc_table, img_data, len); + + ret = handle_rsc_table(rproc, rsc_table, len, NULL); + if (ret < 0) { + goto error; + } + return rsc_table; + +error: + metal_free_memory(rsc_table); + return RPROC_ERR_PTR(ret); +} + +static int remoteproc_parse_rsc_table(struct remoteproc *rproc, + struct resource_table *rsc_table, + size_t rsc_size) +{ + struct metal_io_region *io; + + if (!rsc_table) + return -RPROC_EINVAL; + + io = remoteproc_get_io_with_va(rproc, rsc_table); + return handle_rsc_table(rproc, rsc_table, rsc_size, io); +} + +int remoteproc_set_rsc_table(struct remoteproc *rproc, + struct resource_table *rsc_table, + size_t rsc_size) +{ + int ret; + struct metal_io_region *io; + + if (!rproc || !rsc_table || rsc_size == 0) + return -RPROC_EINVAL; + + io = remoteproc_get_io_with_va(rproc, rsc_table); + if (!io) + return -RPROC_EINVAL; + ret = remoteproc_parse_rsc_table(rproc, rsc_table, rsc_size); + if (!ret) { + rproc->rsc_table = rsc_table; + rproc->rsc_len = rsc_size; + rproc->rsc_io = io; + } + return ret; +} + +struct remoteproc *remoteproc_init(struct remoteproc *rproc, + const struct remoteproc_ops *ops, void *priv) +{ + if (!rproc || !ops) + return NULL; + + memset(rproc, 0, sizeof(*rproc)); + rproc->state = RPROC_OFFLINE; + metal_mutex_init(&rproc->lock); + metal_list_init(&rproc->mems); + metal_list_init(&rproc->vdevs); + rproc = ops->init(rproc, ops, priv); + return rproc; +} + +int remoteproc_remove(struct remoteproc *rproc) +{ + int ret = 0; + + if (!rproc) + return -RPROC_EINVAL; + + metal_mutex_acquire(&rproc->lock); + if (rproc->state == RPROC_OFFLINE) { + if (rproc->ops->remove) + rproc->ops->remove(rproc); + } else { + ret = -RPROC_EAGAIN; + } + metal_mutex_release(&rproc->lock); + return ret; +} + +int remoteproc_config(struct remoteproc *rproc, void *data) +{ + int ret = -RPROC_ENODEV; + + if (rproc) { + metal_mutex_acquire(&rproc->lock); + if (rproc->state == RPROC_OFFLINE) { + /* configure operation is allowed if the state is + * offline or ready. This function can be called + * multiple times before start the remote. + */ + if (rproc->ops->config) + ret = rproc->ops->config(rproc, data); + else + ret = 0; + rproc->state = RPROC_READY; + } else { + ret = -RPROC_EINVAL; + } + metal_mutex_release(&rproc->lock); + } + return ret; +} + +int remoteproc_start(struct remoteproc *rproc) +{ + int ret = -RPROC_ENODEV; + + if (rproc) { + metal_mutex_acquire(&rproc->lock); + if (rproc->state == RPROC_READY) { + ret = rproc->ops->start(rproc); + rproc->state = RPROC_RUNNING; + } else { + ret = -RPROC_EINVAL; + } + metal_mutex_release(&rproc->lock); + } + return ret; +} + +int remoteproc_stop(struct remoteproc *rproc) +{ + int ret = -RPROC_ENODEV; + + if (rproc) { + metal_mutex_acquire(&rproc->lock); + if (rproc->state != RPROC_STOPPED && + rproc->state != RPROC_OFFLINE) { + if (rproc->ops->stop) + ret = rproc->ops->stop(rproc); + rproc->state = RPROC_STOPPED; + } else { + ret = 0; + } + metal_mutex_release(&rproc->lock); + } + return ret; +} + +int remoteproc_shutdown(struct remoteproc *rproc) +{ + int ret = -RPROC_ENODEV; + + if (rproc) { + ret = 0; + metal_mutex_acquire(&rproc->lock); + if (rproc->state != RPROC_OFFLINE) { + if (rproc->state != RPROC_STOPPED) { + if (rproc->ops->stop) + ret = rproc->ops->stop(rproc); + } + if (!ret) { + if (rproc->ops->shutdown) + ret = rproc->ops->shutdown(rproc); + if (!ret) { + rproc->state = RPROC_OFFLINE; + } + } + } + metal_mutex_release(&rproc->lock); + } + return ret; +} + +struct metal_io_region * +remoteproc_get_io_with_name(struct remoteproc *rproc, + const char *name) +{ + struct remoteproc_mem *mem; + struct remoteproc_mem buf; + + if (!rproc) + return NULL; + + mem = remoteproc_get_mem(rproc, name, + METAL_BAD_PHYS, METAL_BAD_PHYS, NULL, 0, &buf); + if (mem) + return mem->io; + + return NULL; +} + +struct metal_io_region * +remoteproc_get_io_with_pa(struct remoteproc *rproc, + metal_phys_addr_t pa) +{ + struct remoteproc_mem *mem; + struct remoteproc_mem buf; + + if (!rproc) + return NULL; + + mem = remoteproc_get_mem(rproc, NULL, pa, METAL_BAD_PHYS, NULL, 0, &buf); + if (mem) + return mem->io; + + return NULL; +} + +struct metal_io_region * +remoteproc_get_io_with_da(struct remoteproc *rproc, + metal_phys_addr_t da, + unsigned long *offset) +{ + struct remoteproc_mem *mem; + struct remoteproc_mem buf; + + if (!rproc || !offset) + return NULL; + + mem = remoteproc_get_mem(rproc, NULL, METAL_BAD_PHYS, da, NULL, 0, &buf); + if (mem) { + struct metal_io_region *io; + metal_phys_addr_t pa; + + io = mem->io; + pa = remoteproc_datopa(mem, da); + *offset = metal_io_phys_to_offset(io, pa); + return io; + } + + return NULL; +} + +struct metal_io_region * +remoteproc_get_io_with_va(struct remoteproc *rproc, void *va) +{ + struct remoteproc_mem *mem; + struct remoteproc_mem buf; + + if (!rproc) + return NULL; + + mem = remoteproc_get_mem(rproc, NULL, METAL_BAD_PHYS, METAL_BAD_PHYS, + va, 0, &buf); + if (mem) + return mem->io; + + return NULL; +} + +void *remoteproc_mmap(struct remoteproc *rproc, + metal_phys_addr_t *pa, metal_phys_addr_t *da, + size_t size, unsigned int attribute, + struct metal_io_region **io) +{ + void *va = NULL; + metal_phys_addr_t lpa, lda; + struct remoteproc_mem *mem; + struct remoteproc_mem buf; + + if (!rproc || size == 0 || (!pa && !da)) + return NULL; + if (pa) + lpa = *pa; + else + lpa = METAL_BAD_PHYS; + if (da) + lda = *da; + else + lda = METAL_BAD_PHYS; + mem = remoteproc_get_mem(rproc, NULL, lpa, lda, NULL, size, &buf); + if (mem) { + if (lpa != METAL_BAD_PHYS) + lda = remoteproc_patoda(mem, lpa); + else if (lda != METAL_BAD_PHYS) + lpa = remoteproc_datopa(mem, lda); + if (io) + *io = mem->io; + va = metal_io_phys_to_virt(mem->io, lpa); + } else if (rproc->ops->mmap) { + va = rproc->ops->mmap(rproc, &lpa, &lda, size, attribute, io); + } + + if (pa) + *pa = lpa; + if (da) + *da = lda; + return va; +} + +int remoteproc_load(struct remoteproc *rproc, const char *path, + void *store, const struct image_store_ops *store_ops, + void **img_info) +{ + int ret; + const struct loader_ops *loader; + const void *img_data; + void *limg_info = NULL; + size_t offset, noffset; + size_t len, nlen; + int last_load_state; + metal_phys_addr_t da, rsc_da; + size_t rsc_size = 0; + void *rsc_table = NULL; + struct metal_io_region *io = NULL; + + if (!rproc) + return -RPROC_ENODEV; + + metal_mutex_acquire(&rproc->lock); + metal_log(METAL_LOG_DEBUG, "%s: check remoteproc status\r\n", __func__); + /* If remoteproc is not in ready state, cannot load executable */ + if (rproc->state != RPROC_READY && rproc->state != RPROC_CONFIGURED) { + metal_log(METAL_LOG_ERROR, + "load failure: invalid rproc state %d.\r\n", + rproc->state); + metal_mutex_release(&rproc->lock); + return -RPROC_EINVAL; + } + + if (!store_ops) { + metal_log(METAL_LOG_ERROR, + "load failure: loader ops is not set.\r\n"); + metal_mutex_release(&rproc->lock); + return -RPROC_EINVAL; + } + + /* Open executable to get ready to parse */ + metal_log(METAL_LOG_DEBUG, "%s: open executable image\r\n", __func__); + ret = store_ops->open(store, path, &img_data); + if (ret <= 0) { + metal_log(METAL_LOG_ERROR, + "load failure: failed to open firmware %d.\r\n", + ret); + metal_mutex_release(&rproc->lock); + return -RPROC_EINVAL; + } + len = ret; + metal_assert(img_data); + + /* Check executable format to select a parser */ + loader = rproc->loader; + if (!loader) { + metal_log(METAL_LOG_DEBUG, "%s: check loader\r\n", __func__); + loader = remoteproc_check_fw_format(img_data, len); + if (!loader) { + metal_log(METAL_LOG_ERROR, + "load failure: failed to get store ops.\r\n"); + ret = -RPROC_EINVAL; + goto error1; + } + rproc->loader = loader; + } + + /* Load executable headers */ + metal_log(METAL_LOG_DEBUG, "%s: loading headers\r\n", __func__); + offset = 0; + last_load_state = RPROC_LOADER_NOT_READY; + while (1) { + ret = loader->load_header(img_data, offset, len, + &limg_info, last_load_state, + &noffset, &nlen); + last_load_state = ret; + metal_log(METAL_LOG_DEBUG, + "%s, load header 0x%lx, 0x%x, next 0x%lx, 0x%x\r\n", + __func__, offset, len, noffset, nlen); + if (ret < 0) { + metal_log(METAL_LOG_ERROR, + "load header failed 0x%lx,%d.\r\n", + offset, len); + + goto error2; + } else if ((ret & RPROC_LOADER_READY_TO_LOAD) != 0) { + if (nlen == 0) + break; + else if ((noffset > (offset + len)) && + (store_ops->features & SUPPORT_SEEK) == 0) { + /* Required data is not continued, however + * seek is not supported, stop to load + * headers such as ELF section headers which + * is usually located to the end of image. + * Continue to load binary data to target + * memory. + */ + break; + } + } + /* Continue to load headers image data */ + img_data = NULL; + ret = store_ops->load(store, noffset, nlen, + &img_data, + RPROC_LOAD_ANYADDR, + NULL, 1); + if (ret < (int)nlen) { + metal_log(METAL_LOG_ERROR, + "load image data failed 0x%x,%d\r\n", + noffset, nlen); + goto error2; + } + offset = noffset; + len = nlen; + } + ret = loader->locate_rsc_table(limg_info, &rsc_da, &offset, &rsc_size); + if (ret == 0 && rsc_size > 0) { + /* parse resource table */ + rsc_table = remoteproc_get_rsc_table(rproc, store, store_ops, + offset, rsc_size); + } + + /* load executable data */ + metal_log(METAL_LOG_DEBUG, "%s: load executable data\r\n", __func__); + offset = 0; + len = 0; + while (1) { + unsigned char padding; + size_t nmemsize; + metal_phys_addr_t pa; + + da = RPROC_LOAD_ANYADDR; + nlen = 0; + nmemsize = 0; + noffset = 0; + ret = loader->load_data(rproc, img_data, offset, len, + &limg_info, last_load_state, &da, + &noffset, &nlen, &padding, &nmemsize); + if (ret < 0) { + metal_log(METAL_LOG_ERROR, + "load data failed,0x%lx,%d\r\n", + noffset, nlen); + goto error3; + } + metal_log(METAL_LOG_DEBUG, + "load data: da 0x%lx, offset 0x%lx, len = 0x%lx, memsize = 0x%lx, state 0x%x\r\n", + da, noffset, nlen, nmemsize, ret); + last_load_state = ret; + if (da != RPROC_LOAD_ANYADDR) { + /* Data is supposed to be loaded to target memory */ + img_data = NULL; + /* get the I/O region from remoteproc */ + pa = METAL_BAD_PHYS; + (void)remoteproc_mmap(rproc, &pa, &da, nmemsize, 0, + &io); + if (pa == METAL_BAD_PHYS || !io) { + metal_log(METAL_LOG_ERROR, + "load failed, no mapping for 0x%llx.\r\n", + da); + ret = -RPROC_EINVAL; + goto error3; + } + if (nlen > 0) { + ret = store_ops->load(store, noffset, nlen, + &img_data, pa, io, 1); + if (ret != (int)nlen) { + metal_log(METAL_LOG_ERROR, + "load data failed 0x%lx, 0x%lx, 0x%x\r\n", + pa, noffset, nlen); + ret = -RPROC_EINVAL; + goto error3; + } + } + if (nmemsize > nlen) { + size_t tmpoffset; + + tmpoffset = metal_io_phys_to_offset(io, + pa + nlen); + metal_io_block_set(io, tmpoffset, + padding, (nmemsize - nlen)); + } + } else if (nlen != 0) { + ret = store_ops->load(store, noffset, nlen, + &img_data, + RPROC_LOAD_ANYADDR, + NULL, 1); + if (ret < (int)nlen) { + if ((last_load_state & + RPROC_LOADER_POST_DATA_LOAD) != 0) { + metal_log(METAL_LOG_WARNING, + "not all the headers are loaded\r\n"); + break; + } + metal_log(METAL_LOG_ERROR, + "post-load image data failed 0x%x,%d\r\n", + noffset, nlen); + goto error3; + } + offset = noffset; + len = nlen; + } else { + /* (last_load_state & RPROC_LOADER_LOAD_COMPLETE) != 0 */ + break; + } + } + + if (rsc_size == 0) { + ret = loader->locate_rsc_table(limg_info, &rsc_da, + &offset, &rsc_size); + if (ret == 0 && rsc_size > 0) { + /* parse resource table */ + rsc_table = remoteproc_get_rsc_table(rproc, store, + store_ops, + offset, + rsc_size); + } + } + + /* Update resource table */ + if (rsc_table) { + void *rsc_table_cp = rsc_table; + + metal_log(METAL_LOG_DEBUG, + "%s, update resource table\r\n", __func__); + rsc_table = remoteproc_mmap(rproc, NULL, &rsc_da, + rsc_size, 0, &io); + if (rsc_table) { + size_t rsc_io_offset; + + /* Update resource table */ + rsc_io_offset = metal_io_virt_to_offset(io, rsc_table); + ret = metal_io_block_write(io, rsc_io_offset, + rsc_table_cp, rsc_size); + if (ret != (int)rsc_size) { + metal_log(METAL_LOG_WARNING, + "load: failed to update rsc\r\n"); + } + rproc->rsc_table = rsc_table; + rproc->rsc_len = rsc_size; + rproc->rsc_io = io; + } else { + metal_log(METAL_LOG_WARNING, + "load: not able to update rsc table.\r\n"); + } + metal_free_memory(rsc_table_cp); + /* So that the rsc_table will not get released */ + rsc_table = NULL; + } + + metal_log(METAL_LOG_DEBUG, "%s: successfully load firmware\r\n", + __func__); + /* get entry point from the firmware */ + rproc->bootaddr = loader->get_entry(limg_info); + rproc->state = RPROC_READY; + + metal_mutex_release(&rproc->lock); + if (img_info) + *img_info = limg_info; + else + loader->release(limg_info); + store_ops->close(store); + return 0; + +error3: + if (rsc_table) + metal_free_memory(rsc_table); +error2: + loader->release(limg_info); +error1: + store_ops->close(store); + metal_mutex_release(&rproc->lock); + return ret; +} + +int remoteproc_load_noblock(struct remoteproc *rproc, + const void *img_data, size_t offset, size_t len, + void **img_info, + metal_phys_addr_t *pa, struct metal_io_region **io, + size_t *noffset, size_t *nlen, + size_t *nmlen, unsigned char *padding) +{ + int ret; + const struct loader_ops *loader; + void *limg_info = NULL; + int last_load_state; + metal_phys_addr_t da, rsc_da; + size_t rsc_size; + void *rsc_table = NULL, *lrsc_table = NULL; + + if (!rproc) + return -RPROC_ENODEV; + + metal_assert(pa); + metal_assert(io); + metal_assert(noffset); + metal_assert(nlen); + metal_assert(nmlen); + metal_assert(padding); + + metal_mutex_acquire(&rproc->lock); + metal_log(METAL_LOG_DEBUG, "%s: check remoteproc status\r\n", __func__); + /* If remoteproc is not in ready state, cannot load executable */ + if (rproc->state != RPROC_READY) { + metal_log(METAL_LOG_ERROR, + "load failure: invalid rproc state %d.\r\n", + rproc->state); + metal_mutex_release(&rproc->lock); + return -RPROC_EINVAL; + } + + /* Check executable format to select a parser */ + loader = rproc->loader; + if (!loader) { + metal_log(METAL_LOG_DEBUG, "%s: check loader\r\n", __func__); + if (!img_data || offset != 0 || len == 0) { + metal_log(METAL_LOG_ERROR, + "load failure, invalid inputs, not able to identify image.\r\n"); + metal_mutex_release(&rproc->lock); + return -RPROC_EINVAL; + } + loader = remoteproc_check_fw_format(img_data, len); + if (!loader) { + metal_log(METAL_LOG_ERROR, + "load failure: failed to identify image.\r\n"); + metal_mutex_release(&rproc->lock); + return -RPROC_EINVAL; + } + rproc->loader = loader; + } + if (!img_info || !*img_info) { + last_load_state = 0; + } else { + limg_info = *img_info; + last_load_state = loader->get_load_state(limg_info); + if (last_load_state < 0) { + metal_log(METAL_LOG_ERROR, + "load failure, not able get load state.\r\n"); + metal_mutex_release(&rproc->lock); + return -RPROC_EINVAL; + } + } + da = RPROC_LOAD_ANYADDR; + *nlen = 0; + if ((last_load_state & RPROC_LOADER_READY_TO_LOAD) == 0 && + (last_load_state & RPROC_LOADER_LOAD_COMPLETE) == 0) { + /* Get the mandatory executable headers */ + ret = loader->load_header(img_data, offset, len, + &limg_info, last_load_state, + noffset, nlen); + metal_log(METAL_LOG_DEBUG, + "%s, load header 0x%lx, 0x%x, next 0x%lx, 0x%x\r\n", + __func__, offset, len, *noffset, *nlen); + if (ret < 0) { + metal_log(METAL_LOG_ERROR, + "load header failed 0x%lx,%d.\r\n", + offset, len); + goto error1; + } + last_load_state = ret; + if (*nlen != 0 && + (last_load_state & RPROC_LOADER_READY_TO_LOAD) == 0) + goto out; + } + if ((last_load_state & RPROC_LOADER_READY_TO_LOAD) != 0 || + (last_load_state & RPROC_LOADER_POST_DATA_LOAD) != 0) { + /* Enough information to know which target memory for + * which data. + */ + ret = loader->load_data(rproc, img_data, offset, len, + &limg_info, last_load_state, &da, + noffset, nlen, padding, nmlen); + metal_log(METAL_LOG_DEBUG, + "%s, load data 0x%lx, 0x%x, next 0x%lx, 0x%x\r\n", + __func__, offset, len, *noffset, *nlen); + if (ret < 0) { + metal_log(METAL_LOG_ERROR, + "load data failed,0x%lx,%d\r\n", + offset, len); + goto error1; + } + last_load_state = ret; + if (da != RPROC_LOAD_ANYADDR) { + /* get the I/O region from remoteproc */ + *pa = METAL_BAD_PHYS; + (void)remoteproc_mmap(rproc, pa, &da, *nmlen, 0, io); + if (*pa == METAL_BAD_PHYS || !io) { + metal_log(METAL_LOG_ERROR, + "load failed, no mapping for 0x%llx.\r\n", + da); + ret = -RPROC_EINVAL; + goto error1; + } + } + if (*nlen != 0) + goto out; + } + if ((last_load_state & RPROC_LOADER_LOAD_COMPLETE) != 0) { + /* Get resource table */ + size_t rsc_offset; + size_t rsc_io_offset; + + ret = loader->locate_rsc_table(limg_info, &rsc_da, + &rsc_offset, &rsc_size); + if (ret == 0 && rsc_size > 0) { + lrsc_table = metal_allocate_memory(rsc_size); + if (!lrsc_table) { + ret = -RPROC_ENOMEM; + goto error1; + } + rsc_table = remoteproc_mmap(rproc, NULL, &rsc_da, + rsc_size, 0, io); + if (!*io) { + metal_log(METAL_LOG_ERROR, + "load failed: failed to mmap rsc\r\n"); + metal_free_memory(lrsc_table); + goto error1; + } + rsc_io_offset = metal_io_virt_to_offset(*io, rsc_table); + ret = metal_io_block_read(*io, rsc_io_offset, + lrsc_table, rsc_size); + if (ret != (int)rsc_size) { + metal_log(METAL_LOG_ERROR, + "load failed: failed to get rsc\r\n"); + metal_free_memory(lrsc_table); + goto error1; + } + /* parse resource table */ + ret = remoteproc_parse_rsc_table(rproc, lrsc_table, + rsc_size); + if (ret < 0) { + metal_log(METAL_LOG_ERROR, + "load failed: failed to parse rsc\r\n"); + metal_free_memory(lrsc_table); + goto error1; + } + /* Update resource table */ + ret = metal_io_block_write(*io, rsc_io_offset, + lrsc_table, rsc_size); + if (ret != (int)rsc_size) { + metal_log(METAL_LOG_WARNING, + "load executable, failed to update rsc\r\n"); + } + rproc->rsc_table = rsc_table; + rproc->rsc_len = rsc_size; + rproc->rsc_io = *io; + metal_free_memory(lrsc_table); + } + + /* get entry point from the firmware */ + rproc->bootaddr = loader->get_entry(limg_info); + } +out: + if (img_info) + *img_info = limg_info; + else + loader->release(limg_info); + metal_mutex_release(&rproc->lock); + return 0; + +error1: + loader->release(limg_info); + metal_mutex_release(&rproc->lock); + return ret; +} + +unsigned int remoteproc_allocate_id(struct remoteproc *rproc, + unsigned int start, + unsigned int end) +{ + unsigned int notifyid = RSC_NOTIFY_ID_ANY; + + if (start == RSC_NOTIFY_ID_ANY) + start = 0; + if (end == RSC_NOTIFY_ID_ANY) + end = METAL_BITS_PER_ULONG; + if ((start < (8U * sizeof(rproc->bitmap))) && + (end <= (8U * sizeof(rproc->bitmap)))) { + notifyid = metal_bitmap_next_clear_bit(&rproc->bitmap, + start, end); + if (notifyid != end) + metal_bitmap_set_bit(&rproc->bitmap, notifyid); + else + notifyid = RSC_NOTIFY_ID_ANY; + } + return notifyid; +} + +static int remoteproc_virtio_notify(void *priv, uint32_t id) +{ + struct remoteproc *rproc = priv; + + if (rproc->ops->notify) + return rproc->ops->notify(rproc, id); + + return 0; +} + +struct virtio_device * +remoteproc_create_virtio(struct remoteproc *rproc, + int vdev_id, unsigned int role, + void (*rst_cb)(struct virtio_device *vdev)) +{ + char *rsc_table; + struct fw_rsc_vdev *vdev_rsc; + struct metal_io_region *vdev_rsc_io; + struct virtio_device *vdev; + struct remoteproc_virtio *rpvdev; + size_t vdev_rsc_offset; + unsigned int notifyid; + unsigned int num_vrings, i; + struct metal_list *node; + +#ifdef VIRTIO_DRIVER_ONLY + role = (role != VIRTIO_DEV_DRIVER) ? 0xFFFFFFFFUL : role; +#endif + +#ifdef VIRTIO_DEVICE_ONLY + role = (role != VIRTIO_DEV_DEVICE) ? 0xFFFFFFFFUL : role; +#endif + + if (!rproc || (role != VIRTIO_DEV_DEVICE && role != VIRTIO_DEV_DRIVER)) + return NULL; + + metal_assert(rproc); + metal_mutex_acquire(&rproc->lock); + rsc_table = rproc->rsc_table; + vdev_rsc_io = rproc->rsc_io; + vdev_rsc_offset = find_rsc(rsc_table, RSC_VDEV, vdev_id); + if (!vdev_rsc_offset) { + metal_mutex_release(&rproc->lock); + return NULL; + } + vdev_rsc = (struct fw_rsc_vdev *)(rsc_table + vdev_rsc_offset); + notifyid = vdev_rsc->notifyid; + /* Check if the virtio device is already created */ + metal_list_for_each(&rproc->vdevs, node) { + rpvdev = metal_container_of(node, struct remoteproc_virtio, + node); + if (rpvdev->vdev.notifyid == notifyid) { + metal_mutex_release(&rproc->lock); + return &rpvdev->vdev; + } + } + vdev = rproc_virtio_create_vdev(role, notifyid, + vdev_rsc, vdev_rsc_io, rproc, + remoteproc_virtio_notify, + rst_cb); + if (!vdev) { + metal_mutex_release(&rproc->lock); + return NULL; + } + + rproc_virtio_wait_remote_ready(vdev); + + rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); + metal_list_add_tail(&rproc->vdevs, &rpvdev->node); + num_vrings = vdev_rsc->num_of_vrings; + + /* set the notification id for vrings */ + for (i = 0; i < num_vrings; i++) { + struct fw_rsc_vdev_vring *vring_rsc; + metal_phys_addr_t da; + unsigned int num_descs, align; + struct metal_io_region *io; + void *va; + size_t size; + int ret; + + vring_rsc = &vdev_rsc->vring[i]; + notifyid = vring_rsc->notifyid; + da = vring_rsc->da; + num_descs = vring_rsc->num; + align = vring_rsc->align; + size = vring_size(num_descs, align); + va = remoteproc_mmap(rproc, NULL, &da, size, 0, &io); + if (!va) + goto err1; + ret = rproc_virtio_init_vring(vdev, i, notifyid, + va, io, num_descs, align); + if (ret) + goto err1; + } + metal_mutex_release(&rproc->lock); + return vdev; + +err1: + remoteproc_remove_virtio(rproc, vdev); + metal_mutex_release(&rproc->lock); + return NULL; +} + +void remoteproc_remove_virtio(struct remoteproc *rproc, + struct virtio_device *vdev) +{ + struct remoteproc_virtio *rpvdev; + + (void)rproc; + metal_assert(vdev); + + if (vdev) { + rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); + metal_list_del(&rpvdev->node); + rproc_virtio_remove_vdev(&rpvdev->vdev); + } +} + +int remoteproc_get_notification(struct remoteproc *rproc, uint32_t notifyid) +{ + struct remoteproc_virtio *rpvdev; + struct metal_list *node; + int ret; + + if (!rproc) + return 0; + + metal_list_for_each(&rproc->vdevs, node) { + rpvdev = metal_container_of(node, struct remoteproc_virtio, + node); + ret = rproc_virtio_notified(&rpvdev->vdev, notifyid); + if (ret) + return ret; + } + + return 0; +} diff --git a/libraries/openamp_arduino/src/remoteproc_virtio.c b/libraries/openamp_arduino/src/remoteproc_virtio.c index 82b99c477..7ef1064d8 100644 --- a/libraries/openamp_arduino/src/remoteproc_virtio.c +++ b/libraries/openamp_arduino/src/remoteproc_virtio.c @@ -6,54 +6,16 @@ * Copyright(c) 2011 Google, Inc. * All rights reserved. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name Texas Instruments nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include +#include #include #include -static inline struct virtqueue *virtqueue_allocate(unsigned int num_desc_extra) -{ - struct virtqueue *vqs; - uint32_t vq_size = sizeof(struct virtqueue) + - num_desc_extra * sizeof(struct vq_desc_extra); - - vqs = (struct virtqueue *)metal_allocate_memory(vq_size); - - if (vqs) { - memset(vqs, 0x00, vq_size); - } - - return vqs; -} - static void rproc_virtio_virtqueue_notify(struct virtqueue *vq) { struct remoteproc_virtio *rpvdev; @@ -63,7 +25,7 @@ static void rproc_virtio_virtqueue_notify(struct virtqueue *vq) vdev = vq->vq_dev; rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); - metal_assert(vq_id <= vdev->vrings_num); + metal_assert(vq_id < vdev->vrings_num); vring_info = &vdev->vrings_info[vq_id]; rpvdev->notify(rpvdev->priv, vring_info->notifyid); } @@ -78,12 +40,13 @@ static unsigned char rproc_virtio_get_status(struct virtio_device *vdev) rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); vdev_rsc = rpvdev->vdev_rsc; io = rpvdev->vdev_rsc_io; + RSC_TABLE_INVALIDATE(vdev_rsc, sizeof(struct fw_rsc_vdev)); status = metal_io_read8(io, metal_io_virt_to_offset(io, &vdev_rsc->status)); return status; } -#ifndef VIRTIO_SLAVE_ONLY +#ifndef VIRTIO_DEVICE_ONLY static void rproc_virtio_set_status(struct virtio_device *vdev, unsigned char status) { @@ -97,11 +60,12 @@ static void rproc_virtio_set_status(struct virtio_device *vdev, metal_io_write8(io, metal_io_virt_to_offset(io, &vdev_rsc->status), status); - rpvdev->notify(rpvdev->priv, vdev->index); + RSC_TABLE_FLUSH(vdev_rsc, sizeof(struct fw_rsc_vdev)); + rpvdev->notify(rpvdev->priv, vdev->notifyid); } #endif -static uint32_t rproc_virtio_get_features(struct virtio_device *vdev) +static uint32_t rproc_virtio_get_dfeatures(struct virtio_device *vdev) { struct remoteproc_virtio *rpvdev; struct fw_rsc_vdev *vdev_rsc; @@ -111,14 +75,33 @@ static uint32_t rproc_virtio_get_features(struct virtio_device *vdev) rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); vdev_rsc = rpvdev->vdev_rsc; io = rpvdev->vdev_rsc_io; - /* TODO: shall we get features based on the role ? */ + RSC_TABLE_INVALIDATE(vdev_rsc, sizeof(struct fw_rsc_vdev)); features = metal_io_read32(io, metal_io_virt_to_offset(io, &vdev_rsc->dfeatures)); return features; } -#ifndef VIRTIO_SLAVE_ONLY +static uint32_t rproc_virtio_get_features(struct virtio_device *vdev) +{ + struct remoteproc_virtio *rpvdev; + struct fw_rsc_vdev *vdev_rsc; + struct metal_io_region *io; + uint32_t gfeatures; + uint32_t dfeatures; + + rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); + vdev_rsc = rpvdev->vdev_rsc; + io = rpvdev->vdev_rsc_io; + RSC_TABLE_INVALIDATE(vdev_rsc, sizeof(struct fw_rsc_vdev)); + gfeatures = metal_io_read32(io, + metal_io_virt_to_offset(io, &vdev_rsc->gfeatures)); + dfeatures = rproc_virtio_get_dfeatures(vdev); + + return dfeatures & gfeatures; +} + +#ifndef VIRTIO_DEVICE_ONLY static void rproc_virtio_set_features(struct virtio_device *vdev, uint32_t features) { @@ -129,64 +112,90 @@ static void rproc_virtio_set_features(struct virtio_device *vdev, rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); vdev_rsc = rpvdev->vdev_rsc; io = rpvdev->vdev_rsc_io; - /* TODO: shall we set features based on the role ? */ metal_io_write32(io, - metal_io_virt_to_offset(io, &vdev_rsc->dfeatures), + metal_io_virt_to_offset(io, &vdev_rsc->gfeatures), features); - rpvdev->notify(rpvdev->priv, vdev->index); + RSC_TABLE_FLUSH(vdev_rsc, sizeof(struct fw_rsc_vdev)); + rpvdev->notify(rpvdev->priv, vdev->notifyid); } -#endif static uint32_t rproc_virtio_negotiate_features(struct virtio_device *vdev, uint32_t features) { - (void)vdev; - (void)features; + uint32_t dfeatures = rproc_virtio_get_dfeatures(vdev); + + rproc_virtio_set_features(vdev, dfeatures & features); return 0; } +#endif static void rproc_virtio_read_config(struct virtio_device *vdev, uint32_t offset, void *dst, int length) { - (void)vdev; - (void)offset; - (void)dst; - (void)length; + struct remoteproc_virtio *rpvdev; + struct fw_rsc_vdev *vdev_rsc; + struct metal_io_region *io; + char *config; + + rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); + vdev_rsc = rpvdev->vdev_rsc; + config = (char *)(&vdev_rsc->vring[vdev->vrings_num]); + io = rpvdev->vdev_rsc_io; + + if (offset + length <= vdev_rsc->config_len) { + RSC_TABLE_INVALIDATE(config + offset, length); + metal_io_block_read(io, + metal_io_virt_to_offset(io, config + offset), + dst, length); + } } -#ifndef VIRTIO_SLAVE_ONLY +#ifndef VIRTIO_DEVICE_ONLY static void rproc_virtio_write_config(struct virtio_device *vdev, uint32_t offset, void *src, int length) { - (void)vdev; - (void)offset; - (void)src; - (void)length; + struct remoteproc_virtio *rpvdev; + struct fw_rsc_vdev *vdev_rsc; + struct metal_io_region *io; + char *config; + + rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); + vdev_rsc = rpvdev->vdev_rsc; + config = (char *)(&vdev_rsc->vring[vdev->vrings_num]); + io = rpvdev->vdev_rsc_io; + + if (offset + length <= vdev_rsc->config_len) { + metal_io_block_write(io, + metal_io_virt_to_offset(io, config + offset), + src, length); + RSC_TABLE_FLUSH(config + offset, length); + rpvdev->notify(rpvdev->priv, vdev->notifyid); + } } static void rproc_virtio_reset_device(struct virtio_device *vdev) { - if (vdev->role == VIRTIO_DEV_MASTER) + if (vdev->role == VIRTIO_DEV_DRIVER) rproc_virtio_set_status(vdev, VIRTIO_CONFIG_STATUS_NEEDS_RESET); } #endif -const struct virtio_dispatch remoteproc_virtio_dispatch_funcs = { - .get_status = rproc_virtio_get_status, +static const struct virtio_dispatch remoteproc_virtio_dispatch_funcs = { + .get_status = rproc_virtio_get_status, .get_features = rproc_virtio_get_features, .read_config = rproc_virtio_read_config, .notify = rproc_virtio_virtqueue_notify, - .negotiate_features = rproc_virtio_negotiate_features, -#ifndef VIRTIO_SLAVE_ONLY +#ifndef VIRTIO_DEVICE_ONLY /* * We suppose here that the vdev is in a shared memory so that can - * be access only by one core: the master. In this case salve core has + * be access only by one core: the host. In this case salve core has * only read access right. */ .set_status = rproc_virtio_set_status, .set_features = rproc_virtio_set_features, + .negotiate_features = rproc_virtio_negotiate_features, .write_config = rproc_virtio_write_config, .reset_device = rproc_virtio_reset_device, #endif @@ -207,9 +216,8 @@ rproc_virtio_create_vdev(unsigned int role, unsigned int notifyid, unsigned int i; rpvdev = metal_allocate_memory(sizeof(*rpvdev)); - if (!rpvdev) { + if (!rpvdev) return NULL; - } vrings_info = metal_allocate_memory(sizeof(*vrings_info) * num_vrings); if (!vrings_info) goto err0; @@ -219,21 +227,23 @@ rproc_virtio_create_vdev(unsigned int role, unsigned int notifyid, for (i = 0; i < num_vrings; i++) { struct virtqueue *vq; +#ifndef VIRTIO_DEVICE_ONLY struct fw_rsc_vdev_vring *vring_rsc; +#endif unsigned int num_extra_desc = 0; +#ifndef VIRTIO_DEVICE_ONLY vring_rsc = &vdev_rsc->vring[i]; - if (role == VIRTIO_DEV_MASTER) { + if (role == VIRTIO_DEV_DRIVER) { num_extra_desc = vring_rsc->num; } +#endif vq = virtqueue_allocate(num_extra_desc); if (!vq) goto err1; vrings_info[i].vq = vq; } - /* FIXME commended as seems not nedded, already stored in vdev */ - //rpvdev->notifyid = notifyid; rpvdev->notify = notify; rpvdev->priv = priv; vdev->vrings_info = vrings_info; @@ -243,12 +253,19 @@ rproc_virtio_create_vdev(unsigned int role, unsigned int notifyid, rpvdev->vdev_rsc = vdev_rsc; rpvdev->vdev_rsc_io = rsc_io; - vdev->index = notifyid; + vdev->notifyid = notifyid; vdev->role = role; vdev->reset_cb = rst_cb; vdev->vrings_num = num_vrings; vdev->func = &remoteproc_virtio_dispatch_funcs; - /* TODO: Shall we set features here ? */ + +#ifndef VIRTIO_DEVICE_ONLY + if (role == VIRTIO_DEV_DRIVER) { + uint32_t dfeatures = rproc_virtio_get_dfeatures(vdev); + /* Assume the virtio driver support all remote features */ + rproc_virtio_negotiate_features(vdev, dfeatures); + } +#endif return &rpvdev->vdev; @@ -278,7 +295,8 @@ void rproc_virtio_remove_vdev(struct virtio_device *vdev) if (vq) metal_free_memory(vq); } - metal_free_memory(vdev->vrings_info); + if (vdev->vrings_info) + metal_free_memory(vdev->vrings_info); metal_free_memory(rpvdev); } @@ -291,7 +309,7 @@ int rproc_virtio_init_vring(struct virtio_device *vdev, unsigned int index, unsigned int num_vrings; num_vrings = vdev->vrings_num; - if (index >= num_vrings) + if ((index >= num_vrings) || (num_descs > RPROC_MAX_VRING_DESC)) return -RPROC_EINVAL; vring_info = &vdev->vrings_info[index]; vring_info->io = io; @@ -310,9 +328,9 @@ int rproc_virtio_notified(struct virtio_device *vdev, uint32_t notifyid) struct virtqueue *vq; if (!vdev) - return -EINVAL; + return -RPROC_EINVAL; /* We do nothing for vdev notification in this implementation */ - if (vdev->index == notifyid) + if (vdev->notifyid == notifyid) return 0; num_vrings = vdev->vrings_num; for (i = 0; i < num_vrings; i++) { @@ -330,17 +348,19 @@ void rproc_virtio_wait_remote_ready(struct virtio_device *vdev) { uint8_t status; +#ifndef VIRTIO_DEVICE_ONLY /* - * No status available for slave. As Master has not to wait - * slave action, we can return. Behavior should be updated - * in future if a slave status is added. + * No status available for remote. As virtio driver has not to wait + * remote action, we can return. Behavior should be updated + * in future if a remote status is added. */ - if (vdev->role == VIRTIO_DEV_MASTER) + if (vdev->role == VIRTIO_DEV_DRIVER) return; - +#endif while (1) { status = rproc_virtio_get_status(vdev); if (status & VIRTIO_CONFIG_STATUS_DRIVER_OK) return; + metal_cpu_yield(); } } diff --git a/libraries/openamp_arduino/src/rpmsg.c b/libraries/openamp_arduino/src/rpmsg.c index 9268889e0..5a9237f47 100644 --- a/libraries/openamp_arduino/src/rpmsg.c +++ b/libraries/openamp_arduino/src/rpmsg.c @@ -9,19 +9,20 @@ #include #include -#include #include "rpmsg_internal.h" /** - * rpmsg_get_address + * @internal + * + * @brief rpmsg_get_address * * This function provides unique 32 bit address. * - * @param bitmap - bit map for addresses - * @param size - size of bitmap + * @param bitmap Bit map for addresses + * @param size Size of bitmap * - * return - a unique address + * @return A unique address */ static uint32_t rpmsg_get_address(unsigned long *bitmap, int size) { @@ -30,7 +31,7 @@ static uint32_t rpmsg_get_address(unsigned long *bitmap, int size) nextbit = metal_bitmap_next_clear_bit(bitmap, 0, size); if (nextbit < (uint32_t)size) { - addr = nextbit; + addr = RPMSG_RESERVED_ADDRESSES + nextbit; metal_bitmap_set_bit(bitmap, nextbit); } @@ -38,54 +39,57 @@ static uint32_t rpmsg_get_address(unsigned long *bitmap, int size) } /** - * rpmsg_release_address + * @internal * - * Frees the given address. + * @brief Frees the given address. * - * @param bitmap - bit map for addresses - * @param size - size of bitmap - * @param addr - address to free + * @param bitmap Bit map for addresses + * @param size Size of bitmap + * @param addr Address to free */ static void rpmsg_release_address(unsigned long *bitmap, int size, int addr) { - if (addr < size) + addr -= RPMSG_RESERVED_ADDRESSES; + if (addr >= 0 && addr < size) metal_bitmap_clear_bit(bitmap, addr); } /** - * rpmsg_is_address_set + * @internal * - * Checks whether address is used or free. + * @brief Checks whether address is used or free. * - * @param bitmap - bit map for addresses - * @param size - size of bitmap - * @param addr - address to free + * @param bitmap Bit map for addresses + * @param size Size of bitmap + * @param addr Address to free * - * return - TRUE/FALSE + * @return TRUE/FALSE */ static int rpmsg_is_address_set(unsigned long *bitmap, int size, int addr) { - if (addr < size) + addr -= RPMSG_RESERVED_ADDRESSES; + if (addr >= 0 && addr < size) return metal_bitmap_is_bit_set(bitmap, addr); else return RPMSG_ERR_PARAM; } /** - * rpmsg_set_address + * @internal * - * Marks the address as consumed. + * @brief Marks the address as consumed. * - * @param bitmap - bit map for addresses - * @param size - size of bitmap - * @param addr - address to free + * @param bitmap Bit map for addresses + * @param size Size of bitmap + * @param addr Address to free * - * return - none + * @return 0 on success, otherwise error code */ static int rpmsg_set_address(unsigned long *bitmap, int size, int addr) { - if (addr < size) { + addr -= RPMSG_RESERVED_ADDRESSES; + if (addr >= 0 && addr < size) { metal_bitmap_set_bit(bitmap, addr); return RPMSG_SUCCESS; } else { @@ -93,34 +97,20 @@ static int rpmsg_set_address(unsigned long *bitmap, int size, int addr) } } -/** - * This function sends rpmsg "message" to remote device. - * - * @param ept - pointer to end point - * @param src - source address of channel - * @param dst - destination address of channel - * @param data - data to transmit - * @param size - size of data - * @param wait - boolean, wait or not for buffer to become - * available - * - * @return - size of data sent or negative value for failure. - * - */ int rpmsg_send_offchannel_raw(struct rpmsg_endpoint *ept, uint32_t src, - uint32_t dst, const void *data, int size, + uint32_t dst, const void *data, int len, int wait) { struct rpmsg_device *rdev; - if (!ept || !ept->rdev || !data || dst == RPMSG_ADDR_ANY) + if (!ept || !ept->rdev || !data || dst == RPMSG_ADDR_ANY || len < 0) return RPMSG_ERR_PARAM; rdev = ept->rdev; if (rdev->ops.send_offchannel_raw) return rdev->ops.send_offchannel_raw(rdev, src, dst, data, - size, wait); + len, wait); return RPMSG_ERR_PARAM; } @@ -142,6 +132,80 @@ int rpmsg_send_ns_message(struct rpmsg_endpoint *ept, unsigned long flags) return RPMSG_SUCCESS; } +void rpmsg_hold_rx_buffer(struct rpmsg_endpoint *ept, void *rxbuf) +{ + struct rpmsg_device *rdev; + + if (!ept || !ept->rdev || !rxbuf) + return; + + rdev = ept->rdev; + + if (rdev->ops.hold_rx_buffer) + rdev->ops.hold_rx_buffer(rdev, rxbuf); +} + +void rpmsg_release_rx_buffer(struct rpmsg_endpoint *ept, void *rxbuf) +{ + struct rpmsg_device *rdev; + + if (!ept || !ept->rdev || !rxbuf) + return; + + rdev = ept->rdev; + + if (rdev->ops.release_rx_buffer) + rdev->ops.release_rx_buffer(rdev, rxbuf); +} + +int rpmsg_release_tx_buffer(struct rpmsg_endpoint *ept, void *buf) +{ + struct rpmsg_device *rdev; + + if (!ept || !ept->rdev || !buf) + return RPMSG_ERR_PARAM; + + rdev = ept->rdev; + + if (rdev->ops.release_tx_buffer) + return rdev->ops.release_tx_buffer(rdev, buf); + + return RPMSG_ERR_PERM; +} + +void *rpmsg_get_tx_payload_buffer(struct rpmsg_endpoint *ept, + uint32_t *len, int wait) +{ + struct rpmsg_device *rdev; + + if (!ept || !ept->rdev || !len) + return NULL; + + rdev = ept->rdev; + + if (rdev->ops.get_tx_payload_buffer) + return rdev->ops.get_tx_payload_buffer(rdev, len, wait); + + return NULL; +} + +int rpmsg_send_offchannel_nocopy(struct rpmsg_endpoint *ept, uint32_t src, + uint32_t dst, const void *data, int len) +{ + struct rpmsg_device *rdev; + + if (!ept || !ept->rdev || !data || dst == RPMSG_ADDR_ANY || len < 0) + return RPMSG_ERR_PARAM; + + rdev = ept->rdev; + + if (rdev->ops.send_offchannel_nocopy) + return rdev->ops.send_offchannel_nocopy(rdev, src, dst, + data, len); + + return RPMSG_ERR_PARAM; +} + struct rpmsg_endpoint *rpmsg_get_endpoint(struct rpmsg_device *rdev, const char *name, uint32_t addr, uint32_t dest_addr) @@ -156,19 +220,16 @@ struct rpmsg_endpoint *rpmsg_get_endpoint(struct rpmsg_device *rdev, /* try to get by local address only */ if (addr != RPMSG_ADDR_ANY && ept->addr == addr) return ept; - /* try to find match on local end remote address */ - if (addr == ept->addr && dest_addr == ept->dest_addr) - return ept; /* else use name service and destination address */ if (name) name_match = !strncmp(ept->name, name, sizeof(ept->name)); if (!name || !name_match) continue; - /* destination address is known, equal to ept remote address*/ + /* destination address is known, equal to ept remote address */ if (dest_addr != RPMSG_ADDR_ANY && ept->dest_addr == dest_addr) return ept; - /* ept is registered but not associated to remote ept*/ + /* ept is registered but not associated to remote ept */ if (addr == RPMSG_ADDR_ANY && ept->dest_addr == RPMSG_ADDR_ANY) return ept; } @@ -177,40 +238,51 @@ struct rpmsg_endpoint *rpmsg_get_endpoint(struct rpmsg_device *rdev, static void rpmsg_unregister_endpoint(struct rpmsg_endpoint *ept) { - struct rpmsg_device *rdev; - - if (!ept) - return; - - rdev = ept->rdev; + struct rpmsg_device *rdev = ept->rdev; + metal_mutex_acquire(&rdev->lock); if (ept->addr != RPMSG_ADDR_ANY) rpmsg_release_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE, ept->addr); metal_list_del(&ept->node); + ept->rdev = NULL; + metal_mutex_release(&rdev->lock); } -int rpmsg_register_endpoint(struct rpmsg_device *rdev, - struct rpmsg_endpoint *ept) +void rpmsg_register_endpoint(struct rpmsg_device *rdev, + struct rpmsg_endpoint *ept, + const char *name, + uint32_t src, uint32_t dest, + rpmsg_ept_cb cb, + rpmsg_ns_unbind_cb ns_unbind_cb) { + strncpy(ept->name, name ? name : "", sizeof(ept->name)); + ept->addr = src; + ept->dest_addr = dest; + ept->cb = cb; + ept->ns_unbind_cb = ns_unbind_cb; ept->rdev = rdev; - metal_list_add_tail(&rdev->endpoints, &ept->node); - return RPMSG_SUCCESS; } int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev, const char *name, uint32_t src, uint32_t dest, rpmsg_ept_cb cb, rpmsg_ns_unbind_cb unbind_cb) { - int status; + int status = RPMSG_SUCCESS; uint32_t addr = src; - if (!ept) + if (!ept || !rdev || !cb) return RPMSG_ERR_PARAM; metal_mutex_acquire(&rdev->lock); - if (src != RPMSG_ADDR_ANY) { + if (src == RPMSG_ADDR_ANY) { + addr = rpmsg_get_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE); + if (addr == RPMSG_ADDR_ANY) { + status = RPMSG_ERR_ADDR; + goto ret_status; + } + } else if (src >= RPMSG_RESERVED_ADDRESSES) { status = rpmsg_is_address_set(rdev->bitmap, RPMSG_ADDR_BMP_SIZE, src); if (!status) { @@ -218,54 +290,46 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev, rpmsg_set_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE, src); } else if (status > 0) { - status = RPMSG_SUCCESS; + status = RPMSG_ERR_ADDR; goto ret_status; } else { goto ret_status; } } else { - addr = rpmsg_get_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE); + /* Skip check the address duplication in 0-1023: + * 1.Trust the author of predefined service + * 2.Simplify the tracking implementation + */ } - rpmsg_init_ept(ept, name, addr, dest, cb, unbind_cb); - - status = rpmsg_register_endpoint(rdev, ept); - if (status < 0) - rpmsg_release_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE, addr); + rpmsg_register_endpoint(rdev, ept, name, addr, dest, cb, unbind_cb); + metal_mutex_release(&rdev->lock); - if (!status && ept->dest_addr == RPMSG_ADDR_ANY) { - /* Send NS announcement to remote processor */ - metal_mutex_release(&rdev->lock); + /* Send NS announcement to remote processor */ + if (ept->name[0] && rdev->support_ns && + ept->dest_addr == RPMSG_ADDR_ANY) status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE); - metal_mutex_acquire(&rdev->lock); - if (status) - rpmsg_unregister_endpoint(ept); - } + + if (status) + rpmsg_unregister_endpoint(ept); + return status; ret_status: metal_mutex_release(&rdev->lock); return status; } -/** - * rpmsg_destroy_ept - * - * This function deletes rpmsg endpoint and performs cleanup. - * - * @param ept - pointer to endpoint to destroy - * - */ void rpmsg_destroy_ept(struct rpmsg_endpoint *ept) { struct rpmsg_device *rdev; - if (!ept) + if (!ept || !ept->rdev) return; rdev = ept->rdev; - if (ept->addr != RPMSG_NS_EPT_ADDR) + + if (ept->name[0] && rdev->support_ns && + ept->addr >= RPMSG_RESERVED_ADDRESSES) (void)rpmsg_send_ns_message(ept, RPMSG_NS_DESTROY); - metal_mutex_acquire(&rdev->lock); rpmsg_unregister_endpoint(ept); - metal_mutex_release(&rdev->lock); } diff --git a/libraries/openamp_arduino/src/rpmsg_internal.h b/libraries/openamp_arduino/src/rpmsg_internal.h index 535a83545..6721ecf88 100644 --- a/libraries/openamp_arduino/src/rpmsg_internal.h +++ b/libraries/openamp_arduino/src/rpmsg_internal.h @@ -1,105 +1,116 @@ -/* - * SPDX-License-Identifier: BSD-3-Clause - * - * $FreeBSD$ - */ - -#ifndef _RPMSG_INTERNAL_H_ -#define _RPMSG_INTERNAL_H_ - -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -#ifdef RPMSG_DEBUG -#define RPMSG_ASSERT(_exp, _msg) do { \ - if (!(_exp)) { \ - openamp_print("FATAL: %s - _msg", __func__); \ - while (1) { \ - ; \ - } \ - } \ - } while (0) -#else -#define RPMSG_ASSERT(_exp, _msg) do { \ - if (!(_exp)) \ - while (1) { \ - ; \ - } \ - } while (0) -#endif - -#define RPMSG_LOCATE_DATA(p) ((unsigned char *)(p) + sizeof(struct rpmsg_hdr)) -/** - * enum rpmsg_ns_flags - dynamic name service announcement flags - * - * @RPMSG_NS_CREATE: a new remote service was just created - * @RPMSG_NS_DESTROY: a known remote service was just destroyed - * @RPMSG_NS_CREATE_WITH_ACK: a new remote service was just created waiting - * acknowledgment. - */ -enum rpmsg_ns_flags { - RPMSG_NS_CREATE = 0, - RPMSG_NS_DESTROY = 1, -}; - -/** - * struct rpmsg_hdr - common header for all rpmsg messages - * @src: source address - * @dst: destination address - * @reserved: reserved for future use - * @len: length of payload (in bytes) - * @flags: message flags - * - * Every message sent(/received) on the rpmsg bus begins with this header. - */ -OPENAMP_PACKED_BEGIN -struct rpmsg_hdr { - uint32_t src; - uint32_t dst; - uint32_t reserved; - uint16_t len; - uint16_t flags; -} OPENAMP_PACKED_END; - -/** - * struct rpmsg_ns_msg - dynamic name service announcement message - * @name: name of remote service that is published - * @addr: address of remote service that is published - * @flags: indicates whether service is created or destroyed - * - * This message is sent across to publish a new service, or announce - * about its removal. When we receive these messages, an appropriate - * rpmsg channel (i.e device) is created/destroyed. In turn, the ->probe() - * or ->remove() handler of the appropriate rpmsg driver will be invoked - * (if/as-soon-as one is registered). - */ -OPENAMP_PACKED_BEGIN -struct rpmsg_ns_msg { - char name[RPMSG_NAME_SIZE]; - uint32_t addr; - uint32_t flags; -} OPENAMP_PACKED_END; - -int rpmsg_send_ns_message(struct rpmsg_endpoint *ept, unsigned long flags); - -struct rpmsg_endpoint *rpmsg_get_endpoint(struct rpmsg_device *rvdev, - const char *name, uint32_t addr, - uint32_t dest_addr); -int rpmsg_register_endpoint(struct rpmsg_device *rdev, - struct rpmsg_endpoint *ept); - -static inline struct rpmsg_endpoint * -rpmsg_get_ept_from_addr(struct rpmsg_device *rdev, uint32_t addr) -{ - return rpmsg_get_endpoint(rdev, NULL, addr, RPMSG_ADDR_ANY); -} - -#if defined __cplusplus -} -#endif - -#endif /* _RPMSG_INTERNAL_H_ */ +/* + * SPDX-License-Identifier: BSD-3-Clause + * + * $FreeBSD$ + */ + +#ifndef _RPMSG_INTERNAL_H_ +#define _RPMSG_INTERNAL_H_ + +#include +#include + +#if defined __cplusplus +extern "C" { +#endif + +#ifdef RPMSG_DEBUG +#include + +#define RPMSG_ASSERT(_exp, _msg) do { \ + if (!(_exp)) { \ + metal_log(METAL_LOG_EMERGENCY, \ + "FATAL: %s - "_msg, __func__); \ + metal_assert(_exp); \ + } \ + } while (0) +#else +#define RPMSG_ASSERT(_exp, _msg) metal_assert(_exp) +#endif + +#define RPMSG_BUF_HELD (1U << 31) /* Flag to suggest to hold the buffer */ + +#define RPMSG_LOCATE_HDR(p) \ + ((struct rpmsg_hdr *)((unsigned char *)(p) - sizeof(struct rpmsg_hdr))) +#define RPMSG_LOCATE_DATA(p) ((unsigned char *)(p) + sizeof(struct rpmsg_hdr)) + +/** + * enum rpmsg_ns_flags - dynamic name service announcement flags + * + * @RPMSG_NS_CREATE: a new remote service was just created + * @RPMSG_NS_DESTROY: a known remote service was just destroyed + * @RPMSG_NS_CREATE_WITH_ACK: a new remote service was just created waiting + * acknowledgment. + */ +enum rpmsg_ns_flags { + RPMSG_NS_CREATE = 0, + RPMSG_NS_DESTROY = 1, +}; + +/** + * @brief Common header for all RPMsg messages + * + * Every message sent(/received) on the RPMsg bus begins with this header. + */ +METAL_PACKED_BEGIN +struct rpmsg_hdr { + /** Source address */ + uint32_t src; + + /** Destination address */ + uint32_t dst; + + /** Reserved for future use */ + uint32_t reserved; + + /** Length of payload (in bytes) */ + uint16_t len; + + /** Message flags */ + uint16_t flags; +} METAL_PACKED_END; + +/** + * @brief Dynamic name service announcement message + * + * This message is sent across to publish a new service, or announce + * about its removal. When we receive these messages, an appropriate + * RPMsg channel (i.e device) is created/destroyed. In turn, the ->probe() + * or ->remove() handler of the appropriate RPMsg driver will be invoked + * (if/as-soon-as one is registered). + */ +METAL_PACKED_BEGIN +struct rpmsg_ns_msg { + /** Name of the remote service that is being published */ + char name[RPMSG_NAME_SIZE]; + + /** Endpoint address of the remote service that is being published */ + uint32_t addr; + + /** Indicates whether service is created or destroyed */ + uint32_t flags; +} METAL_PACKED_END; + +int rpmsg_send_ns_message(struct rpmsg_endpoint *ept, unsigned long flags); + +struct rpmsg_endpoint *rpmsg_get_endpoint(struct rpmsg_device *rvdev, + const char *name, uint32_t addr, + uint32_t dest_addr); +void rpmsg_register_endpoint(struct rpmsg_device *rdev, + struct rpmsg_endpoint *ept, + const char *name, + uint32_t src, uint32_t dest, + rpmsg_ept_cb cb, + rpmsg_ns_unbind_cb ns_unbind_cb); + +static inline struct rpmsg_endpoint * +rpmsg_get_ept_from_addr(struct rpmsg_device *rdev, uint32_t addr) +{ + return rpmsg_get_endpoint(rdev, NULL, addr, RPMSG_ADDR_ANY); +} + +#if defined __cplusplus +} +#endif + +#endif /* _RPMSG_INTERNAL_H_ */ diff --git a/libraries/openamp_arduino/src/rpmsg_virtio.c b/libraries/openamp_arduino/src/rpmsg_virtio.c index 207edc3ed..ea4cc0d9e 100644 --- a/libraries/openamp_arduino/src/rpmsg_virtio.c +++ b/libraries/openamp_arduino/src/rpmsg_virtio.c @@ -3,12 +3,12 @@ * All rights reserved. * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. * Copyright (c) 2018 Linaro, Inc. All rights reserved. + * Copyright (c) 2021 Nordic Semiconductor ASA * * SPDX-License-Identifier: BSD-3-Clause */ #include -#include #include #include #include @@ -16,62 +16,86 @@ #include "rpmsg_internal.h" -#define RPMSG_NUM_VRINGS (2) +#define RPMSG_NUM_VRINGS 2 -/* Total tick count for 15secs - 1msec tick. */ -#define RPMSG_TICK_COUNT 15000 +/* Total tick count for 15secs - 1usec tick. */ +#define RPMSG_TICK_COUNT 15000000 -/* Time to wait - In multiple of 10 msecs. */ -#define RPMSG_TICKS_PER_INTERVAL 10 +/* Time to wait - In multiple of 1 msecs. */ +#define RPMSG_TICKS_PER_INTERVAL 1000 -#define WORD_SIZE sizeof(unsigned long) -#define WORD_ALIGN(a) ((((a) & (WORD_SIZE - 1)) != 0) ? \ - (((a) & (~(WORD_SIZE - 1))) + WORD_SIZE) : (a)) +/** + * struct vbuff_reclaimer_t - vring buffer recycler + * + * This structure is used by the rpmsg virtio to store unused virtio buffer, as the + * virtqueue structure has been already updated and memory allocated. + * + * @node: node in reclaimer list. + * @idx: virtio descriptor index containing the buffer information. + */ +struct vbuff_reclaimer_t { + struct metal_list node; + uint16_t idx; +}; + +/* Default configuration */ +#ifndef VIRTIO_DEVICE_ONLY +#define RPMSG_VIRTIO_DEFAULT_CONFIG \ + (&(const struct rpmsg_virtio_config) { \ + .h2r_buf_size = RPMSG_BUFFER_SIZE, \ + .r2h_buf_size = RPMSG_BUFFER_SIZE, \ + .split_shpool = false, \ + }) +#else +#define RPMSG_VIRTIO_DEFAULT_CONFIG NULL +#endif -#ifndef VIRTIO_SLAVE_ONLY +#ifndef VIRTIO_DEVICE_ONLY metal_weak void * rpmsg_virtio_shm_pool_get_buffer(struct rpmsg_virtio_shm_pool *shpool, size_t size) { void *buffer; - if (shpool->avail < size) + if (!shpool || size == 0 || shpool->avail < size) return NULL; - buffer = (void *)((char *)shpool->base + shpool->size - shpool->avail); + buffer = (char *)shpool->base + shpool->size - shpool->avail; shpool->avail -= size; return buffer; } -#endif /*!VIRTIO_SLAVE_ONLY*/ +#endif /*!VIRTIO_DEVICE_ONLY*/ void rpmsg_virtio_init_shm_pool(struct rpmsg_virtio_shm_pool *shpool, void *shb, size_t size) { - if (!shpool) + if (!shpool || !shb || size == 0) return; shpool->base = shb; - shpool->size = WORD_ALIGN(size); - shpool->avail = WORD_ALIGN(size); + shpool->size = size; + shpool->avail = size; } /** - * rpmsg_virtio_return_buffer + * @internal * - * Places the used buffer back on the virtqueue. - * - * @param rvdev - pointer to remote core - * @param buffer - buffer pointer - * @param len - buffer length - * @param idx - buffer index + * @brief Places the used buffer back on the virtqueue. * + * @param rvdev Pointer to remote core + * @param buffer Buffer pointer + * @param len Buffer length + * @param idx Buffer index */ static void rpmsg_virtio_return_buffer(struct rpmsg_virtio_device *rvdev, - void *buffer, unsigned long len, - unsigned short idx) + void *buffer, uint32_t len, + uint16_t idx) { unsigned int role = rpmsg_virtio_get_role(rvdev); -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) { + + BUFFER_INVALIDATE(buffer, len); + +#ifndef VIRTIO_DEVICE_ONLY + if (role == RPMSG_HOST) { struct virtqueue_buf vqbuf; (void)idx; @@ -80,140 +104,151 @@ static void rpmsg_virtio_return_buffer(struct rpmsg_virtio_device *rvdev, vqbuf.len = len; virtqueue_add_buffer(rvdev->rvq, &vqbuf, 0, 1, buffer); } -#endif /*VIRTIO_SLAVE_ONLY*/ +#endif /*VIRTIO_DEVICE_ONLY*/ -#ifndef VIRTIO_MASTER_ONLY +#ifndef VIRTIO_DRIVER_ONLY if (role == RPMSG_REMOTE) { (void)buffer; virtqueue_add_consumed_buffer(rvdev->rvq, idx, len); } -#endif /*VIRTIO_MASTER_ONLY*/ +#endif /*VIRTIO_DRIVER_ONLY*/ } /** - * rpmsg_virtio_enqueue_buffer + * @internal * - * Places buffer on the virtqueue for consumption by the other side. + * @brief Places buffer on the virtqueue for consumption by the other side. * - * @param rvdev - pointer to rpmsg virtio - * @param buffer - buffer pointer - * @param len - buffer length - * @param idx - buffer index + * @param rvdev Pointer to rpmsg virtio + * @param buffer Buffer pointer + * @param len Buffer length + * @param idx Buffer index * - * @return - status of function execution + * @return Status of function execution */ static int rpmsg_virtio_enqueue_buffer(struct rpmsg_virtio_device *rvdev, - void *buffer, unsigned long len, - unsigned short idx) + void *buffer, uint32_t len, + uint16_t idx) { unsigned int role = rpmsg_virtio_get_role(rvdev); -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) { + + BUFFER_FLUSH(buffer, len); + +#ifndef VIRTIO_DEVICE_ONLY + if (role == RPMSG_HOST) { struct virtqueue_buf vqbuf; (void)idx; /* Initialize buffer node */ vqbuf.buf = buffer; vqbuf.len = len; - return virtqueue_add_buffer(rvdev->svq, &vqbuf, 0, 1, buffer); + return virtqueue_add_buffer(rvdev->svq, &vqbuf, 1, 0, buffer); } -#endif /*!VIRTIO_SLAVE_ONLY*/ +#endif /*!VIRTIO_DEVICE_ONLY*/ -#ifndef VIRTIO_MASTER_ONLY +#ifndef VIRTIO_DRIVER_ONLY if (role == RPMSG_REMOTE) { (void)buffer; return virtqueue_add_consumed_buffer(rvdev->svq, idx, len); } -#endif /*!VIRTIO_MASTER_ONLY*/ +#endif /*!VIRTIO_DRIVER_ONLY*/ return 0; } /** - * rpmsg_virtio_get_tx_buffer + * @internal * - * Provides buffer to transmit messages. + * @brief Provides buffer to transmit messages. * - * @param rvdev - pointer to rpmsg device - * @param len - length of returned buffer - * @param idx - buffer index + * @param rvdev Pointer to rpmsg device + * @param len Length of returned buffer + * @param idx Buffer index * - * return - pointer to buffer. + * @return Pointer to buffer. */ static void *rpmsg_virtio_get_tx_buffer(struct rpmsg_virtio_device *rvdev, - unsigned long *len, - unsigned short *idx) + uint32_t *len, uint16_t *idx) { unsigned int role = rpmsg_virtio_get_role(rvdev); + struct metal_list *node; + struct vbuff_reclaimer_t *r_desc; void *data = NULL; -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) { - data = virtqueue_get_buffer(rvdev->svq, (uint32_t *)len, idx); - if (data == NULL) { + /* Try first to recycle a buffer that has been freed without been used */ + node = metal_list_first(&rvdev->reclaimer); + if (node) { + r_desc = metal_container_of(node, struct vbuff_reclaimer_t, node); + metal_list_del(node); + data = r_desc; + +#ifndef VIRTIO_DEVICE_ONLY + if (role == RPMSG_HOST) + *len = rvdev->config.h2r_buf_size; +#endif /*!VIRTIO_DEVICE_ONLY*/ +#ifndef VIRTIO_DRIVER_ONLY + if (role == RPMSG_REMOTE) { + *idx = r_desc->idx; + *len = virtqueue_get_buffer_length(rvdev->svq, *idx); + } +#endif /*!VIRTIO_DRIVER_ONLY*/ +#ifndef VIRTIO_DEVICE_ONLY + } else if (role == RPMSG_HOST) { + data = virtqueue_get_buffer(rvdev->svq, len, idx); + if (!data && rvdev->svq->vq_free_cnt) { data = rpmsg_virtio_shm_pool_get_buffer(rvdev->shpool, - RPMSG_BUFFER_SIZE); - *len = RPMSG_BUFFER_SIZE; + rvdev->config.h2r_buf_size); + *len = rvdev->config.h2r_buf_size; + *idx = 0; } +#endif /*!VIRTIO_DEVICE_ONLY*/ +#ifndef VIRTIO_DRIVER_ONLY + } else if (role == RPMSG_REMOTE) { + data = virtqueue_get_available_buffer(rvdev->svq, idx, len); +#endif /*!VIRTIO_DRIVER_ONLY*/ } -#endif /*!VIRTIO_SLAVE_ONLY*/ - -#ifndef VIRTIO_MASTER_ONLY - if (role == RPMSG_REMOTE) { - data = virtqueue_get_available_buffer(rvdev->svq, idx, - (uint32_t *)len); - } -#endif /*!VIRTIO_MASTER_ONLY*/ return data; } /** - * rpmsg_virtio_get_rx_buffer + * @internal * - * Retrieves the received buffer from the virtqueue. + * @brief Retrieves the received buffer from the virtqueue. * - * @param rvdev - pointer to rpmsg device - * @param len - size of received buffer - * @param idx - index of buffer - * - * @return - pointer to received buffer + * @param rvdev Pointer to rpmsg device + * @param len Size of received buffer + * @param idx Index of buffer * + * @return Pointer to received buffer */ static void *rpmsg_virtio_get_rx_buffer(struct rpmsg_virtio_device *rvdev, - unsigned long *len, - unsigned short *idx) + uint32_t *len, uint16_t *idx) { unsigned int role = rpmsg_virtio_get_role(rvdev); void *data = NULL; -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) { - data = virtqueue_get_buffer(rvdev->rvq, (uint32_t *)len, idx); +#ifndef VIRTIO_DEVICE_ONLY + if (role == RPMSG_HOST) { + data = virtqueue_get_buffer(rvdev->rvq, len, idx); } -#endif /*!VIRTIO_SLAVE_ONLY*/ +#endif /*!VIRTIO_DEVICE_ONLY*/ -#ifndef VIRTIO_MASTER_ONLY +#ifndef VIRTIO_DRIVER_ONLY if (role == RPMSG_REMOTE) { data = - virtqueue_get_available_buffer(rvdev->rvq, idx, - (uint32_t *)len); + virtqueue_get_available_buffer(rvdev->rvq, idx, len); } -#endif /*!VIRTIO_MASTER_ONLY*/ +#endif /*!VIRTIO_DRIVER_ONLY*/ - if (data) { - /* FIX ME: library should not worry about if it needs - * to flush/invalidate cache, it is shared memory. - * The shared memory should be mapped properly before - * using it. - */ - metal_cache_invalidate(data, (unsigned int)(*len)); - } + /* Invalidate the buffer before returning it */ + if (data) + BUFFER_INVALIDATE(data, *len); return data; } -#ifndef VIRTIO_MASTER_ONLY -/** +#ifndef VIRTIO_DRIVER_ONLY +/* * check if the remote is ready to start RPMsg communication */ static int rpmsg_virtio_wait_remote_ready(struct rpmsg_virtio_device *rvdev) @@ -232,87 +267,102 @@ static int rpmsg_virtio_wait_remote_ready(struct rpmsg_virtio_device *rvdev) /* TODO: clarify metal_cpu_yield usage*/ metal_cpu_yield(); } - - return false; } -#endif /*!VIRTIO_MASTER_ONLY*/ +#endif /*!VIRTIO_DRIVER_ONLY*/ /** - * _rpmsg_virtio_get_buffer_size - * - * Returns buffer size available for sending messages. + * @internal * - * @param channel - pointer to rpmsg channel + * @brief Returns buffer size available for sending messages. * - * @return - buffer size + * @param rvdev Pointer to rpmsg device * + * @return Buffer size */ static int _rpmsg_virtio_get_buffer_size(struct rpmsg_virtio_device *rvdev) { unsigned int role = rpmsg_virtio_get_role(rvdev); int length = 0; -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) { +#ifndef VIRTIO_DEVICE_ONLY + if (role == RPMSG_HOST) { /* - * If device role is Remote then buffers are provided by us - * (RPMSG Master), so just provide the macro. + * If device role is host then buffers are provided by us, + * so just provide the macro. */ - length = RPMSG_BUFFER_SIZE - sizeof(struct rpmsg_hdr); + length = rvdev->config.h2r_buf_size - sizeof(struct rpmsg_hdr); } -#endif /*!VIRTIO_SLAVE_ONLY*/ +#endif /*!VIRTIO_DEVICE_ONLY*/ -#ifndef VIRTIO_MASTER_ONLY +#ifndef VIRTIO_DRIVER_ONLY if (role == RPMSG_REMOTE) { /* - * If other core is Master then buffers are provided by it, + * If other core is host then buffers are provided by it, * so get the buffer size from the virtqueue. */ length = (int)virtqueue_get_desc_size(rvdev->svq) - sizeof(struct rpmsg_hdr); } -#endif /*!VIRTIO_MASTER_ONLY*/ +#endif /*!VIRTIO_DRIVER_ONLY*/ + + if (length <= 0) { + length = RPMSG_ERR_NO_BUFF; + } return length; } -/** - * This function sends rpmsg "message" to remote device. - * - * @param rdev - pointer to rpmsg device - * @param src - source address of channel - * @param dst - destination address of channel - * @param data - data to transmit - * @param size - size of data - * @param wait - boolean, wait or not for buffer to become - * available - * - * @return - size of data sent or negative value for failure. - * - */ -static int rpmsg_virtio_send_offchannel_raw(struct rpmsg_device *rdev, - uint32_t src, uint32_t dst, - const void *data, - int size, int wait) +static void rpmsg_virtio_hold_rx_buffer(struct rpmsg_device *rdev, void *rxbuf) +{ + struct rpmsg_hdr *rp_hdr; + + (void)rdev; + + rp_hdr = RPMSG_LOCATE_HDR(rxbuf); + + /* Set held status to keep buffer */ + rp_hdr->reserved |= RPMSG_BUF_HELD; +} + +static void rpmsg_virtio_release_rx_buffer(struct rpmsg_device *rdev, + void *rxbuf) { struct rpmsg_virtio_device *rvdev; - struct rpmsg_hdr rp_hdr; - void *buffer = NULL; - unsigned short idx; - int tick_count = 0; - unsigned long buff_len; + struct rpmsg_hdr *rp_hdr; + uint16_t idx; + uint32_t len; + + rvdev = metal_container_of(rdev, struct rpmsg_virtio_device, rdev); + rp_hdr = RPMSG_LOCATE_HDR(rxbuf); + /* The reserved field contains buffer index */ + idx = (uint16_t)(rp_hdr->reserved & ~RPMSG_BUF_HELD); + + metal_mutex_acquire(&rdev->lock); + /* Return buffer on virtqueue. */ + len = virtqueue_get_buffer_length(rvdev->rvq, idx); + rpmsg_virtio_return_buffer(rvdev, rp_hdr, len, idx); + /* Tell peer we return some rx buffers */ + virtqueue_kick(rvdev->rvq); + metal_mutex_release(&rdev->lock); +} + +static void *rpmsg_virtio_get_tx_payload_buffer(struct rpmsg_device *rdev, + uint32_t *len, int wait) +{ + struct rpmsg_virtio_device *rvdev; + struct rpmsg_hdr *rp_hdr; + uint16_t idx; + int tick_count; int status; - struct metal_io_region *io; /* Get the associated remote device for channel. */ rvdev = metal_container_of(rdev, struct rpmsg_virtio_device, rdev); - status = rpmsg_virtio_get_status(rvdev); /* Validate device state */ - if (!(status & VIRTIO_CONFIG_STATUS_DRIVER_OK)) { - return RPMSG_ERR_DEV_STATE; - } + status = rpmsg_virtio_get_status(rvdev); + if (!(status & VIRTIO_CONFIG_STATUS_DRIVER_OK)) + return NULL; if (wait) tick_count = RPMSG_TICK_COUNT / RPMSG_TICKS_PER_INTERVAL; @@ -320,63 +370,157 @@ static int rpmsg_virtio_send_offchannel_raw(struct rpmsg_device *rdev, tick_count = 0; while (1) { - int avail_size; - /* Lock the device to enable exclusive access to virtqueues */ metal_mutex_acquire(&rdev->lock); - avail_size = _rpmsg_virtio_get_buffer_size(rvdev); - if (size <= avail_size) - buffer = rpmsg_virtio_get_tx_buffer(rvdev, &buff_len, - &idx); + rp_hdr = rpmsg_virtio_get_tx_buffer(rvdev, len, &idx); metal_mutex_release(&rdev->lock); - if (buffer || !tick_count) + if (rp_hdr || !tick_count) break; - if (avail_size != 0) - return RPMSG_ERR_BUFF_SIZE; metal_sleep_usec(RPMSG_TICKS_PER_INTERVAL); tick_count--; } - if (!buffer) - return RPMSG_ERR_NO_BUFF; + + if (!rp_hdr) + return NULL; + + /* Store the index into the reserved field to be used when sending */ + rp_hdr->reserved = idx; + + /* Actual data buffer size is vring buffer size minus header length */ + *len -= sizeof(struct rpmsg_hdr); + return RPMSG_LOCATE_DATA(rp_hdr); +} + +static int rpmsg_virtio_send_offchannel_nocopy(struct rpmsg_device *rdev, + uint32_t src, uint32_t dst, + const void *data, int len) +{ + struct rpmsg_virtio_device *rvdev; + struct metal_io_region *io; + struct rpmsg_hdr rp_hdr; + struct rpmsg_hdr *hdr; + uint32_t buff_len; + uint16_t idx; + int status; + + /* Get the associated remote device for channel. */ + rvdev = metal_container_of(rdev, struct rpmsg_virtio_device, rdev); + + hdr = RPMSG_LOCATE_HDR(data); + /* The reserved field contains buffer index */ + idx = hdr->reserved; /* Initialize RPMSG header. */ rp_hdr.dst = dst; rp_hdr.src = src; - rp_hdr.len = size; + rp_hdr.len = len; rp_hdr.reserved = 0; + rp_hdr.flags = 0; /* Copy data to rpmsg buffer. */ io = rvdev->shbuf_io; - status = metal_io_block_write(io, metal_io_virt_to_offset(io, buffer), + status = metal_io_block_write(io, metal_io_virt_to_offset(io, hdr), &rp_hdr, sizeof(rp_hdr)); - RPMSG_ASSERT(status == sizeof(rp_hdr), "failed to write header\n"); + RPMSG_ASSERT(status == sizeof(rp_hdr), "failed to write header\r\n"); - status = metal_io_block_write(io, - metal_io_virt_to_offset(io, - RPMSG_LOCATE_DATA(buffer)), - data, size); - RPMSG_ASSERT(status == size, "failed to write buffer\n"); metal_mutex_acquire(&rdev->lock); +#ifndef VIRTIO_DEVICE_ONLY + if (rpmsg_virtio_get_role(rvdev) == RPMSG_HOST) + buff_len = rvdev->config.h2r_buf_size; + else +#endif /*!VIRTIO_DEVICE_ONLY*/ + buff_len = virtqueue_get_buffer_length(rvdev->svq, idx); + /* Enqueue buffer on virtqueue. */ - status = rpmsg_virtio_enqueue_buffer(rvdev, buffer, buff_len, idx); - RPMSG_ASSERT(status == VQUEUE_SUCCESS, "failed to enqueue buffer\n"); + status = rpmsg_virtio_enqueue_buffer(rvdev, hdr, buff_len, idx); + RPMSG_ASSERT(status == VQUEUE_SUCCESS, "failed to enqueue buffer\r\n"); /* Let the other side know that there is a job to process. */ virtqueue_kick(rvdev->svq); metal_mutex_release(&rdev->lock); - return size; + return len; +} + +static int rpmsg_virtio_release_tx_buffer(struct rpmsg_device *rdev, void *txbuf) +{ + struct rpmsg_virtio_device *rvdev; + struct rpmsg_hdr *rp_hdr = RPMSG_LOCATE_HDR(txbuf); + void *vbuff = rp_hdr; /* only used to avoid warning on the cast of a packed structure */ + struct vbuff_reclaimer_t *r_desc = (struct vbuff_reclaimer_t *)vbuff; + uint16_t idx; + + /* + * Reuse the RPMsg buffer to temporary store the vbuff_reclaimer_t structure. + * Stores the index locally before overwriting the RPMsg header. + */ + idx = rp_hdr->reserved; + + rvdev = metal_container_of(rdev, struct rpmsg_virtio_device, rdev); + + metal_mutex_acquire(&rdev->lock); + + r_desc->idx = idx; + metal_list_add_tail(&rvdev->reclaimer, &r_desc->node); + + metal_mutex_release(&rdev->lock); + + return RPMSG_SUCCESS; } /** - * rpmsg_virtio_tx_callback + * @internal * - * Tx callback function. + * @brief This function sends rpmsg "message" to remote device. + * + * @param rdev Pointer to rpmsg device + * @param src Source address of channel + * @param dst Destination address of channel + * @param data Data to transmit + * @param len Size of data + * @param wait Boolean, wait or not for buffer to become + * available + * + * @return Size of data sent or negative value for failure. + */ +static int rpmsg_virtio_send_offchannel_raw(struct rpmsg_device *rdev, + uint32_t src, uint32_t dst, + const void *data, + int len, int wait) +{ + struct rpmsg_virtio_device *rvdev; + struct metal_io_region *io; + uint32_t buff_len; + void *buffer; + int status; + + /* Get the associated remote device for channel. */ + rvdev = metal_container_of(rdev, struct rpmsg_virtio_device, rdev); + + /* Get the payload buffer. */ + buffer = rpmsg_virtio_get_tx_payload_buffer(rdev, &buff_len, wait); + if (!buffer) + return RPMSG_ERR_NO_BUFF; + + /* Copy data to rpmsg buffer. */ + if (len > (int)buff_len) + len = buff_len; + io = rvdev->shbuf_io; + status = metal_io_block_write(io, metal_io_virt_to_offset(io, buffer), + data, len); + RPMSG_ASSERT(status == len, "failed to write buffer\r\n"); + + return rpmsg_virtio_send_offchannel_nocopy(rdev, src, dst, buffer, len); +} + +/** + * @internal * - * @param vq - pointer to virtqueue on which Tx is has been - * completed. + * @brief Tx callback function. * + * @param vq Pointer to virtqueue on which Tx is has been + * completed. */ static void rpmsg_virtio_tx_callback(struct virtqueue *vq) { @@ -384,12 +528,11 @@ static void rpmsg_virtio_tx_callback(struct virtqueue *vq) } /** - * rpmsg_virtio_rx_callback - * - * Rx callback function. + * @internal * - * @param vq - pointer to virtqueue on which messages is received + * @brief Rx callback function. * + * @param vq Pointer to virtqueue on which messages is received */ static void rpmsg_virtio_rx_callback(struct virtqueue *vq) { @@ -398,73 +541,71 @@ static void rpmsg_virtio_rx_callback(struct virtqueue *vq) struct rpmsg_device *rdev = &rvdev->rdev; struct rpmsg_endpoint *ept; struct rpmsg_hdr *rp_hdr; - unsigned long len; - unsigned short idx; + uint32_t len; + uint16_t idx; int status; metal_mutex_acquire(&rdev->lock); /* Process the received data from remote node */ - rp_hdr = (struct rpmsg_hdr *)rpmsg_virtio_get_rx_buffer(rvdev, - &len, &idx); + rp_hdr = rpmsg_virtio_get_rx_buffer(rvdev, &len, &idx); metal_mutex_release(&rdev->lock); while (rp_hdr) { + rp_hdr->reserved = idx; + /* Get the channel node from the remote device channels list. */ metal_mutex_acquire(&rdev->lock); ept = rpmsg_get_ept_from_addr(rdev, rp_hdr->dst); metal_mutex_release(&rdev->lock); - if (!ept) - /* Fatal error no endpoint for the given dst addr. */ - return; + if (ept) { + if (ept->dest_addr == RPMSG_ADDR_ANY) { + /* + * First message received from the remote side, + * update channel destination address + */ + ept->dest_addr = rp_hdr->src; + } + status = ept->cb(ept, RPMSG_LOCATE_DATA(rp_hdr), + rp_hdr->len, rp_hdr->src, ept->priv); - if (ept->dest_addr == RPMSG_ADDR_ANY) { - /* - * First message received from the remote side, - * update channel destination address - */ - ept->dest_addr = rp_hdr->src; + RPMSG_ASSERT(status >= 0, + "unexpected callback status\r\n"); } - status = ept->cb(ept, (void *)RPMSG_LOCATE_DATA(rp_hdr), - rp_hdr->len, ept->addr, ept->priv); - RPMSG_ASSERT(status == RPMSG_SUCCESS, - "unexpected callback status\n"); metal_mutex_acquire(&rdev->lock); - /* Return used buffers. */ - rpmsg_virtio_return_buffer(rvdev, rp_hdr, len, idx); + /* Check whether callback wants to hold buffer */ + if (!(rp_hdr->reserved & RPMSG_BUF_HELD)) { + /* No, return used buffers. */ + rpmsg_virtio_return_buffer(rvdev, rp_hdr, len, idx); + } - rp_hdr = (struct rpmsg_hdr *) - rpmsg_virtio_get_rx_buffer(rvdev, &len, &idx); + rp_hdr = rpmsg_virtio_get_rx_buffer(rvdev, &len, &idx); + if (!rp_hdr) { + /* tell peer we return some rx buffer */ + virtqueue_kick(rvdev->rvq); + } metal_mutex_release(&rdev->lock); } } /** - * rpmsg_virtio_ns_callback + * @internal * - * This callback handles name service announcement from the remote device - * and creates/deletes rpmsg channels. + * @brief This callback handles name service announcement from the remote + * device and creates/deletes rpmsg channels. * - * @param server_chnl - pointer to server channel control block. - * @param data - pointer to received messages - * @param len - length of received data - * @param priv - any private data - * @param src - source address + * @param ept Pointer to server channel control block. + * @param data Pointer to received messages + * @param len Length of received data + * @param priv Any private data + * @param src Source address * - * @return - rpmag endpoint callback handled + * @return Rpmsg endpoint callback handled */ - -#if defined (__GNUC__) && ! defined (__CC_ARM) -#pragma GCC push_options -#pragma GCC optimize ("O0") -#elif defined (__CC_ARM) -#pragma push -#pragma O0 -#endif static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data, size_t len, uint32_t src, void *priv) { @@ -479,7 +620,7 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data, (void)priv; (void)src; - ns_msg = (struct rpmsg_ns_msg *)data; + ns_msg = data; if (len != sizeof(*ns_msg)) /* Returns as the message is corrupted */ return RPMSG_SUCCESS; @@ -497,7 +638,9 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data, _ept->dest_addr = RPMSG_ADDR_ANY; metal_mutex_release(&rdev->lock); if (_ept && _ept->ns_unbind_cb) - _ept->ns_unbind_cb(ept); + _ept->ns_unbind_cb(_ept); + if (rdev->ns_unbind_cb) + rdev->ns_unbind_cb(rdev, name, dest); } else { if (!_ept) { /* @@ -517,11 +660,6 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data, return RPMSG_SUCCESS; } -#if defined (__GNUC__) && ! defined (__CC_ARM) -#pragma GCC pop_options -#elif defined (__CC_ARM) -#pragma pop -#endif int rpmsg_virtio_get_buffer_size(struct rpmsg_device *rdev) { @@ -542,15 +680,27 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, rpmsg_ns_bind_cb ns_bind_cb, struct metal_io_region *shm_io, struct rpmsg_virtio_shm_pool *shpool) +{ + return rpmsg_init_vdev_with_config(rvdev, vdev, ns_bind_cb, shm_io, + shpool, RPMSG_VIRTIO_DEFAULT_CONFIG); +} + +int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev, + struct virtio_device *vdev, + rpmsg_ns_bind_cb ns_bind_cb, + struct metal_io_region *shm_io, + struct rpmsg_virtio_shm_pool *shpool, + const struct rpmsg_virtio_config *config) { struct rpmsg_device *rdev; const char *vq_names[RPMSG_NUM_VRINGS]; - typedef void (*vqcallback)(struct virtqueue *vq); - vqcallback callback[RPMSG_NUM_VRINGS]; - unsigned long dev_features; + vq_callback callback[RPMSG_NUM_VRINGS]; int status; unsigned int i, role; + if (!rvdev || !vdev || !shm_io) + return RPMSG_ERR_PARAM; + rdev = &rvdev->rdev; memset(rdev, 0, sizeof(*rdev)); metal_mutex_init(&rdev->lock); @@ -558,19 +708,50 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, rdev->ns_bind_cb = ns_bind_cb; vdev->priv = rvdev; rdev->ops.send_offchannel_raw = rpmsg_virtio_send_offchannel_raw; + rdev->ops.hold_rx_buffer = rpmsg_virtio_hold_rx_buffer; + rdev->ops.release_rx_buffer = rpmsg_virtio_release_rx_buffer; + rdev->ops.get_tx_payload_buffer = rpmsg_virtio_get_tx_payload_buffer; + rdev->ops.send_offchannel_nocopy = rpmsg_virtio_send_offchannel_nocopy; + rdev->ops.release_tx_buffer = rpmsg_virtio_release_tx_buffer; role = rpmsg_virtio_get_role(rvdev); -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) { +#ifndef VIRTIO_DEVICE_ONLY + if (role == RPMSG_HOST) { + /* + * The virtio configuration contains only options applicable to + * a virtio driver, implying rpmsg host role. + */ + if (config == NULL) { + return RPMSG_ERR_PARAM; + } + rvdev->config = *config; + } +#else /*!VIRTIO_DEVICE_ONLY*/ + /* Ignore passed config in the virtio-device-only configuration. */ + (void)config; +#endif /*!VIRTIO_DEVICE_ONLY*/ + + +#ifndef VIRTIO_DRIVER_ONLY + if (role == RPMSG_REMOTE) { + /* wait synchro with the host */ + rpmsg_virtio_wait_remote_ready(rvdev); + } +#endif /*!VIRTIO_DRIVER_ONLY*/ + vdev->features = rpmsg_virtio_get_features(rvdev); + rdev->support_ns = !!(vdev->features & (1 << VIRTIO_RPMSG_F_NS)); + +#ifndef VIRTIO_DEVICE_ONLY + if (role == RPMSG_HOST) { /* * Since device is RPMSG Remote so we need to manage the * shared buffers. Create shared memory pool to handle buffers. */ + rvdev->shpool = config->split_shpool ? shpool + 1 : shpool; if (!shpool) return RPMSG_ERR_PARAM; - if (!shpool->size) + if (!shpool->size || !rvdev->shpool->size) return RPMSG_ERR_NO_BUFF; - rvdev->shpool = shpool; vq_names[0] = "rx_vq"; vq_names[1] = "tx_vq"; @@ -579,9 +760,9 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, rvdev->rvq = vdev->vrings_info[0].vq; rvdev->svq = vdev->vrings_info[1].vq; } -#endif /*!VIRTIO_SLAVE_ONLY*/ +#endif /*!VIRTIO_DEVICE_ONLY*/ -#ifndef VIRTIO_MASTER_ONLY +#ifndef VIRTIO_DRIVER_ONLY (void)shpool; if (role == RPMSG_REMOTE) { vq_names[0] = "tx_vq"; @@ -591,15 +772,9 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, rvdev->rvq = vdev->vrings_info[1].vq; rvdev->svq = vdev->vrings_info[0].vq; } -#endif /*!VIRTIO_MASTER_ONLY*/ +#endif /*!VIRTIO_DRIVER_ONLY*/ rvdev->shbuf_io = shm_io; - -#ifndef VIRTIO_MASTER_ONLY - if (role == RPMSG_REMOTE) { - /* wait synchro with the master */ - rpmsg_virtio_wait_remote_ready(rvdev); - } -#endif /*!VIRTIO_MASTER_ONLY*/ + metal_list_init(&rvdev->reclaimer); /* Create virtqueues for remote device */ status = rpmsg_virtio_create_virtqueues(rvdev, 0, RPMSG_NUM_VRINGS, @@ -607,6 +782,12 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, if (status != RPMSG_SUCCESS) return status; + /* + * Suppress "tx-complete" interrupts + * since send method use busy loop when buffer pool exhaust + */ + virtqueue_disable_cb(rvdev->svq); + /* TODO: can have a virtio function to set the shared memory I/O */ for (i = 0; i < RPMSG_NUM_VRINGS; i++) { struct virtqueue *vq; @@ -615,17 +796,17 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, vq->shm_io = shm_io; } -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) { +#ifndef VIRTIO_DEVICE_ONLY + if (role == RPMSG_HOST) { struct virtqueue_buf vqbuf; unsigned int idx; void *buffer; - vqbuf.len = RPMSG_BUFFER_SIZE; + vqbuf.len = rvdev->config.r2h_buf_size; for (idx = 0; idx < rvdev->rvq->vq_nentries; idx++) { /* Initialize TX virtqueue buffers for remote device */ buffer = rpmsg_virtio_shm_pool_get_buffer(shpool, - RPMSG_BUFFER_SIZE); + rvdev->config.r2h_buf_size); if (!buffer) { return RPMSG_ERR_NO_BUFF; @@ -636,7 +817,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, metal_io_block_set(shm_io, metal_io_virt_to_offset(shm_io, buffer), - 0x00, RPMSG_BUFFER_SIZE); + 0x00, rvdev->config.r2h_buf_size); status = virtqueue_add_buffer(rvdev->rvq, &vqbuf, 0, 1, buffer); @@ -646,28 +827,25 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, } } } -#endif /*!VIRTIO_SLAVE_ONLY*/ +#endif /*!VIRTIO_DEVICE_ONLY*/ /* Initialize channels and endpoints list */ metal_list_init(&rdev->endpoints); - dev_features = rpmsg_virtio_get_features(rvdev); - /* * Create name service announcement endpoint if device supports name * service announcement feature. */ - if ((dev_features & (1 << VIRTIO_RPMSG_F_NS))) { - rpmsg_init_ept(&rdev->ns_ept, "NS", - RPMSG_NS_EPT_ADDR, RPMSG_NS_EPT_ADDR, - rpmsg_virtio_ns_callback, NULL); - (void)rpmsg_register_endpoint(rdev, &rdev->ns_ept); + if (rdev->support_ns) { + rpmsg_register_endpoint(rdev, &rdev->ns_ept, "NS", + RPMSG_NS_EPT_ADDR, RPMSG_NS_EPT_ADDR, + rpmsg_virtio_ns_callback, NULL); } -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) +#ifndef VIRTIO_DEVICE_ONLY + if (role == RPMSG_HOST) rpmsg_virtio_set_status(rvdev, VIRTIO_CONFIG_STATUS_DRIVER_OK); -#endif /*!VIRTIO_SLAVE_ONLY*/ +#endif /*!VIRTIO_DEVICE_ONLY*/ return status; } @@ -678,15 +856,17 @@ void rpmsg_deinit_vdev(struct rpmsg_virtio_device *rvdev) struct rpmsg_device *rdev; struct rpmsg_endpoint *ept; - rdev = &rvdev->rdev; - while (!metal_list_is_empty(&rdev->endpoints)) { - node = rdev->endpoints.next; - ept = metal_container_of(node, struct rpmsg_endpoint, node); - rpmsg_destroy_ept(ept); - } + if (rvdev) { + rdev = &rvdev->rdev; + while (!metal_list_is_empty(&rdev->endpoints)) { + node = rdev->endpoints.next; + ept = metal_container_of(node, struct rpmsg_endpoint, node); + rpmsg_destroy_ept(ept); + } - rvdev->rvq = 0; - rvdev->svq = 0; + rvdev->rvq = 0; + rvdev->svq = 0; - metal_mutex_deinit(&rdev->lock); + metal_mutex_deinit(&rdev->lock); + } } diff --git a/libraries/openamp_arduino/src/rsc_table.c b/libraries/openamp_arduino/src/rsc_table.c index 3fde24727..f2335dd8f 100644 --- a/libraries/openamp_arduino/src/rsc_table.c +++ b/libraries/openamp_arduino/src/rsc_table.c @@ -21,137 +21,58 @@ ****************************************************************************** */ -/** @addtogroup RSC_TABLE - * @{ - */ - -/** @addtogroup resource_table - * @{ - */ - -/** @addtogroup resource_table_Private_Includes - * @{ - */ - - #if defined(__ICCARM__) || defined (__CC_ARM) #include /* needed for offsetof definition*/ #endif #include "rsc_table.h" #include "openamp/open_amp.h" -/** - * @} - */ - -/** @addtogroup resource_table_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup resource_table_Private_Defines - * @{ - */ - -/* Place resource table in special ELF section */ -#if defined(__GNUC__) -#define __section_t(S) __attribute__((__section__(#S))) -#define __resource __section_t(.resource_table) -#endif - -#define RPMSG_IPU_C0_FEATURES 1 -#define VRING_COUNT 2 - -/* VirtIO rpmsg device id */ -#define VIRTIO_ID_RPMSG_ 7 - #if defined (__LOG_TRACE_IO_) extern char system_log_buf[]; #endif -#if defined(__GNUC__) -#if !defined (__CC_ARM) -/* Since GCC is not initializing the resource_table at startup, it is declared as volatile to avoid compiler optimization - * for the CM4 (see resource_table_init() below) - */ -volatile struct shared_resource_table __resource __attribute__((used)) resource_table; -#else -struct shared_resource_table __resource __attribute__((used)) resource_table = { -#endif -#elif defined(__ICCARM__) -__root struct shared_resource_table resource_table @ ".resource_table" = { -#endif - -#if defined(__ICCARM__) || defined (__CC_ARM) - .version = 1, - .num = 2, - .reserved = {0, 0}, - .offset = { - offsetof(struct shared_resource_table, vdev), - offsetof(struct shared_resource_table, cm_trace), - }, - - /* Virtio device entry */ - .vdev= { - RSC_VDEV, VIRTIO_ID_RPMSG_, 0, RPMSG_IPU_C0_FEATURES, 0, 0, 0, - VRING_COUNT, {0, 0}, - }, - - /* Vring rsc entry - part of vdev rsc entry */ - .vring0 = {VRING_TX_ADDRESS, VRING_ALIGNMENT, VRING_NUM_BUFFS, VRING0_ID, 0}, - .vring1 = {VRING_RX_ADDRESS, VRING_ALIGNMENT, VRING_NUM_BUFFS, VRING1_ID, 0}, - -#if defined (__LOG_TRACE_IO_) - .cm_trace = { - RSC_TRACE, - (uint32_t)system_log_buf, SYSTEM_TRACE_BUF_SZ, 0, "cm4_log", - }, -#endif -} ; -#endif - -void resource_table_init(int RPMsgRole, void **table_ptr, int *length) -{ - -#if defined (__GNUC__) && ! defined (__CC_ARM) -#ifdef CORE_CM7 - /* - * Currently the GCC linker doesn't initialize the resource_table global variable at startup - * it is done here by the CM7 application. - */ - memset(&resource_table, '\0', sizeof(struct shared_resource_table)); - resource_table.num = 1; - resource_table.version = 1; - resource_table.offset[0] = offsetof(struct shared_resource_table, vdev); - - resource_table.vring0.da = VRING_TX_ADDRESS; - resource_table.vring0.align = VRING_ALIGNMENT; - resource_table.vring0.num = VRING_NUM_BUFFS; - resource_table.vring0.notifyid = VRING0_ID; - - resource_table.vring1.da = VRING_RX_ADDRESS; - resource_table.vring1.align = VRING_ALIGNMENT; - resource_table.vring1.num = VRING_NUM_BUFFS; - resource_table.vring1.notifyid = VRING1_ID; - - - resource_table.vdev.type = RSC_VDEV; - resource_table.vdev.id = VIRTIO_ID_RPMSG_; - resource_table.vdev.num_of_vrings=VRING_COUNT; - resource_table.vdev.dfeatures = RPMSG_IPU_C0_FEATURES; -#else - /* For CM4 let's wait until the resource_table is correctly initialized */ - while(resource_table.vring1.da != VRING_RX_ADDRESS) - { - - } -#endif -#endif - - (void)RPMsgRole; - *length = sizeof(resource_table); - *table_ptr = &resource_table; +void resource_table_init(int RPMsgRole, void **table_ptr, int *length) { + (void)RPMsgRole; + volatile struct shared_resource_table *resource_table = SHM_RSC_ADDR; + + #ifdef CORE_CM7 + memset(resource_table, 0, SHM_RSC_SIZE); + resource_table->num = 1; + resource_table->version = 1; + resource_table->offset[0] = offsetof(struct shared_resource_table, vdev); + #if defined (__LOG_TRACE_IO_) + resource_table->offset[1] = offsetof(struct shared_resource_table, cm_trace); + #endif + + resource_table->vring0.da = VRING_TX_ADDRESS; + resource_table->vring0.align = VRING_ALIGNMENT; + resource_table->vring0.num = VRING_NUM_BUFFS; + resource_table->vring0.notifyid = VRING0_ID; + + resource_table->vring1.da = VRING_RX_ADDRESS; + resource_table->vring1.align = VRING_ALIGNMENT; + resource_table->vring1.num = VRING_NUM_BUFFS; + resource_table->vring1.notifyid = VRING1_ID; + + #if defined (__LOG_TRACE_IO_) + resource_table->cm_trace.type; + resource_table->cm_trace.da; + resource_table->cm_trace.len; + resource_table->cm_trace.reserved = 0; + resource_table->cm_trace.name = (uint8_t[]){"cm_trace"}; + #endif + + resource_table->vdev.type = RSC_VDEV; + resource_table->vdev.id = VIRTIO_ID_RPMSG; + resource_table->vdev.num_of_vrings=VRING_COUNT; + resource_table->vdev.dfeatures = (1 << VIRTIO_RPMSG_F_NS); + #else + // For CM4, wait until the resource_table is initialized by the host + while(resource_table->vring1.da != VRING_RX_ADDRESS) { + + } + #endif + + *length = SHM_RSC_SIZE; + *table_ptr = resource_table; } diff --git a/libraries/openamp_arduino/src/rsc_table_parser.c b/libraries/openamp_arduino/src/rsc_table_parser.c new file mode 100644 index 000000000..c099f840b --- /dev/null +++ b/libraries/openamp_arduino/src/rsc_table_parser.c @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2014, Mentor Graphics Corporation + * Copyright (c) 2018, Xilinx Inc. + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include + +static int handle_dummy_rsc(struct remoteproc *rproc, void *rsc); + +/* Resources handler */ +static const rsc_handler rsc_handler_table[] = { + handle_carve_out_rsc, /**< carved out resource */ + handle_dummy_rsc, /**< IOMMU dev mem resource */ + handle_trace_rsc, /**< trace buffer resource */ + handle_vdev_rsc, /**< virtio resource */ +}; + +int handle_rsc_table(struct remoteproc *rproc, + struct resource_table *rsc_table, size_t size, + struct metal_io_region *io) +{ + struct fw_rsc_hdr *hdr; + uint32_t rsc_type; + unsigned int idx, offset; + int status = 0; + + /* Validate rsc table header fields */ + + /* Minimum rsc table size */ + if (sizeof(struct resource_table) > size) { + return -RPROC_ERR_RSC_TAB_TRUNC; + } + + /* Supported version */ + if (rsc_table->ver != RSC_TAB_SUPPORTED_VERSION) { + return -RPROC_ERR_RSC_TAB_VER; + } + + /* Offset array */ + offset = sizeof(struct resource_table) + + rsc_table->num * sizeof(rsc_table->offset[0]); + + if (offset > size) { + return -RPROC_ERR_RSC_TAB_TRUNC; + } + + /* Reserved fields - must be zero */ + if (rsc_table->reserved[0] != 0 || rsc_table->reserved[1] != 0) { + return -RPROC_ERR_RSC_TAB_RSVD; + } + + /* Loop through the offset array and parse each resource entry */ + for (idx = 0; idx < rsc_table->num; idx++) { + hdr = (void *)((char *)rsc_table + rsc_table->offset[idx]); + if (io && metal_io_virt_to_offset(io, hdr) == METAL_BAD_OFFSET) + return -RPROC_ERR_RSC_TAB_TRUNC; + rsc_type = hdr->type; + if (rsc_type < RSC_LAST) + status = rsc_handler_table[rsc_type](rproc, hdr); + else if (rsc_type >= RSC_VENDOR_START && + rsc_type <= RSC_VENDOR_END) + status = handle_vendor_rsc(rproc, hdr); + if (status == -RPROC_ERR_RSC_TAB_NS) { + status = 0; + continue; + } else if (status) { + break; + } + } + + return status; +} + +int handle_carve_out_rsc(struct remoteproc *rproc, void *rsc) +{ + struct fw_rsc_carveout *carve_rsc = rsc; + metal_phys_addr_t da; + metal_phys_addr_t pa; + size_t size; + unsigned int attribute; + + /* Validate resource fields */ + if (!carve_rsc) { + return -RPROC_ERR_RSC_TAB_NP; + } + + if (carve_rsc->reserved) { + return -RPROC_ERR_RSC_TAB_RSVD; + } + pa = carve_rsc->pa; + da = carve_rsc->da; + size = carve_rsc->len; + attribute = carve_rsc->flags; + if (remoteproc_mmap(rproc, &pa, &da, size, attribute, NULL)) + return 0; + else + return -RPROC_EINVAL; +} + +int handle_vendor_rsc(struct remoteproc *rproc, void *rsc) +{ + if (rproc && rproc->ops->handle_rsc) { + struct fw_rsc_vendor *vend_rsc = rsc; + size_t len = vend_rsc->len; + + return rproc->ops->handle_rsc(rproc, rsc, len); + } + return -RPROC_ERR_RSC_TAB_NS; +} + +int handle_vdev_rsc(struct remoteproc *rproc, void *rsc) +{ + struct fw_rsc_vdev *vdev_rsc = rsc; + int i, num_vrings; + unsigned int notifyid; + struct fw_rsc_vdev_vring *vring_rsc; + + /* only assign notification IDs but do not initialize vdev */ + notifyid = vdev_rsc->notifyid; + notifyid = remoteproc_allocate_id(rproc, + notifyid, + notifyid == RSC_NOTIFY_ID_ANY ? + RSC_NOTIFY_ID_ANY : notifyid + 1); + if (notifyid != RSC_NOTIFY_ID_ANY) + vdev_rsc->notifyid = notifyid; + else + return -RPROC_ERR_RSC_TAB_NP; + + num_vrings = vdev_rsc->num_of_vrings; + for (i = 0; i < num_vrings; i++) { + vring_rsc = &vdev_rsc->vring[i]; + notifyid = vring_rsc->notifyid; + notifyid = remoteproc_allocate_id(rproc, + notifyid, + notifyid == RSC_NOTIFY_ID_ANY ? + RSC_NOTIFY_ID_ANY : notifyid + 1); + if (notifyid != RSC_NOTIFY_ID_ANY) + vring_rsc->notifyid = notifyid; + else + goto err; + } + + return 0; + +err: + for (i--; i >= 0; i--) { + vring_rsc = &vdev_rsc->vring[i]; + metal_bitmap_clear_bit(&rproc->bitmap, vring_rsc->notifyid); + } + metal_bitmap_clear_bit(&rproc->bitmap, vdev_rsc->notifyid); + + return -RPROC_ERR_RSC_TAB_NP; +} + +int handle_trace_rsc(struct remoteproc *rproc, void *rsc) +{ + struct fw_rsc_trace *vdev_rsc = rsc; + (void)rproc; + + if (vdev_rsc->da != FW_RSC_U32_ADDR_ANY && vdev_rsc->len != 0) + return 0; + /* FIXME: The host should allocated a memory used by remote */ + + return -RPROC_ERR_RSC_TAB_NS; +} + +/** + * @internal + * + * @brief Dummy resource handler. + * + * @param rproc Pointer to remote remoteproc + * @param rsc Pointer to trace resource + * + * @return No service error + */ +static int handle_dummy_rsc(struct remoteproc *rproc, void *rsc) +{ + (void)rproc; + (void)rsc; + + return -RPROC_ERR_RSC_TAB_NS; +} + +size_t find_rsc(void *rsc_table, unsigned int rsc_type, unsigned int index) +{ + struct resource_table *r_table = rsc_table; + struct fw_rsc_hdr *hdr; + unsigned int i, rsc_index; + unsigned int lrsc_type; + + metal_assert(r_table); + if (!r_table) + return 0; + + /* Loop through the offset array and parse each resource entry */ + rsc_index = 0; + for (i = 0; i < r_table->num; i++) { + hdr = (void *)((char *)r_table + r_table->offset[i]); + lrsc_type = hdr->type; + if (lrsc_type == rsc_type) { + if (rsc_index++ == index) + return r_table->offset[i]; + } + } + return 0; +} diff --git a/libraries/openamp_arduino/src/shmem.c b/libraries/openamp_arduino/src/shmem.c index 5ead8e755..0ded4ec4a 100644 --- a/libraries/openamp_arduino/src/shmem.c +++ b/libraries/openamp_arduino/src/shmem.c @@ -9,8 +9,8 @@ * @brief Generic libmetal shared memory handling. */ -#include #include +#include #include #include #include @@ -38,10 +38,10 @@ int metal_shmem_open_generic(const char *name, size_t size, shmem = metal_container_of(node, struct metal_generic_shmem, node); if (strcmp(shmem->name, name) != 0) continue; - if (size > metal_io_region_size(&shmem->io)) - continue; - *result = &shmem->io; - return 0; + if (size <= metal_io_region_size(&shmem->io)) { + *result = &shmem->io; + return 0; + } } return -ENOENT; diff --git a/libraries/openamp_arduino/src/softirq.c b/libraries/openamp_arduino/src/softirq.c new file mode 100644 index 000000000..4ba745fa1 --- /dev/null +++ b/libraries/openamp_arduino/src/softirq.c @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2019, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define METAL_SOFTIRQ_NUM 64 + +#define METAL_SOFTIRQ_ARRAY_DECLARE(num) \ + static const int metal_softirq_num = num; \ + static struct metal_irq metal_softirqs[num]; \ + static atomic_char metal_softirq_pending[num]; \ + static atomic_char metal_softirq_enabled[num]; + +static int metal_softirq_avail; +METAL_SOFTIRQ_ARRAY_DECLARE(METAL_SOFTIRQ_NUM) + +static void metal_softirq_set_enable(struct metal_irq_controller *cntr, + int irq, unsigned int enable) +{ + if (irq < cntr->irq_base || + irq >= (cntr->irq_base + cntr->irq_num)) { + return; + } + + irq -= cntr->irq_base; + if (enable == METAL_IRQ_ENABLE) { + atomic_store(&metal_softirq_enabled[irq], 1); + } else { + atomic_store(&metal_softirq_enabled[irq], 0); + } +} + +static METAL_IRQ_CONTROLLER_DECLARE(metal_softirq_cntr, + METAL_IRQ_ANY, METAL_SOFTIRQ_NUM, + NULL, + metal_softirq_set_enable, NULL, + metal_softirqs); + +void metal_softirq_set(int irq) +{ + struct metal_irq_controller *cntr; + + cntr = &metal_softirq_cntr; + + if (irq < cntr->irq_base || + irq >= (cntr->irq_base + cntr->irq_num)) { + return; + } + + irq -= cntr->irq_base; + atomic_store(&metal_softirq_pending[irq], 1); +} + +int metal_softirq_init(void) +{ + return metal_irq_register_controller(&metal_softirq_cntr); +} + +int metal_softirq_allocate(int num) +{ + int irq_base; + + if ((metal_softirq_avail + num) >= metal_softirq_num) { + metal_log(METAL_LOG_ERROR, "No %d available soft irqs.\r\n", + num); + return -EINVAL; + } + irq_base = metal_softirq_avail; + irq_base += metal_softirq_cntr.irq_base; + metal_softirq_avail += num; + return irq_base; +} + +void metal_softirq_dispatch(void) +{ + int i; + + for (i = 0; i < metal_softirq_num; i++) { + struct metal_irq *irq; + char is_pending = 1; + + if (atomic_load(&metal_softirq_enabled[i]) != 0 && + atomic_compare_exchange_strong(&metal_softirq_pending[i], + &is_pending, 0)) { + irq = &metal_softirqs[i]; + (void)metal_irq_handle(irq, + i + metal_softirq_cntr.irq_base); + } + } +} diff --git a/libraries/openamp_arduino/src/version.c b/libraries/openamp_arduino/src/version.c new file mode 100644 index 000000000..bc23ee480 --- /dev/null +++ b/libraries/openamp_arduino/src/version.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include + +int metal_ver_major(void) +{ + return METAL_VER_MAJOR; +} + +int metal_ver_minor(void) +{ + return METAL_VER_MINOR; +} + +int metal_ver_patch(void) +{ + return METAL_VER_PATCH; +} + +const char *metal_ver(void) +{ + return METAL_VER; +} diff --git a/libraries/openamp_arduino/src/virtio.c b/libraries/openamp_arduino/src/virtio.c index 5cf87222b..794212a23 100644 --- a/libraries/openamp_arduino/src/virtio.c +++ b/libraries/openamp_arduino/src/virtio.c @@ -9,7 +9,10 @@ static const char *virtio_feature_name(unsigned long feature, const struct virtio_feature_desc *); -//TODO : This structure may change depending on the types of devices we support. +/* + * TODO : + * This structure may change depending on the types of devices we support. + */ static const struct virtio_ident { unsigned short devid; const char *name; @@ -23,6 +26,17 @@ static const struct virtio_ident { VIRTIO_ID_IOMEMORY, "IOMemory"}, { VIRTIO_ID_SCSI, "SCSI"}, { VIRTIO_ID_9P, "9P Transport"}, { + VIRTIO_ID_MAC80211_WLAN, "MAC80211 WLAN"}, { + VIRTIO_ID_RPROC_SERIAL, "Remoteproc Serial"}, { + VIRTIO_ID_GPU, "GPU"}, { + VIRTIO_ID_INPUT, "Input"}, { + VIRTIO_ID_VSOCK, "Vsock Transport"}, { + VIRTIO_ID_SOUND, "Sound"}, { + VIRTIO_ID_FS, "File System"}, { + VIRTIO_ID_MAC80211_HWSIM, "MAC80211 HWSIM"}, { + VIRTIO_ID_I2C_ADAPTER, "I2C Adapter"}, { + VIRTIO_ID_BT, "Bluetooth"}, { + VIRTIO_ID_GPIO, "GPIO" }, { 0, NULL} }; @@ -40,12 +54,12 @@ const char *virtio_dev_name(unsigned short devid) { const struct virtio_ident *ident; - for (ident = virtio_ident_table; ident->name != NULL; ident++) { + for (ident = virtio_ident_table; ident->name; ident++) { if (ident->devid == devid) - return (ident->name); + return ident->name; } - return (NULL); + return NULL; } static const char *virtio_feature_name(unsigned long val, @@ -62,27 +76,27 @@ static const char *virtio_feature_name(unsigned long val, for (j = 0; descs[i][j].vfd_val != 0; j++) { if (val == descs[i][j].vfd_val) - return (descs[i][j].vfd_str); + return descs[i][j].vfd_str; } } - return (NULL); + return NULL; } -void virtio_describe(struct virtio_device *dev, const char *msg, - uint32_t features, struct virtio_feature_desc *desc) +__deprecated void virtio_describe(struct virtio_device *dev, const char *msg, + uint32_t features, struct virtio_feature_desc *desc) { (void)dev; (void)msg; (void)features; - // TODO: Not used currently - keeping it for future use + /* TODO: Not used currently - keeping it for future use*/ virtio_feature_name(0, desc); } int virtio_create_virtqueues(struct virtio_device *vdev, unsigned int flags, unsigned int nvqs, const char *names[], - vq_callback *callbacks[]) + vq_callback callbacks[], void *callback_args[]) { struct virtio_vring_info *vring_info; struct vring_alloc_info *vring_alloc; @@ -90,16 +104,24 @@ int virtio_create_virtqueues(struct virtio_device *vdev, unsigned int flags, int ret; (void)flags; + if (!vdev) + return -EINVAL; + + if (vdev->func && vdev->func->create_virtqueues) { + return vdev->func->create_virtqueues(vdev, flags, nvqs, + names, callbacks, callback_args); + } + num_vrings = vdev->vrings_num; if (nvqs > num_vrings) - return -ERROR_VQUEUE_INVLD_PARAM; + return ERROR_VQUEUE_INVLD_PARAM; /* Initialize virtqueue for each vring */ for (i = 0; i < nvqs; i++) { vring_info = &vdev->vrings_info[i]; vring_alloc = &vring_info->info; -#ifndef VIRTIO_SLAVE_ONLY - if (vdev->role == VIRTIO_DEV_MASTER) { +#ifndef VIRTIO_DEVICE_ONLY + if (vdev->role == VIRTIO_DEV_DRIVER) { size_t offset; struct metal_io_region *io = vring_info->io; diff --git a/libraries/openamp_arduino/src/virtio_mmio_drv.c b/libraries/openamp_arduino/src/virtio_mmio_drv.c new file mode 100644 index 000000000..5f42180a6 --- /dev/null +++ b/libraries/openamp_arduino/src/virtio_mmio_drv.c @@ -0,0 +1,391 @@ +/* + * Copyright (c) 2022 Wind River Systems, Inc. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include +#include +#include +#include + +void virtio_mmio_isr(struct virtio_device *vdev); + +typedef void (*virtio_mmio_vq_callback)(void *); + +static int virtio_mmio_create_virtqueues(struct virtio_device *vdev, unsigned int flags, + unsigned int nvqs, const char *names[], + vq_callback callbacks[], void *callback_args[]); + +static inline void virtio_mmio_write32(struct virtio_device *vdev, int offset, uint32_t value) +{ + struct virtio_mmio_device *vmdev = metal_container_of(vdev, + struct virtio_mmio_device, vdev); + + metal_io_write32(vmdev->cfg_io, offset, value); +} + +static inline uint32_t virtio_mmio_read32(struct virtio_device *vdev, int offset) +{ + struct virtio_mmio_device *vmdev = metal_container_of(vdev, + struct virtio_mmio_device, vdev); + + return metal_io_read32(vmdev->cfg_io, offset); +} + +static inline uint8_t virtio_mmio_read8(struct virtio_device *vdev, int offset) +{ + struct virtio_mmio_device *vmdev = metal_container_of(vdev, + struct virtio_mmio_device, vdev); + + return metal_io_read8(vmdev->cfg_io, offset); +} + +static inline void virtio_mmio_set_status(struct virtio_device *vdev, uint8_t status) +{ + virtio_mmio_write32(vdev, VIRTIO_MMIO_STATUS, status); +} + +static uint8_t virtio_mmio_get_status(struct virtio_device *vdev) +{ + return virtio_mmio_read32(vdev, VIRTIO_MMIO_STATUS); +} + +static void virtio_mmio_write_config(struct virtio_device *vdev, + uint32_t offset, void *dst, int length) +{ + (void)(vdev); + (void)(offset); + (void)(dst); + (void)length; + + metal_log(METAL_LOG_WARNING, "%s not supported\n", __func__); +} + +static void virtio_mmio_read_config(struct virtio_device *vdev, + uint32_t offset, void *dst, int length) +{ + int i; + uint8_t *d = dst; + (void)(offset); + + for (i = 0; i < length; i++) + d[i] = virtio_mmio_read8(vdev, VIRTIO_MMIO_CONFIG + i); +} + +static uint32_t _virtio_mmio_get_features(struct virtio_device *vdev, int idx) +{ + uint32_t hfeatures; + + /* Writing selection register VIRTIO_MMIO_DEVICE_FEATURES_SEL. In pure AMP + * mode this needs to be followed by a synchronization w/ the device + * before reading VIRTIO_MMIO_DEVICE_FEATURES + */ + virtio_mmio_write32(vdev, VIRTIO_MMIO_DEVICE_FEATURES_SEL, idx); + hfeatures = virtio_mmio_read32(vdev, VIRTIO_MMIO_DEVICE_FEATURES); + return hfeatures & vdev->features; +} + +static uint32_t virtio_mmio_get_features(struct virtio_device *vdev) +{ + return _virtio_mmio_get_features(vdev, 0); +} + +/* This is more like negotiate_features */ +static void _virtio_mmio_set_features(struct virtio_device *vdev, + uint32_t features, int idx) +{ + uint32_t hfeatures; + + /* Writing selection register VIRTIO_MMIO_DEVICE_FEATURES_SEL. In pure AMP + * mode this needs to be followed by a synchronization w/ the device + * before reading VIRTIO_MMIO_DEVICE_FEATURES + */ + virtio_mmio_write32(vdev, VIRTIO_MMIO_DEVICE_FEATURES_SEL, idx); + hfeatures = virtio_mmio_read32(vdev, VIRTIO_MMIO_DEVICE_FEATURES); + features &= hfeatures; + virtio_mmio_write32(vdev, VIRTIO_MMIO_DRIVER_FEATURES, features); + vdev->features = features; +} + +static void virtio_mmio_set_features(struct virtio_device *vdev, uint32_t features) +{ + _virtio_mmio_set_features(vdev, features, 0); +} + +static void virtio_mmio_reset_device(struct virtio_device *vdev) +{ + virtio_mmio_set_status(vdev, 0); +} + +static void virtio_mmio_notify(struct virtqueue *vq) +{ + /* VIRTIO_F_NOTIFICATION_DATA is not supported for now */ + virtio_mmio_write32(vq->vq_dev, VIRTIO_MMIO_QUEUE_NOTIFY, vq->vq_queue_index); +} + +const struct virtio_dispatch virtio_mmio_dispatch = { + .create_virtqueues = virtio_mmio_create_virtqueues, + .get_status = virtio_mmio_get_status, + .set_status = virtio_mmio_set_status, + .get_features = virtio_mmio_get_features, + .set_features = virtio_mmio_set_features, + .read_config = virtio_mmio_read_config, + .write_config = virtio_mmio_write_config, + .reset_device = virtio_mmio_reset_device, + .notify = virtio_mmio_notify, +}; + +static int virtio_mmio_get_metal_io(struct virtio_device *vdev, uintptr_t virt_mem_ptr, + uintptr_t cfg_mem_ptr) +{ + struct metal_device *device; + int32_t err; + struct virtio_mmio_device *vmdev = metal_container_of(vdev, + struct virtio_mmio_device, vdev); + + /* Setup shared memory device */ + vmdev->shm_device.regions[0].physmap = (metal_phys_addr_t *)&vmdev->shm_mem.base; + vmdev->shm_device.regions[0].virt = (void *)virt_mem_ptr; + vmdev->shm_device.regions[0].size = vmdev->shm_mem.size; + + VIRTIO_ASSERT((METAL_MAX_DEVICE_REGIONS > 1), + "METAL_MAX_DEVICE_REGIONS must be greater that 1"); + + vmdev->shm_device.regions[1].physmap = (metal_phys_addr_t *)&vmdev->cfg_mem.base; + vmdev->shm_device.regions[1].virt = (void *)cfg_mem_ptr; + vmdev->shm_device.regions[1].size = vmdev->cfg_mem.size; + + err = metal_register_generic_device(&vmdev->shm_device); + if (err) { + metal_log(METAL_LOG_ERROR, "Couldn't register shared memory device: %d\n", err); + return err; + } + + err = metal_device_open("generic", vmdev->shm_device.name, &device); + if (err) { + metal_log(METAL_LOG_ERROR, "metal_device_open failed: %d", err); + return err; + } + + vmdev->shm_io = metal_device_io_region(device, 0); + if (!vmdev->shm_io) { + metal_log(METAL_LOG_ERROR, "metal_device_io_region failed to get region 0"); + return err; + } + + vmdev->cfg_io = metal_device_io_region(device, 1); + if (!vmdev->cfg_io) { + metal_log(METAL_LOG_ERROR, "metal_device_io_region failed to get region 1"); + return err; + } + + return 0; +} + +uint32_t virtio_mmio_get_max_elem(struct virtio_device *vdev, int idx) +{ + /* Select the queue we're interested in by writing selection register + * VIRTIO_MMIO_QUEUE_SEL. In pure AMP mode this needs to be followed by a + * synchronization w/ the device before reading VIRTIO_MMIO_QUEUE_NUM_MAX + */ + virtio_mmio_write32(vdev, VIRTIO_MMIO_QUEUE_SEL, idx); + return virtio_mmio_read32(vdev, VIRTIO_MMIO_QUEUE_NUM_MAX); +} + +int virtio_mmio_device_init(struct virtio_mmio_device *vmdev, uintptr_t virt_mem_ptr, + uintptr_t cfg_mem_ptr, void *user_data) +{ + struct virtio_device *vdev = &vmdev->vdev; + uint32_t magic, version, devid, vendor; + + vdev->role = vmdev->device_mode; + vdev->priv = vmdev; + vdev->func = &virtio_mmio_dispatch; + vmdev->user_data = user_data; + + /* Set metal io mem ops */ + virtio_mmio_get_metal_io(vdev, virt_mem_ptr, cfg_mem_ptr); + + magic = virtio_mmio_read32(vdev, VIRTIO_MMIO_MAGIC_VALUE); + if (magic != VIRTIO_MMIO_MAGIC_VALUE_STRING) { + metal_log(METAL_LOG_ERROR, "Bad magic value %08x\n", magic); + return -1; + } + + version = virtio_mmio_read32(vdev, VIRTIO_MMIO_VERSION); + devid = virtio_mmio_read32(vdev, VIRTIO_MMIO_DEVICE_ID); + if (devid == 0) { + /* Placeholder */ + return -1; + } + + if (version != 1) { + metal_log(METAL_LOG_ERROR, "Bad version %08x\n", version); + return -1; + } + + vendor = virtio_mmio_read32(vdev, VIRTIO_MMIO_VENDOR_ID); + metal_log(METAL_LOG_DEBUG, "VIRTIO %08x:%08x\n", vendor, devid); + + vdev->id.version = version; + vdev->id.device = devid; + vdev->id.vendor = vendor; + + virtio_mmio_set_status(vdev, VIRTIO_CONFIG_STATUS_ACK); + virtio_mmio_write32(vdev, VIRTIO_MMIO_GUEST_PAGE_SIZE, 4096); + + return 0; +} + +/* Register preallocated virtqueues */ +void virtio_mmio_register_device(struct virtio_device *vdev, int vq_num, struct virtqueue **vqs) +{ + int i; + + vdev->vrings_info = metal_allocate_memory(sizeof(struct virtio_vring_info) * vq_num); + /* TODO: handle error case */ + for (i = 0; i < vq_num; i++) { + vdev->vrings_info[i].vq = vqs[i]; + } + vdev->vrings_num = vq_num; +} + +struct virtqueue *virtio_mmio_setup_virtqueue(struct virtio_device *vdev, + unsigned int idx, + struct virtqueue *vq, + void (*cb)(void *), + void *cb_arg, + const char *vq_name) +{ + uint32_t maxq; + struct virtio_vring_info _vring_info = {0}; + struct virtio_vring_info *vring_info = &_vring_info; + struct vring_alloc_info *vring_alloc_info; + struct virtio_mmio_device *vmdev = metal_container_of(vdev, + struct virtio_mmio_device, vdev); + + if (vdev->role != (unsigned int)VIRTIO_DEV_DRIVER) { + metal_log(METAL_LOG_ERROR, "Only VIRTIO_DEV_DRIVER is currently supported\n"); + return NULL; + } + + if (!vq) { + metal_log(METAL_LOG_ERROR, + "Only preallocated virtqueues are currently supported\n"); + return NULL; + } + + if (vdev->id.version != 0x1) { + metal_log(METAL_LOG_ERROR, + "Only VIRTIO MMIO version 1 is currently supported\n"); + return NULL; + } + + vring_info->io = vmdev->shm_io; + vring_info->info.num_descs = virtio_mmio_get_max_elem(vdev, idx); + vring_info->info.align = VIRTIO_MMIO_VRING_ALIGNMENT; + + /* Check if vrings are already configured */ + if (vq->vq_nentries != 0 && vq->vq_nentries == vq->vq_free_cnt && + vq->vq_ring.desc) { + vring_info->info.vaddr = vq->vq_ring.desc; + vring_info->vq = vq; + } + vring_info->info.num_descs = vq->vq_nentries; + + vq->vq_dev = vdev; + + vring_alloc_info = &vring_info->info; + + unsigned int role_bk = vdev->role; + /* Assign OA VIRTIO_DEV_DRIVER role to allow virtio guests to setup the vrings */ + vdev->role = (unsigned int)VIRTIO_DEV_DRIVER; + if (virtqueue_create(vdev, idx, vq_name, vring_alloc_info, (void (*)(struct virtqueue *))cb, + vdev->func->notify, vring_info->vq)) { + metal_log(METAL_LOG_ERROR, "virtqueue_create failed\n"); + return NULL; + } + vdev->role = role_bk; + vq->priv = cb_arg; + virtqueue_set_shmem_io(vq, vmdev->shm_io); + + /* Writing selection register VIRTIO_MMIO_QUEUE_SEL. In pure AMP + * mode this needs to be followed by a synchronization w/ the device + * before reading VIRTIO_MMIO_QUEUE_NUM_MAX + */ + virtio_mmio_write32(vdev, VIRTIO_MMIO_QUEUE_SEL, idx); + maxq = virtio_mmio_read32(vdev, VIRTIO_MMIO_QUEUE_NUM_MAX); + VIRTIO_ASSERT((maxq != 0), + "VIRTIO_MMIO_QUEUE_NUM_MAX cannot be 0"); + VIRTIO_ASSERT((maxq >= vq->vq_nentries), + "VIRTIO_MMIO_QUEUE_NUM_MAX must be greater than vqueue->vq_nentries"); + virtio_mmio_write32(vdev, VIRTIO_MMIO_QUEUE_NUM, vq->vq_nentries); + virtio_mmio_write32(vdev, VIRTIO_MMIO_QUEUE_ALIGN, 4096); + virtio_mmio_write32(vdev, VIRTIO_MMIO_QUEUE_PFN, + ((uintptr_t)metal_io_virt_to_phys(vq->shm_io, + (char *)vq->vq_ring.desc)) / 4096); + + vdev->vrings_info[vdev->vrings_num].vq = vq; + vdev->vrings_num++; + virtqueue_enable_cb(vq); + + return vq; +} + +void virtio_mmio_isr(struct virtio_device *vdev) +{ + struct virtio_vring_info *vrings_info = vdev->vrings_info; + + uint32_t isr = virtio_mmio_read32(vdev, VIRTIO_MMIO_INTERRUPT_STATUS); + struct virtqueue *vq; + unsigned int i; + + if (isr & VIRTIO_MMIO_INT_VRING) { + for (i = 0; i < vdev->vrings_num; i++) { + vq = vrings_info[i].vq; + if (vq->callback) + vq->callback(vq->priv); + } + } + + if (isr & ~(VIRTIO_MMIO_INT_VRING)) + metal_log(METAL_LOG_WARNING, "Unhandled interrupt type: 0x%x\n", isr); + + virtio_mmio_write32(vdev, VIRTIO_MMIO_INTERRUPT_ACK, isr); +} + +static int virtio_mmio_create_virtqueues(struct virtio_device *vdev, unsigned int flags, + unsigned int nvqs, const char *names[], + vq_callback callbacks[], void *callback_args[]) +{ + struct virtqueue *vq; + struct virtqueue *vring_vq; + void (*cb)(void *); + void *cb_arg; + unsigned int i; + + (void)flags; + + if (!vdev || !names || !vdev->vrings_info) + return -EINVAL; + + for (i = 0; i < nvqs; i++) { + vring_vq = NULL; + cb = NULL; + cb_arg = NULL; + if (vdev->vrings_info[i].vq) + vring_vq = vdev->vrings_info[i].vq; + if (callbacks) + cb = (virtio_mmio_vq_callback)callbacks[i]; + if (callback_args) + cb_arg = callback_args[i]; + vq = virtio_mmio_setup_virtqueue(vdev, i, vring_vq, cb, cb_arg, names[i]); + if (!vq) + return -ENODEV; + } + + return 0; +} diff --git a/libraries/openamp_arduino/src/virtqueue.c b/libraries/openamp_arduino/src/virtqueue.c index e90a6940b..2544ee360 100644 --- a/libraries/openamp_arduino/src/virtqueue.c +++ b/libraries/openamp_arduino/src/virtqueue.c @@ -6,6 +6,7 @@ */ #include +#include #include #include #include @@ -18,9 +19,14 @@ static uint16_t vq_ring_add_buffer(struct virtqueue *, struct vring_desc *, uint16_t, struct virtqueue_buf *, int, int); static int vq_ring_enable_interrupt(struct virtqueue *, uint16_t); static void vq_ring_free_chain(struct virtqueue *, uint16_t); -static int vq_ring_must_notify_host(struct virtqueue *vq); -static void vq_ring_notify_host(struct virtqueue *vq); +static int vq_ring_must_notify(struct virtqueue *vq); +static void vq_ring_notify(struct virtqueue *vq); +#ifndef VIRTIO_DEVICE_ONLY static int virtqueue_nused(struct virtqueue *vq); +#endif +#ifndef VIRTIO_DRIVER_ONLY +static int virtqueue_navail(struct virtqueue *vq); +#endif /* Default implementation of P2V based on libmetal */ static inline void *virtqueue_phys_to_virt(struct virtqueue *vq, @@ -40,21 +46,6 @@ static inline metal_phys_addr_t virtqueue_virt_to_phys(struct virtqueue *vq, return metal_io_virt_to_phys(io, buf); } -/** - * virtqueue_create - Creates new VirtIO queue - * - * @param device - Pointer to VirtIO device - * @param id - VirtIO queue ID , must be unique - * @param name - Name of VirtIO queue - * @param ring - Pointer to vring_alloc_info control block - * @param callback - Pointer to callback function, invoked - * when message is available on VirtIO queue - * @param notify - Pointer to notify function, used to notify - * other side that there is job available for it - * @param vq - Created VirtIO queue. - * - * @return - Function status - */ int virtqueue_create(struct virtio_device *virt_dev, unsigned short id, const char *name, struct vring_alloc_info *ring, void (*callback)(struct virtqueue *vq), @@ -71,7 +62,7 @@ int virtqueue_create(struct virtio_device *virt_dev, unsigned short id, if (status == VQUEUE_SUCCESS) { vq->vq_dev = virt_dev; - vq->vq_name = name; + vq->vq_name = name; vq->vq_queue_index = id; vq->vq_nentries = ring->num_descs; vq->vq_free_cnt = vq->vq_nentries; @@ -79,30 +70,17 @@ int virtqueue_create(struct virtio_device *virt_dev, unsigned short id, vq->notify = notify; /* Initialize vring control block in virtqueue. */ - vq_ring_init(vq, (void *)ring->vaddr, ring->align); - - /* Disable callbacks - will be enabled by the application - * once initialization is completed. - */ - virtqueue_disable_cb(vq); + vq_ring_init(vq, ring->vaddr, ring->align); } - return (status); + /* + * CACHE: nothing to be done here. Only desc.next is setup at this + * stage but that is only written by driver, so no need to flush it. + */ + + return status; } -/** - * virtqueue_add_buffer() - Enqueues new buffer in vring for consumption - * by other side. Readable buffers are always - * inserted before writable buffers - * - * @param vq - Pointer to VirtIO queue control block. - * @param buf_list - Pointer to a list of virtqueue buffers. - * @param readable - Number of readable buffers - * @param writable - Number of writable buffers - * @param cookie - Pointer to hold call back data - * - * @return - Function status - */ int virtqueue_add_buffer(struct virtqueue *vq, struct virtqueue_buf *buf_list, int readable, int writable, void *cookie) { @@ -116,7 +94,7 @@ int virtqueue_add_buffer(struct virtqueue *vq, struct virtqueue_buf *buf_list, VQ_PARAM_CHK(vq == NULL, status, ERROR_VQUEUE_INVLD_PARAM); VQ_PARAM_CHK(needed < 1, status, ERROR_VQUEUE_INVLD_PARAM); - VQ_PARAM_CHK(vq->vq_free_cnt == 0, status, ERROR_VRING_FULL); + VQ_PARAM_CHK(vq->vq_free_cnt < needed, status, ERROR_VRING_FULL); VQUEUE_BUSY(vq); @@ -158,23 +136,17 @@ int virtqueue_add_buffer(struct virtqueue *vq, struct virtqueue_buf *buf_list, return status; } -/** - * virtqueue_get_buffer - Returns used buffers from VirtIO queue - * - * @param vq - Pointer to VirtIO queue control block - * @param len - Length of conumed buffer - * @param idx - index of the buffer - * - * @return - Pointer to used buffer - */ void *virtqueue_get_buffer(struct virtqueue *vq, uint32_t *len, uint16_t *idx) { struct vring_used_elem *uep; void *cookie; uint16_t used_idx, desc_idx; + /* Used.idx is updated by the virtio device, so we need to invalidate */ + VRING_INVALIDATE(&vq->vq_ring.used->idx, sizeof(vq->vq_ring.used->idx)); + if (!vq || vq->vq_used_cons_idx == vq->vq_ring.used->idx) - return (NULL); + return NULL; VQUEUE_BUSY(vq); @@ -183,6 +155,10 @@ void *virtqueue_get_buffer(struct virtqueue *vq, uint32_t *len, uint16_t *idx) atomic_thread_fence(memory_order_seq_cst); + /* Used.ring is written by remote, invalidate it */ + VRING_INVALIDATE(&vq->vq_ring.used->ring[used_idx], + sizeof(vq->vq_ring.used->ring[used_idx])); + desc_idx = (uint16_t)uep->id; if (len) *len = uep->len; @@ -201,15 +177,18 @@ void *virtqueue_get_buffer(struct virtqueue *vq, uint32_t *len, uint16_t *idx) uint32_t virtqueue_get_buffer_length(struct virtqueue *vq, uint16_t idx) { + VRING_INVALIDATE(&vq->vq_ring.desc[idx].len, + sizeof(vq->vq_ring.desc[idx].len)); return vq->vq_ring.desc[idx].len; } -/** - * virtqueue_free - Frees VirtIO queue resources - * - * @param vq - Pointer to VirtIO queue control block - * - */ +void *virtqueue_get_buffer_addr(struct virtqueue *vq, uint16_t idx) +{ + VRING_INVALIDATE(&vq->vq_ring.desc[idx].addr, + sizeof(vq->vq_ring.desc[idx].addr)); + return virtqueue_phys_to_virt(vq, vq->vq_ring.desc[idx].addr); +} + void virtqueue_free(struct virtqueue *vq) { if (vq) { @@ -223,16 +202,6 @@ void virtqueue_free(struct virtqueue *vq) } } -/** - * virtqueue_get_available_buffer - Returns buffer available for use in the - * VirtIO queue - * - * @param vq - Pointer to VirtIO queue control block - * @param avail_idx - Pointer to index used in vring desc table - * @param len - Length of buffer - * - * @return - Pointer to available buffer - */ void *virtqueue_get_available_buffer(struct virtqueue *vq, uint16_t *avail_idx, uint32_t *len) { @@ -240,6 +209,9 @@ void *virtqueue_get_available_buffer(struct virtqueue *vq, uint16_t *avail_idx, void *buffer; atomic_thread_fence(memory_order_seq_cst); + + /* Avail.idx is updated by driver, invalidate it */ + VRING_INVALIDATE(&vq->vq_ring.avail->idx, sizeof(vq->vq_ring.avail->idx)); if (vq->vq_available_idx == vq->vq_ring.avail->idx) { return NULL; } @@ -247,8 +219,15 @@ void *virtqueue_get_available_buffer(struct virtqueue *vq, uint16_t *avail_idx, VQUEUE_BUSY(vq); head_idx = vq->vq_available_idx++ & (vq->vq_nentries - 1); + + /* Avail.ring is updated by driver, invalidate it */ + VRING_INVALIDATE(&vq->vq_ring.avail->ring[head_idx], + sizeof(vq->vq_ring.avail->ring[head_idx])); *avail_idx = vq->vq_ring.avail->ring[head_idx]; + /* Invalidate the desc entry written by driver before accessing it */ + VRING_INVALIDATE(&vq->vq_ring.desc[*avail_idx], + sizeof(vq->vq_ring.desc[*avail_idx])); buffer = virtqueue_phys_to_virt(vq, vq->vq_ring.desc[*avail_idx].addr); *len = vq->vq_ring.desc[*avail_idx].len; @@ -257,78 +236,89 @@ void *virtqueue_get_available_buffer(struct virtqueue *vq, uint16_t *avail_idx, return buffer; } -/** - * virtqueue_add_consumed_buffer - Returns consumed buffer back to VirtIO queue - * - * @param vq - Pointer to VirtIO queue control block - * @param head_idx - Index of vring desc containing used buffer - * @param len - Length of buffer - * - * @return - Function status - */ int virtqueue_add_consumed_buffer(struct virtqueue *vq, uint16_t head_idx, uint32_t len) { struct vring_used_elem *used_desc = NULL; uint16_t used_idx; - if (head_idx > vq->vq_nentries) { + if (head_idx >= vq->vq_nentries) { return ERROR_VRING_NO_BUFF; } VQUEUE_BUSY(vq); + /* CACHE: used is never written by driver, so it's safe to directly access it */ used_idx = vq->vq_ring.used->idx & (vq->vq_nentries - 1); used_desc = &vq->vq_ring.used->ring[used_idx]; used_desc->id = head_idx; used_desc->len = len; + /* We still need to flush it because this is read by driver */ + VRING_FLUSH(&vq->vq_ring.used->ring[used_idx], + sizeof(vq->vq_ring.used->ring[used_idx])); + atomic_thread_fence(memory_order_seq_cst); vq->vq_ring.used->idx++; + /* Used.idx is read by driver, so we need to flush it */ + VRING_FLUSH(&vq->vq_ring.used->idx, sizeof(vq->vq_ring.used->idx)); + + /* Keep pending count until virtqueue_notify(). */ + vq->vq_queued_cnt++; + VQUEUE_IDLE(vq); return VQUEUE_SUCCESS; } -/** - * virtqueue_enable_cb - Enables callback generation - * - * @param vq - Pointer to VirtIO queue control block - * - * @return - Function status - */ int virtqueue_enable_cb(struct virtqueue *vq) { return vq_ring_enable_interrupt(vq, 0); } -/** - * virtqueue_enable_cb - Disables callback generation - * - * @param vq - Pointer to VirtIO queue control block - * - */ void virtqueue_disable_cb(struct virtqueue *vq) { VQUEUE_BUSY(vq); - if (vq->vq_flags & VIRTQUEUE_FLAG_EVENT_IDX) { - vring_used_event(&vq->vq_ring) = - vq->vq_used_cons_idx - vq->vq_nentries - 1; + if (vq->vq_dev->features & VIRTIO_RING_F_EVENT_IDX) { +#ifndef VIRTIO_DEVICE_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DRIVER) { + vring_used_event(&vq->vq_ring) = + vq->vq_used_cons_idx - vq->vq_nentries - 1; + VRING_FLUSH(&vring_used_event(&vq->vq_ring), + sizeof(vring_used_event(&vq->vq_ring))); + } +#endif /*VIRTIO_DEVICE_ONLY*/ +#ifndef VIRTIO_DRIVER_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DEVICE) { + vring_avail_event(&vq->vq_ring) = + vq->vq_available_idx - vq->vq_nentries - 1; + VRING_FLUSH(&vring_avail_event(&vq->vq_ring), + sizeof(vring_avail_event(&vq->vq_ring))); + } +#endif /*VIRTIO_DRIVER_ONLY*/ } else { - vq->vq_ring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT; +#ifndef VIRTIO_DEVICE_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DRIVER) { + vq->vq_ring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT; + VRING_FLUSH(&vq->vq_ring.avail->flags, + sizeof(vq->vq_ring.avail->flags)); + } +#endif /*VIRTIO_DEVICE_ONLY*/ +#ifndef VIRTIO_DRIVER_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DEVICE) { + vq->vq_ring.used->flags |= VRING_USED_F_NO_NOTIFY; + VRING_FLUSH(&vq->vq_ring.used->flags, + sizeof(vq->vq_ring.used->flags)); + } +#endif /*VIRTIO_DRIVER_ONLY*/ } VQUEUE_IDLE(vq); } -/** - * virtqueue_kick - Notifies other side that there is buffer available for it. - * - * @param vq - Pointer to VirtIO queue control block - */ void virtqueue_kick(struct virtqueue *vq) { VQUEUE_BUSY(vq); @@ -336,48 +326,42 @@ void virtqueue_kick(struct virtqueue *vq) /* Ensure updated avail->idx is visible to host. */ atomic_thread_fence(memory_order_seq_cst); - if (vq_ring_must_notify_host(vq)) - vq_ring_notify_host(vq); + if (vq_ring_must_notify(vq)) + vq_ring_notify(vq); vq->vq_queued_cnt = 0; VQUEUE_IDLE(vq); } -/** - * virtqueue_dump Dumps important virtqueue fields , use for debugging purposes - * - * @param vq - Pointer to VirtIO queue control block - */ void virtqueue_dump(struct virtqueue *vq) { if (!vq) return; + VRING_INVALIDATE(&vq->vq_ring.avail, sizeof(vq->vq_ring.avail)); + VRING_INVALIDATE(&vq->vq_ring.used, sizeof(vq->vq_ring.used)); + metal_log(METAL_LOG_DEBUG, - "VQ: %s - size=%d; free=%d; used=%d; queued=%d; " - "desc_head_idx=%d; avail.idx=%d; used_cons_idx=%d; " + "VQ: %s - size=%d; free=%d; queued=%d; desc_head_idx=%d; " + "available_idx=%d; avail.idx=%d; used_cons_idx=%d; " "used.idx=%d; avail.flags=0x%x; used.flags=0x%x\r\n", vq->vq_name, vq->vq_nentries, vq->vq_free_cnt, - virtqueue_nused(vq), vq->vq_queued_cnt, vq->vq_desc_head_idx, + vq->vq_queued_cnt, vq->vq_desc_head_idx, vq->vq_available_idx, vq->vq_ring.avail->idx, vq->vq_used_cons_idx, vq->vq_ring.used->idx, vq->vq_ring.avail->flags, vq->vq_ring.used->flags); } -/** - * virtqueue_get_desc_size - Returns vring descriptor size - * - * @param vq - Pointer to VirtIO queue control block - * - * @return - Descriptor length - */ uint32_t virtqueue_get_desc_size(struct virtqueue *vq) { uint16_t head_idx = 0; uint16_t avail_idx = 0; uint32_t len = 0; + /* Avail.idx is updated by driver, invalidate it */ + VRING_INVALIDATE(&vq->vq_ring.avail->idx, sizeof(vq->vq_ring.avail->idx)); + if (vq->vq_available_idx == vq->vq_ring.avail->idx) { return 0; } @@ -385,7 +369,16 @@ uint32_t virtqueue_get_desc_size(struct virtqueue *vq) VQUEUE_BUSY(vq); head_idx = vq->vq_available_idx & (vq->vq_nentries - 1); + + /* Avail.ring is updated by driver, invalidate it */ + VRING_INVALIDATE(&vq->vq_ring.avail->ring[head_idx], + sizeof(vq->vq_ring.avail->ring[head_idx])); avail_idx = vq->vq_ring.avail->ring[head_idx]; + + /* Invalidate the desc entry written by driver before accessing it */ + VRING_INVALIDATE(&vq->vq_ring.desc[avail_idx].len, + sizeof(vq->vq_ring.desc[avail_idx].len)); + len = vq->vq_ring.desc[avail_idx].len; VQUEUE_IDLE(vq); @@ -397,7 +390,7 @@ uint32_t virtqueue_get_desc_size(struct virtqueue *vq) * Helper Functions * **************************************************************************/ -/** +/* * * vq_ring_add_buffer * @@ -419,6 +412,7 @@ static uint16_t vq_ring_add_buffer(struct virtqueue *vq, VQASSERT(vq, idx != VQ_RING_DESC_CHAIN_END, "premature end of free desc chain"); + /* CACHE: No need to invalidate desc because it is only written by driver */ dp = &desc[idx]; dp->addr = virtqueue_virt_to_phys(vq, buf_list[i].buf); dp->len = buf_list[i].len; @@ -433,12 +427,19 @@ static uint16_t vq_ring_add_buffer(struct virtqueue *vq, */ if (i >= readable) dp->flags |= VRING_DESC_F_WRITE; + + /* + * Instead of flushing the whole desc region, we flush only the + * single entry hopefully saving some cycles + */ + VRING_FLUSH(&desc[idx], sizeof(desc[idx])); + } - return (idx); + return idx; } -/** +/* * * vq_ring_free_chain * @@ -448,6 +449,7 @@ static void vq_ring_free_chain(struct virtqueue *vq, uint16_t desc_idx) struct vring_desc *dp; struct vq_desc_extra *dxp; + /* CACHE: desc is never written by remote, no need to invalidate */ VQ_RING_ASSERT_VALID_IDX(vq, desc_idx); dp = &vq->vq_ring.desc[desc_idx]; dxp = &vq->vq_descx[desc_idx]; @@ -467,19 +469,21 @@ static void vq_ring_free_chain(struct virtqueue *vq, uint16_t desc_idx) } } - VQASSERT(vq, (dxp->ndescs == 0), + VQASSERT(vq, dxp->ndescs == 0, "failed to free entire desc chain, remaining"); /* * We must append the existing free chain, if any, to the end of * newly freed chain. If the virtqueue was completely used, then * head would be VQ_RING_DESC_CHAIN_END (ASSERTed above). + * + * CACHE: desc.next is never read by remote, no need to flush it. */ dp->next = vq->vq_desc_head_idx; vq->vq_desc_head_idx = desc_idx; } -/** +/* * * vq_ring_init * @@ -487,19 +491,25 @@ static void vq_ring_free_chain(struct virtqueue *vq, uint16_t desc_idx) static void vq_ring_init(struct virtqueue *vq, void *ring_mem, int alignment) { struct vring *vr; - int i, size; + int size; size = vq->vq_nentries; vr = &vq->vq_ring; - vring_init(vr, size, (unsigned char *)ring_mem, alignment); + vring_init(vr, size, ring_mem, alignment); + +#ifndef VIRTIO_DEVICE_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DRIVER) { + int i; - for (i = 0; i < size - 1; i++) - vr->desc[i].next = i + 1; - vr->desc[i].next = VQ_RING_DESC_CHAIN_END; + for (i = 0; i < size - 1; i++) + vr->desc[i].next = i + 1; + vr->desc[i].next = VQ_RING_DESC_CHAIN_END; + } +#endif /*VIRTIO_DEVICE_ONLY*/ } -/** +/* * * vq_ring_update_avail * @@ -514,19 +524,28 @@ static void vq_ring_update_avail(struct virtqueue *vq, uint16_t desc_idx) * deferring to virtqueue_notify() in the hopes that if the host is * currently running on another CPU, we can keep it processing the new * descriptor. + * + * CACHE: avail is never written by remote, so it is safe to not invalidate here */ avail_idx = vq->vq_ring.avail->idx & (vq->vq_nentries - 1); vq->vq_ring.avail->ring[avail_idx] = desc_idx; + /* We still need to flush the ring */ + VRING_FLUSH(&vq->vq_ring.avail->ring[avail_idx], + sizeof(vq->vq_ring.avail->ring[avail_idx])); + atomic_thread_fence(memory_order_seq_cst); vq->vq_ring.avail->idx++; + /* And the index */ + VRING_FLUSH(&vq->vq_ring.avail->idx, sizeof(vq->vq_ring.avail->idx)); + /* Keep pending count until virtqueue_notify(). */ vq->vq_queued_cnt++; } -/** +/* * * vq_ring_enable_interrupt * @@ -537,10 +556,38 @@ static int vq_ring_enable_interrupt(struct virtqueue *vq, uint16_t ndesc) * Enable interrupts, making sure we get the latest index of * what's already been consumed. */ - if (vq->vq_flags & VIRTQUEUE_FLAG_EVENT_IDX) { - vring_used_event(&vq->vq_ring) = vq->vq_used_cons_idx + ndesc; + if (vq->vq_dev->features & VIRTIO_RING_F_EVENT_IDX) { +#ifndef VIRTIO_DEVICE_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DRIVER) { + vring_used_event(&vq->vq_ring) = + vq->vq_used_cons_idx + ndesc; + VRING_FLUSH(&vring_used_event(&vq->vq_ring), + sizeof(vring_used_event(&vq->vq_ring))); + } +#endif /*VIRTIO_DEVICE_ONLY*/ +#ifndef VIRTIO_DRIVER_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DEVICE) { + vring_avail_event(&vq->vq_ring) = + vq->vq_available_idx + ndesc; + VRING_FLUSH(&vring_avail_event(&vq->vq_ring), + sizeof(vring_avail_event(&vq->vq_ring))); + } +#endif /*VIRTIO_DRIVER_ONLY*/ } else { - vq->vq_ring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT; +#ifndef VIRTIO_DEVICE_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DRIVER) { + vq->vq_ring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT; + VRING_FLUSH(&vq->vq_ring.avail->flags, + sizeof(vq->vq_ring.avail->flags)); + } +#endif /*VIRTIO_DEVICE_ONLY*/ +#ifndef VIRTIO_DRIVER_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DEVICE) { + vq->vq_ring.used->flags &= ~VRING_USED_F_NO_NOTIFY; + VRING_FLUSH(&vq->vq_ring.used->flags, + sizeof(vq->vq_ring.used->flags)); + } +#endif /*VIRTIO_DRIVER_ONLY*/ } atomic_thread_fence(memory_order_seq_cst); @@ -550,14 +597,25 @@ static int vq_ring_enable_interrupt(struct virtqueue *vq, uint16_t ndesc) * since we last checked. Let our caller know so it processes the new * entries. */ - if (virtqueue_nused(vq) > ndesc) { - return 1; +#ifndef VIRTIO_DEVICE_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DRIVER) { + if (virtqueue_nused(vq) > ndesc) { + return 1; + } } +#endif /*VIRTIO_DEVICE_ONLY*/ +#ifndef VIRTIO_DRIVER_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DEVICE) { + if (virtqueue_navail(vq) > ndesc) { + return 1; + } + } +#endif /*VIRTIO_DRIVER_ONLY*/ return 0; } -/** +/* * * virtqueue_interrupt * @@ -569,46 +627,85 @@ void virtqueue_notification(struct virtqueue *vq) vq->callback(vq); } -/** +/* * - * vq_ring_must_notify_host + * vq_ring_must_notify * */ -static int vq_ring_must_notify_host(struct virtqueue *vq) +static int vq_ring_must_notify(struct virtqueue *vq) { uint16_t new_idx, prev_idx, event_idx; - if (vq->vq_flags & VIRTQUEUE_FLAG_EVENT_IDX) { - new_idx = vq->vq_ring.avail->idx; - prev_idx = new_idx - vq->vq_queued_cnt; - event_idx = vring_avail_event(&vq->vq_ring); - - return (vring_need_event(event_idx, new_idx, prev_idx) != 0); + if (vq->vq_dev->features & VIRTIO_RING_F_EVENT_IDX) { +#ifndef VIRTIO_DEVICE_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DRIVER) { + /* CACHE: no need to invalidate avail */ + new_idx = vq->vq_ring.avail->idx; + prev_idx = new_idx - vq->vq_queued_cnt; + VRING_INVALIDATE(&vring_avail_event(&vq->vq_ring), + sizeof(vring_avail_event(&vq->vq_ring))); + event_idx = vring_avail_event(&vq->vq_ring); + return vring_need_event(event_idx, new_idx, + prev_idx) != 0; + } +#endif /*VIRTIO_DEVICE_ONLY*/ +#ifndef VIRTIO_DRIVER_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DEVICE) { + /* CACHE: no need to invalidate used */ + new_idx = vq->vq_ring.used->idx; + prev_idx = new_idx - vq->vq_queued_cnt; + VRING_INVALIDATE(&vring_used_event(&vq->vq_ring), + sizeof(vring_used_event(&vq->vq_ring))); + event_idx = vring_used_event(&vq->vq_ring); + return vring_need_event(event_idx, new_idx, + prev_idx) != 0; + } +#endif /*VIRTIO_DRIVER_ONLY*/ + } else { +#ifndef VIRTIO_DEVICE_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DRIVER) { + VRING_INVALIDATE(&vq->vq_ring.used->flags, + sizeof(vq->vq_ring.used->flags)); + return (vq->vq_ring.used->flags & + VRING_USED_F_NO_NOTIFY) == 0; + } +#endif /*VIRTIO_DEVICE_ONLY*/ +#ifndef VIRTIO_DRIVER_ONLY + if (vq->vq_dev->role == VIRTIO_DEV_DEVICE) { + VRING_INVALIDATE(&vq->vq_ring.avail->flags, + sizeof(vq->vq_ring.avail->flags)); + return (vq->vq_ring.avail->flags & + VRING_AVAIL_F_NO_INTERRUPT) == 0; + } +#endif /*VIRTIO_DRIVER_ONLY*/ } - return ((vq->vq_ring.used->flags & VRING_USED_F_NO_NOTIFY) == 0); + return 0; } -/** +/* * - * vq_ring_notify_host + * vq_ring_notify * */ -static void vq_ring_notify_host(struct virtqueue *vq) +static void vq_ring_notify(struct virtqueue *vq) { if (vq->notify) vq->notify(vq); } -/** +/* * * virtqueue_nused * */ +#ifndef VIRTIO_DEVICE_ONLY static int virtqueue_nused(struct virtqueue *vq) { uint16_t used_idx, nused; + /* Used is written by remote */ + VRING_INVALIDATE(&vq->vq_ring.used->idx, sizeof(vq->vq_ring.used->idx)); used_idx = vq->vq_ring.used->idx; nused = (uint16_t)(used_idx - vq->vq_used_cons_idx); @@ -616,3 +713,26 @@ static int virtqueue_nused(struct virtqueue *vq) return nused; } +#endif /*VIRTIO_DEVICE_ONLY*/ + +/* + * + * virtqueue_navail + * + */ +#ifndef VIRTIO_DRIVER_ONLY +static int virtqueue_navail(struct virtqueue *vq) +{ + uint16_t avail_idx, navail; + + /* Avail is written by driver */ + VRING_INVALIDATE(&vq->vq_ring.avail->idx, sizeof(vq->vq_ring.avail->idx)); + + avail_idx = vq->vq_ring.avail->idx; + + navail = (uint16_t)(avail_idx - vq->vq_available_idx); + VQASSERT(vq, navail <= vq->vq_nentries, "avail more than available"); + + return navail; +} +#endif /*VIRTIO_DRIVER_ONLY*/ diff --git a/libraries/rpclib/src/rpc/client.h b/libraries/rpclib/src/rpc/client.h index 613c91fae..fcd16ebe3 100644 --- a/libraries/rpclib/src/rpc/client.h +++ b/libraries/rpclib/src/rpc/client.h @@ -88,7 +88,7 @@ class client { //! //! \param func_name The name of the notification to call. //! \param args The arguments to pass to the function. - //! \tparam Args THe types of the arguments. + //! \tparam Args The types of the arguments. //! //! \note This function returns immediately (possibly before the //! notification is written to the socket). @@ -144,4 +144,4 @@ class client { }; } -//#include "rpc/client.inl" +#include "rpc/client.inl" diff --git a/libraries/rpclib/src/rpc/client.inl b/libraries/rpclib/src/rpc/client.inl index 04dc825b4..f980f069b 100644 --- a/libraries/rpclib/src/rpc/client.inl +++ b/libraries/rpclib/src/rpc/client.inl @@ -47,7 +47,7 @@ client::async_call(std::string const &func_name, Args... args) { //! \param args The arguments to pass to the function. //! \note This function returns when the notification is written to the //! socket. -//! \tparam Args THe types of the arguments. +//! \tparam Args The types of the arguments. template void client::send(std::string const &func_name, Args... args) { RPCLIB_CREATE_LOG_CHANNEL(client) diff --git a/libraries/rpclib/src/rpc/detail/async_writer.h b/libraries/rpclib/src/rpc/detail/async_writer.h index 66488ff6b..508500a7a 100644 --- a/libraries/rpclib/src/rpc/detail/async_writer.h +++ b/libraries/rpclib/src/rpc/detail/async_writer.h @@ -23,6 +23,27 @@ class async_writer : public std::enable_shared_from_this { RPCLIB_ASIO::ip::tcp::socket socket) : socket_(std::move(socket)), write_strand_(*io), exit_(false) {} + void close() { + exit_ = true; + + auto self = shared_from_this(); + write_strand_.post([this, self]() { + LOG_INFO("Closing socket"); + std::error_code e; + socket_.shutdown( + RPCLIB_ASIO::ip::tcp::socket::shutdown_both, e); + if (e) { + LOG_WARN("std::system_error during socket shutdown. " + "Code: {}. Message: {}", e.value(), e.message()); + } + socket_.close(); + }); + } + + bool is_closed() const { + return exit_.load(); + } + void do_write() { if (exit_) { return; @@ -46,20 +67,6 @@ class async_writer : public std::enable_shared_from_this { } else { LOG_ERROR("Error while writing to socket: {}", ec); } - - if (exit_) { - LOG_INFO("Closing socket"); - try { - socket_.shutdown( - RPCLIB_ASIO::ip::tcp::socket::shutdown_both); - } - catch (std::system_error &e) { - (void)e; - LOG_WARN("std::system_error during socket shutdown. " - "Code: {}. Message: {}", e.code(), e.what()); - } - socket_.close(); - } })); } @@ -72,7 +79,9 @@ class async_writer : public std::enable_shared_from_this { do_write(); } - friend class rpc::client; + RPCLIB_ASIO::ip::tcp::socket& socket() { + return socket_; + } protected: template @@ -80,15 +89,14 @@ class async_writer : public std::enable_shared_from_this { return std::static_pointer_cast(shared_from_this()); } -protected: + RPCLIB_ASIO::strand& write_strand() { + return write_strand_; + } + +private: RPCLIB_ASIO::ip::tcp::socket socket_; RPCLIB_ASIO::strand write_strand_; std::atomic_bool exit_{false}; - bool exited_ = false; - std::mutex m_exit_; - std::condition_variable cv_exit_; - -private: std::deque write_queue_; RPCLIB_CREATE_LOG_CHANNEL(async_writer) }; diff --git a/libraries/rpclib/src/rpc/detail/log.h b/libraries/rpclib/src/rpc/detail/log.h index 0d5e51c61..09db735a6 100644 --- a/libraries/rpclib/src/rpc/detail/log.h +++ b/libraries/rpclib/src/rpc/detail/log.h @@ -83,11 +83,19 @@ class logger { std::stringstream ss; timespec now_t = {}; clock_gettime(CLOCK_REALTIME, &now_t); +#if __GNUC__ >= 5 ss << std::put_time( std::localtime(reinterpret_cast(&now_t.tv_sec)), "%F %T") - << RPCLIB_FMT::format( +#else + char mltime[128]; + strftime(mltime, sizeof(mltime), "%c %Z", + std::localtime(reinterpret_cast(&now_t.tv_sec))); + ss << mltime +#endif + << RPCLIB_FMT::format( ".{:03}", round(static_cast(now_t.tv_nsec) / 1.0e6)); + return ss.str(); } #endif diff --git a/libraries/rpclib/src/rpc/detail/server_session.h b/libraries/rpclib/src/rpc/detail/server_session.h index 0b848142a..3b96d7dae 100644 --- a/libraries/rpclib/src/rpc/detail/server_session.h +++ b/libraries/rpclib/src/rpc/detail/server_session.h @@ -3,6 +3,7 @@ #ifndef SESSION_H_5KG6ZMAB #define SESSION_H_5KG6ZMAB +#include "asio.hpp" #include #include @@ -21,7 +22,9 @@ namespace detail { class server_session : public async_writer { public: - server_session(server *srv, std::shared_ptr disp, bool suppress_exceptions); + server_session(server *srv, RPCLIB_ASIO::io_service *io, + RPCLIB_ASIO::ip::tcp::socket socket, + std::shared_ptr disp, bool suppress_exceptions); void start(); void close(); @@ -31,6 +34,8 @@ class server_session : public async_writer { private: server* parent_; + RPCLIB_ASIO::io_service *io_; + RPCLIB_ASIO::strand read_strand_; std::shared_ptr disp_; RPCLIB_MSGPACK::unpacker pac_; RPCLIB_MSGPACK::sbuffer output_buf_; diff --git a/libraries/rpclib/src/rpc/dispatcher.h b/libraries/rpclib/src/rpc/dispatcher.h index 8044d4cb4..18dca30fc 100644 --- a/libraries/rpclib/src/rpc/dispatcher.h +++ b/libraries/rpclib/src/rpc/dispatcher.h @@ -60,6 +60,19 @@ class dispatcher { detail::tags::nonvoid_result const &, detail::tags::nonzero_arg const &); + //! \brief Unbind a functor with a given name from callable functors. + void unbind(std::string const &name) { + funcs_.erase(name); + } + + //! \brief returns a list of all names which functors are binded to + std::vector names() const { + std::vector names; + for(auto it = funcs_.begin(); it != funcs_.end(); ++it) + names.push_back(it->first); + return names; + } + //! @} //! \brief Processes a message that contains a call according to diff --git a/libraries/rpclib/src/rpc/msgpack/unpack.h b/libraries/rpclib/src/rpc/msgpack/unpack.h index f409dc2e5..14ed3cbc6 100644 --- a/libraries/rpclib/src/rpc/msgpack/unpack.h +++ b/libraries/rpclib/src/rpc/msgpack/unpack.h @@ -66,7 +66,7 @@ typedef struct msgpack_unpacker { #ifndef MSGPACK_UNPACKER_INIT_BUFFER_SIZE -#define MSGPACK_UNPACKER_INIT_BUFFER_SIZE (1024) +#define MSGPACK_UNPACKER_INIT_BUFFER_SIZE (4*1024) #endif /** @@ -98,7 +98,7 @@ void msgpack_unpacker_free(msgpack_unpacker* mpac); #ifndef MSGPACK_UNPACKER_RESERVE_SIZE -#define MSGPACK_UNPACKER_RESERVE_SIZE (1024) +#define MSGPACK_UNPACKER_RESERVE_SIZE (4*1024) #endif /** diff --git a/libraries/rpclib/src/rpc/msgpack/v1/unpack_decl.hpp b/libraries/rpclib/src/rpc/msgpack/v1/unpack_decl.hpp index 3219bd338..11384cfc9 100644 --- a/libraries/rpclib/src/rpc/msgpack/v1/unpack_decl.hpp +++ b/libraries/rpclib/src/rpc/msgpack/v1/unpack_decl.hpp @@ -40,11 +40,11 @@ const size_t COUNTER_SIZE = sizeof(_msgpack_atomic_counter_t); #ifndef MSGPACK_UNPACKER_INIT_BUFFER_SIZE -#define MSGPACK_UNPACKER_INIT_BUFFER_SIZE (1024) +#define MSGPACK_UNPACKER_INIT_BUFFER_SIZE (4*1024) #endif #ifndef MSGPACK_UNPACKER_RESERVE_SIZE -#define MSGPACK_UNPACKER_RESERVE_SIZE (1024) +#define MSGPACK_UNPACKER_RESERVE_SIZE (4*1024) #endif diff --git a/libraries/rpclib/src/rpc/nonstd/optional.cpp b/libraries/rpclib/src/rpc/nonstd/optional.cpp index f80c93197..ac89d2985 100644 --- a/libraries/rpclib/src/rpc/nonstd/optional.cpp +++ b/libraries/rpclib/src/rpc/nonstd/optional.cpp @@ -3,4 +3,6 @@ // This is no-op; the reason it exists is to avoid // the weak vtables problem. For more info, see // https://stackoverflow.com/a/23749273/140367 -nonstd::bad_optional_access::~bad_optional_access() {} +const char* nonstd::bad_optional_access::what() const noexcept { + return std::logic_error::what(); +} diff --git a/libraries/rpclib/src/rpc/nonstd/optional.hpp b/libraries/rpclib/src/rpc/nonstd/optional.hpp index d9888cf47..e6d941d5e 100644 --- a/libraries/rpclib/src/rpc/nonstd/optional.hpp +++ b/libraries/rpclib/src/rpc/nonstd/optional.hpp @@ -564,7 +564,7 @@ class bad_optional_access : public std::logic_error public: explicit bad_optional_access() : logic_error( "bad optional access" ) {} - ~bad_optional_access(); + const char* what() const noexcept; }; /// optional diff --git a/libraries/rpclib/src/rpc/rpc_error.cpp b/libraries/rpclib/src/rpc/rpc_error.cpp index 47e76e6b5..57df42445 100644 --- a/libraries/rpclib/src/rpc/rpc_error.cpp +++ b/libraries/rpclib/src/rpc/rpc_error.cpp @@ -21,4 +21,6 @@ timeout::timeout(std::string const &what_arg) : std::runtime_error(what_arg) { const char *timeout::what() const noexcept { return formatted.data(); } +const char* system_error::what() const noexcept { return std::system_error::what(); } + } /* rpc */ diff --git a/libraries/rpclib/src/rpc/rpc_error.h b/libraries/rpclib/src/rpc/rpc_error.h index e732c45a1..a5895659a 100644 --- a/libraries/rpclib/src/rpc/rpc_error.h +++ b/libraries/rpclib/src/rpc/rpc_error.h @@ -4,6 +4,7 @@ #define RPC_ERROR_H_NEOOSTKY #include +#include #include "rpc/config.h" #include "rpc/msgpack.hpp" @@ -18,6 +19,9 @@ namespace rpc { //! throw it, hence its constructor is private. class rpc_error : public std::runtime_error { public: + rpc_error(std::string const &what_arg, std::string const &function_name, + std::shared_ptr o); + //! \brief Returns the name of the function that was //! called on the server while the error occurred. std::string get_function_name() const; @@ -26,11 +30,6 @@ class rpc_error : public std::runtime_error { //! provided. virtual RPCLIB_MSGPACK::object_handle &get_error(); -private: - friend class client; - rpc_error(std::string const &what_arg, std::string const &function_name, - std::shared_ptr o); - private: std::string func_name_; std::shared_ptr ob_h_; @@ -41,15 +40,23 @@ class rpc_error : public std::runtime_error { //! \note There isn't necessarily a timeout set, it is an optional value. class timeout : public std::runtime_error { public: + explicit timeout(std::string const &what_arg); + //! \brief Describes the exception. const char *what() const noexcept override; private: - friend class client; - explicit timeout(std::string const &what_arg); std::string formatted; }; +//! \brief This exception is throw by the client when the connection or call +//! causes a system error +class system_error : public std::system_error { +public: + using std::system_error::system_error; + const char* what() const noexcept; +}; + } /* rpc */ diff --git a/libraries/rpclib/src/rpc/server.h b/libraries/rpclib/src/rpc/server.h index f240acf18..baeb9f7c5 100644 --- a/libraries/rpclib/src/rpc/server.h +++ b/libraries/rpclib/src/rpc/server.h @@ -93,6 +93,24 @@ class server { disp_->bind(name, func); } + //! \brief Unbinds a functor binded to a name. + //! + //! This function removes already binded function from RPC Ccallable functions + //! + //! \param name The name of the functor. + void unbind(std::string const &name) { + disp_->unbind(name); + } + + //! \brief Returns all binded names + //! + //! This function returns a list of all names which functors are binded to + //! + //! \param name The name of the functor. + std::vector names() const { + return disp_->names(); + } + //! \brief Sets the exception behavior in handlers. By default, //! handlers throwing will crash the server. If suppressing is on, //! the server will try to gather textual data and return it to @@ -104,12 +122,13 @@ class server { //! \note This should not be called from worker threads. void stop(); + //! \brief Returns port + //! \note The port + unsigned short port() const; + //! \brief Closes all sessions gracefully. void close_sessions(); - friend class detail::server_session; - -private: //! \brief Closes a specific session. void close_session(std::shared_ptr const& s); diff --git a/libraries/rpclib/src/rpc/this_server.h b/libraries/rpclib/src/rpc/this_server.h index 7e8826b69..d1954e4a9 100644 --- a/libraries/rpclib/src/rpc/this_server.h +++ b/libraries/rpclib/src/rpc/this_server.h @@ -19,7 +19,8 @@ class this_server_t { //! \brief Cancels a requested stop operation. void cancel_stop(); - friend class rpc::detail::server_session; + //! Check if a stop is requested + bool stopping() const { return stopping_; } private: bool stopping_; diff --git a/libraries/rpclib/src/rpc/version.h b/libraries/rpclib/src/rpc/version.h index 206c7c64e..47e19e926 100644 --- a/libraries/rpclib/src/rpc/version.h +++ b/libraries/rpclib/src/rpc/version.h @@ -6,7 +6,7 @@ namespace rpc { static constexpr unsigned VERSION_MAJOR = 2; -static constexpr unsigned VERSION_MINOR = 2; +static constexpr unsigned VERSION_MINOR = 3; static constexpr unsigned VERSION_PATCH = 0; } /* rpc */ diff --git a/mbed-os-to-arduino b/mbed-os-to-arduino index 7b0ca54cd..d919715ee 100755 --- a/mbed-os-to-arduino +++ b/mbed-os-to-arduino @@ -187,21 +187,16 @@ generate_flags () { echo "Patching '-fno-exceptions' flag for $ARDUINOVARIANT/${fl}flags.txt" sed -i '/-fno-exceptions/d' "$ARDUINOVARIANT"/${fl}flags.txt set +e - HAS_OPENAMP_SECTION=`grep openamp_section "$ARDUINOVARIANT"/linker_script.ld` + HAS_PDM_SECTION=`grep pdm_section "$ARDUINOVARIANT"/linker_script.ld` set -e - if [ x"$HAS_OPENAMP_SECTION" == x ]; then - echo "Adding OpenAMP section to $ARDUINOVARIANT/linker_script.ld" - OPENAMP_SECTION=".openamp_section (NOLOAD) : {\n \ - . = ABSOLUTE(0x38000000);\n \ - *(.resource_table)\n \ - } >RAM_D3 AT > FLASH\n \ - .pdm_section (NOLOAD) : {\n \ - . = ABSOLUTE(0x3800FC00);\n \ + if [ x"$HAS_PDM_SECTION" == x ]; then + echo "Adding PDM section to $ARDUINOVARIANT/linker_script.ld" + PDM_SECTION=".pdm_section 0x3800FC00 (NOLOAD): {\n \ *(.pdm_buffer)\n \ } > RAM_D3\n" if [[ $ARDUINOVARIANT == *PORTENTA*M7* || $ARDUINOVARIANT == *GIGA* || $ARDUINOVARIANT == *OPTA* ]]; then - OPENAMP_SECTION="${OPENAMP_SECTION} \ + PDM_SECTION="${PDM_SECTION} \ _dtcm_lma = __etext + SIZEOF(.data);\n \ .dtcm : AT(_dtcm_lma) {\n \ _sdtcm = .;\n \ @@ -210,27 +205,28 @@ generate_flags () { } > DTCMRAM" fi - sed -i "s?.heap (COPY):?${OPENAMP_SECTION}\n .heap (COPY):?g" $ARDUINOVARIANT/linker_script.ld + sed -i "s?.heap (COPY):?${PDM_SECTION}\n .heap (COPY):?g" $ARDUINOVARIANT/linker_script.ld OPENAMP_REGIONS="__OPENAMP_region_start__ = 0x38000400;\n__OPENAMP_region_end__ = 0x38000400 + LENGTH(RAM_D3) - 1K;" sed -i "s?ENTRY(Reset_Handler)?${OPENAMP_REGIONS}\nENTRY(Reset_Handler)?g" $ARDUINOVARIANT/linker_script.ld + + if [[ $ARDUINOVARIANT == *GENERIC*M4 ]]; then + echo "Fixing VTOR base in $ARDUINOVARIANT/linker_script.ld" + VTOR_SECTION="#if (CM4_BINARY_START == 0x60000000)\n \ + REGION_ALIAS(\"RAM\", FLASH);\n \ + #else\n \ + REGION_ALIAS(\"RAM\", RAM_D2);\n \ + #endif\n" + sed -i "s?REGION_ALIAS.*?${VTOR_SECTION}?g" $ARDUINOVARIANT/linker_script.ld + echo "Fixing shared memory attributes in $ARDUINOVARIANT/linker_script.ld" + sed -i "s?.heap (COPY)?.heap (NOLOAD)?g" $ARDUINOVARIANT/linker_script.ld + sed -i "s?.stack_dummy (COPY)?.stack_dummy (NOLOAD)?g" $ARDUINOVARIANT/linker_script.ld + fi fi echo "Patching linker scripts" sed -i 's/0x8100000/CM4_BINARY_START/g' "$ARDUINOVARIANT"/linker_script.ld sed -i 's/LENGTH = 0x200000/LENGTH = CM4_BINARY_END - CM4_BINARY_START/g' "$ARDUINOVARIANT"/linker_script.ld sed -i 's/LENGTH = 0x1c0000/LENGTH = CM4_BINARY_START - 0x8040000/g' "$ARDUINOVARIANT"/linker_script.ld fi - if [[ $ARDUINOVARIANT == *NANO_RP2040* ]]; then - set +e - HAS_2NDSTAGE_SECTION=`grep second_stage_ota "$ARDUINOVARIANT"/linker_script.ld` - set -e - if [ x"$HAS_2NDSTAGE_SECTION" == x ]; then - echo "Adding second stage bootloader section to Nano RP2040 Connect" - SECOND_STAGE_SECTION=".second_stage_ota : {\n \ - KEEP (*(.second_stage_ota))\n \ - } > FLASH" - sed -i "s?.flash_begin?${SECOND_STAGE_SECTION}\n .flash_begin?g" $ARDUINOVARIANT/linker_script.ld - fi - fi done echo " done." } diff --git a/mbed-os-to-arduino-macos b/mbed-os-to-arduino-macos index 077a4d7d0..bd745a976 100755 --- a/mbed-os-to-arduino-macos +++ b/mbed-os-to-arduino-macos @@ -253,18 +253,6 @@ generate_flags () { gsed -i 's/LENGTH = 0x200000/LENGTH = CM4_BINARY_END - CM4_BINARY_START/g' "$ARDUINOVARIANT"/linker_script.ld gsed -i 's/LENGTH = 0x1c0000/LENGTH = CM4_BINARY_START - 0x8040000/g' "$ARDUINOVARIANT"/linker_script.ld fi - if [[ $ARDUINOVARIANT == *NANO_RP2040* ]]; then - set +e - HAS_2NDSTAGE_SECTION=`grep second_stage_ota "$ARDUINOVARIANT"/linker_script.ld` - set -e - if [ x"$HAS_2NDSTAGE_SECTION" == x ]; then - echo "Adding second stage bootloader section to Nano RP2040 Connect" - SECOND_STAGE_SECTION=".second_stage_ota : {\n \ - KEEP (*(.second_stage_ota))\n \ - } > FLASH" - gsed -i "s?.flash_begin?${SECOND_STAGE_SECTION}\n .flash_begin?g" $ARDUINOVARIANT/linker_script.ld - fi - fi done echo " done." } diff --git a/package_full.sh b/package_full.sh index 00e3dad29..2f9c1434e 100755 --- a/package_full.sh +++ b/package_full.sh @@ -1,5 +1,5 @@ #Get version from git(hub) tag -export VERSION="4.0.10" +export VERSION="4.2.4" FLAVOURS=`ls *.variables` diff --git a/patches/0189-QSPI-call-is_mem_ready-before-trying-to-set-write-en.patch b/patches/0189-QSPI-call-is_mem_ready-before-trying-to-set-write-en.patch index b2a5652d4..304679c90 100644 --- a/patches/0189-QSPI-call-is_mem_ready-before-trying-to-set-write-en.patch +++ b/patches/0189-QSPI-call-is_mem_ready-before-trying-to-set-write-en.patch @@ -1,29 +1,32 @@ -From 3724f4267a7fbf993aaf4cadb3e0249b210af908 Mon Sep 17 00:00:00 2001 -From: giulcioffi -Date: Tue, 29 Mar 2022 16:19:01 +0200 -Subject: [PATCH 189/204] QSPI: call is_mem_ready before trying to set write - enable bit +From 67f98029e080a9ff605b078e383cabeb21da4807 Mon Sep 17 00:00:00 2001 +From: Martino Facchin +Date: Tue, 2 Jul 2024 16:13:42 +0200 +Subject: [PATCH] QSPI: call is_mem_ready before trying to set write enable bit + for AT25SF128A +This reverts commit f6d960e023a8d2300f3e850f5d721e87eeb95948. --- - .../blockdevice/COMPONENT_QSPIF/source/QSPIFBlockDevice.cpp | 5 +++++ - 1 file changed, 5 insertions(+) + .../blockdevice/COMPONENT_QSPIF/source/QSPIFBlockDevice.cpp | 6 ++++++ + 1 file changed, 6 insertions(+) diff --git a/storage/blockdevice/COMPONENT_QSPIF/source/QSPIFBlockDevice.cpp b/storage/blockdevice/COMPONENT_QSPIF/source/QSPIFBlockDevice.cpp -index 20af57f257..197be5e56b 100644 +index ee8bab5556..b005aeb0f1 100644 --- a/storage/blockdevice/COMPONENT_QSPIF/source/QSPIFBlockDevice.cpp +++ b/storage/blockdevice/COMPONENT_QSPIF/source/QSPIFBlockDevice.cpp -@@ -1186,6 +1186,11 @@ int QSPIFBlockDevice::_set_write_enable() +@@ -1243,7 +1243,13 @@ int QSPIFBlockDevice::_set_write_enable() uint8_t status_value = 0; int status = -1; -+ if (false == _is_mem_ready()) { ++ if (_AT25SF128A_quirk && (false == _is_mem_ready())) { + tr_error("Device not ready, set_write_enable failed"); + return -1; + } + do { ++ if (QSPI_STATUS_OK != _qspi_send_general_command(QSPIF_INST_WREN, QSPI_NO_ADDRESS_COMMAND, NULL, 0, NULL, 0)) { tr_error("Sending WREN command FAILED"); + break; -- -2.39.1 +2.45.2 diff --git a/patches/0227-stm32h747-cm4-set-VTOR-at-boot.patch b/patches/0227-stm32h747-cm4-set-VTOR-at-boot.patch new file mode 100644 index 000000000..f774d36cf --- /dev/null +++ b/patches/0227-stm32h747-cm4-set-VTOR-at-boot.patch @@ -0,0 +1,48 @@ +From 2d834973fc86b787535204b174303a0311e1f36f Mon Sep 17 00:00:00 2001 +From: Martino Facchin +Date: Fri, 19 Jan 2024 11:13:09 +0100 +Subject: [PATCH] stm32h747: cm4: set VTOR at boot + +--- + .../STM32Cube_FW/system_stm32h7xx_dualcore_boot_cm4_cm7.c | 2 +- + .../TOOLCHAIN_GCC_ARM/stm32h747xI_CM4.ld | 8 +++++++- + 2 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/system_stm32h7xx_dualcore_boot_cm4_cm7.c b/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/system_stm32h7xx_dualcore_boot_cm4_cm7.c +index b4a4cc7826..8e0017de2a 100644 +--- a/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/system_stm32h7xx_dualcore_boot_cm4_cm7.c ++++ b/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/system_stm32h7xx_dualcore_boot_cm4_cm7.c +@@ -232,7 +232,7 @@ __weak void SystemInit (void) + /* Configure the Vector Table location add offset address ------------------*/ + #ifdef VECT_TAB_SRAM + SCB->VTOR = D2_AXISRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +-#elif !defined(NO_VTOR_RELOCATE) ++#else + #include "nvic_addr.h" // MBED + SCB->VTOR = NVIC_FLASH_VECTOR_ADDRESS; // MBED + #endif +diff --git a/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_STM32H747xI_CM4/TOOLCHAIN_GCC_ARM/stm32h747xI_CM4.ld b/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_STM32H747xI_CM4/TOOLCHAIN_GCC_ARM/stm32h747xI_CM4.ld +index ea81a18b11..7d2651dcb4 100644 +--- a/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_STM32H747xI_CM4/TOOLCHAIN_GCC_ARM/stm32h747xI_CM4.ld ++++ b/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_STM32H747xI_CM4/TOOLCHAIN_GCC_ARM/stm32h747xI_CM4.ld +@@ -38,10 +38,16 @@ + MEMORY + { + FLASH (rx) : ORIGIN = MBED_APP_START, LENGTH = MBED_APP_SIZE +- RAM (rwx) : ORIGIN = MBED_RAM_START + VECTORS_SIZE, LENGTH = MBED_RAM_SIZE - VECTORS_SIZE ++ RAM_D2 (rwx) : ORIGIN = MBED_RAM_START + VECTORS_SIZE, LENGTH = MBED_RAM_SIZE - VECTORS_SIZE + RAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 64K + } + ++#if (CM4_BINARY_START == 0x60000000) ++REGION_ALIAS("RAM", FLASH); ++#else ++REGION_ALIAS("RAM", RAM_D2); ++#endif ++ + /* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: +-- +2.43.0 + diff --git a/patches/0228-stm32h7-adc-DUAL_PAD-fix-definitions-for-GENERIC_M4-.patch b/patches/0228-stm32h7-adc-DUAL_PAD-fix-definitions-for-GENERIC_M4-.patch new file mode 100644 index 000000000..16061d42e --- /dev/null +++ b/patches/0228-stm32h7-adc-DUAL_PAD-fix-definitions-for-GENERIC_M4-.patch @@ -0,0 +1,40 @@ +From 992ed2cca5ebbce5f817d9fd25b2162ff8e77bbe Mon Sep 17 00:00:00 2001 +From: Martino Facchin +Date: Mon, 29 Apr 2024 10:41:37 +0200 +Subject: [PATCH] stm32h7: adc: DUAL_PAD: fix definitions for GENERIC_M4 target + +Completes 2e1da0130 and fixes https://github.com/arduino/ArduinoCore-mbed/issues/867 +--- + .../TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h | 2 +- + targets/TARGET_STM/tools/STM32_gen_PeripheralPins.py | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h b/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h +index 97d48334d7..04a34504a7 100644 +--- a/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h ++++ b/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h +@@ -43,7 +43,7 @@ + extern "C" { + #endif + +-#define DUAL_PAD 0xF00 ++#define DUAL_PAD 0x800 + + typedef enum { + ALT0 = 0x100, +diff --git a/targets/TARGET_STM/tools/STM32_gen_PeripheralPins.py b/targets/TARGET_STM/tools/STM32_gen_PeripheralPins.py +index 44a95f9c02..903ce5f7e0 100644 +--- a/targets/TARGET_STM/tools/STM32_gen_PeripheralPins.py ++++ b/targets/TARGET_STM/tools/STM32_gen_PeripheralPins.py +@@ -491,7 +491,7 @@ extern "C" { + + if DUAL_PAD: + line_to_write = (""" +-#define DUAL_PAD 0xF00 ++#define DUAL_PAD 0x800 + """) + out_h_file.write(line_to_write) + +-- +2.44.0 + diff --git a/patches/0229-NiclaVision-enable-red-blink-on-mbed_die.patch b/patches/0229-NiclaVision-enable-red-blink-on-mbed_die.patch new file mode 100644 index 000000000..2da8e220e --- /dev/null +++ b/patches/0229-NiclaVision-enable-red-blink-on-mbed_die.patch @@ -0,0 +1,28 @@ +From a448ec473c706fd2b6bd2e99aa31d6c7e3d9debb Mon Sep 17 00:00:00 2001 +From: Martino Facchin +Date: Tue, 4 Jun 2024 14:29:00 +0200 +Subject: [PATCH] NiclaVision: enable red blink on mbed_die() + +--- + .../TARGET_STM32H747xI/TARGET_NICLA_VISION/PinNames.h | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_NICLA_VISION/PinNames.h b/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_NICLA_VISION/PinNames.h +index 9f14a66d67..42d24cd79d 100644 +--- a/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_NICLA_VISION/PinNames.h ++++ b/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_NICLA_VISION/PinNames.h +@@ -467,6 +467,11 @@ typedef enum { + NC = (int)0xFFFFFFFF + } PinName; + ++// Standardized LED and button names ++#define LED1 LED_RED ++#define LED2 LED_GREEN ++#define LED3 LED_BLUE ++ + #ifdef __cplusplus + } + #endif +-- +2.45.0 + diff --git a/patches/0230-TLSSocketWrapper-do-not-force-close-to-block.patch b/patches/0230-TLSSocketWrapper-do-not-force-close-to-block.patch new file mode 100644 index 000000000..33981a691 --- /dev/null +++ b/patches/0230-TLSSocketWrapper-do-not-force-close-to-block.patch @@ -0,0 +1,24 @@ +From d0f5c17e3f7a3094c80b6b239c407f1cf7ba6df9 Mon Sep 17 00:00:00 2001 +From: pennam +Date: Thu, 27 Jun 2024 13:36:31 +0200 +Subject: [PATCH] TLSSocketWrapper: do not force close() to block + +--- + connectivity/netsocket/source/TLSSocketWrapper.cpp | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/connectivity/netsocket/source/TLSSocketWrapper.cpp b/connectivity/netsocket/source/TLSSocketWrapper.cpp +index 1fb9c21769..c020cd9f59 100644 +--- a/connectivity/netsocket/source/TLSSocketWrapper.cpp ++++ b/connectivity/netsocket/source/TLSSocketWrapper.cpp +@@ -757,7 +757,6 @@ nsapi_error_t TLSSocketWrapper::close() + + int ret = 0; + if (_handshake_completed) { +- _transport->set_blocking(true); + ret = mbedtls_ssl_close_notify(&_ssl); + if (ret) { + print_mbedtls_error("mbedtls_ssl_close_notify", ret); +-- +2.43.0 + diff --git a/patches/0231-RP2040-add-pico_rand-support.patch b/patches/0231-RP2040-add-pico_rand-support.patch new file mode 100644 index 000000000..9afe7ca99 --- /dev/null +++ b/patches/0231-RP2040-add-pico_rand-support.patch @@ -0,0 +1,725 @@ +From ac5c21fad54214e10a3558f29195d7ea70b4ccec Mon Sep 17 00:00:00 2001 +From: pennam +Date: Mon, 17 Jun 2024 10:19:14 +0200 +Subject: [PATCH] RP2040: add pico_rand support + +--- + .../TARGET_RP2040/CMakeLists.txt | 2 + + .../TARGET_RP2040/objects.h | 7 + + .../pico-sdk/rp2_common/CMakeLists.txt | 1 + + .../hardware_sync/include/hardware/sync.h | 5 + + .../pico_platform/include/pico/platform.h | 6 +- + .../rp2_common/pico_rand/CMakeLists.txt | 13 + + .../rp2_common/pico_rand/include/pico/rand.h | 185 +++++++++++ + .../pico-sdk/rp2_common/pico_rand/rand.c | 305 ++++++++++++++++++ + .../TARGET_RP2040/trng_api.c | 64 ++++ + targets/targets.json | 3 +- + 10 files changed, 587 insertions(+), 4 deletions(-) + create mode 100644 targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/CMakeLists.txt + create mode 100644 targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/include/pico/rand.h + create mode 100644 targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/rand.c + create mode 100644 targets/TARGET_RASPBERRYPI/TARGET_RP2040/trng_api.c + +diff --git a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/CMakeLists.txt b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/CMakeLists.txt +index 4fadf6091e..4e9bae47ce 100644 +--- a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/CMakeLists.txt ++++ b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/CMakeLists.txt +@@ -36,6 +36,7 @@ target_include_directories(mbed-rp2040 + pico-sdk/common/pico_base/include + pico-sdk/common/pico_binary_info/include + pico-sdk/common/pico_util/include ++ pico-sdk/common/pico_rand/include + pico-sdk/boards/include + pico-sdk/generated + . +@@ -71,6 +72,7 @@ target_sources(mbed-rp2040 + pico-sdk/rp2_common/pico_bootrom/bootrom.c + pico-sdk/rp2_common/pico_runtime/runtime.c + pico-sdk/rp2_common/pico_platform/platform.c ++ pico-sdk/rp2_common/pico_rand/rand.c + pico-sdk/common/pico_sync/mutex.c + pico-sdk/common/pico_time/time.c + pico-sdk/common/pico_sync/lock_core.c +diff --git a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/objects.h b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/objects.h +index f5f44a58f4..0231968bb5 100644 +--- a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/objects.h ++++ b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/objects.h +@@ -33,6 +33,7 @@ extern "C" { + #include "pico/assert.h" + #include "pico/time.h" + #include "pico/types.h" ++#include "pico/rand.h" + #include "hardware/pwm.h" + #include "hardware/adc.h" + #include "hardware/resets.h" +@@ -122,6 +123,12 @@ struct flash_s { + uint32_t dummy; + }; + ++#if DEVICE_TRNG ++struct trng_s { ++ uint8_t not_used; ++}; ++#endif ++ + typedef struct gpio_s gpio_t; + typedef struct serial_s serial_t; + +diff --git a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/CMakeLists.txt b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/CMakeLists.txt +index 4ca55becba..ec89c3ff71 100644 +--- a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/CMakeLists.txt ++++ b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/CMakeLists.txt +@@ -49,6 +49,7 @@ if (NOT PICO_BARE_METAL) + pico_add_subdirectory(pico_mem_ops) + pico_add_subdirectory(pico_malloc) + pico_add_subdirectory(pico_printf) ++ pico_add_subdirectory(pico_rand) + + pico_add_subdirectory(pico_stdio) + pico_add_subdirectory(pico_stdio_semihosting) +diff --git a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/hardware_sync/include/hardware/sync.h b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/hardware_sync/include/hardware/sync.h +index 8f91d55955..4f076aba02 100644 +--- a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/hardware_sync/include/hardware/sync.h ++++ b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/hardware_sync/include/hardware/sync.h +@@ -70,6 +70,11 @@ typedef volatile uint32_t spin_lock_t; + #define PICO_SPINLOCK_ID_HARDWARE_CLAIM 11 + #endif + ++// PICO_CONFIG: PICO_SPINLOCK_ID_RAND, Spinlock ID for Random Number Generator, min=0, max=31, default=12, group=hardware_sync ++#ifndef PICO_SPINLOCK_ID_RAND ++#define PICO_SPINLOCK_ID_RAND 12 ++#endif ++ + // PICO_CONFIG: PICO_SPINLOCK_ID_OS1, First Spinlock ID reserved for use by low level OS style software, min=0, max=31, default=14, group=hardware_sync + #ifndef PICO_SPINLOCK_ID_OS1 + #define PICO_SPINLOCK_ID_OS1 14 +diff --git a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_platform/include/pico/platform.h b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_platform/include/pico/platform.h +index ee1d360cee..ea16d9734e 100644 +--- a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_platform/include/pico/platform.h ++++ b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_platform/include/pico/platform.h +@@ -151,14 +151,14 @@ extern "C" { + * + * For example a `uint32_t` foo that will retain its value if the program is restarted by reset. + * +- * uint32_t __uninitialized_ram("my_group_name") foo; ++ * uint32_t __uninitialized_ram(foo); + * +- * The section attribute is `.uninitialized_ram.` ++ * The section attribute is `.uninitialized_data.` + * + * \param group a string suffix to use in the section name to distinguish groups that can be linker + * garbage-collected independently + */ +-#define __uninitialized_ram(group) __attribute__((section(".uninitialized_ram." #group))) group ++#define __uninitialized_ram(group) __attribute__((section(".uninitialized_data." #group))) group + + /*! \brief Section attribute macro for placement in flash even in a COPY_TO_RAM binary + * \ingroup pico_platform +diff --git a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/CMakeLists.txt b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/CMakeLists.txt +new file mode 100644 +index 0000000000..0e72bb5ab6 +--- /dev/null ++++ b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/CMakeLists.txt +@@ -0,0 +1,13 @@ ++pico_add_library(pico_rand) ++ ++target_sources(pico_rand INTERFACE ++ ${CMAKE_CURRENT_LIST_DIR}/rand.c ++) ++ ++target_include_directories(pico_rand_headers INTERFACE ${CMAKE_CURRENT_LIST_DIR}/include) ++ ++pico_mirrored_target_link_libraries(pico_rand INTERFACE ++ pico_unique_id ++ hardware_clocks ++ hardware_timer ++ hardware_sync) +diff --git a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/include/pico/rand.h b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/include/pico/rand.h +new file mode 100644 +index 0000000000..20fc6d6cb1 +--- /dev/null ++++ b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/include/pico/rand.h +@@ -0,0 +1,185 @@ ++/* ++ * Copyright (c) 2022 Raspberry Pi (Trading) Ltd. ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ */ ++ ++#ifndef _PICO_RAND_H ++#define _PICO_RAND_H ++ ++#include "pico.h" ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/** \file pico/rand.h ++ * \defgroup pico_rand pico_rand ++ * ++ * Random Number Generator API ++ * ++ * This module generates random numbers at runtime utilizing a number of possible entropy ++ * sources and uses those sources to modify the state of a 128-bit 'Pseudo ++ * Random Number Generator' implemented in software. ++ * ++ * The random numbers (32 to 128 bit) to be supplied are read from the PRNG which is used ++ * to help provide a large number space. ++ * ++ * The following (multiple) sources of entropy are available (of varying quality), each enabled by a #define: ++ * ++ * - The Ring Oscillator (ROSC) (\ref PICO_RAND_ENTROPY_SRC_ROSC == 1): ++ * \ref PICO_RAND_ROSC_BIT_SAMPLE_COUNT bits are gathered from the ring oscillator "random bit" and mixed in each ++ * time. This should not be used if the ROSC is off, or the processor is running from ++ * the ROSC. ++ * \note the maximum throughput of ROSC bit sampling is controlled by PICO_RAND_MIN_ROSC_BIT_SAMPLE_TIME_US which defaults ++ * to 10us, i.e. 100,000 bits per second. ++ * - Time (\ref PICO_RAND_ENTROPY_SRC_TIME == 1): The 64-bit microsecond timer is mixed in each time. ++ * - Bus Performance Counter (\ref PICO_RAND_ENTROPY_SRC_BUS_PERF_COUNTER == 1): One of the bus fabric's performance ++ * counters is mixed in each time. ++ * ++ * \note All entropy sources are hashed before application to the PRNG state machine. ++ * ++ * The \em first time a random number is requested, the 128-bit PRNG state ++ * must be seeded. Multiple entropy sources are also available for the seeding operation: ++ * ++ * - The Ring Oscillator (ROSC) (\ref PICO_RAND_SEED_ENTROPY_SRC_ROSC == 1): ++ * 64 bits are gathered from the ring oscillator "random bit" and mixed into the seed. ++ * - Time (\ref PICO_RAND_SEED_ENTROPY_SRC_TIME == 1): The 64-bit microsecond timer is mixed into the seed. ++ * - Board Identifier (PICO_RAND_SEED_ENTROPY_SRC_BOARD_ID == 1): The board id via \ref pico_get_unique_board_id ++ * is mixed into the seed. ++ * - RAM hash (\ref PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH (\ref PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH): The hashed contents of a ++ * subset of RAM are mixed in. Initial RAM contents are undefined on power up, so provide a reasonable source of entropy. ++ * By default the last 1K of RAM (which usually contains the core 0 stack) is hashed, which may also provide for differences ++ * after each warm reset. ++ * ++ * With default settings, the seed generation takes approximately 1 millisecond while ++ * subsequent random numbers generally take between 10 and 20 microseconds to generate. ++ * ++ * pico_rand methods may be safely called from either core or from an IRQ, but be careful in the latter case as ++ * the calls may block for a number of microseconds waiting on more entropy. ++ */ ++ ++// --------------- ++// ENTROPY SOURCES ++// --------------- ++ ++// PICO_CONFIG: PICO_RAND_ENTROPY_SRC_ROSC, Enable/disable use of ROSC as an entropy source, type=bool, default=1, group=pico_rand ++#ifndef PICO_RAND_ENTROPY_SRC_ROSC ++#define PICO_RAND_ENTROPY_SRC_ROSC 1 ++#endif ++ ++// PICO_CONFIG: PICO_RAND_ENTROPY_SRC_TIME, Enable/disable use of hardware timestamp as an entropy source, type=bool, default=1, group=pico_rand ++#ifndef PICO_RAND_ENTROPY_SRC_TIME ++#define PICO_RAND_ENTROPY_SRC_TIME 1 ++#endif ++ ++// PICO_CONFIG: PICO_RAND_ENTROPY_SRC_BUS_PERF_COUNTER, Enable/disable use of a bus performance counter as an entropy source, type=bool, default=1, group=pico_rand ++#ifndef PICO_RAND_ENTROPY_SRC_BUS_PERF_COUNTER ++#define PICO_RAND_ENTROPY_SRC_BUS_PERF_COUNTER 1 ++#endif ++ ++// -------------------- ++// SEED ENTROPY SOURCES ++// -------------------- ++ ++// PICO_CONFIG: PICO_RAND_SEED_ENTROPY_SRC_ROSC, Enable/disable use of ROSC as an entropy source for the random seed, type=bool, default=1, group=pico_rand ++#ifndef PICO_RAND_SEED_ENTROPY_SRC_ROSC ++#define PICO_RAND_SEED_ENTROPY_SRC_ROSC PICO_RAND_ENTROPY_SRC_ROSC ++#endif ++ ++// PICO_CONFIG: PICO_RAND_SEED_ENTROPY_SRC_TIME, Enable/disable use of hardware timestamp as an entropy source for the random seed, type=bool, default=1, group=pico_rand ++#ifndef PICO_RAND_SEED_ENTROPY_SRC_TIME ++#define PICO_RAND_SEED_ENTROPY_SRC_TIME PICO_RAND_ENTROPY_SRC_TIME ++#endif ++ ++// PICO_CONFIG: PICO_RAND_SEED_ENTROPY_SRC_BOARD_ID, Enable/disable use of board id as part of the random seed, type=bool, default=1, group=pico_rand ++#ifndef PICO_RAND_SEED_ENTROPY_SRC_BOARD_ID ++#define PICO_RAND_SEED_ENTROPY_SRC_BOARD_ID 0 ++#endif ++ ++// PICO_CONFIG: PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH, Enable/disable use of a RAM hash as an entropy source for the random seed, type=bool, default=1, group=pico_rand ++#ifndef PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH ++#define PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH 1 ++#endif ++ ++// --------------------------------- ++// PICO_RAND_ENTROPY_SRC_ROSC CONFIG ++// --------------------------------- ++ ++// PICO_CONFIG: PICO_RAND_ROSC_BIT_SAMPLE_COUNT, Number of samples to take of the ROSC random bit per random number generation , min=1, max=64, default=1, group=pico_rand ++#ifndef PICO_RAND_ROSC_BIT_SAMPLE_COUNT ++#define PICO_RAND_ROSC_BIT_SAMPLE_COUNT 1 ++#endif ++ ++// PICO_CONFIG: PICO_RAND_MIN_ROSC_BIT_SAMPLE_TIME_US, Define a default minimum time between sampling the ROSC random bit, min=5, max=20, default=10, group=pico_rand ++#ifndef PICO_RAND_MIN_ROSC_BIT_SAMPLE_TIME_US ++// (Arbitrary / tested) minimum time between sampling the ROSC random bit ++#define PICO_RAND_MIN_ROSC_BIT_SAMPLE_TIME_US 10u ++#endif ++ ++// --------------------------------------------- ++// PICO_RAND_ENTROPY_SRC_BUS_PERF_COUNTER CONFIG ++// --------------------------------------------- ++ ++// PICO_CONFIG: PICO_RAND_BUS_PERF_COUNTER_INDEX, Bus performance counter index to use for sourcing entropy, min=0, max=3, group=pico_rand ++// this is deliberately undefined by default, meaning the code will pick that appears unused ++//#define PICO_RAND_BUS_PERF_COUNTER_INDEX 0 ++ ++// PICO_CONFIG: PICO_RAND_BUS_PERF_COUNTER_EVENT, Bus performance counter event to use for sourcing entropy, default=arbiter_sram5_perf_event_access, group=pico_rand ++#ifndef PICO_RAND_BUS_PERF_COUNTER_EVENT ++#define PICO_RAND_BUS_PERF_COUNTER_EVENT arbiter_sram5_perf_event_access ++#endif ++ ++// ------------------------------------------ ++// PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH CONFIG ++// ------------------------------------------ ++ ++// PICO_CONFIG: PICO_RAND_RAM_HASH_END, end of address in RAM (non-inclusive) to hash during pico_rand seed initialization, default=SRAM_END, group=pico_rand ++#ifndef PICO_RAND_RAM_HASH_END ++#define PICO_RAND_RAM_HASH_END SRAM_END ++#endif ++// PICO_CONFIG: PICO_RAND_RAM_HASH_START, start of address in RAM (inclusive) to hash during pico_rand seed initialization, default=PICO_RAND_RAM_HASH_END - 1024, group=pico_rand ++#ifndef PICO_RAND_RAM_HASH_START ++#define PICO_RAND_RAM_HASH_START (PICO_RAND_RAM_HASH_END - 1024u) ++#endif ++ ++// We provide a maximum of 128 bits entropy in one go ++typedef struct rng_128 { ++ uint64_t r[2]; ++} rng_128_t; ++ ++/*! \brief Get 128-bit random number ++ * \ingroup pico_rand ++ * ++ * This method may be safely called from either core or from an IRQ, but be careful in the latter case as ++ * the call may block for a number of microseconds waiting on more entropy. ++ * ++ * \param rand128 Pointer to storage to accept a 128-bit random number ++ */ ++void get_rand_128(rng_128_t *rand128); ++ ++/*! \brief Get 64-bit random number ++ * \ingroup pico_rand ++ * ++ * This method may be safely called from either core or from an IRQ, but be careful in the latter case as ++ * the call may block for a number of microseconds waiting on more entropy. ++ * ++ * \return 64-bit random number ++ */ ++uint64_t get_rand_64(void); ++ ++/*! \brief Get 32-bit random number ++ * \ingroup pico_rand ++ * ++ * This method may be safely called from either core or from an IRQ, but be careful in the latter case as ++ * the call may block for a number of microseconds waiting on more entropy. ++ * ++ * \return 32-bit random number ++ */ ++uint32_t get_rand_32(void); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +diff --git a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/rand.c b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/rand.c +new file mode 100644 +index 0000000000..c73b80321e +--- /dev/null ++++ b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/rand.c +@@ -0,0 +1,305 @@ ++/* ++ * Copyright (c) 2022 Raspberry Pi (Trading) Ltd. ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ */ ++ ++/* xoroshiro128ss(), rotl(): ++ ++ Written in 2018 by David Blackman and Sebastiano Vigna (vigna@acm.org) ++ ++ To the extent possible under law, the author has dedicated all copyright ++ and related and neighboring rights to this software to the public domain ++ worldwide. This software is distributed without any warranty. ++ ++ See ++ ++ splitmix64() implementation: ++ ++ Written in 2015 by Sebastiano Vigna (vigna@acm.org) ++ To the extent possible under law, the author has dedicated all copyright ++ and related and neighboring rights to this software to the public domain ++ worldwide. This software is distributed without any warranty. ++ ++ See ++*/ ++ ++#include "pico/rand.h" ++#if PICO_RAND_SEED_ENTROPY_SRC_BOARD_ID ++#include "pico/unique_id.h" ++#endif ++#include "pico/time.h" ++#include "hardware/clocks.h" ++#include "hardware/structs/rosc.h" ++#include "hardware/structs/bus_ctrl.h" ++#include "hardware/sync.h" ++ ++static bool rng_initialised = false; ++ ++// Note: By design, do not initialise any of the variables that hold entropy, ++// they may have useful junk in them, either from power-up or a previous boot. ++static rng_128_t __uninitialized_ram(rng_state); ++#if PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH ++static uint64_t __uninitialized_ram(ram_hash); ++#endif ++ ++#if PICO_RAND_ENTROPY_SRC_ROSC | PICO_RAND_SEED_ENTROPY_SRC_ROSC ++static uint64_t __uninitialized_ram(rosc_samples); ++#endif ++ ++#if PICO_RAND_ENTROPY_SRC_BUS_PERF_COUNTER ++static uint8_t bus_counter_idx; ++#endif ++ ++/* From the original source: ++ ++ This is a fixed-increment version of Java 8's SplittableRandom generator ++ See http://dx.doi.org/10.1145/2714064.2660195 and ++ http://docs.oracle.com/javase/8/docs/api/java/util/SplittableRandom.html ++ ++ It is a very fast generator passing BigCrush, and it can be useful if ++ for some reason you absolutely want 64 bits of state; otherwise, we ++ rather suggest to use a xoroshiro128+ (for moderately parallel ++ computations) or xorshift1024* (for massively parallel computations) ++ generator. ++ ++ Note: This can be called with any value (i.e. including 0) ++*/ ++static __noinline uint64_t splitmix64(uint64_t x) { ++ uint64_t z = x + 0x9E3779B97F4A7C15ull; ++ z = (z ^ (z >> 30)) * 0xBF58476D1CE4E5B9ull; ++ z = (z ^ (z >> 27)) * 0x94D049BB133111EBull; ++ return z ^ (z >> 31); ++} ++ ++/* From the original source: ++ ++ This is xoroshiro128** 1.0, one of our all-purpose, rock-solid, ++ small-state generators. It is extremely (sub-ns) fast and it passes all ++ tests we are aware of, but its state space is large enough only for ++ mild parallelism. ++ ++ For generating just floating-point numbers, xoroshiro128+ is even ++ faster (but it has a very mild bias, see notes in the comments). ++ ++ The state must be seeded so that it is not everywhere zero. If you have ++ a 64-bit seed, we suggest to seed a splitmix64 generator and use its ++ output to fill s. ++*/ ++static inline uint64_t rotl(const uint64_t x, int k) { ++ return (x << k) | (x >> (64 - k)); ++} ++ ++static __noinline uint64_t xoroshiro128ss(rng_128_t *local_rng_state) { ++ const uint64_t s0 = local_rng_state->r[0]; ++ uint64_t s1 = local_rng_state->r[1]; ++ ++ // Because the state is *modified* outside of this function, there is a ++ // 1 in 2^128 chance that it could be all zeroes (which is not allowed). ++ while (s0 == 0 && s1 == 0) { ++ s1 = time_us_64(); // should not be 0, but loop anyway ++ } ++ ++ const uint64_t result = rotl(s0 * 5, 7) * 9; ++ ++ s1 ^= s0; ++ local_rng_state->r[0] = rotl(s0, 24) ^ s1 ^ (s1 << 16); // a, b ++ local_rng_state->r[1] = rotl(s1, 37); // c ++ ++ return result; ++} ++ ++#if PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH ++static uint64_t sdbm_hash64_sram(uint64_t hash) { ++ // save some time by hashing a word at a time ++ for (uint i = (PICO_RAND_RAM_HASH_START + 3) & ~3; i < PICO_RAND_RAM_HASH_END; i+=4) { ++ uint32_t c = *(uint32_t *) i; ++ hash = (uint64_t) c + (hash << 6) + (hash << 16) - hash; ++ } ++ return hash; ++} ++#endif ++ ++#if PICO_RAND_SEED_ENTROPY_SRC_ROSC | PICO_RAND_ENTROPY_SRC_ROSC ++/* gather an additional n bits of entropy, and shift them into the 64 bit entropy counter */ ++static uint64_t capture_additional_rosc_samples(uint n) { ++ static absolute_time_t next_sample_time; ++ ++ // provide an override if someone really wants it, but disabling ROSC as an entropy source makes more sense ++#if !PICO_RAND_DISABLE_ROSC_CHECK ++ // check that the ROSC is running but that the processors are NOT running from it ++ hard_assert((rosc_hw->status & ROSC_STATUS_ENABLED_BITS) && ++ ((clocks_hw->clk[clk_sys].ctrl & CLOCKS_CLK_SYS_CTRL_AUXSRC_BITS) != (CLOCKS_CLK_SYS_CTRL_AUXSRC_VALUE_ROSC_CLKSRC << CLOCKS_CLK_SYS_CTRL_AUXSRC_LSB))); ++#endif ++ ++ bool in_exception = __get_current_exception(); ++ assert(n); // save us having to special case samples for this ++ uint64_t samples = 0; ++ for(uint i=0; irandombit & 1u; ++ // use of relative time to now, rather than offset from before makes things ++ // a bit less predictable at the cost of some speed. ++ next_sample_time = make_timeout_time_us(PICO_RAND_MIN_ROSC_BIT_SAMPLE_TIME_US); ++ bit_done = true; ++ if (i == n - 1) { ++ // samples has our random bits, so let's mix them in now ++ samples = rosc_samples = (rosc_samples << n) | samples; ++ } ++ } ++ spin_unlock(lock, save); ++ } while (!bit_done); ++ } ++ return samples; ++} ++#endif ++ ++static void initialise_rand(void) { ++ rng_128_t local_rng_state = local_rng_state; ++ uint which = 0; ++#if PICO_RAND_SEED_ENTROPY_SRC_RAM_HASH ++ ram_hash = sdbm_hash64_sram(ram_hash); ++ local_rng_state.r[which] ^= splitmix64(ram_hash); ++ which ^= 1; ++#endif ++ ++#if PICO_RAND_SEED_ENTROPY_SRC_BOARD_ID ++ static_assert(PICO_UNIQUE_BOARD_ID_SIZE_BYTES == sizeof(uint64_t), ++ "Code below requires that 'board_id' is 64-bits in size"); ++ ++ // Note! The safety of the length assumption here is protected by a 'static_assert' above ++ union unique_id_u { ++ pico_unique_board_id_t board_id_native; ++ uint64_t board_id_u64; ++ } unique_id; ++ // Note! The safety of the length assumption here is protected by a 'static_assert' above ++ pico_get_unique_board_id(&unique_id.board_id_native); ++ local_rng_state.r[which] ^= splitmix64(unique_id.board_id_u64); ++ which ^= 1; ++#endif ++ ++#if PICO_RAND_SEED_ENTROPY_SRC_ROSC ++ // this is really quite slow (10ms per iteration), and I'm not sure that it adds value over the 64 random bits ++// uint ref_khz = clock_get_hz(clk_ref) / 100; ++// for (int i = 0; i < 5; i++) { ++// // Apply hash of the rosc frequency, limited but still 'extra' entropy ++// uint measurement = frequency_count_raw(CLOCKS_FC0_SRC_VALUE_ROSC_CLKSRC, ref_khz); ++// local_rng_state.r[which] ^= splitmix64(measurement); ++// (void) xoroshiro128ss(&local_rng_state); //churn to mix seed sources ++// } ++ ++ // Gather a full ROSC sample array with sample bits ++ local_rng_state.r[which] ^= splitmix64(capture_additional_rosc_samples(8 * sizeof(rosc_samples))); ++ which ^= 1; ++#endif ++ ++#if PICO_RAND_SEED_ENTROPY_SRC_TIME ++ // Mix in hashed time. This is [possibly] predictable boot-to-boot ++ // but will vary application-to-application. ++ local_rng_state.r[which] ^= splitmix64(time_us_64()); ++ which ^= 1; ++#endif ++ ++ spin_lock_t *lock = spin_lock_instance(PICO_SPINLOCK_ID_RAND); ++ uint32_t save = spin_lock_blocking(lock); ++ if (!rng_initialised) { ++#if PICO_RAND_ENTROPY_SRC_BUS_PERF_COUNTER ++#if !PICO_RAND_BUSCTRL_COUNTER_INDEX ++ int idx = -1; ++ for(uint i = 0; i < count_of(bus_ctrl_hw->counter); i++) { ++ if (bus_ctrl_hw->counter[i].sel == BUSCTRL_PERFSEL0_RESET) { ++ idx = (int)i; ++ break; ++ } ++ } ++ hard_assert(idx != -1); ++ bus_counter_idx = (uint8_t)idx; ++#else ++ bus_counter_idx = (uint8_t)PICO_RAND_BUSCTRL_COUNTER_INDEX; ++#endif ++ bus_ctrl_hw->counter[bus_counter_idx].sel = PICO_RAND_BUS_PERF_COUNTER_EVENT; ++#endif ++ (void) xoroshiro128ss(&local_rng_state); ++ rng_state = local_rng_state; ++ rng_initialised = true; ++ } ++ spin_unlock(lock, save); ++} ++ ++uint64_t get_rand_64(void) { ++ if (!rng_initialised) { ++ // Do not provide 'RNs' until the system has been initialised. Note: ++ // The first initialisation can be quite time-consuming depending on ++ // the amount of RAM hashed, see RAM_HASH_START and RAM_HASH_END ++ initialise_rand(); ++ } ++ ++ static volatile uint8_t check_byte; ++ rng_128_t local_rng_state = rng_state; ++ uint8_t local_check_byte = check_byte; ++ // Modify PRNG state with the run-time entropy sources, ++ // hashed to reduce correlation with previous modifications. ++ uint which = 0; ++#if PICO_RAND_ENTROPY_SRC_TIME ++ local_rng_state.r[which] ^= splitmix64(time_us_64()); ++ which ^= 1; ++#endif ++#if PICO_RAND_ENTROPY_SRC_ROSC ++ local_rng_state.r[which] ^= splitmix64(capture_additional_rosc_samples(PICO_RAND_ROSC_BIT_SAMPLE_COUNT)); ++ which ^= 1; ++#endif ++#if PICO_RAND_ENTROPY_SRC_BUS_PERF_COUNTER ++ uint32_t bus_counter_value = bus_ctrl_hw->counter[bus_counter_idx].value; ++ // counter is saturating, so clear it if it has reached saturation ++ if (bus_counter_value == BUSCTRL_PERFCTR0_BITS) { ++ bus_ctrl_hw->counter[bus_counter_idx].value = 0; ++ } ++ local_rng_state.r[which] ^= splitmix64(bus_counter_value); ++ which ^= 1; ++#endif ++ ++ spin_lock_t *lock = spin_lock_instance(PICO_SPINLOCK_ID_RAND); ++ uint32_t save = spin_lock_blocking(lock); ++ if (local_check_byte != check_byte) { ++ // someone got a random number in the interim, so mix it in ++ local_rng_state.r[0] ^= rng_state.r[0]; ++ local_rng_state.r[1] ^= rng_state.r[1]; ++ } ++ // Generate a 64-bit RN from the modified PRNG state. ++ // Note: This also "churns" the 128-bit state for next time. ++ uint64_t rand64 = xoroshiro128ss(&local_rng_state); ++ rng_state = local_rng_state; ++ check_byte++; ++ spin_unlock(lock, save); ++ ++ return rand64; ++} ++ ++void get_rand_128(rng_128_t *ptr128) { ++ ptr128->r[0] = get_rand_64(); ++ ptr128->r[1] = get_rand_64(); ++} ++ ++uint32_t get_rand_32(void) { ++ return (uint32_t) get_rand_64(); ++} +diff --git a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/trng_api.c b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/trng_api.c +new file mode 100644 +index 0000000000..b0886badcc +--- /dev/null ++++ b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/trng_api.c +@@ -0,0 +1,64 @@ ++/* mbed Microcontroller Library ++ * Copyright (c) 2018 GigaDevice Semiconductor Inc. ++ * ++ * SPDX-License-Identifier: Apache-2.0 ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++#if DEVICE_TRNG ++ ++#include "trng_api.h" ++ ++/** Initialize the TRNG peripheral ++ * ++ * @param obj The TRNG object ++ */ ++void trng_init(trng_t *obj) ++{ ++ (void)obj; ++} ++ ++/** Deinitialize the TRNG peripheral ++ * ++ * @param obj The TRNG object ++ */ ++void trng_free(trng_t *obj) ++{ ++ (void)obj; ++} ++ ++/** Get random data from TRNG peripheral ++ * ++ * @param obj The TRNG object ++ * @param output The pointer to an output array ++ * @param length The size of output data, to avoid buffer overwrite ++ * @param output_length The length of generated data ++ * @return 0 success, -1 fail ++ */ ++int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length) ++{ ++ (void)obj; ++ *output_length = 0; ++ uint32_t random[16]; ++ ++ while (*output_length < length) { ++ get_rand_128((rng_128_t*)random); ++ for (uint8_t i = 0; (i < 16) && (*output_length < length) ; i++) { ++ *output++ = random[i]; ++ *output_length += 1; ++ random[i] = 0; ++ } ++ } ++ return 0; ++} ++#endif /* DEVICE_TRNG */ +diff --git a/targets/targets.json b/targets/targets.json +index 9a12422336..83fa8c930a 100644 +--- a/targets/targets.json ++++ b/targets/targets.json +@@ -9700,7 +9700,8 @@ + "USTICKER", + "WATCHDOG", + "USBDEVICE", +- "RESET_REASON" ++ "RESET_REASON", ++ "TRNG" + ] + }, + "NANO_RP2040_CONNECT": { +-- +2.43.0 + diff --git a/patches/0232-emac_stm32-properly-invalidate-DCache-before-disabli.patch b/patches/0232-emac_stm32-properly-invalidate-DCache-before-disabli.patch new file mode 100644 index 000000000..0166cc9b0 --- /dev/null +++ b/patches/0232-emac_stm32-properly-invalidate-DCache-before-disabli.patch @@ -0,0 +1,40 @@ +From 717b63ce10981d1c3684e465f625e10b0b9efe96 Mon Sep 17 00:00:00 2001 +From: Martino Facchin +Date: Tue, 2 Jul 2024 16:30:07 +0200 +Subject: [PATCH] emac_stm32: properly invalidate DCache before disabling it + +--- + .../TARGET_STM/TARGET_STM32H7/TARGET_OPTA/stm32h7_eth_init.c | 3 +++ + .../TARGET_STM32H7/TARGET_PORTENTA_H7/stm32h7_eth_init.c | 1 + + 2 files changed, 4 insertions(+) + +diff --git a/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7/TARGET_OPTA/stm32h7_eth_init.c b/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7/TARGET_OPTA/stm32h7_eth_init.c +index 0572fae7a2..8b9cc8bcd0 100644 +--- a/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7/TARGET_OPTA/stm32h7_eth_init.c ++++ b/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7/TARGET_OPTA/stm32h7_eth_init.c +@@ -66,7 +66,10 @@ void HAL_ETH_MspInit(ETH_HandleTypeDef *heth) + + #if !(defined(DUAL_CORE) && defined(CORE_CM4)) + /* Disable DCache for STM32H7 family */ ++ core_util_critical_section_enter(); ++ SCB_CleanInvalidateDCache(); + SCB_DisableDCache(); ++ core_util_critical_section_exit(); + #endif + + /* GPIO Ports Clock Enable */ +diff --git a/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7/TARGET_PORTENTA_H7/stm32h7_eth_init.c b/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7/TARGET_PORTENTA_H7/stm32h7_eth_init.c +index 643fc5acd3..7f5b4206cb 100644 +--- a/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7/TARGET_PORTENTA_H7/stm32h7_eth_init.c ++++ b/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7/TARGET_PORTENTA_H7/stm32h7_eth_init.c +@@ -68,6 +68,7 @@ void HAL_ETH_MspInit(ETH_HandleTypeDef *heth) + #if !(defined(DUAL_CORE) && defined(CORE_CM4)) + /* Disable DCache for STM32H7 family */ + core_util_critical_section_enter(); ++ SCB_CleanInvalidateDCache(); + SCB_DisableDCache(); + core_util_critical_section_exit(); + #endif +-- +2.45.2 + diff --git a/patches/0233-emac-stop-start-dhcp-on-interface-bringup.patch b/patches/0233-emac-stop-start-dhcp-on-interface-bringup.patch new file mode 100644 index 000000000..85dd4c9e0 --- /dev/null +++ b/patches/0233-emac-stop-start-dhcp-on-interface-bringup.patch @@ -0,0 +1,30 @@ +From 5114c7f56a82c37021cdd92f07bc1a2c62e85e64 Mon Sep 17 00:00:00 2001 +From: maidnl +Date: Mon, 8 Jul 2024 12:07:40 +0200 +Subject: [PATCH 233/234] emac: stop/start dhcp on interface bringup + +--- + connectivity/lwipstack/source/LWIPInterface.cpp | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/connectivity/lwipstack/source/LWIPInterface.cpp b/connectivity/lwipstack/source/LWIPInterface.cpp +index a1cfcf31c4..dfefebcb8b 100644 +--- a/connectivity/lwipstack/source/LWIPInterface.cpp ++++ b/connectivity/lwipstack/source/LWIPInterface.cpp +@@ -169,8 +169,12 @@ nsapi_error_t LWIP::Interface::set_dhcp() + + #if LWIP_DHCP + if (dhcp_has_to_be_set) { ++ if(dhcp_started) { ++ dhcp_stop(&netif); ++ dhcp_started = false; ++ } ++ + err_t err = dhcp_start(&netif); +- dhcp_has_to_be_set = false; + if (err) { + connected = NSAPI_STATUS_DISCONNECTED; + if (client_callback) { +-- +2.45.2 + diff --git a/patches/0234-emac-stm32-check-inteface-status-before-link_out.patch b/patches/0234-emac-stm32-check-inteface-status-before-link_out.patch new file mode 100644 index 000000000..16024188b --- /dev/null +++ b/patches/0234-emac-stm32-check-inteface-status-before-link_out.patch @@ -0,0 +1,147 @@ +From e0cad5c4277b3c5ee9cb01a9529df9333612bbeb Mon Sep 17 00:00:00 2001 +From: maidnl +Date: Mon, 8 Jul 2024 12:08:48 +0200 +Subject: [PATCH 234/234] emac: stm32: check inteface status before link_out() + +This allows handling of HAL_ETH_STATE_ERROR, usually on interface teardown/up with strict timings +--- + .../drivers/emac/TARGET_STM/stm32xx_emac.cpp | 27 +++++++++++++++++++ + .../drivers/emac/TARGET_STM/stm32xx_emac.h | 7 +++++ + .../lwipstack/source/LWIPInterfaceEMAC.cpp | 15 +++++++++-- + .../netsocket/include/netsocket/EMAC.h | 11 ++++++++ + .../STM32H7xx_HAL_Driver/stm32h7xx_hal_eth.c | 8 +----- + 5 files changed, 59 insertions(+), 9 deletions(-) + +diff --git a/connectivity/drivers/emac/TARGET_STM/stm32xx_emac.cpp b/connectivity/drivers/emac/TARGET_STM/stm32xx_emac.cpp +index 0230a90665..0e7d64ad34 100644 +--- a/connectivity/drivers/emac/TARGET_STM/stm32xx_emac.cpp ++++ b/connectivity/drivers/emac/TARGET_STM/stm32xx_emac.cpp +@@ -402,6 +402,33 @@ bool STM32_EMAC::low_level_init_successful() + } + #endif // ETH_IP_VERSION_V2 + ++/** ++ * This function get the state of emac interface ++ */ ++int STM32_EMAC::get_interface_status() { ++ return HAL_ETH_GetState(&EthHandle); ++} ++ ++/** ++ * This function returns true if the status of the interface is in the ++ * correct state for the trasmission ++ */ ++bool STM32_EMAC::is_ready_to_tx() { ++ return (HAL_ETH_GetState(&EthHandle) == HAL_ETH_STATE_READY); ++} ++ ++/** ++ * This function reset the emac interface in case the status is in error ++ * Apparently there was not anything to recover from an error state ++ */ ++void STM32_EMAC::restart() { ++ if(HAL_ETH_STATE_ERROR == HAL_ETH_GetState(&EthHandle)){ ++ HAL_ETH_Stop(&EthHandle); ++ HAL_ETH_Start(&EthHandle); ++ } ++} ++ ++ + /** + * This function should do the actual transmission of the packet. The packet is + * contained in the memory buffer chain that is passed to the function. +diff --git a/connectivity/drivers/emac/TARGET_STM/stm32xx_emac.h b/connectivity/drivers/emac/TARGET_STM/stm32xx_emac.h +index cfa6752177..ecc280b2f8 100644 +--- a/connectivity/drivers/emac/TARGET_STM/stm32xx_emac.h ++++ b/connectivity/drivers/emac/TARGET_STM/stm32xx_emac.h +@@ -148,6 +148,13 @@ public: + */ + virtual void set_memory_manager(EMACMemoryManager &mem_mngr); + ++ /* return the status of the interface as integer */ ++ int get_interface_status() override; ++ /* return true if the interface is in the correct state to transmit */ ++ bool is_ready_to_tx() override; ++ /* restart only if the interface is in error state */ ++ void restart() override; ++ + // Called from driver functions + ETH_HandleTypeDef EthHandle; + osThreadId_t thread; /**< Processing thread */ +diff --git a/connectivity/lwipstack/source/LWIPInterfaceEMAC.cpp b/connectivity/lwipstack/source/LWIPInterfaceEMAC.cpp +index 56fbcc0d90..ed4397879e 100644 +--- a/connectivity/lwipstack/source/LWIPInterfaceEMAC.cpp ++++ b/connectivity/lwipstack/source/LWIPInterfaceEMAC.cpp +@@ -27,15 +27,26 @@ + + #if LWIP_ETHERNET + ++ + err_t LWIP::Interface::emac_low_level_output(struct netif *netif, struct pbuf *p) + { ++ bool ret = false; + /* Increase reference counter since lwip stores handle to pbuf and frees + it after output */ + pbuf_ref(p); + + LWIP::Interface *mbed_if = static_cast(netif->state); +- bool ret = mbed_if->emac->link_out(p); +- return ret ? ERR_OK : ERR_IF; ++ ++ if(mbed_if->emac->is_ready_to_tx()) { ++ ret = mbed_if->emac->link_out(p); ++ } ++ else { ++ mbed_if->emac->restart(); ++ ret = mbed_if->emac->link_out(p); ++ } ++ ++ err_t rv = ret ? ERR_OK : ERR_IF; ++ return rv; + } + + void LWIP::Interface::emac_input(emac_mem_buf_t *buf) +diff --git a/connectivity/netsocket/include/netsocket/EMAC.h b/connectivity/netsocket/include/netsocket/EMAC.h +index 515629b5a6..885bc92c01 100644 +--- a/connectivity/netsocket/include/netsocket/EMAC.h ++++ b/connectivity/netsocket/include/netsocket/EMAC.h +@@ -176,6 +176,17 @@ public: + * @param mem_mngr Pointer to memory manager + */ + virtual void set_memory_manager(EMACMemoryManager &mem_mngr) = 0; ++ ++ virtual bool is_ready_to_tx() { ++ return true; ++ } ++ ++ virtual void restart() { ++ } ++ ++ virtual int get_interface_status() { ++ return -1; ++ } + }; + + +diff --git a/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/STM32H7xx_HAL_Driver/stm32h7xx_hal_eth.c b/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/STM32H7xx_HAL_Driver/stm32h7xx_hal_eth.c +index decff79455..df797092fc 100644 +--- a/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/STM32H7xx_HAL_Driver/stm32h7xx_hal_eth.c ++++ b/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/STM32H7xx_HAL_Driver/stm32h7xx_hal_eth.c +@@ -2341,13 +2341,7 @@ HAL_StatusTypeDef HAL_ETH_SetWakeUpFilter(ETH_HandleTypeDef *heth, uint32_t *pFi + */ + HAL_ETH_StateTypeDef HAL_ETH_GetState(ETH_HandleTypeDef *heth) + { +- HAL_ETH_StateTypeDef ret; +- HAL_ETH_StateTypeDef gstate = heth->gState; +- HAL_ETH_StateTypeDef rxstate =heth->RxState; +- +- ret = gstate; +- ret |= rxstate; +- return ret; ++ return heth->gState; + } + + /** +-- +2.45.2 + diff --git a/patches/0235-RP2040-add-second_stage_ota-section-to-linker-script.patch b/patches/0235-RP2040-add-second_stage_ota-section-to-linker-script.patch new file mode 100644 index 000000000..875ba721b --- /dev/null +++ b/patches/0235-RP2040-add-second_stage_ota-section-to-linker-script.patch @@ -0,0 +1,28 @@ +From 9819fef4bdb417e3ff9aee08266264b6ec23e075 Mon Sep 17 00:00:00 2001 +From: pennam +Date: Wed, 11 Sep 2024 12:24:01 +0200 +Subject: [PATCH 235/236] RP2040: add second_stage_ota section to linker script + + - This was previously done inside mbed-os-to-arduino script +--- + .../TARGET_RP2040/TOOLCHAIN_GCC_ARM/memmap_default.ld | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/TOOLCHAIN_GCC_ARM/memmap_default.ld b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/TOOLCHAIN_GCC_ARM/memmap_default.ld +index ec8bac7e40..8295f3269d 100644 +--- a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/TOOLCHAIN_GCC_ARM/memmap_default.ld ++++ b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/TOOLCHAIN_GCC_ARM/memmap_default.ld +@@ -54,6 +54,10 @@ SECTIONS + __flash_binary_start = .; + } > FLASH + ++ .second_stage_ota : { ++ KEEP (*(.second_stage_ota)) ++ } > FLASH ++ + .boot2 : { + __boot2_start__ = .; + KEEP (*(.boot2)) +-- +2.45.2 + diff --git a/patches/0236-RP2040-add-simbols-to-linker-script-to-compute-.unin.patch b/patches/0236-RP2040-add-simbols-to-linker-script-to-compute-.unin.patch new file mode 100644 index 000000000..df9c8a642 --- /dev/null +++ b/patches/0236-RP2040-add-simbols-to-linker-script-to-compute-.unin.patch @@ -0,0 +1,27 @@ +From 35b0d95199cb5b9cda593ce4b4029c4306906ccd Mon Sep 17 00:00:00 2001 +From: pennam +Date: Wed, 11 Sep 2024 12:27:03 +0200 +Subject: [PATCH 236/236] RP2040: add simbols to linker script to compute + .uninitialized_data section size + +--- + .../TARGET_RP2040/TOOLCHAIN_GCC_ARM/memmap_default.ld | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/TOOLCHAIN_GCC_ARM/memmap_default.ld b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/TOOLCHAIN_GCC_ARM/memmap_default.ld +index 8295f3269d..b748bab5fa 100644 +--- a/targets/TARGET_RASPBERRYPI/TARGET_RP2040/TOOLCHAIN_GCC_ARM/memmap_default.ld ++++ b/targets/TARGET_RASPBERRYPI/TARGET_RP2040/TOOLCHAIN_GCC_ARM/memmap_default.ld +@@ -183,7 +183,9 @@ SECTIONS + + .uninitialized_data (COPY): { + . = ALIGN(4); ++ __uninitialized_data_start__ = .; + *(.uninitialized_data*) ++ __uninitialized_data_end__ = .; + } > RAM + + /* Start and end symbols must be word-aligned */ +-- +2.45.2 + diff --git a/patches/0237-Watchdog-kick-only-if-watchdog-is-running.patch b/patches/0237-Watchdog-kick-only-if-watchdog-is-running.patch new file mode 100644 index 000000000..32071746a --- /dev/null +++ b/patches/0237-Watchdog-kick-only-if-watchdog-is-running.patch @@ -0,0 +1,31 @@ +From 81a7d47a15e76701b206bce907526b9d9d5888cc Mon Sep 17 00:00:00 2001 +From: pennam +Date: Wed, 2 Oct 2024 11:31:36 +0200 +Subject: [PATCH] Watchdog: kick only if watchdog is running + +--- + drivers/source/Watchdog.cpp | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/source/Watchdog.cpp b/drivers/source/Watchdog.cpp +index 3f21b94dfb..daca018148 100644 +--- a/drivers/source/Watchdog.cpp ++++ b/drivers/source/Watchdog.cpp +@@ -72,9 +72,11 @@ bool Watchdog::stop() + + void Watchdog::kick() + { +- core_util_critical_section_enter(); +- hal_watchdog_kick(); +- core_util_critical_section_exit(); ++ if (_running) { ++ core_util_critical_section_enter(); ++ hal_watchdog_kick(); ++ core_util_critical_section_exit(); ++ } + } + + bool Watchdog::is_running() const +-- +2.45.2 + diff --git a/patches/0238-WHD-reduce-the-number-of-join-retry.patch b/patches/0238-WHD-reduce-the-number-of-join-retry.patch new file mode 100644 index 000000000..ac90a76e7 --- /dev/null +++ b/patches/0238-WHD-reduce-the-number-of-join-retry.patch @@ -0,0 +1,25 @@ +From 42b018c12eb413383c6ae4f2432be9f0c2d9dbe9 Mon Sep 17 00:00:00 2001 +From: pennam +Date: Mon, 17 Jun 2024 17:11:58 +0200 +Subject: [PATCH] WHD: reduce the number of join retry + +--- + .../drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp b/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp +index 509a2c0981..c933203d36 100644 +--- a/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp ++++ b/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp +@@ -260,7 +260,7 @@ nsapi_error_t WhdSTAInterface::connect() + { + ScopedMutexLock lock(_iface_shared.mutex); + +-#define MAX_RETRY_COUNT ( 5 ) ++#define MAX_RETRY_COUNT ( 1 ) + int i; + whd_result_t res; + +-- +2.43.0 + diff --git a/patches/0239-WHD-add-join-timeout-parameter-to-WiFiSTAInterface-a.patch b/patches/0239-WHD-add-join-timeout-parameter-to-WiFiSTAInterface-a.patch new file mode 100644 index 000000000..9c5b688a2 --- /dev/null +++ b/patches/0239-WHD-add-join-timeout-parameter-to-WiFiSTAInterface-a.patch @@ -0,0 +1,152 @@ +From efd54c8990ba5b437eb4eb8b786b7e48941b03f1 Mon Sep 17 00:00:00 2001 +From: pennam +Date: Mon, 21 Oct 2024 11:27:36 +0200 +Subject: [PATCH] WHD: add join timeout parameter to WiFiSTAInterface and + drivers + +--- + .../emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp | 7 ++++--- + .../emac/COMPONENT_WHD/interface/WhdSTAInterface.h | 6 ++++++ + .../COMPONENT_WHD/wifi-host-driver/inc/whd_wifi_api.h | 2 +- + .../COMPONENT_WHD/wifi-host-driver/src/whd_wifi_api.c | 9 ++++++--- + connectivity/netsocket/include/netsocket/WiFiInterface.h | 7 +++++++ + 5 files changed, 24 insertions(+), 7 deletions(-) + +diff --git a/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp b/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp +index c933203d36..f7631a0583 100644 +--- a/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp ++++ b/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp +@@ -211,7 +211,8 @@ WhdSTAInterface::WhdSTAInterface(WHD_EMAC &emac, OnboardNetworkStack &stack, Olm + _security(NSAPI_SECURITY_NONE), + _whd_emac(emac), + _olm(&olm), +- _iface_shared(shared) ++ _iface_shared(shared), ++ _timeout(7000) + { + } + +@@ -334,7 +335,7 @@ nsapi_error_t WhdSTAInterface::connect() + res = (whd_result_t)whd_wifi_join(_whd_emac.ifp, + &ssid, + security, +- (const uint8_t *)_pass, strlen(_pass)); ++ (const uint8_t *)_pass, strlen(_pass), _timeout); + } + else + { +@@ -345,7 +346,7 @@ nsapi_error_t WhdSTAInterface::connect() + res = (whd_result_t)whd_wifi_join(_whd_emac.ifp, + &ssid, + security, +- (const uint8_t *)_pass, key_length); ++ (const uint8_t *)_pass, key_length, _timeout); + } + if (res == WHD_SUCCESS) { + break; +diff --git a/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.h b/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.h +index 4dd1098947..bfe933bac7 100644 +--- a/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.h ++++ b/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.h +@@ -119,6 +119,11 @@ public: + return 0; + } + ++ nsapi_error_t set_timeout(uint32_t timeout) ++ { ++ _timeout = timeout; ++ } ++ + /** Set blocking status of interface. + * Nonblocking mode unsupported. + * +@@ -257,6 +262,7 @@ private: + nsapi_security_t _security; + WHD_EMAC &_whd_emac; + OlmInterface *_olm; ++ uint32_t _timeout; + whd_interface_shared_info_t &_iface_shared; + }; + +diff --git a/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_wifi_api.h b/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_wifi_api.h +index f3b73214cb..291bd23de8 100755 +--- a/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_wifi_api.h ++++ b/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_wifi_api.h +@@ -281,7 +281,7 @@ extern uint32_t whd_wifi_stop_scan(whd_interface_t ifp); + * Error code if an error occurred + */ + extern uint32_t whd_wifi_join(whd_interface_t ifp, const whd_ssid_t *ssid, whd_security_t auth_type, +- const uint8_t *security_key, uint8_t key_length); ++ const uint8_t *security_key, uint8_t key_length, uint32_t timeout); + + /** Joins a specific Wi-Fi network + * +diff --git a/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src/whd_wifi_api.c b/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src/whd_wifi_api.c +index 5294104ab4..8a8f411ef9 100755 +--- a/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src/whd_wifi_api.c ++++ b/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src/whd_wifi_api.c +@@ -294,6 +294,8 @@ static const uint16_t mcs_data_rate_lookup_table[32][2][2] = + }, + }; + ++static whd_wifi_join_timeout = DEFAULT_JOIN_ATTEMPT_TIMEOUT; ++ + + /****************************************************** + * Static Function prototypes +@@ -1334,7 +1336,7 @@ static uint32_t whd_wifi_join_wait_for_complete(whd_interface_t ifp, cy_semaphor + + while (!done) + { +- result = cy_rtos_get_semaphore(semaphore, DEFAULT_JOIN_ATTEMPT_TIMEOUT / 10, WHD_FALSE); ++ result = cy_rtos_get_semaphore(semaphore, whd_wifi_join_timeout / 10, WHD_FALSE); + whd_assert("Get semaphore failed", (result == CY_RSLT_SUCCESS) || (result == CY_RTOS_TIMEOUT) ); + REFERENCE_DEBUG_ONLY_VARIABLE(result); + +@@ -1345,7 +1347,7 @@ static uint32_t whd_wifi_join_wait_for_complete(whd_interface_t ifp, cy_semaphor + } + + cy_rtos_get_time(¤t_time); +- done = (whd_bool_t)( (current_time - start_time) >= DEFAULT_JOIN_ATTEMPT_TIMEOUT ); ++ done = (whd_bool_t)( (current_time - start_time) >= whd_wifi_join_timeout ); + } + + if (result != WHD_SUCCESS) +@@ -1574,7 +1576,7 @@ uint32_t whd_wifi_join_specific(whd_interface_t ifp, const whd_scan_result_t *ap + } + + uint32_t whd_wifi_join(whd_interface_t ifp, const whd_ssid_t *ssid, whd_security_t auth_type, +- const uint8_t *security_key, uint8_t key_length) ++ const uint8_t *security_key, uint8_t key_length, uint32_t timeout) + { + cy_semaphore_t join_sema; + whd_result_t result; +@@ -1616,6 +1618,7 @@ uint32_t whd_wifi_join(whd_interface_t ifp, const whd_ssid_t *ssid, whd_security + ssid_params->SSID_len = htod32(ssid->length); + memcpy(ssid_params->SSID, ssid->value, ssid_params->SSID_len); + result = whd_cdc_send_ioctl(ifp, CDC_SET, WLC_SET_SSID, buffer, 0); ++ whd_wifi_join_timeout = timeout; + + if (result == WHD_SUCCESS) + { +diff --git a/connectivity/netsocket/include/netsocket/WiFiInterface.h b/connectivity/netsocket/include/netsocket/WiFiInterface.h +index 4fd7fc6fb8..c13cab4312 100644 +--- a/connectivity/netsocket/include/netsocket/WiFiInterface.h ++++ b/connectivity/netsocket/include/netsocket/WiFiInterface.h +@@ -59,6 +59,13 @@ public: + */ + virtual nsapi_error_t set_channel(uint8_t channel) = 0; + ++ /** Set the Wi-Fi network join timeout. ++ * ++ * @param timeout joint timeout in milliseconds (Default: 7000). ++ * @return NSAPI_ERROR_OK on success, or error code on failure. ++ */ ++ virtual nsapi_error_t set_timeout(uint32_t timeout) = 0; ++ + /** Get the current radio signal strength for active connection. + * + * @return Connection strength in dBm (negative value), +-- +2.45.2 + diff --git a/patches/0240-TLSSocketWrapper-add-read-write-event-flags.patch b/patches/0240-TLSSocketWrapper-add-read-write-event-flags.patch new file mode 100644 index 000000000..bcdc702ce --- /dev/null +++ b/patches/0240-TLSSocketWrapper-add-read-write-event-flags.patch @@ -0,0 +1,69 @@ +From 4369443525c662ddb2ecb15dd9cdba0098e1f01d Mon Sep 17 00:00:00 2001 +From: pennam +Date: Mon, 28 Oct 2024 09:56:31 +0100 +Subject: [PATCH] TLSSocketWrapper: add read/write event flags + + This allows to properly handle timeouts during read write operations +--- + .../netsocket/include/netsocket/TLSSocketWrapper.h | 4 ++++ + connectivity/netsocket/source/TLSSocketWrapper.cpp | 8 ++++---- + 2 files changed, 8 insertions(+), 4 deletions(-) + +diff --git a/connectivity/netsocket/include/netsocket/TLSSocketWrapper.h b/connectivity/netsocket/include/netsocket/TLSSocketWrapper.h +index 2dc3b4b000..79fe5c564d 100644 +--- a/connectivity/netsocket/include/netsocket/TLSSocketWrapper.h ++++ b/connectivity/netsocket/include/netsocket/TLSSocketWrapper.h +@@ -379,6 +379,10 @@ private: + Socket *_transport; + int _timeout = -1; + ++ // Event flags ++ static const int READ_FLAG = 0x1u; ++ static const int WRITE_FLAG = 0x2u; ++ + #ifdef MBEDTLS_X509_CRT_PARSE_C + mbedtls_x509_crt *_cacert = nullptr; + mbedtls_x509_crt *_clicert = nullptr; +diff --git a/connectivity/netsocket/source/TLSSocketWrapper.cpp b/connectivity/netsocket/source/TLSSocketWrapper.cpp +index c020cd9f59..3a66be2e5e 100644 +--- a/connectivity/netsocket/source/TLSSocketWrapper.cpp ++++ b/connectivity/netsocket/source/TLSSocketWrapper.cpp +@@ -381,7 +381,7 @@ nsapi_error_t TLSSocketWrapper::continue_handshake() + ret = mbedtls_ssl_handshake(&_ssl); + if (_timeout && (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE)) { + uint32_t flag; +- flag = _event_flag.wait_any(1, _timeout); ++ flag = _event_flag.wait_any(WRITE_FLAG | READ_FLAG, _timeout); + if (flag & osFlagsError) { + break; + } +@@ -461,7 +461,7 @@ nsapi_error_t TLSSocketWrapper::send(const void *data, nsapi_size_t size) + break; + } else if (ret == MBEDTLS_ERR_SSL_WANT_WRITE || ret == MBEDTLS_ERR_SSL_WANT_READ) { + uint32_t flag; +- flag = _event_flag.wait_any(1, _timeout); ++ flag = _event_flag.wait_any(WRITE_FLAG, _timeout); + if (flag & osFlagsError) { + // Timeout break + break; +@@ -522,7 +522,7 @@ nsapi_size_or_error_t TLSSocketWrapper::recv(void *data, nsapi_size_t size) + break; + } else if (ret == MBEDTLS_ERR_SSL_WANT_WRITE || ret == MBEDTLS_ERR_SSL_WANT_READ) { + uint32_t flag; +- flag = _event_flag.wait_any(1, _timeout); ++ flag = _event_flag.wait_any(READ_FLAG, _timeout); + if (flag & osFlagsError) { + // Timeout break + break; +@@ -855,7 +855,7 @@ nsapi_error_t TLSSocketWrapper::listen(int) + + void TLSSocketWrapper::event() + { +- _event_flag.set(1); ++ _event_flag.set(READ_FLAG | WRITE_FLAG); + if (_sigio) { + _sigio(); + } +-- +2.45.2 + diff --git a/patches/0241-Add-methods-for-setting-hostname.patch b/patches/0241-Add-methods-for-setting-hostname.patch new file mode 100644 index 000000000..21c301771 --- /dev/null +++ b/patches/0241-Add-methods-for-setting-hostname.patch @@ -0,0 +1,196 @@ +From 75b34cc20a33c05cbc01b3fbdabbfc40ae034bef Mon Sep 17 00:00:00 2001 +From: Guilherme Ricioli +Date: Mon, 15 Apr 2024 17:40:59 -0300 +Subject: [PATCH] Add methods for setting hostname + +In the same way it is done for setting MAC address, add methods for +setting hostname. The underlying network stack can then request this +to the local DNS through DHCP. +--- + .../include/netsocket/EMACInterface.h | 8 ++++++ + .../include/netsocket/NetworkInterface.h | 16 ++++++++++++ + .../netsocket/include/netsocket/nsapi_types.h | 10 +++++++ + .../netsocket/source/EMACInterface.cpp | 26 +++++++++++++++++++ + .../netsocket/source/NetworkInterface.cpp | 10 +++++++ + .../doubles/NetworkInterface_stub.cpp | 10 +++++++ + .../test_NetworkInterface.cpp | 11 ++++++++ + 7 files changed, 91 insertions(+) + +diff --git a/connectivity/netsocket/include/netsocket/EMACInterface.h b/connectivity/netsocket/include/netsocket/EMACInterface.h +index 8cf47cb703..c06aeb850e 100644 +--- a/connectivity/netsocket/include/netsocket/EMACInterface.h ++++ b/connectivity/netsocket/include/netsocket/EMACInterface.h +@@ -83,6 +83,12 @@ public: + /** @copydoc NetworkInterface::disconnect */ + nsapi_error_t disconnect() override; + ++ /** @copydoc NetworkInterface::get_hostname */ ++ const char *get_hostname() override; ++ ++ /** @copydoc NetworkInterface::set_hostname */ ++ nsapi_error_t set_hostname(const char *hostname) override; ++ + /** @copydoc NetworkInterface::get_mac_address */ + const char *get_mac_address() override; + +@@ -146,6 +152,8 @@ protected: + OnboardNetworkStack::Interface *_interface = nullptr; + bool _dhcp = true; + bool _blocking = true; ++ bool _hostname_set = false; ++ char _hostname[NSAPI_HOSTNAME_SIZE]; + bool _hw_mac_addr_set = false; + char _mac_address[NSAPI_MAC_SIZE]; + char _ip_address[NSAPI_IPv6_SIZE] {}; +diff --git a/connectivity/netsocket/include/netsocket/NetworkInterface.h b/connectivity/netsocket/include/netsocket/NetworkInterface.h +index 9071a1e40b..81f6011950 100644 +--- a/connectivity/netsocket/include/netsocket/NetworkInterface.h ++++ b/connectivity/netsocket/include/netsocket/NetworkInterface.h +@@ -90,6 +90,22 @@ public: + */ + virtual void set_as_default(); + ++ /** Get hostname. ++ * ++ * @return Hostname if configured, null otherwise ++ */ ++ virtual const char *get_hostname(); ++ ++ /** Set hostname. ++ * ++ * @param hostname Hostname string ++ * @retval NSAPI_ERROR_OK on success ++ * @retval NSAPI_ERROR_UNSUPPORTED if this feature is not supported ++ * @retval NSAPI_ERROR_PARAMETER if hostname is not valid ++ * @retval NSAPI_ERROR_BUSY if hostname couldn't be set ++ */ ++ virtual nsapi_error_t set_hostname(const char *hostname); ++ + /** Get the local MAC address. + * + * Provided MAC address is intended for info or debug purposes and +diff --git a/connectivity/netsocket/include/netsocket/nsapi_types.h b/connectivity/netsocket/include/netsocket/nsapi_types.h +index 3b496d5087..28dbcc9a38 100644 +--- a/connectivity/netsocket/include/netsocket/nsapi_types.h ++++ b/connectivity/netsocket/include/netsocket/nsapi_types.h +@@ -196,6 +196,16 @@ typedef enum nsapi_security { + */ + #define NSAPI_IP_BYTES NSAPI_IPv6_BYTES + ++/** Maximum size of hostname ++ * ++ * According to RFC 1034 [1], Section 3.1 "Name space specifications and ++ * terminology", 63 is the maximum size of a hostname. +1 for the string ++ * terminator. ++ * ++ * [1] https://www.rfc-editor.org/rfc/rfc1034 ++ */ ++#define NSAPI_HOSTNAME_SIZE 64 ++ + /** Maximum size of MAC address representation + */ + #define NSAPI_MAC_SIZE 18 +diff --git a/connectivity/netsocket/source/EMACInterface.cpp b/connectivity/netsocket/source/EMACInterface.cpp +index f48bc0a185..de8d9753d7 100644 +--- a/connectivity/netsocket/source/EMACInterface.cpp ++++ b/connectivity/netsocket/source/EMACInterface.cpp +@@ -88,6 +88,32 @@ nsapi_error_t EMACInterface::disconnect() + return NSAPI_ERROR_NO_CONNECTION; + } + ++const char *EMACInterface::get_hostname() ++{ ++ if (_hostname_set) { ++ return _hostname; ++ } ++ return nullptr; ++} ++ ++nsapi_error_t EMACInterface::set_hostname(const char *hostname) ++{ ++ if (!hostname || strlen(hostname) > NSAPI_HOSTNAME_SIZE - 1) { ++ return NSAPI_ERROR_PARAMETER; ++ } ++ ++ if (_interface) { ++ // can't set hostname once initialized ++ return NSAPI_ERROR_BUSY; ++ } ++ ++ memset(_hostname, 0, NSAPI_HOSTNAME_SIZE); ++ strncpy(_hostname, hostname, NSAPI_HOSTNAME_SIZE - 1); ++ _hostname_set = true; ++ ++ return NSAPI_ERROR_OK; ++} ++ + const char *EMACInterface::get_mac_address() + { + if (_interface && _interface->get_mac_address(_mac_address, sizeof(_mac_address))) { +diff --git a/connectivity/netsocket/source/NetworkInterface.cpp b/connectivity/netsocket/source/NetworkInterface.cpp +index 0f237f0e19..649df0f9b3 100644 +--- a/connectivity/netsocket/source/NetworkInterface.cpp ++++ b/connectivity/netsocket/source/NetworkInterface.cpp +@@ -29,6 +29,16 @@ void NetworkInterface::set_as_default() + + } + ++const char *NetworkInterface::get_hostname() ++{ ++ return 0; ++} ++ ++nsapi_error_t NetworkInterface::set_hostname(const char *hostname) ++{ ++ return NSAPI_ERROR_UNSUPPORTED; ++} ++ + const char *NetworkInterface::get_mac_address() + { + return 0; +diff --git a/connectivity/netsocket/tests/UNITTESTS/doubles/NetworkInterface_stub.cpp b/connectivity/netsocket/tests/UNITTESTS/doubles/NetworkInterface_stub.cpp +index 020a551ba9..c849704a35 100644 +--- a/connectivity/netsocket/tests/UNITTESTS/doubles/NetworkInterface_stub.cpp ++++ b/connectivity/netsocket/tests/UNITTESTS/doubles/NetworkInterface_stub.cpp +@@ -21,6 +21,16 @@ + + + // Default network-interface state ++const char *NetworkInterface::get_hostname() ++{ ++ return 0; ++} ++ ++nsapi_error_t NetworkInterface::set_hostname(const char *hostname) ++{ ++ return NSAPI_ERROR_UNSUPPORTED; ++} ++ + const char *NetworkInterface::get_mac_address() + { + return 0; +diff --git a/connectivity/netsocket/tests/UNITTESTS/netsocket/NetworkInterface/test_NetworkInterface.cpp b/connectivity/netsocket/tests/UNITTESTS/netsocket/NetworkInterface/test_NetworkInterface.cpp +index 1a928c36ee..27433ffaa1 100644 +--- a/connectivity/netsocket/tests/UNITTESTS/netsocket/NetworkInterface/test_NetworkInterface.cpp ++++ b/connectivity/netsocket/tests/UNITTESTS/netsocket/NetworkInterface/test_NetworkInterface.cpp +@@ -68,6 +68,17 @@ TEST_F(TestNetworkInterface, constructor) + } + + // get_default_instance is tested along with the implementations of NetworkInterface. ++TEST_F(TestNetworkInterface, get_hostname) ++{ ++ char *n = 0; ++ EXPECT_EQ(iface->get_hostname(), n); ++} ++ ++TEST_F(TestNetworkInterface, set_hostname) ++{ ++ char *hostname; ++ EXPECT_EQ(iface->set_hostname(hostname), NSAPI_ERROR_UNSUPPORTED); ++} + + TEST_F(TestNetworkInterface, get_mac_address) + { +-- +2.45.2 + diff --git a/patches/0242-Request-hostname-through-DHCP.patch b/patches/0242-Request-hostname-through-DHCP.patch new file mode 100644 index 000000000..e2a383900 --- /dev/null +++ b/patches/0242-Request-hostname-through-DHCP.patch @@ -0,0 +1,53 @@ +From 091ea74d6956d6684bcd88ed842a73218a7b8bd3 Mon Sep 17 00:00:00 2001 +From: Guilherme Ricioli +Date: Tue, 16 Apr 2024 10:50:48 -0300 +Subject: [PATCH] Request hostname through DHCP + +If hostname is provided, request it to local DNS through DHCP. +--- + connectivity/lwipstack/source/LWIPInterface.cpp | 6 ++++++ + connectivity/netsocket/include/netsocket/NetworkInterface.h | 4 +++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/connectivity/lwipstack/source/LWIPInterface.cpp b/connectivity/lwipstack/source/LWIPInterface.cpp +index dfefebcb8b..64869a3538 100644 +--- a/connectivity/lwipstack/source/LWIPInterface.cpp ++++ b/connectivity/lwipstack/source/LWIPInterface.cpp +@@ -437,6 +437,7 @@ LWIP::Interface::Interface() : + nsapi_error_t LWIP::add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out, NetworkInterface *user_network_interface) + { + #if LWIP_ETHERNET ++ const char *hostname; + Interface *interface = new (std::nothrow) Interface(); + if (!interface) { + return NSAPI_ERROR_NO_MEMORY; +@@ -445,6 +446,11 @@ nsapi_error_t LWIP::add_ethernet_interface(EMAC &emac, bool default_if, OnboardN + interface->memory_manager = &memory_manager; + interface->ppp_enabled = false; + ++ hostname = user_network_interface->get_hostname(); ++ if (hostname) { ++ netif_set_hostname(&interface->netif, hostname); ++ } ++ + #if (MBED_MAC_ADDRESS_SUM != MBED_MAC_ADDR_INTERFACE) + netif->interface.hwaddr[0] = MBED_MAC_ADDR_0; + netif->interface.hwaddr[1] = MBED_MAC_ADDR_1; +diff --git a/connectivity/netsocket/include/netsocket/NetworkInterface.h b/connectivity/netsocket/include/netsocket/NetworkInterface.h +index 81f6011950..22355767ce 100644 +--- a/connectivity/netsocket/include/netsocket/NetworkInterface.h ++++ b/connectivity/netsocket/include/netsocket/NetworkInterface.h +@@ -102,7 +102,9 @@ public: + * @retval NSAPI_ERROR_OK on success + * @retval NSAPI_ERROR_UNSUPPORTED if this feature is not supported + * @retval NSAPI_ERROR_PARAMETER if hostname is not valid +- * @retval NSAPI_ERROR_BUSY if hostname couldn't be set ++ * @retval NSAPI_ERROR_BUSY if hostname couldn't be set (e.g. for ++ * LwIP stack, hostname can only be set before calling ++ * \c EthernetInterface::connect method) + */ + virtual nsapi_error_t set_hostname(const char *hostname); + +-- +2.45.2 + diff --git a/patches/0243-WhdSTA-allow-hostname-configuration.patch b/patches/0243-WhdSTA-allow-hostname-configuration.patch new file mode 100644 index 000000000..9fea05c90 --- /dev/null +++ b/patches/0243-WhdSTA-allow-hostname-configuration.patch @@ -0,0 +1,25 @@ +From b6c62d169e750de6e5af3a47bc6c0c2a1fc81c88 Mon Sep 17 00:00:00 2001 +From: pennam +Date: Thu, 3 Oct 2024 18:05:26 +0200 +Subject: [PATCH] WhdSTA allow hostname configuration + +--- + .../drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp b/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp +index 509a2c0981..ba1fa7900a 100644 +--- a/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp ++++ b/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.cpp +@@ -280,7 +280,7 @@ nsapi_error_t WhdSTAInterface::connect() + _iface_shared.if_status_flags |= IF_STATUS_STA_UP; + _iface_shared.default_if_cfg = DEFAULT_IF_STA; + if (!_interface) { +- nsapi_error_t err = _stack.add_ethernet_interface(_emac, true, &_interface); ++ nsapi_error_t err = _stack.add_ethernet_interface(_emac, true, &_interface, this); + if (err != NSAPI_ERROR_OK) { + _interface = NULL; + return err; +-- +2.45.2 + diff --git a/patches/0244-Add-user-network-interface-check-before-reading-host.patch b/patches/0244-Add-user-network-interface-check-before-reading-host.patch new file mode 100644 index 000000000..52d3e79b9 --- /dev/null +++ b/patches/0244-Add-user-network-interface-check-before-reading-host.patch @@ -0,0 +1,31 @@ +From 4292f8b7c4aa38b68d22c413f91bdc95192cfad6 Mon Sep 17 00:00:00 2001 +From: pennam +Date: Tue, 29 Oct 2024 11:30:00 +0100 +Subject: [PATCH] Add user network interface check before reading hostname + +--- + connectivity/lwipstack/source/LWIPInterface.cpp | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/connectivity/lwipstack/source/LWIPInterface.cpp b/connectivity/lwipstack/source/LWIPInterface.cpp +index 64869a3538..da964543c7 100644 +--- a/connectivity/lwipstack/source/LWIPInterface.cpp ++++ b/connectivity/lwipstack/source/LWIPInterface.cpp +@@ -446,9 +446,11 @@ nsapi_error_t LWIP::add_ethernet_interface(EMAC &emac, bool default_if, OnboardN + interface->memory_manager = &memory_manager; + interface->ppp_enabled = false; + +- hostname = user_network_interface->get_hostname(); +- if (hostname) { +- netif_set_hostname(&interface->netif, hostname); ++ if (user_network_interface) { ++ hostname = user_network_interface->get_hostname(); ++ if (hostname) { ++ netif_set_hostname(&interface->netif, hostname); ++ } + } + + #if (MBED_MAC_ADDRESS_SUM != MBED_MAC_ADDR_INTERFACE) +-- +2.45.2 + diff --git a/patches/0245-WHD-fix-WhdSTAInterface-add-return-value-to-set_time.patch b/patches/0245-WHD-fix-WhdSTAInterface-add-return-value-to-set_time.patch new file mode 100644 index 000000000..b96a94888 --- /dev/null +++ b/patches/0245-WHD-fix-WhdSTAInterface-add-return-value-to-set_time.patch @@ -0,0 +1,24 @@ +From 310f0dd40c5b070ea2077c8a580f777a5cf17951 Mon Sep 17 00:00:00 2001 +From: pennam +Date: Tue, 7 Jan 2025 09:47:09 +0100 +Subject: [PATCH] WHD: fix WhdSTAInterface, add return value to set_timeout + +--- + .../drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.h b/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.h +index bfe933bac7..8d8f540759 100644 +--- a/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.h ++++ b/connectivity/drivers/emac/COMPONENT_WHD/interface/WhdSTAInterface.h +@@ -122,6 +122,7 @@ public: + nsapi_error_t set_timeout(uint32_t timeout) + { + _timeout = timeout; ++ return NSAPI_ERROR_OK; + } + + /** Set blocking status of interface. +-- +2.45.2 + diff --git a/patches/0246-WHD-remove-v-from-WHD_VERSION-define.patch b/patches/0246-WHD-remove-v-from-WHD_VERSION-define.patch new file mode 100644 index 000000000..8d0289263 --- /dev/null +++ b/patches/0246-WHD-remove-v-from-WHD_VERSION-define.patch @@ -0,0 +1,25 @@ +From fa1e9697ca3b74489bd2eb08ab9ab1ffeee2a298 Mon Sep 17 00:00:00 2001 +From: pennam +Date: Fri, 31 Jan 2025 16:34:05 +0100 +Subject: [PATCH 246/247] WHD: remove v from WHD_VERSION define + +--- + .../wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_version.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_version.h b/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_version.h +index 1caef23b67..5f69d8c3e0 100755 +--- a/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_version.h ++++ b/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc/whd_version.h +@@ -15,6 +15,7 @@ + * limitations under the License. + */ + +-#define WHD_VERSION "v1.94.0" ++/* This define is used by arduino::WiFiClass::firmwareVersion() do not prepend v */ ++#define WHD_VERSION "1.94.0" + #define WHD_BRANCH "v1.94.0" + #define WHD_DATE "2021-04-27 16:54:34 +0800" +-- +2.47.2 + diff --git a/patches/0247-ICMPSocket-add-ping.patch b/patches/0247-ICMPSocket-add-ping.patch new file mode 100644 index 000000000..2019bcb0c --- /dev/null +++ b/patches/0247-ICMPSocket-add-ping.patch @@ -0,0 +1,106 @@ +From 933694e0f35451d21eed77a93fa346570de20878 Mon Sep 17 00:00:00 2001 +From: pennam +Date: Tue, 4 Feb 2025 14:31:59 +0100 +Subject: [PATCH] ICMPSocket: add ping + +--- + .../netsocket/include/netsocket/ICMPSocket.h | 4 ++ + connectivity/netsocket/source/ICMPSocket.cpp | 61 +++++++++++++++++++ + 2 files changed, 65 insertions(+) + +diff --git a/connectivity/netsocket/include/netsocket/ICMPSocket.h b/connectivity/netsocket/include/netsocket/ICMPSocket.h +index 1837bc8e09..5e1ee8fb03 100644 +--- a/connectivity/netsocket/include/netsocket/ICMPSocket.h ++++ b/connectivity/netsocket/include/netsocket/ICMPSocket.h +@@ -37,6 +37,10 @@ public: + */ + ICMPSocket(); + ++#if MBED_CONF_LWIP_RAW_SOCKET_ENABLED ++ int ping(SocketAddress &socketAddress, uint32_t timeout); ++#endif ++ + #if !defined(DOXYGEN_ONLY) + + protected: +diff --git a/connectivity/netsocket/source/ICMPSocket.cpp b/connectivity/netsocket/source/ICMPSocket.cpp +index f6c9b98de1..d8ea954835 100644 +--- a/connectivity/netsocket/source/ICMPSocket.cpp ++++ b/connectivity/netsocket/source/ICMPSocket.cpp +@@ -16,12 +16,73 @@ + */ + + #include "ICMPSocket.h" ++#if MBED_CONF_LWIP_RAW_SOCKET_ENABLED ++#include "drivers/Timer.h" ++#include "lwip/prot/icmp.h" ++#include "lwip/inet_chksum.h" ++#include "lwip/prot/ip4.h" ++#endif + + ICMPSocket::ICMPSocket() + { + _socket_stats.stats_update_proto(this, NSAPI_ICMP); + } + ++#if MBED_CONF_LWIP_RAW_SOCKET_ENABLED ++int ICMPSocket::ping(SocketAddress &socketAddress, uint32_t timeout) ++{ ++ struct __attribute__((__packed__)) { ++ struct icmp_echo_hdr header; ++ uint8_t data[32]; ++ } request; ++ ++ ICMPH_TYPE_SET(&request.header, ICMP_ECHO); ++ ICMPH_CODE_SET(&request.header, 0); ++ request.header.chksum = 0; ++ request.header.id = 0xAFAF; ++ request.header.seqno = random(); ++ ++ for (size_t i = 0; i < sizeof(request.data); i++) { ++ request.data[i] = i; ++ } ++ ++ request.header.chksum = inet_chksum(&request, sizeof(request)); ++ ++ int res = sendto(socketAddress, &request, sizeof(request)); ++ if (res <= 0){ ++ return -1; ++ } ++ ++ mbed::Timer timer; ++ timer.start(); ++ int elapsed = -1; ++ do { ++ struct __attribute__((__packed__)) { ++ struct ip_hdr ipHeader; ++ struct icmp_echo_hdr header; ++ } response; ++ ++ int rxSize = recvfrom(&socketAddress, &response, sizeof(response)); ++ if (rxSize < 0) { ++ // time out ++ break; ++ } ++ ++ if (rxSize < sizeof(response)) { ++ // too short ++ continue; ++ } ++ ++ if ((response.header.id == request.header.id) && (response.header.seqno == request.header.seqno)) { ++ elapsed = std::chrono::duration_cast(timer.elapsed_time()).count(); ++ timer.stop(); ++ } ++ } while (elapsed == -1 && std::chrono::duration_cast(timer.elapsed_time()).count() < timeout); ++ ++ return elapsed; ++} ++#endif ++ + nsapi_protocol_t ICMPSocket::get_proto() + { + return NSAPI_ICMP; +-- +2.47.2 + diff --git a/platform.txt b/platform.txt index 0e7193624..3ace82eab 100644 --- a/platform.txt +++ b/platform.txt @@ -125,11 +125,11 @@ tools.openocd.cmd.windows=bin/openocd.exe tools.openocd.upload.params.verbose=-d2 tools.openocd.upload.params.quiet=-d0 -tools.openocd.upload.pattern="{path}/{cmd}" {upload.verbose} -s "{path}/share/openocd/scripts/" {bootloader.programmer} {upload.transport} {bootloader.config} -c "telnet_port disabled; init; reset init; halt; adapter speed 10000; program {{build.path}/{build.project_name}.elf}; reset run; shutdown" +tools.openocd.upload.pattern="{path}/{cmd}" {upload.verbose} -s "{path}/share/openocd/scripts/" -f interface/{programmer.protocol}.cfg -f {programmer.transport_script} {bootloader.config} -c "telnet_port disabled; init; reset init; halt; adapter speed 10000; program {{build.path}/{build.project_name}.elf}; reset run; shutdown" tools.openocd.program.params.verbose=-d2 tools.openocd.program.params.quiet=-d0 -tools.openocd.program.pattern="{path}/{cmd}" {program.verbose} -s "{path}/share/openocd/scripts/" {bootloader.programmer} {upload.transport} {bootloader.config} -c "telnet_port disabled; init; reset init; halt; adapter speed 10000; program {{build.path}/{build.project_name}.elf}; reset run; shutdown" +tools.openocd.program.pattern="{path}/{cmd}" {program.verbose} -s "{path}/share/openocd/scripts/" -f interface/{programmer.protocol}.cfg -f {programmer.transport_script} {bootloader.config} -c "telnet_port disabled; init; reset init; halt; adapter speed 10000; program {{build.path}/{build.project_name}.elf}; reset run; shutdown" tools.openocd.erase.params.verbose=-d2 tools.openocd.erase.params.quiet=-d0 @@ -137,7 +137,7 @@ tools.openocd.erase.pattern= tools.openocd.bootloader.params.verbose=-d2 tools.openocd.bootloader.params.quiet=-d0 -tools.openocd.bootloader.pattern="{path}/{cmd}" {bootloader.verbose} -s "{path}/share/openocd/scripts/" {bootloader.programmer} {upload.transport} {bootloader.config} -c "telnet_port disabled; init; reset init; halt; adapter speed 10000; {bootloader.extra_action.preflash}; program {{runtime.platform.path}/bootloaders/{bootloader.file}}; reset run; shutdown" +tools.openocd.bootloader.pattern="{path}/{cmd}" {bootloader.verbose} -s "{path}/share/openocd/scripts/" -f interface/{programmer.protocol}.cfg -f {programmer.transport_script} {bootloader.config} -c "telnet_port disabled; init; reset init; halt; adapter speed 10000; {bootloader.extra_action.preflash}; program {{runtime.platform.path}/bootloaders/{bootloader.file}}; reset run; shutdown" # # BOSSA diff --git a/post_install.sh b/post_install.sh index 336ffd4a6..66b668b1a 100755 --- a/post_install.sh +++ b/post_install.sh @@ -12,14 +12,31 @@ SUBSYSTEMS=="usb", ATTRS{idVendor}=="0525", MODE:="0666" EOF } -if [ "$EUID" -ne 0 ] - then echo "Please run as root" - exit -fi +OS="$(uname -s)" +case "$OS" in +Linux*) + if [ "$EUID" -ne 0 ]; then + if [ -e "${PWD}/post_install.sh" ]; then + echo + echo "You might need to configure permissions for uploading." + echo "To do so, run the following command from the terminal:" + echo "sudo \"${PWD}/post_install.sh\"" + echo + else + # Script was executed from another path. It is assumed this will only occur when user is executing script directly. + # So it is not necessary to provide the command line. + echo "Please run as root" + fi -arduino_mbed_rules > /etc/udev/rules.d/60-arduino-mbed.rules + exit + fi -# reload udev rules -echo "Reload rules..." -udevadm trigger -udevadm control --reload-rules + arduino_mbed_rules > /etc/udev/rules.d/60-arduino-mbed.rules + + # reload udev rules + echo "Reload rules..." + udevadm trigger + udevadm control --reload-rules + + ;; +esac diff --git a/programmers.txt b/programmers.txt index 06ecd7f09..91a0ce01d 100644 --- a/programmers.txt +++ b/programmers.txt @@ -35,4 +35,4 @@ blackmagic.program.protocol= blackmagic.program.tool= blackmagic.program.tool.default= blackmagic.program.extra_params= -blackmagic.debug.server=blackmagic +blackmagic.debug.server=bmp diff --git a/variants/ARDUINO_NANO33BLE/defines.txt b/variants/ARDUINO_NANO33BLE/defines.txt index 0a9037a60..8bf9cde35 100644 --- a/variants/ARDUINO_NANO33BLE/defines.txt +++ b/variants/ARDUINO_NANO33BLE/defines.txt @@ -34,7 +34,7 @@ -DFEATURE_STORAGE=1 -D__FPU_PRESENT=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1690446991.0429106 +-DMBED_BUILD_TIMESTAMP=1738678457.278008 -D__MBED_CMSIS_RTOS_CM -DMBED_MPU_CUSTOM -DMBED_TICKLESS diff --git a/variants/ARDUINO_NANO33BLE/libs/libmbed.a b/variants/ARDUINO_NANO33BLE/libs/libmbed.a index 915858f44..729832d39 100644 Binary files a/variants/ARDUINO_NANO33BLE/libs/libmbed.a and b/variants/ARDUINO_NANO33BLE/libs/libmbed.a differ diff --git a/variants/ARDUINO_NANO33BLE/variant.cpp b/variants/ARDUINO_NANO33BLE/variant.cpp index c92e42eda..cbeb7fc76 100644 --- a/variants/ARDUINO_NANO33BLE/variant.cpp +++ b/variants/ARDUINO_NANO33BLE/variant.cpp @@ -156,8 +156,18 @@ void initVariant() { pinMode(PIN_ENABLE_I2C_PULLUP, OUTPUT); digitalWrite(PIN_ENABLE_SENSORS_3V3, HIGH); + delay(10); digitalWrite(PIN_ENABLE_I2C_PULLUP, HIGH); + // Set high drive pin to properly power the bmi150 + nrf_gpio_cfg( + digitalPinToPinName(PIN_ENABLE_SENSORS_3V3), + NRF_GPIO_PIN_DIR_OUTPUT, + NRF_GPIO_PIN_INPUT_DISCONNECT, + NRF_GPIO_PIN_NOPULL, + NRF_GPIO_PIN_H0H1, + NRF_GPIO_PIN_NOSENSE); + // Disable UARTE0 which is initially enabled by the bootloader nrf_uarte_task_trigger(NRF_UARTE0, NRF_UARTE_TASK_STOPRX); while (!nrf_uarte_event_check(NRF_UARTE0, NRF_UARTE_EVENT_RXTO)) ; diff --git a/variants/EDGE_CONTROL/conf/mbed_app.json b/variants/EDGE_CONTROL/conf/mbed_app.json index 572df7428..93d202c0d 100644 --- a/variants/EDGE_CONTROL/conf/mbed_app.json +++ b/variants/EDGE_CONTROL/conf/mbed_app.json @@ -19,7 +19,8 @@ "cellular.offload-dns-queries": true, "cellular.at-handler-buffer-size": 1024, "mbed-trace.enable": true, - "target.mbed_app_start": "0x10000" + "target.mbed_app_start": "0x10000", + "lwip.raw-socket-enabled": true }, "EDGE_CONTROL": { "sd.SPI_MOSI": "P0_20", diff --git a/variants/EDGE_CONTROL/defines.txt b/variants/EDGE_CONTROL/defines.txt index 1d081f7a7..4fd396229 100644 --- a/variants/EDGE_CONTROL/defines.txt +++ b/variants/EDGE_CONTROL/defines.txt @@ -38,7 +38,7 @@ -DFEATURE_STORAGE=1 -D__FPU_PRESENT=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1700127377.3953335 +-DMBED_BUILD_TIMESTAMP=1738678638.4581091 -D__MBED_CMSIS_RTOS_CM -DMBED_MPU_CUSTOM -DMBED_TICKLESS diff --git a/variants/EDGE_CONTROL/libs/libmbed.a b/variants/EDGE_CONTROL/libs/libmbed.a index 3fc128d6b..d42e1137e 100644 Binary files a/variants/EDGE_CONTROL/libs/libmbed.a and b/variants/EDGE_CONTROL/libs/libmbed.a differ diff --git a/variants/EDGE_CONTROL/mbed_config.h b/variants/EDGE_CONTROL/mbed_config.h index c61166166..31fa1228d 100644 --- a/variants/EDGE_CONTROL/mbed_config.h +++ b/variants/EDGE_CONTROL/mbed_config.h @@ -239,7 +239,7 @@ #define MBED_CONF_LWIP_PPP_IPV6_ENABLED 0 // set by library:lwip #define MBED_CONF_LWIP_PPP_THREAD_STACKSIZE 768 // set by library:lwip #define MBED_CONF_LWIP_PRESENT 1 // set by library:lwip -#define MBED_CONF_LWIP_RAW_SOCKET_ENABLED 0 // set by library:lwip +#define MBED_CONF_LWIP_RAW_SOCKET_ENABLED 1 // set by application[*] #define MBED_CONF_LWIP_SOCKET_MAX 4 // set by library:lwip #define MBED_CONF_LWIP_TCPIP_THREAD_PRIORITY osPriorityNormal // set by library:lwip #define MBED_CONF_LWIP_TCPIP_THREAD_STACKSIZE 1200 // set by library:lwip diff --git a/variants/GENERIC_STM32H747_M4/conf/mbed_app.json b/variants/GENERIC_STM32H747_M4/conf/mbed_app.json index 16b28e07a..f93a5464a 100644 --- a/variants/GENERIC_STM32H747_M4/conf/mbed_app.json +++ b/variants/GENERIC_STM32H747_M4/conf/mbed_app.json @@ -19,11 +19,11 @@ "BT_UART_NO_3M_SUPPORT", "NO_VTOR_RELOCATE", "METAL_INTERNAL", - "VIRTIO_SLAVE_ONLY", + "VIRTIO_DEVICE_ONLY", "NO_ATOMIC_64_SUPPORT", "METAL_MAX_DEVICE_REGIONS=2", - "RPMSG_BUFFER_SIZE=2048" + "RPMSG_BUFFER_SIZE=512" ] } } -} \ No newline at end of file +} diff --git a/variants/GENERIC_STM32H747_M4/defines.txt b/variants/GENERIC_STM32H747_M4/defines.txt index 06f4094b8..b44c062da 100644 --- a/variants/GENERIC_STM32H747_M4/defines.txt +++ b/variants/GENERIC_STM32H747_M4/defines.txt @@ -42,7 +42,7 @@ -DFEATURE_BLE=1 -D__FPU_PRESENT=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1698330953.225854 +-DMBED_BUILD_TIMESTAMP=1738678579.8515525 -D__MBED_CMSIS_RTOS_CM -DMBED_MPU_CUSTOM -DMBED_TICKLESS @@ -52,7 +52,7 @@ -DMETAL_MAX_DEVICE_REGIONS=2 -DNO_ATOMIC_64_SUPPORT -DNO_VTOR_RELOCATE --DRPMSG_BUFFER_SIZE=2048 +-DRPMSG_BUFFER_SIZE=512 -DSTM32H747xx -DTARGET_CORDIO -DTARGET_CORTEX @@ -77,7 +77,7 @@ -DTRANSACTION_QUEUE_SIZE_SPI=2 -DUSE_FULL_LL_DRIVER -DUSE_HAL_DRIVER --DVIRTIO_SLAVE_ONLY +-DVIRTIO_DEVICE_ONLY -DMBED_NO_GLOBAL_USING_DIRECTIVE=1 -DCORE_MAJOR= -DCORE_MINOR= diff --git a/variants/GENERIC_STM32H747_M4/includes.txt b/variants/GENERIC_STM32H747_M4/includes.txt index ad11516dc..f8f811f04 100644 --- a/variants/GENERIC_STM32H747_M4/includes.txt +++ b/variants/GENERIC_STM32H747_M4/includes.txt @@ -284,1221 +284,3 @@ -iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/resources/firmware/COMPONENT_4343W_FS -iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/resources/nvram -iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_STM32H747xI_CM4 --iwithprefixbefore/mbed --iwithprefixbefore/mbed/cmsis --iwithprefixbefore/mbed/cmsis/CMSIS_5 --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2 --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/Include --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Config --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Include --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Include1 --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Source --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/TARGET_CORTEX_M --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/TARGET_CORTEX_M/Include --iwithprefixbefore/mbed/cmsis/device --iwithprefixbefore/mbed/cmsis/device/RTE --iwithprefixbefore/mbed/cmsis/device/RTE/include --iwithprefixbefore/mbed/cmsis/device/rtos --iwithprefixbefore/mbed/cmsis/device/rtos/include --iwithprefixbefore/mbed/connectivity --iwithprefixbefore/mbed/connectivity/FEATURE_BLE --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/common --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/compatibility --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/compatibility/ble --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/driver --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/gap --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/gatt --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/services --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/hci --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/hci/dual_chip --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/sec --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/sec/common --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/att --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/cfg --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/dm --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/hci --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/l2c --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/smp --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/platform --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/platform/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/wsf --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/wsf/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/wsf/include/util --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/common --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/cordio --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/cordio/source --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/cordio/stack_adaptation --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/generic --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/pal --iwithprefixbefore/mbed/connectivity/cellular --iwithprefixbefore/mbed/connectivity/cellular/include --iwithprefixbefore/mbed/connectivity/cellular/include/cellular --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/API --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/AT --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/common --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/device --iwithprefixbefore/mbed/connectivity/drivers --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/atmel-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/atmel-rf-driver/atmel-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/atmel-rf-driver/source --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/mcr20a-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/mcr20a-rf-driver/mcr20a-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/mcr20a-rf-driver/source --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/stm-s2lp-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/stm-s2lp-rf-driver/source --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/stm-s2lp-rf-driver/stm-s2lp-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX --iwithprefixbefore/mbed/connectivity/drivers/cellular --iwithprefixbefore/mbed/connectivity/drivers/cellular/Altair --iwithprefixbefore/mbed/connectivity/drivers/cellular/Altair/ALT1250 --iwithprefixbefore/mbed/connectivity/drivers/cellular/Altair/ALT1250/PPP --iwithprefixbefore/mbed/connectivity/drivers/cellular/GEMALTO --iwithprefixbefore/mbed/connectivity/drivers/cellular/GEMALTO/CINTERION --iwithprefixbefore/mbed/connectivity/drivers/cellular/GENERIC --iwithprefixbefore/mbed/connectivity/drivers/cellular/GENERIC/GENERIC_AT3GPP --iwithprefixbefore/mbed/connectivity/drivers/cellular/MultiTech --iwithprefixbefore/mbed/connectivity/drivers/cellular/MultiTech/DragonflyNano --iwithprefixbefore/mbed/connectivity/drivers/cellular/MultiTech/DragonflyNano/PPP --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/BC95 --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/BG96 --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/EC2X --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/M26 --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/UG96 --iwithprefixbefore/mbed/connectivity/drivers/cellular/RiotMicro --iwithprefixbefore/mbed/connectivity/drivers/cellular/RiotMicro/AT --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT/HE910 --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT/ME310 --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT/ME910 --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX/AT --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX/N2XX --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX/PPP --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD/interface --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD/network --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD/utils --iwithprefixbefore/mbed/connectivity/drivers/emac/TARGET_STM --iwithprefixbefore/mbed/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7 --iwithprefixbefore/mbed/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7/lan8742 --iwithprefixbefore/mbed/connectivity/drivers/mbedtls/TARGET_STM --iwithprefixbefore/mbed/connectivity/drivers/nfc --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512 --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/include --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/include/nfc --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/include/nfc/controllers --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/source --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/source/transceiver --iwithprefixbefore/mbed/connectivity/drivers/wifi --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/whd-bsp-integration --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/resources --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/resources/resource_imp --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src/bus_protocols --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src/include --iwithprefixbefore/mbed/connectivity/drivers/wifi/esp8266-driver --iwithprefixbefore/mbed/connectivity/drivers/wifi/esp8266-driver/ESP8266 --iwithprefixbefore/mbed/connectivity/libraries --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap/mbed-coap --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap/source --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap/source/include --iwithprefixbefore/mbed/connectivity/libraries/nanostack-libservice --iwithprefixbefore/mbed/connectivity/libraries/nanostack-libservice/mbed-client-libservice --iwithprefixbefore/mbed/connectivity/libraries/nanostack-libservice/mbed-client-libservice/platform --iwithprefixbefore/mbed/connectivity/libraries/ppp --iwithprefixbefore/mbed/connectivity/libraries/ppp/include --iwithprefixbefore/mbed/connectivity/libraries/ppp/include/polarssl --iwithprefixbefore/mbed/connectivity/libraries/ppp/include/ppp --iwithprefixbefore/mbed/connectivity/lorawan --iwithprefixbefore/mbed/connectivity/lorawan/include --iwithprefixbefore/mbed/connectivity/lorawan/include/lorawan --iwithprefixbefore/mbed/connectivity/lorawan/lorastack --iwithprefixbefore/mbed/connectivity/lorawan/lorastack/mac --iwithprefixbefore/mbed/connectivity/lorawan/lorastack/phy --iwithprefixbefore/mbed/connectivity/lorawan/system --iwithprefixbefore/mbed/connectivity/mbedtls --iwithprefixbefore/mbed/connectivity/mbedtls/include --iwithprefixbefore/mbed/connectivity/mbedtls/include/mbedtls --iwithprefixbefore/mbed/connectivity/mbedtls/platform --iwithprefixbefore/mbed/connectivity/mbedtls/platform/inc --iwithprefixbefore/mbed/connectivity/mbedtls/source --iwithprefixbefore/mbed/connectivity/netsocket --iwithprefixbefore/mbed/connectivity/netsocket/include --iwithprefixbefore/mbed/connectivity/netsocket/include/netsocket --iwithprefixbefore/mbed/connectivity/nfc --iwithprefixbefore/mbed/connectivity/nfc/include --iwithprefixbefore/mbed/connectivity/nfc/include/nfc --iwithprefixbefore/mbed/connectivity/nfc/include/nfc/ndef --iwithprefixbefore/mbed/connectivity/nfc/include/nfc/ndef/common --iwithprefixbefore/mbed/connectivity/nfc/libraries --iwithprefixbefore/mbed/connectivity/nfc/libraries/acore --iwithprefixbefore/mbed/connectivity/nfc/libraries/acore/acore --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/ndef --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/platform --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech/iso7816 --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech/isodep --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech/type4 --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/transceiver --iwithprefixbefore/mbed/drivers --iwithprefixbefore/mbed/drivers/device_key --iwithprefixbefore/mbed/drivers/device_key/include --iwithprefixbefore/mbed/drivers/device_key/include/device_key --iwithprefixbefore/mbed/drivers/include --iwithprefixbefore/mbed/drivers/include/drivers --iwithprefixbefore/mbed/drivers/include/drivers/interfaces --iwithprefixbefore/mbed/drivers/usb --iwithprefixbefore/mbed/drivers/usb/include --iwithprefixbefore/mbed/drivers/usb/include/usb --iwithprefixbefore/mbed/drivers/usb/include/usb/internal --iwithprefixbefore/mbed/events --iwithprefixbefore/mbed/events/include --iwithprefixbefore/mbed/events/include/events --iwithprefixbefore/mbed/events/include/events/internal --iwithprefixbefore/mbed/features --iwithprefixbefore/mbed/features/frameworks --iwithprefixbefore/mbed/features/frameworks/greentea-client --iwithprefixbefore/mbed/features/frameworks/greentea-client/greentea-client --iwithprefixbefore/mbed/features/frameworks/mbed-client-cli --iwithprefixbefore/mbed/features/frameworks/mbed-client-cli/mbed-client-cli --iwithprefixbefore/mbed/features/frameworks/unity --iwithprefixbefore/mbed/features/frameworks/unity/unity --iwithprefixbefore/mbed/features/frameworks/utest --iwithprefixbefore/mbed/features/frameworks/utest/utest --iwithprefixbefore/mbed/hal --iwithprefixbefore/mbed/hal/include --iwithprefixbefore/mbed/hal/include/hal --iwithprefixbefore/mbed/hal/usb --iwithprefixbefore/mbed/hal/usb/include --iwithprefixbefore/mbed/hal/usb/include/usb --iwithprefixbefore/mbed/platform --iwithprefixbefore/mbed/platform/cxxsupport --iwithprefixbefore/mbed/platform/include --iwithprefixbefore/mbed/platform/include/platform --iwithprefixbefore/mbed/platform/include/platform/internal --iwithprefixbefore/mbed/platform/mbed-trace --iwithprefixbefore/mbed/platform/mbed-trace/include --iwithprefixbefore/mbed/platform/mbed-trace/include/mbed-trace --iwithprefixbefore/mbed/platform/randlib --iwithprefixbefore/mbed/platform/randlib/include --iwithprefixbefore/mbed/platform/randlib/include/mbed-client-randlib --iwithprefixbefore/mbed/platform/randlib/include/mbed-client-randlib/platform --iwithprefixbefore/mbed/platform/source --iwithprefixbefore/mbed/platform/source/minimal-printf --iwithprefixbefore/mbed/rtos --iwithprefixbefore/mbed/rtos/include --iwithprefixbefore/mbed/rtos/include/rtos --iwithprefixbefore/mbed/rtos/include/rtos/internal --iwithprefixbefore/mbed/rtos/source --iwithprefixbefore/mbed/storage --iwithprefixbefore/mbed/storage/blockdevice --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_FLASHIAP --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_FLASHIAP/include --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_FLASHIAP/include/FlashIAP --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_QSPIF --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_QSPIF/include --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_QSPIF/include/QSPIF --iwithprefixbefore/mbed/storage/blockdevice/include --iwithprefixbefore/mbed/storage/blockdevice/include/blockdevice --iwithprefixbefore/mbed/storage/blockdevice/include/blockdevice/internal --iwithprefixbefore/mbed/storage/filesystem --iwithprefixbefore/mbed/storage/filesystem/fat --iwithprefixbefore/mbed/storage/filesystem/fat/ChaN --iwithprefixbefore/mbed/storage/filesystem/fat/include --iwithprefixbefore/mbed/storage/filesystem/fat/include/fat --iwithprefixbefore/mbed/storage/filesystem/include --iwithprefixbefore/mbed/storage/filesystem/include/filesystem --iwithprefixbefore/mbed/storage/filesystem/littlefs --iwithprefixbefore/mbed/storage/filesystem/littlefs/include --iwithprefixbefore/mbed/storage/filesystem/littlefs/include/littlefs --iwithprefixbefore/mbed/storage/filesystem/littlefs/littlefs --iwithprefixbefore/mbed/storage/filesystem/littlefsv2 --iwithprefixbefore/mbed/storage/filesystem/littlefsv2/include --iwithprefixbefore/mbed/storage/filesystem/littlefsv2/include/littlefsv2 --iwithprefixbefore/mbed/storage/filesystem/littlefsv2/littlefs --iwithprefixbefore/mbed/storage/kvstore --iwithprefixbefore/mbed/storage/kvstore/direct_access_devicekey --iwithprefixbefore/mbed/storage/kvstore/direct_access_devicekey/include --iwithprefixbefore/mbed/storage/kvstore/direct_access_devicekey/include/direct_access_devicekey --iwithprefixbefore/mbed/storage/kvstore/filesystemstore --iwithprefixbefore/mbed/storage/kvstore/filesystemstore/include --iwithprefixbefore/mbed/storage/kvstore/filesystemstore/include/filesystemstore --iwithprefixbefore/mbed/storage/kvstore/include --iwithprefixbefore/mbed/storage/kvstore/include/kvstore --iwithprefixbefore/mbed/storage/kvstore/kv_config --iwithprefixbefore/mbed/storage/kvstore/kv_config/include --iwithprefixbefore/mbed/storage/kvstore/kv_config/include/kv_config --iwithprefixbefore/mbed/storage/kvstore/kvstore_global_api --iwithprefixbefore/mbed/storage/kvstore/kvstore_global_api/include --iwithprefixbefore/mbed/storage/kvstore/kvstore_global_api/include/kvstore_global_api --iwithprefixbefore/mbed/storage/kvstore/securestore --iwithprefixbefore/mbed/storage/kvstore/securestore/include --iwithprefixbefore/mbed/storage/kvstore/securestore/include/securestore --iwithprefixbefore/mbed/storage/kvstore/tdbstore --iwithprefixbefore/mbed/storage/kvstore/tdbstore/include --iwithprefixbefore/mbed/storage/kvstore/tdbstore/include/tdbstore --iwithprefixbefore/mbed/targets/TARGET_STM --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7 --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/CMSIS --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/STM32H7xx_HAL_Driver --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/STM32H7xx_HAL_Driver/Legacy --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_GENERIC_STM32H747_M4 --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/interface --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/port --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/resources --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/resources/firmware/COMPONENT_4343W_FS --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_GENERIC_STM32H747_M4/COMPONENT_WHD/resources/nvram --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_STM32H747xI_CM4 --iwithprefixbefore/mbed --iwithprefixbefore/mbed/cmsis --iwithprefixbefore/mbed/cmsis/CMSIS_5 --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2 --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/Include --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Config --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Include --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Include1 --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Source --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/TARGET_CORTEX_M --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/TARGET_CORTEX_M/Include --iwithprefixbefore/mbed/cmsis/device --iwithprefixbefore/mbed/cmsis/device/RTE --iwithprefixbefore/mbed/cmsis/device/RTE/include --iwithprefixbefore/mbed/cmsis/device/rtos --iwithprefixbefore/mbed/cmsis/device/rtos/include --iwithprefixbefore/mbed/connectivity --iwithprefixbefore/mbed/connectivity/FEATURE_BLE --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/common --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/compatibility --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/compatibility/ble --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/driver --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/gap --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/gatt --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/services --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/hci --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/hci/dual_chip --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/sec --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/sec/common --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/att --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/cfg --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/dm --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/hci --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/l2c --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/smp --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/platform --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/platform/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/wsf --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/wsf/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/wsf/include/util --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/common --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/cordio --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/cordio/source --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/cordio/stack_adaptation --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/generic --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/pal --iwithprefixbefore/mbed/connectivity/cellular --iwithprefixbefore/mbed/connectivity/cellular/include --iwithprefixbefore/mbed/connectivity/cellular/include/cellular --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/API --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/AT --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/common --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/device --iwithprefixbefore/mbed/connectivity/drivers --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/atmel-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/atmel-rf-driver/atmel-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/atmel-rf-driver/source --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/mcr20a-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/mcr20a-rf-driver/mcr20a-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/mcr20a-rf-driver/source --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/stm-s2lp-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/stm-s2lp-rf-driver/source --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/stm-s2lp-rf-driver/stm-s2lp-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX --iwithprefixbefore/mbed/connectivity/drivers/cellular --iwithprefixbefore/mbed/connectivity/drivers/cellular/Altair --iwithprefixbefore/mbed/connectivity/drivers/cellular/Altair/ALT1250 --iwithprefixbefore/mbed/connectivity/drivers/cellular/Altair/ALT1250/PPP --iwithprefixbefore/mbed/connectivity/drivers/cellular/GEMALTO --iwithprefixbefore/mbed/connectivity/drivers/cellular/GEMALTO/CINTERION --iwithprefixbefore/mbed/connectivity/drivers/cellular/GENERIC --iwithprefixbefore/mbed/connectivity/drivers/cellular/GENERIC/GENERIC_AT3GPP --iwithprefixbefore/mbed/connectivity/drivers/cellular/MultiTech --iwithprefixbefore/mbed/connectivity/drivers/cellular/MultiTech/DragonflyNano --iwithprefixbefore/mbed/connectivity/drivers/cellular/MultiTech/DragonflyNano/PPP --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/BC95 --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/BG96 --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/EC2X --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/M26 --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/UG96 --iwithprefixbefore/mbed/connectivity/drivers/cellular/RiotMicro --iwithprefixbefore/mbed/connectivity/drivers/cellular/RiotMicro/AT --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT/HE910 --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT/ME310 --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT/ME910 --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX/AT --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX/N2XX --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX/PPP --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD/interface --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD/network --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD/utils --iwithprefixbefore/mbed/connectivity/drivers/emac/TARGET_STM --iwithprefixbefore/mbed/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7 --iwithprefixbefore/mbed/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7/lan8742 --iwithprefixbefore/mbed/connectivity/drivers/mbedtls/TARGET_STM --iwithprefixbefore/mbed/connectivity/drivers/nfc --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512 --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/include --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/include/nfc --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/include/nfc/controllers --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/source --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/source/transceiver --iwithprefixbefore/mbed/connectivity/drivers/wifi --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/whd-bsp-integration --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/resources --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/resources/resource_imp --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src/bus_protocols --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src/include --iwithprefixbefore/mbed/connectivity/drivers/wifi/esp8266-driver --iwithprefixbefore/mbed/connectivity/drivers/wifi/esp8266-driver/ESP8266 --iwithprefixbefore/mbed/connectivity/libraries --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap/mbed-coap --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap/source --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap/source/include --iwithprefixbefore/mbed/connectivity/libraries/nanostack-libservice --iwithprefixbefore/mbed/connectivity/libraries/nanostack-libservice/mbed-client-libservice --iwithprefixbefore/mbed/connectivity/libraries/nanostack-libservice/mbed-client-libservice/platform --iwithprefixbefore/mbed/connectivity/libraries/ppp --iwithprefixbefore/mbed/connectivity/libraries/ppp/include --iwithprefixbefore/mbed/connectivity/libraries/ppp/include/polarssl --iwithprefixbefore/mbed/connectivity/libraries/ppp/include/ppp --iwithprefixbefore/mbed/connectivity/lorawan --iwithprefixbefore/mbed/connectivity/lorawan/include --iwithprefixbefore/mbed/connectivity/lorawan/include/lorawan --iwithprefixbefore/mbed/connectivity/lorawan/lorastack --iwithprefixbefore/mbed/connectivity/lorawan/lorastack/mac --iwithprefixbefore/mbed/connectivity/lorawan/lorastack/phy --iwithprefixbefore/mbed/connectivity/lorawan/system --iwithprefixbefore/mbed/connectivity/mbedtls --iwithprefixbefore/mbed/connectivity/mbedtls/include --iwithprefixbefore/mbed/connectivity/mbedtls/include/mbedtls --iwithprefixbefore/mbed/connectivity/mbedtls/platform --iwithprefixbefore/mbed/connectivity/mbedtls/platform/inc --iwithprefixbefore/mbed/connectivity/mbedtls/source --iwithprefixbefore/mbed/connectivity/netsocket --iwithprefixbefore/mbed/connectivity/netsocket/include --iwithprefixbefore/mbed/connectivity/netsocket/include/netsocket --iwithprefixbefore/mbed/connectivity/nfc --iwithprefixbefore/mbed/connectivity/nfc/include --iwithprefixbefore/mbed/connectivity/nfc/include/nfc --iwithprefixbefore/mbed/connectivity/nfc/include/nfc/ndef --iwithprefixbefore/mbed/connectivity/nfc/include/nfc/ndef/common --iwithprefixbefore/mbed/connectivity/nfc/libraries --iwithprefixbefore/mbed/connectivity/nfc/libraries/acore --iwithprefixbefore/mbed/connectivity/nfc/libraries/acore/acore --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/ndef --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/platform --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech/iso7816 --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech/isodep --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech/type4 --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/transceiver --iwithprefixbefore/mbed/drivers --iwithprefixbefore/mbed/drivers/device_key --iwithprefixbefore/mbed/drivers/device_key/include --iwithprefixbefore/mbed/drivers/device_key/include/device_key --iwithprefixbefore/mbed/drivers/include --iwithprefixbefore/mbed/drivers/include/drivers --iwithprefixbefore/mbed/drivers/include/drivers/interfaces --iwithprefixbefore/mbed/drivers/usb --iwithprefixbefore/mbed/drivers/usb/include --iwithprefixbefore/mbed/drivers/usb/include/usb --iwithprefixbefore/mbed/drivers/usb/include/usb/internal --iwithprefixbefore/mbed/events --iwithprefixbefore/mbed/events/include --iwithprefixbefore/mbed/events/include/events --iwithprefixbefore/mbed/events/include/events/internal --iwithprefixbefore/mbed/features --iwithprefixbefore/mbed/features/frameworks --iwithprefixbefore/mbed/features/frameworks/greentea-client --iwithprefixbefore/mbed/features/frameworks/greentea-client/greentea-client --iwithprefixbefore/mbed/features/frameworks/mbed-client-cli --iwithprefixbefore/mbed/features/frameworks/mbed-client-cli/mbed-client-cli --iwithprefixbefore/mbed/features/frameworks/unity --iwithprefixbefore/mbed/features/frameworks/unity/unity --iwithprefixbefore/mbed/features/frameworks/utest --iwithprefixbefore/mbed/features/frameworks/utest/utest --iwithprefixbefore/mbed/hal --iwithprefixbefore/mbed/hal/include --iwithprefixbefore/mbed/hal/include/hal --iwithprefixbefore/mbed/hal/usb --iwithprefixbefore/mbed/hal/usb/include --iwithprefixbefore/mbed/hal/usb/include/usb --iwithprefixbefore/mbed/platform --iwithprefixbefore/mbed/platform/cxxsupport --iwithprefixbefore/mbed/platform/include --iwithprefixbefore/mbed/platform/include/platform --iwithprefixbefore/mbed/platform/include/platform/internal --iwithprefixbefore/mbed/platform/mbed-trace --iwithprefixbefore/mbed/platform/mbed-trace/include --iwithprefixbefore/mbed/platform/mbed-trace/include/mbed-trace --iwithprefixbefore/mbed/platform/randlib --iwithprefixbefore/mbed/platform/randlib/include --iwithprefixbefore/mbed/platform/randlib/include/mbed-client-randlib --iwithprefixbefore/mbed/platform/randlib/include/mbed-client-randlib/platform --iwithprefixbefore/mbed/platform/source --iwithprefixbefore/mbed/platform/source/minimal-printf --iwithprefixbefore/mbed/rtos --iwithprefixbefore/mbed/rtos/include --iwithprefixbefore/mbed/rtos/include/rtos --iwithprefixbefore/mbed/rtos/include/rtos/internal --iwithprefixbefore/mbed/rtos/source --iwithprefixbefore/mbed/storage --iwithprefixbefore/mbed/storage/blockdevice --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_FLASHIAP --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_FLASHIAP/include --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_FLASHIAP/include/FlashIAP --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_QSPIF --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_QSPIF/include --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_QSPIF/include/QSPIF --iwithprefixbefore/mbed/storage/blockdevice/include --iwithprefixbefore/mbed/storage/blockdevice/include/blockdevice --iwithprefixbefore/mbed/storage/blockdevice/include/blockdevice/internal --iwithprefixbefore/mbed/storage/filesystem --iwithprefixbefore/mbed/storage/filesystem/fat --iwithprefixbefore/mbed/storage/filesystem/fat/ChaN --iwithprefixbefore/mbed/storage/filesystem/fat/include --iwithprefixbefore/mbed/storage/filesystem/fat/include/fat --iwithprefixbefore/mbed/storage/filesystem/include --iwithprefixbefore/mbed/storage/filesystem/include/filesystem --iwithprefixbefore/mbed/storage/filesystem/littlefs --iwithprefixbefore/mbed/storage/filesystem/littlefs/include --iwithprefixbefore/mbed/storage/filesystem/littlefs/include/littlefs --iwithprefixbefore/mbed/storage/filesystem/littlefs/littlefs --iwithprefixbefore/mbed/storage/filesystem/littlefsv2 --iwithprefixbefore/mbed/storage/filesystem/littlefsv2/include --iwithprefixbefore/mbed/storage/filesystem/littlefsv2/include/littlefsv2 --iwithprefixbefore/mbed/storage/filesystem/littlefsv2/littlefs --iwithprefixbefore/mbed/storage/kvstore --iwithprefixbefore/mbed/storage/kvstore/direct_access_devicekey --iwithprefixbefore/mbed/storage/kvstore/direct_access_devicekey/include --iwithprefixbefore/mbed/storage/kvstore/direct_access_devicekey/include/direct_access_devicekey --iwithprefixbefore/mbed/storage/kvstore/filesystemstore --iwithprefixbefore/mbed/storage/kvstore/filesystemstore/include --iwithprefixbefore/mbed/storage/kvstore/filesystemstore/include/filesystemstore --iwithprefixbefore/mbed/storage/kvstore/include --iwithprefixbefore/mbed/storage/kvstore/include/kvstore --iwithprefixbefore/mbed/storage/kvstore/kv_config --iwithprefixbefore/mbed/storage/kvstore/kv_config/include --iwithprefixbefore/mbed/storage/kvstore/kv_config/include/kv_config --iwithprefixbefore/mbed/storage/kvstore/kvstore_global_api --iwithprefixbefore/mbed/storage/kvstore/kvstore_global_api/include --iwithprefixbefore/mbed/storage/kvstore/kvstore_global_api/include/kvstore_global_api --iwithprefixbefore/mbed/storage/kvstore/securestore --iwithprefixbefore/mbed/storage/kvstore/securestore/include --iwithprefixbefore/mbed/storage/kvstore/securestore/include/securestore --iwithprefixbefore/mbed/storage/kvstore/tdbstore --iwithprefixbefore/mbed/storage/kvstore/tdbstore/include --iwithprefixbefore/mbed/storage/kvstore/tdbstore/include/tdbstore --iwithprefixbefore/mbed/targets/TARGET_STM --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7 --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/CMSIS --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/STM32H7xx_HAL_Driver --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/STM32H7xx_HAL_Driver/Legacy --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_GENERIC_STM32H747_M4 --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_STM32H747xI_CM4 --iwithprefixbefore/mbed --iwithprefixbefore/mbed/cmsis --iwithprefixbefore/mbed/cmsis/CMSIS_5 --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2 --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/Include --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Config --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Include --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Include1 --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Source --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/TARGET_CORTEX_M --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/TARGET_CORTEX_M/Include --iwithprefixbefore/mbed/cmsis/device --iwithprefixbefore/mbed/cmsis/device/RTE --iwithprefixbefore/mbed/cmsis/device/RTE/include --iwithprefixbefore/mbed/cmsis/device/rtos --iwithprefixbefore/mbed/cmsis/device/rtos/include --iwithprefixbefore/mbed/connectivity --iwithprefixbefore/mbed/connectivity/FEATURE_BLE --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/common --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/compatibility --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/compatibility/ble --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/driver --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/gap --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/gatt --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/services --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/hci --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/hci/dual_chip --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/sec --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/sec/common --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/att --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/cfg --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/dm --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/hci --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/l2c --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/smp --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/platform --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/platform/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/wsf --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/wsf/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/wsf/include/util --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/common --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/cordio --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/cordio/source --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/cordio/stack_adaptation --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/generic --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/pal --iwithprefixbefore/mbed/connectivity/cellular --iwithprefixbefore/mbed/connectivity/cellular/include --iwithprefixbefore/mbed/connectivity/cellular/include/cellular --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/API --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/AT --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/common --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/device --iwithprefixbefore/mbed/connectivity/drivers --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/atmel-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/atmel-rf-driver/atmel-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/atmel-rf-driver/source --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/mcr20a-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/mcr20a-rf-driver/mcr20a-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/mcr20a-rf-driver/source --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/stm-s2lp-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/stm-s2lp-rf-driver/source --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/stm-s2lp-rf-driver/stm-s2lp-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX --iwithprefixbefore/mbed/connectivity/drivers/cellular --iwithprefixbefore/mbed/connectivity/drivers/cellular/Altair --iwithprefixbefore/mbed/connectivity/drivers/cellular/Altair/ALT1250 --iwithprefixbefore/mbed/connectivity/drivers/cellular/Altair/ALT1250/PPP --iwithprefixbefore/mbed/connectivity/drivers/cellular/GEMALTO --iwithprefixbefore/mbed/connectivity/drivers/cellular/GEMALTO/CINTERION --iwithprefixbefore/mbed/connectivity/drivers/cellular/GENERIC --iwithprefixbefore/mbed/connectivity/drivers/cellular/GENERIC/GENERIC_AT3GPP --iwithprefixbefore/mbed/connectivity/drivers/cellular/MultiTech --iwithprefixbefore/mbed/connectivity/drivers/cellular/MultiTech/DragonflyNano --iwithprefixbefore/mbed/connectivity/drivers/cellular/MultiTech/DragonflyNano/PPP --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/BC95 --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/BG96 --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/EC2X --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/M26 --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/UG96 --iwithprefixbefore/mbed/connectivity/drivers/cellular/RiotMicro --iwithprefixbefore/mbed/connectivity/drivers/cellular/RiotMicro/AT --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT/HE910 --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT/ME310 --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT/ME910 --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX/AT --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX/N2XX --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX/PPP --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD/interface --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD/network --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD/utils --iwithprefixbefore/mbed/connectivity/drivers/emac/TARGET_STM --iwithprefixbefore/mbed/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7 --iwithprefixbefore/mbed/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7/lan8742 --iwithprefixbefore/mbed/connectivity/drivers/mbedtls/TARGET_STM --iwithprefixbefore/mbed/connectivity/drivers/nfc --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512 --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/include --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/include/nfc --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/include/nfc/controllers --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/source --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/source/transceiver --iwithprefixbefore/mbed/connectivity/drivers/wifi --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/whd-bsp-integration --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/resources --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/resources/resource_imp --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src/bus_protocols --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src/include --iwithprefixbefore/mbed/connectivity/drivers/wifi/esp8266-driver --iwithprefixbefore/mbed/connectivity/drivers/wifi/esp8266-driver/ESP8266 --iwithprefixbefore/mbed/connectivity/libraries --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap/mbed-coap --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap/source --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap/source/include --iwithprefixbefore/mbed/connectivity/libraries/nanostack-libservice --iwithprefixbefore/mbed/connectivity/libraries/nanostack-libservice/mbed-client-libservice --iwithprefixbefore/mbed/connectivity/libraries/nanostack-libservice/mbed-client-libservice/platform --iwithprefixbefore/mbed/connectivity/libraries/ppp --iwithprefixbefore/mbed/connectivity/libraries/ppp/include --iwithprefixbefore/mbed/connectivity/libraries/ppp/include/polarssl --iwithprefixbefore/mbed/connectivity/libraries/ppp/include/ppp --iwithprefixbefore/mbed/connectivity/lorawan --iwithprefixbefore/mbed/connectivity/lorawan/include --iwithprefixbefore/mbed/connectivity/lorawan/include/lorawan --iwithprefixbefore/mbed/connectivity/lorawan/lorastack --iwithprefixbefore/mbed/connectivity/lorawan/lorastack/mac --iwithprefixbefore/mbed/connectivity/lorawan/lorastack/phy --iwithprefixbefore/mbed/connectivity/lorawan/system --iwithprefixbefore/mbed/connectivity/mbedtls --iwithprefixbefore/mbed/connectivity/mbedtls/include --iwithprefixbefore/mbed/connectivity/mbedtls/include/mbedtls --iwithprefixbefore/mbed/connectivity/mbedtls/platform --iwithprefixbefore/mbed/connectivity/mbedtls/platform/inc --iwithprefixbefore/mbed/connectivity/mbedtls/source --iwithprefixbefore/mbed/connectivity/netsocket --iwithprefixbefore/mbed/connectivity/netsocket/include --iwithprefixbefore/mbed/connectivity/netsocket/include/netsocket --iwithprefixbefore/mbed/connectivity/nfc --iwithprefixbefore/mbed/connectivity/nfc/include --iwithprefixbefore/mbed/connectivity/nfc/include/nfc --iwithprefixbefore/mbed/connectivity/nfc/include/nfc/ndef --iwithprefixbefore/mbed/connectivity/nfc/include/nfc/ndef/common --iwithprefixbefore/mbed/connectivity/nfc/libraries --iwithprefixbefore/mbed/connectivity/nfc/libraries/acore --iwithprefixbefore/mbed/connectivity/nfc/libraries/acore/acore --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/ndef --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/platform --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech/iso7816 --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech/isodep --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech/type4 --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/transceiver --iwithprefixbefore/mbed/drivers --iwithprefixbefore/mbed/drivers/device_key --iwithprefixbefore/mbed/drivers/device_key/include --iwithprefixbefore/mbed/drivers/device_key/include/device_key --iwithprefixbefore/mbed/drivers/include --iwithprefixbefore/mbed/drivers/include/drivers --iwithprefixbefore/mbed/drivers/include/drivers/interfaces --iwithprefixbefore/mbed/drivers/usb --iwithprefixbefore/mbed/drivers/usb/include --iwithprefixbefore/mbed/drivers/usb/include/usb --iwithprefixbefore/mbed/drivers/usb/include/usb/internal --iwithprefixbefore/mbed/events --iwithprefixbefore/mbed/events/include --iwithprefixbefore/mbed/events/include/events --iwithprefixbefore/mbed/events/include/events/internal --iwithprefixbefore/mbed/features --iwithprefixbefore/mbed/features/frameworks --iwithprefixbefore/mbed/features/frameworks/greentea-client --iwithprefixbefore/mbed/features/frameworks/greentea-client/greentea-client --iwithprefixbefore/mbed/features/frameworks/mbed-client-cli --iwithprefixbefore/mbed/features/frameworks/mbed-client-cli/mbed-client-cli --iwithprefixbefore/mbed/features/frameworks/unity --iwithprefixbefore/mbed/features/frameworks/unity/unity --iwithprefixbefore/mbed/features/frameworks/utest --iwithprefixbefore/mbed/features/frameworks/utest/utest --iwithprefixbefore/mbed/hal --iwithprefixbefore/mbed/hal/include --iwithprefixbefore/mbed/hal/include/hal --iwithprefixbefore/mbed/hal/usb --iwithprefixbefore/mbed/hal/usb/include --iwithprefixbefore/mbed/hal/usb/include/usb --iwithprefixbefore/mbed/platform --iwithprefixbefore/mbed/platform/cxxsupport --iwithprefixbefore/mbed/platform/include --iwithprefixbefore/mbed/platform/include/platform --iwithprefixbefore/mbed/platform/include/platform/internal --iwithprefixbefore/mbed/platform/mbed-trace --iwithprefixbefore/mbed/platform/mbed-trace/include --iwithprefixbefore/mbed/platform/mbed-trace/include/mbed-trace --iwithprefixbefore/mbed/platform/randlib --iwithprefixbefore/mbed/platform/randlib/include --iwithprefixbefore/mbed/platform/randlib/include/mbed-client-randlib --iwithprefixbefore/mbed/platform/randlib/include/mbed-client-randlib/platform --iwithprefixbefore/mbed/platform/source --iwithprefixbefore/mbed/platform/source/minimal-printf --iwithprefixbefore/mbed/rtos --iwithprefixbefore/mbed/rtos/include --iwithprefixbefore/mbed/rtos/include/rtos --iwithprefixbefore/mbed/rtos/include/rtos/internal --iwithprefixbefore/mbed/rtos/source --iwithprefixbefore/mbed/storage --iwithprefixbefore/mbed/storage/blockdevice --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_FLASHIAP --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_FLASHIAP/include --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_FLASHIAP/include/FlashIAP --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_QSPIF --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_QSPIF/include --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_QSPIF/include/QSPIF --iwithprefixbefore/mbed/storage/blockdevice/include --iwithprefixbefore/mbed/storage/blockdevice/include/blockdevice --iwithprefixbefore/mbed/storage/blockdevice/include/blockdevice/internal --iwithprefixbefore/mbed/storage/filesystem --iwithprefixbefore/mbed/storage/filesystem/fat --iwithprefixbefore/mbed/storage/filesystem/fat/ChaN --iwithprefixbefore/mbed/storage/filesystem/fat/include --iwithprefixbefore/mbed/storage/filesystem/fat/include/fat --iwithprefixbefore/mbed/storage/filesystem/include --iwithprefixbefore/mbed/storage/filesystem/include/filesystem --iwithprefixbefore/mbed/storage/filesystem/littlefs --iwithprefixbefore/mbed/storage/filesystem/littlefs/include --iwithprefixbefore/mbed/storage/filesystem/littlefs/include/littlefs --iwithprefixbefore/mbed/storage/filesystem/littlefs/littlefs --iwithprefixbefore/mbed/storage/filesystem/littlefsv2 --iwithprefixbefore/mbed/storage/filesystem/littlefsv2/include --iwithprefixbefore/mbed/storage/filesystem/littlefsv2/include/littlefsv2 --iwithprefixbefore/mbed/storage/filesystem/littlefsv2/littlefs --iwithprefixbefore/mbed/storage/kvstore --iwithprefixbefore/mbed/storage/kvstore/direct_access_devicekey --iwithprefixbefore/mbed/storage/kvstore/direct_access_devicekey/include --iwithprefixbefore/mbed/storage/kvstore/direct_access_devicekey/include/direct_access_devicekey --iwithprefixbefore/mbed/storage/kvstore/filesystemstore --iwithprefixbefore/mbed/storage/kvstore/filesystemstore/include --iwithprefixbefore/mbed/storage/kvstore/filesystemstore/include/filesystemstore --iwithprefixbefore/mbed/storage/kvstore/include --iwithprefixbefore/mbed/storage/kvstore/include/kvstore --iwithprefixbefore/mbed/storage/kvstore/kv_config --iwithprefixbefore/mbed/storage/kvstore/kv_config/include --iwithprefixbefore/mbed/storage/kvstore/kv_config/include/kv_config --iwithprefixbefore/mbed/storage/kvstore/kvstore_global_api --iwithprefixbefore/mbed/storage/kvstore/kvstore_global_api/include --iwithprefixbefore/mbed/storage/kvstore/kvstore_global_api/include/kvstore_global_api --iwithprefixbefore/mbed/storage/kvstore/securestore --iwithprefixbefore/mbed/storage/kvstore/securestore/include --iwithprefixbefore/mbed/storage/kvstore/securestore/include/securestore --iwithprefixbefore/mbed/storage/kvstore/tdbstore --iwithprefixbefore/mbed/storage/kvstore/tdbstore/include --iwithprefixbefore/mbed/storage/kvstore/tdbstore/include/tdbstore --iwithprefixbefore/mbed/targets/TARGET_STM --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7 --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/CMSIS --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/STM32H7xx_HAL_Driver --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/STM32H7xx_HAL_Driver/Legacy --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_STM32H747xI_CM4 --iwithprefixbefore/mbed --iwithprefixbefore/mbed/cmsis --iwithprefixbefore/mbed/cmsis/CMSIS_5 --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2 --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/Include --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Config --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Include --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Include1 --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/RTOS2/RTX/Source --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/TARGET_CORTEX_M --iwithprefixbefore/mbed/cmsis/CMSIS_5/CMSIS/TARGET_CORTEX_M/Include --iwithprefixbefore/mbed/cmsis/device --iwithprefixbefore/mbed/cmsis/device/RTE --iwithprefixbefore/mbed/cmsis/device/RTE/include --iwithprefixbefore/mbed/cmsis/device/rtos --iwithprefixbefore/mbed/cmsis/device/rtos/include --iwithprefixbefore/mbed/connectivity --iwithprefixbefore/mbed/connectivity/FEATURE_BLE --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/common --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/compatibility --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/compatibility/ble --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/driver --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/gap --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/gatt --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/include/ble/services --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/hci --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/hci/dual_chip --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/sec --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/sec/common --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/att --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/cfg --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/dm --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/hci --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/l2c --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/ble-host/sources/stack/smp --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/platform --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/platform/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/wsf --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/wsf/include --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/libraries/cordio_stack/wsf/include/util --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/common --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/cordio --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/cordio/source --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/cordio/stack_adaptation --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/generic --iwithprefixbefore/mbed/connectivity/FEATURE_BLE/source/pal --iwithprefixbefore/mbed/connectivity/cellular --iwithprefixbefore/mbed/connectivity/cellular/include --iwithprefixbefore/mbed/connectivity/cellular/include/cellular --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/API --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/AT --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/common --iwithprefixbefore/mbed/connectivity/cellular/include/cellular/framework/device --iwithprefixbefore/mbed/connectivity/drivers --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/atmel-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/atmel-rf-driver/atmel-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/atmel-rf-driver/source --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/mcr20a-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/mcr20a-rf-driver/mcr20a-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/mcr20a-rf-driver/source --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/stm-s2lp-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/stm-s2lp-rf-driver/source --iwithprefixbefore/mbed/connectivity/drivers/802.15.4_RF/stm-s2lp-rf-driver/stm-s2lp-rf-driver --iwithprefixbefore/mbed/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX --iwithprefixbefore/mbed/connectivity/drivers/cellular --iwithprefixbefore/mbed/connectivity/drivers/cellular/Altair --iwithprefixbefore/mbed/connectivity/drivers/cellular/Altair/ALT1250 --iwithprefixbefore/mbed/connectivity/drivers/cellular/Altair/ALT1250/PPP --iwithprefixbefore/mbed/connectivity/drivers/cellular/GEMALTO --iwithprefixbefore/mbed/connectivity/drivers/cellular/GEMALTO/CINTERION --iwithprefixbefore/mbed/connectivity/drivers/cellular/GENERIC --iwithprefixbefore/mbed/connectivity/drivers/cellular/GENERIC/GENERIC_AT3GPP --iwithprefixbefore/mbed/connectivity/drivers/cellular/MultiTech --iwithprefixbefore/mbed/connectivity/drivers/cellular/MultiTech/DragonflyNano --iwithprefixbefore/mbed/connectivity/drivers/cellular/MultiTech/DragonflyNano/PPP --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/BC95 --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/BG96 --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/EC2X --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/M26 --iwithprefixbefore/mbed/connectivity/drivers/cellular/QUECTEL/UG96 --iwithprefixbefore/mbed/connectivity/drivers/cellular/RiotMicro --iwithprefixbefore/mbed/connectivity/drivers/cellular/RiotMicro/AT --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT/HE910 --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT/ME310 --iwithprefixbefore/mbed/connectivity/drivers/cellular/TELIT/ME910 --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX/AT --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX/N2XX --iwithprefixbefore/mbed/connectivity/drivers/cellular/UBLOX/PPP --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD/interface --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD/network --iwithprefixbefore/mbed/connectivity/drivers/emac/COMPONENT_WHD/utils --iwithprefixbefore/mbed/connectivity/drivers/emac/TARGET_STM --iwithprefixbefore/mbed/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7 --iwithprefixbefore/mbed/connectivity/drivers/emac/TARGET_STM/TARGET_STM32H7/lan8742 --iwithprefixbefore/mbed/connectivity/drivers/mbedtls/TARGET_STM --iwithprefixbefore/mbed/connectivity/drivers/nfc --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512 --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/include --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/include/nfc --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/include/nfc/controllers --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/source --iwithprefixbefore/mbed/connectivity/drivers/nfc/PN512/source/transceiver --iwithprefixbefore/mbed/connectivity/drivers/wifi --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/whd-bsp-integration --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/inc --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/resources --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/resources/resource_imp --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src/bus_protocols --iwithprefixbefore/mbed/connectivity/drivers/wifi/COMPONENT_WHD/wifi-host-driver/src/include --iwithprefixbefore/mbed/connectivity/drivers/wifi/esp8266-driver --iwithprefixbefore/mbed/connectivity/drivers/wifi/esp8266-driver/ESP8266 --iwithprefixbefore/mbed/connectivity/libraries --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap/mbed-coap --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap/source --iwithprefixbefore/mbed/connectivity/libraries/mbed-coap/source/include --iwithprefixbefore/mbed/connectivity/libraries/nanostack-libservice --iwithprefixbefore/mbed/connectivity/libraries/nanostack-libservice/mbed-client-libservice --iwithprefixbefore/mbed/connectivity/libraries/nanostack-libservice/mbed-client-libservice/platform --iwithprefixbefore/mbed/connectivity/libraries/ppp --iwithprefixbefore/mbed/connectivity/libraries/ppp/include --iwithprefixbefore/mbed/connectivity/libraries/ppp/include/polarssl --iwithprefixbefore/mbed/connectivity/libraries/ppp/include/ppp --iwithprefixbefore/mbed/connectivity/lorawan --iwithprefixbefore/mbed/connectivity/lorawan/include --iwithprefixbefore/mbed/connectivity/lorawan/include/lorawan --iwithprefixbefore/mbed/connectivity/lorawan/lorastack --iwithprefixbefore/mbed/connectivity/lorawan/lorastack/mac --iwithprefixbefore/mbed/connectivity/lorawan/lorastack/phy --iwithprefixbefore/mbed/connectivity/lorawan/system --iwithprefixbefore/mbed/connectivity/mbedtls --iwithprefixbefore/mbed/connectivity/mbedtls/include --iwithprefixbefore/mbed/connectivity/mbedtls/include/mbedtls --iwithprefixbefore/mbed/connectivity/mbedtls/platform --iwithprefixbefore/mbed/connectivity/mbedtls/platform/inc --iwithprefixbefore/mbed/connectivity/mbedtls/source --iwithprefixbefore/mbed/connectivity/nanostack --iwithprefixbefore/mbed/connectivity/nanostack/coap-service --iwithprefixbefore/mbed/connectivity/nanostack/coap-service/coap-service --iwithprefixbefore/mbed/connectivity/nanostack/coap-service/source --iwithprefixbefore/mbed/connectivity/nanostack/coap-service/source/include --iwithprefixbefore/mbed/connectivity/nanostack/include --iwithprefixbefore/mbed/connectivity/nanostack/include/nanostack-interface --iwithprefixbefore/mbed/connectivity/nanostack/mbed-mesh-api --iwithprefixbefore/mbed/connectivity/nanostack/mbed-mesh-api/mbed-mesh-api --iwithprefixbefore/mbed/connectivity/nanostack/mbed-mesh-api/source --iwithprefixbefore/mbed/connectivity/nanostack/mbed-mesh-api/source/include --iwithprefixbefore/mbed/connectivity/nanostack/nanostack-hal-mbed-cmsis-rtos --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack-eventloop --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack-eventloop/nanostack-event-loop --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack-eventloop/nanostack-event-loop/platform --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack-eventloop/source --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/nanostack --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/nanostack/platform --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/6LoWPAN --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/6LoWPAN/Bootstraps --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/6LoWPAN/Fragmentation --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/6LoWPAN/IPHC_Decode --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/6LoWPAN/MAC --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/6LoWPAN/Mesh --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/6LoWPAN/ND --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/6LoWPAN/NVM --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/6LoWPAN/Thread --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/6LoWPAN/ws --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/BorderRouter --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Common_Protocols --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Core --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Core/include --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/DHCPv6_Server --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/DHCPv6_client --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/MAC --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/MAC/IEEE802_15_4 --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/MAC/virtual_rf --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/MLE --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/MPL --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/NWK_INTERFACE --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/NWK_INTERFACE/Include --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/RPL --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Security --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Security/Common --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Security/PANA --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Security/TLS --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Security/eapol --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Security/kmp --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Security/protocols --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Security/protocols/eap_tls_sec_prot --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Security/protocols/fwh_sec_prot --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Security/protocols/gkh_sec_prot --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Security/protocols/key_sec_prot --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Security/protocols/msg_sec_prot --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Security/protocols/radius_sec_prot --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Security/protocols/tls_sec_prot --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/Neighbor_cache --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/Trickle --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/blacklist --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/etx --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/fhss --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/fnv_hash --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/hmac --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/ieee_802_11 --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/load_balance --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/mac_neighbor_table --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/mdns --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/mdns/fnet --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/mdns/fnet/fnet_stack --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/mdns/fnet/fnet_stack/port --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/mdns/fnet/fnet_stack/port/compiler --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/mdns/fnet/fnet_stack/port/cpu --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/mdns/fnet/fnet_stack/services --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/mdns/fnet/fnet_stack/services/dns --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/mdns/fnet/fnet_stack/services/mdns --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/mdns/fnet/fnet_stack/services/poll --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/mdns/fnet/fnet_stack/services/serial --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/mdns/fnet/fnet_stack/stack --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/mle_service --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/nd_proxy --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/nist_aes_kw --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/pan_blacklist --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/random_early_detection --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/utils --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/Service_Libs/whiteboard --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/configs --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/configs/base --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/ipv6_stack --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/libDHCPv6 --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/libNET --iwithprefixbefore/mbed/connectivity/nanostack/sal-stack-nanostack/source/libNET/src --iwithprefixbefore/mbed/connectivity/netsocket --iwithprefixbefore/mbed/connectivity/netsocket/include --iwithprefixbefore/mbed/connectivity/netsocket/include/netsocket --iwithprefixbefore/mbed/connectivity/nfc --iwithprefixbefore/mbed/connectivity/nfc/include --iwithprefixbefore/mbed/connectivity/nfc/include/nfc --iwithprefixbefore/mbed/connectivity/nfc/include/nfc/ndef --iwithprefixbefore/mbed/connectivity/nfc/include/nfc/ndef/common --iwithprefixbefore/mbed/connectivity/nfc/libraries --iwithprefixbefore/mbed/connectivity/nfc/libraries/acore --iwithprefixbefore/mbed/connectivity/nfc/libraries/acore/acore --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/ndef --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/platform --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech/iso7816 --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech/isodep --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/tech/type4 --iwithprefixbefore/mbed/connectivity/nfc/libraries/stack/transceiver --iwithprefixbefore/mbed/drivers --iwithprefixbefore/mbed/drivers/device_key --iwithprefixbefore/mbed/drivers/device_key/include --iwithprefixbefore/mbed/drivers/device_key/include/device_key --iwithprefixbefore/mbed/drivers/include --iwithprefixbefore/mbed/drivers/include/drivers --iwithprefixbefore/mbed/drivers/include/drivers/interfaces --iwithprefixbefore/mbed/drivers/usb --iwithprefixbefore/mbed/drivers/usb/include --iwithprefixbefore/mbed/drivers/usb/include/usb --iwithprefixbefore/mbed/drivers/usb/include/usb/internal --iwithprefixbefore/mbed/events --iwithprefixbefore/mbed/events/include --iwithprefixbefore/mbed/events/include/events --iwithprefixbefore/mbed/events/include/events/internal --iwithprefixbefore/mbed/features --iwithprefixbefore/mbed/features/frameworks --iwithprefixbefore/mbed/features/frameworks/greentea-client --iwithprefixbefore/mbed/features/frameworks/greentea-client/greentea-client --iwithprefixbefore/mbed/features/frameworks/mbed-client-cli --iwithprefixbefore/mbed/features/frameworks/mbed-client-cli/mbed-client-cli --iwithprefixbefore/mbed/features/frameworks/unity --iwithprefixbefore/mbed/features/frameworks/unity/unity --iwithprefixbefore/mbed/features/frameworks/utest --iwithprefixbefore/mbed/features/frameworks/utest/utest --iwithprefixbefore/mbed/hal --iwithprefixbefore/mbed/hal/include --iwithprefixbefore/mbed/hal/include/hal --iwithprefixbefore/mbed/hal/usb --iwithprefixbefore/mbed/hal/usb/include --iwithprefixbefore/mbed/hal/usb/include/usb --iwithprefixbefore/mbed/platform --iwithprefixbefore/mbed/platform/cxxsupport --iwithprefixbefore/mbed/platform/include --iwithprefixbefore/mbed/platform/include/platform --iwithprefixbefore/mbed/platform/include/platform/internal --iwithprefixbefore/mbed/platform/mbed-trace --iwithprefixbefore/mbed/platform/mbed-trace/include --iwithprefixbefore/mbed/platform/mbed-trace/include/mbed-trace --iwithprefixbefore/mbed/platform/randlib --iwithprefixbefore/mbed/platform/randlib/include --iwithprefixbefore/mbed/platform/randlib/include/mbed-client-randlib --iwithprefixbefore/mbed/platform/randlib/include/mbed-client-randlib/platform --iwithprefixbefore/mbed/platform/source --iwithprefixbefore/mbed/platform/source/minimal-printf --iwithprefixbefore/mbed/rtos --iwithprefixbefore/mbed/rtos/include --iwithprefixbefore/mbed/rtos/include/rtos --iwithprefixbefore/mbed/rtos/include/rtos/internal --iwithprefixbefore/mbed/rtos/source --iwithprefixbefore/mbed/storage --iwithprefixbefore/mbed/storage/blockdevice --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_FLASHIAP --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_FLASHIAP/include --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_FLASHIAP/include/FlashIAP --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_QSPIF --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_QSPIF/include --iwithprefixbefore/mbed/storage/blockdevice/COMPONENT_QSPIF/include/QSPIF --iwithprefixbefore/mbed/storage/blockdevice/include --iwithprefixbefore/mbed/storage/blockdevice/include/blockdevice --iwithprefixbefore/mbed/storage/blockdevice/include/blockdevice/internal --iwithprefixbefore/mbed/storage/filesystem --iwithprefixbefore/mbed/storage/filesystem/fat --iwithprefixbefore/mbed/storage/filesystem/fat/ChaN --iwithprefixbefore/mbed/storage/filesystem/fat/include --iwithprefixbefore/mbed/storage/filesystem/fat/include/fat --iwithprefixbefore/mbed/storage/filesystem/include --iwithprefixbefore/mbed/storage/filesystem/include/filesystem --iwithprefixbefore/mbed/storage/filesystem/littlefs --iwithprefixbefore/mbed/storage/filesystem/littlefs/include --iwithprefixbefore/mbed/storage/filesystem/littlefs/include/littlefs --iwithprefixbefore/mbed/storage/filesystem/littlefs/littlefs --iwithprefixbefore/mbed/storage/filesystem/littlefsv2 --iwithprefixbefore/mbed/storage/filesystem/littlefsv2/include --iwithprefixbefore/mbed/storage/filesystem/littlefsv2/include/littlefsv2 --iwithprefixbefore/mbed/storage/filesystem/littlefsv2/littlefs --iwithprefixbefore/mbed/storage/kvstore --iwithprefixbefore/mbed/storage/kvstore/direct_access_devicekey --iwithprefixbefore/mbed/storage/kvstore/direct_access_devicekey/include --iwithprefixbefore/mbed/storage/kvstore/direct_access_devicekey/include/direct_access_devicekey --iwithprefixbefore/mbed/storage/kvstore/filesystemstore --iwithprefixbefore/mbed/storage/kvstore/filesystemstore/include --iwithprefixbefore/mbed/storage/kvstore/filesystemstore/include/filesystemstore --iwithprefixbefore/mbed/storage/kvstore/include --iwithprefixbefore/mbed/storage/kvstore/include/kvstore --iwithprefixbefore/mbed/storage/kvstore/kv_config --iwithprefixbefore/mbed/storage/kvstore/kv_config/include --iwithprefixbefore/mbed/storage/kvstore/kv_config/include/kv_config --iwithprefixbefore/mbed/storage/kvstore/kvstore_global_api --iwithprefixbefore/mbed/storage/kvstore/kvstore_global_api/include --iwithprefixbefore/mbed/storage/kvstore/kvstore_global_api/include/kvstore_global_api --iwithprefixbefore/mbed/storage/kvstore/securestore --iwithprefixbefore/mbed/storage/kvstore/securestore/include --iwithprefixbefore/mbed/storage/kvstore/securestore/include/securestore --iwithprefixbefore/mbed/storage/kvstore/tdbstore --iwithprefixbefore/mbed/storage/kvstore/tdbstore/include --iwithprefixbefore/mbed/storage/kvstore/tdbstore/include/tdbstore --iwithprefixbefore/mbed/targets/TARGET_STM --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7 --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/CMSIS --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/STM32H7xx_HAL_Driver --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/STM32Cube_FW/STM32H7xx_HAL_Driver/Legacy --iwithprefixbefore/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_STM32H747xI_CM4 diff --git a/variants/GENERIC_STM32H747_M4/libs/libmbed.a b/variants/GENERIC_STM32H747_M4/libs/libmbed.a index 821d7694b..72951f8a2 100644 Binary files a/variants/GENERIC_STM32H747_M4/libs/libmbed.a and b/variants/GENERIC_STM32H747_M4/libs/libmbed.a differ diff --git a/variants/GENERIC_STM32H747_M4/linker_script.ld b/variants/GENERIC_STM32H747_M4/linker_script.ld index 4b66e7e26..207a6f162 100644 --- a/variants/GENERIC_STM32H747_M4/linker_script.ld +++ b/variants/GENERIC_STM32H747_M4/linker_script.ld @@ -1,9 +1,15 @@ MEMORY { FLASH (rx) : ORIGIN = CM4_BINARY_START, LENGTH = 0x100000 - RAM (rwx) : ORIGIN = 0x10000000 + (((166 * 4) + 7) & 0xFFFFFFF8), LENGTH = 0x48000 - (((166 * 4) + 7) & 0xFFFFFFF8) + RAM_D2 (rwx) : ORIGIN = 0x10000000 + (((166 * 4) + 7) & 0xFFFFFFF8), LENGTH = 0x48000 - (((166 * 4) + 7) & 0xFFFFFFF8) RAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 64K } +#if (CM4_BINARY_START == 0x60000000) + REGION_ALIAS("RAM", FLASH); + #else + REGION_ALIAS("RAM", RAM_D2); + #endif + __OPENAMP_region_start__ = 0x38000400; __OPENAMP_region_end__ = 0x38000400 + LENGTH(RAM_D3) - 1K; ENTRY(Reset_Handler) @@ -85,16 +91,11 @@ SECTIONS __bss_end__ = .; _ebss = .; } > RAM - .openamp_section (NOLOAD) : { - . = ABSOLUTE(0x38000000); - *(.resource_table) - } >RAM_D3 AT > FLASH - .pdm_section (NOLOAD) : { - . = ABSOLUTE(0x3800FC00); + .pdm_section 0x3800FC00 (NOLOAD): { *(.pdm_buffer) } > RAM_D3 - .heap (COPY): + .heap (NOLOAD): { __end__ = .; PROVIDE(end = .); @@ -102,7 +103,7 @@ SECTIONS . = ORIGIN(RAM) + LENGTH(RAM) - 0x400; __HeapLimit = .; } > RAM - .stack_dummy (COPY): + .stack_dummy (NOLOAD): { *(.stack*) } > RAM diff --git a/variants/GIGA/conf/mbed_app.json b/variants/GIGA/conf/mbed_app.json index 603807837..361a0ab94 100644 --- a/variants/GIGA/conf/mbed_app.json +++ b/variants/GIGA/conf/mbed_app.json @@ -11,12 +11,15 @@ "rtos.main-thread-stack-size": 32768, "cordio.max-connections": 5, "target.mbed_app_start": "0x8040000", + "nsapi.dns-response-wait-time": 5000, + "nsapi.dns-total-attempts": 3, + "lwip.raw-socket-enabled": true, "target.macros_add": [ "METAL_INTERNAL", - "VIRTIO_MASTER_ONLY", + "VIRTIO_DRIVER_ONLY", "NO_ATOMIC_64_SUPPORT", "METAL_MAX_DEVICE_REGIONS=2", - "RPMSG_BUFFER_SIZE=100" + "RPMSG_BUFFER_SIZE=512" ] } } diff --git a/variants/GIGA/defines.txt b/variants/GIGA/defines.txt index 53a08c42f..20ad512ab 100644 --- a/variants/GIGA/defines.txt +++ b/variants/GIGA/defines.txt @@ -44,7 +44,7 @@ -DFEATURE_BLE=1 -D__FPU_PRESENT=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1690447383.8050008 +-DMBED_BUILD_TIMESTAMP=1738678847.5982425 -D__MBED_CMSIS_RTOS_CM -DMBED_TICKLESS -DMBEDTLS_FS_IO @@ -53,7 +53,7 @@ -DMETAL_MAX_DEVICE_REGIONS=2 -DNO_ATOMIC_64_SUPPORT -DQSPI_NO_SAMPLE_SHIFT --DRPMSG_BUFFER_SIZE=100 +-DRPMSG_BUFFER_SIZE=512 -DSTM32H747xx -DTARGET_CORDIO -DTARGET_CORTEX @@ -78,7 +78,7 @@ -DTRANSACTION_QUEUE_SIZE_SPI=2 -DUSE_FULL_LL_DRIVER -DUSE_HAL_DRIVER --DVIRTIO_MASTER_ONLY +-DVIRTIO_DRIVER_ONLY -DMBED_NO_GLOBAL_USING_DIRECTIVE=1 -DCORE_MAJOR= -DCORE_MINOR= diff --git a/variants/GIGA/libs/libmbed.a b/variants/GIGA/libs/libmbed.a index 7b1e6bb8f..589bc11d9 100644 Binary files a/variants/GIGA/libs/libmbed.a and b/variants/GIGA/libs/libmbed.a differ diff --git a/variants/GIGA/linker_script.ld b/variants/GIGA/linker_script.ld index 8941b72a6..a0fdb9fcd 100644 --- a/variants/GIGA/linker_script.ld +++ b/variants/GIGA/linker_script.ld @@ -94,12 +94,7 @@ SECTIONS __bss_end__ = .; _ebss = .; } > RAM - .openamp_section (NOLOAD) : { - . = ABSOLUTE(0x38000000); - *(.resource_table) - } >RAM_D3 AT > FLASH - .pdm_section (NOLOAD) : { - . = ABSOLUTE(0x3800FC00); + .pdm_section 0x3800FC00 (NOLOAD): { *(.pdm_buffer) } > RAM_D3 _dtcm_lma = __etext + SIZEOF(.data); diff --git a/variants/GIGA/mbed_config.h b/variants/GIGA/mbed_config.h index 460ac941c..3133aa110 100644 --- a/variants/GIGA/mbed_config.h +++ b/variants/GIGA/mbed_config.h @@ -226,7 +226,7 @@ #define MBED_CONF_LWIP_PPP_IPV6_ENABLED 0 // set by library:lwip #define MBED_CONF_LWIP_PPP_THREAD_STACKSIZE 768 // set by library:lwip #define MBED_CONF_LWIP_PRESENT 1 // set by library:lwip -#define MBED_CONF_LWIP_RAW_SOCKET_ENABLED 0 // set by library:lwip +#define MBED_CONF_LWIP_RAW_SOCKET_ENABLED 1 // set by application[*] #define MBED_CONF_LWIP_SOCKET_MAX 4 // set by library:lwip #define MBED_CONF_LWIP_TCPIP_THREAD_PRIORITY osPriorityNormal // set by library:lwip #define MBED_CONF_LWIP_TCPIP_THREAD_STACKSIZE 1200 // set by library:lwip @@ -250,9 +250,9 @@ #define MBED_CONF_NSAPI_DEFAULT_WIFI_SECURITY NONE // set by library:nsapi #define MBED_CONF_NSAPI_DNS_ADDRESSES_LIMIT 10 // set by library:nsapi #define MBED_CONF_NSAPI_DNS_CACHE_SIZE 3 // set by library:nsapi -#define MBED_CONF_NSAPI_DNS_RESPONSE_WAIT_TIME 10000 // set by library:nsapi +#define MBED_CONF_NSAPI_DNS_RESPONSE_WAIT_TIME 5000 // set by application[*] #define MBED_CONF_NSAPI_DNS_RETRIES 1 // set by library:nsapi -#define MBED_CONF_NSAPI_DNS_TOTAL_ATTEMPTS 10 // set by library:nsapi +#define MBED_CONF_NSAPI_DNS_TOTAL_ATTEMPTS 3 // set by application[*] #define MBED_CONF_NSAPI_PRESENT 1 // set by library:nsapi #define MBED_CONF_NSAPI_SOCKET_STATS_ENABLED 0 // set by library:nsapi #define MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT 10 // set by library:nsapi diff --git a/variants/GIGA/pins_arduino.h b/variants/GIGA/pins_arduino.h index 740dfdc98..0a841debf 100644 --- a/variants/GIGA/pins_arduino.h +++ b/variants/GIGA/pins_arduino.h @@ -20,7 +20,7 @@ extern PinName digitalPinToPinName(pin_size_t P); // ---- #define PINS_COUNT (PINCOUNT_fn()) #define NUM_DIGITAL_PINS (103u) -#define NUM_ANALOG_INPUTS (14u) +#define NUM_ANALOG_INPUTS (10u) // these are analog pins that can also be used as digital #define NUM_ANALOG_OUTPUTS (2u) // LEDs diff --git a/variants/GIGA/pure_analog_pins.cpp b/variants/GIGA/pure_analog_pins.cpp index 5d17ddd75..40fc38db9 100644 --- a/variants/GIGA/pure_analog_pins.cpp +++ b/variants/GIGA/pure_analog_pins.cpp @@ -2,19 +2,20 @@ #include "AnalogIn.h" #include "pinDefinitions.h" -PureAnalogPin A8(8); -PureAnalogPin A9(9); -PureAnalogPin A10(10); -PureAnalogPin A11(11); +PureAnalogPin A8(0); +PureAnalogPin A9(1); +PureAnalogPin A10(2); +PureAnalogPin A11(3); + int getAnalogReadResolution(); int analogRead(PureAnalogPin pin) { - mbed::AnalogIn* adc = g_AAnalogPinDescription[pin.get()].adc; - auto name = g_AAnalogPinDescription[pin.get()].name; + mbed::AnalogIn* adc = g_pureAAnalogPinDescription[pin.get()].adc; + auto name = g_pureAAnalogPinDescription[pin.get()].name; if (adc == NULL) { adc = new mbed::AnalogIn(name); - g_AAnalogPinDescription[pin.get()].adc = adc; + g_pureAAnalogPinDescription[pin.get()].adc = adc; } return (adc->read_u16() >> (16 - getAnalogReadResolution())); } diff --git a/variants/GIGA/variant.cpp b/variants/GIGA/variant.cpp index 31038f320..ae8cae2d9 100644 --- a/variants/GIGA/variant.cpp +++ b/variants/GIGA/variant.cpp @@ -12,12 +12,15 @@ AnalogPinDescription g_AAnalogPinDescription[] = { { PC_2, NULL }, // A5 ADC1_INP12 { PC_0, NULL }, // A6 ADC1_INP10 { PA_0, NULL }, // A7 ADC1_INP16 + { PA_4, NULL }, // A12 DAC1_OUT1 + { PA_5, NULL }, // A13 DAC1_OUT2 +}; + +AnalogPinDescription g_pureAAnalogPinDescription[] = { { PC_2C, NULL }, // A8 ADC3_INP0 { PC_3C, NULL }, // A9 ADC3_INP1 { PA_1C, NULL }, // A10 ADC2_INP1 { PA_0C, NULL }, // A11 ADC2_INP0 - { PA_4, NULL }, // A12 DAC1_OUT1 - { PA_5, NULL }, // A13 DAC1_OUT2 }; AnalogPinDescription g_AAnalogOutPinDescription[] = { diff --git a/variants/NANO_RP2040_CONNECT/conf/mbed_app.json b/variants/NANO_RP2040_CONNECT/conf/mbed_app.json index 839285b81..8cd4676b8 100644 --- a/variants/NANO_RP2040_CONNECT/conf/mbed_app.json +++ b/variants/NANO_RP2040_CONNECT/conf/mbed_app.json @@ -2,7 +2,7 @@ "target_overrides": { "*": { "target.printf_lib": "std", - "target.macros_add": [ "MBEDTLS_ENTROPY_NV_SEED" ], + "target.macros_add": [ "MBEDTLS_ENTROPY_NV_SEED", "UNINITIALIZED_DATA_SECTION=1" ], "platform.stdio-buffered-serial": false, "platform.stdio-baud-rate": 115200, "platform.default-serial-baud-rate": 115200, diff --git a/variants/NANO_RP2040_CONNECT/defines.txt b/variants/NANO_RP2040_CONNECT/defines.txt index 85f8bdb41..e4f955eb0 100644 --- a/variants/NANO_RP2040_CONNECT/defines.txt +++ b/variants/NANO_RP2040_CONNECT/defines.txt @@ -16,11 +16,12 @@ -DDEVICE_SERIAL=1 -DDEVICE_SERIAL_FC=1 -DDEVICE_SPI=1 +-DDEVICE_TRNG=1 -DDEVICE_USBDEVICE=1 -DDEVICE_USTICKER=1 -DDEVICE_WATCHDOG=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1690446969.4415529 +-DMBED_BUILD_TIMESTAMP=1738678431.5907538 -D__MBED_CMSIS_RTOS_CM -DMBED_MPU_CUSTOM -DMBEDTLS_ENTROPY_NV_SEED @@ -43,6 +44,7 @@ -DTARGET_RP2040 -DTOOLCHAIN_GCC -DTOOLCHAIN_GCC_ARM +-DUNINITIALIZED_DATA_SECTION=1 -DMBED_NO_GLOBAL_USING_DIRECTIVE=1 -DCORE_MAJOR= -DCORE_MINOR= diff --git a/variants/NANO_RP2040_CONNECT/includes.txt b/variants/NANO_RP2040_CONNECT/includes.txt index d84e91a12..dbd89c569 100644 --- a/variants/NANO_RP2040_CONNECT/includes.txt +++ b/variants/NANO_RP2040_CONNECT/includes.txt @@ -325,6 +325,9 @@ -iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_platform -iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_platform/include -iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_platform/include/pico +-iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand +-iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/include +-iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/include/pico -iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_runtime -iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_runtime/include -iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_runtime/include/pico diff --git a/variants/NANO_RP2040_CONNECT/libs/libmbed.a b/variants/NANO_RP2040_CONNECT/libs/libmbed.a index 276e5d120..475e6e096 100644 Binary files a/variants/NANO_RP2040_CONNECT/libs/libmbed.a and b/variants/NANO_RP2040_CONNECT/libs/libmbed.a differ diff --git a/variants/NANO_RP2040_CONNECT/linker_script.ld b/variants/NANO_RP2040_CONNECT/linker_script.ld index 02fc23730..a96cf5167 100644 --- a/variants/NANO_RP2040_CONNECT/linker_script.ld +++ b/variants/NANO_RP2040_CONNECT/linker_script.ld @@ -8,12 +8,12 @@ MEMORY ENTRY(_entry_point) SECTIONS { - .second_stage_ota : { - KEEP (*(.second_stage_ota)) - } > FLASH .flash_begin : { __flash_binary_start = .; } > FLASH + .second_stage_ota : { + KEEP (*(.second_stage_ota)) + } > FLASH .boot2 : { __boot2_start__ = .; KEEP (*(.boot2)) @@ -104,7 +104,9 @@ SECTIONS } > RAM AT> FLASH .uninitialized_data (COPY): { . = ALIGN(4); + __uninitialized_data_start__ = .; *(.uninitialized_data*) + __uninitialized_data_end__ = .; } > RAM .scratch_x : { __scratch_x_start__ = .; diff --git a/variants/NICLA/defines.txt b/variants/NICLA/defines.txt index 954f8bbbe..2c2321141 100644 --- a/variants/NICLA/defines.txt +++ b/variants/NICLA/defines.txt @@ -33,7 +33,7 @@ -DFEATURE_BLE=1 -D__FPU_PRESENT=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1690447190.2057042 +-DMBED_BUILD_TIMESTAMP=1738678686.654947 -D__MBED_CMSIS_RTOS_CM -DMBED_MPU_CUSTOM -DMBED_TICKLESS diff --git a/variants/NICLA/libs/libmbed.a b/variants/NICLA/libs/libmbed.a index 3033bd740..3cd144aff 100644 Binary files a/variants/NICLA/libs/libmbed.a and b/variants/NICLA/libs/libmbed.a differ diff --git a/variants/NICLA_VISION/conf/custom_mbedtls_config.h b/variants/NICLA_VISION/conf/custom_mbedtls_config.h index cfea49137..c2a399cc2 100644 --- a/variants/NICLA_VISION/conf/custom_mbedtls_config.h +++ b/variants/NICLA_VISION/conf/custom_mbedtls_config.h @@ -186,7 +186,7 @@ void * tstDoTraceAndCalloc( * mbedtls_platform_gmtime_r() at compile-time by using the macro * MBEDTLS_PLATFORM_GMTIME_R_ALT. */ -#define MBEDTLS_HAVE_TIME_DATE +//#define MBEDTLS_HAVE_TIME_DATE /** * \def MBEDTLS_PLATFORM_MEMORY @@ -1163,7 +1163,7 @@ void * tstDoTraceAndCalloc( * * Enable functions that use the filesystem. */ -#define MBEDTLS_FS_IO +//#define MBEDTLS_FS_IO /** * \def MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES @@ -2770,7 +2770,7 @@ void * tstDoTraceAndCalloc( * on it, and considering stronger message digests instead. * */ -#define MBEDTLS_SHA1_C +//#define MBEDTLS_SHA1_C /** * \def MBEDTLS_SHA256_C diff --git a/variants/NICLA_VISION/conf/mbed_app.json b/variants/NICLA_VISION/conf/mbed_app.json index 405307426..f3227a71f 100644 --- a/variants/NICLA_VISION/conf/mbed_app.json +++ b/variants/NICLA_VISION/conf/mbed_app.json @@ -12,12 +12,15 @@ "rtos.main-thread-stack-size": 32768, "cordio.max-connections": 5, "target.mbed_app_start": "0x8040000", + "nsapi.dns-response-wait-time": 5000, + "nsapi.dns-total-attempts": 3, + "lwip.raw-socket-enabled": true, "target.macros_add": [ "METAL_INTERNAL", - "VIRTIO_MASTER_ONLY", + "VIRTIO_DRIVER_ONLY", "NO_ATOMIC_64_SUPPORT", "METAL_MAX_DEVICE_REGIONS=2", - "RPMSG_BUFFER_SIZE=100" + "RPMSG_BUFFER_SIZE=512" ] } } diff --git a/variants/NICLA_VISION/defines.txt b/variants/NICLA_VISION/defines.txt index 8e73def76..6e2d9a947 100644 --- a/variants/NICLA_VISION/defines.txt +++ b/variants/NICLA_VISION/defines.txt @@ -45,7 +45,7 @@ -DFLOW_SILENT -D__FPU_PRESENT=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1690447224.0712476 +-DMBED_BUILD_TIMESTAMP=1738678724.8386328 -D__MBED_CMSIS_RTOS_CM -DMBED_TICKLESS -DMBEDTLS_FS_IO @@ -54,7 +54,7 @@ -DMETAL_MAX_DEVICE_REGIONS=2 -DNO_ATOMIC_64_SUPPORT -DQSPI_NO_SAMPLE_SHIFT --DRPMSG_BUFFER_SIZE=100 +-DRPMSG_BUFFER_SIZE=512 -DSTM32H747xx -DT1oI2C -DT1oI2C_UM11225 @@ -81,7 +81,7 @@ -DTRANSACTION_QUEUE_SIZE_SPI=2 -DUSE_FULL_LL_DRIVER -DUSE_HAL_DRIVER --DVIRTIO_MASTER_ONLY +-DVIRTIO_DRIVER_ONLY -DMBED_NO_GLOBAL_USING_DIRECTIVE=1 -DCORE_MAJOR= -DCORE_MINOR= diff --git a/variants/NICLA_VISION/libs/libmbed.a b/variants/NICLA_VISION/libs/libmbed.a index 66947671c..c6991a257 100644 Binary files a/variants/NICLA_VISION/libs/libmbed.a and b/variants/NICLA_VISION/libs/libmbed.a differ diff --git a/variants/NICLA_VISION/linker_script.ld b/variants/NICLA_VISION/linker_script.ld index 0b00d41d9..c681810c5 100644 --- a/variants/NICLA_VISION/linker_script.ld +++ b/variants/NICLA_VISION/linker_script.ld @@ -94,12 +94,7 @@ SECTIONS __bss_end__ = .; _ebss = .; } > RAM - .openamp_section (NOLOAD) : { - . = ABSOLUTE(0x38000000); - *(.resource_table) - } >RAM_D3 AT > FLASH - .pdm_section (NOLOAD) : { - . = ABSOLUTE(0x3800FC00); + .pdm_section 0x3800FC00 (NOLOAD): { *(.pdm_buffer) } > RAM_D3 diff --git a/variants/NICLA_VISION/mbed_config.h b/variants/NICLA_VISION/mbed_config.h index ed8376f00..d4ec859a3 100644 --- a/variants/NICLA_VISION/mbed_config.h +++ b/variants/NICLA_VISION/mbed_config.h @@ -226,7 +226,7 @@ #define MBED_CONF_LWIP_PPP_IPV6_ENABLED 0 // set by library:lwip #define MBED_CONF_LWIP_PPP_THREAD_STACKSIZE 768 // set by library:lwip #define MBED_CONF_LWIP_PRESENT 1 // set by library:lwip -#define MBED_CONF_LWIP_RAW_SOCKET_ENABLED 0 // set by library:lwip +#define MBED_CONF_LWIP_RAW_SOCKET_ENABLED 1 // set by application[*] #define MBED_CONF_LWIP_SOCKET_MAX 4 // set by library:lwip #define MBED_CONF_LWIP_TCPIP_THREAD_PRIORITY osPriorityNormal // set by library:lwip #define MBED_CONF_LWIP_TCPIP_THREAD_STACKSIZE 1200 // set by library:lwip @@ -250,9 +250,9 @@ #define MBED_CONF_NSAPI_DEFAULT_WIFI_SECURITY NONE // set by library:nsapi #define MBED_CONF_NSAPI_DNS_ADDRESSES_LIMIT 10 // set by library:nsapi #define MBED_CONF_NSAPI_DNS_CACHE_SIZE 3 // set by library:nsapi -#define MBED_CONF_NSAPI_DNS_RESPONSE_WAIT_TIME 10000 // set by library:nsapi +#define MBED_CONF_NSAPI_DNS_RESPONSE_WAIT_TIME 5000 // set by application[*] #define MBED_CONF_NSAPI_DNS_RETRIES 1 // set by library:nsapi -#define MBED_CONF_NSAPI_DNS_TOTAL_ATTEMPTS 10 // set by library:nsapi +#define MBED_CONF_NSAPI_DNS_TOTAL_ATTEMPTS 3 // set by application[*] #define MBED_CONF_NSAPI_PRESENT 1 // set by library:nsapi #define MBED_CONF_NSAPI_SOCKET_STATS_ENABLED 0 // set by library:nsapi #define MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT 10 // set by library:nsapi diff --git a/variants/NICLA_VISION/pins_arduino.h b/variants/NICLA_VISION/pins_arduino.h index 8046d39a1..b6aac6221 100644 --- a/variants/NICLA_VISION/pins_arduino.h +++ b/variants/NICLA_VISION/pins_arduino.h @@ -60,12 +60,12 @@ static const uint8_t A2 = PIN_A2; #define D13 (13u) #define D14 (14u) #define D15 (15u) -#define D16 (u16) -#define D17 (u17) -#define D18 (u18) -#define D19 (u19) -#define D20 (u20) -#define D21 (u21) +#define D16 (16u) +#define D17 (17u) +#define D18 (18u) +#define D19 (19u) +#define D20 (20u) +#define D21 (21u) // Serial #define PIN_SERIAL_RX (2ul) diff --git a/variants/OPTA/conf/mbed_app.json b/variants/OPTA/conf/mbed_app.json index 603807837..361a0ab94 100644 --- a/variants/OPTA/conf/mbed_app.json +++ b/variants/OPTA/conf/mbed_app.json @@ -11,12 +11,15 @@ "rtos.main-thread-stack-size": 32768, "cordio.max-connections": 5, "target.mbed_app_start": "0x8040000", + "nsapi.dns-response-wait-time": 5000, + "nsapi.dns-total-attempts": 3, + "lwip.raw-socket-enabled": true, "target.macros_add": [ "METAL_INTERNAL", - "VIRTIO_MASTER_ONLY", + "VIRTIO_DRIVER_ONLY", "NO_ATOMIC_64_SUPPORT", "METAL_MAX_DEVICE_REGIONS=2", - "RPMSG_BUFFER_SIZE=100" + "RPMSG_BUFFER_SIZE=512" ] } } diff --git a/variants/OPTA/defines.txt b/variants/OPTA/defines.txt index 970b3bc5d..76b04861f 100644 --- a/variants/OPTA/defines.txt +++ b/variants/OPTA/defines.txt @@ -44,7 +44,7 @@ -DFEATURE_BLE=1 -D__FPU_PRESENT=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1690447327.7181125 +-DMBED_BUILD_TIMESTAMP=1738678787.2016976 -D__MBED_CMSIS_RTOS_CM -DMBED_TICKLESS -DMBEDTLS_FS_IO @@ -53,7 +53,7 @@ -DMETAL_MAX_DEVICE_REGIONS=2 -DNO_ATOMIC_64_SUPPORT -DQSPI_NO_SAMPLE_SHIFT --DRPMSG_BUFFER_SIZE=100 +-DRPMSG_BUFFER_SIZE=512 -DSTM32H747xx -DTARGET_CORDIO -DTARGET_CORTEX @@ -78,7 +78,7 @@ -DTRANSACTION_QUEUE_SIZE_SPI=2 -DUSE_FULL_LL_DRIVER -DUSE_HAL_DRIVER --DVIRTIO_MASTER_ONLY +-DVIRTIO_DRIVER_ONLY -DMBED_NO_GLOBAL_USING_DIRECTIVE=1 -DCORE_MAJOR= -DCORE_MINOR= diff --git a/variants/OPTA/libs/libmbed.a b/variants/OPTA/libs/libmbed.a index aec91ccba..0dd368bf8 100644 Binary files a/variants/OPTA/libs/libmbed.a and b/variants/OPTA/libs/libmbed.a differ diff --git a/variants/OPTA/linker_script.ld b/variants/OPTA/linker_script.ld index 8941b72a6..a0fdb9fcd 100644 --- a/variants/OPTA/linker_script.ld +++ b/variants/OPTA/linker_script.ld @@ -94,12 +94,7 @@ SECTIONS __bss_end__ = .; _ebss = .; } > RAM - .openamp_section (NOLOAD) : { - . = ABSOLUTE(0x38000000); - *(.resource_table) - } >RAM_D3 AT > FLASH - .pdm_section (NOLOAD) : { - . = ABSOLUTE(0x3800FC00); + .pdm_section 0x3800FC00 (NOLOAD): { *(.pdm_buffer) } > RAM_D3 _dtcm_lma = __etext + SIZEOF(.data); diff --git a/variants/OPTA/mbed_config.h b/variants/OPTA/mbed_config.h index c0485cbf8..4b6d57eaa 100644 --- a/variants/OPTA/mbed_config.h +++ b/variants/OPTA/mbed_config.h @@ -226,7 +226,7 @@ #define MBED_CONF_LWIP_PPP_IPV6_ENABLED 0 // set by library:lwip #define MBED_CONF_LWIP_PPP_THREAD_STACKSIZE 768 // set by library:lwip #define MBED_CONF_LWIP_PRESENT 1 // set by library:lwip -#define MBED_CONF_LWIP_RAW_SOCKET_ENABLED 0 // set by library:lwip +#define MBED_CONF_LWIP_RAW_SOCKET_ENABLED 1 // set by application[*] #define MBED_CONF_LWIP_SOCKET_MAX 4 // set by library:lwip #define MBED_CONF_LWIP_TCPIP_THREAD_PRIORITY osPriorityNormal // set by library:lwip #define MBED_CONF_LWIP_TCPIP_THREAD_STACKSIZE 1200 // set by library:lwip @@ -250,9 +250,9 @@ #define MBED_CONF_NSAPI_DEFAULT_WIFI_SECURITY NONE // set by library:nsapi #define MBED_CONF_NSAPI_DNS_ADDRESSES_LIMIT 10 // set by library:nsapi #define MBED_CONF_NSAPI_DNS_CACHE_SIZE 3 // set by library:nsapi -#define MBED_CONF_NSAPI_DNS_RESPONSE_WAIT_TIME 10000 // set by library:nsapi +#define MBED_CONF_NSAPI_DNS_RESPONSE_WAIT_TIME 5000 // set by application[*] #define MBED_CONF_NSAPI_DNS_RETRIES 1 // set by library:nsapi -#define MBED_CONF_NSAPI_DNS_TOTAL_ATTEMPTS 10 // set by library:nsapi +#define MBED_CONF_NSAPI_DNS_TOTAL_ATTEMPTS 3 // set by application[*] #define MBED_CONF_NSAPI_PRESENT 1 // set by library:nsapi #define MBED_CONF_NSAPI_SOCKET_STATS_ENABLED 0 // set by library:nsapi #define MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT 10 // set by library:nsapi diff --git a/variants/OPTA/pins_arduino.h b/variants/OPTA/pins_arduino.h index 25d6e8c06..107190dc8 100644 --- a/variants/OPTA/pins_arduino.h +++ b/variants/OPTA/pins_arduino.h @@ -68,6 +68,16 @@ static const uint8_t A6 = PIN_A6; static const uint8_t A7 = PIN_A7; #define ADC_RESOLUTION 12 +// Pin mapping to match serigraphy +static const uint8_t I1 = PIN_A0; +static const uint8_t I2 = PIN_A1; +static const uint8_t I3 = PIN_A2; +static const uint8_t I4 = PIN_A3; +static const uint8_t I5 = PIN_A4; +static const uint8_t I6 = PIN_A5; +static const uint8_t I7 = PIN_A6; +static const uint8_t I8 = PIN_A7; + // Digital pins // ----------- #define D0 (0u) @@ -148,6 +158,7 @@ static const uint8_t SCK = PIN_SPI_SCK; // Use these only if bootloader data is not available / valid #define _BOARD_VENDORID 0x2341 #define _BOARD_PRODUCTID 0x0264 + uint16_t _getVid_(); uint16_t _getPid_(); diff --git a/variants/OPTA/variant.cpp b/variants/OPTA/variant.cpp index db175d0af..93b796e88 100644 --- a/variants/OPTA/variant.cpp +++ b/variants/OPTA/variant.cpp @@ -253,7 +253,7 @@ class SecureQSPIFBlockDevice: public QSPIFBlockDevice { #if 1 // 256byte secure OTP area (on AT25SF128A) -// TODO: could be imcomplete, to be tested +// TODO: could be incomplete, to be tested class SecureQSPIFBlockDevice: public QSPIFBlockDevice { public: virtual int readSecure(void *buffer, mbed::bd_addr_t addr, mbed::bd_size_t size) { @@ -263,9 +263,15 @@ class SecureQSPIFBlockDevice: public QSPIFBlockDevice { } virtual int programSecure(void *buffer, mbed::bd_addr_t addr, mbed::bd_size_t size) { // like normal program with 42h + + // avoid warning: no return statement in function returning non-void [-Wreturn-type] + return 0; } virtual int eraseSecure(void *buffer, mbed::bd_addr_t addr, mbed::bd_size_t size) { // like normal program with 44h + + // avoid: warning: no return statement in function returning non-void [-Wreturn-type] + return 0; } }; #endif @@ -277,21 +283,28 @@ static bool has_otp_info = false; bool getSecureFlashData() { static OptaBoardInfo info; - uint8_t temp_buf[sizeof(OptaBoardInfo) + 1]; - int ret = 0; - static SecureQSPIFBlockDevice secure_root; - secure_root.init(); - // read secure sector 2 ( address 1 << 13 ) - ret = secure_root.readSecure(temp_buf, (1 << 13), sizeof(temp_buf)); + char temp_buf[sizeof(OptaBoardInfo) + 1]; + int ret = QSPI_STATUS_OK; + mbed::QSPI _qspi(QSPI_FLASH1_IO0, QSPI_FLASH1_IO1, QSPI_FLASH1_IO2, QSPI_FLASH1_IO3, QSPI_FLASH1_SCK, QSPI_FLASH1_CSN, QSPIF_POLARITY_MODE_0); + auto rxlen = sizeof(temp_buf); + ret = _qspi.read(0x48, -1, 1 << 13, temp_buf, &rxlen); memcpy(&info, &temp_buf[1], sizeof(OptaBoardInfo)); if (info.magic == OTP_QSPI_MAGIC) { _boardInfo = (uint8_t*)&info; has_otp_info = true; } - secure_root.deinit(); - return ret == 0; + return ret == QSPI_STATUS_OK; } +class SecureQSPIReader { +public: + SecureQSPIReader() { + getSecureFlashData(); + } +}; + +SecureQSPIReader __reader __attribute__ ((init_priority (101))); + uint8_t* boardInfo() { return _boardInfo; } @@ -300,26 +313,19 @@ uint16_t boardRevision() { return (((OptaBoardInfo*)_boardInfo)->revision); } +#ifndef FIRST_PROGRAMMING uint16_t _getVid_() { -#ifdef FIRST_PROGRAMMING - return _BOARD_VENDORID; -#else if (!has_otp_info) { getSecureFlashData(); } return ((OptaBoardInfo*)_boardInfo)->vid; -#endif } uint16_t _getPid_() { -#ifdef FIRST_PROGRAMMING - return _BOARD_PRODUCTID; -#else if (!has_otp_info) { getSecureFlashData(); } return ((OptaBoardInfo*)_boardInfo)->pid; -#endif } uint8_t _getSecureEthMac_(uint8_t *mac_address) { @@ -336,6 +342,7 @@ uint8_t mbed_otp_mac_address(char *mac) auto ret = _getSecureEthMac_(reinterpret_cast(mac)); return ret; } +#endif #define BOARD_REVISION(x,y) (x << 8 | y) diff --git a/variants/PORTENTA_H7_M7/conf/mbed_app.json b/variants/PORTENTA_H7_M7/conf/mbed_app.json index 5ac9c9bb7..fbf702dd2 100644 --- a/variants/PORTENTA_H7_M7/conf/mbed_app.json +++ b/variants/PORTENTA_H7_M7/conf/mbed_app.json @@ -15,14 +15,17 @@ "cellular.at-handler-buffer-size": 512, "mbed-trace.enable": true, "target.mbed_app_start": "0x8040000", + "nsapi.dns-response-wait-time": 5000, + "nsapi.dns-total-attempts": 3, + "lwip.raw-socket-enabled": true, "target.macros_add": [ "BT_UART_NO_3M_SUPPORT", "USB_DYNAMIC_CONFIGURATION", "METAL_INTERNAL", - "VIRTIO_MASTER_ONLY", + "VIRTIO_DRIVER_ONLY", "NO_ATOMIC_64_SUPPORT", "METAL_MAX_DEVICE_REGIONS=2", - "RPMSG_BUFFER_SIZE=2048", + "RPMSG_BUFFER_SIZE=512", "LSE_STARTUP_TIMEOUT=200" ] } diff --git a/variants/PORTENTA_H7_M7/defines.txt b/variants/PORTENTA_H7_M7/defines.txt index d4eec2164..24f4526bd 100644 --- a/variants/PORTENTA_H7_M7/defines.txt +++ b/variants/PORTENTA_H7_M7/defines.txt @@ -46,7 +46,7 @@ -D__FPU_PRESENT=1 -DLSE_STARTUP_TIMEOUT=200 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1690447044.864524 +-DMBED_BUILD_TIMESTAMP=1738678521.1974137 -D__MBED_CMSIS_RTOS_CM -DMBED_TICKLESS -DMBEDTLS_FS_IO @@ -55,7 +55,7 @@ -DMETAL_MAX_DEVICE_REGIONS=2 -DNO_ATOMIC_64_SUPPORT -DQSPI_NO_SAMPLE_SHIFT --DRPMSG_BUFFER_SIZE=2048 +-DRPMSG_BUFFER_SIZE=512 -DSTM32H747xx -DTARGET_CORDIO -DTARGET_CORTEX @@ -81,7 +81,7 @@ -DUSB_DYNAMIC_CONFIGURATION -DUSE_FULL_LL_DRIVER -DUSE_HAL_DRIVER --DVIRTIO_MASTER_ONLY +-DVIRTIO_DRIVER_ONLY -DMBED_NO_GLOBAL_USING_DIRECTIVE=1 -DCORE_MAJOR= -DCORE_MINOR= diff --git a/variants/PORTENTA_H7_M7/libs/libmbed.a b/variants/PORTENTA_H7_M7/libs/libmbed.a index d262766d7..286f51da4 100644 Binary files a/variants/PORTENTA_H7_M7/libs/libmbed.a and b/variants/PORTENTA_H7_M7/libs/libmbed.a differ diff --git a/variants/PORTENTA_H7_M7/linker_script.ld b/variants/PORTENTA_H7_M7/linker_script.ld index 8941b72a6..a0fdb9fcd 100644 --- a/variants/PORTENTA_H7_M7/linker_script.ld +++ b/variants/PORTENTA_H7_M7/linker_script.ld @@ -94,12 +94,7 @@ SECTIONS __bss_end__ = .; _ebss = .; } > RAM - .openamp_section (NOLOAD) : { - . = ABSOLUTE(0x38000000); - *(.resource_table) - } >RAM_D3 AT > FLASH - .pdm_section (NOLOAD) : { - . = ABSOLUTE(0x3800FC00); + .pdm_section 0x3800FC00 (NOLOAD): { *(.pdm_buffer) } > RAM_D3 _dtcm_lma = __etext + SIZEOF(.data); diff --git a/variants/PORTENTA_H7_M7/mbed_config.h b/variants/PORTENTA_H7_M7/mbed_config.h index a6f5ffd53..0bdce3566 100644 --- a/variants/PORTENTA_H7_M7/mbed_config.h +++ b/variants/PORTENTA_H7_M7/mbed_config.h @@ -227,7 +227,7 @@ #define MBED_CONF_LWIP_PPP_IPV6_ENABLED 0 // set by library:lwip #define MBED_CONF_LWIP_PPP_THREAD_STACKSIZE 768 // set by library:lwip #define MBED_CONF_LWIP_PRESENT 1 // set by library:lwip -#define MBED_CONF_LWIP_RAW_SOCKET_ENABLED 0 // set by library:lwip +#define MBED_CONF_LWIP_RAW_SOCKET_ENABLED 1 // set by application[*] #define MBED_CONF_LWIP_SOCKET_MAX 4 // set by library:lwip #define MBED_CONF_LWIP_TCPIP_THREAD_PRIORITY osPriorityNormal // set by library:lwip #define MBED_CONF_LWIP_TCPIP_THREAD_STACKSIZE 1200 // set by library:lwip @@ -252,9 +252,9 @@ #define MBED_CONF_NSAPI_DEFAULT_WIFI_SECURITY NONE // set by library:nsapi #define MBED_CONF_NSAPI_DNS_ADDRESSES_LIMIT 10 // set by library:nsapi #define MBED_CONF_NSAPI_DNS_CACHE_SIZE 3 // set by library:nsapi -#define MBED_CONF_NSAPI_DNS_RESPONSE_WAIT_TIME 10000 // set by library:nsapi +#define MBED_CONF_NSAPI_DNS_RESPONSE_WAIT_TIME 5000 // set by application[*] #define MBED_CONF_NSAPI_DNS_RETRIES 1 // set by library:nsapi -#define MBED_CONF_NSAPI_DNS_TOTAL_ATTEMPTS 10 // set by library:nsapi +#define MBED_CONF_NSAPI_DNS_TOTAL_ATTEMPTS 3 // set by application[*] #define MBED_CONF_NSAPI_PRESENT 1 // set by library:nsapi #define MBED_CONF_NSAPI_SOCKET_STATS_ENABLED 0 // set by library:nsapi #define MBED_CONF_NSAPI_SOCKET_STATS_MAX_COUNT 10 // set by library:nsapi diff --git a/variants/PORTENTA_H7_M7/variant.cpp b/variants/PORTENTA_H7_M7/variant.cpp index 83e800c49..f5c2d7127 100644 --- a/variants/PORTENTA_H7_M7/variant.cpp +++ b/variants/PORTENTA_H7_M7/variant.cpp @@ -10,7 +10,7 @@ AnalogPinDescription g_AAnalogPinDescription[] = { { PC_2C, NULL }, // A2 ADC3_INP0 { PC_3C, NULL }, // A3 ADC3_INP1 { PC_2_ALT0, NULL }, // A4 ADC1_INP12 - { PC_3_ALT2, NULL }, // A5 ADC2_INP13 + { PC_3_ALT0, NULL }, // A5 ADC2_INP13 { PA_4, NULL }, // A6 ADC1_INP18 { PA_6, NULL } // A7 ADC1_INP7 }; diff --git a/variants/PORTENTA_X8/conf/mbed_app.json b/variants/PORTENTA_X8/conf/mbed_app.json index 08b653062..ca2ce1071 100644 --- a/variants/PORTENTA_X8/conf/mbed_app.json +++ b/variants/PORTENTA_X8/conf/mbed_app.json @@ -13,11 +13,11 @@ "target.macros_add": [ "NO_VTOR_RELOCATE", "METAL_INTERNAL", - "VIRTIO_SLAVE_ONLY", + "VIRTIO_DEVICE_ONLY", "NO_ATOMIC_64_SUPPORT", "METAL_MAX_DEVICE_REGIONS=2", - "RPMSG_BUFFER_SIZE=2048" + "RPMSG_BUFFER_SIZE=512" ] } } -} \ No newline at end of file +} diff --git a/variants/PORTENTA_X8/defines.txt b/variants/PORTENTA_X8/defines.txt index 7541674f7..84f8e1a24 100644 --- a/variants/PORTENTA_X8/defines.txt +++ b/variants/PORTENTA_X8/defines.txt @@ -34,7 +34,7 @@ -DEXTRA_IDLE_STACK_REQUIRED -D__FPU_PRESENT=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1690447283.7087135 +-DMBED_BUILD_TIMESTAMP=1738678907.604638 -D__MBED_CMSIS_RTOS_CM -DMBED_MPU_CUSTOM -DMBED_TICKLESS @@ -44,7 +44,7 @@ -DMETAL_MAX_DEVICE_REGIONS=2 -DNO_ATOMIC_64_SUPPORT -DNO_VTOR_RELOCATE --DRPMSG_BUFFER_SIZE=2048 +-DRPMSG_BUFFER_SIZE=512 -DSTM32H747xx -DTARGET_CORTEX -DTARGET_CORTEX_M @@ -68,7 +68,7 @@ -DTRANSACTION_QUEUE_SIZE_SPI=2 -DUSE_FULL_LL_DRIVER -DUSE_HAL_DRIVER --DVIRTIO_SLAVE_ONLY +-DVIRTIO_DEVICE_ONLY -DMBED_NO_GLOBAL_USING_DIRECTIVE=1 -DCORE_MAJOR= -DCORE_MINOR= diff --git a/variants/PORTENTA_X8/libs/libmbed.a b/variants/PORTENTA_X8/libs/libmbed.a index 7d9dd3a47..f97d15a42 100644 Binary files a/variants/PORTENTA_X8/libs/libmbed.a and b/variants/PORTENTA_X8/libs/libmbed.a differ diff --git a/variants/PORTENTA_X8/linker_script.ld b/variants/PORTENTA_X8/linker_script.ld index 4b66e7e26..e38e2df60 100644 --- a/variants/PORTENTA_X8/linker_script.ld +++ b/variants/PORTENTA_X8/linker_script.ld @@ -1,9 +1,10 @@ MEMORY { FLASH (rx) : ORIGIN = CM4_BINARY_START, LENGTH = 0x100000 - RAM (rwx) : ORIGIN = 0x10000000 + (((166 * 4) + 7) & 0xFFFFFFF8), LENGTH = 0x48000 - (((166 * 4) + 7) & 0xFFFFFFF8) + RAM_D2 (rwx) : ORIGIN = 0x10000000 + (((166 * 4) + 7) & 0xFFFFFFF8), LENGTH = 0x48000 - (((166 * 4) + 7) & 0xFFFFFFF8) RAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 64K } +REGION_ALIAS("RAM", RAM_D2); __OPENAMP_region_start__ = 0x38000400; __OPENAMP_region_end__ = 0x38000400 + LENGTH(RAM_D3) - 1K; ENTRY(Reset_Handler) @@ -85,12 +86,7 @@ SECTIONS __bss_end__ = .; _ebss = .; } > RAM - .openamp_section (NOLOAD) : { - . = ABSOLUTE(0x38000000); - *(.resource_table) - } >RAM_D3 AT > FLASH - .pdm_section (NOLOAD) : { - . = ABSOLUTE(0x3800FC00); + .pdm_section 0x3800FC00 (NOLOAD): { *(.pdm_buffer) } > RAM_D3 diff --git a/variants/RASPBERRY_PI_PICO/defines.txt b/variants/RASPBERRY_PI_PICO/defines.txt index 15fb053eb..145819bb8 100644 --- a/variants/RASPBERRY_PI_PICO/defines.txt +++ b/variants/RASPBERRY_PI_PICO/defines.txt @@ -16,11 +16,12 @@ -DDEVICE_SERIAL=1 -DDEVICE_SERIAL_FC=1 -DDEVICE_SPI=1 +-DDEVICE_TRNG=1 -DDEVICE_USBDEVICE=1 -DDEVICE_USTICKER=1 -DDEVICE_WATCHDOG=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1690447021.82633 +-DMBED_BUILD_TIMESTAMP=1738678494.5493546 -D__MBED_CMSIS_RTOS_CM -DMBED_MPU_CUSTOM -DMBEDTLS_ENTROPY_NV_SEED diff --git a/variants/RASPBERRY_PI_PICO/includes.txt b/variants/RASPBERRY_PI_PICO/includes.txt index ec0bfda37..3e7ea4eca 100644 --- a/variants/RASPBERRY_PI_PICO/includes.txt +++ b/variants/RASPBERRY_PI_PICO/includes.txt @@ -325,6 +325,9 @@ -iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_platform -iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_platform/include -iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_platform/include/pico +-iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand +-iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/include +-iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_rand/include/pico -iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_runtime -iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_runtime/include -iwithprefixbefore/mbed/targets/TARGET_RASPBERRYPI/TARGET_RP2040/pico-sdk/rp2_common/pico_runtime/include/pico diff --git a/variants/RASPBERRY_PI_PICO/libs/libmbed.a b/variants/RASPBERRY_PI_PICO/libs/libmbed.a index 78edaa82d..1075eec8e 100644 Binary files a/variants/RASPBERRY_PI_PICO/libs/libmbed.a and b/variants/RASPBERRY_PI_PICO/libs/libmbed.a differ diff --git a/variants/RASPBERRY_PI_PICO/linker_script.ld b/variants/RASPBERRY_PI_PICO/linker_script.ld index 6aad4a2ab..38608120e 100644 --- a/variants/RASPBERRY_PI_PICO/linker_script.ld +++ b/variants/RASPBERRY_PI_PICO/linker_script.ld @@ -11,6 +11,9 @@ SECTIONS .flash_begin : { __flash_binary_start = .; } > FLASH + .second_stage_ota : { + KEEP (*(.second_stage_ota)) + } > FLASH .boot2 : { __boot2_start__ = .; KEEP (*(.boot2)) @@ -101,7 +104,9 @@ SECTIONS } > RAM AT> FLASH .uninitialized_data (COPY): { . = ALIGN(4); + __uninitialized_data_start__ = .; *(.uninitialized_data*) + __uninitialized_data_end__ = .; } > RAM .scratch_x : { __scratch_x_start__ = .;