this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

#2257: build languages as shared libs (#2519)

* added BUILD_STATIC=OFF option to split scripts to shared libs

* rpi build fix

* rpi build fix

* macos build fix

* rpi baremetal build fix

* build fix

* call api without macro

* wren build fix

* clang build fix

* baremetal fix

* fixed python and janet shared libs

authored by

Vadim Grigoruk and committed by
GitHub
4ffa300b 562c8ab0

+1446 -1221
+14 -4
CMakeLists.txt
··· 26 26 27 27 set(BUILD_TOUCH_INPUT_DEFAULT ${ANDROID}) 28 28 29 + option(BUILD_STATIC "Static runtime" ON) 29 30 option(BUILD_SDL "SDL Enabled" ON) 30 31 option(BUILD_SDLGPU "SDL GPU Enabled" OFF) 31 32 option(BUILD_SOKOL "Sokol Enabled" OFF) ··· 40 41 set(BUILD_SDLGPU OFF) 41 42 endif() 42 43 44 + if(BUILD_STATIC) 45 + set(TIC_RUNTIME STATIC) 46 + else() 47 + set(TIC_RUNTIME SHARED) 48 + endif() 49 + 50 + message("BUILD_STATIC: ${BUILD_STATIC}") 43 51 message("BUILD_SDLGPU: ${BUILD_SDLGPU}") 44 52 message("BUILD_TOUCH_INPUT: ${BUILD_TOUCH_INPUT}") 45 53 message("BUILD_STUB: ${BUILD_STUB}") ··· 62 70 endif() 63 71 64 72 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) 65 - set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) 73 + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) 66 74 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) 67 75 if (NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE) 68 76 set(CMAKE_POSITION_INDEPENDENT_CODE ON) ··· 100 108 endif() 101 109 102 110 set(THIRDPARTY_DIR ${CMAKE_SOURCE_DIR}/vendor) 111 + set(DEMO_CARTS_IN ${CMAKE_SOURCE_DIR}/demos) 103 112 104 113 include(cmake/gif.cmake) 105 114 include(cmake/blipbuf.cmake) 115 + include(cmake/zlib.cmake) 116 + include(cmake/zip.cmake) 117 + include(cmake/tools.cmake) 106 118 107 119 include(cmake/lua.cmake) 108 120 include(cmake/wren.cmake) ··· 114 126 include(cmake/quickjs.cmake) 115 127 include(cmake/janet.cmake) 116 128 129 + include(cmake/demos.cmake) 117 130 include(cmake/core.cmake) 118 131 119 - include(cmake/zlib.cmake) 120 - include(cmake/zip.cmake) 121 - include(cmake/tools.cmake) 122 132 include(cmake/wave.cmake) 123 133 include(cmake/argparse.cmake) 124 134 include(cmake/naett.cmake)
-1
build/assets/gamecontrollerdb.txt.dat
··· 1 - 0x78, 0xda, 0xec, 0xbd, 0x5b, 0x73, 0xdb, 0x48, 0x92, 0x06, 0xfa, 0x7c, 0x26, 0x62, 0xff, 0x03, 0x22, 0xf6, 0x65, 0x26, 0x6c, 0xf7, 0xa2, 0x2e, 0xb8, 0xf5, 0x9b, 0xee, 0x6d, 0xb7, 0x65, 0x6b, 0x45, 0xd9, 0xd6, 0xcc, 0xcb, 0x89, 0x22, 0x51, 0x94, 0xb0, 0xa6, 0x08, 0x1d, 0x90, 0xb4, 0xad, 0x7e, 0xe8, 0xdf, 0x7e, 0x70, 0xa9, 0x02, 0x81, 0x42, 0x15, 0x50, 0x20, 0x41, 0x89, 0x14, 0xd0, 0x11, 0xd3, 0x92, 0xe5, 0x69, 0x11, 0xf9, 0x21, 0x2b, 0x33, 0x2b, 0x2f, 0x5f, 0xfe, 0xb7, 0x71, 0x41, 0x1e, 0xa8, 0x71, 0x12, 0xce, 0x97, 0x51, 0x38, 0x9b, 0xd1, 0xc8, 0x38, 0x3d, 0x36, 0xa6, 0x61, 0x64, 0x8c, 0x4e, 0x3f, 0x1a, 0xc1, 0xdc, 0x80, 0xbf, 0x99, 0xbf, 0x01, 0x3b, 0xf9, 0xc9, 0x03, 0x59, 0xfe, 0xd7, 0x3f, 0xfe, 0xdb, 0x18, 0x85, 0xab, 0x68, 0x42, 0x7f, 0x37, 0xee, 0x97, 0xcb, 0xc7, 0xc5, 0xef, 0xff, 0xf3, 0x3f, 0x77, 0xc1, 0xf2, 0x7e, 0x35, 0xfe, 0x6d, 0x12, 0x3e, 0xfc, 0xcf, 0x1d, 0x19, 0x87, 0x0f, 0xfe, 0xff, 0xf7, 0x3f, 0xf1, 0x7f, 0xfa, 0xff, 0x26, 0xbf, 0x75, 0xfd, 0x4b, 0x4f, 0x8f, 0xff, 0xeb, 0x1f, 0xc9, 0x7f, 0xfc, 0x2d, 0x98, 0xfb, 0xe1, 0xcf, 0xc5, 0x7f, 0xfd, 0xc3, 0x44, 0x66, 0xfa, 0x4f, 0xfc, 0x65, 0x9a, 0x7e, 0x43, 0x4c, 0x60, 0x16, 0xfe, 0x79, 0x8b, 0x8c, 0xf7, 0x73, 0x03, 0x24, 0xcf, 0xf5, 0x83, 0x46, 0x8b, 0x20, 0x9c, 0x1b, 0xc7, 0xe1, 0xaf, 0xb7, 0xe4, 0xf7, 0x31, 0x7c, 0x3b, 0xfe, 0x7d, 0x0c, 0xde, 0x8e, 0xc9, 0xe4, 0xfb, 0xef, 0x63, 0xef, 0xad, 0xff, 0x18, 0xff, 0xc2, 0xf9, 0xef, 0xf7, 0xe6, 0x6f, 0x38, 0xfe, 0x7e, 0x46, 0xa7, 0xcb, 0xe4, 0x7b, 0x37, 0xfe, 0x3e, 0x0a, 0xee, 0xee, 0xd3, 0x3f, 0xc0, 0xf8, 0x0f, 0xab, 0xc7, 0xe4, 0x3b, 0xf0, 0x36, 0xf9, 0x3f, 0x2c, 0xee, 0xc3, 0xd5, 0xcc, 0xa7, 0xd1, 0xef, 0x63, 0x3b, 0xfb, 0xf3, 0x32, 0x48, 0x7e, 0x17, 0x30, 0xd3, 0x3f, 0x2d, 0xe3, 0xff, 0xee, 0x2e, 0xf9, 0x4b, 0x9c, 0xfe, 0xf1, 0xd7, 0xef, 0x24, 0xfb, 0xf9, 0xd3, 0xef, 0x04, 0xbc, 0x4d, 0x7f, 0xe7, 0xfa, 0xbf, 0x77, 0xd8, 0x0f, 0xd8, 0x2f, 0x60, 0x7f, 0x9f, 0xff, 0x06, 0x2b, 0xfb, 0x73, 0xfc, 0x2b, 0x50, 0xf6, 0x5d, 0xfc, 0x3b, 0xe0, 0xdb, 0xc5, 0x92, 0x44, 0xcb, 0xdf, 0xc7, 0xee, 0xdb, 0x5f, 0xbf, 0x8f, 0xd1, 0xdb, 0xa7, 0xdf, 0xc7, 0xe6, 0xdb, 0xc7, 0x19, 0x59, 0x26, 0x08, 0xff, 0xce, 0xf0, 0x79, 0xbb, 0x06, 0x68, 0x4a, 0xa0, 0x9f, 0x7e, 0x53, 0x82, 0x27, 0x01, 0xc8, 0xbf, 0x5e, 0xf9, 0xf1, 0x53, 0x18, 0xe7, 0x61, 0xb8, 0x34, 0x2e, 0xc3, 0x65, 0x82, 0xd1, 0x1a, 0x71, 0xd5, 0xc3, 0xc7, 0x3f, 0xb2, 0x0a, 0x0f, 0x53, 0xf3, 0xc9, 0xbe, 0x09, 0xec, 0xf4, 0x1b, 0x6c, 0xfa, 0xa5, 0x4f, 0xc6, 0x57, 0x33, 0xf2, 0x64, 0x1c, 0xf9, 0xe4, 0x71, 0x19, 0x7f, 0x0e, 0x49, 0xdf, 0x46, 0x22, 0x4a, 0xf6, 0x4a, 0x30, 0x7f, 0x25, 0x09, 0x1e, 0xec, 0x8d, 0x8c, 0x01, 0xcc, 0x5f, 0xc8, 0x18, 0xa0, 0xec, 0x7d, 0x70, 0xc0, 0x55, 0xaf, 0x03, 0x97, 0x5f, 0x87, 0xdb, 0xfa, 0x75, 0x58, 0xc2, 0xeb, 0xf0, 0x24, 0xaf, 0x03, 0xf3, 0xd7, 0x61, 0x25, 0xaf, 0xc3, 0x4c, 0x5e, 0x87, 0x1e, 0x28, 0xd6, 0x00, 0x4a, 0x15, 0x14, 0x7b, 0x00, 0xa5, 0x0a, 0x8a, 0x33, 0x80, 0x52, 0x01, 0xc5, 0x4e, 0x0c, 0xfe, 0x00, 0x4a, 0x26, 0xfc, 0xc4, 0x65, 0x26, 0xde, 0x44, 0x65, 0x1f, 0xe8, 0x1e, 0x07, 0xcb, 0xd3, 0xb0, 0x88, 0x8a, 0x59, 0x74, 0x7e, 0xb1, 0xac, 0x2d, 0xbd, 0xdf, 0xdd, 0x2a, 0xf0, 0x69, 0xf2, 0x34, 0x75, 0x18, 0xa1, 0x6d, 0x31, 0xc2, 0x6d, 0x30, 0x8a, 0x5f, 0x28, 0xf7, 0x83, 0x58, 0x0b, 0x24, 0xab, 0x16, 0x24, 0x03, 0x0e, 0x30, 0xa5, 0xdf, 0x78, 0x96, 0x14, 0xa6, 0xd3, 0xf0, 0x6e, 0x1c, 0xce, 0x69, 0x7e, 0xc2, 0xcc, 0x8d, 0x41, 0x12, 0xc5, 0x85, 0x92, 0xc7, 0xb7, 0x0a, 0x8f, 0x5f, 0xf3, 0xd0, 0xa6, 0xe9, 0x66, 0x5f, 0x60, 0x39, 0xc8, 0xe1, 0x0f, 0x7d, 0x8e, 0xcc, 0x0e, 0xde, 0xaa, 0xec, 0x65, 0x6e, 0xf0, 0xfa, 0x24, 0xef, 0x0b, 0x4a, 0x05, 0xd6, 0x7a, 0x5f, 0xc8, 0x02, 0x30, 0x8d, 0xee, 0x00, 0x19, 0x2b, 0x44, 0x37, 0x8e, 0xa2, 0x09, 0xf1, 0xa9, 0xf1, 0x21, 0x7c, 0x4a, 0x55, 0x27, 0x7f, 0x77, 0x90, 0x41, 0xe1, 0x6e, 0x87, 0x04, 0xae, 0x0b, 0x82, 0xed, 0x66, 0x5c, 0xac, 0xfa, 0x20, 0xd8, 0xa9, 0x83, 0xc9, 0xcb, 0x2d, 0x24, 0xd2, 0xd1, 0x6a, 0x60, 0x42, 0xb7, 0x05, 0x4a, 0xa2, 0xc2, 0xc8, 0x34, 0xa0, 0xe1, 0x95, 0x6f, 0x78, 0xfc, 0x36, 0x79, 0x9d, 0xe6, 0xeb, 0xb3, 0x57, 0xb8, 0xf1, 0xcd, 0xba, 0xfc, 0x5e, 0xe3, 0x99, 0x66, 0x03, 0x60, 0x23, 0xd5, 0x6b, 0x7d, 0x0d, 0x76, 0x60, 0xad, 0xe1, 0x48, 0xa9, 0xe1, 0x57, 0x51, 0xf8, 0x0a, 0x94, 0x45, 0x09, 0x12, 0xd6, 0x36, 0x03, 0xa2, 0xb6, 0xe4, 0x20, 0x9d, 0xbc, 0x1a, 0x94, 0xb6, 0x38, 0x52, 0xb9, 0x2a, 0x41, 0x79, 0x08, 0xf0, 0x31, 0x58, 0xd2, 0x2c, 0x4c, 0xea, 0x06, 0x23, 0x70, 0xd0, 0x20, 0x81, 0x1a, 0x90, 0x46, 0x67, 0x03, 0x4a, 0x2c, 0xf9, 0x64, 0x49, 0x0f, 0xdc, 0x65, 0x16, 0x98, 0x75, 0x1c, 0x49, 0x56, 0x44, 0xb5, 0x95, 0x21, 0x05, 0xea, 0xc0, 0x98, 0x28, 0x34, 0xe0, 0xb2, 0xb3, 0xa0, 0x53, 0x12, 0x25, 0x6f, 0x25, 0x5b, 0x8b, 0x5b, 0x80, 0x5d, 0xfb, 0xde, 0x76, 0x73, 0x4d, 0x72, 0xcb, 0xaa, 0xec, 0x6d, 0xf2, 0x7e, 0x37, 0x94, 0x37, 0x7e, 0x93, 0x76, 0x7b, 0x79, 0xdf, 0x10, 0xc8, 0xc5, 0x7d, 0x47, 0xcc, 0x5c, 0xda, 0x37, 0xe9, 0xf7, 0xb1, 0xb0, 0xef, 0xe2, 0xbf, 0xd7, 0x95, 0x75, 0x57, 0x92, 0x09, 0xa9, 0x81, 0x5c, 0xb2, 0x4f, 0x3b, 0xbb, 0x1a, 0xed, 0x26, 0x30, 0x36, 0xb1, 0xfc, 0xb4, 0x7d, 0xda, 0x89, 0x25, 0xd9, 0xe2, 0x4e, 0xca, 0x1f, 0x18, 0x2a, 0xae, 0x1c, 0xdd, 0x3c, 0xf0, 0x2b, 0x08, 0xc6, 0x5c, 0xf3, 0x75, 0x68, 0x26, 0x4d, 0xde, 0xb5, 0xa6, 0x1c, 0xce, 0xf6, 0x2e, 0x8e, 0x3d, 0xa5, 0xad, 0xe7, 0xa2, 0x3c, 0x15, 0xc4, 0x43, 0xb8, 0x9b, 0x47, 0x72, 0x56, 0x2d, 0x48, 0x5d, 0x46, 0xbc, 0x87, 0x7c, 0x5c, 0x6d, 0x4b, 0x69, 0xcf, 0x5e, 0x0d, 0x4c, 0x5d, 0x44, 0xbc, 0x50, 0xa1, 0x4d, 0x36, 0x7e, 0xfb, 0x86, 0x7d, 0x4e, 0xfc, 0x89, 0x6f, 0xd8, 0x07, 0xc5, 0xbf, 0xf4, 0x1d, 0xff, 0x29, 0x66, 0xdf, 0x3e, 0x25, 0x42, 0xad, 0x2d, 0x47, 0x97, 0x59, 0x0a, 0x96, 0xcb, 0xd2, 0x36, 0x84, 0x1a, 0x02, 0x23, 0x45, 0xe2, 0xe1, 0xd5, 0x09, 0x9c, 0x67, 0x5c, 0xa1, 0x3c, 0x45, 0xf7, 0xe9, 0x6c, 0x94, 0x59, 0xfc, 0x52, 0xa3, 0x81, 0xbd, 0x0e, 0x16, 0x41, 0x43, 0xb0, 0x58, 0xcd, 0xaf, 0x56, 0x12, 0xa6, 0xec, 0x41, 0x1d, 0xbd, 0x16, 0x80, 0xf5, 0x85, 0xbe, 0xe1, 0x89, 0xc5, 0x63, 0xbb, 0xad, 0xf3, 0x6c, 0x3e, 0x2e, 0x26, 0xe4, 0x3e, 0x53, 0x71, 0x5c, 0x92, 0x47, 0xeb, 0xc8, 0x47, 0x1d, 0x9e, 0x31, 0x81, 0xfc, 0x4c, 0x29, 0x92, 0x9b, 0xfd, 0x46, 0x67, 0x1d, 0x61, 0x2b, 0x2c, 0x4f, 0x87, 0xe8, 0xbc, 0x06, 0x8f, 0xe4, 0xc8, 0x6f, 0x4e, 0x57, 0x2f, 0x51, 0x1c, 0x83, 0xfa, 0x49, 0xf1, 0x2e, 0xd2, 0x18, 0x6e, 0x7f, 0x45, 0x47, 0xb6, 0xd4, 0x74, 0x74, 0x1c, 0xaa, 0x1d, 0x76, 0x76, 0x12, 0xd9, 0x60, 0xc0, 0xa8, 0x29, 0x13, 0x38, 0xe8, 0x51, 0xf3, 0x35, 0x5b, 0xde, 0x5a, 0x72, 0x4d, 0x27, 0x34, 0xf8, 0x51, 0x68, 0x4b, 0xea, 0xf9, 0xcd, 0x68, 0x40, 0x49, 0xc7, 0x26, 0x0d, 0x28, 0xe9, 0x64, 0x83, 0x07, 0x94, 0x34, 0x02, 0x64, 0xd7, 0x76, 0x64, 0x28, 0x8d, 0x4a, 0xe1, 0xcf, 0x56, 0x51, 0x4f, 0x63, 0xcd, 0x66, 0xcb, 0xba, 0x95, 0xd9, 0x32, 0xea, 0x01, 0x48, 0xea, 0xad, 0x46, 0xe7, 0x43, 0xd6, 0x9d, 0xb7, 0x40, 0xd8, 0x4a, 0x84, 0x0e, 0xfb, 0x46, 0xb9, 0x06, 0x07, 0x6d, 0x01, 0x0e, 0xd8, 0x31, 0x38, 0xfb, 0xa3, 0x42, 0xad, 0x51, 0xca, 0x9b, 0xe8, 0x14, 0x59, 0x89, 0x51, 0xd2, 0x46, 0x53, 0x03, 0x51, 0xfb, 0x0c, 0x98, 0xbd, 0x75, 0x9e, 0x29, 0x37, 0x85, 0x8a, 0xbe, 0xba, 0x7d, 0x7e, 0x66, 0xa4, 0xa8, 0x20, 0xee, 0xe3, 0x33, 0xf3, 0xe4, 0x28, 0x34, 0x15, 0x38, 0x7f, 0x6a, 0xa8, 0xa4, 0xb7, 0x4f, 0x8e, 0x0a, 0xed, 0xa6, 0xf2, 0xe6, 0x52, 0x55, 0x01, 0xbd, 0x8d, 0x4d, 0x50, 0xb8, 0x94, 0x4f, 0x7b, 0xab, 0x38, 0xc9, 0xdb, 0xd8, 0xe0, 0x91, 0xbb, 0x2a, 0xad, 0xaa, 0x12, 0x1d, 0xdd, 0xb4, 0xdd, 0x00, 0x45, 0x81, 0x65, 0x8f, 0xdf, 0x47, 0xd3, 0xa1, 0x18, 0xa2, 0x12, 0xac, 0x32, 0x75, 0x03, 0x42, 0xbc, 0xfc, 0x0a, 0x37, 0x42, 0xe8, 0x45, 0xcd, 0x90, 0x30, 0x96, 0x51, 0x7c, 0x64, 0x1e, 0x4d, 0xed, 0x20, 0x05, 0xfb, 0x92, 0xef, 0xb3, 0xcd, 0x4d, 0xc5, 0x36, 0x9b, 0xc0, 0xe9, 0x6f, 0xa8, 0x59, 0x40, 0x09, 0x0c, 0x28, 0x35, 0xa3, 0x54, 0x7f, 0xd0, 0xd2, 0xb1, 0xfc, 0xa3, 0xb9, 0x1f, 0x85, 0x81, 0xdf, 0x5d, 0xfb, 0x26, 0x38, 0xe8, 0x31, 0x37, 0x58, 0x7f, 0xfc, 0x8c, 0xab, 0xd9, 0x6a, 0x31, 0x68, 0x17, 0x83, 0x0a, 0x0c, 0x50, 0x69, 0x0e, 0x05, 0xc8, 0xef, 0x0a, 0x5f, 0x66, 0xcb, 0xe0, 0x81, 0x2c, 0xa9, 0xf1, 0x2d, 0x88, 0xe8, 0x5e, 0x1d, 0xc1, 0x87, 0x60, 0x31, 0x01, 0x31, 0xe8, 0xf6, 0xdb, 0x47, 0xe2, 0xfb, 0x33, 0x9a, 0x7c, 0x8f, 0xd9, 0xf7, 0x30, 0xfe, 0xde, 0x7a, 0xc9, 0x43, 0x0a, 0xa0, 0x06, 0x9c, 0x33, 0xba, 0x58, 0x0c, 0x46, 0x2d, 0xc3, 0x0b, 0xed, 0x37, 0x5e, 0x71, 0xb4, 0xa4, 0xa7, 0x81, 0x68, 0xad, 0x81, 0xc0, 0x6b, 0x87, 0x28, 0xc1, 0xcd, 0x07, 0xba, 0x19, 0x51, 0x92, 0xf0, 0x74, 0x24, 0x17, 0x69, 0x88, 0xa4, 0xbd, 0xbd, 0xff, 0xa1, 0xb5, 0xe1, 0xab, 0xce, 0x60, 0x40, 0xbb, 0xa8, 0xbb, 0x85, 0x12, 0xb8, 0xf2, 0xfb, 0x71, 0xf2, 0xc8, 0xb5, 0x15, 0xdb, 0x97, 0x4d, 0x75, 0xa9, 0x71, 0xee, 0xa4, 0xcc, 0xbc, 0x41, 0x47, 0x5b, 0x07, 0x7e, 0xc1, 0x9d, 0x26, 0xdd, 0xe1, 0x89, 0x21, 0x13, 0x32, 0xa6, 0x47, 0x93, 0x07, 0x6a, 0x5c, 0x1c, 0x99, 0x55, 0xd2, 0x81, 0x5d, 0xce, 0x64, 0x5b, 0xda, 0x13, 0x35, 0xcd, 0x33, 0xd9, 0x12, 0x62, 0xa2, 0x74, 0x26, 0x1b, 0x36, 0xbf, 0xf3, 0xd8, 0x4d, 0xb2, 0x2c, 0x95, 0x25, 0x80, 0x12, 0xad, 0x7e, 0xbd, 0x82, 0x21, 0x75, 0xd4, 0x72, 0x48, 0x7d, 0x4a, 0xb2, 0x36, 0xfd, 0xa9, 0x39, 0x9d, 0x0a, 0x80, 0x2c, 0xe9, 0xe4, 0xbb, 0x71, 0x74, 0xf1, 0xc1, 0x48, 0x8e, 0x47, 0xa5, 0xb7, 0xf4, 0xd0, 0xa1, 0x69, 0xee, 0x60, 0xf5, 0x01, 0x70, 0x59, 0x7e, 0x68, 0x52, 0x86, 0xe6, 0xf4, 0x06, 0x74, 0xdb, 0x32, 0xac, 0x70, 0x59, 0x78, 0x5b, 0x17, 0xcf, 0x4f, 0x8a, 0x90, 0x36, 0xd0, 0x23, 0x79, 0xc0, 0x80, 0xb0, 0x5e, 0xae, 0x72, 0xf2, 0xe7, 0x68, 0xba, 0xa4, 0xd1, 0xdd, 0x2c, 0xfc, 0x69, 0x5c, 0x8d, 0x50, 0x91, 0xbc, 0x6b, 0xeb, 0xd3, 0xa3, 0xf2, 0xeb, 0x07, 0x70, 0x8e, 0x6c, 0x66, 0x6d, 0xe3, 0x0b, 0x0b, 0x1a, 0xd0, 0xd2, 0x45, 0x2b, 0x36, 0xc6, 0x60, 0x40, 0x4b, 0x1b, 0x2d, 0x3c, 0xa0, 0xd5, 0x0a, 0x2d, 0x38, 0xa0, 0xa5, 0x8d, 0x96, 0x37, 0xe8, 0x56, 0x0b, 0xb4, 0xc8, 0x80, 0x56, 0x0b, 0xb4, 0x90, 0x12, 0xad, 0xdb, 0x71, 0xf8, 0x4b, 0x80, 0xcb, 0x94, 0x4e, 0x30, 0x75, 0x10, 0x65, 0x96, 0xdb, 0xc5, 0xd8, 0x2d, 0xb8, 0x05, 0x46, 0x9e, 0x10, 0x5b, 0x59, 0x75, 0xe9, 0x13, 0x47, 0xef, 0x3e, 0x52, 0x80, 0x08, 0x0e, 0x10, 0x35, 0x41, 0x84, 0x07, 0x88, 0x1a, 0x5c, 0x1e, 0x40, 0xfa, 0x10, 0xf5, 0xde, 0x2e, 0x21, 0x6f, 0xb0, 0x4b, 0xaa, 0x1c, 0xe4, 0x98, 0xa5, 0x8d, 0x80, 0x89, 0x5e, 0x21, 0x44, 0xb0, 0x0b, 0x88, 0x7c, 0xc0, 0x1a, 0x6b, 0xa6, 0xde, 0xde, 0x41, 0xa4, 0x35, 0x7b, 0x5c, 0x8b, 0x51, 0x7e, 0xf4, 0xb6, 0x02, 0x89, 0x9f, 0x2f, 0xb7, 0x92, 0x84, 0xfc, 0x1e, 0xc4, 0x0f, 0xf2, 0x68, 0x9c, 0xac, 0x16, 0xcb, 0xf0, 0x61, 0x91, 0x84, 0x4d, 0xb6, 0xb9, 0x6b, 0xab, 0xb4, 0x41, 0xc7, 0x9e, 0xa6, 0x49, 0x71, 0x26, 0x80, 0x27, 0x49, 0xca, 0x5c, 0x3e, 0x47, 0xb3, 0x80, 0xce, 0x7f, 0x92, 0x88, 0x1a, 0xa7, 0x2b, 0x32, 0x8b, 0x95, 0xe1, 0xe1, 0x91, 0x2c, 0x83, 0xf1, 0x8c, 0x1a, 0x09, 0x77, 0xf0, 0x68, 0x49, 0x44, 0x06, 0xf4, 0x43, 0x4d, 0x41, 0xaa, 0x72, 0xb2, 0xcd, 0xd8, 0x61, 0x2f, 0x4b, 0x41, 0xc6, 0xff, 0x16, 0x1c, 0xfc, 0x03, 0xf9, 0x2b, 0x06, 0xe7, 0xe3, 0x6a, 0x4e, 0x3a, 0x3d, 0x45, 0x4c, 0x49, 0xdc, 0x16, 0x50, 0x11, 0xa4, 0xae, 0x1e, 0x79, 0xed, 0x30, 0x93, 0x16, 0x89, 0xac, 0x96, 0xe7, 0xca, 0x61, 0x89, 0x93, 0x16, 0x98, 0x75, 0x34, 0x2b, 0x27, 0x2a, 0x98, 0x55, 0x35, 0x42, 0x7a, 0x28, 0xe1, 0x12, 0x4a, 0x4e, 0x9d, 0xb1, 0xb1, 0xf3, 0x8c, 0x65, 0x2d, 0x25, 0xb5, 0x8b, 0xb2, 0xc2, 0x59, 0xa5, 0xbd, 0x29, 0xe3, 0xe2, 0xdc, 0x11, 0xcb, 0x83, 0xd3, 0x7c, 0x88, 0xa0, 0x70, 0x6a, 0x50, 0x5e, 0xc1, 0xa9, 0xcd, 0xc0, 0xc6, 0x2e, 0x78, 0xc2, 0x8c, 0x28, 0x15, 0xe4, 0x79, 0x08, 0x23, 0x03, 0x3d, 0xa7, 0xad, 0x90, 0x1e, 0x80, 0x0e, 0xf5, 0x5e, 0xdb, 0x56, 0x98, 0xa9, 0xd3, 0xc5, 0x58, 0xb4, 0xb3, 0xa3, 0x93, 0xf7, 0xef, 0x8d, 0x11, 0x25, 0x0f, 0xc1, 0xa4, 0xce, 0x58, 0xb8, 0xcf, 0xfd, 0xee, 0x45, 0xcf, 0x02, 0xab, 0x55, 0x88, 0x5a, 0x25, 0x70, 0x6d, 0x2f, 0xf5, 0x2c, 0xd0, 0x12, 0x3d, 0xe8, 0x22, 0x96, 0xd1, 0x38, 0xc1, 0xa6, 0x71, 0x73, 0x1d, 0xbb, 0x4f, 0xfc, 0x42, 0x4e, 0x64, 0x4f, 0x14, 0x83, 0xa0, 0xec, 0xac, 0x40, 0x47, 0x0e, 0x53, 0xb0, 0x7c, 0x32, 0x2e, 0x83, 0x79, 0xa0, 0xae, 0x63, 0xbd, 0x21, 0x78, 0x5d, 0x82, 0x46, 0x85, 0x12, 0x34, 0xe2, 0x25, 0x68, 0xac, 0x30, 0x61, 0x85, 0x1a, 0x67, 0xbb, 0x0a, 0x53, 0xfe, 0xd0, 0x6e, 0xeb, 0x87, 0x66, 0x98, 0x23, 0x8e, 0x79, 0xe7, 0xcf, 0x16, 0x9b, 0xd2, 0x2c, 0xbc, 0xb5, 0x1c, 0x21, 0xbc, 0x1d, 0x7d, 0x19, 0x19, 0xd7, 0x9f, 0x2f, 0x8c, 0x3f, 0x63, 0x1f, 0x13, 0x64, 0x56, 0xa8, 0xc7, 0xfd, 0x2f, 0x39, 0x4e, 0xf6, 0x01, 0xe1, 0xc4, 0x7c, 0x32, 0x78, 0x91, 0x0e, 0x2b, 0x8a, 0x33, 0x62, 0xd6, 0xf8, 0x6a, 0x59, 0x2e, 0x39, 0x1f, 0x93, 0xf8, 0x17, 0x91, 0xf9, 0x5d, 0x0f, 0xef, 0x49, 0xbe, 0x9d, 0x5d, 0x90, 0xa8, 0x65, 0x39, 0x52, 0x4c, 0x76, 0x76, 0x5d, 0x38, 0xe0, 0x3c, 0x0e, 0x6f, 0xe6, 0x00, 0xc8, 0x82, 0x22, 0x68, 0x4b, 0x32, 0x0b, 0xa6, 0x65, 0xbe, 0x7a, 0x3b, 0xc1, 0xc9, 0x61, 0x38, 0x89, 0xe2, 0x6a, 0xa8, 0x41, 0x4e, 0x7f, 0xb8, 0x0e, 0xdf, 0x2c, 0xad, 0x34, 0x13, 0x14, 0xd2, 0x4c, 0xc9, 0xe3, 0xc5, 0x1f, 0x12, 0xd0, 0x99, 0x6f, 0xe0, 0xa1, 0x60, 0x20, 0x49, 0xa9, 0x00, 0x21, 0xa5, 0x72, 0x7c, 0x6c, 0x98, 0x8e, 0xd9, 0xbb, 0x2c, 0x1c, 0xb7, 0x0a, 0x90, 0x08, 0xbe, 0xe5, 0xf8, 0xf4, 0x28, 0x0d, 0xf9, 0xce, 0x93, 0x5f, 0xfc, 0x48, 0xfc, 0x97, 0xd1, 0x9a, 0x3d, 0x09, 0xfd, 0xc6, 0x93, 0x0c, 0x25, 0x4b, 0x08, 0x91, 0xdf, 0x1e, 0xd3, 0x60, 0x19, 0xc6, 0xa6, 0xf3, 0xa2, 0xea, 0x7b, 0x61, 0x57, 0xd7, 0xdf, 0x6e, 0x43, 0x94, 0x56, 0x8b, 0x9a, 0x80, 0x66, 0x23, 0x8f, 0xe9, 0xb3, 0x6b, 0x31, 0x14, 0x1a, 0x79, 0x8e, 0xe9, 0xec, 0x7b, 0x30, 0x37, 0x3e, 0x85, 0x49, 0xb4, 0xf9, 0x10, 0x1a, 0x9f, 0xb0, 0xb9, 0x9b, 0x96, 0xc0, 0x0d, 0x9a, 0x00, 0x25, 0x76, 0xc5, 0xda, 0xb8, 0xeb, 0x8f, 0x6b, 0x88, 0x2d, 0x34, 0x43, 0xc6, 0x08, 0x2c, 0xc3, 0x47, 0x03, 0x02, 0x68, 0x9f, 0xf7, 0xb0, 0xc1, 0x8d, 0xc3, 0x12, 0x1f, 0x1d, 0x4b, 0x02, 0xcb, 0xf1, 0xf9, 0x65, 0xcf, 0x63, 0xfb, 0x5c, 0x6f, 0x90, 0x54, 0x6f, 0xca, 0x5e, 0xbb, 0xa7, 0xca, 0x63, 0x23, 0x61, 0xfe, 0x6b, 0xc0, 0x66, 0x8d, 0x0d, 0x1e, 0xf4, 0x46, 0xd9, 0x81, 0x6d, 0x49, 0x8d, 0xce, 0x80, 0x4d, 0xc6, 0x77, 0x3d, 0x60, 0x23, 0x56, 0x3c, 0x78, 0x04, 0x2c, 0x26, 0xf8, 0x32, 0x6c, 0x92, 0xcd, 0xcd, 0x2c, 0x10, 0x3e, 0x70, 0x60, 0x70, 0x4b, 0x60, 0xdc, 0xa4, 0xee, 0x51, 0xa5, 0x0a, 0x19, 0x80, 0xe1, 0xf7, 0x6f, 0x5b, 0x6c, 0x9b, 0x3d, 0x3e, 0x37, 0x3e, 0xcf, 0xe9, 0x21, 0xdc, 0x26, 0xb7, 0xaa, 0x11, 0xe6, 0x5b, 0xca, 0xa1, 0xd0, 0x5b, 0x76, 0x1c, 0xdc, 0x8d, 0xe9, 0xfc, 0x40, 0x6f, 0xd3, 0x92, 0x5b, 0x80, 0x6e, 0x97, 0x54, 0x1c, 0x25, 0x32, 0x3c, 0x3c, 0x05, 0x1e, 0x3d, 0x1b, 0xfe, 0xc9, 0x11, 0xa9, 0x5c, 0x00, 0x52, 0x44, 0x24, 0xa9, 0xa9, 0xed, 0xee, 0x86, 0x7b, 0x9b, 0x9a, 0x6a, 0xa1, 0x3c, 0x62, 0x43, 0x54, 0xdf, 0xa0, 0x6a, 0x2e, 0xc3, 0xf3, 0xb2, 0x35, 0x14, 0xcb, 0xd6, 0xc7, 0x51, 0x18, 0x7e, 0x37, 0x2e, 0x49, 0xb4, 0x78, 0xc1, 0x7a, 0xe5, 0x9e, 0x1c, 0xbd, 0x1c, 0x24, 0xf0, 0x7c, 0x20, 0x1d, 0x70, 0x66, 0x98, 0xc3, 0x35, 0x95, 0xc3, 0x75, 0x35, 0x82, 0x95, 0x35, 0xec, 0x1c, 0xa6, 0x74, 0xcb, 0xfa, 0xeb, 0x2e, 0x7e, 0x73, 0x74, 0x10, 0x30, 0x27, 0x12, 0x74, 0x46, 0xab, 0x47, 0x1a, 0x25, 0x9a, 0xf4, 0x83, 0x46, 0xcb, 0xee, 0x2f, 0x0f, 0x42, 0x4f, 0x04, 0x6e, 0xbf, 0x8c, 0xb6, 0x6d, 0x6d, 0xda, 0x77, 0x41, 0xc6, 0x0e, 0x32, 0x16, 0x43, 0xde, 0xd5, 0x74, 0x4a, 0x66, 0xa1, 0x71, 0x3c, 0xba, 0xb8, 0x02, 0xb6, 0x09, 0x8c, 0x11, 0x8d, 0x02, 0x9a, 0x52, 0x0e, 0x58, 0x89, 0xc4, 0x88, 0xeb, 0x04, 0xec, 0x82, 0x79, 0x76, 0xf3, 0x13, 0xe3, 0x6d, 0x71, 0x62, 0xc0, 0xba, 0xfc, 0x54, 0x6b, 0x86, 0xad, 0x31, 0xc8, 0x2c, 0x0c, 0x16, 0x40, 0x3a, 0x21, 0x8f, 0x93, 0xf0, 0xc1, 0xf8, 0x23, 0x7c, 0xa0, 0x7c, 0x4b, 0x71, 0xd9, 0xca, 0xa0, 0x04, 0x2a, 0x9c, 0x6f, 0x0d, 0x2b, 0x8b, 0xae, 0x15, 0xca, 0x15, 0xfb, 0xb6, 0x52, 0xf5, 0x05, 0x5a, 0x4f, 0x6a, 0xed, 0xfb, 0x93, 0xda, 0x7e, 0xd6, 0x6e, 0x87, 0xe1, 0xa4, 0x1c, 0x52, 0x9f, 0xdc, 0x07, 0xb3, 0xd9, 0x68, 0x19, 0x51, 0xf2, 0xf0, 0x0c, 0x71, 0xf5, 0x46, 0x17, 0x89, 0xcd, 0xcb, 0x50, 0xd4, 0xe5, 0xe9, 0x73, 0xab, 0x5c, 0x40, 0x38, 0x89, 0xfd, 0xc9, 0xf7, 0xd0, 0x38, 0xfa, 0xd3, 0x74, 0xc7, 0x3d, 0x4c, 0x49, 0x60, 0xcb, 0xc9, 0x34, 0x56, 0xbc, 0x60, 0x9e, 0x84, 0xe3, 0x88, 0xbc, 0x2a, 0x7f, 0xdd, 0xd6, 0x23, 0xc5, 0x96, 0x19, 0x67, 0x84, 0xf2, 0xe5, 0x65, 0xae, 0x6f, 0x93, 0x06, 0x68, 0xba, 0x0c, 0xd2, 0x36, 0x06, 0x19, 0x0d, 0x1f, 0x54, 0x6f, 0x1d, 0xac, 0x6f, 0x0c, 0x9c, 0x64, 0x45, 0xae, 0x89, 0x65, 0x0a, 0x1f, 0x18, 0x85, 0xf3, 0xd5, 0xe2, 0x92, 0xfc, 0x52, 0x06, 0x08, 0xaf, 0xbf, 0x39, 0x2e, 0xf6, 0x97, 0x98, 0xb5, 0xa9, 0xfb, 0x65, 0x70, 0x96, 0xf7, 0xab, 0xd9, 0xfd, 0xea, 0x15, 0xc4, 0xdf, 0x9b, 0x42, 0x32, 0xa1, 0x53, 0x32, 0x40, 0xc2, 0x59, 0xe9, 0xd2, 0xbc, 0x88, 0x1b, 0xff, 0x53, 0x86, 0xe4, 0x69, 0x1c, 0xc7, 0x8f, 0x17, 0xc4, 0xbf, 0xa3, 0xcb, 0x34, 0x9f, 0x78, 0xb2, 0x1a, 0x53, 0xf9, 0x6d, 0x77, 0x03, 0x8c, 0x6a, 0x09, 0x9a, 0xea, 0x8b, 0xc3, 0x72, 0xbe, 0xa5, 0xbf, 0xdb, 0xe6, 0xc9, 0x5c, 0x96, 0x53, 0x86, 0x93, 0xb1, 0x28, 0x77, 0x18, 0xed, 0xb6, 0x1b, 0x4d, 0xb4, 0x17, 0x70, 0x6b, 0x7b, 0xd1, 0xc9, 0x68, 0x13, 0xca, 0xba, 0xab, 0x21, 0x9c, 0xda, 0x12, 0x44, 0x8c, 0xaf, 0xbf, 0x21, 0xe3, 0x7a, 0xf5, 0x30, 0x9e, 0xd1, 0xe7, 0x3c, 0x26, 0x6f, 0xb6, 0xb7, 0xa6, 0xef, 0xa4, 0x84, 0x28, 0xb8, 0x2d, 0x67, 0x8e, 0xcb, 0x9b, 0xcf, 0x49, 0x39, 0x17, 0x74, 0x7a, 0x64, 0x7c, 0xa4, 0x71, 0x94, 0x9a, 0x9e, 0x08, 0x27, 0x81, 0xc5, 0xee, 0x88, 0x34, 0xca, 0xac, 0x6b, 0x61, 0xd4, 0x1e, 0x40, 0x50, 0x74, 0x30, 0xa2, 0xda, 0xeb, 0x06, 0xd4, 0xeb, 0x76, 0x03, 0x04, 0xf0, 0xbb, 0x67, 0x39, 0x18, 0x3a, 0x25, 0x4b, 0x3a, 0xe3, 0xe1, 0x7b, 0xb1, 0x1f, 0xaf, 0x7b, 0xbd, 0xd9, 0xc0, 0xa0, 0x76, 0x6a, 0x41, 0xb1, 0xc5, 0xe6, 0x6f, 0x5d, 0x81, 0x0b, 0xef, 0x94, 0x4e, 0xe9, 0xdc, 0x4f, 0x8d, 0x68, 0x7c, 0x95, 0xb9, 0x26, 0x93, 0xf8, 0xdb, 0x5b, 0xe7, 0x59, 0xf9, 0xb7, 0xf6, 0x23, 0x8d, 0xea, 0x78, 0xec, 0xe6, 0x2e, 0xa6, 0x51, 0xd3, 0xe9, 0xb8, 0xe3, 0xf0, 0x97, 0xf1, 0x2d, 0x08, 0xb6, 0xbf, 0x4a, 0xf0, 0xc8, 0xd9, 0xdc, 0x41, 0xaa, 0xa2, 0x93, 0x32, 0x6f, 0x6a, 0x3f, 0x28, 0x10, 0x62, 0x55, 0x36, 0x22, 0xf8, 0x8a, 0x66, 0x01, 0xdb, 0x9a, 0x56, 0x3c, 0x65, 0xf3, 0x6c, 0x8e, 0x39, 0xad, 0x42, 0x73, 0x15, 0xfe, 0xcc, 0x50, 0x71, 0x13, 0x54, 0x3c, 0x86, 0x0a, 0xe6, 0xa8, 0x8c, 0x73, 0x0e, 0xc1, 0xb4, 0xbf, 0x2f, 0x43, 0x64, 0xcc, 0xc6, 0x37, 0xc6, 0xa2, 0x2e, 0xb0, 0x9e, 0x23, 0x26, 0x8d, 0xb8, 0xba, 0x57, 0x43, 0x35, 0x00, 0x94, 0x4d, 0xb0, 0xad, 0x7f, 0x45, 0x6e, 0x3d, 0xd2, 0x3e, 0x3d, 0x90, 0x65, 0x17, 0x80, 0x8e, 0xf4, 0x00, 0x8e, 0x91, 0x42, 0xfa, 0xc2, 0x1c, 0x01, 0x3c, 0x30, 0xd6, 0x3e, 0xd5, 0x81, 0x01, 0xda, 0x5a, 0x01, 0x4d, 0x19, 0x2e, 0x37, 0xd9, 0x47, 0xf5, 0x10, 0x97, 0xb1, 0xcf, 0xfa, 0x8b, 0x20, 0x35, 0xab, 0xb8, 0x7c, 0x0d, 0xc6, 0x51, 0x36, 0x2f, 0x50, 0xf4, 0xba, 0xdd, 0x67, 0x7e, 0xf3, 0xa8, 0x62, 0x43, 0xdb, 0xba, 0x86, 0x58, 0x65, 0x6a, 0x25, 0xb3, 0xc5, 0x85, 0x16, 0xbe, 0x5a, 0x5b, 0x3b, 0x9d, 0x66, 0x2d, 0x35, 0x48, 0xe0, 0xa7, 0x4d, 0x21, 0x3a, 0x0f, 0xa3, 0x09, 0xcd, 0x41, 0x41, 0xaf, 0xa4, 0x33, 0xa2, 0x39, 0x8d, 0xc9, 0xa9, 0x41, 0x4d, 0x0f, 0x54, 0xf5, 0x66, 0x74, 0x1f, 0x4e, 0xbe, 0x67, 0xbc, 0xa7, 0x3d, 0xd3, 0x15, 0x04, 0x1c, 0x54, 0x0d, 0x60, 0x4b, 0xb0, 0xa0, 0x5e, 0xee, 0x8d, 0xc8, 0x27, 0x59, 0xc4, 0xd8, 0xfe, 0xec, 0xc8, 0x18, 0x3d, 0x86, 0xd1, 0x72, 0x31, 0x4c, 0xb1, 0x14, 0x4c, 0xce, 0x84, 0xc5, 0x30, 0xe2, 0x3c, 0xc2, 0x19, 0x59, 0x3c, 0x19, 0x17, 0x51, 0xf0, 0x78, 0xf8, 0x53, 0xc9, 0x36, 0x65, 0xa1, 0x2b, 0x81, 0x82, 0x8c, 0x33, 0x9a, 0x94, 0x6c, 0x4e, 0xbf, 0xdc, 0xda, 0xa6, 0x71, 0x79, 0xf9, 0xb9, 0x62, 0x5d, 0x81, 0xd3, 0x65, 0xe9, 0x4d, 0xb8, 0xf7, 0x01, 0x8d, 0xfc, 0x09, 0x7f, 0xe7, 0xfc, 0x57, 0x88, 0x50, 0x00, 0x54, 0x17, 0xc7, 0x42, 0x53, 0xcf, 0xc4, 0x8e, 0x5d, 0x06, 0x10, 0x06, 0x52, 0x80, 0xc4, 0xb6, 0x3c, 0xf4, 0x9a, 0x3a, 0x1f, 0xf4, 0x90, 0xb1, 0x07, 0x64, 0x14, 0x87, 0xca, 0x92, 0x1f, 0xaa, 0x2b, 0x64, 0x82, 0x2f, 0x8a, 0x41, 0xd0, 0x62, 0x75, 0xa3, 0x7c, 0xde, 0xcc, 0xdd, 0x0d, 0xcf, 0xda, 0xdb, 0xce, 0xce, 0x6a, 0x10, 0x9d, 0x37, 0xc3, 0x86, 0x41, 0x16, 0x05, 0x63, 0x6c, 0x49, 0x61, 0xfb, 0x02, 0xe2, 0x0b, 0x55, 0x0f, 0x71, 0xc9, 0xd5, 0x09, 0xc9, 0xd5, 0xe9, 0x0b, 0xb2, 0x01, 0xba, 0xec, 0x00, 0x18, 0x2d, 0x5f, 0xbd, 0xdf, 0x10, 0x51, 0x15, 0x44, 0x1e, 0x80, 0x37, 0x7d, 0xd6, 0x9d, 0xa9, 0x02, 0x18, 0x6c, 0x02, 0x34, 0xea, 0x31, 0x30, 0x40, 0x75, 0xa8, 0x62, 0x6b, 0x84, 0xfa, 0xcd, 0xae, 0xc8, 0x11, 0x32, 0x6b, 0x10, 0x3a, 0x58, 0xd5, 0x51, 0x5e, 0x2f, 0x5b, 0x9c, 0x29, 0x47, 0x0e, 0xcc, 0xb7, 0xd8, 0xbb, 0xef, 0x26, 0xea, 0xe9, 0xba, 0x2e, 0xd2, 0x36, 0xb0, 0x71, 0x58, 0xdb, 0x54, 0x32, 0x8a, 0x21, 0x48, 0x1e, 0x3c, 0x04, 0x73, 0xb2, 0x4c, 0x56, 0xc4, 0x25, 0xac, 0x89, 0xe9, 0x25, 0xbb, 0x72, 0x7a, 0xbc, 0x35, 0x45, 0x0f, 0x5a, 0x53, 0xf4, 0x58, 0x05, 0x8a, 0x1e, 0x8b, 0x53, 0xf4, 0xa0, 0x1d, 0xca, 0x8f, 0xab, 0xaf, 0xde, 0x6d, 0xd9, 0xbd, 0x6a, 0x83, 0x89, 0x28, 0xff, 0x92, 0xf6, 0x7a, 0x78, 0x1f, 0x23, 0xd6, 0xc4, 0x29, 0x4e, 0x2f, 0x9d, 0x5d, 0x8e, 0x92, 0x06, 0x21, 0x7f, 0x35, 0xc9, 0x7a, 0x85, 0xca, 0x1d, 0xbe, 0xf2, 0xcc, 0x54, 0x72, 0x1f, 0xe4, 0x15, 0x00, 0xb0, 0xd6, 0x8f, 0xac, 0x05, 0x38, 0xa9, 0x01, 0x34, 0x4c, 0x21, 0x9b, 0xdb, 0xa6, 0xa5, 0x40, 0x9b, 0xb4, 0x94, 0x66, 0xb5, 0x08, 0x62, 0xc8, 0x4a, 0x21, 0xe3, 0x32, 0x35, 0xcc, 0xd9, 0xe8, 0xd2, 0xf0, 0x00, 0xa8, 0xce, 0xec, 0x3b, 0xbb, 0xb3, 0xa4, 0x78, 0x5b, 0x4b, 0x5a, 0x5b, 0x3f, 0xb3, 0x75, 0x49, 0x45, 0xb3, 0x63, 0x04, 0x5c, 0xf1, 0x38, 0x2d, 0x16, 0x74, 0xbe, 0x0c, 0xc8, 0xec, 0x59, 0x9b, 0x11, 0x73, 0x4c, 0x00, 0xc7, 0xc4, 0xec, 0x9c, 0x45, 0x53, 0x63, 0x0c, 0x90, 0xe7, 0x74, 0xa7, 0x48, 0xc8, 0xd1, 0xdd, 0x9e, 0xfd, 0xef, 0xab, 0xab, 0x34, 0x37, 0x4f, 0xa1, 0xf0, 0xf5, 0x35, 0xb1, 0xb6, 0xb8, 0x15, 0x3c, 0x8c, 0xeb, 0xf3, 0x62, 0x9e, 0x61, 0x67, 0xd0, 0xb4, 0x6e, 0xd7, 0xed, 0x64, 0x54, 0x89, 0x69, 0x82, 0x2b, 0xb6, 0xa5, 0x9e, 0x93, 0x09, 0x0d, 0xa7, 0x53, 0xe3, 0x94, 0xce, 0x56, 0xbf, 0xa8, 0xf1, 0x29, 0x98, 0x2f, 0x69, 0xfc, 0x1f, 0x1b, 0xa3, 0x9f, 0xc1, 0x72, 0x72, 0x3f, 0xa4, 0x6f, 0x05, 0xf8, 0x4c, 0x05, 0x7c, 0xc9, 0xda, 0xd1, 0x01, 0x3b, 0x79, 0xdb, 0x6f, 0xce, 0x05, 0x21, 0xec, 0x01, 0x3c, 0x3f, 0xe9, 0x6c, 0x67, 0x72, 0x5d, 0x3a, 0x18, 0x6d, 0x3b, 0x89, 0x81, 0xdb, 0xf4, 0x34, 0xe8, 0x6e, 0xe2, 0x8b, 0x7d, 0x74, 0xd6, 0x6b, 0x6a, 0x9b, 0x22, 0x2a, 0xae, 0x09, 0x24, 0xfd, 0x85, 0xb2, 0xf7, 0xae, 0x37, 0xc7, 0xa0, 0xd9, 0xe0, 0xe7, 0x5a, 0xec, 0x45, 0x89, 0xd4, 0x64, 0xe7, 0xb1, 0x5d, 0xbc, 0x02, 0x3d, 0x9c, 0xc7, 0xe3, 0xd4, 0x63, 0xd0, 0x9d, 0x0a, 0xef, 0xa8, 0x40, 0xb1, 0xd5, 0x7d, 0x1b, 0xe8, 0x26, 0x3c, 0x84, 0xdd, 0x32, 0x0f, 0xe6, 0x82, 0xd3, 0x67, 0x15, 0xfc, 0x19, 0x2f, 0xea, 0x9b, 0x22, 0x82, 0x54, 0xaa, 0x60, 0xdc, 0x9c, 0xed, 0x58, 0x1b, 0xdc, 0xa6, 0x57, 0xef, 0xb5, 0x94, 0x29, 0x6f, 0x59, 0x05, 0x42, 0xcb, 0xea, 0x79, 0x10, 0xd1, 0x45, 0x7c, 0xff, 0x4e, 0xc7, 0x96, 0xbc, 0x8c, 0x21, 0xb1, 0xbb, 0x4e, 0x55, 0xf1, 0xac, 0xb7, 0x6e, 0x55, 0xad, 0x9c, 0x75, 0xa1, 0x2f, 0xd5, 0x6d, 0xe6, 0x70, 0xb2, 0x58, 0x77, 0x37, 0xf2, 0x3c, 0xb9, 0xe4, 0x85, 0x5e, 0x07, 0xbc, 0xf6, 0x4a, 0xdb, 0x56, 0x58, 0x5d, 0xd5, 0x1b, 0x2b, 0x14, 0xdd, 0x2d, 0x9d, 0x07, 0xaf, 0xac, 0x06, 0x5a, 0x3f, 0xf8, 0x69, 0xb1, 0x19, 0xac, 0x7b, 0xe2, 0x35, 0xbd, 0x1e, 0x24, 0xcc, 0x7a, 0xd6, 0x84, 0x41, 0xc3, 0xb7, 0xe7, 0xb3, 0x27, 0x3f, 0xb8, 0x0b, 0x8c, 0xa3, 0x47, 0xfa, 0xab, 0x97, 0x5d, 0x13, 0xc0, 0xca, 0xf6, 0x1a, 0x08, 0xf3, 0x97, 0x6b, 0x64, 0xbe, 0x26, 0xad, 0xe2, 0x6c, 0xc3, 0x70, 0xea, 0x6e, 0x01, 0x8f, 0x8a, 0xb6, 0x1c, 0x59, 0x76, 0x4a, 0xe8, 0x6c, 0xd9, 0xb9, 0x26, 0xb6, 0xda, 0xe0, 0xda, 0xf2, 0x78, 0x02, 0x8d, 0x97, 0x40, 0xe3, 0x6a, 0x29, 0x0d, 0x50, 0x28, 0x4d, 0x01, 0x9a, 0x1d, 0xea, 0x0d, 0x6c, 0xd6, 0x9b, 0x7c, 0x2f, 0x78, 0x61, 0x31, 0xbd, 0xc5, 0xbe, 0xc5, 0x69, 0x37, 0x43, 0xbd, 0x66, 0xa1, 0xf6, 0xbc, 0x74, 0x50, 0xff, 0xcc, 0xc1, 0x7a, 0xf8, 0xa4, 0x13, 0x76, 0xbb, 0x84, 0x50, 0x3a, 0xc3, 0x93, 0x43, 0x08, 0xac, 0xc2, 0x6a, 0x75, 0xbe, 0x72, 0x1d, 0xa5, 0x20, 0xae, 0x01, 0x75, 0xdb, 0x01, 0xda, 0xcd, 0xca, 0xf5, 0x7c, 0x73, 0x84, 0x49, 0xca, 0x47, 0xf5, 0xc2, 0x74, 0x6f, 0xbf, 0x54, 0x20, 0xc4, 0xbb, 0x58, 0x5b, 0x6e, 0x69, 0xde, 0xee, 0xed, 0xa9, 0x23, 0x6d, 0x52, 0x4b, 0x47, 0x0b, 0xbe, 0xbe, 0x3f, 0xae, 0x76, 0x7b, 0xf6, 0xa7, 0xc4, 0xc2, 0x47, 0xd8, 0xa0, 0x5d, 0xee, 0xbd, 0x7a, 0xdb, 0xe9, 0xd4, 0x1a, 0xbb, 0xa0, 0xdb, 0x9a, 0xcb, 0x9a, 0x25, 0x24, 0x46, 0x12, 0x55, 0xd5, 0x1d, 0x56, 0xe3, 0x69, 0x2d, 0x6b, 0xea, 0xe8, 0x48, 0xc8, 0x14, 0xa0, 0x65, 0x82, 0xbc, 0x4d, 0x91, 0xc0, 0x51, 0x1e, 0x48, 0x15, 0x61, 0x2b, 0x68, 0x9e, 0xac, 0xe6, 0x55, 0x01, 0x4b, 0xa2, 0xe4, 0xaa, 0xf7, 0x08, 0xd7, 0x52, 0x9a, 0xb9, 0x94, 0xeb, 0x97, 0x98, 0x96, 0x91, 0x52, 0x19, 0x41, 0xeb, 0x2d, 0xdb, 0xb6, 0x72, 0xad, 0xb6, 0x8a, 0x8e, 0x0a, 0x68, 0x8c, 0xc2, 0x30, 0x59, 0x1d, 0xe0, 0xea, 0xc8, 0xc8, 0xd2, 0x26, 0x7b, 0xf5, 0x26, 0xa1, 0xbe, 0x94, 0x76, 0xb3, 0x94, 0x95, 0x09, 0x6d, 0x73, 0xab, 0x79, 0xd2, 0x17, 0x92, 0x38, 0x4f, 0xc4, 0xfb, 0x42, 0x22, 0x9e, 0x25, 0x9c, 0x0d, 0x64, 0xdc, 0xac, 0xa2, 0x71, 0xd8, 0x6f, 0xa6, 0x77, 0x36, 0xae, 0x8f, 0x7c, 0x61, 0x0e, 0x2c, 0x01, 0x69, 0x14, 0x44, 0x32, 0xce, 0xee, 0x83, 0xb9, 0x33, 0x6c, 0xc1, 0x38, 0xcc, 0x71, 0xb1, 0xc6, 0xa6, 0xa5, 0xc0, 0xe5, 0x67, 0x77, 0xe3, 0x71, 0xf0, 0xf0, 0x38, 0x37, 0x38, 0x40, 0xd0, 0x17, 0x6e, 0xc5, 0x39, 0x40, 0xb8, 0x97, 0x97, 0x4d, 0x8e, 0x0b, 0xf6, 0x85, 0x85, 0x70, 0xaf, 0x01, 0x97, 0x0e, 0x0e, 0x54, 0x1c, 0x35, 0xd9, 0x32, 0x5c, 0xde, 0xdd, 0x20, 0x03, 0xfe, 0x66, 0xc2, 0x0e, 0x99, 0xce, 0xad, 0x03, 0x84, 0x09, 0x4f, 0xd8, 0x06, 0x61, 0x13, 0x55, 0xed, 0xce, 0x62, 0x29, 0x61, 0x34, 0x74, 0x0e, 0x77, 0x27, 0x8f, 0x66, 0x9b, 0x81, 0xe9, 0x67, 0x33, 0xa8, 0x00, 0x80, 0x6a, 0x10, 0x3a, 0x4a, 0x3e, 0xb8, 0x33, 0x0e, 0x8c, 0x7a, 0x65, 0xd9, 0x40, 0x3b, 0xb6, 0x33, 0x26, 0xd8, 0xb1, 0x50, 0xd6, 0xa1, 0x6f, 0xfb, 0x12, 0xc9, 0xc3, 0xc7, 0x1e, 0x4e, 0xae, 0xe7, 0xdc, 0xdc, 0x00, 0x9b, 0x52, 0x4c, 0xb2, 0x85, 0x2c, 0xab, 0x97, 0xdf, 0xce, 0xb4, 0x2f, 0x6b, 0x59, 0xf8, 0x1d, 0x5c, 0x96, 0xa8, 0x48, 0x28, 0x21, 0x2e, 0x6e, 0x62, 0x4d, 0x33, 0xb2, 0x02, 0x28, 0x12, 0x2e, 0x37, 0xeb, 0x0b, 0x9c, 0xb7, 0xbe, 0xdb, 0xb8, 0xe5, 0x0b, 0x5c, 0x75, 0x95, 0xa8, 0xa2, 0x1e, 0x0a, 0x9a, 0x37, 0x87, 0xae, 0x17, 0xa8, 0x57, 0x62, 0xf6, 0x10, 0x1a, 0xa7, 0xc1, 0x0f, 0xd2, 0x73, 0x9e, 0x52, 0xe2, 0x5a, 0x62, 0xbe, 0x21, 0xe9, 0xda, 0x3c, 0x99, 0x91, 0x9f, 0x3d, 0x24, 0xd4, 0x9a, 0x78, 0x99, 0x9e, 0x4c, 0x45, 0xe2, 0xe4, 0x8b, 0x93, 0xf8, 0xe7, 0xb7, 0xe7, 0x3d, 0xb4, 0x8f, 0x79, 0x0a, 0xd5, 0x13, 0x53, 0xa8, 0x74, 0x1e, 0xac, 0x16, 0x3d, 0x46, 0x04, 0x81, 0xb1, 0x0c, 0x11, 0xe3, 0x92, 0xfc, 0x9a, 0x06, 0x11, 0x35, 0x8e, 0x67, 0xe4, 0x2f, 0x2a, 0x99, 0x2c, 0x7e, 0xfd, 0x08, 0xe5, 0x7c, 0x39, 0x26, 0xa8, 0x45, 0xe8, 0x22, 0x22, 0x73, 0x3f, 0x20, 0x0b, 0x03, 0xc0, 0x1e, 0xa2, 0x64, 0x4d, 0xb2, 0x94, 0x2f, 0x42, 0x48, 0x85, 0xd2, 0xb9, 0x80, 0xd2, 0xd7, 0xdd, 0x4c, 0x18, 0x2b, 0x60, 0xd2, 0xa8, 0x86, 0xe3, 0x6d, 0xfb, 0xa4, 0x5b, 0xac, 0x3b, 0x18, 0x0b, 0x3d, 0x4d, 0x17, 0x17, 0x67, 0x9e, 0xe9, 0x19, 0xd7, 0x74, 0x12, 0x06, 0xb3, 0x83, 0xa5, 0x29, 0xdd, 0xbc, 0x33, 0x78, 0xca, 0x06, 0xd1, 0x27, 0xd0, 0x15, 0x72, 0x6d, 0x41, 0xb8, 0xa4, 0xf1, 0x2d, 0x46, 0xbd, 0x5a, 0xb4, 0xb7, 0x69, 0x26, 0x8e, 0x19, 0x04, 0x13, 0x20, 0xc7, 0xac, 0xc2, 0x77, 0xd0, 0x33, 0xf2, 0x5b, 0x8e, 0x10, 0x1a, 0x10, 0x6a, 0x3a, 0x77, 0x48, 0x71, 0xee, 0xbe, 0xde, 0xc2, 0x9d, 0x9d, 0xbd, 0xc3, 0x45, 0x0b, 0x0f, 0x68, 0x69, 0x50, 0x4f, 0x73, 0x46, 0x2c, 0x5b, 0x60, 0xc4, 0xba, 0xb8, 0x32, 0x6e, 0xdf, 0x9f, 0xf6, 0x6e, 0x53, 0x2e, 0x2f, 0x33, 0xfa, 0x58, 0x2c, 0x33, 0x5e, 0x9d, 0x1a, 0xf1, 0xff, 0xbd, 0x77, 0x80, 0x4c, 0x6c, 0xc8, 0x49, 0x68, 0xc6, 0x02, 0x20, 0xb7, 0xfd, 0xd3, 0x0e, 0x5e, 0x14, 0x71, 0xc5, 0xdc, 0x5d, 0x44, 0x7e, 0x04, 0x0b, 0xe3, 0x94, 0x26, 0x1b, 0x70, 0x9f, 0x68, 0x64, 0xdc, 0x04, 0xb3, 0xe5, 0xdb, 0x37, 0xd9, 0x23, 0xa7, 0x32, 0xbf, 0xc9, 0x9e, 0x3a, 0x05, 0xe6, 0x5d, 0xfe, 0x73, 0x37, 0xfb, 0xfe, 0x29, 0x43, 0x63, 0x9d, 0xff, 0xd8, 0xb8, 0x2d, 0x48, 0x92, 0xc1, 0xd2, 0x4a, 0x44, 0xe4, 0x92, 0x59, 0x72, 0xc9, 0x0a, 0x03, 0xb6, 0xc5, 0xe9, 0x8b, 0x4a, 0xa6, 0x66, 0x93, 0x27, 0x16, 0xcc, 0x62, 0xe3, 0x1c, 0x6d, 0x4b, 0x36, 0x6a, 0x97, 0x49, 0x06, 0xe4, 0x92, 0x25, 0x59, 0xc4, 0x2b, 0xe2, 0x6f, 0x28, 0x16, 0xe2, 0x62, 0xe1, 0x67, 0x16, 0x2b, 0xef, 0x0e, 0x10, 0xd9, 0x6f, 0x2e, 0x22, 0x4a, 0xe7, 0x47, 0x8b, 0x80, 0x1c, 0x2a, 0xf1, 0x9a, 0xb5, 0x39, 0xf1, 0x1a, 0x2f, 0xd2, 0xd9, 0x95, 0xaa, 0xf7, 0x0d, 0x24, 0xbd, 0x2c, 0xe7, 0xe6, 0x6d, 0x5e, 0x62, 0xf3, 0xf7, 0x1f, 0xe4, 0x81, 0x18, 0xa3, 0x49, 0x18, 0xbd, 0xd8, 0xd6, 0xf7, 0x7d, 0x19, 0x35, 0x63, 0xd5, 0x39, 0xec, 0x09, 0xe5, 0x85, 0x3f, 0xc8, 0x72, 0xb1, 0x9a, 0x53, 0xe3, 0x32, 0xf8, 0xbe, 0x32, 0x46, 0xf7, 0xe1, 0x40, 0x4d, 0x57, 0x9c, 0x9c, 0x66, 0xc3, 0xb0, 0x80, 0x02, 0x01, 0xb4, 0x1f, 0xc1, 0xd2, 0xf8, 0xe3, 0xab, 0x71, 0x61, 0x9b, 0x6a, 0x03, 0xf4, 0xdc, 0x5e, 0xa2, 0xd9, 0x72, 0x70, 0x2d, 0x28, 0xef, 0xbd, 0x4a, 0x04, 0x3a, 0xbb, 0xbd, 0x79, 0xce, 0xc9, 0xa5, 0x5d, 0xd7, 0xac, 0x35, 0x23, 0x9d, 0x7c, 0xd3, 0x87, 0x6b, 0x0b, 0x76, 0x23, 0x58, 0x26, 0xec, 0xda, 0x67, 0x7e, 0xb6, 0x7a, 0xa5, 0xb3, 0x2d, 0x17, 0xaa, 0xc3, 0x60, 0x89, 0x8e, 0xa6, 0x81, 0x57, 0xdb, 0x6e, 0x3b, 0xa5, 0x8b, 0x58, 0x82, 0xc6, 0x16, 0x5c, 0xc6, 0x1f, 0x1f, 0x4e, 0x8d, 0xdb, 0x9e, 0xef, 0xad, 0xcf, 0x4f, 0x05, 0x11, 0x4f, 0x45, 0x18, 0x05, 0xc6, 0xe9, 0xe7, 0xa3, 0x9d, 0x8f, 0xaf, 0xb5, 0x9e, 0x65, 0xec, 0x62, 0x4f, 0x15, 0x17, 0xdb, 0xb5, 0x64, 0x62, 0xa7, 0xd3, 0x7b, 0xc1, 0xfc, 0x2e, 0xf6, 0x05, 0x0f, 0x0f, 0x24, 0x65, 0xe3, 0x87, 0x26, 0xb0, 0x13, 0xf7, 0x30, 0x38, 0x52, 0xd9, 0xf6, 0x35, 0x15, 0x6a, 0x3b, 0x87, 0x6b, 0x77, 0xd1, 0x77, 0x2e, 0xab, 0xaf, 0x2b, 0x6b, 0xfd, 0xfd, 0xa2, 0x73, 0x79, 0x77, 0x45, 0xcf, 0xa4, 0x85, 0x8a, 0x35, 0xd5, 0x44, 0x05, 0x3f, 0xc7, 0xa1, 0xd9, 0x1b, 0x54, 0x68, 0x0b, 0x54, 0xf0, 0x73, 0xa1, 0xd2, 0xa2, 0x11, 0xa2, 0xd3, 0xce, 0x87, 0xdc, 0xc6, 0x62, 0x4d, 0x54, 0xac, 0x7e, 0xef, 0xc1, 0xe3, 0x4a, 0x04, 0x34, 0xe1, 0xea, 0xe4, 0x60, 0x1d, 0x2c, 0x4c, 0xae, 0xad, 0x09, 0xd3, 0xed, 0x38, 0x0e, 0x66, 0x91, 0x6d, 0xf6, 0x2e, 0x95, 0xc9, 0x91, 0x1a, 0x93, 0xfd, 0x43, 0xea, 0x99, 0xd7, 0x92, 0xe6, 0x4a, 0xe3, 0xd6, 0x42, 0x91, 0x75, 0xea, 0x3e, 0x04, 0xf3, 0x20, 0xb6, 0xd0, 0xff, 0x8c, 0xcf, 0xd7, 0xbf, 0xd4, 0x04, 0x83, 0x2f, 0x16, 0xbf, 0xb8, 0x2d, 0xcf, 0x89, 0xd3, 0x4a, 0x64, 0xfc, 0xaf, 0xc3, 0x0f, 0xd9, 0x80, 0xa9, 0x14, 0x79, 0x87, 0x1b, 0xc5, 0x0e, 0xc2, 0x6a, 0x0a, 0x54, 0xb4, 0x15, 0x68, 0x0c, 0xf4, 0xad, 0xc7, 0xe8, 0x4c, 0x1a, 0x14, 0xc7, 0xc0, 0xbd, 0x75, 0x22, 0xa6, 0xdf, 0x00, 0xcd, 0xd9, 0x2d, 0xec, 0xf1, 0xe0, 0x07, 0x72, 0x84, 0x4e, 0x32, 0x11, 0x9e, 0xcb, 0xd8, 0xc2, 0x56, 0x18, 0xcd, 0xf6, 0xdc, 0xaf, 0x36, 0x33, 0x27, 0xe6, 0x99, 0xf5, 0xa6, 0x83, 0x93, 0x88, 0xbf, 0xcb, 0x6c, 0xc0, 0xae, 0x73, 0x88, 0x79, 0x36, 0x00, 0x34, 0x08, 0xfa, 0xb5, 0xcf, 0x31, 0x39, 0x74, 0x9e, 0x01, 0x9d, 0x97, 0x8e, 0x2e, 0x88, 0x54, 0xd7, 0x93, 0x5d, 0x3d, 0xc6, 0xcd, 0xd1, 0x09, 0x7e, 0x4d, 0x23, 0x0e, 0x00, 0xb5, 0x84, 0x46, 0x9a, 0x17, 0x4c, 0xab, 0x6b, 0x57, 0x51, 0xf8, 0x7f, 0x74, 0xb2, 0x4c, 0xe7, 0x63, 0x8c, 0x5b, 0xe3, 0x8f, 0xd3, 0x74, 0x06, 0xea, 0x95, 0xd6, 0xda, 0x36, 0x3d, 0x3f, 0xc4, 0x1e, 0xf0, 0xdb, 0x26, 0xff, 0x96, 0xd0, 0x3d, 0xcb, 0xf0, 0x8b, 0x7d, 0x4f, 0xa9, 0xd4, 0x7b, 0x7e, 0xd3, 0xc3, 0xf1, 0xac, 0x3c, 0xbf, 0x24, 0x4d, 0xc7, 0x25, 0xfd, 0x31, 0x43, 0x71, 0x43, 0xc2, 0x47, 0x5b, 0xc4, 0x67, 0x60, 0xe3, 0x58, 0x47, 0x7c, 0xbe, 0x0a, 0xa5, 0xa3, 0x01, 0x9f, 0x94, 0x11, 0x54, 0x66, 0x8a, 0xae, 0x4e, 0x8c, 0xb3, 0xf9, 0x5d, 0x90, 0xda, 0xa1, 0xd8, 0x28, 0x75, 0x69, 0xbe, 0xf3, 0xc7, 0xd4, 0x78, 0x38, 0x4f, 0x9a, 0x05, 0xb8, 0x0a, 0xbf, 0x7f, 0xa7, 0x73, 0xe3, 0x26, 0x5c, 0x45, 0x73, 0xf2, 0x40, 0xe7, 0xb1, 0xb3, 0xb9, 0xed, 0xa6, 0xa6, 0xf5, 0x42, 0x95, 0x3b, 0x24, 0x7d, 0x05, 0x25, 0xb7, 0x69, 0x7c, 0x4c, 0x3e, 0xaa, 0x97, 0x7d, 0x63, 0x6b, 0xce, 0x02, 0x99, 0x32, 0x5c, 0x53, 0x32, 0x33, 0x8e, 0xa2, 0x09, 0xf1, 0x69, 0xca, 0x62, 0xfe, 0x72, 0xbe, 0xa1, 0xed, 0x19, 0xde, 0x50, 0x59, 0x6c, 0x2d, 0x14, 0xae, 0x7a, 0x7c, 0xbb, 0xc3, 0x63, 0x2d, 0x88, 0xfa, 0x9c, 0x40, 0xb4, 0x89, 0x0e, 0x44, 0xb8, 0xd7, 0x64, 0x0f, 0x39, 0x56, 0xe3, 0x3d, 0xc6, 0x6a, 0xcf, 0xa2, 0x09, 0x77, 0xd0, 0x2b, 0x7d, 0xac, 0x06, 0xbd, 0xd2, 0x3f, 0x83, 0x53, 0x2d, 0xac, 0x8c, 0xaf, 0x1f, 0x6f, 0x5f, 0x41, 0x5e, 0x6b, 0x53, 0x94, 0x1c, 0xf3, 0x19, 0x51, 0xda, 0xeb, 0x28, 0x09, 0xf9, 0x3a, 0x48, 0x7c, 0xea, 0x3c, 0x07, 0x0e, 0x4a, 0xab, 0x02, 0xc4, 0x7d, 0x18, 0xa0, 0xad, 0xb6, 0xd8, 0x3b, 0x3c, 0x52, 0x84, 0x6a, 0x41, 0x84, 0x5f, 0x71, 0x93, 0xc5, 0x44, 0x07, 0x81, 0xab, 0xfe, 0xd6, 0x52, 0x89, 0x96, 0x37, 0x1f, 0xf5, 0x38, 0x8e, 0xf6, 0x5d, 0x6d, 0x84, 0xe4, 0x6c, 0xeb, 0x89, 0xfd, 0xcc, 0x39, 0x8f, 0x51, 0x81, 0xf3, 0x18, 0xab, 0x88, 0xc1, 0xbc, 0x22, 0x3a, 0x4e, 0x6b, 0xda, 0x67, 0x3e, 0xed, 0x96, 0xab, 0x5f, 0x0b, 0x3e, 0xef, 0x96, 0xb5, 0x66, 0x08, 0x75, 0xc0, 0xf9, 0xda, 0x9f, 0xae, 0x5b, 0xad, 0x80, 0xef, 0x2b, 0x1e, 0x4a, 0x4c, 0x29, 0x43, 0x50, 0x0f, 0xc1, 0xda, 0xd8, 0x97, 0x6b, 0x85, 0xc7, 0x5f, 0xff, 0x78, 0x56, 0x53, 0xdd, 0xde, 0x97, 0x01, 0xd0, 0xc6, 0x99, 0xb5, 0x6d, 0xb6, 0xd3, 0x3b, 0x7d, 0xb7, 0xaf, 0x73, 0x8e, 0x88, 0x2f, 0x00, 0x33, 0xe1, 0xd4, 0xda, 0x08, 0x05, 0x67, 0x9f, 0x56, 0xc3, 0x49, 0xcc, 0x4b, 0x4b, 0xdf, 0xe4, 0x49, 0xcd, 0xcb, 0xcd, 0xd1, 0xc9, 0x73, 0x0c, 0xc7, 0x1c, 0x44, 0x7a, 0x62, 0x22, 0x2d, 0x2f, 0xde, 0x90, 0xe0, 0x7b, 0xd8, 0x69, 0x3d, 0xe8, 0x60, 0x8d, 0xee, 0x44, 0x56, 0x8f, 0x18, 0x46, 0xd8, 0x59, 0xc2, 0x06, 0xcb, 0xc1, 0x31, 0xd0, 0x4d, 0x9f, 0x4b, 0x13, 0x00, 0xa9, 0x60, 0xe9, 0x73, 0x35, 0xc2, 0xb2, 0x14, 0xa8, 0x60, 0xe3, 0xfc, 0x6a, 0x34, 0x58, 0xe3, 0xe4, 0x3c, 0x51, 0x25, 0x44, 0xc3, 0xb0, 0x2f, 0x83, 0xc8, 0xae, 0x81, 0x68, 0x28, 0x39, 0xa4, 0x95, 0x51, 0xa8, 0x80, 0xe8, 0xa8, 0x87, 0xd6, 0x27, 0x0f, 0x89, 0x81, 0x24, 0x24, 0x4e, 0x40, 0x39, 0xbb, 0xbd, 0x81, 0x3d, 0xe4, 0xdb, 0xe0, 0xca, 0x42, 0x55, 0x26, 0x27, 0x6d, 0x09, 0x1a, 0xb2, 0x14, 0xa9, 0xcd, 0x71, 0x14, 0x18, 0x7d, 0x9e, 0xd3, 0x9d, 0xaa, 0x8e, 0xb7, 0xed, 0x55, 0xdb, 0xdc, 0x61, 0xde, 0xd8, 0x9f, 0x28, 0x50, 0x19, 0xfd, 0x0c, 0x96, 0x93, 0xfb, 0xde, 0xe5, 0xd3, 0x21, 0x86, 0xd9, 0x59, 0x1a, 0x43, 0x01, 0x97, 0xa7, 0x47, 0x1a, 0x7d, 0x0f, 0xe6, 0xc6, 0x91, 0xff, 0x10, 0x44, 0xf1, 0x1d, 0xfc, 0x93, 0x5d, 0xea, 0x95, 0x7e, 0xc3, 0x3e, 0x3b, 0x51, 0xe2, 0x37, 0xec, 0xd3, 0x93, 0x34, 0xf1, 0x3b, 0xfe, 0x73, 0x97, 0x7d, 0xfb, 0x94, 0x1e, 0xa3, 0xad, 0x76, 0xcc, 0xa9, 0xef, 0xea, 0x58, 0x07, 0x43, 0x9d, 0xb6, 0x3e, 0x8e, 0xc3, 0x74, 0x6a, 0x8e, 0xe5, 0x38, 0x24, 0xf2, 0x8b, 0x1b, 0xf3, 0x60, 0xc7, 0x5d, 0x7c, 0xba, 0x0a, 0xa1, 0x0a, 0x4a, 0x74, 0x36, 0x03, 0x52, 0xcf, 0x52, 0x0b, 0x58, 0xb3, 0x1d, 0x10, 0x76, 0xb1, 0x24, 0xb9, 0x0d, 0x15, 0x9e, 0x55, 0xbf, 0x1d, 0xb0, 0x9e, 0x96, 0x29, 0x2b, 0xb2, 0x8a, 0x6e, 0x22, 0x38, 0x5e, 0x4d, 0xa7, 0x64, 0x16, 0x1a, 0x47, 0x27, 0x26, 0xe4, 0x59, 0xa5, 0xe2, 0x02, 0xd7, 0xd2, 0xd9, 0xf7, 0x5e, 0x96, 0xc4, 0xbd, 0x71, 0x35, 0x7b, 0x8d, 0xaf, 0x48, 0x07, 0x9c, 0x71, 0xe3, 0xd2, 0xf3, 0x1c, 0xa8, 0xa9, 0x0a, 0xa8, 0xe3, 0xd1, 0xc5, 0x15, 0x80, 0x26, 0x36, 0x46, 0x34, 0x0a, 0xe8, 0x62, 0xa7, 0x6c, 0x89, 0x22, 0x46, 0xed, 0xe9, 0x12, 0xd5, 0x44, 0xf7, 0x9b, 0x73, 0xff, 0x72, 0x8c, 0x2a, 0x13, 0xd1, 0x15, 0x8c, 0xae, 0xfa, 0x0b, 0x92, 0x35, 0x61, 0x33, 0x5d, 0xb0, 0xcc, 0x06, 0xf5, 0x36, 0x38, 0x8d, 0xc2, 0xc0, 0x8f, 0xcd, 0xca, 0x8e, 0xfa, 0x83, 0x37, 0xe8, 0x08, 0x6e, 0xd3, 0x02, 0x9c, 0x1e, 0x21, 0xbb, 0x96, 0x19, 0xcd, 0xcb, 0xf2, 0x49, 0xfc, 0x6b, 0x55, 0xf2, 0x7e, 0xa7, 0x24, 0xc7, 0x56, 0xd6, 0xfb, 0x03, 0xb0, 0xb0, 0x7a, 0xf4, 0xfd, 0xc3, 0x23, 0x99, 0x2c, 0x93, 0x75, 0x2c, 0x92, 0xdd, 0xd9, 0x6e, 0x1b, 0x41, 0x2d, 0xed, 0x8d, 0xc2, 0x9b, 0xef, 0x7d, 0x68, 0x5e, 0x86, 0x6d, 0x33, 0xaa, 0x59, 0x88, 0x85, 0x96, 0xf9, 0xf7, 0xf3, 0xff, 0x5b, 0x25, 0x1f, 0x4c, 0x8b, 0x53, 0x9c, 0xcf, 0xcb, 0x92, 0xb9, 0x43, 0x82, 0x5d, 0xb6, 0x75, 0xc7, 0x12, 0xd2, 0x87, 0xb1, 0xd4, 0x71, 0xf0, 0x70, 0x14, 0xbf, 0xe0, 0xf8, 0x7f, 0x41, 0x38, 0xbf, 0xca, 0x92, 0xcf, 0x66, 0x47, 0x44, 0x97, 0xb6, 0xe8, 0x4d, 0x1b, 0xc4, 0x92, 0x2c, 0xf1, 0xa8, 0x6d, 0xec, 0xa7, 0x53, 0xc6, 0x73, 0x28, 0x26, 0x45, 0xd7, 0x62, 0xfd, 0x0a, 0x16, 0x4c, 0xa8, 0x9e, 0x6d, 0x7d, 0x9f, 0xfa, 0x0c, 0x1b, 0x88, 0x5e, 0x27, 0x36, 0x4a, 0x6f, 0xd0, 0x02, 0x1b, 0x53, 0x86, 0x4d, 0x62, 0xef, 0x2e, 0x42, 0x86, 0x4c, 0xba, 0x83, 0x0f, 0x37, 0xe9, 0xb5, 0x6e, 0x94, 0x58, 0x30, 0x86, 0xad, 0x1e, 0x14, 0x79, 0x02, 0xe3, 0x71, 0xfe, 0x12, 0xff, 0x20, 0x0f, 0x0f, 0x34, 0xba, 0xa7, 0xa5, 0xa7, 0xed, 0x2e, 0x8e, 0x81, 0xa2, 0xfb, 0xae, 0x0d, 0x5a, 0xaa, 0x75, 0x67, 0xfe, 0x62, 0xcc, 0x76, 0xf2, 0x42, 0x52, 0x9e, 0x52, 0x91, 0xc9, 0x6b, 0x9c, 0xdf, 0x16, 0x44, 0x3e, 0xa0, 0x68, 0xa5, 0x05, 0x0c, 0x53, 0x6d, 0x18, 0x70, 0x02, 0x83, 0x75, 0x48, 0x30, 0x34, 0x2f, 0xa0, 0xe4, 0x30, 0x58, 0x48, 0xa5, 0xfd, 0x57, 0x91, 0x70, 0x4e, 0xbb, 0x14, 0x7b, 0x77, 0xc7, 0x3a, 0xdf, 0xd7, 0x3d, 0x11, 0x05, 0x7b, 0xa4, 0x77, 0x44, 0xbe, 0x40, 0xb7, 0x9b, 0x37, 0xeb, 0xd6, 0x8d, 0xeb, 0x69, 0x18, 0x67, 0xaf, 0x7e, 0x5c, 0xcf, 0xe9, 0x64, 0xed, 0xb2, 0x07, 0xb2, 0x2c, 0x08, 0x14, 0xb6, 0x76, 0x67, 0xe8, 0x5c, 0x5d, 0xc4, 0xc6, 0x10, 0xf5, 0x72, 0x6f, 0x77, 0x8e, 0x0c, 0x52, 0x22, 0xe3, 0x3a, 0x79, 0x9e, 0xef, 0x4d, 0x7c, 0xe2, 0x78, 0x72, 0x2f, 0xd9, 0xe9, 0x70, 0xc0, 0x88, 0xb5, 0xc4, 0xc9, 0xa1, 0xcc, 0xbf, 0xdb, 0x42, 0xba, 0xf4, 0x43, 0xf8, 0xf4, 0x2e, 0xb9, 0xeb, 0xfd, 0xf3, 0xe3, 0xbf, 0x36, 0x59, 0x68, 0x52, 0x86, 0x0f, 0x35, 0xdc, 0x7e, 0x54, 0x19, 0x4e, 0x57, 0x73, 0x3f, 0x0b, 0x17, 0xc2, 0x51, 0x09, 0x71, 0xdd, 0x81, 0x10, 0xf5, 0xa5, 0x93, 0xba, 0x34, 0xad, 0x5e, 0xe2, 0xda, 0xe2, 0x24, 0x03, 0xc0, 0x11, 0x85, 0x48, 0xcb, 0x86, 0xeb, 0xf4, 0x25, 0x2c, 0x27, 0xf5, 0x1a, 0x58, 0x8f, 0x5a, 0x7b, 0x24, 0xbb, 0x04, 0x7f, 0x73, 0xae, 0x64, 0xec, 0x83, 0x0c, 0x77, 0x34, 0x31, 0xa5, 0x4f, 0x3e, 0x7b, 0xbc, 0x27, 0xc9, 0x2a, 0x85, 0x57, 0xc1, 0xb2, 0xd7, 0x36, 0x5f, 0x30, 0x9d, 0x66, 0xc3, 0xd4, 0xd8, 0x2c, 0xef, 0xdf, 0x7c, 0xfb, 0xe1, 0xea, 0xd4, 0x38, 0x3f, 0x3f, 0x7e, 0x05, 0xdb, 0xc7, 0xd6, 0x37, 0x2e, 0x4b, 0x4f, 0x63, 0x20, 0x86, 0x72, 0x1e, 0xed, 0x0f, 0xff, 0x1e, 0x29, 0x15, 0xbd, 0x4f, 0xfb, 0x23, 0x39, 0x40, 0x95, 0x19, 0x4f, 0x01, 0x20, 0xb0, 0x5d, 0x48, 0xbf, 0xe1, 0x92, 0x82, 0xce, 0xfd, 0xb9, 0xc6, 0xc6, 0x6c, 0x0c, 0xd8, 0x9e, 0x0e, 0xb7, 0x1c, 0x07, 0xfe, 0x79, 0x74, 0x7a, 0xd6, 0xc3, 0x86, 0x0a, 0x17, 0x32, 0x1c, 0xca, 0xfb, 0xea, 0x62, 0x3c, 0x68, 0x10, 0x56, 0x6e, 0x39, 0x62, 0xf6, 0x51, 0xb8, 0xab, 0x22, 0xed, 0x7c, 0x63, 0x5d, 0x5a, 0x0d, 0xe8, 0x54, 0xeb, 0x4c, 0xb1, 0x2b, 0xe6, 0xcf, 0x84, 0x70, 0xf6, 0xd5, 0xed, 0xfa, 0xc4, 0x2d, 0xcf, 0x7b, 0xee, 0x42, 0x41, 0xb9, 0xc2, 0xf7, 0xf6, 0x63, 0x7c, 0x6f, 0xa5, 0xd1, 0xe2, 0x3e, 0x78, 0x3c, 0xd8, 0x22, 0xcc, 0xe6, 0x9b, 0x87, 0x79, 0x06, 0xda, 0x04, 0x42, 0xaa, 0xfd, 0x63, 0x78, 0x17, 0x4c, 0x50, 0xef, 0x7a, 0x1b, 0x0a, 0x78, 0xe0, 0x01, 0x8f, 0xf5, 0x32, 0xbc, 0x4a, 0xa7, 0xef, 0x1a, 0x8f, 0xee, 0xed, 0xc8, 0x6e, 0x27, 0xdc, 0x34, 0x0e, 0x05, 0x5b, 0xd9, 0xe8, 0x83, 0x09, 0xa9, 0x08, 0xbd, 0xa4, 0x93, 0x7b, 0xe3, 0xe4, 0x3e, 0x98, 0xcd, 0x46, 0xcb, 0x88, 0x92, 0x87, 0x1e, 0xc6, 0xdb, 0x39, 0x3e, 0x50, 0x89, 0x4f, 0x18, 0xf9, 0x33, 0xba, 0x58, 0x18, 0x57, 0x11, 0x9d, 0x04, 0x8b, 0x20, 0xab, 0xe5, 0xf6, 0xb6, 0xa7, 0x97, 0x03, 0x06, 0xc0, 0x04, 0x36, 0x00, 0x16, 0xff, 0xc7, 0x77, 0x0f, 0x64, 0xae, 0x2e, 0x7c, 0x6d, 0xa6, 0x55, 0xa5, 0x31, 0x5b, 0xab, 0x35, 0x46, 0xc2, 0x98, 0x2d, 0xd4, 0xca, 0xb4, 0xfd, 0x6a, 0x48, 0x8c, 0xe4, 0xa8, 0xd8, 0x2a, 0x54, 0x4e, 0x57, 0xc9, 0x20, 0x57, 0x5a, 0x0c, 0xec, 0xf1, 0x31, 0x03, 0xbe, 0x0a, 0x9f, 0x73, 0x04, 0x5e, 0xe1, 0xd6, 0x88, 0x5c, 0x6e, 0x57, 0x29, 0xb7, 0x95, 0xc9, 0xdd, 0x57, 0x85, 0xa0, 0x4d, 0xc0, 0xbc, 0x52, 0x85, 0xf0, 0x94, 0x72, 0x3b, 0xfd, 0x56, 0x88, 0x69, 0x13, 0x30, 0xaf, 0x54, 0x21, 0x88, 0x4a, 0x6e, 0x8d, 0xb8, 0x63, 0xff, 0x16, 0x6a, 0x73, 0xb1, 0x4c, 0xa5, 0x9e, 0x27, 0xd1, 0xc1, 0x25, 0xd9, 0x79, 0x63, 0x9c, 0xd3, 0x3e, 0xee, 0x86, 0xd5, 0x8c, 0xb6, 0x96, 0xf3, 0x37, 0xc7, 0x0d, 0xb2, 0x32, 0xff, 0x6f, 0xc8, 0xba, 0x81, 0x60, 0x87, 0xf7, 0x73, 0xe1, 0xf6, 0x65, 0xfd, 0xdd, 0xf6, 0x7e, 0x2e, 0xee, 0x72, 0x83, 0x7f, 0x6f, 0x0a, 0x09, 0x69, 0x82, 0xe4, 0x7a, 0xf5, 0x30, 0x9e, 0xd1, 0xda, 0xfe, 0xa8, 0x97, 0xd3, 0x03, 0x45, 0x28, 0xa8, 0xb1, 0x51, 0xdb, 0xcd, 0xda, 0xfe, 0x2c, 0x1b, 0x97, 0x1b, 0x42, 0x3f, 0x3e, 0xcd, 0x7f, 0xf5, 0x6f, 0xca, 0x02, 0x66, 0x84, 0x33, 0xb6, 0xd8, 0x43, 0x7c, 0x49, 0x26, 0x64, 0x36, 0x7b, 0xaa, 0x18, 0xb6, 0x2d, 0x29, 0x0d, 0x10, 0xda, 0x7f, 0x7f, 0xc7, 0x35, 0x04, 0xb9, 0xe5, 0x8d, 0x62, 0x31, 0x26, 0xbe, 0x71, 0x42, 0x96, 0x7f, 0xf1, 0xfe, 0xfc, 0x42, 0xd7, 0xe4, 0xcd, 0x99, 0x31, 0x32, 0xae, 0x66, 0xab, 0x45, 0x1f, 0x36, 0x62, 0x72, 0x80, 0x5c, 0xab, 0xbc, 0x71, 0xaa, 0x19, 0xa0, 0xfe, 0x60, 0x63, 0x23, 0x4b, 0x81, 0xcd, 0xc9, 0xcd, 0xf5, 0xc7, 0xeb, 0x1e, 0x56, 0x3a, 0x72, 0x64, 0xec, 0x1d, 0x23, 0xf3, 0xe2, 0x29, 0x9c, 0xcd, 0x79, 0x77, 0x72, 0xe7, 0x64, 0xaa, 0x4e, 0x56, 0x7a, 0xa4, 0x92, 0x62, 0x7c, 0x4a, 0xb3, 0xd7, 0xf3, 0x29, 0xf6, 0x35, 0x5c, 0xae, 0x1e, 0x5c, 0xfd, 0x9e, 0x68, 0xcf, 0xed, 0xb6, 0x89, 0x40, 0x0d, 0x5c, 0xd9, 0xd6, 0xc8, 0xac, 0xd9, 0x23, 0xd6, 0xb0, 0xff, 0xe7, 0x35, 0x2d, 0x3d, 0x6a, 0x1d, 0x02, 0x8c, 0x9d, 0x1a, 0xa4, 0xb8, 0x6b, 0xdb, 0x39, 0xfd, 0x55, 0x23, 0xd9, 0x55, 0xbb, 0xa8, 0x2f, 0x57, 0x04, 0x2c, 0xb4, 0xb2, 0xc8, 0xc5, 0x7b, 0x1e, 0xcf, 0x7d, 0x10, 0x96, 0xc6, 0xc5, 0xae, 0x36, 0x62, 0x83, 0xb1, 0x49, 0x11, 0x03, 0x08, 0x6b, 0x20, 0x06, 0x77, 0xab, 0x62, 0xce, 0x6e, 0x55, 0x0c, 0x77, 0xa9, 0x62, 0xc0, 0xd5, 0x05, 0x0c, 0xef, 0x7a, 0xe7, 0xa2, 0x42, 0xc3, 0x34, 0xba, 0x0a, 0xf0, 0x33, 0x06, 0x94, 0x50, 0x15, 0x50, 0x5e, 0x06, 0x93, 0xd8, 0xed, 0x0f, 0x61, 0x65, 0xae, 0x5a, 0x50, 0x15, 0x56, 0x5e, 0xcd, 0xc8, 0xd3, 0x68, 0x49, 0xd2, 0x1c, 0xd8, 0x71, 0x44, 0x7e, 0xce, 0x3a, 0xe1, 0x64, 0xdb, 0xeb, 0xcb, 0xab, 0xa3, 0x0a, 0x82, 0x8a, 0x58, 0xec, 0x7a, 0xaf, 0xf4, 0xbe, 0xa0, 0x61, 0xd9, 0x44, 0x91, 0xeb, 0x78, 0xde, 0x79, 0xd0, 0x83, 0x08, 0x02, 0x80, 0x32, 0x31, 0x34, 0x3a, 0x7f, 0xff, 0x55, 0x18, 0xa6, 0xdd, 0x3e, 0x79, 0xaa, 0xb9, 0x16, 0xd7, 0xd1, 0x36, 0xca, 0x62, 0x6d, 0xa1, 0x06, 0x94, 0x16, 0xb1, 0x64, 0xec, 0xb8, 0x54, 0xa0, 0x7c, 0x95, 0x24, 0x84, 0xf8, 0xfd, 0x02, 0x1f, 0x5a, 0x46, 0xc8, 0xda, 0x58, 0x6b, 0xb0, 0xe2, 0x2e, 0x91, 0xb4, 0xf8, 0xd0, 0x65, 0x06, 0x0e, 0x8d, 0x0c, 0x6c, 0xdc, 0x8e, 0xc3, 0x5f, 0x06, 0xb2, 0xcd, 0xc2, 0x7d, 0xec, 0x60, 0xaf, 0x18, 0xa6, 0x2a, 0xfc, 0x63, 0x31, 0x5f, 0xa7, 0x26, 0xf6, 0x40, 0xf2, 0xa6, 0xa6, 0x5b, 0x8b, 0x09, 0x7e, 0x01, 0x4c, 0x5a, 0xdc, 0x1a, 0x3a, 0xbd, 0x26, 0x40, 0x92, 0xd5, 0x1e, 0x40, 0x42, 0x4f, 0x50, 0xc6, 0x24, 0xfe, 0x9c, 0x49, 0xf8, 0xb0, 0x3b, 0xfb, 0xf9, 0xe2, 0x81, 0x5b, 0xf3, 0x29, 0xf2, 0xa6, 0x9c, 0x76, 0x6f, 0x3c, 0x16, 0xd0, 0xf9, 0xc5, 0x86, 0x72, 0xbe, 0x06, 0xd1, 0x32, 0x69, 0x60, 0xaa, 0xf1, 0xd1, 0xde, 0x5e, 0x47, 0x2a, 0x9a, 0xc3, 0x49, 0xf9, 0x58, 0x15, 0x80, 0xa2, 0xf3, 0x7d, 0x9a, 0xce, 0xc8, 0xe2, 0x9e, 0xfb, 0x98, 0x91, 0xe2, 0xd8, 0x94, 0x85, 0x6a, 0xdf, 0x27, 0x8d, 0x6a, 0xeb, 0xee, 0x56, 0x23, 0x1f, 0xcb, 0xba, 0xc9, 0x15, 0x99, 0x72, 0x01, 0x6a, 0x39, 0xae, 0xaa, 0xca, 0xef, 0x16, 0x5e, 0x25, 0x2c, 0xbe, 0x4a, 0x90, 0xbf, 0x4a, 0xdc, 0xd5, 0x94, 0x73, 0xa2, 0xc5, 0x7f, 0xd7, 0x31, 0x90, 0x20, 0x9d, 0x29, 0x18, 0xe4, 0x98, 0x0a, 0xd1, 0xcf, 0x81, 0x09, 0xa4, 0xc2, 0xee, 0x2d, 0xbf, 0x08, 0x1f, 0x84, 0x40, 0xc2, 0xe4, 0x46, 0x41, 0xa6, 0xf8, 0xff, 0x29, 0xa3, 0xf2, 0xda, 0xb7, 0x5b, 0xc4, 0x86, 0xef, 0xd2, 0x53, 0xbe, 0xcb, 0x44, 0xee, 0xb3, 0x59, 0xb0, 0xa4, 0xcf, 0x23, 0xfd, 0x5e, 0x57, 0xbd, 0x72, 0x76, 0x3b, 0xac, 0x52, 0x93, 0x0b, 0xf2, 0x40, 0x4f, 0x56, 0x63, 0x2a, 0xb7, 0xe0, 0x1b, 0xe0, 0xd3, 0xc6, 0xa5, 0x3b, 0x4a, 0x97, 0x6e, 0x6d, 0x7c, 0xda, 0x73, 0x91, 0x51, 0x0b, 0x91, 0x77, 0xcb, 0x60, 0xf8, 0x52, 0x50, 0xf0, 0xc3, 0xe2, 0x20, 0xd5, 0x61, 0xb9, 0x24, 0x77, 0xc1, 0xc4, 0xf8, 0x34, 0xea, 0xd5, 0x10, 0x20, 0xd7, 0x10, 0x1f, 0xaa, 0x34, 0xa4, 0x08, 0x4b, 0x6f, 0x87, 0x47, 0x7d, 0x36, 0xcb, 0x0f, 0x4c, 0xe2, 0x68, 0x6a, 0x4f, 0x1f, 0xd3, 0x32, 0x5c, 0x9b, 0x1c, 0x4f, 0xa5, 0x4d, 0xbb, 0x25, 0x10, 0x15, 0x82, 0x2a, 0x4f, 0x05, 0x8a, 0x1e, 0xd9, 0x95, 0xab, 0x15, 0x43, 0x9a, 0xaa, 0x18, 0x72, 0x44, 0x96, 0xab, 0x68, 0x5e, 0x14, 0x91, 0x5d, 0x9e, 0xb6, 0x12, 0xd1, 0x6a, 0x60, 0x35, 0xb3, 0xb7, 0x64, 0x35, 0xe3, 0xc1, 0x3d, 0x75, 0x4d, 0x24, 0x97, 0xeb, 0x5b, 0x10, 0x18, 0x27, 0xf1, 0x77, 0x8b, 0x58, 0xdf, 0xc5, 0xf7, 0x67, 0x6e, 0xab, 0xf4, 0x66, 0x59, 0x5c, 0xd2, 0x3a, 0xaa, 0x22, 0x1b, 0x0e, 0x88, 0x41, 0xad, 0x51, 0x5b, 0xa5, 0x1f, 0x4d, 0x40, 0x39, 0x0d, 0x67, 0x8f, 0xf7, 0xc1, 0xfc, 0x98, 0x44, 0x12, 0xae, 0xc2, 0x0d, 0xf1, 0x78, 0xb1, 0x5c, 0xb5, 0xde, 0xe8, 0xb1, 0x59, 0x87, 0xc7, 0x97, 0xb4, 0xd5, 0x43, 0xe7, 0xfe, 0xf4, 0x3a, 0xbb, 0xf5, 0x39, 0x4a, 0xb0, 0x12, 0x70, 0x26, 0x7c, 0x39, 0xa7, 0x51, 0xf0, 0x83, 0xca, 0xd9, 0x96, 0xb6, 0xb4, 0x81, 0x15, 0x9a, 0xa8, 0x76, 0x16, 0x80, 0x3f, 0x36, 0xa1, 0x2d, 0x1f, 0x5b, 0x68, 0x4b, 0xcd, 0x96, 0x40, 0xb2, 0xdd, 0x90, 0x56, 0x61, 0x37, 0x24, 0x62, 0xbb, 0x21, 0x61, 0xd7, 0xb6, 0x6b, 0x62, 0x82, 0x34, 0x83, 0xe5, 0x79, 0x26, 0xd9, 0x04, 0x70, 0x9d, 0x09, 0x01, 0xc5, 0x13, 0xd6, 0x2a, 0x82, 0x45, 0xb3, 0x46, 0x6f, 0x28, 0xae, 0xdb, 0x4c, 0xab, 0xa2, 0x8b, 0x70, 0xba, 0xcc, 0x26, 0xdf, 0x46, 0xf1, 0xef, 0xfd, 0x4e, 0x73, 0x42, 0x31, 0x28, 0x6e, 0xdb, 0xec, 0x88, 0x4f, 0x4d, 0x99, 0x57, 0x30, 0x73, 0x55, 0x07, 0x79, 0x2f, 0xbb, 0x95, 0xb3, 0xa5, 0x99, 0x3a, 0x22, 0x56, 0xc8, 0x30, 0xd7, 0x22, 0x8e, 0x62, 0x8b, 0x96, 0xfc, 0x87, 0x12, 0x9d, 0xf1, 0x0e, 0x6d, 0x9a, 0x21, 0x17, 0xd7, 0xd9, 0x44, 0x5c, 0x77, 0x6f, 0xc4, 0xf5, 0x5a, 0x8a, 0x4b, 0x35, 0xc4, 0x35, 0xce, 0x23, 0x4a, 0x17, 0xcb, 0xa7, 0x19, 0xe5, 0xcb, 0xe8, 0x5e, 0xf6, 0x5d, 0x57, 0x69, 0xf2, 0x36, 0x7b, 0xd7, 0x50, 0xe7, 0x5d, 0x27, 0x9d, 0xe7, 0x77, 0x06, 0x99, 0xfb, 0x69, 0xed, 0x7a, 0x33, 0x13, 0x23, 0xa4, 0x43, 0x25, 0x24, 0x7f, 0x1a, 0xd3, 0x04, 0xae, 0xe9, 0x33, 0x72, 0x10, 0xa1, 0xcf, 0x20, 0x48, 0x03, 0xef, 0x8f, 0x49, 0x4e, 0xe8, 0x84, 0x28, 0xad, 0xf8, 0x46, 0x36, 0xa7, 0xfc, 0x1a, 0x8a, 0x06, 0x44, 0x7f, 0xc3, 0x23, 0x44, 0x53, 0x01, 0xe5, 0x8f, 0x17, 0xbb, 0xd9, 0xe6, 0x28, 0x9f, 0x05, 0x41, 0xdb, 0xce, 0x82, 0xd8, 0x75, 0xd7, 0x72, 0xbb, 0x1d, 0x18, 0x88, 0x56, 0xc1, 0x78, 0x1d, 0xfd, 0x8e, 0x36, 0x12, 0xfb, 0x84, 0x63, 0xc9, 0x86, 0x06, 0x87, 0x02, 0xc5, 0xd9, 0x54, 0xd8, 0xb7, 0xc0, 0x71, 0x0a, 0x27, 0xab, 0xf8, 0xe8, 0x5e, 0x9a, 0x16, 0xaa, 0x04, 0x0a, 0x5b, 0x9a, 0x56, 0x7e, 0xd9, 0x90, 0xed, 0xe6, 0xd6, 0x21, 0x50, 0x17, 0x48, 0x03, 0x6c, 0x65, 0x67, 0x9e, 0xe4, 0x60, 0xb8, 0x7a, 0x61, 0x06, 0xcf, 0xc3, 0x50, 0xcb, 0xf5, 0x04, 0x58, 0xe2, 0x08, 0x0f, 0xee, 0xeb, 0xe4, 0xab, 0x24, 0x69, 0xad, 0x79, 0x5e, 0xb8, 0xc0, 0x0e, 0xb0, 0x61, 0x55, 0x60, 0x99, 0x7f, 0x7d, 0x35, 0x22, 0x13, 0xdf, 0xf4, 0x0f, 0x4a, 0xe4, 0xcd, 0x67, 0xff, 0x26, 0x76, 0x56, 0x72, 0x87, 0x44, 0xa6, 0xd6, 0xb7, 0x57, 0xd6, 0x51, 0x3a, 0xd1, 0xd6, 0xc1, 0x18, 0x30, 0x37, 0x89, 0xd6, 0x01, 0x12, 0xd0, 0xe6, 0x28, 0x8d, 0x9f, 0x0b, 0x25, 0x78, 0xc0, 0x28, 0x01, 0x95, 0x2e, 0xdd, 0x0e, 0x28, 0x15, 0x50, 0x1a, 0x0f, 0x28, 0x35, 0x27, 0x83, 0x6d, 0x5b, 0x6c, 0xb3, 0xbc, 0x7a, 0xe7, 0xba, 0xb6, 0x6d, 0x8c, 0x56, 0x8f, 0xf1, 0x65, 0x22, 0x4d, 0x5e, 0x1c, 0x87, 0xbf, 0x24, 0x44, 0xba, 0x07, 0xbb, 0xd4, 0x48, 0xb3, 0x17, 0xc6, 0xf4, 0x32, 0x96, 0x41, 0x8c, 0x45, 0x84, 0xbe, 0x8c, 0xde, 0x1f, 0x95, 0x1a, 0x98, 0xa1, 0xf1, 0x7e, 0xfe, 0xb8, 0x5a, 0x1a, 0xa7, 0xc1, 0xe2, 0xb1, 0x78, 0x37, 0xec, 0x28, 0xcd, 0x53, 0x22, 0x57, 0xb7, 0xdb, 0xaf, 0xe6, 0x2c, 0x93, 0xab, 0x3b, 0x3a, 0xdb, 0xeb, 0x51, 0x35, 0x49, 0x54, 0x1f, 0xd4, 0x3a, 0x6c, 0xba, 0x5d, 0x5c, 0x3d, 0x9e, 0xef, 0xcd, 0x0b, 0x03, 0x7f, 0xbd, 0x35, 0x10, 0x16, 0x96, 0x06, 0xae, 0x77, 0x06, 0xe2, 0xf5, 0xce, 0x40, 0x2b, 0xc7, 0x10, 0xad, 0x93, 0x8e, 0x60, 0x9d, 0x74, 0x84, 0x92, 0xa4, 0xa3, 0x58, 0x61, 0xd0, 0xae, 0x19, 0x15, 0xd5, 0x4a, 0xa7, 0x40, 0x64, 0xc7, 0x67, 0x92, 0x09, 0x3b, 0x29, 0x0b, 0x4b, 0x26, 0xb1, 0x36, 0x5c, 0x9c, 0x18, 0xf1, 0x5f, 0x9f, 0x8d, 0x5e, 0x41, 0x53, 0xdd, 0xe6, 0x1d, 0xcb, 0x1c, 0x23, 0x00, 0xca, 0xb4, 0x07, 0x0c, 0xa3, 0x6b, 0xfa, 0x23, 0x9c, 0xad, 0xd2, 0xc3, 0x83, 0xd2, 0x66, 0xcc, 0x57, 0xb5, 0x25, 0xab, 0x6d, 0xff, 0x4a, 0x0e, 0x96, 0x29, 0xc4, 0xc5, 0x15, 0xb0, 0xde, 0xcf, 0xa7, 0xc1, 0x3c, 0x58, 0x3e, 0xbd, 0x3e, 0xcc, 0xd0, 0x86, 0x98, 0x99, 0x6e, 0x13, 0x66, 0x5f, 0xe6, 0xb3, 0xe0, 0x21, 0x58, 0xd2, 0x6c, 0x3e, 0xb9, 0xdf, 0xeb, 0xd8, 0x72, 0xe6, 0x5c, 0x81, 0x7c, 0xfe, 0x13, 0x1d, 0xaf, 0x66, 0xe4, 0x70, 0xc9, 0x84, 0xad, 0x8d, 0x69, 0x73, 0xe9, 0x58, 0x2c, 0x6c, 0xe4, 0x90, 0x5c, 0x24, 0x8a, 0xb4, 0x2e, 0x72, 0x92, 0x0c, 0x99, 0xb5, 0x43, 0xb2, 0x73, 0x7f, 0xe4, 0xac, 0xdd, 0x91, 0xc5, 0xbc, 0x11, 0x56, 0x4c, 0xf3, 0x81, 0xaa, 0xfb, 0xcd, 0x0b, 0x4d, 0x69, 0x48, 0x97, 0x6d, 0xcc, 0xd5, 0x48, 0xb4, 0xd1, 0xe9, 0x98, 0x96, 0x9f, 0xf8, 0xec, 0xb3, 0x31, 0x3a, 0x3b, 0x28, 0x7a, 0x1d, 0xd8, 0xc1, 0x15, 0xdb, 0x83, 0x2c, 0x50, 0x73, 0xb0, 0x80, 0x07, 0x0d, 0x2f, 0x68, 0x68, 0xdc, 0x56, 0x9a, 0x96, 0xb7, 0xf3, 0xca, 0xed, 0x1a, 0x0c, 0xf2, 0xa7, 0x1b, 0x63, 0xc1, 0x11, 0x9e, 0x8d, 0xe2, 0xc0, 0xf1, 0x31, 0x8c, 0x96, 0xca, 0x5e, 0x8b, 0xf6, 0x57, 0x92, 0xf5, 0x2d, 0xa0, 0x2e, 0xb2, 0xe5, 0x1b, 0x5f, 0x2b, 0xc1, 0x5a, 0xfc, 0x48, 0x12, 0xfb, 0x68, 0x8a, 0x1c, 0x5d, 0x3a, 0xa5, 0x0e, 0x9d, 0xea, 0x69, 0x8e, 0x0d, 0x92, 0x60, 0x53, 0x53, 0x88, 0xee, 0xfc, 0x41, 0xf2, 0x6e, 0x4a, 0x4b, 0x28, 0x8c, 0x7f, 0x3a, 0xbb, 0x7d, 0xff, 0xf1, 0xcb, 0xad, 0x56, 0x33, 0xa5, 0xb9, 0x7f, 0x7d, 0xa4, 0xcd, 0x87, 0x07, 0x24, 0x0e, 0x34, 0x63, 0xa2, 0xb4, 0x44, 0xc9, 0x6f, 0x8c, 0x51, 0xf5, 0x45, 0xc0, 0x8e, 0x76, 0x38, 0xe2, 0xa6, 0xfa, 0x83, 0xdd, 0xd2, 0x90, 0x9b, 0x16, 0xdf, 0xdd, 0x2d, 0x70, 0x8e, 0x7d, 0xa2, 0xbf, 0x24, 0xd7, 0x7d, 0xaf, 0x43, 0xab, 0xe8, 0x08, 0x84, 0x73, 0x6d, 0xad, 0xa2, 0xab, 0x31, 0xf3, 0x83, 0xca, 0x3b, 0xef, 0x34, 0xde, 0x2c, 0x1f, 0xd8, 0x06, 0x42, 0x3d, 0xe6, 0xd3, 0xc5, 0xe9, 0xe8, 0x60, 0x1d, 0x3d, 0xda, 0x78, 0x6b, 0x40, 0xbe, 0xf7, 0xc8, 0x13, 0xf6, 0x1e, 0x7d, 0x0a, 0xe6, 0x4b, 0x1a, 0xff, 0xbf, 0x8d, 0xd1, 0xcf, 0x60, 0x99, 0x12, 0x4e, 0x86, 0x75, 0xc6, 0xe7, 0xe5, 0x6e, 0x71, 0x0f, 0xc1, 0x62, 0x02, 0xd2, 0x08, 0xe4, 0xf9, 0xef, 0x73, 0xa6, 0x9f, 0xaf, 0x44, 0x15, 0x2c, 0x64, 0xb8, 0x88, 0x91, 0x7a, 0x08, 0x8d, 0x4f, 0xd8, 0xea, 0x0c, 0x2b, 0xaf, 0x16, 0x2a, 0xf8, 0xac, 0x0b, 0x80, 0x75, 0xcf, 0x1b, 0xd7, 0x2f, 0x50, 0xd1, 0xaf, 0xd1, 0x67, 0xa1, 0x39, 0x76, 0x9d, 0x08, 0x71, 0xd7, 0x89, 0x10, 0xb8, 0x4e, 0x84, 0xa0, 0x75, 0x22, 0xc4, 0xd9, 0xdc, 0xbd, 0x6c, 0x31, 0xa7, 0xd9, 0xa4, 0x69, 0xc5, 0xf4, 0x53, 0xae, 0x47, 0x3a, 0xd8, 0x38, 0x12, 0x6c, 0x46, 0x0d, 0xde, 0xbe, 0xeb, 0xe9, 0x9d, 0x26, 0x91, 0xda, 0xee, 0x22, 0xb3, 0x58, 0x2a, 0x15, 0x60, 0x47, 0x30, 0xb4, 0x5f, 0xdf, 0x9f, 0xbe, 0x3f, 0x12, 0x23, 0xaa, 0xf4, 0x65, 0x02, 0x73, 0xbd, 0xed, 0x6d, 0x17, 0xec, 0x2b, 0x56, 0x6b, 0x2e, 0x91, 0xf2, 0x11, 0xc1, 0x1a, 0x34, 0x98, 0x76, 0xf1, 0xe2, 0x12, 0x83, 0xf5, 0xd4, 0x90, 0x36, 0xcb, 0x71, 0x32, 0xe5, 0x38, 0x8d, 0xee, 0x03, 0x3a, 0x4b, 0x09, 0x31, 0xbc, 0x04, 0x22, 0x97, 0x23, 0xd4, 0x49, 0x5b, 0x35, 0x93, 0x0b, 0xb5, 0x0e, 0xba, 0x70, 0x1d, 0x5d, 0x7e, 0xfd, 0x74, 0x6e, 0x6a, 0x38, 0x9c, 0xc6, 0x99, 0x45, 0x2b, 0xdf, 0x65, 0x37, 0xc6, 0x32, 0x5c, 0xd8, 0xf0, 0xe9, 0x33, 0xde, 0xeb, 0xde, 0x6c, 0x7d, 0xb1, 0x7b, 0xd7, 0xc9, 0xcd, 0x2e, 0xbe, 0x1d, 0x4c, 0x58, 0xcf, 0x93, 0xe0, 0x74, 0x9e, 0xbe, 0x87, 0xc6, 0x51, 0x10, 0x19, 0xe7, 0xb3, 0x30, 0x1b, 0xe4, 0xd7, 0x69, 0x5b, 0xed, 0x7e, 0xed, 0xb4, 0x4e, 0xf6, 0xbd, 0x7e, 0xef, 0x74, 0x21, 0xfb, 0xbe, 0x79, 0x53, 0x11, 0x1e, 0xf3, 0xb4, 0x0e, 0xf6, 0xa5, 0x38, 0x4d, 0x67, 0x61, 0x77, 0x71, 0x8c, 0xd8, 0xc8, 0x5f, 0x64, 0x9b, 0x25, 0xa6, 0x9e, 0xb5, 0x65, 0xff, 0x6f, 0x58, 0x3b, 0x27, 0xa9, 0xdf, 0x50, 0x00, 0x7c, 0xcb, 0x51, 0x09, 0x3e, 0xf4, 0x1e, 0x15, 0xef, 0xb9, 0x20, 0x53, 0x10, 0x71, 0xae, 0x34, 0xc5, 0x2b, 0x29, 0x69, 0x3d, 0x96, 0x98, 0xa8, 0x3b, 0xdf, 0xe3, 0xba, 0x41, 0xdd, 0xb3, 0x6e, 0xd7, 0xb3, 0x46, 0xcb, 0xbb, 0xcb, 0xf6, 0xd4, 0x93, 0x72, 0xb2, 0xe3, 0xed, 0xe7, 0xf9, 0xac, 0xda, 0x34, 0x1e, 0xfb, 0xfe, 0x71, 0xfa, 0xc9, 0x1b, 0x5a, 0x0e, 0xa6, 0x1a, 0x56, 0x6d, 0xfb, 0x95, 0xd7, 0x3a, 0x87, 0x26, 0xb4, 0x5f, 0xb9, 0x6d, 0x38, 0xaa, 0x53, 0x13, 0x02, 0x34, 0xd2, 0x8a, 0x71, 0x84, 0x9f, 0x65, 0x85, 0x70, 0x39, 0x2f, 0x14, 0x23, 0xf5, 0xf4, 0xeb, 0xf5, 0x35, 0xe6, 0xb8, 0x1e, 0x60, 0x15, 0xcb, 0xa9, 0x2f, 0x88, 0xfb, 0x17, 0x31, 0x4e, 0x0e, 0x2b, 0x8d, 0x8a, 0xba, 0x04, 0xc4, 0x94, 0x01, 0x72, 0x73, 0xd6, 0x3b, 0xda, 0x76, 0xee, 0x5c, 0x6c, 0xd1, 0xb9, 0x7c, 0xbe, 0xba, 0x1a, 0x9c, 0x8a, 0xac, 0x1c, 0x4e, 0x04, 0xc3, 0x11, 0x91, 0xf9, 0x1d, 0xdd, 0x49, 0x2e, 0xc5, 0xac, 0x83, 0xc9, 0xde, 0xb2, 0xef, 0x7b, 0x17, 0x79, 0x56, 0x64, 0xb3, 0x11, 0x21, 0x31, 0xe7, 0xfe, 0xf9, 0xcb, 0xbf, 0x8f, 0x64, 0x10, 0xad, 0xcb, 0x4c, 0xde, 0xba, 0xed, 0xc1, 0x2c, 0xb4, 0x3d, 0x30, 0x02, 0x92, 0x18, 0x43, 0x0e, 0x0a, 0x6e, 0x01, 0x0a, 0xdc, 0x12, 0x94, 0x3c, 0x37, 0x50, 0x5d, 0x0f, 0x01, 0x1a, 0x6b, 0x22, 0x3c, 0xae, 0x9f, 0xda, 0xe5, 0xb1, 0x93, 0xb7, 0x57, 0x38, 0xcd, 0xb4, 0xcb, 0x78, 0x11, 0x01, 0xdc, 0x50, 0x57, 0xdc, 0x96, 0x63, 0xb6, 0xb8, 0x36, 0x0f, 0xdd, 0x62, 0x36, 0x10, 0x0a, 0x7e, 0xf4, 0xea, 0xe4, 0x75, 0xad, 0x6d, 0x45, 0x1b, 0x2e, 0x28, 0x75, 0x2d, 0x11, 0x98, 0xd3, 0xab, 0x12, 0x87, 0xf8, 0xf6, 0x33, 0xb6, 0x7b, 0x86, 0x0d, 0xd0, 0x5f, 0xde, 0xea, 0x49, 0xb0, 0xf9, 0x4a, 0xa3, 0xc5, 0x6a, 0x91, 0x41, 0x14, 0xcc, 0xef, 0x9e, 0x91, 0xc1, 0xad, 0x63, 0x5a, 0x1b, 0x3e, 0x59, 0x8f, 0x45, 0x23, 0x98, 0x36, 0xd3, 0xd1, 0x3b, 0x52, 0x4d, 0x76, 0xb6, 0x2f, 0x2c, 0xd9, 0x0d, 0xe7, 0xbb, 0x7e, 0x40, 0x10, 0x37, 0xbb, 0xbb, 0xf8, 0x9f, 0xf4, 0xab, 0x23, 0x74, 0x36, 0x15, 0x3b, 0x02, 0x1b, 0xd7, 0xb2, 0x37, 0x8e, 0xd0, 0xd6, 0x77, 0x95, 0x7a, 0xdb, 0x76, 0x4c, 0x9a, 0x6d, 0x3a, 0x26, 0x0b, 0x97, 0xad, 0xfa, 0x5e, 0x0a, 0x94, 0xa5, 0x79, 0x3d, 0xdb, 0xb4, 0x5a, 0x43, 0xf3, 0xfa, 0x3b, 0x4a, 0xf1, 0x24, 0x83, 0xc5, 0x27, 0x42, 0xdf, 0x60, 0x11, 0x1e, 0xce, 0xbf, 0xb0, 0x9b, 0xaa, 0xab, 0x2d, 0x1d, 0x41, 0x54, 0x96, 0x98, 0xc7, 0x56, 0x5b, 0x1b, 0x8f, 0xa0, 0x95, 0xcd, 0xfa, 0xd5, 0x1c, 0x8e, 0x9a, 0x80, 0xb0, 0x9b, 0xed, 0x67, 0xcf, 0xd0, 0x7a, 0x5d, 0x7f, 0x4a, 0x6a, 0x53, 0x12, 0x53, 0x33, 0xc3, 0x68, 0x02, 0x04, 0x9a, 0x7b, 0x35, 0x46, 0xbd, 0xbd, 0x5b, 0xf8, 0x1e, 0x5f, 0x2c, 0x6b, 0x4e, 0x35, 0xb0, 0x6a, 0xb6, 0xbb, 0xaf, 0x76, 0xfd, 0x3b, 0x37, 0x2e, 0xc8, 0x01, 0x6a, 0xad, 0xfa, 0x1a, 0x2c, 0x89, 0x5a, 0x9f, 0x32, 0xe7, 0x23, 0xf1, 0x49, 0x58, 0xe5, 0x93, 0xb0, 0xb6, 0x92, 0x6c, 0x45, 0xad, 0xbe, 0xbe, 0x89, 0x0b, 0x5b, 0xaa, 0xaf, 0xc2, 0x9f, 0x34, 0x3a, 0x4a, 0x2b, 0xf6, 0x67, 0xbf, 0xfa, 0x7d, 0x09, 0x87, 0x99, 0xc1, 0x15, 0x72, 0x15, 0x6b, 0x88, 0x2a, 0xf9, 0x8a, 0x57, 0xca, 0xf8, 0xa5, 0xaf, 0x4d, 0x00, 0x09, 0x8c, 0x5f, 0x0c, 0x2a, 0xd6, 0x06, 0x32, 0x58, 0xe0, 0xd2, 0x2a, 0x4b, 0x17, 0x8b, 0x67, 0xaf, 0xb8, 0x97, 0xb5, 0xcb, 0x82, 0x9b, 0xb5, 0x65, 0xc1, 0x0d, 0xef, 0xbe, 0xe0, 0xc6, 0x55, 0xc8, 0xb3, 0x84, 0xd4, 0x60, 0x6a, 0x89, 0x52, 0x56, 0xce, 0x21, 0x41, 0x28, 0x99, 0x5b, 0xb4, 0x50, 0x15, 0xad, 0x5f, 0xc6, 0x65, 0x30, 0x0f, 0x9e, 0x31, 0xbb, 0xbc, 0xf3, 0xaa, 0x6d, 0xcb, 0xfc, 0xb2, 0x37, 0x15, 0x96, 0x64, 0x30, 0x58, 0x1e, 0x62, 0x58, 0x06, 0x35, 0xaa, 0xe2, 0x35, 0x71, 0x64, 0x87, 0x6e, 0xc0, 0x4b, 0x95, 0x65, 0x05, 0x40, 0xcc, 0xb2, 0x46, 0xa1, 0xd5, 0xc3, 0x7d, 0x73, 0xeb, 0x56, 0x67, 0x31, 0xfb, 0x34, 0x02, 0x3b, 0xcc, 0xcc, 0x1e, 0xc0, 0xdd, 0x81, 0xe7, 0xe5, 0x1c, 0x0b, 0xd5, 0x22, 0x73, 0x80, 0x07, 0x09, 0x74, 0x71, 0x90, 0xb8, 0xe2, 0xa0, 0x8a, 0xe2, 0xc0, 0xd7, 0xa0, 0x38, 0x78, 0x63, 0xc5, 0xc9, 0xf7, 0x05, 0x98, 0x42, 0x83, 0x56, 0x03, 0x32, 0xaf, 0x3f, 0xd7, 0x97, 0xcf, 0xd7, 0xbb, 0xcf, 0x8a, 0x8c, 0xb5, 0x5b, 0x64, 0xec, 0x0e, 0x91, 0x71, 0xdd, 0x41, 0x67, 0x14, 0x85, 0x74, 0x24, 0x10, 0xf4, 0x56, 0x91, 0xe9, 0xed, 0x5c, 0xb9, 0xc7, 0xa8, 0x83, 0x2a, 0x0b, 0x3e, 0xba, 0xc6, 0xa8, 0x05, 0x32, 0x5d, 0x0e, 0x20, 0x6c, 0x8e, 0x0c, 0xb0, 0x00, 0xc9, 0x32, 0x41, 0x10, 0x56, 0x90, 0x49, 0x79, 0x3c, 0x12, 0xda, 0x93, 0xe6, 0xf2, 0xcb, 0x96, 0x95, 0xa9, 0xfd, 0x3c, 0x5a, 0x71, 0x2c, 0x4c, 0x14, 0xb1, 0x1f, 0x7a, 0x65, 0xf5, 0x88, 0xd6, 0x2d, 0x92, 0xf9, 0x3d, 0x01, 0x99, 0x4e, 0x03, 0x36, 0x7d, 0xbb, 0x31, 0x70, 0x64, 0x26, 0x53, 0x30, 0x20, 0x23, 0xed, 0xe0, 0xf1, 0xc4, 0xbb, 0x65, 0xdf, 0x91, 0x59, 0xaf, 0xd0, 0x02, 0x6e, 0x03, 0x32, 0x3d, 0x0d, 0x89, 0x4d, 0x38, 0x20, 0xa3, 0x40, 0xc6, 0x6a, 0xf4, 0x4e, 0x4a, 0x64, 0x8a, 0x7b, 0xbc, 0xf0, 0x81, 0x20, 0xd3, 0x7c, 0x9a, 0x78, 0x55, 0xd3, 0x76, 0x4d, 0xb8, 0x53, 0x9d, 0xd1, 0xe3, 0x72, 0x13, 0x2d, 0xce, 0xdf, 0xdb, 0x82, 0x44, 0xf0, 0xdf, 0x75, 0x36, 0x47, 0xb7, 0xb1, 0x64, 0x0a, 0xa6, 0x8c, 0x0b, 0xc7, 0x7c, 0x76, 0x6b, 0xfc, 0x9c, 0x7b, 0xd1, 0x78, 0x7b, 0x89, 0x63, 0x89, 0x0d, 0x46, 0x7d, 0x29, 0x6f, 0x6a, 0x24, 0xf3, 0xf8, 0xbd, 0xda, 0xad, 0xdc, 0x22, 0x5f, 0x00, 0x23, 0x6f, 0x5b, 0x88, 0xcc, 0x36, 0x54, 0x00, 0xba, 0x8d, 0x6a, 0x05, 0x8c, 0x70, 0xd3, 0x81, 0xc1, 0x8c, 0xf5, 0x27, 0x43, 0xc9, 0xd4, 0x65, 0xff, 0xe1, 0xe8, 0xd8, 0xe2, 0x2c, 0x90, 0x59, 0x52, 0xa1, 0xd6, 0x37, 0x02, 0xae, 0x33, 0xf2, 0x81, 0xd4, 0xfa, 0x0e, 0xa5, 0x74, 0x50, 0x17, 0x58, 0xcd, 0xb3, 0x40, 0x3c, 0x21, 0x2c, 0xc9, 0x78, 0xa2, 0xd7, 0xd5, 0xc4, 0x6c, 0x6d, 0x98, 0x2a, 0x07, 0x18, 0xed, 0xf6, 0x4a, 0x70, 0xc0, 0x85, 0xa7, 0x31, 0xc9, 0x32, 0x10, 0x42, 0x03, 0x7c, 0xe3, 0x65, 0xfb, 0x55, 0x90, 0x8d, 0x69, 0x0d, 0x3e, 0x98, 0x6e, 0xe5, 0xaa, 0x8d, 0x87, 0x0b, 0x65, 0x76, 0x6b, 0x02, 0x74, 0x40, 0x46, 0x8a, 0x0c, 0x1c, 0x90, 0x51, 0x26, 0xae, 0x06, 0x64, 0xe4, 0xc8, 0x58, 0x03, 0x32, 0x0a, 0x64, 0xdc, 0x01, 0x19, 0x15, 0x32, 0x83, 0x9d, 0x51, 0x20, 0xe3, 0x0d, 0xc8, 0x28, 0x90, 0xa1, 0xc3, 0x69, 0x92, 0x23, 0x43, 0x3c, 0x6b, 0x88, 0xf4, 0xe4, 0xc8, 0x90, 0x01, 0x19, 0x45, 0x51, 0x05, 0x82, 0xc9, 0x80, 0x8c, 0x14, 0x19, 0x34, 0x20, 0xa3, 0x40, 0x06, 0x0f, 0xc8, 0x28, 0x90, 0xb1, 0x06, 0x64, 0x14, 0xc8, 0x38, 0x83, 0xd7, 0xae, 0x20, 0x43, 0x4b, 0x79, 0x9a, 0x01, 0x19, 0x8e, 0x8c, 0x3d, 0x20, 0xa3, 0x40, 0x86, 0x80, 0x01, 0x99, 0xda, 0xe2, 0x2d, 0x31, 0x39, 0x33, 0xf7, 0x8e, 0x90, 0xd9, 0x24, 0x57, 0xbe, 0x67, 0x18, 0x4d, 0x70, 0xa5, 0xa2, 0xd9, 0x07, 0x8c, 0x96, 0xe1, 0x6a, 0x72, 0xff, 0x48, 0xfc, 0xb4, 0xc2, 0xd6, 0x0e, 0xb0, 0x49, 0x99, 0xc4, 0x70, 0x50, 0xaa, 0x2a, 0x46, 0xd4, 0xae, 0x98, 0x24, 0x6b, 0x3f, 0x31, 0xe2, 0x84, 0xd3, 0x78, 0x5f, 0xd4, 0x6b, 0x0a, 0x85, 0xb5, 0x42, 0x03, 0x74, 0x8d, 0xec, 0x3e, 0x8c, 0xfd, 0xc5, 0x32, 0xa1, 0x58, 0xf6, 0xbb, 0xed, 0xbc, 0xb1, 0xb6, 0x6e, 0xbe, 0xd3, 0xde, 0x76, 0xbc, 0xd3, 0x69, 0xa6, 0xf9, 0xd0, 0x60, 0x7c, 0xcb, 0xb7, 0xac, 0x80, 0x72, 0xa5, 0xf8, 0x7f, 0xc9, 0x7c, 0xcc, 0x36, 0x1a, 0xf7, 0x2c, 0x20, 0xc8, 0x21, 0x81, 0x72, 0x48, 0xae, 0x2a, 0x2b, 0x67, 0x0e, 0x9d, 0xf9, 0xab, 0x85, 0x9a, 0x98, 0x52, 0x4c, 0x8a, 0xab, 0x8b, 0x8c, 0x64, 0x10, 0x6d, 0x8f, 0x9b, 0xb8, 0xb2, 0x4d, 0x09, 0xfa, 0x6a, 0x00, 0xec, 0x66, 0x91, 0xb1, 0x09, 0xaa, 0x22, 0x6f, 0xbc, 0xaa, 0xd5, 0xeb, 0x8a, 0xf0, 0x4c, 0xb3, 0x7d, 0x11, 0x42, 0x38, 0xc9, 0x5b, 0x3c, 0xab, 0x92, 0x9e, 0x46, 0xe4, 0x2e, 0x61, 0xc4, 0xca, 0x04, 0xfe, 0x10, 0x3e, 0x2d, 0xf8, 0x86, 0xaa, 0xde, 0x86, 0x2e, 0x05, 0xc4, 0x4c, 0x29, 0x62, 0xe1, 0x9c, 0x56, 0xf6, 0x79, 0x3d, 0x07, 0x1b, 0x1e, 0x69, 0xda, 0x85, 0xd1, 0x9a, 0xd5, 0x26, 0x3f, 0x06, 0x72, 0x6b, 0xd8, 0x9d, 0x3a, 0x1c, 0xdc, 0x3e, 0xcc, 0x02, 0x32, 0x66, 0x0d, 0x32, 0xe2, 0x1e, 0xe7, 0x2d, 0x61, 0xa9, 0xc8, 0xd9, 0xd2, 0x90, 0x63, 0xc0, 0x47, 0x8c, 0x70, 0xdd, 0x43, 0xff, 0x2f, 0xbe, 0x3e, 0x3a, 0x4f, 0x9e, 0x3a, 0xe5, 0x1a, 0xb7, 0xbb, 0x66, 0xc2, 0x6d, 0xdf, 0xc6, 0x8d, 0x6a, 0x9b, 0x72, 0x9b, 0xd9, 0x5c, 0xf3, 0x23, 0x0b, 0x21, 0x92, 0x08, 0xfe, 0x79, 0xbc, 0x08, 0xfc, 0x80, 0xcc, 0xcb, 0x76, 0xfd, 0x6a, 0x84, 0x7a, 0xdd, 0x23, 0x57, 0xb0, 0x73, 0x6d, 0x40, 0xc3, 0x55, 0x5f, 0x88, 0x7a, 0xe4, 0x1d, 0x5c, 0x92, 0x31, 0xc9, 0xd8, 0xb6, 0xb0, 0xd3, 0xec, 0x1a, 0x18, 0x97, 0xe1, 0x38, 0x98, 0x89, 0x6c, 0xd3, 0xa8, 0xcc, 0x4b, 0x54, 0x95, 0xa1, 0xc8, 0xfb, 0x83, 0x9b, 0x77, 0xcc, 0xb9, 0xb6, 0x93, 0x7d, 0x3e, 0x2c, 0xd3, 0x1b, 0x5e, 0x13, 0x3f, 0x08, 0x47, 0xf7, 0x24, 0x33, 0xd7, 0x3d, 0xeb, 0x89, 0x9d, 0x4e, 0x33, 0x07, 0x86, 0x9d, 0xf2, 0x50, 0x6e, 0x8c, 0xca, 0x43, 0xf8, 0xcb, 0x38, 0xbf, 0x1a, 0xed, 0x7f, 0xcf, 0xb0, 0xc2, 0xfa, 0x35, 0x0b, 0xef, 0x8d, 0x33, 0x62, 0x6f, 0x28, 0xb6, 0x4a, 0x5f, 0x93, 0xc7, 0xfb, 0x39, 0x5d, 0x1a, 0xe8, 0xf4, 0x73, 0x71, 0xe8, 0xb6, 0x74, 0x0b, 0xc6, 0x5d, 0x8c, 0x36, 0xb5, 0x99, 0x43, 0x86, 0x7a, 0x7b, 0x39, 0x99, 0x4c, 0xb6, 0xf7, 0xfa, 0x64, 0xaa, 0xcc, 0xc8, 0x70, 0x99, 0x4e, 0x23, 0x4a, 0x1e, 0x26, 0x64, 0xb1, 0x94, 0x8c, 0x48, 0xf3, 0x9e, 0x7f, 0x2b, 0xef, 0xf9, 0xb7, 0xd7, 0x3d, 0xff, 0x8e, 0x7c, 0xe3, 0x6f, 0x81, 0x61, 0x5d, 0xba, 0xac, 0xa1, 0x68, 0x7e, 0xb2, 0xc6, 0xfc, 0xd4, 0xfe, 0x79, 0x3a, 0x42, 0x20, 0xa8, 0x10, 0xe2, 0xe2, 0xc4, 0x20, 0x73, 0x3f, 0x5d, 0x37, 0x27, 0xbe, 0x1f, 0x67, 0x3d, 0xe0, 0x0d, 0xd6, 0x03, 0xde, 0x50, 0x36, 0xe0, 0x6d, 0x0a, 0xdb, 0xa0, 0xb4, 0x5e, 0x42, 0x49, 0xc8, 0x37, 0xf5, 0xfb, 0x9f, 0x50, 0x1e, 0x59, 0xb8, 0x5a, 0x7a, 0x68, 0xf6, 0x4a, 0x5c, 0xa0, 0x52, 0xd1, 0x0f, 0xe4, 0x6e, 0x45, 0xd4, 0x24, 0xa7, 0x5b, 0x9e, 0xbc, 0x0d, 0xc6, 0xd3, 0x4d, 0xe5, 0x3a, 0xc0, 0x4c, 0x64, 0xd0, 0x3c, 0x6a, 0x92, 0x9f, 0x4b, 0x95, 0x4a, 0x27, 0xdb, 0x01, 0x0b, 0x12, 0x3b, 0xc5, 0xa8, 0xd9, 0xda, 0x44, 0x62, 0x69, 0x00, 0x80, 0x75, 0x9e, 0x11, 0x63, 0xc5, 0x33, 0x26, 0x3c, 0x49, 0x89, 0x22, 0x26, 0x54, 0x0b, 0xe2, 0x5a, 0x60, 0x28, 0x3e, 0x6b, 0x89, 0x66, 0x15, 0x17, 0x14, 0xd2, 0xda, 0x88, 0x60, 0xc1, 0xdd, 0x7a, 0x50, 0xb3, 0x76, 0x9d, 0x0e, 0xd6, 0x8b, 0xcc, 0x72, 0x88, 0x54, 0x6e, 0x70, 0x44, 0x96, 0xab, 0x68, 0x5e, 0xbd, 0xad, 0x6d, 0x8a, 0x46, 0xc1, 0x61, 0xb7, 0xf6, 0xf1, 0xb0, 0x3a, 0x5f, 0xa9, 0xf5, 0xfe, 0x2b, 0xf3, 0xb9, 0x65, 0xe1, 0xf8, 0xab, 0x37, 0xe0, 0x6f, 0x66, 0xe1, 0xf5, 0xbf, 0x10, 0x59, 0xb7, 0xfe, 0x3b, 0x33, 0x95, 0xef, 0x4c, 0x38, 0x7b, 0xe9, 0x9b, 0xc3, 0xe2, 0x12, 0xee, 0x6d, 0xfc, 0x7c, 0x83, 0xda, 0x56, 0xec, 0xa7, 0xa5, 0x23, 0x8f, 0x65, 0x6b, 0xca, 0x03, 0xa4, 0xf2, 0x6c, 0xf2, 0xa2, 0x6a, 0x9f, 0xdc, 0xd4, 0x7f, 0x72, 0xe7, 0x50, 0x9f, 0xbc, 0xdc, 0x19, 0x5d, 0x78, 0xf2, 0xaf, 0x74, 0xb2, 0x8c, 0xe8, 0x2f, 0x49, 0xb8, 0xb8, 0x99, 0xe9, 0x06, 0x5c, 0x5d, 0xa0, 0x26, 0x61, 0x10, 0x8f, 0xcf, 0xc7, 0x8a, 0x07, 0xfc, 0x16, 0x04, 0x39, 0xe9, 0x7e, 0x23, 0xc2, 0x3a, 0xd6, 0x4a, 0x95, 0x99, 0xb1, 0x37, 0xb5, 0xdb, 0x7a, 0x86, 0xba, 0xe5, 0x0b, 0x83, 0x93, 0x01, 0x8f, 0x22, 0x1e, 0xae, 0x39, 0xe0, 0x91, 0x5d, 0x2d, 0x00, 0xf7, 0x72, 0xe2, 0x65, 0xfe, 0xaf, 0xd8, 0xb5, 0xfd, 0xf1, 0xe4, 0x47, 0x64, 0x2f, 0xb7, 0x01, 0x16, 0x2e, 0x5e, 0xdb, 0x73, 0xf3, 0xe6, 0x28, 0x40, 0x21, 0x99, 0x9b, 0xa1, 0x70, 0x45, 0xe6, 0xcb, 0x7b, 0x1a, 0x91, 0x81, 0x6e, 0x56, 0x02, 0x19, 0x68, 0x82, 0x0c, 0xf7, 0xba, 0xc2, 0xb5, 0x3e, 0x60, 0xc0, 0x94, 0xe0, 0x74, 0x4d, 0x82, 0xff, 0x5b, 0xf5, 0xb1, 0x37, 0x80, 0xc3, 0x62, 0x09, 0xa3, 0xd1, 0x05, 0x58, 0x58, 0x8e, 0xf7, 0x70, 0x59, 0xda, 0xea, 0x29, 0x2b, 0xb0, 0x16, 0x3e, 0xce, 0x80, 0x4f, 0x3d, 0x3e, 0xea, 0x63, 0xc5, 0xb6, 0x98, 0xf6, 0xf5, 0x64, 0x91, 0xbd, 0x41, 0x66, 0xdf, 0x5c, 0x16, 0xae, 0x41, 0xe6, 0x4b, 0xaf, 0x75, 0xc6, 0x1b, 0x90, 0x51, 0xba, 0x6f, 0x20, 0x47, 0x26, 0x9c, 0x27, 0x31, 0x4e, 0xbe, 0xd1, 0x72, 0x08, 0x76, 0xcc, 0xea, 0xca, 0x79, 0x86, 0xd6, 0x88, 0x46, 0x3f, 0xc8, 0xec, 0xed, 0x9b, 0xec, 0x09, 0x93, 0x2c, 0xfa, 0xbb, 0xec, 0xdb, 0x24, 0x53, 0x51, 0xf1, 0x62, 0x70, 0x27, 0xdb, 0x82, 0x5d, 0xa1, 0x4e, 0xb3, 0xcb, 0xa5, 0xe3, 0x1e, 0x04, 0x69, 0x9a, 0x1b, 0x5b, 0x58, 0x70, 0xe2, 0x34, 0xbe, 0x42, 0x18, 0xc7, 0xc1, 0xd2, 0x48, 0xd6, 0x60, 0x1a, 0x17, 0x74, 0x4e, 0x17, 0xc1, 0x42, 0xb1, 0xd9, 0xac, 0x9c, 0x3f, 0xd1, 0x4d, 0xfa, 0x6c, 0xb0, 0x11, 0xd3, 0xd6, 0x73, 0xbd, 0x7c, 0xe3, 0x2d, 0x10, 0xc9, 0x75, 0x33, 0xa9, 0x74, 0xee, 0x47, 0x6f, 0x08, 0x5e, 0x0b, 0x81, 0x0a, 0x42, 0x20, 0x2e, 0x04, 0x6e, 0xb9, 0xe6, 0x13, 0x6f, 0x99, 0x1c, 0xe5, 0xdd, 0xcc, 0xb6, 0xd8, 0x88, 0x26, 0x13, 0x4a, 0x7e, 0x19, 0x6e, 0x9f, 0x8e, 0xc3, 0x62, 0xf1, 0x53, 0x10, 0xca, 0xad, 0x44, 0x4e, 0xed, 0xf4, 0x6f, 0xec, 0x67, 0xfa, 0x07, 0x90, 0x2f, 0x11, 0x6a, 0x16, 0xcc, 0xbf, 0x67, 0xfa, 0xc7, 0xf2, 0xd9, 0xf2, 0x5d, 0x94, 0x9b, 0xa9, 0x9f, 0x72, 0x01, 0xb3, 0xdd, 0x50, 0x5b, 0x13, 0x9a, 0x2e, 0x9b, 0xd5, 0x31, 0x17, 0xd2, 0x52, 0x0b, 0x99, 0xa4, 0x53, 0x77, 0xb3, 0x61, 0xb3, 0xa1, 0x8f, 0xac, 0xb9, 0xa1, 0x00, 0xe1, 0xec, 0xf1, 0x4d, 0x2c, 0x3b, 0x4d, 0x5f, 0x46, 0xc7, 0x69, 0xb9, 0x33, 0xfd, 0xc3, 0x55, 0x18, 0x2d, 0xdf, 0xbe, 0x61, 0x66, 0x29, 0x7e, 0xe8, 0x37, 0xcc, 0x2e, 0x25, 0x16, 0xef, 0x1d, 0xff, 0xb1, 0xc7, 0xbe, 0x7d, 0x4a, 0x4d, 0xfc, 0xba, 0x82, 0xc6, 0x33, 0x56, 0x70, 0x9d, 0xb0, 0x5a, 0xe7, 0xab, 0x98, 0x78, 0x63, 0xd4, 0x50, 0x23, 0xd4, 0x28, 0x95, 0x02, 0xa8, 0x55, 0x63, 0xcb, 0xdb, 0xa0, 0x91, 0x4a, 0xec, 0x4c, 0xe4, 0x82, 0x43, 0xb5, 0x9e, 0x27, 0xff, 0xad, 0xf5, 0xd8, 0x53, 0xa0, 0x7a, 0xec, 0xd1, 0xea, 0x31, 0x89, 0x0b, 0xf2, 0xf7, 0xb5, 0x4f, 0x4f, 0xcf, 0x8d, 0x5c, 0xb2, 0xb1, 0x57, 0x78, 0xfa, 0x1f, 0x74, 0x7e, 0x57, 0x3a, 0xef, 0xdb, 0x16, 0xe1, 0xc4, 0x63, 0x8d, 0xf2, 0x96, 0x2b, 0x4b, 0x6b, 0x29, 0x02, 0x10, 0x06, 0x72, 0xe2, 0x47, 0x0c, 0x67, 0xab, 0x74, 0xad, 0xe5, 0x95, 0xa6, 0x97, 0xe9, 0x41, 0xc0, 0x95, 0xc3, 0x05, 0x75, 0xe1, 0xea, 0x62, 0x12, 0xe5, 0x15, 0x00, 0x06, 0x90, 0x36, 0x60, 0xa8, 0xdf, 0x80, 0x71, 0x06, 0xcc, 0xa9, 0xb0, 0xaa, 0xfe, 0x3a, 0x9c, 0x7c, 0x37, 0x4e, 0xc8, 0xdc, 0x7f, 0x7a, 0xc6, 0x65, 0x7e, 0xc5, 0x36, 0xab, 0x97, 0x2b, 0x17, 0x70, 0x4c, 0xb0, 0xfd, 0x3a, 0x30, 0xb1, 0x3a, 0xc0, 0x84, 0x6f, 0x7d, 0x9c, 0xd2, 0x29, 0x51, 0x60, 0xa2, 0x15, 0x45, 0xb7, 0x3c, 0x52, 0xae, 0x3e, 0x1b, 0x71, 0x7b, 0x9c, 0x44, 0x36, 0xe2, 0x4e, 0x80, 0xca, 0x0f, 0x14, 0x55, 0x2a, 0xcf, 0x50, 0x67, 0xaa, 0xc2, 0x05, 0xdd, 0x01, 0xae, 0x36, 0x70, 0x4d, 0x07, 0xb8, 0x5a, 0xc0, 0xe5, 0x3a, 0x6a, 0xb8, 0x76, 0xb0, 0x20, 0xba, 0x0e, 0x27, 0xb4, 0x2d, 0x4e, 0x70, 0x07, 0x38, 0xc5, 0xf7, 0x86, 0xb4, 0xa1, 0x86, 0x22, 0x61, 0x99, 0xc7, 0xf5, 0xe7, 0x0b, 0xe3, 0xe4, 0x9e, 0x7c, 0x8f, 0xc8, 0x43, 0x61, 0x9a, 0xb7, 0xfa, 0xc8, 0x5a, 0xa6, 0x31, 0xff, 0x14, 0xeb, 0x39, 0x3e, 0xc5, 0x72, 0x81, 0xa7, 0xfa, 0x94, 0xf8, 0x6d, 0x47, 0xb4, 0xbb, 0x8f, 0x02, 0x2e, 0x20, 0xca, 0x8f, 0xba, 0xed, 0xf0, 0x73, 0xc8, 0x33, 0x7d, 0xce, 0x64, 0xb7, 0x9f, 0x83, 0xa7, 0x2c, 0x1d, 0x02, 0xc4, 0x9c, 0xce, 0xea, 0x61, 0x3c, 0xa3, 0xc6, 0x79, 0x18, 0x4d, 0xd6, 0x75, 0x4f, 0xf8, 0x4a, 0x96, 0xbe, 0x81, 0xe6, 0x2c, 0xa5, 0x07, 0xd8, 0xcd, 0x7d, 0x5a, 0xa6, 0xf2, 0x1a, 0x91, 0x31, 0x8d, 0x96, 0x61, 0xb8, 0xbc, 0xef, 0x6d, 0xe0, 0x69, 0xe2, 0x72, 0x02, 0xb0, 0xcf, 0x98, 0x10, 0x94, 0x0d, 0x51, 0x00, 0x32, 0xb5, 0x04, 0x4c, 0x82, 0x25, 0x8d, 0x1d, 0xdb, 0xd3, 0x38, 0x8c, 0xee, 0x0e, 0xb6, 0x04, 0x2c, 0x01, 0x46, 0xd3, 0x8f, 0x71, 0x60, 0x20, 0x9a, 0xda, 0x6a, 0x60, 0x8c, 0xaf, 0xbf, 0x01, 0xe3, 0x82, 0x3c, 0xd0, 0x57, 0x15, 0x1b, 0x6d, 0x3e, 0xb0, 0x2e, 0xc4, 0x46, 0x0c, 0xab, 0x74, 0xc9, 0xe4, 0xd1, 0x9c, 0xcc, 0xc2, 0xbb, 0x3c, 0xa3, 0x8e, 0x0e, 0xcc, 0x14, 0xab, 0x96, 0x68, 0xa7, 0xe8, 0x00, 0x1d, 0x4d, 0x32, 0x1d, 0x39, 0x3a, 0x57, 0x10, 0x9a, 0x05, 0x58, 0xba, 0x9a, 0x0a, 0xd0, 0x28, 0x7c, 0xb5, 0x7b, 0xfc, 0xc9, 0x74, 0x2a, 0x7f, 0xfc, 0xd8, 0x70, 0x64, 0x7e, 0xd6, 0xc8, 0x9c, 0x6e, 0xe5, 0x1d, 0x03, 0x70, 0xb0, 0x9c, 0x3e, 0x66, 0x4b, 0x90, 0x7c, 0x4b, 0x01, 0x52, 0xfc, 0xd7, 0x15, 0x1b, 0xe1, 0xbd, 0x3c, 0x43, 0x4b, 0x8d, 0x7a, 0xbb, 0xed, 0x0c, 0xa5, 0xe9, 0x4f, 0x9f, 0x5b, 0xf4, 0x97, 0x59, 0xe9, 0xd2, 0x16, 0x97, 0x89, 0xd0, 0xf6, 0x9a, 0xe3, 0xe2, 0x49, 0x70, 0xd9, 0xb8, 0x97, 0xc1, 0x7d, 0x79, 0x17, 0x0b, 0x37, 0x74, 0xb1, 0xc0, 0x95, 0xc7, 0x1e, 0x57, 0xc9, 0x34, 0x6b, 0x0f, 0x43, 0x8f, 0xdc, 0x9d, 0x9a, 0x0a, 0x87, 0x81, 0x5d, 0x53, 0x65, 0x6a, 0x7b, 0xe4, 0x4e, 0x3d, 0x05, 0x3a, 0xae, 0x2b, 0x71, 0xa7, 0x1d, 0xf4, 0xb7, 0xba, 0xad, 0x2b, 0x9b, 0xb8, 0xd6, 0xf1, 0x58, 0x52, 0x30, 0xda, 0x61, 0x30, 0x56, 0xd8, 0x16, 0xcf, 0x33, 0x5f, 0x41, 0x44, 0xba, 0xbd, 0x69, 0x81, 0xc0, 0x94, 0x46, 0xef, 0x57, 0xa3, 0x44, 0x77, 0x8c, 0xab, 0x19, 0x79, 0x1a, 0x2d, 0x49, 0x5a, 0xcb, 0x7b, 0xa5, 0x79, 0xce, 0x8d, 0xef, 0x3d, 0xe6, 0x54, 0x81, 0x1c, 0x74, 0x06, 0xe4, 0x6a, 0xcd, 0x36, 0x90, 0x1b, 0xa6, 0x8a, 0xc5, 0x7e, 0x06, 0x47, 0xbf, 0x1f, 0x26, 0x9b, 0xe6, 0xdb, 0x34, 0x89, 0x29, 0x20, 0xf3, 0xb0, 0x58, 0xcd, 0xef, 0x8c, 0xb3, 0xf7, 0x17, 0x57, 0xd9, 0x25, 0x68, 0x07, 0xe3, 0x09, 0x3a, 0x13, 0x08, 0xdb, 0x8d, 0x18, 0x4c, 0x78, 0x87, 0x23, 0xb4, 0xa0, 0x20, 0xdf, 0xfc, 0x27, 0x31, 0xce, 0xc8, 0xe2, 0xc9, 0xb8, 0x88, 0x82, 0xc7, 0xae, 0x17, 0x1b, 0x76, 0x38, 0xf0, 0xee, 0xb5, 0x93, 0x14, 0x23, 0xcb, 0x94, 0x48, 0x7a, 0x19, 0x4c, 0xa2, 0x30, 0x15, 0x35, 0x0e, 0xde, 0x9e, 0x95, 0xb3, 0x73, 0x57, 0x59, 0x57, 0xad, 0xed, 0x8d, 0x18, 0xf0, 0xee, 0xdd, 0x46, 0x54, 0xa2, 0xf0, 0x60, 0x93, 0xd1, 0x40, 0x71, 0xfe, 0x9b, 0x93, 0xd1, 0xb9, 0xd6, 0x80, 0xd7, 0x8c, 0xcf, 0xe6, 0xc9, 0xfa, 0x1c, 0x1f, 0x2c, 0xc5, 0xe7, 0xf3, 0x7c, 0x16, 0xcc, 0xa9, 0xdc, 0x82, 0x00, 0xd8, 0xe5, 0x04, 0x97, 0xd9, 0xda, 0xa0, 0xb8, 0xed, 0x19, 0x44, 0x72, 0xed, 0x01, 0x58, 0xb3, 0x8d, 0x1c, 0xb1, 0xc9, 0x36, 0x5c, 0x71, 0xac, 0x09, 0x3c, 0x49, 0x28, 0xc2, 0x20, 0x52, 0x8c, 0xb9, 0xb5, 0xea, 0xa4, 0xd4, 0xe1, 0x8c, 0xca, 0x7b, 0xc0, 0x01, 0x94, 0xbd, 0xb0, 0xd1, 0x43, 0xfc, 0x2b, 0x32, 0x85, 0x7e, 0xff, 0xbe, 0xa0, 0xcf, 0x2f, 0x9e, 0xed, 0x69, 0xa5, 0x8d, 0xa6, 0x69, 0x89, 0x70, 0x2f, 0xe9, 0xe4, 0x3e, 0xa8, 0x6b, 0xce, 0x39, 0x98, 0x81, 0x42, 0x49, 0x9b, 0x9b, 0xae, 0xb7, 0xe7, 0x25, 0x47, 0xe8, 0x8e, 0xcb, 0x83, 0xf0, 0xa3, 0x49, 0x18, 0x51, 0xe3, 0xa8, 0x87, 0xbc, 0xac, 0x9e, 0x05, 0xb3, 0x5e, 0x12, 0xcb, 0x71, 0x04, 0x48, 0x56, 0x53, 0xa3, 0xf7, 0xfb, 0x4e, 0xe2, 0x3b, 0xd5, 0xa4, 0xca, 0xf5, 0x9c, 0xc0, 0x53, 0x9c, 0xe9, 0xb9, 0x0c, 0xe6, 0x81, 0x81, 0x8e, 0xe5, 0xe3, 0x07, 0x2d, 0xc6, 0x61, 0x94, 0xe3, 0x2d, 0x3a, 0x4f, 0x88, 0x65, 0x4f, 0x78, 0x99, 0xfc, 0xeb, 0x34, 0x0a, 0x7e, 0xd0, 0xec, 0x21, 0xed, 0x8e, 0x1e, 0x52, 0x77, 0x28, 0xa7, 0x79, 0x36, 0x82, 0x53, 0x30, 0x41, 0xd7, 0x1b, 0x57, 0x9f, 0xbf, 0xcc, 0xc2, 0x74, 0x08, 0x0c, 0x4c, 0xf9, 0xd0, 0x83, 0x2b, 0x7b, 0x1f, 0x7c, 0x0a, 0x47, 0x76, 0xa6, 0x5a, 0x88, 0xd4, 0xf0, 0xcc, 0x79, 0x14, 0x93, 0xd6, 0x40, 0xac, 0xe4, 0x99, 0x6d, 0x2d, 0x37, 0x2d, 0xf6, 0xba, 0xaa, 0x9f, 0xb9, 0x0b, 0x7e, 0xe6, 0xe7, 0xbf, 0x04, 0x8d, 0x31, 0xbb, 0xce, 0x92, 0x0d, 0x05, 0xed, 0xbe, 0xb6, 0xb7, 0x2d, 0x91, 0x19, 0x1a, 0xf3, 0x10, 0x8b, 0x08, 0x22, 0x9d, 0xdf, 0x56, 0x02, 0x72, 0xa7, 0xe9, 0x30, 0x34, 0xbe, 0x01, 0x4f, 0x75, 0x3c, 0x5c, 0xbd, 0x10, 0x65, 0xea, 0x66, 0x04, 0xe0, 0x40, 0xe4, 0x21, 0x1d, 0xdd, 0x87, 0x77, 0xab, 0xb9, 0x71, 0x1c, 0x85, 0x8b, 0xa4, 0xcb, 0xe8, 0x81, 0xce, 0x68, 0x38, 0x37, 0x6e, 0x41, 0x65, 0x90, 0xcb, 0xeb, 0x54, 0xe9, 0x70, 0x7b, 0x4a, 0x1e, 0xab, 0xee, 0xde, 0xe0, 0xea, 0x59, 0xbd, 0x7c, 0xcb, 0xee, 0x44, 0xd8, 0x3f, 0x3c, 0x9a, 0x93, 0xef, 0xf4, 0xf8, 0x69, 0x49, 0x0d, 0x3c, 0x1a, 0xdc, 0x6f, 0xfc, 0x35, 0x3d, 0xaf, 0x13, 0xe0, 0x09, 0xd1, 0x49, 0x75, 0xda, 0xcf, 0x7c, 0x1e, 0xfe, 0xb4, 0x66, 0xce, 0x3a, 0x17, 0x00, 0x87, 0x0d, 0x60, 0x91, 0xa6, 0x87, 0xc6, 0xc5, 0x2c, 0xcb, 0xee, 0x1e, 0xda, 0x6a, 0x4c, 0xf4, 0xe5, 0x0f, 0xed, 0x37, 0x3f, 0xf4, 0x9e, 0x73, 0x06, 0xba, 0x2a, 0x0e, 0xc4, 0xc3, 0x13, 0x25, 0x1f, 0x2e, 0xb7, 0x2d, 0x74, 0x30, 0xfa, 0xcf, 0x9b, 0x09, 0x26, 0x63, 0xd1, 0xc9, 0x86, 0xf3, 0xa7, 0x52, 0xf9, 0x21, 0x19, 0x9e, 0x24, 0x63, 0xc9, 0xb5, 0xbf, 0x93, 0xde, 0xbd, 0x06, 0xe3, 0xd5, 0x92, 0x3d, 0x8c, 0xaf, 0x82, 0x80, 0xe5, 0xc0, 0xee, 0xed, 0xe8, 0x91, 0x52, 0x3f, 0x9d, 0x40, 0xb6, 0x2d, 0xcb, 0x7a, 0xc6, 0x2e, 0x44, 0x3e, 0x3f, 0xbf, 0x45, 0x1b, 0x22, 0xae, 0xcb, 0xf1, 0xb4, 0x05, 0xc6, 0xab, 0x01, 0xc6, 0xb6, 0xbb, 0x4e, 0xa0, 0x1f, 0xc2, 0x1a, 0x28, 0x37, 0x8b, 0xcc, 0x80, 0x03, 0xa1, 0x02, 0x99, 0x93, 0xf0, 0xe1, 0x91, 0x2e, 0x03, 0x3e, 0x91, 0xb8, 0x59, 0xbc, 0xa9, 0xf5, 0x30, 0x2e, 0x1b, 0x82, 0xa8, 0x5e, 0x4b, 0xf2, 0x87, 0x19, 0xc5, 0xd2, 0x7f, 0xa7, 0x46, 0x16, 0x36, 0xc2, 0xd7, 0xf4, 0xae, 0x9a, 0xe3, 0xb1, 0x3c, 0x73, 0x66, 0x79, 0x40, 0x01, 0xcf, 0x4d, 0x18, 0x05, 0x7e, 0x0f, 0xa1, 0xf1, 0x01, 0x1f, 0xd4, 0xf0, 0x84, 0x8e, 0x85, 0x25, 0xf1, 0x03, 0x52, 0x97, 0x53, 0x74, 0x77, 0xc2, 0xee, 0x22, 0x44, 0xf0, 0xa0, 0x75, 0x37, 0xb6, 0x18, 0xd0, 0x73, 0xd8, 0x6a, 0x5a, 0x7f, 0x9a, 0x0f, 0x98, 0x4f, 0xb3, 0xa8, 0x63, 0x3a, 0x11, 0x48, 0x84, 0x46, 0x4b, 0x4a, 0x1e, 0x8c, 0xaf, 0x41, 0xb4, 0x4c, 0x7a, 0x69, 0x93, 0x8e, 0x63, 0xc6, 0x20, 0xb4, 0x33, 0x3f, 0xb1, 0x97, 0x23, 0x91, 0x39, 0x3e, 0xd3, 0x17, 0xc7, 0xc7, 0x15, 0x96, 0x03, 0x6c, 0xdb, 0xce, 0xff, 0xae, 0x93, 0x81, 0xe3, 0xfc, 0x4a, 0x68, 0x0b, 0x2b, 0xdc, 0x63, 0x80, 0xe8, 0x2c, 0x8d, 0x9b, 0x8c, 0x4b, 0xba, 0x24, 0xb3, 0x24, 0x95, 0x3f, 0x5c, 0x0d, 0x79, 0xaf, 0x06, 0xf0, 0x00, 0xae, 0xc2, 0x35, 0xa2, 0x51, 0x40, 0xb7, 0x5d, 0x24, 0xd6, 0x76, 0x58, 0x4f, 0x51, 0xba, 0xe8, 0xa4, 0x51, 0x01, 0xb9, 0x80, 0x69, 0x89, 0x5a, 0x5c, 0xe3, 0x3c, 0xa2, 0x74, 0x47, 0x75, 0x46, 0xcd, 0x56, 0x0c, 0xe5, 0x72, 0xd5, 0x66, 0x09, 0xf9, 0x0b, 0x45, 0xa0, 0x46, 0xc2, 0x38, 0x46, 0x21, 0xcb, 0xd5, 0xc2, 0x38, 0x5d, 0x85, 0xfd, 0xa4, 0xc4, 0x64, 0x6a, 0x80, 0xcc, 0x0d, 0x41, 0xb2, 0x77, 0x48, 0xb8, 0xb6, 0x5f, 0xf3, 0x51, 0x39, 0x54, 0x60, 0x80, 0x4a, 0x13, 0x2a, 0xe0, 0x6a, 0x40, 0x75, 0xfb, 0xb1, 0x7a, 0xf2, 0xdc, 0x4d, 0xc8, 0xd2, 0xbd, 0x7d, 0x73, 0x3a, 0xcd, 0x40, 0xe5, 0xb4, 0x78, 0x13, 0x61, 0x78, 0x79, 0x74, 0xf3, 0xa7, 0xe1, 0x98, 0x10, 0xdf, 0xf6, 0xd4, 0x2a, 0x65, 0x37, 0x5d, 0xe4, 0x0a, 0x1c, 0x88, 0xb1, 0xce, 0x50, 0xba, 0xcc, 0x78, 0x33, 0x69, 0x94, 0x7d, 0xcd, 0x56, 0x66, 0x66, 0xe4, 0xb4, 0xdd, 0x87, 0x78, 0xc5, 0xbd, 0x45, 0xad, 0xcb, 0x49, 0x00, 0xb4, 0x8d, 0xd9, 0xa6, 0xec, 0x3e, 0x0d, 0xa8, 0x70, 0x70, 0x52, 0x86, 0xb0, 0x73, 0xf2, 0x10, 0x4c, 0xc2, 0x87, 0x7d, 0xa5, 0xa5, 0xe3, 0xda, 0x6c, 0x62, 0x51, 0x9b, 0x6b, 0x9e, 0xbe, 0xcb, 0x57, 0x86, 0x50, 0x07, 0x69, 0x39, 0xc6, 0x7e, 0x28, 0xa6, 0x35, 0x32, 0x8a, 0x36, 0x32, 0x29, 0x60, 0xbe, 0x9e, 0xb4, 0x68, 0x60, 0x2f, 0xd4, 0x1d, 0x0f, 0x28, 0xf7, 0xe7, 0x34, 0x77, 0xd3, 0xfa, 0x36, 0x64, 0xa1, 0x0e, 0x11, 0xce, 0x49, 0xf7, 0xf4, 0x13, 0x07, 0x4c, 0xd8, 0x61, 0xfa, 0x59, 0x0d, 0x7d, 0x2a, 0x2e, 0xfd, 0x61, 0x30, 0xfd, 0x11, 0x46, 0x81, 0x71, 0x25, 0xb9, 0x24, 0xbe, 0xfe, 0x9c, 0x22, 0xb6, 0x9c, 0xac, 0x5b, 0x42, 0x5c, 0x30, 0x3d, 0xfa, 0xeb, 0xe1, 0xc9, 0xb8, 0x0a, 0x7f, 0x26, 0x6b, 0x19, 0x4e, 0x8a, 0xb7, 0xe8, 0xde, 0x6a, 0x51, 0xce, 0x2f, 0x41, 0xc6, 0x65, 0xa8, 0x6e, 0x52, 0x7e, 0x85, 0xcb, 0x0e, 0xc9, 0x88, 0x1b, 0x5c, 0x91, 0xa7, 0xdd, 0xaa, 0x5a, 0x25, 0x48, 0xcd, 0xc6, 0x58, 0xa1, 0xf6, 0x99, 0x71, 0xc4, 0x9d, 0x48, 0x37, 0x47, 0xb1, 0x3a, 0x9c, 0x1d, 0x5d, 0xf7, 0xb0, 0xb7, 0x2d, 0xf6, 0xc9, 0xbc, 0x66, 0x53, 0x36, 0xb7, 0x37, 0x24, 0x58, 0x86, 0xc6, 0xd9, 0x5d, 0x14, 0xc7, 0x26, 0xef, 0xdf, 0x67, 0x9d, 0x51, 0x92, 0xba, 0x2c, 0xdc, 0x84, 0xfd, 0x97, 0xe9, 0x84, 0xd7, 0xb8, 0x57, 0xb1, 0xe4, 0xe9, 0xdc, 0xe6, 0xfc, 0x19, 0x8f, 0xcd, 0x81, 0x30, 0x89, 0x71, 0x73, 0x66, 0xfc, 0x19, 0x2c, 0x97, 0x4f, 0x3d, 0x24, 0xfb, 0x9f, 0x12, 0xd6, 0x46, 0xe2, 0x08, 0xb3, 0x62, 0x37, 0x49, 0x4a, 0xd1, 0xea, 0x61, 0xb2, 0x7e, 0xcc, 0x56, 0xad, 0xc4, 0x51, 0x11, 0x12, 0x10, 0x99, 0xdc, 0x3f, 0x24, 0x3d, 0xd6, 0xc1, 0xf2, 0xc9, 0xb8, 0xb5, 0xdf, 0x21, 0xf7, 0x6b, 0x0f, 0x27, 0x50, 0xc7, 0x84, 0x95, 0xe2, 0x44, 0x42, 0x87, 0x04, 0x9e, 0x79, 0x38, 0x0b, 0xef, 0x9e, 0x8c, 0xf7, 0xf3, 0x79, 0xf8, 0x83, 0xd5, 0xa7, 0xcb, 0xbb, 0x3f, 0x0f, 0x32, 0xd6, 0x50, 0x81, 0xd5, 0x3c, 0x1b, 0x33, 0xb1, 0xb3, 0x18, 0x03, 0x88, 0x6b, 0xd4, 0x6e, 0xe8, 0x7c, 0x42, 0xe7, 0x4b, 0xe3, 0x36, 0x20, 0xf3, 0xa7, 0x70, 0x25, 0xc9, 0xd9, 0x1f, 0xde, 0x8d, 0xb7, 0x15, 0x2b, 0x3e, 0x14, 0xfb, 0x24, 0x6f, 0x2e, 0xfe, 0xd3, 0xc3, 0x25, 0xf1, 0x3c, 0xc2, 0x02, 0x96, 0xd0, 0x4e, 0x7f, 0x73, 0x1f, 0xad, 0x16, 0xcb, 0x07, 0xb2, 0x48, 0x2e, 0xfd, 0x05, 0x0a, 0x19, 0x03, 0xf7, 0x70, 0x44, 0x28, 0x1f, 0x3a, 0x40, 0x8d, 0x28, 0xdd, 0x64, 0x9f, 0xbb, 0xb3, 0x11, 0xdd, 0x83, 0x8b, 0xe0, 0xf2, 0x18, 0x9e, 0x0a, 0x1c, 0x71, 0x19, 0x76, 0x97, 0x19, 0x76, 0x74, 0xf4, 0x93, 0x3c, 0x0e, 0x8c, 0xe1, 0x12, 0xd8, 0xdc, 0x3a, 0xd8, 0xce, 0x69, 0x14, 0x91, 0xf8, 0x26, 0x0d, 0x2c, 0xf3, 0x05, 0x35, 0x6e, 0x03, 0xac, 0xba, 0xc1, 0xc6, 0xac, 0x3b, 0x8e, 0xe7, 0x41, 0x44, 0x17, 0xcb, 0xf8, 0x37, 0x64, 0x07, 0x33, 0xbd, 0x58, 0x57, 0x6c, 0x97, 0xb7, 0x93, 0x39, 0x70, 0xb0, 0xad, 0x11, 0x83, 0xed, 0x69, 0x92, 0xf4, 0xad, 0x98, 0x89, 0xb7, 0x86, 0xad, 0x3f, 0x26, 0xdf, 0x44, 0x75, 0xe7, 0xef, 0x7a, 0x35, 0x37, 0x3e, 0xb1, 0xe1, 0x9c, 0x1d, 0x93, 0x32, 0x08, 0x7d, 0xff, 0xcc, 0x4c, 0x29, 0x30, 0x6c, 0x6e, 0x2b, 0x24, 0xb8, 0x1e, 0x43, 0xab, 0xcb, 0x73, 0xea, 0xbd, 0x34, 0x86, 0x87, 0x47, 0x78, 0xec, 0x67, 0xd0, 0xb9, 0xee, 0x84, 0x08, 0xd0, 0xad, 0xe6, 0xf1, 0x43, 0xc8, 0xfa, 0x6b, 0x9c, 0xed, 0x50, 0xb1, 0x6a, 0xe8, 0x76, 0x74, 0x0c, 0x7d, 0x3d, 0xdf, 0x4e, 0x7d, 0x83, 0x96, 0xad, 0xc9, 0xc9, 0x1e, 0xff, 0x93, 0x45, 0xef, 0x6e, 0xb9, 0xda, 0x71, 0x13, 0xc4, 0x1f, 0x92, 0xdc, 0x61, 0x4a, 0x1a, 0x54, 0xb8, 0xf7, 0xc9, 0xc7, 0x4f, 0xb2, 0xfa, 0x26, 0x2b, 0x75, 0x5a, 0x85, 0x52, 0x27, 0x5a, 0x97, 0x3a, 0x5b, 0x4c, 0x6c, 0xe3, 0xd6, 0x17, 0x1b, 0xb0, 0x83, 0xb9, 0x94, 0x1c, 0x24, 0x3c, 0x80, 0xd4, 0x6c, 0x9a, 0x1c, 0xd1, 0x34, 0x25, 0x99, 0xc4, 0x5e, 0x27, 0xdd, 0x2d, 0x27, 0x63, 0x73, 0x86, 0xe2, 0xee, 0xa4, 0x9b, 0xf0, 0x81, 0x52, 0xa3, 0x3c, 0xb5, 0x50, 0x19, 0xeb, 0x94, 0x0c, 0xc2, 0xe0, 0x86, 0x84, 0x2b, 0xd6, 0x9a, 0xfa, 0xcf, 0x1f, 0xcb, 0x94, 0x3e, 0xd6, 0x48, 0xfd, 0x5c, 0xaa, 0x35, 0x70, 0xcd, 0xcf, 0xa5, 0x5b, 0xac, 0xd5, 0xed, 0x9f, 0x64, 0xb5, 0x43, 0xbb, 0x2a, 0xc2, 0x2a, 0x9a, 0xc7, 0x07, 0x73, 0xbe, 0x1c, 0x48, 0xff, 0xa5, 0x54, 0x08, 0x65, 0x86, 0xc2, 0x9b, 0x28, 0x9c, 0x2f, 0x12, 0x96, 0x87, 0x1e, 0x66, 0x87, 0xad, 0x69, 0x56, 0x43, 0x98, 0x58, 0x62, 0xfe, 0x2a, 0x09, 0xa9, 0x8a, 0x79, 0x3c, 0xd8, 0x49, 0x1b, 0x37, 0x3c, 0xc0, 0x04, 0xba, 0xcb, 0xd6, 0xa7, 0x09, 0x16, 0x6c, 0x80, 0xa8, 0xe2, 0xfe, 0x5c, 0x67, 0x2c, 0x54, 0x5d, 0xbe, 0x9d, 0x8c, 0x8c, 0x38, 0x3c, 0x0f, 0x97, 0xcb, 0x19, 0xcd, 0x23, 0x00, 0x37, 0x0f, 0x00, 0xbc, 0xb5, 0xff, 0x77, 0x98, 0xfb, 0x2f, 0x79, 0x7b, 0x4b, 0x98, 0x6f, 0x52, 0x5e, 0xe6, 0xd6, 0xad, 0xdb, 0x96, 0x0e, 0xb9, 0x93, 0x29, 0x92, 0xf3, 0xdc, 0xfc, 0x0c, 0xe6, 0xc6, 0xe8, 0x3e, 0x9c, 0x7c, 0xef, 0xda, 0x08, 0xd8, 0xea, 0x3e, 0xfc, 0x0d, 0x82, 0x17, 0x53, 0x83, 0x77, 0x52, 0xd6, 0xac, 0x55, 0x3f, 0xcf, 0xe1, 0x99, 0x7c, 0x9d, 0x5c, 0x15, 0x95, 0x14, 0x94, 0xb4, 0xee, 0xa1, 0xd3, 0xb3, 0xb4, 0x03, 0xe2, 0xa2, 0x2e, 0x23, 0xbc, 0xda, 0xd2, 0x47, 0xfd, 0x78, 0xb6, 0x95, 0x15, 0x16, 0x2d, 0xdb, 0x29, 0x87, 0xc1, 0x5f, 0xe6, 0xc1, 0x63, 0xd2, 0x88, 0xff, 0xc5, 0xee, 0x65, 0xa3, 0x1f, 0x30, 0x41, 0x36, 0xa3, 0xe0, 0x64, 0x5f, 0x73, 0x5c, 0x56, 0xd7, 0xe4, 0x8e, 0x76, 0x67, 0x1d, 0x0f, 0xce, 0x26, 0x72, 0x3a, 0x57, 0x64, 0xda, 0xe5, 0x70, 0x23, 0x59, 0x17, 0xba, 0xbb, 0xa3, 0x74, 0x00, 0x45, 0x22, 0x88, 0x61, 0xda, 0x98, 0x62, 0x53, 0xc1, 0xdc, 0x54, 0x91, 0x01, 0xc5, 0x09, 0xe6, 0x4a, 0x17, 0x75, 0x7b, 0xf6, 0x78, 0xaf, 0x8d, 0x38, 0xd9, 0x11, 0xd0, 0xe7, 0x0a, 0xad, 0x94, 0x90, 0x5f, 0xc9, 0x9b, 0xde, 0xdc, 0x68, 0xf2, 0x49, 0x60, 0x88, 0x84, 0x49, 0xe0, 0x2a, 0x32, 0xe6, 0xeb, 0x8c, 0x9d, 0x5a, 0x24, 0xa1, 0x80, 0xeb, 0xb6, 0xd1, 0x1e, 0xef, 0x40, 0x5c, 0xee, 0x16, 0x99, 0xa7, 0xf5, 0x96, 0x5b, 0x34, 0x68, 0x4f, 0x43, 0xc3, 0x36, 0x69, 0xb4, 0xa5, 0x07, 0xee, 0x65, 0x70, 0xdb, 0x6b, 0x1b, 0x23, 0x76, 0x72, 0xc1, 0xc4, 0x1e, 0xfc, 0xaf, 0xb4, 0x23, 0xcc, 0x6a, 0x3c, 0x57, 0x07, 0xd9, 0x0c, 0x66, 0x6d, 0xde, 0x0c, 0xe6, 0xb3, 0xd9, 0x01, 0xe8, 0x9b, 0x6d, 0x2c, 0x8e, 0xbd, 0x7b, 0xb6, 0x11, 0x3e, 0x24, 0x8d, 0x01, 0x42, 0xcf, 0xa8, 0xce, 0xcf, 0xe6, 0x26, 0xf0, 0xc6, 0x41, 0x86, 0x8d, 0x32, 0x2a, 0x46, 0xc8, 0xd7, 0xdc, 0x17, 0x91, 0xf9, 0x1a, 0x8c, 0xa3, 0xac, 0x30, 0xf1, 0x21, 0x7c, 0x4a, 0x9f, 0xa2, 0x87, 0x57, 0x91, 0x7c, 0x46, 0x8d, 0x08, 0x53, 0x3d, 0x5f, 0xe9, 0x3c, 0x7c, 0xe8, 0x75, 0x52, 0x38, 0x87, 0x66, 0x2c, 0x83, 0xc6, 0x38, 0x8a, 0x26, 0xc4, 0xa7, 0x25, 0xdd, 0xd9, 0x25, 0x54, 0x05, 0x70, 0x1a, 0xe9, 0x7f, 0x37, 0xdb, 0x78, 0x1b, 0xff, 0xb9, 0xcc, 0x3c, 0xf3, 0x35, 0x98, 0xc4, 0xbf, 0xf4, 0x57, 0xca, 0x1e, 0x90, 0xf4, 0x4b, 0xad, 0x07, 0xf2, 0x5e, 0x81, 0xb0, 0xce, 0xde, 0x08, 0xab, 0x3c, 0x04, 0x1d, 0x8b, 0xce, 0xa7, 0xdf, 0x88, 0x3f, 0x2e, 0x53, 0x46, 0xfc, 0x88, 0x75, 0xd8, 0x38, 0xa5, 0x3f, 0x82, 0x89, 0x84, 0x0f, 0xc0, 0xca, 0x53, 0xb3, 0x76, 0x9e, 0x9a, 0x75, 0xd6, 0xa9, 0x59, 0x97, 0xa5, 0x66, 0xad, 0x5c, 0x48, 0xd1, 0xe1, 0x79, 0x75, 0x99, 0x2a, 0xd6, 0xbf, 0x54, 0x7b, 0xd4, 0x79, 0x62, 0x53, 0x95, 0xab, 0x02, 0xb5, 0x7c, 0x1a, 0xb8, 0x1d, 0x9f, 0x06, 0x19, 0x5b, 0xe5, 0xe9, 0x8f, 0x6f, 0x24, 0x8a, 0x82, 0x30, 0x4a, 0xce, 0xf9, 0x23, 0xf1, 0x8d, 0x0f, 0x23, 0xd3, 0x45, 0x3d, 0x24, 0xd0, 0x70, 0x68, 0xe6, 0x41, 0x91, 0x40, 0x94, 0xf7, 0xf6, 0x5b, 0x10, 0x18, 0x5f, 0x04, 0x3a, 0x2a, 0x01, 0x14, 0x65, 0x59, 0xdf, 0xe6, 0x65, 0x7d, 0x54, 0x1b, 0x5a, 0x80, 0x6d, 0x43, 0x0b, 0xd8, 0xe6, 0x06, 0xaa, 0xd9, 0xef, 0x8e, 0x20, 0x5b, 0x72, 0x80, 0x04, 0x0a, 0xc4, 0x6f, 0xc1, 0xcc, 0x9f, 0x90, 0x65, 0xef, 0x36, 0xcc, 0x72, 0x40, 0x00, 0x16, 0x01, 0x09, 0x67, 0x3f, 0x68, 0x14, 0xcc, 0x69, 0xef, 0x20, 0x81, 0x34, 0x5b, 0xce, 0x4c, 0xa7, 0x82, 0xc5, 0xbd, 0x1d, 0x87, 0xbf, 0x0c, 0x64, 0x9b, 0x3b, 0x9c, 0x96, 0xae, 0x0e, 0xb8, 0x77, 0x3d, 0xce, 0x9e, 0x33, 0xd6, 0xd9, 0xc2, 0x1c, 0xff, 0xb3, 0x49, 0xb7, 0xd7, 0x24, 0x19, 0x19, 0x38, 0x50, 0x28, 0x27, 0xaa, 0xc0, 0xe9, 0x59, 0xab, 0x7e, 0x0e, 0x8f, 0x8d, 0xf1, 0x8b, 0xea, 0x8e, 0xb3, 0x31, 0x0f, 0x44, 0x73, 0xf7, 0xa1, 0x04, 0x1e, 0xb7, 0xa5, 0xf6, 0xec, 0xd7, 0xd1, 0xea, 0x16, 0x9e, 0x0e, 0x0e, 0x97, 0x3d, 0x1e, 0x2c, 0x8f, 0x92, 0x5e, 0xe5, 0x35, 0xeb, 0x8e, 0x53, 0x3d, 0x5a, 0x9a, 0xf0, 0x58, 0x94, 0x8d, 0xa1, 0x79, 0xe6, 0xa0, 0x3b, 0x2a, 0x70, 0x5c, 0x2a, 0xdc, 0x8e, 0x5f, 0x16, 0x9c, 0x7d, 0x21, 0x5d, 0xe4, 0xf0, 0x78, 0x60, 0xaf, 0xe0, 0xd9, 0x0f, 0xdd, 0x21, 0x3e, 0x60, 0x6c, 0x12, 0x53, 0x7f, 0xf0, 0x59, 0x6a, 0x78, 0xc0, 0x5e, 0xc1, 0x43, 0xac, 0x6d, 0x75, 0x07, 0x76, 0x08, 0x0e, 0xb0, 0xa7, 0xe6, 0x70, 0xb0, 0x14, 0xe0, 0xec, 0x99, 0x51, 0xde, 0x1e, 0x9c, 0x2e, 0x34, 0x67, 0x62, 0xf3, 0x55, 0x56, 0xc2, 0xce, 0x83, 0xc1, 0xea, 0x14, 0xe1, 0x99, 0xfa, 0x53, 0xb2, 0x07, 0xf0, 0xb4, 0x87, 0xa3, 0x9b, 0x7b, 0x82, 0xab, 0x0a, 0x85, 0xd3, 0x2c, 0xff, 0xce, 0x18, 0xa4, 0xb7, 0xa5, 0x17, 0xec, 0x2e, 0x62, 0x21, 0xca, 0x88, 0xe5, 0x5b, 0x10, 0xd1, 0x19, 0x5d, 0x2c, 0x8c, 0x6b, 0x3a, 0xa1, 0xc1, 0x8f, 0x5e, 0xc7, 0x75, 0x26, 0x31, 0xc7, 0x55, 0x94, 0xd2, 0xf9, 0x9e, 0x64, 0x64, 0xb4, 0xd7, 0xb1, 0x2f, 0x2f, 0x90, 0x98, 0x44, 0xe8, 0x45, 0x4b, 0x31, 0xaa, 0x81, 0xc6, 0x39, 0x10, 0x23, 0x0b, 0x37, 0x9e, 0x15, 0xcd, 0xb9, 0xd8, 0xcd, 0x96, 0xd0, 0xec, 0xd2, 0x39, 0xff, 0xbd, 0x75, 0xe8, 0xf2, 0x77, 0x17, 0x19, 0x70, 0x92, 0x8d, 0xa0, 0x55, 0x46, 0xe9, 0x9a, 0xa0, 0x49, 0x47, 0x3e, 0xb3, 0xea, 0x91, 0xb7, 0x2e, 0x1e, 0x99, 0x85, 0xe2, 0x11, 0x60, 0xc5, 0x23, 0xb7, 0x6e, 0xb8, 0x18, 0xe0, 0x4d, 0xd9, 0x3a, 0xf9, 0x2f, 0xb0, 0x5a, 0xb5, 0x05, 0x43, 0x4d, 0xc7, 0xc4, 0xda, 0x82, 0x5d, 0x77, 0xd3, 0xc3, 0x54, 0xa2, 0x4e, 0x96, 0xc1, 0x52, 0x29, 0x36, 0x1f, 0xc0, 0xd0, 0x75, 0xa1, 0xa2, 0x60, 0x3d, 0xa7, 0x8d, 0x39, 0x20, 0x68, 0x60, 0x5b, 0x68, 0xfa, 0x93, 0x0d, 0x46, 0x83, 0xd6, 0xa8, 0xa0, 0x71, 0xf7, 0x47, 0x6b, 0xf6, 0x2b, 0xd1, 0x19, 0x3b, 0x26, 0x38, 0xe8, 0x8c, 0x3c, 0x07, 0x6c, 0xb5, 0x84, 0xe6, 0xe0, 0xaf, 0x8b, 0xb9, 0xe4, 0xce, 0x6b, 0x52, 0x0a, 0xa7, 0x4b, 0x9d, 0xf0, 0x9e, 0x17, 0x19, 0x3e, 0xd6, 0x25, 0x85, 0x46, 0x23, 0x73, 0x09, 0x40, 0x2d, 0x34, 0xb8, 0x03, 0x68, 0x38, 0x95, 0xb2, 0x8d, 0x64, 0x11, 0xee, 0xe7, 0xf9, 0x0b, 0x5d, 0x1b, 0x37, 0x3e, 0x41, 0x7a, 0x23, 0xa0, 0x6d, 0xcd, 0xec, 0x44, 0x76, 0xb1, 0x7e, 0x31, 0x70, 0xf6, 0xcb, 0x07, 0xf9, 0xd2, 0xdc, 0xcc, 0x00, 0x4e, 0x06, 0x8e, 0x3f, 0x80, 0xa3, 0x04, 0x87, 0x9a, 0x03, 0x38, 0x6a, 0x70, 0xd0, 0x00, 0x8e, 0x1a, 0x1c, 0xb2, 0x57, 0xe0, 0xec, 0x5b, 0x22, 0x78, 0x3a, 0x58, 0x9d, 0x1a, 0x70, 0xa6, 0x83, 0xee, 0xd4, 0x4c, 0x96, 0x10, 0x77, 0xd0, 0x1d, 0x25, 0x38, 0x93, 0x97, 0x06, 0x67, 0x2f, 0xb7, 0xdd, 0xf2, 0x2a, 0x2d, 0x22, 0x16, 0x1e, 0x54, 0x47, 0xd5, 0xb0, 0x87, 0x64, 0x77, 0x08, 0xb6, 0x6e, 0xb0, 0x4b, 0x7c, 0x0e, 0x77, 0x31, 0x23, 0xa3, 0xd4, 0x30, 0x6d, 0x81, 0x52, 0xe3, 0x96, 0x86, 0xbf, 0x7a, 0x4d, 0x85, 0x80, 0xad, 0xac, 0x42, 0x07, 0x4d, 0x8c, 0x2a, 0xc8, 0x18, 0xa3, 0x8f, 0xb6, 0x65, 0xd9, 0xc7, 0x7f, 0xf6, 0x70, 0x43, 0x58, 0x61, 0xf6, 0x53, 0xc8, 0x5e, 0x5c, 0x50, 0x72, 0xb8, 0x13, 0xe3, 0xd6, 0xe6, 0x5c, 0x5e, 0x0e, 0x4c, 0x33, 0xe6, 0x18, 0xa3, 0x32, 0x61, 0xcf, 0x6d, 0x40, 0xc2, 0x87, 0xa0, 0xb6, 0x64, 0x69, 0x6e, 0x78, 0xa2, 0xa0, 0xf9, 0xac, 0xe4, 0x5e, 0x44, 0x83, 0xd9, 0x48, 0x83, 0xdc, 0x8b, 0x01, 0x85, 0x90, 0x40, 0x97, 0xc7, 0x80, 0xba, 0xbd, 0xbc, 0xb8, 0x32, 0xc1, 0xbf, 0x2f, 0xbb, 0x83, 0xa9, 0x81, 0xfc, 0x17, 0x6d, 0x8a, 0xcb, 0x76, 0x24, 0x67, 0xe3, 0x49, 0x16, 0xd0, 0x58, 0x02, 0xd7, 0x6a, 0x05, 0x87, 0x37, 0xd9, 0x53, 0x25, 0xe1, 0xea, 0x1b, 0xf6, 0x69, 0x09, 0x23, 0xe1, 0xbb, 0xec, 0xc7, 0xc9, 0x32, 0xb0, 0x77, 0xec, 0xc7, 0x09, 0x1f, 0xec, 0xf3, 0xa2, 0x26, 0x53, 0xae, 0xcd, 0x09, 0xe3, 0x34, 0x11, 0xfc, 0x15, 0xcc, 0x1f, 0x57, 0xcb, 0xb7, 0xb7, 0xef, 0x93, 0x2f, 0x83, 0x07, 0x67, 0x14, 0xd1, 0x6c, 0x15, 0x00, 0x16, 0x94, 0x69, 0x49, 0xa3, 0x87, 0x60, 0x4e, 0x96, 0x61, 0x64, 0x9c, 0x06, 0x77, 0xc1, 0x92, 0xcc, 0x24, 0x8b, 0x94, 0x3a, 0xa1, 0x16, 0xe4, 0x6c, 0xc4, 0xeb, 0xfb, 0x95, 0xcc, 0x32, 0xc7, 0x1f, 0xec, 0xcf, 0x28, 0x48, 0x24, 0xcb, 0xbe, 0x85, 0xea, 0x89, 0x75, 0x45, 0x82, 0x59, 0x76, 0xe9, 0xb2, 0xaa, 0x3c, 0x50, 0x5a, 0x3b, 0x96, 0xf0, 0x54, 0xe0, 0x68, 0xf8, 0xcf, 0xe9, 0x8d, 0x71, 0x34, 0xf7, 0xa3, 0x30, 0xf0, 0x77, 0x62, 0xb3, 0x37, 0x3e, 0x56, 0x2f, 0x4a, 0xc8, 0xc8, 0x7b, 0xb8, 0x2c, 0xc1, 0xdb, 0xff, 0x87, 0x46, 0xe1, 0xe3, 0x6c, 0xb5, 0x50, 0x52, 0xb4, 0x03, 0xb0, 0x47, 0x4c, 0xa7, 0x66, 0x1b, 0x0e, 0x4f, 0x4d, 0x42, 0xb1, 0x75, 0x0f, 0x17, 0xa0, 0x72, 0x68, 0xae, 0xf0, 0xcb, 0x2e, 0x4a, 0x7d, 0x61, 0x22, 0x80, 0xff, 0xfa, 0xc7, 0x7f, 0x1b, 0x97, 0x64, 0x62, 0x7c, 0x1e, 0x19, 0xb7, 0x6b, 0xd8, 0x5c, 0x31, 0x7e, 0xf4, 0x32, 0x9e, 0xc3, 0xb7, 0xd0, 0x78, 0x3f, 0x37, 0x40, 0x7f, 0x98, 0x75, 0x38, 0x34, 0xc5, 0x5b, 0xbd, 0xcb, 0xa9, 0xa2, 0x58, 0x28, 0xc9, 0x02, 0xca, 0xb7, 0xee, 0x71, 0xb0, 0x3c, 0x0d, 0x95, 0xbc, 0xf1, 0x07, 0x43, 0x0d, 0x2b, 0x5b, 0x10, 0x24, 0xb5, 0x44, 0x75, 0xe0, 0x58, 0x79, 0x9c, 0x0d, 0x25, 0xe0, 0x18, 0xb0, 0xc3, 0x30, 0xfb, 0xa0, 0x71, 0xf2, 0x2c, 0x8e, 0x13, 0x28, 0xe2, 0x74, 0x1a, 0xde, 0x8d, 0xc3, 0x8c, 0x5a, 0xa1, 0xb4, 0x14, 0x61, 0x33, 0x25, 0x92, 0xc8, 0xab, 0x7c, 0x7e, 0x3d, 0xd5, 0xf7, 0x4c, 0x99, 0xea, 0x9f, 0x9f, 0x20, 0x93, 0x73, 0x86, 0x74, 0xf0, 0xd8, 0x7a, 0xef, 0x94, 0xe0, 0xad, 0x6f, 0x4e, 0x56, 0xf3, 0x3b, 0xc5, 0x82, 0x05, 0xad, 0x41, 0x07, 0x24, 0xfd, 0x59, 0x92, 0x77, 0xfa, 0x32, 0xe8, 0x58, 0x5b, 0xa3, 0x83, 0xbb, 0x45, 0x07, 0xca, 0x35, 0xfe, 0x63, 0xb0, 0xa4, 0x99, 0x59, 0xd8, 0x12, 0x9b, 0x4d, 0x22, 0xb9, 0x7d, 0x46, 0x09, 0x0e, 0x28, 0x29, 0x51, 0x02, 0x35, 0xba, 0x34, 0x3a, 0x1b, 0x60, 0xaa, 0xc0, 0x04, 0x07, 0x98, 0x2a, 0x30, 0x11, 0xc4, 0xb2, 0xc8, 0xfc, 0x72, 0x6e, 0x97, 0x61, 0xba, 0x44, 0x66, 0x21, 0xce, 0x95, 0x2d, 0xff, 0x41, 0x85, 0xe5, 0x3f, 0x68, 0xbd, 0xfc, 0x27, 0xdf, 0x02, 0x2f, 0x03, 0x45, 0xbc, 0xe6, 0x54, 0xfa, 0xfe, 0xaa, 0x84, 0x70, 0x6e, 0xdb, 0x08, 0x55, 0x71, 0x3c, 0x98, 0x40, 0x1d, 0x44, 0xa7, 0x3a, 0xec, 0xad, 0x9a, 0x2b, 0x28, 0x5b, 0x47, 0x4e, 0x9c, 0x63, 0x5f, 0x88, 0x41, 0xca, 0xc2, 0x6d, 0xe5, 0x57, 0x85, 0xd6, 0x3b, 0x6f, 0x13, 0x91, 0x37, 0x15, 0x2f, 0x7e, 0x73, 0x76, 0xcd, 0xbb, 0x53, 0x9c, 0xd7, 0x37, 0x04, 0x34, 0xac, 0xa4, 0x6a, 0x08, 0x9b, 0xc5, 0x90, 0xa8, 0x72, 0x14, 0x0b, 0x67, 0x6f, 0x53, 0x73, 0x64, 0x62, 0xb9, 0x5a, 0x7e, 0xaa, 0x15, 0xed, 0x25, 0xe3, 0x5d, 0x60, 0xc9, 0xe3, 0xdd, 0x4f, 0x59, 0x40, 0xd7, 0xa5, 0x43, 0x86, 0x87, 0x1c, 0xf9, 0xda, 0x16, 0x74, 0x15, 0x6f, 0xf6, 0x45, 0x71, 0xda, 0x17, 0x4f, 0x83, 0x2c, 0x4e, 0x36, 0x4d, 0xc6, 0x52, 0x7d, 0x3a, 0x1b, 0x6d, 0x7d, 0xbc, 0x45, 0x58, 0x2a, 0x72, 0x6e, 0x1e, 0x92, 0x36, 0x3c, 0xb4, 0xc2, 0x9f, 0x74, 0xff, 0xd0, 0x2d, 0xcc, 0x28, 0x34, 0x15, 0x1a, 0xb9, 0x8f, 0x0f, 0x6d, 0x42, 0x68, 0xd6, 0x5d, 0xaf, 0xd3, 0x87, 0x7e, 0xf6, 0x1b, 0xe4, 0xf3, 0xe4, 0x4c, 0x34, 0x14, 0x11, 0xf2, 0x7b, 0xb5, 0x97, 0xa7, 0x71, 0xc1, 0x00, 0x8f, 0x24, 0xea, 0x1b, 0xb4, 0xa7, 0x0e, 0x1e, 0x47, 0x1e, 0x7d, 0x5c, 0x75, 0x16, 0x14, 0x2b, 0x23, 0x7d, 0x7d, 0x28, 0x76, 0x95, 0x6d, 0x74, 0x5f, 0x4a, 0xf6, 0x16, 0x2e, 0xb8, 0x8d, 0xcf, 0x6d, 0x75, 0x5f, 0xb0, 0xa5, 0x56, 0xa3, 0xe3, 0xb8, 0xe4, 0xb0, 0x33, 0x05, 0x05, 0x90, 0xe0, 0x00, 0x92, 0xd2, 0xc0, 0xca, 0x0b, 0x3f, 0x45, 0xa6, 0x95, 0xe7, 0x0f, 0x72, 0xf7, 0xcf, 0xd0, 0xc2, 0x01, 0x26, 0x1d, 0x98, 0xd0, 0x00, 0x93, 0x56, 0xd2, 0x60, 0x80, 0x49, 0xe7, 0xbe, 0xe3, 0xda, 0x8e, 0xcc, 0xcb, 0x8d, 0xf6, 0x2b, 0x2b, 0x56, 0x27, 0xb2, 0xa9, 0xe9, 0xd8, 0x01, 0xbf, 0xda, 0x79, 0x42, 0xd7, 0x0b, 0x17, 0x39, 0xad, 0xb7, 0x55, 0xf6, 0xb8, 0xec, 0xd9, 0xad, 0x3a, 0xc9, 0x09, 0x48, 0x5f, 0x58, 0x77, 0xd9, 0x30, 0x51, 0x95, 0x75, 0xb4, 0xb5, 0xb3, 0x32, 0x96, 0xfc, 0x2e, 0xd2, 0x20, 0xdd, 0x8b, 0xbe, 0x11, 0xac, 0x48, 0x19, 0xec, 0xf3, 0x33, 0x9b, 0xc0, 0x56, 0xe2, 0x3c, 0x14, 0xe4, 0x63, 0x74, 0x94, 0x67, 0xac, 0x23, 0x74, 0xf6, 0xc7, 0x77, 0x58, 0x5b, 0x04, 0x6c, 0xf5, 0x4a, 0x64, 0x5c, 0xcd, 0x56, 0x8b, 0xc1, 0xcf, 0x72, 0xac, 0x6a, 0x55, 0x6a, 0xc0, 0xaa, 0x58, 0x7e, 0x46, 0xd2, 0x4b, 0xe5, 0x97, 0xd9, 0x32, 0x78, 0x20, 0x4b, 0x9a, 0x72, 0x55, 0xfa, 0x2f, 0xd4, 0xc3, 0x2b, 0xbd, 0x5d, 0x3e, 0x04, 0x8b, 0x09, 0x88, 0x51, 0xb7, 0xd7, 0xfd, 0xd0, 0x10, 0xaf, 0x1b, 0xa2, 0xa1, 0xd5, 0xfd, 0xfd, 0xb3, 0x45, 0x26, 0x23, 0x5f, 0x07, 0x29, 0x9c, 0xd3, 0x12, 0x9e, 0x09, 0xf7, 0xe7, 0xbe, 0x43, 0x8a, 0xd6, 0x90, 0x02, 0x6f, 0x3f, 0x20, 0xad, 0x53, 0xd1, 0x94, 0x4e, 0xf5, 0xc5, 0x9b, 0xce, 0x0f, 0x08, 0x5d, 0xc2, 0x3a, 0xd2, 0x11, 0x44, 0x59, 0x61, 0xc3, 0x2d, 0x1b, 0xcb, 0xa4, 0x07, 0x7b, 0xdf, 0x6a, 0x30, 0x95, 0x67, 0xf6, 0xf6, 0xff, 0x99, 0x73, 0x2d, 0x76, 0xe5, 0xd1, 0x76, 0xf2, 0xcc, 0xb5, 0xe9, 0xbb, 0x17, 0x8d, 0x5d, 0x91, 0x89, 0xa0, 0xcc, 0x95, 0x36, 0x3e, 0xf5, 0xf3, 0xde, 0x81, 0x40, 0x6b, 0x01, 0xb1, 0x97, 0x55, 0x62, 0xe2, 0x7f, 0x63, 0x26, 0x5e, 0x26, 0xe0, 0xd1, 0x03, 0xf9, 0x2b, 0x9c, 0x1b, 0x1f, 0x57, 0x73, 0xb2, 0x8b, 0xf9, 0x28, 0x77, 0xdb, 0xe9, 0x03, 0x66, 0x4d, 0xbc, 0x2e, 0xc7, 0x10, 0xa4, 0x93, 0x52, 0x12, 0xd0, 0x1c, 0x06, 0x52, 0x0e, 0x9a, 0xd9, 0x0e, 0xb4, 0xf6, 0x13, 0x2d, 0x5a, 0x53, 0x65, 0x8e, 0xb6, 0x0d, 0x6e, 0x40, 0xcd, 0x6d, 0x63, 0x69, 0x6d, 0x4d, 0xd0, 0xf2, 0x0e, 0x36, 0x9e, 0xfb, 0x41, 0xd9, 0xdf, 0xbc, 0x3d, 0x5a, 0xc4, 0x38, 0x19, 0x27, 0xc1, 0xf2, 0xc9, 0xb8, 0x0c, 0xe6, 0x81, 0x7a, 0x5c, 0x43, 0xa7, 0x9d, 0xad, 0xa1, 0x4d, 0xcd, 0x6a, 0x3b, 0x48, 0x91, 0x3f, 0xb5, 0xdb, 0xfa, 0xa9, 0x19, 0xfa, 0x88, 0xa3, 0xdf, 0xfd, 0xc3, 0xc5, 0x5e, 0x60, 0x9c, 0x0f, 0x99, 0xaf, 0x67, 0x3d, 0xe2, 0x87, 0x1b, 0x7d, 0x19, 0xed, 0x6a, 0x46, 0xaf, 0xb5, 0xce, 0x75, 0xa7, 0x6a, 0x9e, 0xa6, 0xaa, 0xe5, 0xb8, 0x58, 0x7c, 0x46, 0x8f, 0x9f, 0xcf, 0x04, 0x97, 0xeb, 0xcf, 0x17, 0xc6, 0x9f, 0xf1, 0x09, 0x0d, 0x0c, 0x54, 0xc5, 0x06, 0x6e, 0x7a, 0x32, 0x71, 0x6d, 0x78, 0x64, 0x69, 0x1f, 0x4d, 0x0c, 0xd7, 0xe1, 0x91, 0x57, 0x88, 0x8e, 0x9a, 0xae, 0x47, 0x76, 0xab, 0xe8, 0x08, 0xe9, 0x76, 0x7b, 0x70, 0x24, 0xed, 0xc3, 0x43, 0x12, 0xa2, 0x17, 0x81, 0x8c, 0x13, 0xaa, 0x00, 0xe2, 0x96, 0x21, 0x3b, 0x3e, 0x3d, 0x32, 0x2e, 0x3f, 0x5f, 0x1c, 0x19, 0xb7, 0x57, 0xd6, 0xbb, 0xdb, 0xfc, 0xf2, 0xbd, 0x2f, 0xa8, 0xbd, 0x28, 0x56, 0xe3, 0x4d, 0xb0, 0x7a, 0x45, 0x95, 0x5d, 0x0d, 0xac, 0x7c, 0x1b, 0x32, 0x5a, 0x7b, 0xa7, 0x8a, 0x55, 0xb2, 0x39, 0xbc, 0xb8, 0x4f, 0xa4, 0x27, 0x23, 0xa2, 0xb2, 0x8a, 0x0b, 0xe4, 0x74, 0x2b, 0x26, 0x2d, 0xc3, 0x14, 0x85, 0xe1, 0x77, 0xe3, 0x92, 0x44, 0x8b, 0x14, 0xad, 0x2e, 0x57, 0xa0, 0xbe, 0x0a, 0xbc, 0xc0, 0x7e, 0xe3, 0xf5, 0x2c, 0x93, 0xb5, 0x1a, 0x78, 0xb9, 0x88, 0xdd, 0xbd, 0xc1, 0xb8, 0x5c, 0xd1, 0x3b, 0x89, 0x65, 0xfa, 0x1e, 0x1a, 0x47, 0x7f, 0x9a, 0xee, 0xf8, 0x15, 0x6c, 0xd5, 0x6d, 0x0d, 0x8c, 0xef, 0x82, 0xd4, 0x96, 0x4f, 0xe8, 0x64, 0x5a, 0x06, 0x66, 0x79, 0xbf, 0x9a, 0xdd, 0xaf, 0x76, 0x83, 0x49, 0x01, 0x85, 0x86, 0x9d, 0x46, 0x4e, 0x5b, 0x81, 0xa0, 0x9d, 0x55, 0x6d, 0xf9, 0xa2, 0x0c, 0x97, 0xf1, 0xc7, 0xbd, 0x3d, 0x79, 0x1a, 0xd3, 0x28, 0x0e, 0xaf, 0xfd, 0x3b, 0xba, 0x4c, 0xa3, 0xec, 0x93, 0xd5, 0x58, 0x41, 0x93, 0xb6, 0x81, 0x84, 0x6d, 0x2a, 0x54, 0xb6, 0x4e, 0x49, 0xea, 0xef, 0xb6, 0xd7, 0xdb, 0xf8, 0xce, 0x93, 0x2d, 0x4e, 0x81, 0x53, 0x9b, 0x19, 0x04, 0xc4, 0x05, 0x0f, 0xa3, 0x3b, 0xe3, 0x2b, 0x32, 0xae, 0x57, 0x0f, 0xe3, 0x19, 0x35, 0xae, 0x88, 0x1f, 0xfb, 0x66, 0xf2, 0x34, 0x5a, 0x92, 0x65, 0x10, 0x5f, 0x7c, 0x5f, 0xda, 0x48, 0xbc, 0xd9, 0xde, 0xaa, 0xbe, 0xe3, 0x44, 0x0e, 0xf2, 0xb5, 0x3c, 0xba, 0xca, 0xe3, 0x78, 0xc0, 0x2f, 0x62, 0x97, 0xa7, 0xe8, 0x4e, 0x57, 0x64, 0x66, 0x1c, 0x87, 0xbf, 0x8c, 0x6f, 0x41, 0x60, 0x9c, 0xcc, 0xc8, 0x62, 0x11, 0x4c, 0x94, 0xd4, 0x17, 0xee, 0x7a, 0xe5, 0x0a, 0x5e, 0xaf, 0x5c, 0xb1, 0x0a, 0x2b, 0x57, 0xd0, 0x7a, 0xe5, 0x8a, 0x2a, 0x47, 0x60, 0x6f, 0x4a, 0x79, 0x21, 0x21, 0xb9, 0xd8, 0x82, 0x92, 0xc0, 0xa6, 0x8c, 0xfa, 0xc3, 0x81, 0xdc, 0xcb, 0x64, 0xc7, 0xe9, 0x6c, 0x46, 0x27, 0xe1, 0x83, 0xf1, 0xe1, 0xe4, 0xdd, 0x37, 0x13, 0x7c, 0xc9, 0x31, 0x40, 0x3b, 0x32, 0x13, 0xad, 0x97, 0xa1, 0x69, 0x5a, 0xc7, 0xfa, 0x29, 0x1d, 0x4e, 0x76, 0xe6, 0x62, 0x96, 0xf8, 0x44, 0x4c, 0x1f, 0xce, 0xc9, 0x84, 0x86, 0xd3, 0xa9, 0x71, 0x15, 0xd1, 0x87, 0x80, 0x46, 0xac, 0xd0, 0x94, 0x96, 0xe7, 0xd6, 0xa7, 0xc9, 0x88, 0x7f, 0xad, 0xf1, 0x29, 0x98, 0x2f, 0xe9, 0xdc, 0x0f, 0x8d, 0xd1, 0xcf, 0x60, 0x39, 0xb9, 0x3f, 0x18, 0x37, 0x8c, 0x76, 0xe1, 0x6d, 0x80, 0x95, 0xe5, 0x2d, 0x71, 0xa9, 0x5f, 0x36, 0xc1, 0x73, 0xf6, 0xe4, 0x07, 0x77, 0x81, 0xf1, 0x95, 0xf8, 0x52, 0x0a, 0x87, 0x1d, 0x7a, 0xe2, 0xf6, 0xd9, 0x0f, 0xad, 0x90, 0xae, 0x75, 0xfa, 0x63, 0x8c, 0x19, 0x6b, 0x25, 0x80, 0x65, 0x4a, 0xcf, 0x26, 0x6c, 0xba, 0x6d, 0xb8, 0x80, 0xcd, 0x15, 0xdf, 0x3c, 0xd3, 0x51, 0x28, 0x5c, 0x5a, 0xec, 0x5b, 0x14, 0xff, 0x0a, 0xa7, 0xe1, 0xa6, 0x85, 0xda, 0x33, 0x15, 0xe9, 0xa4, 0x77, 0x39, 0xb1, 0x93, 0x0d, 0xca, 0x4d, 0x36, 0x12, 0x5f, 0x5f, 0x34, 0xdd, 0x38, 0x2b, 0x01, 0x70, 0x93, 0x6d, 0xd9, 0xb9, 0xc9, 0xb6, 0x0b, 0x5b, 0xb2, 0x2c, 0x86, 0xdf, 0x18, 0x0b, 0x2c, 0x60, 0xa0, 0x4a, 0x03, 0x56, 0x49, 0x19, 0x42, 0x31, 0x5f, 0xc6, 0x2f, 0xe6, 0x89, 0xc6, 0x98, 0xb9, 0xcc, 0x2e, 0x97, 0x19, 0xa5, 0xd9, 0x59, 0x37, 0xb5, 0x4f, 0xb0, 0xde, 0xe9, 0x4f, 0x32, 0xf3, 0x0c, 0xd8, 0xd6, 0x34, 0xbe, 0x9d, 0x26, 0x15, 0x7a, 0x14, 0x44, 0xef, 0x6e, 0x90, 0x01, 0x7f, 0x33, 0x3b, 0xe4, 0x44, 0x61, 0x49, 0x89, 0x03, 0xbb, 0x86, 0x17, 0x76, 0x29, 0x97, 0x7a, 0xfa, 0x52, 0x9c, 0x16, 0xcb, 0xf0, 0xd1, 0x38, 0x3e, 0x36, 0x1d, 0xd3, 0xb8, 0x6d, 0x58, 0x70, 0xea, 0xad, 0x5d, 0x3b, 0x5c, 0xbb, 0x76, 0x54, 0x70, 0xed, 0x98, 0xbb, 0x76, 0xcd, 0xf4, 0xbf, 0xbd, 0x25, 0xa9, 0x9c, 0xd3, 0x86, 0x54, 0xce, 0x6d, 0x3a, 0x4b, 0x6c, 0xf0, 0x19, 0x3b, 0x16, 0x82, 0xf1, 0xbf, 0x6d, 0x60, 0xfb, 0xb6, 0xe5, 0x98, 0xf1, 0x57, 0xbc, 0x56, 0xab, 0x04, 0x2e, 0x55, 0x9a, 0xfa, 0xb5, 0x11, 0xa0, 0xca, 0xd2, 0x5f, 0xb1, 0x89, 0xce, 0x74, 0xa9, 0xec, 0xc6, 0xd6, 0xe0, 0xa4, 0x79, 0x9d, 0xd5, 0x7c, 0xc8, 0x56, 0x88, 0x9c, 0xb1, 0xe2, 0xde, 0x92, 0x1c, 0x31, 0x9d, 0xe5, 0xc2, 0xaf, 0xfd, 0xec, 0x31, 0xb0, 0xa6, 0xd3, 0x4c, 0xbd, 0x10, 0xef, 0x1c, 0x71, 0x0a, 0xea, 0xf5, 0x8d, 0xc4, 0xb1, 0xe6, 0xd5, 0x09, 0x87, 0x29, 0xb9, 0xca, 0x55, 0x99, 0xf7, 0xcc, 0xdd, 0xed, 0x08, 0xb2, 0xb7, 0xdd, 0x11, 0xe4, 0x68, 0xb2, 0x12, 0xd6, 0xdf, 0x4a, 0x72, 0xd6, 0x4b, 0xce, 0x7e, 0xce, 0xeb, 0xdf, 0x17, 0x11, 0xf9, 0x11, 0x2c, 0x8c, 0xb3, 0x59, 0xc0, 0xb9, 0x2f, 0x8b, 0x4d, 0x98, 0xb0, 0x5a, 0x9b, 0x6c, 0xdb, 0x9d, 0xb0, 0xfb, 0xfc, 0x85, 0xcb, 0x4b, 0xfa, 0xb8, 0xdc, 0x37, 0xc4, 0x44, 0x4b, 0xb4, 0x20, 0xbd, 0xc0, 0x1f, 0x98, 0x5c, 0x15, 0xde, 0xbf, 0x5c, 0xad, 0x23, 0x4a, 0xe7, 0x47, 0x8b, 0x80, 0x54, 0xa9, 0xff, 0x76, 0x73, 0x99, 0xb4, 0xb6, 0x19, 0x2b, 0x40, 0x0a, 0x9e, 0x68, 0x8d, 0xcb, 0x24, 0xdf, 0xfb, 0xc5, 0x89, 0xce, 0xf8, 0xed, 0xe7, 0xed, 0x1f, 0x61, 0x14, 0x64, 0x75, 0x80, 0x60, 0x7e, 0x17, 0x1f, 0xed, 0x87, 0x07, 0x32, 0x4f, 0x42, 0x7d, 0x54, 0xff, 0x92, 0xbb, 0xf1, 0x1c, 0xcf, 0x70, 0xc7, 0x46, 0x5a, 0xb0, 0x58, 0x53, 0x61, 0xd8, 0x42, 0x05, 0x0b, 0x8e, 0xfd, 0x2b, 0xea, 0x77, 0x3a, 0x5b, 0x82, 0x19, 0x78, 0x79, 0xcc, 0xf6, 0x47, 0x95, 0x68, 0x0b, 0x55, 0xc2, 0x83, 0x2a, 0x09, 0x98, 0x81, 0x97, 0xc7, 0x6c, 0x83, 0x08, 0xb6, 0xdb, 0x90, 0x95, 0xc3, 0xe2, 0x62, 0x4d, 0x58, 0x5e, 0xcc, 0x26, 0xed, 0x4b, 0x90, 0x9f, 0x23, 0x66, 0xed, 0x3b, 0x62, 0xfb, 0x72, 0xf4, 0xf2, 0xed, 0x2b, 0x6c, 0xef, 0x1c, 0xc0, 0x52, 0xc4, 0x46, 0xc9, 0x33, 0xe4, 0xed, 0x6a, 0x07, 0x55, 0x8c, 0xcb, 0x75, 0xc2, 0xad, 0xd5, 0x89, 0x4c, 0xc2, 0x38, 0x62, 0x0f, 0x62, 0xeb, 0xf2, 0xcf, 0x58, 0x2f, 0xfe, 0xf5, 0x62, 0x8a, 0xd1, 0x56, 0x0d, 0x36, 0x05, 0xc4, 0x69, 0x05, 0x08, 0x7e, 0xf5, 0x80, 0x60, 0x5f, 0xe6, 0xb2, 0x2f, 0xe8, 0x43, 0x5a, 0xad, 0x1c, 0xc2, 0xbd, 0x29, 0x5b, 0xce, 0x0e, 0x4a, 0xd3, 0x0e, 0x29, 0x48, 0x57, 0x27, 0xc6, 0xd9, 0xfc, 0x2e, 0x98, 0xd3, 0xd4, 0x46, 0x74, 0x9a, 0x74, 0xca, 0x9f, 0x53, 0xe7, 0xe9, 0x3c, 0x28, 0xd3, 0xe9, 0xab, 0xf0, 0xfb, 0x77, 0x3a, 0x37, 0x6e, 0xc2, 0x55, 0x34, 0x8f, 0xaf, 0xae, 0xf3, 0xa5, 0x71, 0x7a, 0xdb, 0xcd, 0xbd, 0xe6, 0x85, 0x6c, 0x19, 0x21, 0x26, 0x2f, 0x88, 0x5a, 0x6b, 0x31, 0xaf, 0x29, 0x99, 0x19, 0x47, 0xd1, 0x84, 0xf8, 0x94, 0x4b, 0x07, 0x5f, 0xe7, 0xee, 0x2c, 0x9d, 0x0e, 0x67, 0x06, 0x15, 0xcf, 0x5d, 0x00, 0xab, 0xa8, 0x11, 0x59, 0x21, 0xd4, 0x18, 0x3d, 0xce, 0x82, 0xa5, 0xd1, 0x98, 0xca, 0x78, 0x76, 0xbc, 0x58, 0x1f, 0x2a, 0x40, 0x2f, 0x79, 0xd2, 0x6d, 0x59, 0x34, 0xfe, 0x18, 0x63, 0x35, 0x5c, 0x7e, 0xd7, 0x18, 0xd9, 0x35, 0x18, 0xe1, 0x21, 0x18, 0x17, 0x30, 0x32, 0x4b, 0x18, 0x9d, 0x5f, 0x8d, 0xd2, 0xfe, 0x5c, 0xe3, 0x60, 0xaf, 0xbf, 0xdd, 0x02, 0x45, 0x55, 0x07, 0x2e, 0xf5, 0xa9, 0xaf, 0x2b, 0x47, 0xd0, 0x1a, 0x24, 0x88, 0x21, 0x65, 0x7b, 0x7c, 0xc7, 0x65, 0x90, 0x9e, 0x1e, 0x69, 0xf4, 0x3d, 0x98, 0x1b, 0x9f, 0x6c, 0x5c, 0xac, 0xa9, 0x33, 0xa8, 0x5e, 0xa6, 0x05, 0x48, 0x65, 0x5d, 0xb4, 0x9a, 0x07, 0xa8, 0x67, 0xa9, 0x25, 0x94, 0x37, 0x10, 0x94, 0x85, 0xd5, 0xe9, 0xf9, 0x2a, 0x0b, 0xea, 0x6c, 0x6a, 0x41, 0x54, 0x6b, 0x0b, 0x75, 0x1a, 0x61, 0xed, 0x72, 0x25, 0xce, 0x7c, 0x1b, 0x1c, 0xaf, 0xa6, 0x53, 0x32, 0x0b, 0x2b, 0x2b, 0x8b, 0x4c, 0x71, 0x66, 0x70, 0x93, 0xe2, 0x42, 0x45, 0x80, 0x62, 0x73, 0x63, 0x1a, 0x51, 0xd4, 0xf7, 0x39, 0xd0, 0x29, 0x2b, 0x4d, 0xaf, 0xb7, 0x4e, 0x66, 0x55, 0x91, 0xf7, 0xf3, 0xf8, 0x2d, 0x1c, 0x4d, 0x96, 0xc6, 0xd1, 0xaf, 0x60, 0x51, 0xac, 0x86, 0xa1, 0x43, 0xad, 0x86, 0xc1, 0x72, 0x35, 0x4c, 0xa3, 0xb0, 0x30, 0xf5, 0x79, 0xdd, 0x1e, 0x71, 0xcd, 0x05, 0x6b, 0x70, 0x48, 0x0c, 0xce, 0x45, 0xc8, 0xa0, 0x41, 0x09, 0x34, 0xb8, 0xbe, 0xd5, 0xd0, 0x69, 0x96, 0x0a, 0x56, 0x5a, 0x0d, 0xf5, 0x9e, 0xd4, 0xe1, 0xdd, 0x84, 0x6c, 0x2a, 0x22, 0xef, 0xff, 0xfa, 0x10, 0x3e, 0xbd, 0x8b, 0x4f, 0x97, 0xf1, 0xcf, 0x8f, 0xff, 0xca, 0xd6, 0x1e, 0xfe, 0xca, 0xde, 0x0a, 0x5b, 0x81, 0x98, 0xbe, 0xba, 0x77, 0xf9, 0xcf, 0x5d, 0xbe, 0x03, 0x31, 0x7d, 0x5f, 0x95, 0xd6, 0x16, 0xd4, 0x60, 0x62, 0x55, 0xca, 0xa8, 0x5b, 0xa1, 0x75, 0x84, 0x9e, 0xc8, 0xaa, 0x14, 0xd7, 0x1d, 0x48, 0x51, 0xef, 0x28, 0x80, 0x52, 0x0a, 0xdd, 0x36, 0x86, 0xd8, 0xa8, 0x97, 0xcb, 0x51, 0xbc, 0x20, 0xf7, 0xe1, 0xdf, 0xa3, 0xe6, 0xd6, 0xd6, 0x3e, 0x5c, 0x63, 0x6c, 0x56, 0x65, 0x06, 0xde, 0xa4, 0xdc, 0xb6, 0xf0, 0x31, 0xbc, 0x0b, 0x96, 0x34, 0xbe, 0xc3, 0x74, 0x79, 0xd7, 0x3e, 0xbc, 0x40, 0x3c, 0xc7, 0xc7, 0xce, 0xf1, 0x81, 0x65, 0x7c, 0xd2, 0xb6, 0xe9, 0xd8, 0x3a, 0x07, 0xe1, 0x7c, 0x00, 0x68, 0x6d, 0xa1, 0x07, 0x80, 0x14, 0x00, 0x01, 0xd6, 0x03, 0x3b, 0x00, 0xa4, 0xd6, 0x20, 0xc1, 0x04, 0x9d, 0x23, 0x60, 0xf6, 0x1a, 0x19, 0x57, 0x89, 0x8c, 0xd5, 0x73, 0x64, 0xbc, 0x7c, 0xd1, 0xb4, 0x60, 0x75, 0xce, 0x9d, 0x9e, 0x23, 0x33, 0x55, 0xea, 0x0c, 0x43, 0xa6, 0x8f, 0x8d, 0x87, 0x92, 0x13, 0x05, 0xca, 0xe8, 0x64, 0xf3, 0x63, 0x49, 0xca, 0x16, 0xbe, 0xb4, 0xfa, 0xfc, 0xdd, 0x85, 0xfe, 0xfc, 0xdd, 0xba, 0x62, 0xeb, 0x9a, 0x0e, 0x3b, 0x51, 0x65, 0x88, 0x2e, 0x63, 0x4c, 0x4e, 0xc8, 0xf2, 0xaf, 0x24, 0x3b, 0x9b, 0x8f, 0x74, 0xef, 0x59, 0x62, 0xfb, 0x25, 0x2a, 0xdc, 0x0c, 0x2f, 0x17, 0xe7, 0x2c, 0x68, 0x2a, 0xbc, 0xd2, 0xe7, 0x30, 0x6e, 0xce, 0x8c, 0x51, 0x99, 0xe0, 0xb0, 0xd7, 0xb8, 0x59, 0xa6, 0xab, 0xd4, 0x33, 0xbc, 0x07, 0x7a, 0xb6, 0x2f, 0xe9, 0xee, 0xb5, 0x9e, 0xb9, 0xa8, 0x01, 0xaf, 0xbd, 0xd0, 0xb3, 0x7d, 0xc1, 0x2d, 0xe7, 0xa4, 0xb0, 0x85, 0x1c, 0xc0, 0x25, 0x89, 0x7e, 0x84, 0xc6, 0xc5, 0xcd, 0x3b, 0xd3, 0xc4, 0x7d, 0xdc, 0xc4, 0xcd, 0xbb, 0x95, 0x79, 0x0f, 0x3e, 0x00, 0x39, 0x30, 0x4f, 0xd3, 0x19, 0x59, 0xdc, 0x2b, 0x72, 0xc1, 0x30, 0xcb, 0xaf, 0xb1, 0x14, 0x4e, 0x91, 0x66, 0xcd, 0x2d, 0x00, 0x05, 0x8b, 0x40, 0x81, 0x1c, 0x28, 0x31, 0x2f, 0x27, 0xce, 0xe2, 0x81, 0x2a, 0x38, 0x50, 0x04, 0x07, 0xac, 0xf5, 0xc2, 0xfe, 0x5b, 0xd2, 0x61, 0xef, 0xe6, 0x9a, 0x61, 0xeb, 0x25, 0xc4, 0x91, 0x30, 0x4d, 0x97, 0x03, 0x90, 0x8f, 0xd5, 0x29, 0x67, 0xe9, 0x36, 0x9a, 0x9f, 0x7f, 0xd9, 0x79, 0xba, 0x5c, 0x6c, 0xdc, 0x28, 0xb6, 0x34, 0xf7, 0xd3, 0xb2, 0x08, 0xd0, 0xc6, 0x1e, 0xa8, 0x77, 0xd8, 0x58, 0x75, 0x3d, 0xe9, 0x7a, 0x49, 0x40, 0x47, 0xcc, 0xab, 0xe7, 0xf2, 0x5e, 0x92, 0xbb, 0x60, 0x62, 0x7c, 0x1a, 0xe5, 0x42, 0xe2, 0x67, 0x25, 0xf2, 0xe1, 0x54, 0x63, 0x5d, 0x12, 0x0c, 0xb7, 0x30, 0x8c, 0x3e, 0xcc, 0xf4, 0x00, 0xda, 0xa2, 0x1e, 0x14, 0x71, 0xe9, 0x6f, 0x8a, 0x94, 0xd3, 0x1b, 0x01, 0x93, 0x38, 0xa5, 0x01, 0x79, 0xb5, 0xfe, 0xf4, 0x93, 0x7f, 0x86, 0xfb, 0x13, 0x53, 0xe5, 0x4f, 0x46, 0x64, 0xb9, 0x8a, 0xe6, 0x45, 0x63, 0x6a, 0x96, 0x4d, 0x0a, 0xcc, 0x3d, 0xc8, 0x18, 0x15, 0x06, 0x93, 0xa1, 0xcd, 0x4c, 0x0a, 0xac, 0xb8, 0x0f, 0x01, 0x0a, 0x50, 0xb1, 0xa3, 0x40, 0xac, 0xe3, 0x08, 0x7e, 0xc2, 0x4e, 0x04, 0x73, 0xeb, 0x0d, 0x88, 0x95, 0xd1, 0xad, 0x50, 0xb7, 0x50, 0x9a, 0x2b, 0x09, 0xa6, 0x60, 0xcc, 0x28, 0xd5, 0x16, 0x0b, 0x8c, 0x19, 0x68, 0x6d, 0x38, 0xe1, 0x26, 0x37, 0xec, 0xdd, 0x0e, 0x21, 0x68, 0x94, 0x2a, 0xf3, 0x98, 0x4a, 0xe9, 0x39, 0x13, 0x44, 0x4e, 0xc3, 0xd9, 0xe3, 0x7d, 0x30, 0x3f, 0x26, 0x29, 0x18, 0x6e, 0x6a, 0x40, 0xf8, 0xc9, 0x40, 0x9b, 0xd2, 0xc9, 0xe1, 0x8a, 0x0a, 0x08, 0xa5, 0x3d, 0x88, 0x35, 0x9c, 0xab, 0x29, 0xa0, 0xc2, 0xbd, 0xed, 0xaf, 0xc4, 0xa3, 0x72, 0x58, 0x00, 0x2c, 0x3b, 0x57, 0xb3, 0x79, 0x06, 0x3b, 0x07, 0xc6, 0x04, 0xae, 0x5a, 0x55, 0xbe, 0xa4, 0x24, 0x1a, 0x62, 0x4c, 0xe1, 0x6e, 0x0c, 0x8d, 0x14, 0x10, 0x76, 0xd6, 0xb1, 0xb9, 0x39, 0x3c, 0xfc, 0x57, 0xe0, 0x8d, 0xd1, 0xd2, 0x0c, 0x45, 0x0a, 0x70, 0x81, 0x01, 0x2e, 0x25, 0x5c, 0x16, 0xcd, 0xb2, 0x57, 0x39, 0xe5, 0x2b, 0xe4, 0x70, 0x05, 0x93, 0x28, 0x5c, 0x84, 0xd3, 0x65, 0x56, 0x4b, 0x18, 0xc5, 0x1f, 0xfd, 0x9d, 0xe6, 0xb5, 0x70, 0x7e, 0xe6, 0x70, 0xc7, 0xeb, 0x18, 0x95, 0xbc, 0xcf, 0xeb, 0xf0, 0x14, 0xe4, 0xe9, 0xa7, 0xb4, 0x7c, 0x0e, 0x9a, 0xbd, 0x6d, 0x2e, 0xe3, 0x7a, 0x11, 0x93, 0x28, 0xe3, 0x28, 0x36, 0x04, 0xdf, 0x82, 0x6c, 0xbe, 0x62, 0xb6, 0xba, 0x33, 0xc8, 0x3c, 0xe3, 0x7a, 0xaa, 0xb2, 0x5b, 0xe9, 0xb6, 0x71, 0x14, 0x9c, 0x83, 0xa4, 0xe8, 0xaf, 0x91, 0x57, 0xe4, 0x31, 0x82, 0x03, 0xf2, 0x60, 0x81, 0x9d, 0xfb, 0xf0, 0x8e, 0xac, 0xf7, 0xff, 0xc9, 0x53, 0xae, 0x87, 0x46, 0x76, 0xab, 0xcb, 0xab, 0xcc, 0x39, 0x34, 0xa1, 0xc8, 0x37, 0xca, 0xf9, 0x33, 0x8f, 0x3a, 0xa6, 0xcf, 0x84, 0xe0, 0x10, 0x79, 0x3b, 0x72, 0x98, 0xc6, 0xcf, 0x04, 0xd3, 0x61, 0xb2, 0x8c, 0xda, 0x08, 0x5a, 0xd9, 0x02, 0x5a, 0xde, 0x09, 0xc4, 0xae, 0x71, 0x9f, 0x68, 0x78, 0x41, 0xc3, 0x6c, 0x92, 0xe4, 0xea, 0xe8, 0x54, 0x76, 0x69, 0x35, 0xb7, 0x1e, 0x0e, 0xd0, 0xd3, 0x78, 0x0f, 0x66, 0x1b, 0xca, 0xf1, 0x18, 0xdb, 0xc5, 0xa9, 0xa7, 0xb7, 0x9f, 0xce, 0x46, 0x06, 0x7c, 0xf7, 0x18, 0x46, 0x4b, 0x65, 0x7c, 0xd8, 0xfe, 0x75, 0xae, 0x11, 0xac, 0x5f, 0xf4, 0x66, 0x66, 0xee, 0x02, 0x50, 0xd6, 0x97, 0xc4, 0xd4, 0xeb, 0xd3, 0xd9, 0xed, 0x8d, 0x31, 0x4a, 0x9e, 0xac, 0x8c, 0x98, 0x8a, 0xe2, 0xbc, 0x83, 0x8e, 0xb8, 0xb2, 0x71, 0xb5, 0x37, 0xbe, 0x89, 0x01, 0xe2, 0x94, 0x55, 0xa0, 0x4c, 0x40, 0x16, 0x0b, 0x94, 0x50, 0x48, 0x24, 0xad, 0xbf, 0x03, 0x39, 0xa8, 0x1c, 0x3a, 0xc0, 0x16, 0x75, 0x54, 0xa0, 0xbb, 0x0a, 0x7f, 0xd2, 0xe8, 0x68, 0xc0, 0x4d, 0xec, 0x83, 0xf3, 0x84, 0x5e, 0xd2, 0x0a, 0x6e, 0x25, 0x5a, 0xbc, 0xed, 0x39, 0x83, 0xf6, 0x16, 0x34, 0xb8, 0x01, 0x68, 0x60, 0x00, 0xad, 0x91, 0x8f, 0x4a, 0x04, 0x6d, 0x3a, 0xcd, 0xea, 0x3d, 0x1a, 0xa0, 0x6d, 0xe7, 0xe3, 0x18, 0x68, 0xde, 0xde, 0x14, 0xf3, 0x0b, 0x3b, 0x4c, 0xa1, 0x96, 0x9e, 0x81, 0x8a, 0x9e, 0x8d, 0x3e, 0x0b, 0xcd, 0xec, 0x6f, 0xdf, 0xb0, 0x0f, 0x8c, 0xf1, 0x79, 0xc3, 0x3e, 0x31, 0x7e, 0xaa, 0x77, 0xfc, 0xa7, 0x88, 0x7d, 0x9b, 0x7e, 0xe6, 0x1a, 0xd2, 0xe7, 0xe3, 0x8e, 0x68, 0x1a, 0xc9, 0x5a, 0xa7, 0xb8, 0x4c, 0xcd, 0x76, 0x7f, 0x0e, 0x8e, 0x23, 0x01, 0x47, 0xe2, 0xf6, 0xbb, 0xa7, 0x38, 0xd3, 0x1f, 0x54, 0x04, 0xad, 0x3b, 0x7b, 0x2d, 0x96, 0x93, 0x03, 0x38, 0x13, 0x0f, 0x5a, 0xdc, 0x9f, 0x7d, 0x7d, 0x7f, 0xfa, 0xfe, 0xa8, 0x76, 0xc7, 0x8d, 0xd3, 0x15, 0x2d, 0x60, 0xdd, 0x15, 0x0c, 0xed, 0xe2, 0x0a, 0x66, 0xb5, 0xbd, 0x82, 0xe1, 0x31, 0x60, 0x7e, 0x3f, 0x1f, 0x3e, 0x66, 0xc1, 0xdf, 0x53, 0xc2, 0x08, 0x1e, 0x44, 0xd3, 0x59, 0x68, 0x9c, 0xdd, 0x76, 0x67, 0x79, 0xcd, 0x86, 0x8e, 0xee, 0x2d, 0x2d, 0x2f, 0x6c, 0x4d, 0x5a, 0x04, 0x5b, 0x50, 0xb7, 0x31, 0x26, 0xe4, 0x3c, 0xad, 0x72, 0x75, 0x7a, 0x65, 0x7c, 0xa5, 0xd1, 0x22, 0x8e, 0x23, 0xf9, 0xd8, 0xfa, 0x33, 0xf2, 0xcb, 0xec, 0x9c, 0x9d, 0x8a, 0x87, 0x32, 0x57, 0x41, 0x44, 0xe6, 0xf7, 0xc4, 0xb8, 0x5d, 0x46, 0xf4, 0x81, 0xa6, 0xed, 0x2a, 0x3a, 0x37, 0x82, 0x2e, 0x98, 0x58, 0xcd, 0x4d, 0x19, 0xa0, 0x55, 0xae, 0xd8, 0x6a, 0x54, 0x08, 0x9d, 0xa6, 0x78, 0x3b, 0x9b, 0x29, 0xb4, 0x9d, 0xac, 0x69, 0x20, 0xe7, 0x57, 0x2f, 0x32, 0x8a, 0x77, 0xc2, 0x8c, 0xfd, 0xac, 0x7c, 0xd8, 0xda, 0xd4, 0x73, 0x98, 0x31, 0xae, 0xfa, 0x24, 0xdb, 0xc0, 0x90, 0x5b, 0x8d, 0x12, 0xa3, 0x3a, 0xab, 0x77, 0xec, 0xe6, 0xf2, 0x68, 0x4b, 0xf3, 0x72, 0x75, 0x82, 0xb7, 0x7c, 0xc7, 0x5c, 0x46, 0xe4, 0x00, 0xa4, 0x94, 0xf1, 0x6b, 0xb0, 0x24, 0xea, 0x13, 0x5f, 0x2a, 0xe4, 0x58, 0xb2, 0x42, 0x8e, 0xfc, 0x8c, 0x6b, 0xce, 0xbd, 0xa1, 0xcd, 0x39, 0xde, 0xf9, 0x6d, 0xcf, 0xf6, 0x27, 0xa4, 0x2c, 0x5c, 0x76, 0xbb, 0x4b, 0x42, 0xc8, 0xb3, 0x5f, 0xfd, 0xbe, 0xd9, 0xe5, 0x79, 0x11, 0x94, 0xf7, 0x07, 0x31, 0x8c, 0x46, 0xb0, 0xe6, 0x70, 0xbf, 0x90, 0x35, 0xc3, 0x9b, 0xd7, 0xaf, 0xb9, 0xa6, 0xdb, 0xae, 0xc0, 0x4c, 0x5a, 0x35, 0xf4, 0x20, 0xad, 0xac, 0x00, 0x3e, 0x57, 0xb8, 0x66, 0x8c, 0x5e, 0x13, 0x46, 0x3b, 0x05, 0xbe, 0x68, 0x4e, 0x17, 0x9d, 0xeb, 0x81, 0x2d, 0x2f, 0xcf, 0x72, 0xf1, 0x5a, 0x2f, 0x5a, 0xce, 0x47, 0xc0, 0xb2, 0x5f, 0x00, 0xdb, 0xf4, 0x41, 0xa4, 0x9b, 0x9e, 0xe2, 0x63, 0xd9, 0x5c, 0x56, 0x91, 0x00, 0x04, 0x06, 0x80, 0x6a, 0x00, 0xca, 0x69, 0x41, 0x06, 0x80, 0xca, 0x00, 0xc5, 0xc6, 0x76, 0x2c, 0x68, 0xd0, 0xb0, 0xcf, 0x49, 0x04, 0x69, 0x82, 0x4d, 0x4b, 0xb0, 0x43, 0x03, 0x48, 0x35, 0x20, 0x0d, 0x9a, 0xa4, 0x04, 0x69, 0x62, 0x7a, 0x03, 0x48, 0x0d, 0x20, 0x51, 0x5b, 0x0c, 0xe2, 0x47, 0xd6, 0x7e, 0x82, 0xc4, 0x53, 0x60, 0xb8, 0x5b, 0xb8, 0x96, 0xe1, 0x6a, 0x72, 0xff, 0x48, 0x7c, 0xbe, 0xfd, 0xb1, 0x05, 0x76, 0x53, 0x68, 0xfa, 0x03, 0x76, 0x9a, 0xd8, 0x59, 0x87, 0xaa, 0x77, 0xfb, 0x82, 0xd8, 0xe1, 0x68, 0xdb, 0x4b, 0x9f, 0x4f, 0xde, 0x24, 0x44, 0x59, 0x01, 0x38, 0xcf, 0x6d, 0x5f, 0xdd, 0x7e, 0x32, 0xae, 0x90, 0x99, 0x5e, 0x70, 0x2f, 0xc3, 0x71, 0x30, 0xa3, 0xdb, 0xef, 0x85, 0xd7, 0xe6, 0x4a, 0x69, 0x5f, 0x16, 0xf1, 0xda, 0x94, 0x45, 0x74, 0x97, 0xe4, 0x41, 0x08, 0x27, 0xec, 0x9b, 0x72, 0x08, 0xf1, 0xbf, 0x64, 0x3e, 0x26, 0xc6, 0x69, 0x44, 0xee, 0x92, 0xf4, 0x55, 0xc6, 0xe3, 0xc7, 0xf9, 0xe8, 0x5f, 0x98, 0x92, 0x74, 0x2f, 0x32, 0x02, 0x39, 0x70, 0xeb, 0x7b, 0x72, 0x19, 0xb8, 0x70, 0x4e, 0x39, 0x6e, 0x23, 0x4e, 0xe2, 0xdf, 0xdf, 0x00, 0xc3, 0xf5, 0x80, 0x9d, 0x93, 0xf3, 0x14, 0xe3, 0xf9, 0x6b, 0xf2, 0x17, 0x8d, 0x8c, 0xcf, 0xf3, 0xbf, 0x88, 0x71, 0x73, 0xd6, 0xd7, 0x49, 0x63, 0x04, 0x81, 0xc5, 0x74, 0x09, 0x97, 0x94, 0x29, 0x43, 0xe7, 0x8a, 0xcc, 0x97, 0xf7, 0x34, 0x22, 0x92, 0x6c, 0x7b, 0x8f, 0x47, 0x42, 0x39, 0x66, 0xa0, 0x09, 0xb3, 0x9e, 0x53, 0x1f, 0xe6, 0x40, 0x71, 0xc7, 0x57, 0x06, 0xea, 0x9a, 0x04, 0xff, 0xb7, 0x1a, 0x10, 0x62, 0xc4, 0x10, 0x4e, 0xa9, 0x8d, 0xb8, 0x80, 0x90, 0x2a, 0x42, 0xe8, 0x59, 0xff, 0x69, 0x41, 0x99, 0x80, 0x5c, 0x99, 0xe2, 0x70, 0x61, 0x58, 0xe3, 0x5e, 0x85, 0x2b, 0x4f, 0x3e, 0xc0, 0x02, 0x5c, 0x23, 0x1a, 0xfd, 0x20, 0xb3, 0xed, 0xa3, 0x4e, 0x06, 0x91, 0x5b, 0x87, 0x90, 0xb7, 0xed, 0x92, 0x4f, 0xb3, 0x8d, 0x42, 0x39, 0x6d, 0x3d, 0x1f, 0x03, 0x08, 0xd8, 0x88, 0x0c, 0x00, 0xc9, 0x00, 0x42, 0x26, 0x91, 0x04, 0x4e, 0xdf, 0x82, 0x99, 0x3f, 0x21, 0xcb, 0xde, 0x52, 0xb4, 0xb0, 0x3e, 0x6f, 0xd7, 0x14, 0x32, 0xa0, 0xd7, 0xd4, 0xbf, 0xa3, 0x24, 0x1a, 0x68, 0xc7, 0xd3, 0xd4, 0x27, 0x10, 0x18, 0xda, 0xaf, 0x69, 0x1c, 0x42, 0x1a, 0xc7, 0xc1, 0x32, 0x3e, 0x60, 0x77, 0xc4, 0xb8, 0xa0, 0x73, 0xba, 0x08, 0x16, 0x86, 0x7d, 0x2c, 0x2f, 0xd0, 0x6f, 0x3a, 0x20, 0xe3, 0x36, 0xaf, 0x11, 0x6b, 0x29, 0x51, 0xde, 0x33, 0x6f, 0xe1, 0x72, 0x53, 0xb7, 0x42, 0x22, 0x39, 0x29, 0x41, 0x79, 0x90, 0xf4, 0x0d, 0x81, 0x0d, 0x62, 0xc1, 0xc6, 0xb9, 0x51, 0x53, 0x39, 0x37, 0x0a, 0x35, 0xe7, 0x46, 0xf9, 0x74, 0x5b, 0xee, 0x56, 0xf3, 0x73, 0x9e, 0x4a, 0xa6, 0x13, 0xf5, 0xbf, 0x21, 0x78, 0x2d, 0x08, 0x2a, 0x08, 0x82, 0xb8, 0x20, 0x8d, 0x44, 0xa7, 0x82, 0x5c, 0xb8, 0xb6, 0x71, 0xa2, 0xc5, 0xd8, 0x78, 0x2e, 0x95, 0x95, 0x9f, 0xcf, 0x97, 0x93, 0xca, 0x52, 0xbd, 0x2c, 0xed, 0xcb, 0x6c, 0x95, 0x33, 0x58, 0x2d, 0x95, 0xdc, 0x71, 0x6d, 0xbd, 0x90, 0xd0, 0x12, 0xa5, 0x72, 0x2b, 0xd5, 0xca, 0x96, 0x9e, 0xa6, 0xf2, 0xae, 0xec, 0xa2, 0x54, 0xb3, 0x60, 0xfe, 0xbd, 0xcd, 0x00, 0x48, 0xdb, 0x97, 0x86, 0xeb, 0xf9, 0x5b, 0x35, 0x6c, 0x03, 0xc2, 0xac, 0x7d, 0x11, 0xcb, 0x4e, 0xd0, 0x97, 0xd1, 0x71, 0xda, 0xe5, 0x9b, 0xfe, 0xe1, 0x2a, 0x8c, 0x96, 0xd2, 0x26, 0xdf, 0xf8, 0x20, 0xe7, 0x5d, 0xbe, 0xde, 0xba, 0xcb, 0x17, 0xa4, 0x74, 0xb4, 0x4e, 0x22, 0xaa, 0xbd, 0x9e, 0x3f, 0x5f, 0xfb, 0xd5, 0xb5, 0x5b, 0x65, 0xaf, 0x6f, 0x2c, 0x52, 0xee, 0x8a, 0x2c, 0x0e, 0x1a, 0xd1, 0xc5, 0x7a, 0xe8, 0xb3, 0x61, 0xd6, 0x69, 0xcc, 0x36, 0x63, 0x02, 0x21, 0x23, 0x7c, 0x4d, 0x7f, 0x84, 0xb3, 0x55, 0xda, 0x9b, 0x74, 0xa5, 0x79, 0xd8, 0x7a, 0xb1, 0x7c, 0x97, 0xe1, 0x05, 0x90, 0x2e, 0x5e, 0x06, 0x1a, 0xaa, 0x83, 0xa5, 0x9e, 0x17, 0xc8, 0x16, 0x75, 0x5e, 0x07, 0x81, 0x71, 0xfd, 0xa7, 0x63, 0x3a, 0xbb, 0xef, 0xe6, 0x80, 0xdb, 0x76, 0x73, 0xa0, 0x56, 0xbc, 0x28, 0xda, 0xdd, 0x1c, 0x7c, 0x20, 0x73, 0x4a, 0xa7, 0x42, 0x7c, 0x1e, 0x4e, 0xbe, 0x1b, 0x27, 0x64, 0xee, 0x3f, 0xf1, 0x0d, 0x25, 0xbd, 0x0c, 0xd0, 0x59, 0x1f, 0xb1, 0xcb, 0x88, 0xb4, 0xd6, 0x01, 0xc0, 0x1a, 0x9e, 0x7c, 0x0e, 0xaf, 0xcf, 0xdc, 0xd1, 0x0e, 0x62, 0xb9, 0x27, 0x6c, 0x96, 0x13, 0x2b, 0x23, 0x32, 0xff, 0x49, 0xd2, 0x91, 0xf5, 0xcf, 0xf3, 0x59, 0xba, 0xd4, 0x4a, 0x9e, 0x88, 0x82, 0x6d, 0x42, 0x8b, 0xbc, 0x69, 0xa9, 0xee, 0x91, 0x08, 0xca, 0x8a, 0xb2, 0x79, 0x65, 0x88, 0xc5, 0x3b, 0x6f, 0x4b, 0x21, 0x76, 0xba, 0x0f, 0x04, 0x35, 0xdd, 0x1c, 0x9a, 0xc3, 0x01, 0x65, 0xa4, 0x59, 0x1b, 0x89, 0x01, 0xe0, 0x94, 0xe6, 0xa1, 0xf8, 0xe9, 0x4b, 0x1f, 0x31, 0xa3, 0x90, 0x29, 0xd0, 0x90, 0xe5, 0x47, 0xce, 0x6e, 0xe8, 0xc5, 0x75, 0x04, 0x0d, 0x72, 0x9b, 0x72, 0x03, 0x15, 0xde, 0x31, 0xaf, 0x62, 0x88, 0xb9, 0x69, 0x41, 0x9a, 0x8c, 0x63, 0x63, 0xc6, 0xfd, 0x1c, 0xdf, 0xfb, 0x41, 0x9d, 0x6c, 0x25, 0x2d, 0xb0, 0xda, 0x68, 0x01, 0xcf, 0x44, 0x56, 0xe2, 0xe7, 0x4a, 0x66, 0xb1, 0x78, 0xea, 0x75, 0xb2, 0x84, 0x56, 0x16, 0x8a, 0x41, 0x40, 0xc6, 0xe5, 0x47, 0x3f, 0x3f, 0x41, 0x66, 0x69, 0xaf, 0xb5, 0x62, 0xac, 0x79, 0x93, 0x26, 0x70, 0xd5, 0x53, 0x67, 0xc9, 0x4d, 0xac, 0xb1, 0xfb, 0x86, 0x6d, 0xe9, 0x9a, 0x8a, 0x77, 0xb0, 0x34, 0xee, 0x5d, 0x47, 0x8e, 0xe2, 0x4a, 0x0d, 0xbc, 0xf9, 0x53, 0x5b, 0xca, 0xa7, 0xb6, 0x35, 0x57, 0x48, 0x48, 0xda, 0x09, 0xd9, 0x43, 0x87, 0xf3, 0xa7, 0x94, 0xe2, 0x63, 0x74, 0x9f, 0xd8, 0x5a, 0xd9, 0x3e, 0x9a, 0x7c, 0x3f, 0x44, 0xbf, 0xfb, 0xc1, 0x14, 0x78, 0x7d, 0x85, 0x3d, 0x87, 0xca, 0x07, 0x9c, 0x69, 0xc7, 0x2b, 0x97, 0xd8, 0x46, 0x4b, 0xe2, 0x07, 0x44, 0xeb, 0xa2, 0xfb, 0xfa, 0x33, 0xb4, 0xbc, 0xbf, 0xc4, 0xa5, 0x42, 0x7f, 0xc9, 0x68, 0x49, 0xc9, 0x83, 0xf1, 0x35, 0x88, 0x96, 0x09, 0xcf, 0x4e, 0x61, 0x8d, 0xd0, 0xe6, 0x81, 0xe0, 0xa1, 0x85, 0x7f, 0x9c, 0xd6, 0x0d, 0x9a, 0x00, 0x97, 0x0f, 0xdb, 0x92, 0xd2, 0xd9, 0x88, 0x46, 0x01, 0x5d, 0x18, 0x9f, 0x82, 0x87, 0x71, 0x89, 0xb2, 0x84, 0x03, 0xe2, 0xad, 0xf1, 0x28, 0x5c, 0xb1, 0x01, 0xbf, 0x63, 0xbb, 0x5b, 0x8c, 0xd0, 0xfe, 0xbd, 0x11, 0xf5, 0xd9, 0xdf, 0x9b, 0x8a, 0x0d, 0x7a, 0x21, 0x36, 0x72, 0xf3, 0x91, 0xc8, 0x5e, 0x88, 0xcd, 0x5b, 0xf2, 0x5c, 0xec, 0x61, 0x0c, 0x4d, 0x8c, 0x6d, 0xcb, 0xb1, 0x6d, 0xcf, 0x46, 0xb6, 0xa5, 0x10, 0x5b, 0x41, 0xce, 0x63, 0xad, 0x6d, 0x00, 0x90, 0xdb, 0x00, 0xc8, 0x6d, 0x80, 0xa9, 0xbc, 0x2f, 0xb7, 0x5c, 0xcc, 0xf5, 0xf7, 0xa6, 0x9b, 0xb9, 0x64, 0x7c, 0xf1, 0xb1, 0x8d, 0xd2, 0xc4, 0x8a, 0xc6, 0xf8, 0xf8, 0x36, 0x74, 0x2c, 0x07, 0xc1, 0x71, 0xad, 0x41, 0xe8, 0x2f, 0x56, 0xc2, 0x71, 0x42, 0x75, 0xc6, 0x73, 0xb4, 0x8c, 0xe2, 0x9b, 0xc0, 0x22, 0x0e, 0x5c, 0xc2, 0xde, 0x76, 0x4f, 0x71, 0x9c, 0xc0, 0x80, 0x93, 0x8e, 0x57, 0x02, 0x8e, 0x06, 0x4e, 0xb7, 0x1f, 0x37, 0x31, 0xd1, 0xcf, 0x65, 0x98, 0x4b, 0xd5, 0xb5, 0x0d, 0x44, 0x87, 0xeb, 0x48, 0xf6, 0xb5, 0x8b, 0xce, 0x8b, 0xc0, 0x53, 0x71, 0x3b, 0x30, 0x4b, 0xbb, 0x65, 0x4b, 0xc9, 0x25, 0x81, 0xe9, 0xa1, 0x27, 0xdd, 0x74, 0x18, 0x2f, 0x2c, 0xc7, 0xca, 0x9a, 0x79, 0x85, 0x6e, 0xa6, 0xd1, 0x7f, 0x2e, 0xff, 0x9d, 0xb1, 0x5b, 0x25, 0xdb, 0xe4, 0xc5, 0x0d, 0xa0, 0xfd, 0x24, 0xb7, 0xe2, 0xe5, 0xc1, 0x09, 0xbb, 0x14, 0x22, 0x56, 0x04, 0xb8, 0xb9, 0xf8, 0x4f, 0x2d, 0x83, 0x8a, 0xd9, 0x25, 0x07, 0xc4, 0x9e, 0xb6, 0xc5, 0xe1, 0x29, 0x5b, 0x15, 0x64, 0x8d, 0xcb, 0xac, 0xcf, 0x37, 0xf7, 0xd1, 0x6a, 0xb1, 0x7c, 0x20, 0x8b, 0x65, 0xac, 0x4a, 0xd9, 0xee, 0xb6, 0x39, 0x99, 0x85, 0x77, 0x06, 0xfa, 0x0d, 0x16, 0x5a, 0x11, 0x76, 0x7f, 0xe2, 0x34, 0x90, 0xb2, 0xb7, 0xd5, 0x22, 0xa0, 0x71, 0xe2, 0x18, 0x50, 0x26, 0xf5, 0xcb, 0xfc, 0xfa, 0x19, 0x50, 0x97, 0x19, 0x50, 0x74, 0xf4, 0x93, 0x3c, 0x0e, 0x45, 0x4b, 0x19, 0x6e, 0x66, 0x9d, 0x82, 0x9d, 0x07, 0x11, 0x5d, 0x2c, 0xe3, 0x5f, 0x91, 0xa9, 0x5a, 0x6a, 0xc0, 0x2a, 0x5a, 0xe6, 0xed, 0x22, 0x35, 0x23, 0xb2, 0xf5, 0xe8, 0xab, 0x9b, 0x9e, 0x7e, 0x65, 0x34, 0x5f, 0x1a, 0x0a, 0x66, 0x39, 0xc0, 0x2f, 0x94, 0x28, 0xf3, 0xaf, 0x6f, 0x6f, 0xc2, 0x07, 0x4a, 0x8d, 0x72, 0x03, 0x83, 0x92, 0x5f, 0x13, 0x4a, 0x2b, 0x17, 0xd2, 0x8c, 0x2e, 0xd6, 0x2b, 0xa6, 0x8c, 0xfd, 0x2c, 0x25, 0x0e, 0x2c, 0xbf, 0xec, 0x86, 0xb3, 0xe7, 0x92, 0x75, 0x8e, 0xec, 0x90, 0x5b, 0xb3, 0x65, 0x6b, 0x85, 0xe4, 0xe1, 0x8b, 0xa0, 0x3e, 0x2f, 0x2f, 0x68, 0xcb, 0x67, 0xcf, 0x15, 0xc2, 0x94, 0x2a, 0xc4, 0x48, 0xad, 0x11, 0xaa, 0xce, 0x9d, 0x66, 0x8d, 0x68, 0xb5, 0xed, 0x5b, 0x27, 0xc5, 0x38, 0xcd, 0xc2, 0xd6, 0x89, 0x95, 0x97, 0x82, 0x98, 0xd5, 0x4c, 0x0e, 0x7f, 0x31, 0x3e, 0xe9, 0x6f, 0xb3, 0xe3, 0x9a, 0xba, 0x56, 0x28, 0xde, 0xdc, 0xfc, 0x0c, 0xe6, 0x46, 0xd2, 0xfe, 0x53, 0x2c, 0x3b, 0xe1, 0x52, 0x56, 0x7f, 0xcb, 0x31, 0x3f, 0x8e, 0x17, 0xeb, 0x54, 0x30, 0x9b, 0x5a, 0x15, 0x94, 0x4b, 0x8a, 0xf8, 0x6f, 0x80, 0x55, 0x1a, 0xbf, 0x7c, 0x89, 0x91, 0x6a, 0x87, 0x91, 0xad, 0x41, 0x55, 0xc5, 0xba, 0x65, 0xa1, 0x2d, 0x74, 0xcb, 0x7e, 0x19, 0xd3, 0x28, 0xbe, 0x0d, 0xdc, 0xf7, 0x3e, 0x8e, 0x03, 0x16, 0x48, 0xc3, 0x5c, 0xcb, 0x76, 0xdc, 0xd2, 0xe6, 0xf8, 0x2f, 0xf3, 0x20, 0xfe, 0xef, 0x9e, 0x8c, 0x2f, 0x76, 0xce, 0x94, 0x6f, 0x73, 0x5f, 0x61, 0x6d, 0xa9, 0x3d, 0x4e, 0x11, 0x19, 0x24, 0x38, 0x52, 0x36, 0x26, 0xf2, 0xeb, 0x77, 0x66, 0x1a, 0x9f, 0xf2, 0x14, 0x40, 0xe1, 0x37, 0x78, 0xe5, 0x4e, 0x17, 0xb1, 0xd5, 0x05, 0x22, 0x09, 0x35, 0x50, 0x6e, 0x84, 0x60, 0x6a, 0x85, 0x40, 0xea, 0x5b, 0x81, 0x26, 0xf9, 0x1d, 0xa3, 0xaa, 0x8e, 0xd5, 0x29, 0x5b, 0x4f, 0xfc, 0x35, 0x98, 0xc4, 0x9f, 0xf6, 0x2b, 0x9d, 0xfc, 0x48, 0xc2, 0xb6, 0xf5, 0x66, 0xb9, 0x03, 0xe6, 0xc0, 0xcb, 0xa5, 0x75, 0x98, 0xf3, 0x40, 0x19, 0xc3, 0xdb, 0x0b, 0x4a, 0xab, 0x34, 0xc1, 0x9d, 0xc9, 0x6e, 0x71, 0xaf, 0x69, 0x7b, 0x69, 0xa6, 0x76, 0xea, 0x60, 0xdb, 0x82, 0x26, 0x74, 0x51, 0x0a, 0xcb, 0xdb, 0x64, 0xc7, 0xc6, 0x35, 0x7d, 0x08, 0x97, 0x34, 0x37, 0xa3, 0x16, 0x93, 0x35, 0xa7, 0xca, 0x1c, 0xaf, 0xa9, 0xce, 0x0a, 0x8b, 0x79, 0x00, 0xdf, 0xcb, 0xa3, 0x0a, 0x28, 0xc5, 0x18, 0x12, 0xc8, 0xd2, 0x66, 0xc5, 0xea, 0x38, 0x48, 0x05, 0xf1, 0xda, 0x0a, 0x02, 0x90, 0xcb, 0x04, 0xf9, 0x22, 0xbb, 0x63, 0xd8, 0xa9, 0xd5, 0xab, 0x0a, 0xa5, 0x9f, 0x1b, 0xac, 0x08, 0xe6, 0x95, 0xfc, 0x03, 0x52, 0x9d, 0x70, 0xb5, 0xf1, 0x13, 0xb6, 0x86, 0xc0, 0xca, 0xd6, 0x10, 0xd8, 0xb8, 0x83, 0x01, 0x64, 0xeb, 0xde, 0x9c, 0x76, 0xb5, 0x4c, 0xee, 0x44, 0x6f, 0xc7, 0xe1, 0x2f, 0x03, 0xd9, 0x66, 0x9d, 0x87, 0xe8, 0x59, 0x4b, 0x5b, 0x61, 0xf0, 0x74, 0xc0, 0x48, 0xd1, 0x15, 0x69, 0xe2, 0xf2, 0x8d, 0x61, 0xc0, 0xa8, 0x7a, 0xd6, 0x4c, 0x22, 0x34, 0xee, 0xa4, 0x18, 0xa5, 0xf7, 0x90, 0xe0, 0x07, 0x1d, 0x80, 0x5a, 0x03, 0x65, 0x31, 0xa0, 0x50, 0xd6, 0xb9, 0x93, 0x01, 0x75, 0x36, 0x0b, 0x96, 0x45, 0x94, 0x0c, 0x96, 0xcd, 0xaf, 0xee, 0xd0, 0x41, 0x60, 0x43, 0x67, 0x6c, 0xa1, 0x36, 0xb1, 0xac, 0xbd, 0x75, 0x2c, 0x6b, 0x75, 0x12, 0xcb, 0x72, 0xd8, 0x00, 0xca, 0x60, 0x03, 0x80, 0x4d, 0x7f, 0xa5, 0xb0, 0x7d, 0x9e, 0xd3, 0x6e, 0xa3, 0xfd, 0x83, 0xde, 0x17, 0x93, 0x2f, 0x92, 0x32, 0x07, 0xac, 0x5a, 0x63, 0x85, 0x06, 0xac, 0xb4, 0xb1, 0xb2, 0x06, 0xac, 0x9a, 0xb0, 0xf2, 0x81, 0x2c, 0xf6, 0x6c, 0xc0, 0xaa, 0x67, 0xae, 0xd0, 0xf7, 0x07, 0x8c, 0xb4, 0xf9, 0xbe, 0xda, 0x60, 0x64, 0xef, 0x64, 0x97, 0xc1, 0x5e, 0x52, 0x7f, 0x55, 0x70, 0x2a, 0x85, 0x55, 0x4d, 0xb6, 0xc9, 0xee, 0x6a, 0x2f, 0xc6, 0x41, 0xd9, 0x26, 0x8a, 0x86, 0x73, 0xd7, 0x88, 0x11, 0x19, 0x30, 0x6a, 0xc2, 0x68, 0xea, 0x0f, 0x67, 0x4e, 0x77, 0xd5, 0x25, 0x22, 0x16, 0x96, 0xeb, 0x93, 0x74, 0xfd, 0x5c, 0x9f, 0xd5, 0x8a, 0x5f, 0xf5, 0xcc, 0xd2, 0xf5, 0x85, 0x5d, 0x88, 0x87, 0x48, 0x53, 0x09, 0x97, 0x35, 0xc0, 0xd5, 0x06, 0x2e, 0xef, 0x60, 0xe0, 0xe2, 0x4c, 0xc7, 0xd6, 0x5e, 0x00, 0x57, 0xbe, 0x29, 0x0f, 0x7a, 0xd6, 0x04, 0xd7, 0x70, 0x2c, 0x6b, 0x6b, 0xd5, 0x4e, 0xb6, 0xf6, 0x1c, 0xe3, 0xac, 0x13, 0x13, 0xb2, 0x8d, 0x64, 0x6f, 0x6f, 0x03, 0x12, 0x5e, 0x06, 0xbb, 0x41, 0xaa, 0x4d, 0x24, 0xa1, 0x43, 0xd2, 0xd0, 0x80, 0x94, 0x5d, 0xd7, 0x3b, 0xa7, 0x8f, 0x14, 0xcc, 0x06, 0xd9, 0x81, 0xc9, 0x2a, 0x37, 0xbc, 0xaa, 0xff, 0x1f, 0x1a, 0x85, 0x8f, 0xc9, 0xe6, 0xdf, 0xab, 0x9e, 0x73, 0x84, 0xae, 0x11, 0x02, 0x03, 0x42, 0x25, 0x84, 0xfe, 0xeb, 0x1f, 0xff, 0x6d, 0x7c, 0x0c, 0xe6, 0xab, 0x5f, 0xea, 0x22, 0x69, 0x3e, 0x4c, 0xe0, 0x1e, 0x07, 0xcb, 0xd3, 0xb0, 0xb9, 0x85, 0x6c, 0x87, 0x33, 0xb1, 0x70, 0xeb, 0x99, 0xd8, 0xf6, 0xb9, 0x85, 0x14, 0x9e, 0x62, 0xe0, 0xee, 0x42, 0x56, 0xf4, 0xcb, 0x0c, 0x13, 0x1f, 0xbe, 0x68, 0xc2, 0x67, 0x73, 0x2a, 0xd5, 0x67, 0x35, 0x4a, 0x0d, 0xcc, 0x31, 0x52, 0xa3, 0xa4, 0x84, 0xc8, 0xb3, 0xca, 0x83, 0x07, 0x0c, 0xa2, 0xd3, 0xf0, 0x6e, 0x1c, 0xce, 0x69, 0x07, 0x7b, 0xdf, 0x15, 0xc2, 0x2a, 0x1f, 0x5e, 0xf9, 0xc8, 0x79, 0xe3, 0x24, 0x1b, 0x9b, 0x17, 0xdf, 0x6a, 0xca, 0xec, 0x70, 0x15, 0x85, 0x1d, 0x3d, 0xf3, 0x3e, 0xbd, 0x4d, 0xac, 0xad, 0xf0, 0x7b, 0x04, 0x0d, 0xc1, 0xcf, 0x51, 0x87, 0x54, 0x42, 0x63, 0x95, 0xa1, 0x01, 0x26, 0x72, 0x65, 0x8a, 0x3e, 0x68, 0x4d, 0xec, 0x7b, 0x2d, 0xa9, 0x99, 0xfc, 0x98, 0xd4, 0xb5, 0x61, 0x07, 0xc0, 0xbc, 0x50, 0x94, 0xdb, 0xa5, 0xf6, 0x40, 0xb9, 0x99, 0x3c, 0x74, 0x88, 0x70, 0x87, 0x5a, 0x04, 0x6a, 0xb4, 0x68, 0x74, 0xf6, 0x42, 0x18, 0xbd, 0xf0, 0x49, 0xb3, 0xe4, 0x18, 0x49, 0xd5, 0xa8, 0xaf, 0x18, 0x89, 0x3e, 0x4c, 0x81, 0xd1, 0x25, 0x32, 0x3b, 0x6a, 0x09, 0xef, 0x70, 0x28, 0xa8, 0x5d, 0xac, 0x65, 0x5b, 0x52, 0xef, 0xdc, 0x8d, 0x64, 0xb5, 0xa1, 0xe8, 0x06, 0xaf, 0xba, 0xca, 0xe3, 0xda, 0x20, 0xad, 0xa0, 0xeb, 0xf1, 0x5b, 0xb4, 0x9b, 0xdf, 0xe3, 0x56, 0x2e, 0x56, 0xe0, 0x4d, 0xf0, 0x36, 0x79, 0xbb, 0x9b, 0xbd, 0x49, 0x2c, 0xd7, 0xd1, 0x4f, 0x99, 0x6c, 0xfb, 0x12, 0x31, 0xe7, 0x66, 0xc7, 0x92, 0x87, 0x85, 0x9f, 0xd8, 0xee, 0x29, 0xd8, 0xa7, 0xe0, 0x47, 0x50, 0x53, 0xdb, 0x82, 0xae, 0xe2, 0x55, 0xf6, 0x0f, 0x9b, 0x7c, 0xb2, 0xd3, 0x2d, 0xdd, 0xb8, 0x2a, 0x7a, 0x73, 0x36, 0x2a, 0x28, 0x3a, 0xec, 0x62, 0xc8, 0xae, 0xcb, 0x69, 0x02, 0xe5, 0xa9, 0x45, 0x0d, 0xe2, 0x74, 0x3a, 0x6e, 0xe4, 0x34, 0xc8, 0x24, 0x72, 0xb6, 0xb8, 0x9b, 0x99, 0x59, 0x57, 0x5c, 0xaa, 0x73, 0x90, 0x42, 0xe5, 0x57, 0x7c, 0x58, 0x7b, 0xc5, 0x4f, 0x85, 0xea, 0xfb, 0x1d, 0x1f, 0xec, 0x13, 0x36, 0xfb, 0x71, 0xc9, 0x87, 0xfc, 0x72, 0xef, 0x99, 0xea, 0xc3, 0xd0, 0x37, 0xbd, 0x11, 0x0c, 0x05, 0x54, 0x24, 0x40, 0xba, 0xc4, 0x66, 0x83, 0x74, 0xe8, 0x7e, 0x5d, 0x62, 0x4d, 0x47, 0x1e, 0xd8, 0x5d, 0xed, 0xc0, 0x96, 0x0a, 0x8d, 0x1c, 0x1b, 0x45, 0xe6, 0x9b, 0xdf, 0x4d, 0x04, 0xed, 0x30, 0xdd, 0xbe, 0x08, 0x5e, 0xb9, 0x94, 0xd9, 0x52, 0x73, 0xda, 0x55, 0xec, 0x77, 0x80, 0x89, 0x1d, 0x4b, 0x8e, 0x50, 0x45, 0x35, 0xfa, 0x8b, 0x50, 0x45, 0x87, 0x58, 0x9d, 0x09, 0x4b, 0x10, 0x32, 0xbe, 0x05, 0x11, 0xf5, 0x5f, 0x9a, 0xaa, 0x76, 0x9f, 0xca, 0x72, 0x80, 0xfd, 0x40, 0x7a, 0xe4, 0xa4, 0x70, 0x0d, 0x1a, 0x56, 0xee, 0x68, 0x6d, 0x80, 0xcc, 0x88, 0x7f, 0x97, 0x91, 0xf4, 0xac, 0xf4, 0x4f, 0xd5, 0x6c, 0x05, 0x6e, 0xb6, 0x8e, 0xaa, 0xf5, 0x18, 0xb7, 0xca, 0x25, 0x43, 0x5e, 0x39, 0xbf, 0xa6, 0x13, 0x1a, 0xfc, 0xe8, 0xf2, 0x50, 0x1e, 0x70, 0xa2, 0x1a, 0x0e, 0x18, 0x35, 0xa7, 0x5c, 0x06, 0x8c, 0x9a, 0x93, 0xc9, 0x03, 0x46, 0x4d, 0x18, 0x41, 0xd7, 0x76, 0x64, 0x31, 0xe8, 0x68, 0xbf, 0x8a, 0x09, 0x8d, 0xfc, 0x71, 0xda, 0xd7, 0x31, 0x53, 0x1e, 0x73, 0x8f, 0xce, 0x7b, 0x9f, 0xc7, 0x88, 0xa1, 0x01, 0x3b, 0x86, 0xe6, 0x60, 0xd3, 0x18, 0x7c, 0xed, 0x0d, 0x80, 0xd9, 0xda, 0x1b, 0x50, 0xc1, 0xe8, 0x24, 0x3b, 0x30, 0xb0, 0xb3, 0x9d, 0x90, 0xb5, 0xcc, 0x72, 0x22, 0x6b, 0x9a, 0xea, 0x79, 0xf9, 0x9a, 0x1e, 0xe5, 0xf3, 0xee, 0x40, 0xd7, 0x1b, 0x5e, 0xd5, 0x66, 0x66, 0x6a, 0x43, 0x39, 0x76, 0xbf, 0x6c, 0x48, 0x3c, 0x4d, 0xc0, 0x84, 0xb5, 0x19, 0xd3, 0xfd, 0x7b, 0x62, 0x8e, 0x31, 0x32, 0xe5, 0x05, 0xbb, 0xfd, 0x7d, 0xe2, 0x44, 0xcd, 0xa5, 0x4f, 0xfc, 0xe9, 0xa5, 0x94, 0xbb, 0xc3, 0x62, 0x84, 0x2d, 0xbd, 0x97, 0x8e, 0x3e, 0x1d, 0xba, 0x9f, 0x92, 0xdc, 0xa0, 0x36, 0x83, 0x46, 0x0c, 0xeb, 0x0e, 0x1f, 0x9a, 0x2e, 0xb4, 0x06, 0x0c, 0x5a, 0xa3, 0xe8, 0xc5, 0xf4, 0x5e, 0xa9, 0xd6, 0xb4, 0x87, 0xc6, 0x52, 0x6a, 0xcd, 0xae, 0xa0, 0x39, 0xbc, 0x7b, 0x92, 0xd8, 0xcd, 0x02, 0x15, 0xce, 0x71, 0x30, 0x3a, 0x09, 0xe9, 0x6c, 0xdd, 0xc9, 0xca, 0xb7, 0xfd, 0xf4, 0xbe, 0x4b, 0x35, 0x46, 0xaa, 0xf6, 0xa0, 0x0d, 0x48, 0xc1, 0xa6, 0xe8, 0xb9, 0xdc, 0x21, 0x55, 0x85, 0x28, 0x16, 0xba, 0x40, 0x07, 0x00, 0xbc, 0xe2, 0xf2, 0x28, 0x33, 0x27, 0x04, 0x70, 0xba, 0x0a, 0x48, 0x2b, 0xad, 0xda, 0xf2, 0x02, 0xcc, 0x97, 0xd9, 0x32, 0x78, 0x20, 0x4b, 0x9a, 0x25, 0xc6, 0xf7, 0x70, 0x8c, 0x1a, 0xda, 0x6f, 0x1f, 0x89, 0xef, 0xcf, 0x28, 0x48, 0x29, 0x48, 0xb3, 0xef, 0x61, 0xca, 0x80, 0xbc, 0xf3, 0x01, 0x58, 0x75, 0xcb, 0x80, 0xdd, 0x0c, 0xe6, 0x8c, 0x2e, 0x16, 0xcf, 0xdb, 0x97, 0xb3, 0x5f, 0xb3, 0x01, 0x10, 0xe9, 0x63, 0xd4, 0x9b, 0x91, 0x6a, 0x25, 0x5a, 0xe8, 0x00, 0xd1, 0x92, 0x9d, 0x50, 0xb4, 0x3e, 0xa1, 0x39, 0x43, 0xf8, 0x73, 0xe0, 0xc9, 0xac, 0x34, 0x31, 0xb3, 0xef, 0x10, 0x44, 0xe5, 0xbd, 0xa8, 0x0c, 0xcf, 0x64, 0xb4, 0xb8, 0x06, 0xc2, 0xee, 0x13, 0x06, 0xad, 0x1f, 0xd8, 0x2d, 0x2b, 0xc0, 0xfe, 0x3c, 0xb0, 0xa8, 0xb1, 0xae, 0xfc, 0xd6, 0x92, 0x3c, 0x70, 0x6d, 0x8f, 0xc8, 0xf3, 0x27, 0x65, 0x44, 0xd2, 0x31, 0x64, 0x02, 0xc5, 0x23, 0x9b, 0xcf, 0x93, 0x23, 0x85, 0xda, 0x79, 0x2f, 0x04, 0x65, 0xb1, 0x46, 0x23, 0xc6, 0x7b, 0x9d, 0x47, 0x62, 0xe8, 0x9b, 0xc8, 0xb2, 0x4a, 0x0a, 0x74, 0x34, 0x89, 0x56, 0xbf, 0x7a, 0xb8, 0xf7, 0x4c, 0x04, 0x88, 0x73, 0x7d, 0x23, 0x8f, 0x5b, 0x2f, 0x8c, 0x32, 0x80, 0xa6, 0x4b, 0x1a, 0xdd, 0xcd, 0xc2, 0x9f, 0x71, 0x44, 0x1e, 0x2c, 0x62, 0xb7, 0x10, 0x4c, 0x86, 0x1e, 0xa3, 0x2a, 0x5e, 0x80, 0xf1, 0xe5, 0x35, 0xe0, 0x65, 0x98, 0xd8, 0x7d, 0x17, 0x87, 0x72, 0xef, 0x3e, 0x1d, 0xf5, 0x1e, 0x3a, 0xb0, 0xa6, 0x18, 0x04, 0x02, 0x74, 0x3a, 0xe4, 0xe9, 0x7d, 0xd5, 0x34, 0xc8, 0x6a, 0xb6, 0x22, 0x5c, 0x3b, 0xe2, 0xfb, 0x3c, 0x34, 0xb8, 0x78, 0x46, 0xc1, 0x85, 0xe5, 0x85, 0xa8, 0x6f, 0x8f, 0xbe, 0x07, 0xf1, 0x63, 0x3c, 0x1a, 0x27, 0xab, 0xc5, 0x32, 0x7c, 0x58, 0x18, 0x57, 0xa3, 0x58, 0xc1, 0x2a, 0x16, 0x1f, 0xc0, 0x4e, 0x71, 0xda, 0xd5, 0xa8, 0x91, 0xc3, 0x77, 0x53, 0x32, 0x65, 0xc8, 0x0b, 0x81, 0x47, 0xb3, 0x80, 0xce, 0x7f, 0x92, 0x88, 0x66, 0x8b, 0xf1, 0x4e, 0xc2, 0x87, 0xc7, 0xd8, 0x04, 0x8d, 0x67, 0x34, 0xf5, 0x71, 0xc6, 0xd5, 0x8c, 0x3c, 0x8d, 0x96, 0xf1, 0x4f, 0xc2, 0x79, 0xa7, 0x1b, 0x07, 0x5f, 0xc8, 0xdb, 0xad, 0x95, 0x04, 0xea, 0xc1, 0xc7, 0x97, 0x73, 0x7b, 0x6c, 0xb8, 0x05, 0x32, 0xd6, 0x6a, 0x1e, 0xb1, 0x1f, 0x3d, 0x90, 0xbf, 0x62, 0x68, 0x92, 0xf5, 0x82, 0xbb, 0xa1, 0x95, 0x72, 0xba, 0x22, 0x7a, 0x83, 0xcf, 0x7f, 0x6f, 0xe4, 0xa8, 0xc5, 0xff, 0xc6, 0xe5, 0xa3, 0x95, 0xa1, 0xf6, 0x71, 0x35, 0x27, 0xcf, 0x6e, 0x82, 0x74, 0x58, 0x94, 0x18, 0x66, 0x5e, 0x97, 0x74, 0x4a, 0x5a, 0x31, 0xb5, 0xc3, 0xb7, 0x31, 0x7b, 0xf9, 0x06, 0x95, 0x56, 0x88, 0x79, 0x3b, 0x21, 0x69, 0x76, 0xf4, 0xb5, 0xac, 0xe1, 0x68, 0xba, 0x6d, 0x94, 0xcc, 0xd6, 0x31, 0xdf, 0x7c, 0xf9, 0x6e, 0x7c, 0x5d, 0x72, 0xcb, 0x3a, 0x16, 0x4d, 0x88, 0x4f, 0x0b, 0x1b, 0xa8, 0x8c, 0xf3, 0xf8, 0x3f, 0x79, 0xc6, 0xa5, 0x5b, 0xba, 0x56, 0x6b, 0x43, 0x8b, 0x4e, 0x50, 0x46, 0x4c, 0x06, 0x1d, 0xd1, 0x6f, 0x2d, 0xd2, 0x85, 0x99, 0xc1, 0xf2, 0xc9, 0xb8, 0x0c, 0xe6, 0xc1, 0x76, 0x3b, 0x27, 0x85, 0x47, 0x16, 0x53, 0xd6, 0xf5, 0x3b, 0x27, 0x95, 0x8f, 0xec, 0xb6, 0x7e, 0xe4, 0x46, 0x30, 0x37, 0x7c, 0x32, 0xbe, 0xed, 0x8f, 0x2f, 0x50, 0x31, 0xb1, 0x55, 0x18, 0xc8, 0x8d, 0x9f, 0x6c, 0xf4, 0x65, 0x54, 0xbc, 0xed, 0x75, 0x72, 0xda, 0xec, 0x2d, 0x0f, 0x5b, 0x77, 0x47, 0x2c, 0x6b, 0xfe, 0x6b, 0xb2, 0x4a, 0x22, 0x3a, 0xdc, 0x34, 0xf5, 0x1c, 0x1d, 0x24, 0xa0, 0x63, 0x65, 0xb6, 0x68, 0xad, 0xd5, 0x09, 0x3a, 0xd7, 0x9f, 0x2f, 0x8c, 0x3f, 0x63, 0xab, 0x1d, 0x18, 0x68, 0x0f, 0xb3, 0xa2, 0xa8, 0x90, 0x15, 0xb5, 0xe0, 0x3a, 0x2b, 0x6a, 0xa1, 0xe7, 0xcf, 0x8a, 0xe6, 0x38, 0xda, 0xdc, 0xa6, 0x1f, 0x0e, 0x8e, 0x10, 0x14, 0xb2, 0xcb, 0x05, 0x1c, 0x21, 0x7a, 0xfe, 0xa8, 0xcb, 0xe2, 0xf9, 0x38, 0x50, 0xde, 0xf7, 0xfa, 0xf6, 0x28, 0xfe, 0x2d, 0x81, 0x71, 0x32, 0x23, 0x8b, 0x45, 0x7d, 0x4e, 0x66, 0xd3, 0x2b, 0x8d, 0x6c, 0xe1, 0x73, 0xd3, 0xd3, 0xad, 0x4f, 0xcb, 0x8b, 0x3e, 0x9d, 0xb5, 0xd7, 0xd8, 0x29, 0x9e, 0x0e, 0xe3, 0x7d, 0xc6, 0x0e, 0xdb, 0x7b, 0xf1, 0x74, 0xa2, 0xde, 0x41, 0xf9, 0x9b, 0x7d, 0xee, 0x98, 0xda, 0xde, 0xd2, 0x91, 0x39, 0x6d, 0x0c, 0x87, 0xab, 0xe3, 0xc7, 0x44, 0x84, 0xc4, 0x93, 0xf9, 0xfa, 0x53, 0x45, 0xa9, 0x65, 0x85, 0x1a, 0x1a, 0xde, 0x5a, 0x87, 0xfa, 0x8a, 0x10, 0xb6, 0x06, 0x1d, 0x6a, 0x40, 0xc8, 0x1e, 0x10, 0x6a, 0x40, 0xc8, 0x29, 0x21, 0xf4, 0xf5, 0x64, 0x64, 0x5c, 0x86, 0xf1, 0xa3, 0xcc, 0x5f, 0xda, 0x68, 0xbf, 0xd9, 0xda, 0x6a, 0xbf, 0xeb, 0xc0, 0x6c, 0xf3, 0x65, 0x30, 0x60, 0xec, 0x96, 0xaf, 0x1f, 0xc7, 0xa7, 0x47, 0xc6, 0xe5, 0xe7, 0x8b, 0x23, 0xe3, 0xf6, 0xca, 0xba, 0xcd, 0x5b, 0xe3, 0x7a, 0xdb, 0xc4, 0xe2, 0xdb, 0x4c, 0xab, 0x88, 0x53, 0xc5, 0x29, 0xd9, 0x57, 0x9e, 0x66, 0x8a, 0x5e, 0xac, 0xa8, 0xfb, 0x22, 0x6c, 0xee, 0x15, 0x5d, 0x82, 0x2c, 0x76, 0x73, 0xbc, 0xf2, 0xe4, 0xe7, 0x31, 0x05, 0xc6, 0xc5, 0x49, 0xfc, 0xa7, 0x62, 0x69, 0x12, 0xfc, 0x66, 0x22, 0x75, 0x76, 0x69, 0xcf, 0x2b, 0x01, 0xaa, 0xba, 0x77, 0x53, 0x0e, 0x6b, 0x82, 0x36, 0x81, 0xa8, 0xb7, 0xa7, 0xae, 0xb2, 0x36, 0x1d, 0x65, 0x7f, 0x53, 0x80, 0x8b, 0xd7, 0x6e, 0x7b, 0x5b, 0x81, 0x1c, 0x4f, 0x32, 0x68, 0xb0, 0x2f, 0xd0, 0xb0, 0x1e, 0x9f, 0xbd, 0xbf, 0xf9, 0xfc, 0xe9, 0xc2, 0x38, 0x02, 0x37, 0xd0, 0x38, 0x3e, 0xbf, 0x7c, 0x21, 0x4d, 0x7a, 0xe1, 0xc5, 0x00, 0x56, 0x19, 0xa5, 0x58, 0xa7, 0xac, 0x52, 0xd3, 0xdc, 0xf1, 0xd9, 0xcd, 0xe7, 0x2b, 0xe3, 0xe8, 0x16, 0xf4, 0x17, 0x22, 0x41, 0x91, 0x6c, 0xcc, 0xa6, 0x6d, 0xd7, 0xb6, 0x69, 0x99, 0x14, 0xb2, 0x4b, 0xe1, 0xd2, 0x76, 0x56, 0x9b, 0x81, 0x84, 0xcc, 0x43, 0xb3, 0xdf, 0x76, 0x8c, 0x3c, 0xab, 0xe4, 0x0a, 0x61, 0x40, 0x70, 0x37, 0xa6, 0xf3, 0x83, 0xad, 0x6c, 0x6f, 0xda, 0xc7, 0xc5, 0xf7, 0xdb, 0x40, 0xb6, 0x01, 0x68, 0x8d, 0x47, 0x14, 0x86, 0xdf, 0x8d, 0x4b, 0x12, 0x2d, 0xd2, 0xe8, 0xa8, 0xcb, 0xe2, 0xff, 0xc1, 0xc6, 0x47, 0x39, 0x58, 0x60, 0xbf, 0xc1, 0xda, 0x2b, 0xcd, 0x9a, 0x3a, 0x52, 0xb0, 0xbe, 0xcc, 0x13, 0x0e, 0x91, 0x05, 0x99, 0x65, 0x81, 0x77, 0x30, 0xbf, 0x33, 0x8e, 0x43, 0x12, 0xbd, 0x5c, 0x4f, 0x65, 0x5b, 0x7c, 0xda, 0x60, 0x41, 0x59, 0x77, 0x91, 0x6d, 0x5a, 0x2e, 0x73, 0x5e, 0x19, 0x16, 0x27, 0xf1, 0xa3, 0x7e, 0x0f, 0x8d, 0xa3, 0x3f, 0x4d, 0x77, 0xdc, 0xbb, 0x58, 0xda, 0x1c, 0x67, 0xc1, 0x21, 0x42, 0xb6, 0x55, 0xaa, 0xf8, 0x24, 0x5d, 0x48, 0x74, 0x19, 0xa4, 0x5d, 0x47, 0x57, 0x92, 0xd6, 0x72, 0x59, 0xd4, 0xd6, 0x9c, 0x02, 0x86, 0x76, 0x66, 0xf2, 0xdd, 0xf8, 0x9f, 0xf2, 0xc7, 0x3d, 0x8d, 0xe3, 0x58, 0xfd, 0x82, 0xf8, 0x77, 0x74, 0x99, 0x96, 0x33, 0x4f, 0x56, 0x63, 0x45, 0x3b, 0xcf, 0x06, 0x2f, 0xa4, 0x0d, 0x23, 0xad, 0xad, 0x43, 0x41, 0xfb, 0x77, 0xab, 0xe8, 0x92, 0xa0, 0xac, 0xe3, 0x0b, 0xc2, 0xa9, 0x5d, 0x3a, 0x86, 0xb1, 0xd4, 0x61, 0x74, 0x67, 0x7c, 0x45, 0xc6, 0xf5, 0xea, 0x61, 0x3c, 0xa3, 0x2f, 0x73, 0xf0, 0xde, 0x6c, 0x6f, 0xd8, 0xdf, 0xf1, 0xc8, 0xbb, 0x04, 0x13, 0x6e, 0xd7, 0x1f, 0xe7, 0x01, 0x36, 0xcb, 0x9b, 0xfd, 0x24, 0xef, 0x8f, 0x4b, 0xbb, 0xe2, 0x8e, 0xe3, 0x1b, 0xca, 0xb7, 0x60, 0x5d, 0xc3, 0x28, 0xec, 0xe9, 0xea, 0x24, 0x8c, 0xaa, 0x64, 0x9d, 0x84, 0xe5, 0x08, 0xb8, 0x3d, 0x13, 0xa9, 0xb5, 0x7d, 0xa4, 0xc4, 0xfb, 0x48, 0x79, 0xa8, 0xcd, 0x15, 0xe7, 0xec, 0xc8, 0x18, 0x3d, 0x86, 0xd1, 0x32, 0x6d, 0x89, 0x1c, 0x7c, 0x5d, 0x9a, 0x15, 0x00, 0xbc, 0x9c, 0x29, 0x64, 0x05, 0xce, 0xc8, 0xe2, 0x69, 0x74, 0x79, 0xdb, 0x3b, 0xd3, 0x0e, 0x31, 0x9c, 0xa6, 0x73, 0xa8, 0x40, 0x18, 0x44, 0x65, 0x80, 0x18, 0x67, 0xa3, 0xcb, 0x77, 0xf1, 0x5f, 0x82, 0xfe, 0xb6, 0x69, 0x53, 0x76, 0xb3, 0x5d, 0xcf, 0x80, 0x31, 0x84, 0x66, 0x74, 0x12, 0x3e, 0x18, 0x5f, 0x90, 0x0d, 0xd0, 0x65, 0xae, 0x38, 0xa8, 0xf3, 0xfb, 0x6c, 0x09, 0x20, 0x77, 0x4b, 0x15, 0xf2, 0xda, 0x6f, 0xa7, 0x49, 0xcf, 0x14, 0xd0, 0x00, 0xc8, 0x91, 0x03, 0xf4, 0xcd, 0x04, 0x5f, 0x2a, 0xf0, 0x74, 0x72, 0xae, 0xb6, 0x6b, 0xe2, 0xd3, 0xb2, 0x25, 0x35, 0x72, 0x3b, 0x3e, 0x6b, 0xb0, 0xb2, 0xb1, 0x28, 0x77, 0xf0, 0x10, 0xcc, 0xc9, 0x32, 0x8c, 0x8c, 0xb4, 0x95, 0x7f, 0x74, 0x1f, 0x4e, 0xbe, 0x57, 0x8c, 0xae, 0xb7, 0x6e, 0xef, 0x43, 0xeb, 0xf6, 0x3e, 0xab, 0xd0, 0xde, 0x67, 0xf1, 0xf6, 0x3e, 0xb4, 0x43, 0xe9, 0x71, 0xb5, 0xd3, 0xda, 0xd5, 0xb1, 0xa4, 0x98, 0xaf, 0xd2, 0x46, 0xa2, 0xe1, 0xb8, 0x1c, 0x25, 0xb1, 0xa0, 0xbf, 0x9a, 0x64, 0x61, 0xe1, 0x08, 0x36, 0xbb, 0xe1, 0x6c, 0x89, 0x3d, 0x1b, 0x66, 0xb7, 0x0a, 0xb3, 0xec, 0x88, 0x8f, 0xb2, 0xd7, 0x27, 0x79, 0xcc, 0x4d, 0xdd, 0xb0, 0xca, 0xb0, 0xae, 0xcd, 0x86, 0xa5, 0xe8, 0x44, 0x6f, 0x32, 0xac, 0x63, 0xcc, 0x7b, 0xa9, 0x61, 0xb9, 0xa7, 0xfa, 0x7c, 0xf6, 0xe4, 0x07, 0x77, 0x81, 0xf1, 0x95, 0xc4, 0x0f, 0x22, 0x19, 0x14, 0xec, 0x76, 0xa8, 0x1b, 0x36, 0xe7, 0x9a, 0xd7, 0x0d, 0x51, 0x85, 0xbe, 0x32, 0xf6, 0x2d, 0x4e, 0x3b, 0xdb, 0xeb, 0xb1, 0x43, 0xdd, 0xb7, 0x98, 0x01, 0x2b, 0x6b, 0x48, 0xc7, 0x25, 0xd5, 0xd2, 0x00, 0x6f, 0x87, 0xee, 0xba, 0x7d, 0x11, 0x51, 0x2b, 0xb1, 0x51, 0xb6, 0x39, 0x8d, 0x5d, 0xd4, 0xcc, 0xd6, 0x22, 0xa7, 0x70, 0xee, 0x12, 0x60, 0xf2, 0xdb, 0x50, 0x75, 0x35, 0x2d, 0x3f, 0x63, 0xde, 0xfa, 0x88, 0x99, 0x85, 0x23, 0x06, 0xd8, 0x11, 0x73, 0x5b, 0xbb, 0x5e, 0xbb, 0xb3, 0x92, 0x32, 0xe0, 0x8d, 0x84, 0x48, 0xf8, 0x0a, 0x59, 0x15, 0x22, 0x11, 0xef, 0x3c, 0x8c, 0x26, 0xb4, 0x8e, 0xd7, 0xbb, 0x60, 0x4e, 0xc0, 0x5a, 0x56, 0x28, 0x33, 0x27, 0x66, 0xee, 0x6d, 0x6b, 0xbb, 0x58, 0x81, 0xca, 0xd2, 0x02, 0x0e, 0x8a, 0xd9, 0xa0, 0x02, 0x56, 0xeb, 0x11, 0x97, 0xc6, 0x7b, 0xe2, 0x24, 0x53, 0x01, 0x6b, 0x9c, 0x7d, 0xcd, 0xdd, 0x4e, 0x82, 0xd1, 0x28, 0x88, 0xef, 0xc7, 0xe8, 0x67, 0x77, 0x17, 0x1e, 0x78, 0x68, 0x01, 0xad, 0x58, 0x7e, 0xc8, 0xed, 0xae, 0x00, 0xcf, 0x0e, 0x6d, 0xee, 0x5e, 0xd6, 0xf7, 0x2c, 0x37, 0x83, 0x63, 0x2c, 0xcc, 0x95, 0xe5, 0xb0, 0x60, 0x69, 0x06, 0xe7, 0xf0, 0xe9, 0x9d, 0x1a, 0x39, 0x13, 0xd8, 0x79, 0x82, 0x7e, 0x56, 0xf9, 0x8c, 0x11, 0x12, 0x91, 0xe9, 0xb0, 0x21, 0x03, 0xa1, 0x83, 0x53, 0x1d, 0x7e, 0xa2, 0x2c, 0xdb, 0xb2, 0xa5, 0x27, 0xea, 0x06, 0xff, 0xec, 0x71, 0x4a, 0x81, 0xeb, 0x0f, 0x20, 0xa6, 0x14, 0x9e, 0x77, 0x37, 0xc8, 0x80, 0xbf, 0x99, 0xb0, 0xc3, 0x8a, 0xa7, 0x75, 0x38, 0x3a, 0xc4, 0xe7, 0x32, 0x1d, 0x2b, 0xbe, 0x3e, 0x63, 0xc7, 0x06, 0xb6, 0x6f, 0x5b, 0x8e, 0x19, 0x7f, 0xc5, 0x6b, 0x90, 0x92, 0xa2, 0xa7, 0x6a, 0x3a, 0xe5, 0xd0, 0x13, 0x30, 0xba, 0x53, 0xe0, 0xb1, 0xd2, 0x94, 0x27, 0x09, 0x13, 0x40, 0x16, 0x09, 0x32, 0x1f, 0xc3, 0xbb, 0x60, 0x82, 0x86, 0x11, 0x70, 0xd3, 0x74, 0x39, 0x56, 0xae, 0x69, 0x0a, 0x4e, 0x6c, 0x11, 0x90, 0xd2, 0x0c, 0x74, 0x41, 0x9d, 0x7a, 0x95, 0xcf, 0xc3, 0x16, 0x28, 0xcd, 0xcb, 0xaf, 0x21, 0xa2, 0xf3, 0x60, 0xb5, 0x30, 0x2e, 0xc9, 0xaf, 0x69, 0x32, 0x03, 0x7d, 0x11, 0x91, 0xb9, 0x1f, 0x90, 0x85, 0x01, 0x60, 0x6f, 0x8e, 0x1c, 0xbf, 0x65, 0xe0, 0x31, 0x76, 0xcb, 0x9c, 0x02, 0x1c, 0xa3, 0xcf, 0xef, 0x8e, 0xfc, 0x1f, 0x64, 0x5e, 0x7f, 0xcd, 0x28, 0x90, 0xf0, 0x39, 0xf9, 0x35, 0x63, 0x8d, 0x4d, 0x7a, 0xcf, 0x4a, 0x2e, 0x19, 0x76, 0x7d, 0xd6, 0x06, 0xc0, 0xf6, 0x69, 0x1b, 0xb0, 0x36, 0xbb, 0xd6, 0x46, 0x92, 0x82, 0x76, 0x92, 0xc2, 0x76, 0x97, 0x47, 0x95, 0x0e, 0x08, 0x61, 0x1f, 0xc0, 0xad, 0x95, 0x40, 0xdc, 0x94, 0x00, 0xf2, 0x7e, 0x00, 0xe0, 0xb4, 0x04, 0x02, 0x88, 0xaf, 0x7c, 0xb4, 0x7a, 0xa4, 0x51, 0x57, 0x30, 0x6c, 0x77, 0xad, 0xd4, 0xc6, 0xa3, 0x55, 0x36, 0x33, 0xc6, 0x5f, 0xc3, 0xb8, 0x4e, 0x4d, 0x68, 0x65, 0x25, 0x12, 0xb7, 0x5c, 0x59, 0xbb, 0x08, 0x43, 0x7f, 0x4c, 0x97, 0x4b, 0x1a, 0x8d, 0x63, 0x87, 0x34, 0xd4, 0x91, 0x8a, 0xd3, 0xec, 0x3e, 0x06, 0xe5, 0x12, 0xf5, 0xc5, 0xd5, 0xa9, 0xf1, 0x2d, 0x98, 0x1b, 0x70, 0xf0, 0xd7, 0x85, 0x0c, 0xb9, 0x85, 0x05, 0x43, 0x1b, 0x91, 0x1f, 0xc1, 0xc2, 0x28, 0x24, 0xca, 0x8b, 0xd4, 0xc2, 0x7b, 0xbf, 0x0f, 0x1a, 0xba, 0x4c, 0x2e, 0x20, 0x97, 0x2b, 0x09, 0x3e, 0xae, 0x88, 0x7f, 0x58, 0x42, 0xe5, 0xc1, 0x95, 0x2d, 0x7a, 0xc5, 0x88, 0xd2, 0xf9, 0x51, 0x12, 0x60, 0x25, 0x05, 0x9d, 0x58, 0xa7, 0xe7, 0xc1, 0x64, 0xd1, 0x69, 0x93, 0x62, 0xcd, 0x6d, 0xc6, 0xdb, 0x36, 0xb3, 0x6f, 0x2a, 0x33, 0xfb, 0x92, 0x04, 0x5c, 0xe1, 0x32, 0x63, 0x36, 0x23, 0x05, 0xa0, 0x18, 0x86, 0xe6, 0x48, 0x7d, 0x08, 0x9f, 0xd2, 0x07, 0x78, 0xd6, 0xd8, 0xca, 0xd2, 0x4e, 0xd9, 0x6e, 0x4e, 0xc0, 0xd3, 0x44, 0x41, 0x90, 0x5d, 0xf4, 0x6c, 0xc9, 0x45, 0x6f, 0x64, 0xdc, 0x55, 0xae, 0x78, 0xbb, 0xa7, 0x8d, 0xd9, 0x8b, 0x3b, 0x5e, 0xee, 0x5a, 0x91, 0xe8, 0x5a, 0x6f, 0x8c, 0xaf, 0xb7, 0xb0, 0x3f, 0x97, 0x14, 0xb6, 0xeb, 0x83, 0xf8, 0x7e, 0x7a, 0x80, 0xe8, 0x74, 0x4c, 0x59, 0x9a, 0x3f, 0xc3, 0xe3, 0x8f, 0xc0, 0x8f, 0xc2, 0x87, 0x24, 0x2c, 0x8d, 0x06, 0xff, 0x19, 0x47, 0x17, 0x2e, 0x73, 0x30, 0xae, 0x5d, 0xee, 0x13, 0xff, 0x23, 0x58, 0x26, 0xad, 0x4e, 0x49, 0x5b, 0xcf, 0xd5, 0x89, 0x71, 0x34, 0x27, 0xb3, 0xf0, 0x2e, 0x1d, 0xb6, 0xdb, 0xce, 0xdd, 0x30, 0x98, 0xbc, 0xae, 0xfc, 0x4e, 0x1c, 0xd7, 0xe9, 0xf4, 0xe4, 0x78, 0x59, 0x4c, 0x3e, 0x15, 0x33, 0xf6, 0x7f, 0x7c, 0x38, 0xe9, 0x6f, 0x5a, 0x08, 0x65, 0x26, 0x03, 0xda, 0x42, 0x95, 0xe7, 0x8f, 0x0f, 0xa7, 0xb7, 0x2f, 0x35, 0xa9, 0x84, 0xb7, 0x4e, 0x25, 0x5a, 0xdb, 0xa7, 0xa3, 0x4d, 0xdf, 0x9c, 0xb2, 0xaf, 0xe5, 0x38, 0xe5, 0x8f, 0x30, 0x0a, 0x72, 0x64, 0xec, 0xae, 0x3b, 0xfd, 0x90, 0x92, 0x36, 0x38, 0x7d, 0x9f, 0x40, 0x35, 0x2c, 0x2b, 0x3c, 0xb5, 0xbd, 0xde, 0x2a, 0xbb, 0x7e, 0x6a, 0xe3, 0xec, 0xf4, 0xe2, 0xcc, 0x40, 0x2f, 0xd3, 0x64, 0xf5, 0x66, 0x7b, 0x53, 0xf7, 0xa6, 0x03, 0x5b, 0xc7, 0x01, 0x72, 0xb1, 0xc0, 0x39, 0x95, 0x02, 0x94, 0xb7, 0x9e, 0x9f, 0x84, 0x0f, 0xb1, 0x7f, 0xf0, 0x7b, 0x3d, 0xdd, 0xc0, 0xa1, 0xb2, 0xa6, 0x7a, 0x50, 0x19, 0x38, 0xf1, 0x14, 0xfb, 0xcd, 0xa8, 0xb6, 0xed, 0x85, 0x3c, 0xc7, 0x84, 0xb6, 0xc0, 0x04, 0x3f, 0x17, 0x26, 0x2d, 0xd4, 0x66, 0x17, 0x7a, 0xc2, 0xd3, 0x7f, 0x8c, 0xac, 0x50, 0x89, 0xc9, 0xe7, 0x93, 0x9b, 0xa3, 0x9c, 0x73, 0xb6, 0xb7, 0x51, 0x57, 0x6e, 0x89, 0x2c, 0xe1, 0x7a, 0xa7, 0x82, 0xed, 0x19, 0x0e, 0xd7, 0x1e, 0xa7, 0xc2, 0x72, 0xb8, 0xec, 0xbc, 0x67, 0xa7, 0x1e, 0x2e, 0xe5, 0x1c, 0xb1, 0xbb, 0x13, 0x2e, 0x08, 0x00, 0xb6, 0xc5, 0x0c, 0x76, 0x1e, 0xdd, 0x71, 0xcc, 0x90, 0x93, 0x93, 0x8c, 0xcb, 0x30, 0x1b, 0xa5, 0x74, 0x98, 0x9c, 0x69, 0xb1, 0x94, 0x93, 0xb6, 0x77, 0xc2, 0x66, 0x4c, 0x60, 0x93, 0x55, 0xb2, 0xf4, 0x28, 0x42, 0x44, 0xdd, 0x70, 0x6b, 0xad, 0x72, 0x26, 0xe7, 0x43, 0x2c, 0x67, 0x6c, 0x96, 0xff, 0x19, 0x1f, 0xa7, 0x7f, 0xbd, 0xca, 0xe1, 0xb2, 0x1c, 0x0d, 0xa7, 0x15, 0x1a, 0xf8, 0x5f, 0x2f, 0x16, 0xeb, 0xb4, 0x8d, 0x6c, 0x36, 0x41, 0x23, 0xaf, 0xc7, 0x54, 0xd1, 0xc8, 0xe8, 0x60, 0x9f, 0x33, 0x72, 0xe9, 0x96, 0xf9, 0xd5, 0x07, 0xac, 0x45, 0x7a, 0x9a, 0x35, 0x6d, 0xa2, 0xec, 0x2e, 0x57, 0x91, 0xf0, 0xeb, 0xed, 0xdb, 0x37, 0x99, 0x51, 0x4a, 0x9f, 0xfb, 0x4d, 0x66, 0x97, 0x52, 0xe1, 0xde, 0xe5, 0x3f, 0x77, 0xb3, 0xef, 0x9f, 0x32, 0x89, 0xaa, 0xb6, 0xb3, 0xde, 0x18, 0x6e, 0x2a, 0xa3, 0xae, 0x25, 0xc3, 0xbe, 0xec, 0x2d, 0x5e, 0xd0, 0x07, 0x23, 0x49, 0x84, 0xf7, 0xd9, 0x3f, 0xe6, 0x5a, 0x00, 0x64, 0x5a, 0x90, 0xa0, 0x73, 0x76, 0x6b, 0xdc, 0xac, 0xa2, 0x71, 0xed, 0xd6, 0x98, 0x9e, 0xc4, 0x5c, 0x88, 0x2d, 0x2c, 0x2a, 0xab, 0xd1, 0xd5, 0x89, 0x71, 0x36, 0xbf, 0x0b, 0xe6, 0x34, 0xf5, 0x85, 0x9d, 0x56, 0x20, 0xf3, 0x37, 0xd9, 0xf8, 0x68, 0x1e, 0x94, 0x69, 0xf8, 0x55, 0xf8, 0xfd, 0x3b, 0x9d, 0x1b, 0x37, 0xe1, 0x2a, 0x9a, 0x93, 0x07, 0x3a, 0x5f, 0x1a, 0xa7, 0xb7, 0xf5, 0x75, 0x9f, 0x8e, 0x06, 0x5e, 0x3a, 0xb5, 0x54, 0x5c, 0x46, 0x42, 0x64, 0x32, 0x5e, 0x53, 0x32, 0x33, 0x18, 0x4d, 0x37, 0x13, 0xad, 0xa7, 0xcd, 0xc5, 0xb9, 0xcf, 0x02, 0x1a, 0x38, 0x19, 0xc3, 0xad, 0x20, 0x99, 0x66, 0xde, 0x0b, 0xa4, 0x76, 0x7d, 0x70, 0x6c, 0x9d, 0x83, 0x63, 0xe0, 0x21, 0x69, 0x65, 0xda, 0xe3, 0x3d, 0x46, 0x6a, 0xaf, 0x8e, 0x0e, 0xb0, 0x25, 0x09, 0xee, 0x0a, 0x52, 0x67, 0xb7, 0xa3, 0xb3, 0x5d, 0xdf, 0xa4, 0x77, 0x1d, 0x3c, 0xba, 0x8c, 0x7d, 0x14, 0x58, 0x45, 0x49, 0x47, 0x3f, 0x83, 0xe5, 0xe4, 0xde, 0x18, 0x3d, 0xce, 0x82, 0xa5, 0x51, 0x68, 0xa7, 0xe8, 0x75, 0x80, 0x64, 0xcb, 0xf2, 0x9b, 0x8f, 0x31, 0x38, 0x78, 0x48, 0x43, 0x65, 0x00, 0xd9, 0x35, 0x00, 0x0d, 0x06, 0xd8, 0x34, 0xa9, 0x4a, 0x83, 0xd2, 0xd8, 0xfa, 0x75, 0x19, 0xde, 0x0d, 0x5d, 0x94, 0x63, 0x96, 0xbb, 0x65, 0x39, 0x42, 0x43, 0x56, 0x3c, 0x69, 0x0f, 0x55, 0xa8, 0xcf, 0xa8, 0x3b, 0xcd, 0x41, 0x07, 0x63, 0x7c, 0xac, 0x32, 0x38, 0x53, 0x5b, 0x98, 0x57, 0xce, 0xc1, 0xc9, 0x7c, 0x59, 0xe2, 0xb0, 0x6b, 0xfa, 0x5a, 0x5e, 0x8f, 0xb5, 0x6e, 0xd2, 0x26, 0x84, 0x41, 0x16, 0x31, 0x5b, 0x53, 0xa7, 0x5c, 0x63, 0x59, 0x05, 0x1f, 0x02, 0x22, 0x23, 0x77, 0x2a, 0x4e, 0x36, 0x33, 0x35, 0x6b, 0xc9, 0x1e, 0xd0, 0xc6, 0x1c, 0xab, 0x69, 0xfb, 0xad, 0x0d, 0x57, 0xd3, 0x41, 0x0c, 0x33, 0xcb, 0x3b, 0x86, 0x82, 0x8e, 0x3c, 0x3d, 0xd2, 0xe8, 0x7b, 0x30, 0x8f, 0x05, 0x7c, 0x08, 0xa2, 0x38, 0xba, 0xfb, 0x64, 0x97, 0x98, 0xe9, 0xde, 0xb0, 0x4f, 0x4e, 0xde, 0xc3, 0x1b, 0xf6, 0xd9, 0x89, 0x6c, 0xef, 0xf8, 0xcf, 0x5d, 0xf6, 0xed, 0x53, 0x2a, 0xe9, 0xba, 0x52, 0xd0, 0x65, 0xc2, 0x41, 0xaf, 0x67, 0xbf, 0x39, 0x9b, 0xc2, 0x51, 0x98, 0x4e, 0x33, 0xfa, 0x88, 0xb5, 0x19, 0xe1, 0x28, 0x24, 0xd2, 0x2b, 0x5f, 0xf5, 0x33, 0xb3, 0x85, 0xa8, 0x34, 0xbc, 0x51, 0x3c, 0xd7, 0x65, 0xd1, 0x7b, 0x45, 0xbc, 0x5b, 0xaf, 0xbf, 0x54, 0x3a, 0x53, 0x36, 0xd8, 0xef, 0xfa, 0x8c, 0xbc, 0xab, 0x84, 0xce, 0xad, 0x71, 0x32, 0x5b, 0xc5, 0x56, 0xb2, 0xd7, 0x3c, 0xcc, 0x2e, 0xcb, 0x0e, 0xdb, 0xa6, 0x40, 0xa6, 0x13, 0x1c, 0xaf, 0xa6, 0x53, 0x32, 0x0b, 0x8d, 0xd1, 0xa7, 0xb3, 0x51, 0xdd, 0xb4, 0xca, 0xee, 0x16, 0x8d, 0x37, 0x2d, 0x04, 0xb0, 0x3d, 0x1b, 0x3b, 0xd0, 0x9e, 0x26, 0x5f, 0x11, 0xb1, 0x51, 0xfc, 0x1d, 0xcd, 0x9e, 0xdd, 0x8f, 0xc2, 0xc0, 0x9f, 0xbc, 0x8e, 0xd5, 0xa4, 0x9b, 0x5e, 0x50, 0xc6, 0x96, 0xe9, 0xb0, 0x4b, 0x6e, 0xb9, 0x09, 0xf8, 0xfd, 0xc3, 0x23, 0x99, 0x2c, 0x77, 0xc3, 0x90, 0xf4, 0x82, 0x9d, 0xe2, 0x4d, 0xf4, 0x49, 0x3e, 0x1b, 0xa2, 0xe0, 0xfb, 0x7c, 0xf9, 0xcf, 0xdf, 0xbe, 0x4f, 0x08, 0x84, 0x4e, 0xbe, 0x98, 0x15, 0xcd, 0xc6, 0x6d, 0x34, 0x9b, 0x3d, 0x8a, 0xa5, 0x53, 0xa6, 0xe6, 0x0c, 0xa8, 0xa6, 0xd8, 0xf1, 0xf1, 0x7e, 0x1e, 0x7b, 0xa1, 0xa3, 0xc9, 0xd2, 0x38, 0xfa, 0x15, 0x2c, 0xae, 0x0a, 0xe3, 0xa4, 0xa8, 0x23, 0x7a, 0x84, 0x67, 0xe2, 0xf6, 0x52, 0x8e, 0x3a, 0x34, 0xbd, 0x24, 0x3a, 0xe5, 0xe4, 0x67, 0x42, 0x2e, 0xaa, 0xf7, 0xc8, 0x4c, 0x7d, 0xae, 0x2d, 0x48, 0x81, 0xcc, 0x45, 0xc8, 0x70, 0x41, 0x09, 0x2e, 0xb8, 0x9e, 0x39, 0xd2, 0x69, 0x16, 0x09, 0x56, 0x26, 0x59, 0x5a, 0x3c, 0x26, 0x24, 0xd0, 0x96, 0x3f, 0xe6, 0x1f, 0xe4, 0xe1, 0x81, 0x46, 0x7f, 0xd0, 0xf8, 0x96, 0x72, 0x7e, 0x5b, 0x78, 0xdc, 0x1d, 0xf0, 0x7f, 0xc0, 0x2d, 0xe9, 0x3f, 0xac, 0xf6, 0xec, 0x1f, 0x4a, 0x7c, 0x14, 0x0b, 0xa3, 0x73, 0xf6, 0x8f, 0xf7, 0x8f, 0xf4, 0x8e, 0x18, 0x57, 0x17, 0x86, 0x17, 0xfb, 0xb5, 0x0e, 0x43, 0x12, 0xfb, 0xf0, 0xb8, 0x63, 0x78, 0x2f, 0xba, 0x63, 0x99, 0xe5, 0x06, 0xfd, 0x02, 0x46, 0x9e, 0xd7, 0x9f, 0x29, 0x16, 0x51, 0x75, 0x90, 0x42, 0x75, 0x38, 0x2a, 0x3d, 0x23, 0xd4, 0x11, 0x8f, 0x54, 0xce, 0x51, 0x96, 0xe3, 0x02, 0x80, 0xdb, 0x43, 0x0a, 0x26, 0x64, 0xe6, 0x0d, 0x4f, 0xa0, 0x14, 0x65, 0x7c, 0xa0, 0x8b, 0x85, 0x71, 0x43, 0x27, 0xf7, 0x46, 0x4a, 0x62, 0xcc, 0xc6, 0x79, 0xd6, 0x64, 0xcf, 0xbd, 0x0a, 0x0b, 0x39, 0x4a, 0xe6, 0x58, 0x89, 0xd2, 0xc5, 0xc5, 0x59, 0x7c, 0xb4, 0x92, 0xae, 0x90, 0x6b, 0x3a, 0x09, 0x83, 0xd9, 0xc1, 0x5a, 0x1e, 0xb4, 0x29, 0xb7, 0x24, 0xc9, 0xca, 0xea, 0x50, 0xa4, 0x75, 0xc8, 0x31, 0x9a, 0x87, 0xb1, 0x0a, 0x3d, 0xed, 0x70, 0x48, 0xb7, 0xcb, 0x9e, 0xff, 0x4d, 0x61, 0xe0, 0x64, 0x88, 0xa6, 0x2d, 0x64, 0xd4, 0x3e, 0x84, 0x4f, 0xef, 0x62, 0xd1, 0x8d, 0x7f, 0x7e, 0xfc, 0xd7, 0xd6, 0x8d, 0x75, 0x8d, 0xc9, 0x68, 0xd5, 0x95, 0xd9, 0xd5, 0x19, 0x97, 0x3d, 0x64, 0x11, 0xc4, 0xb7, 0xe0, 0xa8, 0x44, 0xb8, 0xee, 0x40, 0x04, 0xd8, 0xd0, 0xe2, 0xad, 0x4e, 0x45, 0xb6, 0x79, 0x0b, 0x07, 0x28, 0x02, 0x37, 0x09, 0x3e, 0x9b, 0x46, 0x47, 0x93, 0xf2, 0x15, 0x36, 0x16, 0x21, 0x29, 0x40, 0x1c, 0xcd, 0x1e, 0xef, 0x89, 0x21, 0x67, 0x22, 0x7e, 0xed, 0x99, 0x17, 0xce, 0x71, 0x0e, 0xc5, 0x1e, 0xd5, 0x0f, 0xff, 0x1e, 0x75, 0xbf, 0x22, 0x00, 0x1e, 0x2a, 0x05, 0xbc, 0x4b, 0xea, 0xe1, 0x01, 0xdb, 0xdd, 0x0b, 0x37, 0x5c, 0xd7, 0xd5, 0x79, 0xf8, 0x6a, 0xea, 0x13, 0xb2, 0xad, 0x59, 0x68, 0x13, 0x38, 0x06, 0x1e, 0xb6, 0x1c, 0x22, 0xc6, 0xeb, 0xe2, 0x83, 0x09, 0x29, 0x45, 0xf8, 0x09, 0x44, 0xcb, 0x24, 0x44, 0x3b, 0xb9, 0x0f, 0x66, 0xb3, 0xc5, 0x32, 0xa2, 0xe4, 0xa1, 0x77, 0xe6, 0x86, 0xa3, 0x03, 0xbc, 0x8c, 0x38, 0x33, 0x37, 0xc5, 0x6b, 0x74, 0xc2, 0xc8, 0x9f, 0x25, 0xa1, 0x5a, 0x16, 0xe3, 0x27, 0xbd, 0x4d, 0xb0, 0xbf, 0x30, 0xd9, 0x2a, 0x98, 0xb2, 0xdb, 0x50, 0x4a, 0x23, 0x3f, 0xa0, 0x03, 0x06, 0x74, 0x24, 0xe8, 0xf8, 0x0c, 0x1d, 0x8c, 0x05, 0x03, 0x74, 0x8e, 0x80, 0xd9, 0x7b, 0xfb, 0x0c, 0x28, 0x83, 0x87, 0xcd, 0x2e, 0x14, 0xe0, 0xb1, 0x06, 0x78, 0x72, 0x78, 0xa0, 0x39, 0xc0, 0x53, 0xe7, 0xbf, 0x2a, 0xa6, 0xe7, 0xdc, 0x01, 0x66, 0x7f, 0x6d, 0xce, 0x94, 0xf3, 0x61, 0xb3, 0xdd, 0x04, 0x15, 0x58, 0xfa, 0xad, 0x35, 0xae, 0xca, 0x9d, 0x0f, 0xc1, 0x4e, 0x72, 0x96, 0x54, 0xe8, 0x7c, 0x0b, 0xe6, 0x77, 0x97, 0x64, 0x2e, 0x89, 0x0d, 0x25, 0x5b, 0x15, 0x37, 0x53, 0x29, 0xab, 0xbe, 0x04, 0xe9, 0xb5, 0x5f, 0x5e, 0xc7, 0xf5, 0x48, 0xae, 0x37, 0xae, 0x56, 0x71, 0x89, 0x73, 0x44, 0x92, 0x26, 0x64, 0xd4, 0x80, 0x74, 0x42, 0x38, 0xd8, 0xa6, 0x14, 0x2b, 0xe6, 0x32, 0xa1, 0x14, 0x06, 0x8d, 0x5a, 0x09, 0x72, 0xb3, 0xa6, 0x10, 0xdb, 0xb6, 0x32, 0x57, 0xc4, 0x27, 0x20, 0x2e, 0xe3, 0x63, 0x72, 0x42, 0x96, 0x7f, 0x19, 0x27, 0x37, 0xd7, 0x1f, 0xaf, 0x7b, 0xdc, 0xd7, 0xcf, 0x11, 0x72, 0x2d, 0x54, 0xd6, 0x8f, 0x1c, 0xa1, 0x74, 0x90, 0x9a, 0x71, 0x84, 0x3d, 0xcb, 0x0c, 0x99, 0xd5, 0xb0, 0x08, 0xa7, 0xe5, 0x0c, 0x19, 0x97, 0xd0, 0x62, 0x1b, 0xe6, 0x72, 0x7f, 0x5b, 0x91, 0x30, 0xed, 0x1f, 0xee, 0xf7, 0x98, 0xc7, 0x1a, 0x2c, 0x57, 0x0f, 0xac, 0x3e, 0x8f, 0x7c, 0xf0, 0xd1, 0x73, 0x48, 0xa7, 0x8c, 0xff, 0x87, 0x11, 0x00, 0x55, 0xc1, 0x1a, 0x9d, 0xff, 0xba, 0xd9, 0x71, 0xec, 0xb2, 0x29, 0xc9, 0x08, 0xd4, 0xb5, 0x10, 0x26, 0xc2, 0x35, 0x2a, 0x91, 0x51, 0x2d, 0xbc, 0x7a, 0x22, 0xac, 0x35, 0x1a, 0xae, 0x0e, 0x1a, 0xaf, 0x9c, 0x02, 0x2b, 0x47, 0x03, 0x23, 0xd4, 0x88, 0xc6, 0xcd, 0x99, 0x31, 0x1a, 0xcc, 0x2b, 0xc3, 0xcb, 0xd5, 0xc6, 0xab, 0xcf, 0x16, 0x96, 0xe3, 0x05, 0xd8, 0xaa, 0xf2, 0x6a, 0x74, 0x52, 0x64, 0x82, 0x7e, 0xfd, 0x56, 0x07, 0xbd, 0x38, 0x0e, 0xd9, 0xbb, 0x26, 0xe6, 0x1e, 0x81, 0x02, 0x6c, 0xcc, 0x87, 0x9c, 0x04, 0xf7, 0xcb, 0xa9, 0xd0, 0x86, 0xa2, 0x52, 0x51, 0x85, 0x32, 0xb4, 0xbc, 0x8d, 0xd0, 0xda, 0xdd, 0xe4, 0xfb, 0x0e, 0x14, 0x08, 0x6a, 0xc6, 0x6f, 0xc0, 0x56, 0xc5, 0x6f, 0x83, 0x02, 0xa9, 0xbb, 0xf8, 0xcd, 0xb5, 0x0d, 0x9a, 0x2f, 0x49, 0x5a, 0x2f, 0x59, 0x24, 0xfd, 0x0f, 0xc6, 0xe1, 0x6e, 0x3c, 0xda, 0x74, 0x67, 0x68, 0xbe, 0xb1, 0x20, 0x8b, 0x82, 0x8a, 0xe6, 0xf9, 0x69, 0x3a, 0x23, 0x8b, 0xfb, 0xfa, 0x39, 0xcb, 0x2a, 0x48, 0x6e, 0x01, 0x24, 0x58, 0x04, 0x09, 0xe4, 0x20, 0x35, 0x34, 0xbc, 0xeb, 0xb7, 0xaa, 0x26, 0x72, 0xff, 0xdd, 0x76, 0xe8, 0x52, 0xd8, 0xd3, 0x82, 0x11, 0x70, 0xe5, 0x82, 0xcb, 0x16, 0xe7, 0x6e, 0x3e, 0x3f, 0xb9, 0xdb, 0x11, 0x53, 0xa8, 0x2b, 0x2d, 0x6e, 0x94, 0x56, 0x3a, 0x40, 0xb6, 0x57, 0xf3, 0xb4, 0x50, 0xb3, 0xab, 0xc7, 0x41, 0x42, 0xdb, 0x4a, 0x2e, 0xec, 0x25, 0xb9, 0x0b, 0x26, 0xc6, 0xa7, 0x51, 0x8f, 0x9a, 0x57, 0xf2, 0xbd, 0x44, 0x90, 0x69, 0x40, 0x33, 0x28, 0xfd, 0xbb, 0xe4, 0xf8, 0x36, 0x9f, 0xad, 0x24, 0xce, 0xae, 0x41, 0x3a, 0xd0, 0x56, 0xb9, 0xa9, 0x48, 0x81, 0x21, 0x40, 0x33, 0xea, 0x35, 0x19, 0x4f, 0xee, 0x4e, 0x4d, 0x95, 0x3b, 0x1d, 0x91, 0xe5, 0x2a, 0x9a, 0xab, 0x97, 0xb1, 0x6f, 0xa6, 0x3e, 0x96, 0x58, 0xa8, 0x68, 0xc8, 0x43, 0x4b, 0xda, 0xa9, 0x6b, 0x2a, 0x31, 0xd0, 0x32, 0x53, 0xeb, 0x41, 0xdd, 0x5c, 0x2c, 0x41, 0xaa, 0x6f, 0x41, 0x60, 0x9c, 0xc4, 0xdf, 0x2d, 0x62, 0x0d, 0xa8, 0xba, 0xcb, 0x6e, 0x03, 0x70, 0xd2, 0x3a, 0x00, 0x27, 0xd6, 0x66, 0xad, 0x91, 0xb0, 0xd9, 0x9c, 0x9a, 0x48, 0x65, 0x4e, 0x13, 0x48, 0x4e, 0xc3, 0xd9, 0xe3, 0x7d, 0x30, 0x3f, 0x26, 0xd1, 0xf6, 0xd3, 0x1a, 0x1c, 0x0d, 0xf0, 0x52, 0x97, 0x7c, 0xa0, 0x81, 0x86, 0x59, 0x87, 0xc6, 0x97, 0x34, 0xf1, 0xae, 0x13, 0x44, 0xbe, 0xea, 0x29, 0x6f, 0x28, 0x4c, 0x79, 0x5f, 0x26, 0xb3, 0x4f, 0xdf, 0xc2, 0x68, 0xe6, 0x67, 0x0b, 0x7d, 0x0d, 0x24, 0x9b, 0xce, 0xe8, 0xcb, 0x94, 0x8f, 0xc3, 0xb7, 0x26, 0xda, 0xc2, 0xc4, 0xf5, 0x65, 0x30, 0x89, 0x62, 0x58, 0xe8, 0xf7, 0x52, 0xc2, 0x48, 0xe8, 0xcc, 0xae, 0xbd, 0x58, 0xe0, 0xf6, 0x65, 0x6c, 0xab, 0x55, 0xbf, 0xb4, 0x45, 0xb3, 0x5b, 0x38, 0x74, 0xc5, 0x7b, 0x66, 0xf2, 0xec, 0x8b, 0x70, 0xba, 0xcc, 0x7a, 0xf3, 0x46, 0xf1, 0xef, 0xff, 0x4e, 0xf3, 0x89, 0x5a, 0x28, 0x4e, 0xb1, 0x77, 0x52, 0xac, 0x76, 0xd5, 0x97, 0x26, 0x33, 0x7f, 0x37, 0xe0, 0xef, 0xd2, 0x38, 0x3c, 0xd0, 0x14, 0x90, 0xf5, 0x41, 0xcb, 0x04, 0x1c, 0xc5, 0x56, 0xea, 0x5b, 0xc0, 0xf7, 0xb0, 0x94, 0x82, 0x00, 0x6f, 0x5b, 0xf9, 0x54, 0x7b, 0x76, 0xb4, 0xda, 0x09, 0xf2, 0x67, 0x77, 0x34, 0x9e, 0xbd, 0x79, 0xbb, 0x54, 0x7b, 0x0e, 0x0d, 0xbb, 0xc1, 0x47, 0x5b, 0x5b, 0xf9, 0xe8, 0x5c, 0xf7, 0xb4, 0xc4, 0xbb, 0x9a, 0xad, 0xee, 0x0c, 0x32, 0xf7, 0xd3, 0xcd, 0xd8, 0xd5, 0x20, 0x44, 0x57, 0xb8, 0xc2, 0xd1, 0x92, 0x4c, 0xa0, 0x37, 0x05, 0x4b, 0xfc, 0x91, 0x5d, 0xcb, 0x84, 0x8a, 0x47, 0x4e, 0xb2, 0x58, 0xdb, 0x07, 0x93, 0xb2, 0x58, 0x49, 0xca, 0x1f, 0xa0, 0x13, 0x43, 0xc2, 0x3a, 0xfe, 0x00, 0x8d, 0x10, 0x52, 0xf7, 0x45, 0xba, 0x74, 0x4d, 0xf4, 0x22, 0x41, 0x45, 0xba, 0x27, 0xa3, 0x88, 0x0c, 0x50, 0x25, 0x62, 0x5c, 0x65, 0x22, 0x66, 0xdf, 0xa3, 0xeb, 0x0a, 0x34, 0x58, 0xaa, 0x30, 0x8d, 0xd0, 0xbc, 0xe6, 0x1b, 0x88, 0x88, 0x91, 0x65, 0xc3, 0x01, 0xa3, 0x06, 0x8c, 0x6c, 0x08, 0xd1, 0x80, 0x91, 0x1c, 0xa3, 0x38, 0x5c, 0x1d, 0xb3, 0xa9, 0x6b, 0x4b, 0x86, 0x51, 0x9f, 0x99, 0x2f, 0x39, 0x46, 0x3e, 0xc8, 0x4d, 0x35, 0x18, 0x30, 0x6a, 0xc0, 0x08, 0xb1, 0xa1, 0xb9, 0x01, 0xa3, 0x7c, 0xeb, 0x6d, 0xe5, 0xac, 0x79, 0xc3, 0x59, 0x53, 0xea, 0x91, 0xdf, 0xa8, 0x47, 0x06, 0x34, 0x81, 0xd5, 0x7b, 0xa0, 0x28, 0x6a, 0x06, 0xea, 0x6c, 0x16, 0x2c, 0x07, 0x95, 0x4a, 0x9d, 0x5b, 0xd6, 0x19, 0x87, 0x6b, 0x91, 0xea, 0xe3, 0x1a, 0x1e, 0x4b, 0xc0, 0xca, 0x62, 0x58, 0xa1, 0x2c, 0x25, 0xdc, 0x06, 0x2b, 0xe0, 0x3c, 0x0b, 0x5b, 0xa7, 0xbd, 0x0f, 0xbb, 0x88, 0xf3, 0x53, 0x48, 0xd8, 0x29, 0xac, 0xd1, 0xad, 0xd1, 0x10, 0x88, 0x7b, 0x19, 0x4a, 0x50, 0x11, 0x40, 0x25, 0x7d, 0xc8, 0x3f, 0x60, 0xcf, 0x12, 0x01, 0x95, 0xaf, 0x30, 0x4f, 0x04, 0x44, 0x61, 0x38, 0x95, 0xd0, 0xbb, 0xca, 0x5e, 0xbe, 0x1e, 0x2f, 0xb3, 0x16, 0x8b, 0x2b, 0xf6, 0xf1, 0x14, 0x23, 0xcb, 0xb2, 0x30, 0xb6, 0xa0, 0x8f, 0x4c, 0x64, 0x21, 0x64, 0xb9, 0xc9, 0x03, 0x85, 0x93, 0x55, 0x7c, 0xe2, 0x4d, 0x0b, 0xdd, 0xf6, 0x67, 0x1d, 0x3b, 0x03, 0x85, 0xb2, 0x83, 0x6d, 0x53, 0x81, 0xeb, 0xad, 0x00, 0x8a, 0x71, 0x69, 0xf5, 0x92, 0xee, 0xad, 0xaa, 0x2f, 0x66, 0x59, 0x5f, 0xf0, 0x6d, 0x9f, 0xd8, 0xde, 0xac, 0x72, 0x93, 0x01, 0xb5, 0x5c, 0xaf, 0x9c, 0xe0, 0x0b, 0xef, 0x88, 0xc4, 0x6d, 0x7a, 0x1d, 0x9e, 0x20, 0xa7, 0x35, 0x1e, 0xe5, 0x03, 0xe4, 0xb6, 0x81, 0xc3, 0xd6, 0x39, 0x3f, 0x1c, 0x0d, 0xe2, 0x9b, 0x7e, 0x15, 0x8d, 0x72, 0x2f, 0x41, 0x1f, 0x70, 0x70, 0x80, 0x0d, 0xa5, 0x38, 0xf4, 0x47, 0x33, 0x98, 0xbf, 0x9b, 0xd8, 0x30, 0xab, 0x68, 0x8c, 0xb3, 0x73, 0xb2, 0x2e, 0x2a, 0x7f, 0xbe, 0x38, 0x32, 0x6e, 0xaf, 0xac, 0xa3, 0xa4, 0x8c, 0xb1, 0xe8, 0x27, 0x29, 0xbc, 0x25, 0x60, 0x44, 0x5c, 0xaf, 0x5c, 0x42, 0xd9, 0x11, 0x46, 0xf0, 0x70, 0x31, 0x02, 0x2a, 0x8c, 0x6e, 0x7b, 0xac, 0x47, 0x42, 0x87, 0x8f, 0x6d, 0xf3, 0x85, 0xdc, 0x1c, 0xa3, 0x2b, 0xd7, 0xb5, 0x6d, 0x63, 0xb4, 0x7a, 0xa4, 0x51, 0x56, 0xbc, 0x3e, 0xce, 0x2a, 0x72, 0xb0, 0xd3, 0xca, 0x6e, 0x4d, 0x90, 0x87, 0x5b, 0xe3, 0x03, 0x2a, 0xc5, 0xc8, 0x1a, 0x7c, 0xdc, 0x36, 0x85, 0x7d, 0x5e, 0x30, 0x00, 0x9c, 0xf9, 0xeb, 0x72, 0xf4, 0xde, 0xb8, 0x38, 0x81, 0xa6, 0xf1, 0xb5, 0xe6, 0x76, 0x92, 0xb5, 0xc7, 0xb2, 0xae, 0x59, 0x5c, 0xe8, 0x9a, 0xb5, 0xd6, 0x5d, 0xb3, 0x87, 0xca, 0xed, 0x10, 0x0b, 0xc4, 0x32, 0x96, 0x76, 0x46, 0xb7, 0xc3, 0xf4, 0xe6, 0x13, 0x49, 0x96, 0x3a, 0x1c, 0x2d, 0x9e, 0x1e, 0x1e, 0x68, 0xfc, 0x79, 0x13, 0xe3, 0x5b, 0x10, 0xd1, 0x94, 0xbd, 0xe0, 0x6a, 0x84, 0x87, 0x99, 0x84, 0x02, 0x72, 0x20, 0x9b, 0x4d, 0xc8, 0xfb, 0x5c, 0x32, 0xe4, 0x2e, 0x4e, 0x8c, 0xf8, 0xaf, 0xcf, 0x46, 0x3d, 0xde, 0x04, 0xc5, 0xe7, 0xfa, 0x4d, 0x87, 0xe9, 0x16, 0x14, 0x10, 0x7a, 0x17, 0xff, 0xb1, 0xf7, 0x5b, 0xd7, 0x4c, 0x4f, 0xe8, 0x93, 0xfa, 0x44, 0x96, 0x74, 0x62, 0x5c, 0xd0, 0x39, 0x5d, 0x04, 0xf1, 0x69, 0xc3, 0x7d, 0x5e, 0x98, 0x8a, 0xa7, 0x60, 0xca, 0xb2, 0x6f, 0xe5, 0x49, 0x80, 0x4f, 0x34, 0xbc, 0xa0, 0xe1, 0xfe, 0xcf, 0x7c, 0xb7, 0x11, 0xd6, 0x83, 0x19, 0xd1, 0x2b, 0x76, 0x30, 0x2d, 0xf9, 0x70, 0x26, 0xec, 0x2d, 0x5f, 0x0e, 0x3b, 0xe2, 0xcd, 0x73, 0xdb, 0x19, 0x96, 0x4d, 0xda, 0x65, 0xb1, 0x25, 0xcc, 0x9f, 0x7c, 0xa2, 0xbf, 0x82, 0xd9, 0xea, 0x97, 0xd6, 0x5a, 0xb7, 0x03, 0x9c, 0xbb, 0x01, 0x5c, 0xf5, 0x00, 0xb5, 0xca, 0x72, 0x9f, 0xdd, 0xde, 0xc8, 0x16, 0x36, 0xc1, 0x8e, 0x9a, 0xcd, 0x70, 0x93, 0x6e, 0xd9, 0x7a, 0x9d, 0x8d, 0x76, 0x99, 0x07, 0x19, 0x39, 0x00, 0x95, 0x78, 0x3d, 0x3f, 0x05, 0xf3, 0x25, 0x9d, 0xfb, 0xa1, 0x81, 0x4e, 0x6b, 0x7c, 0x55, 0x72, 0xb6, 0xf3, 0x08, 0x08, 0xca, 0xe6, 0x86, 0xcc, 0x4d, 0x92, 0x97, 0xdb, 0x36, 0x71, 0x7b, 0xe3, 0xac, 0x53, 0xd3, 0x5d, 0x27, 0x58, 0x61, 0x59, 0x2a, 0xde, 0xd3, 0x2e, 0x19, 0x8a, 0xc2, 0x22, 0xe7, 0x92, 0x4e, 0x98, 0xa7, 0xdb, 0xd1, 0x88, 0xf2, 0x03, 0x6f, 0x35, 0xf3, 0x6b, 0x23, 0x27, 0x77, 0x0a, 0xc0, 0x76, 0x8b, 0x8f, 0xaf, 0x18, 0xea, 0x32, 0xcb, 0x4b, 0x12, 0xed, 0xfc, 0xb1, 0x0b, 0x4f, 0xcd, 0x1f, 0x5a, 0xc8, 0x0b, 0x48, 0xde, 0xcb, 0xdf, 0xa2, 0x14, 0x9e, 0x4e, 0x39, 0xe5, 0xef, 0x52, 0x00, 0x0e, 0x74, 0xe7, 0xd7, 0x6c, 0xd1, 0x7e, 0xd4, 0x88, 0xaa, 0x36, 0x20, 0x6d, 0xe7, 0xd8, 0x36, 0x6b, 0x1d, 0xce, 0x8d, 0x47, 0x61, 0x46, 0xf1, 0x6f, 0x3d, 0xf3, 0xc1, 0x8e, 0x1d, 0xa6, 0xb6, 0x67, 0x53, 0x07, 0xdb, 0x96, 0x4d, 0x6d, 0x6c, 0x4f, 0xa1, 0x69, 0x21, 0xc7, 0x29, 0x8a, 0xcd, 0xd6, 0x87, 0x9e, 0x84, 0x0f, 0xe3, 0x60, 0x4e, 0x7d, 0x83, 0xf1, 0x92, 0x2f, 0xd4, 0xb9, 0xa2, 0x4c, 0x60, 0x26, 0xbb, 0x5d, 0x90, 0xdd, 0xe1, 0xb2, 0x63, 0xe5, 0xac, 0x41, 0xa9, 0x62, 0x22, 0x62, 0x24, 0x63, 0xc7, 0x7a, 0x08, 0x16, 0x13, 0x20, 0xb1, 0x46, 0x42, 0x1b, 0x39, 0x12, 0xb0, 0x73, 0x6b, 0x6f, 0xb4, 0x66, 0xed, 0xd9, 0xb6, 0x15, 0xfc, 0xf9, 0x15, 0x8b, 0x35, 0x40, 0xd7, 0x04, 0x9d, 0x3b, 0x40, 0xa7, 0x0b, 0x1d, 0x2f, 0x79, 0x4c, 0xe2, 0x03, 0x1b, 0x5f, 0x5b, 0x2c, 0x33, 0x59, 0x77, 0x08, 0x4d, 0xcc, 0x56, 0x1d, 0x4a, 0xa0, 0xdb, 0xc3, 0x5d, 0xbf, 0x0c, 0x37, 0x0e, 0xcc, 0x33, 0x56, 0xd1, 0xaa, 0xdb, 0x2e, 0x5c, 0xb9, 0xca, 0x7d, 0x8c, 0x9f, 0x95, 0xab, 0x5b, 0x6a, 0xd7, 0xed, 0x14, 0x3a, 0x2b, 0x1f, 0xa1, 0xa8, 0xcb, 0x2c, 0xe5, 0xf7, 0x36, 0xc0, 0x65, 0x36, 0x2b, 0xce, 0xcb, 0x2d, 0x3d, 0x77, 0xac, 0x95, 0x4f, 0xa9, 0x92, 0x36, 0x8f, 0x8c, 0x22, 0x61, 0x64, 0x54, 0x7c, 0xf2, 0xab, 0xf0, 0x27, 0x8d, 0x8e, 0x3a, 0xdd, 0x73, 0x79, 0xf8, 0x73, 0xb6, 0x40, 0x17, 0xb4, 0x88, 0xa6, 0x49, 0xda, 0x01, 0xbe, 0xd2, 0x69, 0xf1, 0x72, 0x03, 0x0d, 0xe3, 0xc0, 0x0f, 0x55, 0xe1, 0xab, 0x6c, 0x15, 0x97, 0xaf, 0xcd, 0xcc, 0x82, 0x72, 0x66, 0x9d, 0x51, 0xc1, 0x3a, 0x63, 0x6e, 0x9d, 0x95, 0x54, 0xa1, 0x5e, 0x4d, 0x11, 0x49, 0x23, 0x6a, 0xca, 0x77, 0xcc, 0xc8, 0xab, 0x48, 0x56, 0x63, 0x15, 0xa9, 0xf1, 0xe6, 0x29, 0x60, 0x05, 0x80, 0xab, 0x50, 0xb5, 0xfa, 0x0d, 0xec, 0x5e, 0x57, 0xf3, 0x9a, 0x07, 0xe4, 0xcd, 0x2a, 0x7a, 0x06, 0x14, 0x81, 0xc0, 0xde, 0x6e, 0xaf, 0x57, 0x61, 0xf7, 0x7c, 0x0e, 0xcd, 0x6b, 0x70, 0x68, 0x83, 0xda, 0x69, 0x2c, 0x5d, 0x52, 0x60, 0x77, 0x9d, 0xfc, 0xfe, 0x52, 0x34, 0x50, 0xf4, 0x07, 0x9e, 0x86, 0xf2, 0xfc, 0x4a, 0xef, 0xaf, 0x3c, 0x18, 0xa8, 0x8a, 0x5a, 0xbc, 0xa3, 0x9a, 0x0d, 0xaf, 0x9c, 0x9f, 0x8e, 0xfc, 0x2b, 0x12, 0x4f, 0x4b, 0x32, 0x04, 0x7d, 0x4d, 0x1f, 0x42, 0x49, 0xcf, 0x6d, 0xc7, 0xec, 0x54, 0x6b, 0xc5, 0xde, 0xd2, 0x79, 0xc1, 0x9d, 0x9d, 0x0c, 0x64, 0xae, 0x39, 0x12, 0xaa, 0x30, 0x7d, 0xd1, 0xb6, 0x29, 0xca, 0xbb, 0xbc, 0xcd, 0x7d, 0x17, 0xda, 0x5f, 0xb0, 0x9a, 0xbc, 0x97, 0xe9, 0xe7, 0x5b, 0x96, 0x85, 0xbc, 0x47, 0xb8, 0x88, 0x91, 0x79, 0x08, 0x8d, 0x39, 0xb6, 0x8a, 0xcb, 0x21, 0x3b, 0x53, 0xac, 0xfa, 0xd3, 0x03, 0x9f, 0x75, 0x70, 0x3c, 0x33, 0x1b, 0xba, 0x8a, 0x05, 0x2a, 0xde, 0x6a, 0xf4, 0xd9, 0xf8, 0x64, 0x97, 0xaa, 0x8e, 0x6f, 0xd8, 0xa7, 0xc5, 0xf0, 0xbc, 0x61, 0x1f, 0x17, 0x3f, 0xc2, 0x3b, 0xfe, 0x53, 0xc4, 0xbe, 0x4d, 0x5f, 0xce, 0xc6, 0xe9, 0xe7, 0x2d, 0x0a, 0x03, 0x4d, 0x37, 0xb1, 0x22, 0xcf, 0x7a, 0xae, 0x4f, 0xcd, 0xc8, 0x38, 0x12, 0x64, 0x24, 0x49, 0xe8, 0x3d, 0xf1, 0x40, 0xcf, 0xe7, 0x78, 0x78, 0x99, 0x9f, 0x75, 0x41, 0x00, 0xe6, 0x79, 0xd6, 0xd7, 0x92, 0xaf, 0xef, 0x4f, 0xdf, 0x1f, 0xc9, 0x51, 0xda, 0x10, 0x1d, 0xa4, 0xbf, 0xd5, 0xbc, 0x7d, 0x33, 0x96, 0xd7, 0xa6, 0x43, 0x44, 0xaf, 0x53, 0x9b, 0x43, 0x83, 0x9b, 0xa0, 0x31, 0x7e, 0x98, 0xe0, 0x37, 0x13, 0x57, 0xdb, 0x69, 0xf0, 0xc6, 0x8b, 0xb1, 0x5b, 0xf4, 0xad, 0xa1, 0x5d, 0xf4, 0xad, 0x59, 0xad, 0x3a, 0xf9, 0x44, 0xa8, 0xd6, 0xa7, 0x6d, 0x80, 0x4a, 0xac, 0xcf, 0x5a, 0xac, 0x9c, 0xe4, 0x0a, 0x74, 0x49, 0x9f, 0xfe, 0xfd, 0xe7, 0x67, 0xe3, 0xe4, 0xf3, 0xf5, 0xd9, 0xab, 0xba, 0xe5, 0xeb, 0x31, 0x08, 0x03, 0x4f, 0x11, 0x4f, 0xf2, 0x23, 0xf7, 0xf9, 0xf4, 0xfa, 0xf3, 0xfb, 0x53, 0xe3, 0x22, 0x34, 0x24, 0xce, 0x69, 0xec, 0xe4, 0xd1, 0xd0, 0x1a, 0x92, 0xd4, 0x88, 0x27, 0xb1, 0x90, 0xad, 0x19, 0x0a, 0x09, 0xd6, 0x99, 0xd9, 0xf2, 0x36, 0x78, 0x88, 0xe6, 0x19, 0xe4, 0xed, 0x0d, 0xa0, 0x96, 0x1c, 0xa2, 0x22, 0x3d, 0xcc, 0x4b, 0xf7, 0xa6, 0x86, 0xf4, 0xde, 0x3a, 0x16, 0x34, 0x0b, 0xb1, 0x20, 0x23, 0x9f, 0x8c, 0x21, 0xd1, 0x53, 0x07, 0xc1, 0x45, 0x83, 0xf6, 0x8c, 0xd2, 0x15, 0x47, 0x9d, 0x5f, 0x26, 0x80, 0x96, 0xc1, 0x9d, 0x98, 0x20, 0x4d, 0xc7, 0xfb, 0x13, 0xc6, 0xe8, 0x91, 0xbf, 0xfd, 0xf9, 0xd3, 0xaf, 0x51, 0x4e, 0x25, 0x13, 0x5f, 0x7e, 0x4e, 0x83, 0x1f, 0xc1, 0x82, 0xed, 0x7a, 0xdb, 0x8c, 0xc6, 0xa3, 0xb6, 0x6c, 0xdc, 0xc6, 0xf4, 0x21, 0x9b, 0x51, 0xdf, 0xac, 0x5f, 0x1e, 0x7b, 0xe8, 0x2f, 0xff, 0x96, 0xba, 0x4f, 0xd4, 0xfe, 0xc5, 0xd5, 0x92, 0x56, 0xd8, 0x5b, 0x36, 0xea, 0x38, 0x5a, 0x7d, 0x3a, 0xbc, 0x60, 0x09, 0x5b, 0x20, 0x81, 0x06, 0x24, 0x18, 0x12, 0xb8, 0x11, 0x09, 0xd1, 0x0b, 0x36, 0x43, 0xa2, 0x0d, 0x44, 0xa1, 0x08, 0xb0, 0x21, 0x12, 0xb9, 0x69, 0x93, 0x37, 0x6f, 0x01, 0xbb, 0x16, 0x14, 0xde, 0xdb, 0x86, 0x32, 0x78, 0xac, 0x35, 0xc7, 0x4b, 0x06, 0xca, 0x15, 0xf1, 0x83, 0x5f, 0xc6, 0x75, 0x38, 0xf9, 0x3e, 0x0d, 0xd2, 0x9c, 0x37, 0x79, 0x1a, 0x2d, 0x49, 0xb2, 0xca, 0xd1, 0x38, 0x8e, 0x02, 0xff, 0x8e, 0x76, 0x3e, 0x30, 0x53, 0x13, 0x78, 0xb6, 0x77, 0x83, 0x5e, 0x9b, 0x1b, 0x70, 0xd6, 0x9a, 0xdc, 0x64, 0x08, 0xa7, 0xd3, 0xcc, 0xf4, 0x23, 0x46, 0x51, 0xbc, 0x86, 0xea, 0x64, 0xe7, 0x5b, 0xec, 0xf7, 0x78, 0x37, 0x33, 0x5f, 0x46, 0x3c, 0x76, 0x05, 0xee, 0x89, 0xab, 0xd3, 0x2b, 0xe3, 0x68, 0xba, 0xa4, 0xd1, 0xdd, 0x2c, 0xfc, 0xb9, 0x1e, 0x32, 0x1d, 0x5a, 0x6e, 0x2b, 0x90, 0x01, 0x3e, 0x19, 0x3f, 0x40, 0xd6, 0x04, 0x99, 0xcd, 0x8c, 0x76, 0x49, 0xcb, 0x8e, 0xc9, 0x72, 0x19, 0x3f, 0x59, 0x40, 0x67, 0x7e, 0xaf, 0xa9, 0x29, 0x38, 0x48, 0xbe, 0xc3, 0x8e, 0xa2, 0x6d, 0xe3, 0x35, 0x48, 0xb3, 0x18, 0x0b, 0xe3, 0x84, 0x3c, 0x84, 0x69, 0x0b, 0xbc, 0x9f, 0xa9, 0xd7, 0x88, 0x46, 0x01, 0x5d, 0x18, 0xb7, 0x5a, 0x3a, 0xa6, 0x6c, 0x2c, 0x43, 0xeb, 0xde, 0x89, 0xc3, 0x44, 0x0c, 0x81, 0xf2, 0x25, 0x27, 0x45, 0xec, 0xec, 0xc8, 0x18, 0x3d, 0x86, 0xd1, 0x72, 0x31, 0x1c, 0xc0, 0x35, 0x52, 0x2e, 0x43, 0x08, 0x14, 0x0f, 0xe0, 0x39, 0x99, 0xd0, 0x70, 0x3a, 0x35, 0x34, 0xcb, 0xbe, 0xfd, 0x2b, 0x94, 0x73, 0xf4, 0x26, 0xdc, 0xe2, 0xc3, 0x02, 0x7a, 0x7f, 0x06, 0xf3, 0x3b, 0x3f, 0x7c, 0x30, 0xfe, 0xa0, 0x64, 0x50, 0xb6, 0xb2, 0xb2, 0x59, 0x12, 0x65, 0x13, 0x95, 0xac, 0xb8, 0x4d, 0x6f, 0xfb, 0xe8, 0x6b, 0x6f, 0x55, 0x4c, 0x37, 0x0e, 0x8b, 0x2f, 0x39, 0x55, 0xcc, 0xae, 0x46, 0x28, 0x8d, 0xe5, 0x63, 0xfb, 0x3f, 0xf7, 0x9f, 0x3a, 0x3d, 0x93, 0x07, 0x7a, 0x12, 0x4d, 0x4f, 0x02, 0xd3, 0x57, 0x1a, 0x2d, 0x56, 0x8b, 0x4c, 0xa3, 0xe2, 0x43, 0xf9, 0x8c, 0x23, 0x19, 0x9d, 0x0e, 0x60, 0x70, 0x19, 0x09, 0xb3, 0x36, 0xb0, 0x18, 0x5f, 0xea, 0x44, 0x95, 0x3d, 0x28, 0x02, 0x8b, 0x50, 0x39, 0x75, 0x50, 0x5d, 0x93, 0x1f, 0x74, 0x9e, 0x45, 0x50, 0xfd, 0xb5, 0xc9, 0xf1, 0x3f, 0xe9, 0x57, 0x87, 0xb7, 0xe7, 0xf2, 0x83, 0x53, 0x48, 0x0d, 0x14, 0x1a, 0xdd, 0x61, 0xbb, 0x22, 0x39, 0x52, 0xcf, 0x26, 0x28, 0x71, 0xd9, 0x60, 0x24, 0xd7, 0x6c, 0x33, 0x92, 0x5b, 0x18, 0x59, 0xae, 0x31, 0xbc, 0x78, 0x92, 0xa5, 0x50, 0x7c, 0xc2, 0x06, 0x28, 0x81, 0x04, 0x98, 0xda, 0x04, 0xc1, 0xcb, 0x92, 0x85, 0xfb, 0x1e, 0x23, 0x8c, 0xb1, 0xd9, 0x20, 0x9f, 0x59, 0xfb, 0xfc, 0xcd, 0xef, 0x78, 0xcf, 0x67, 0xaf, 0x55, 0x84, 0xf0, 0xba, 0xef, 0x99, 0x8f, 0x1e, 0x49, 0xdf, 0xf3, 0xd7, 0x60, 0x49, 0xd4, 0x6e, 0xa3, 0x74, 0x81, 0xb2, 0x64, 0xed, 0x8d, 0x70, 0x9b, 0xf1, 0x23, 0xc9, 0xd1, 0xd6, 0xf2, 0x17, 0x9c, 0x98, 0xc0, 0x34, 0x2d, 0x54, 0xd6, 0x80, 0xb4, 0xeb, 0xb5, 0xb7, 0x26, 0x8f, 0xe3, 0x82, 0x88, 0x85, 0xcb, 0x49, 0x87, 0xac, 0x1b, 0x18, 0x60, 0xe8, 0x02, 0x88, 0xdf, 0x99, 0xa0, 0xb7, 0x10, 0xf9, 0x79, 0x9f, 0x3c, 0x36, 0x65, 0x10, 0x9d, 0xaf, 0x92, 0x8a, 0x50, 0x46, 0x1b, 0xd3, 0xe9, 0xcd, 0xe6, 0x30, 0x35, 0x09, 0x10, 0xe9, 0x09, 0x33, 0x2e, 0x83, 0x79, 0x90, 0x82, 0x74, 0xf6, 0xab, 0xf7, 0xaa, 0x64, 0xfb, 0x13, 0x52, 0xb6, 0xaf, 0x19, 0x46, 0x6b, 0x78, 0x7a, 0x9a, 0x44, 0x28, 0x28, 0x91, 0x2b, 0x3b, 0x6b, 0xbd, 0xa7, 0xe6, 0xcd, 0x8d, 0x11, 0x84, 0x66, 0x1d, 0x40, 0x75, 0x86, 0xc8, 0x39, 0x58, 0x43, 0x64, 0xb7, 0x84, 0xc8, 0xdd, 0x14, 0xa2, 0xbe, 0xb9, 0x7f, 0xa0, 0x70, 0xff, 0x39, 0x56, 0xa9, 0xf5, 0x1e, 0x00, 0x2b, 0x28, 0x17, 0xae, 0x3f, 0x7f, 0xa3, 0x47, 0x3a, 0x59, 0x46, 0xc4, 0x78, 0x3f, 0x9f, 0xc6, 0xd0, 0x2d, 0x9f, 0xfa, 0x16, 0x0e, 0xe4, 0x40, 0x4d, 0x6b, 0x0c, 0x15, 0x2b, 0xcd, 0xec, 0x40, 0xaf, 0x9c, 0x43, 0x4b, 0x3d, 0xf8, 0x8c, 0x72, 0x1d, 0x8a, 0x91, 0x41, 0x44, 0x27, 0x69, 0xcb, 0x51, 0x9f, 0x33, 0x9a, 0xbc, 0x2f, 0x01, 0x57, 0xfa, 0x12, 0x46, 0x70, 0x9f, 0xf3, 0x0e, 0x08, 0x03, 0x92, 0xf5, 0xe5, 0x98, 0xe5, 0x5d, 0x7d, 0x49, 0xb2, 0x7a, 0xa8, 0x1a, 0x15, 0x32, 0x0e, 0xb6, 0x9b, 0xb3, 0xbd, 0x29, 0x11, 0xc2, 0xe9, 0xab, 0xe5, 0x2d, 0x4b, 0xa6, 0x84, 0x53, 0xc3, 0xa9, 0x72, 0x6a, 0x60, 0x65, 0xbf, 0x2e, 0xcf, 0xe4, 0x32, 0xd9, 0x5a, 0x93, 0xfa, 0x72, 0x34, 0xd8, 0x2f, 0x80, 0x6d, 0x48, 0x7d, 0x53, 0xce, 0x11, 0x60, 0xa5, 0x03, 0xcf, 0xb0, 0x0d, 0x3a, 0xae, 0x0a, 0x9d, 0xe7, 0x1d, 0xd8, 0xd9, 0xc0, 0x66, 0xc2, 0x36, 0x36, 0x53, 0x6b, 0x60, 0xa7, 0x82, 0x0e, 0x18, 0x74, 0xa7, 0x0e, 0x9d, 0x41, 0x77, 0x0a, 0x33, 0x16, 0xd3, 0x2c, 0x9b, 0x83, 0x40, 0xa3, 0xdd, 0xe9, 0x65, 0xab, 0x5b, 0x8c, 0x0e, 0x1c, 0x3c, 0x56, 0xdd, 0xda, 0xe9, 0x02, 0xed, 0x58, 0xbf, 0x35, 0xc7, 0x92, 0xdb, 0x9b, 0x9c, 0xc9, 0xa6, 0xdf, 0xd6, 0x58, 0x8d, 0xce, 0x3e, 0xf8, 0x2a, 0xa2, 0xd3, 0xa2, 0x5d, 0x0f, 0x0f, 0x29, 0xf4, 0x68, 0x77, 0x89, 0x8f, 0x6b, 0x0e, 0xde, 0xaa, 0x06, 0x9d, 0xc1, 0x97, 0xaf, 0x87, 0x00, 0x63, 0x7c, 0x30, 0xb0, 0x3c, 0x0b, 0x59, 0x38, 0xfe, 0x8a, 0xb1, 0x87, 0xa7, 0x09, 0x2d, 0x67, 0xcf, 0x2d, 0x8f, 0xbd, 0xd7, 0x96, 0x67, 0xcf, 0xa2, 0x64, 0xc2, 0xf6, 0x92, 0x15, 0xe2, 0x1d, 0xfc, 0xe2, 0xf1, 0x4e, 0xfb, 0xb1, 0x51, 0xd1, 0xaf, 0xd7, 0xcf, 0x8d, 0xb6, 0xba, 0xa1, 0xaf, 0x11, 0x72, 0x55, 0x08, 0x3d, 0x7f, 0x83, 0xd5, 0x5e, 0xdd, 0x43, 0x27, 0x98, 0x8d, 0xfe, 0x0f, 0x3a, 0xd4, 0x88, 0xd0, 0xa0, 0x43, 0x0a, 0x84, 0x26, 0xa6, 0x27, 0x58, 0xe9, 0x41, 0x87, 0xa4, 0x08, 0x0d, 0xa7, 0xac, 0x19, 0xa1, 0xe1, 0x94, 0x55, 0x06, 0xbd, 0x41, 0xb1, 0x95, 0x67, 0x67, 0x3a, 0x74, 0x20, 0xf4, 0x07, 0xe2, 0xfd, 0x82, 0xdb, 0xe7, 0xc1, 0xfa, 0x34, 0x23, 0x34, 0x9c, 0xad, 0x06, 0x84, 0x40, 0x7e, 0x83, 0x1f, 0x10, 0x1a, 0x7c, 0x7c, 0xbb, 0x53, 0x96, 0x23, 0x34, 0x9c, 0xb2, 0x06, 0x84, 0x86, 0x53, 0xa6, 0x88, 0x82, 0xa8, 0x2d, 0xce, 0x2a, 0x8c, 0xac, 0xfd, 0x3c, 0x65, 0x9c, 0x80, 0x0e, 0x77, 0x7b, 0xde, 0x96, 0xe1, 0x6a, 0x72, 0xff, 0x48, 0xfc, 0x34, 0xa3, 0xd3, 0x22, 0x7c, 0x5c, 0x03, 0xe7, 0xaa, 0x80, 0xeb, 0xb9, 0x6a, 0x4d, 0x61, 0xb6, 0x3f, 0x75, 0x50, 0xad, 0x26, 0xd5, 0xb2, 0xe4, 0xaa, 0x55, 0xf0, 0x7c, 0x56, 0x0f, 0x3c, 0xdf, 0xf6, 0x70, 0x0d, 0x27, 0x51, 0x8e, 0x10, 0x3f, 0x89, 0x83, 0x42, 0xd5, 0x9a, 0xf6, 0xf8, 0xcb, 0x34, 0x9b, 0xc9, 0x07, 0xe5, 0x89, 0xe0, 0xff, 0x25, 0xf3, 0x31, 0xe1, 0xbb, 0xca, 0x3e, 0x84, 0x4f, 0x0b, 0xbe, 0xae, 0x0c, 0x16, 0xb9, 0xeb, 0x37, 0xde, 0xce, 0xea, 0x4a, 0x69, 0x49, 0xb7, 0xe9, 0xbf, 0x2b, 0xaf, 0xd2, 0x6a, 0x5a, 0x65, 0x04, 0x21, 0x9c, 0xb0, 0x6f, 0x2c, 0x89, 0xdc, 0xa7, 0x11, 0xb9, 0x4b, 0x26, 0x3a, 0xcb, 0xe2, 0x1b, 0xff, 0xbc, 0x1a, 0xa1, 0x7f, 0xf5, 0xb8, 0xc3, 0x21, 0x47, 0xcd, 0x6c, 0x89, 0x1a, 0xfe, 0x57, 0x8f, 0xb3, 0x6f, 0x05, 0xd4, 0x4c, 0x29, 0x6a, 0xe1, 0x9c, 0x72, 0xd0, 0x92, 0x60, 0xbd, 0x78, 0xda, 0x5e, 0x04, 0xb2, 0xfa, 0x79, 0xfc, 0x96, 0xf3, 0x95, 0x05, 0x0b, 0x53, 0xee, 0x8a, 0xc9, 0xa4, 0xcf, 0xb5, 0x44, 0xba, 0xfd, 0xb9, 0xc1, 0x4c, 0x68, 0xf0, 0x15, 0xe3, 0x5a, 0x33, 0x01, 0xf5, 0xcd, 0x04, 0x92, 0xbc, 0xba, 0xcf, 0xe3, 0x45, 0xe0, 0x07, 0x64, 0x30, 0x14, 0x35, 0x2a, 0xdf, 0x16, 0xb7, 0x5e, 0x9b, 0x0a, 0xbe, 0x0b, 0x71, 0xbd, 0x4a, 0x90, 0xe1, 0x76, 0x4d, 0x1e, 0xef, 0xe7, 0x74, 0x69, 0xe0, 0x39, 0x5d, 0xe0, 0x45, 0xfc, 0xaf, 0xfc, 0xa8, 0xac, 0x37, 0x20, 0xca, 0x3a, 0xda, 0x1b, 0x5c, 0x68, 0xa9, 0x24, 0xde, 0xb0, 0xe8, 0x90, 0x3f, 0x1b, 0x86, 0x8a, 0x67, 0x4b, 0xa9, 0x50, 0x13, 0x1e, 0xf3, 0xc2, 0x90, 0x7c, 0xe9, 0x34, 0xc3, 0x36, 0x94, 0xa8, 0xf9, 0xa3, 0x35, 0x3e, 0x10, 0x52, 0x3d, 0xd0, 0xc5, 0x89, 0x41, 0xe6, 0x7e, 0xca, 0x3a, 0x2f, 0x3e, 0x92, 0xd3, 0x76, 0x29, 0x66, 0x9b, 0xd0, 0x04, 0x6a, 0x8c, 0xdf, 0xe3, 0x2a, 0xf6, 0x6e, 0xb3, 0xa8, 0x9c, 0x7c, 0xe2, 0x15, 0x8b, 0xea, 0x7a, 0x19, 0xe5, 0xae, 0x09, 0xa6, 0x3e, 0x1b, 0xa7, 0xe2, 0xa2, 0xfe, 0x45, 0x23, 0xe3, 0xf3, 0xfc, 0x2f, 0x92, 0x2f, 0x04, 0x3d, 0xf3, 0x83, 0x65, 0x99, 0x73, 0xb7, 0x42, 0xda, 0x56, 0xe8, 0x6e, 0x02, 0x05, 0x91, 0x61, 0xa5, 0xbb, 0xe9, 0xd0, 0xe6, 0xcd, 0x10, 0x04, 0x16, 0x0b, 0x2a, 0x70, 0xc9, 0xc4, 0x66, 0x38, 0x5d, 0x91, 0xf9, 0xf2, 0x9e, 0x46, 0xe4, 0x39, 0xb6, 0x2b, 0xef, 0xb1, 0x23, 0xca, 0x51, 0x02, 0x4d, 0x28, 0xe1, 0x1e, 0xbb, 0x9d, 0x1c, 0x25, 0x17, 0x98, 0x0d, 0x28, 0x19, 0x67, 0x3f, 0xc2, 0xca, 0x0a, 0xeb, 0x6e, 0x60, 0x43, 0x07, 0x0b, 0x9b, 0x29, 0x85, 0xed, 0x9a, 0x04, 0xff, 0xb7, 0x1a, 0xb4, 0x2a, 0x69, 0xc3, 0x74, 0x4a, 0xa9, 0x98, 0x02, 0x3c, 0xc6, 0x65, 0x38, 0x0e, 0x66, 0x5d, 0xf0, 0x29, 0x33, 0x98, 0x60, 0x3d, 0xb5, 0x0e, 0x6a, 0xbd, 0xd3, 0x43, 0xa0, 0xd6, 0xc1, 0x6d, 0x96, 0x7a, 0x14, 0x38, 0x94, 0x70, 0x0d, 0x37, 0x37, 0xc7, 0x89, 0x80, 0xf2, 0x62, 0x98, 0x22, 0x4e, 0x37, 0xe1, 0x2a, 0x9a, 0x93, 0x07, 0x3a, 0x5f, 0x16, 0xbd, 0xde, 0x70, 0xf0, 0x80, 0xfc, 0xe0, 0x25, 0xb4, 0x2b, 0xb1, 0xb1, 0xe2, 0xf4, 0x88, 0x3d, 0x3e, 0x85, 0x79, 0x3c, 0x65, 0x4e, 0xa9, 0x24, 0x9e, 0x1a, 0x91, 0x31, 0x8d, 0x96, 0x61, 0xb8, 0xbc, 0xef, 0x3d, 0xd5, 0x81, 0x89, 0x2d, 0x7f, 0x40, 0x48, 0x0b, 0x21, 0x6b, 0x40, 0x48, 0x65, 0x91, 0x84, 0x1e, 0x44, 0x86, 0x10, 0x8d, 0x7e, 0x90, 0xd9, 0x8b, 0xa0, 0x63, 0x6d, 0x8d, 0xce, 0x16, 0x7b, 0xab, 0x2c, 0x05, 0x3a, 0x36, 0x22, 0x03, 0x3a, 0x15, 0xdd, 0x41, 0x26, 0x11, 0x2e, 0xf7, 0x09, 0x3a, 0xdf, 0x82, 0x99, 0x3f, 0x21, 0xcb, 0xde, 0x1e, 0x2d, 0xc7, 0xfb, 0xff, 0xdb, 0xbb, 0xb2, 0x26, 0xb7, 0x8d, 0x24, 0xfd, 0xee, 0x88, 0xf9, 0x0f, 0x88, 0x98, 0x97, 0x9d, 0x35, 0x1d, 0x8b, 0xba, 0x81, 0x47, 0xdd, 0xb6, 0x47, 0x92, 0x7b, 0x9b, 0xb2, 0xdc, 0xe3, 0x37, 0x90, 0x04, 0x25, 0xac, 0xba, 0x49, 0x05, 0x9b, 0x2d, 0xb9, 0xe7, 0x61, 0x7e, 0xfb, 0x56, 0x66, 0x15, 0x4e, 0xe2, 0x24, 0xc1, 0xab, 0x41, 0x77, 0x68, 0x9a, 0x6a, 0x8f, 0x25, 0xe4, 0x87, 0xac, 0xac, 0x3c, 0xbf, 0xcc, 0xef, 0x1e, 0x4a, 0x12, 0xc8, 0xd7, 0xe1, 0xba, 0x25, 0xc5, 0x76, 0xf7, 0x15, 0x3c, 0xb2, 0x98, 0x68, 0x6e, 0x48, 0x2b, 0x77, 0x5b, 0x2a, 0xc5, 0x27, 0xdc, 0x12, 0x10, 0x91, 0x3c, 0xf3, 0x3a, 0x8a, 0xf4, 0x46, 0xbb, 0x79, 0x90, 0x12, 0xcd, 0xfa, 0x2d, 0xee, 0x36, 0x73, 0x5b, 0x67, 0x46, 0x47, 0xeb, 0x11, 0x82, 0x71, 0x82, 0xef, 0x17, 0xcf, 0x01, 0xa0, 0xb2, 0x88, 0xa6, 0xf9, 0xd4, 0xd6, 0xe6, 0x03, 0x57, 0x2f, 0xf0, 0x8c, 0xc9, 0x3d, 0x93, 0xdf, 0x67, 0xff, 0xe4, 0xab, 0x0c, 0xce, 0xa2, 0xaf, 0x6c, 0xaa, 0x5b, 0xe5, 0xf4, 0xdb, 0x7f, 0x04, 0x95, 0x42, 0x71, 0x45, 0xe5, 0x5c, 0x30, 0xc5, 0xe5, 0x5c, 0x86, 0x52, 0x40, 0x22, 0xd3, 0x3c, 0xd2, 0x78, 0x0d, 0x35, 0x21, 0x5a, 0xb7, 0x36, 0x3c, 0x8d, 0x90, 0xcc, 0xfb, 0xb7, 0xaa, 0x20, 0x33, 0xaa, 0xa0, 0xaa, 0x36, 0x13, 0xc8, 0xe2, 0xc0, 0x55, 0x43, 0x6d, 0xd5, 0xcf, 0x07, 0x34, 0xbc, 0xc9, 0xa0, 0x71, 0x42, 0xed, 0x92, 0xa1, 0x12, 0xb8, 0x7f, 0x1f, 0x3f, 0xc7, 0x3c, 0xa5, 0xc1, 0x7e, 0xb9, 0x5a, 0x97, 0xee, 0x01, 0xd5, 0xe2, 0x25, 0x8b, 0x40, 0xfd, 0x74, 0x11, 0x28, 0x41, 0xb6, 0x49, 0x05, 0x40, 0xa4, 0x49, 0xbe, 0xcc, 0xda, 0xf4, 0x54, 0x7a, 0x7b, 0xb4, 0x27, 0xc5, 0x63, 0x50, 0x08, 0x01, 0xdb, 0x6c, 0x4d, 0x25, 0x09, 0x57, 0x2a, 0xaf, 0x99, 0x8f, 0x9f, 0xc4, 0xad, 0xe3, 0x85, 0x16, 0xa0, 0xeb, 0xf0, 0xdb, 0xf2, 0xf6, 0x61, 0x1d, 0x33, 0x41, 0x5e, 0x06, 0x12, 0x32, 0x60, 0x11, 0xd6, 0x16, 0x2c, 0x87, 0x0d, 0x19, 0xae, 0x98, 0x7b, 0x61, 0x5e, 0xd8, 0xd4, 0x91, 0xd2, 0xda, 0x0f, 0x7e, 0x5d, 0x02, 0x09, 0x0b, 0x9c, 0xf6, 0x19, 0xca, 0xff, 0x0b, 0x45, 0x45, 0x71, 0xb7, 0x84, 0xaa, 0x06, 0xcb, 0x6e, 0x96, 0xe8, 0x93, 0xb0, 0x62, 0x9b, 0x44, 0xd3, 0x49, 0x90, 0x9e, 0xc4, 0x81, 0xef, 0x3c, 0x9c, 0x07, 0x15, 0x07, 0xcf, 0xf0, 0xd5, 0x31, 0xe9, 0x5e, 0x48, 0x10, 0x53, 0xfd, 0xe2, 0xb2, 0xb0, 0xa9, 0xaa, 0x88, 0x57, 0x23, 0xcb, 0xe6, 0x99, 0x02, 0x10, 0x30, 0x53, 0xa3, 0xa5, 0x6c, 0x2e, 0x73, 0x07, 0x6c, 0x1c, 0x44, 0xeb, 0x50, 0x43, 0xf0, 0x38, 0x59, 0xae, 0x3e, 0x39, 0x1f, 0x89, 0x53, 0x4d, 0x90, 0xff, 0x64, 0x6c, 0x53, 0xb7, 0x46, 0xa1, 0x18, 0x3a, 0xe2, 0x16, 0x46, 0xcd, 0x2c, 0x74, 0x57, 0x3a, 0x4a, 0xee, 0x63, 0xbb, 0xaa, 0x6a, 0x58, 0x3f, 0xb2, 0x59, 0xd2, 0xae, 0xcb, 0xe1, 0x17, 0x1e, 0xde, 0x55, 0x85, 0x1b, 0x3a, 0x7e, 0x78, 0x4a, 0xdd, 0xc4, 0x8e, 0xb2, 0x43, 0xc6, 0xa5, 0x31, 0xf2, 0xa4, 0xc5, 0xc3, 0x4f, 0xe7, 0xf3, 0x5c, 0x84, 0x9d, 0x3c, 0xbc, 0x7e, 0x21, 0xce, 0xeb, 0xe5, 0x6a, 0x1a, 0x3a, 0xd7, 0x0f, 0x77, 0x13, 0x53, 0xaf, 0xa1, 0xb9, 0x35, 0xa1, 0xe4, 0x2c, 0xf6, 0x5f, 0x96, 0xac, 0x3f, 0x30, 0x4b, 0xe9, 0xdb, 0x43, 0x54, 0xa8, 0x23, 0x27, 0x10, 0xe9, 0xd0, 0xbe, 0xb7, 0xc3, 0xeb, 0x9f, 0xd0, 0x7a, 0x08, 0x6d, 0x48, 0xba, 0x1c, 0x5e, 0x6f, 0x2e, 0x4a, 0x55, 0x08, 0x62, 0xdb, 0x8c, 0xf2, 0x1c, 0x6a, 0x88, 0x76, 0x8b, 0x4b, 0x81, 0xb4, 0xd0, 0x9e, 0x6d, 0x5b, 0x20, 0xad, 0xd7, 0xb5, 0x01, 0x8e, 0xe7, 0x6e, 0x9c, 0xa8, 0x7d, 0x4e, 0x16, 0xb7, 0x88, 0x79, 0x65, 0x77, 0x50, 0xe8, 0x26, 0x28, 0x6d, 0x4e, 0x94, 0x5f, 0x61, 0x31, 0x3d, 0xaf, 0xc4, 0x62, 0x9e, 0x8d, 0x75, 0xe9, 0x82, 0xc0, 0x24, 0x49, 0x94, 0xe4, 0x11, 0xf0, 0x7d, 0xd7, 0x34, 0xd5, 0x3d, 0x5b, 0x04, 0xb7, 0xcb, 0xcd, 0x8d, 0x5c, 0xfe, 0x99, 0x0c, 0x9f, 0x97, 0xa8, 0x88, 0xd7, 0xc5, 0xa8, 0x50, 0xb7, 0xdc, 0x99, 0xba, 0x1a, 0xc3, 0x56, 0xf6, 0xde, 0xac, 0xca, 0xd9, 0x7a, 0x4e, 0x33, 0x8f, 0x98, 0x59, 0x97, 0xb0, 0x90, 0x21, 0x1f, 0x07, 0xdf, 0xa2, 0xe5, 0xaa, 0xb1, 0xab, 0xba, 0xf6, 0x7a, 0x51, 0xad, 0x9b, 0x00, 0xab, 0x04, 0xcc, 0x87, 0x5c, 0xbc, 0xa1, 0xcd, 0x54, 0xbf, 0xf4, 0x69, 0x3a, 0x61, 0x90, 0x7d, 0xe9, 0xe1, 0xa7, 0xc0, 0x79, 0x13, 0x2e, 0xc2, 0xfb, 0xe8, 0xde, 0xb0, 0xce, 0xb3, 0xe7, 0xe5, 0x51, 0x6a, 0xe2, 0x5d, 0xf1, 0xd4, 0xbb, 0x62, 0x19, 0xef, 0x8a, 0xc5, 0xde, 0x55, 0x4d, 0x16, 0xbf, 0x7d, 0x39, 0x22, 0xf7, 0x7c, 0xe3, 0x60, 0xfd, 0xb0, 0x5a, 0x1c, 0xb2, 0x12, 0x51, 0xdc, 0x96, 0xd7, 0x4d, 0x75, 0x62, 0x69, 0x28, 0x2d, 0x24, 0x04, 0x0a, 0xd2, 0xb8, 0xbd, 0x13, 0x56, 0x16, 0xbd, 0x8f, 0x8d, 0xab, 0xa7, 0x62, 0xff, 0x5f, 0x53, 0x04, 0x36, 0xe1, 0xd6, 0x9a, 0x06, 0xc5, 0x7b, 0xa5, 0x54, 0xa2, 0x83, 0xbd, 0x97, 0xbc, 0xe9, 0x6b, 0x8a, 0x27, 0xc8, 0xdc, 0xd2, 0x1c, 0x92, 0x90, 0xe7, 0x8f, 0xf4, 0xeb, 0x76, 0x0b, 0xd7, 0xbb, 0x0b, 0x54, 0x32, 0x09, 0xda, 0x89, 0x1f, 0x96, 0x99, 0x13, 0x4b, 0x99, 0x5b, 0xf0, 0x00, 0x3f, 0x07, 0x8b, 0x3f, 0x82, 0x85, 0x03, 0x65, 0x2d, 0x5b, 0xd2, 0x1a, 0x14, 0x71, 0xee, 0xdc, 0x9a, 0x32, 0x4a, 0xa6, 0x64, 0x03, 0x98, 0xef, 0x00, 0x4c, 0xb4, 0x5c, 0x87, 0x30, 0x01, 0x33, 0x70, 0x82, 0x61, 0xab, 0x40, 0x4a, 0x94, 0x28, 0x10, 0xe0, 0x04, 0xf8, 0x5c, 0xbd, 0x18, 0xf0, 0x96, 0xdb, 0xc9, 0x34, 0x9e, 0x74, 0x10, 0x75, 0x08, 0x39, 0x3d, 0x74, 0x53, 0x9e, 0x4d, 0x0f, 0x65, 0x61, 0x9f, 0x82, 0x8e, 0x26, 0xbc, 0x3c, 0x34, 0x6f, 0xa5, 0x90, 0x72, 0x3f, 0x57, 0xd8, 0x11, 0x55, 0x85, 0x76, 0xe5, 0x4b, 0x89, 0x7b, 0x4a, 0xc7, 0xcb, 0xc5, 0x23, 0x06, 0x15, 0xe3, 0xcf, 0x90, 0x92, 0x1d, 0x72, 0xd7, 0xfb, 0xdc, 0x36, 0x05, 0x4c, 0x27, 0xc5, 0xb0, 0x1c, 0x30, 0xca, 0xe6, 0x67, 0xa1, 0x4a, 0x1d, 0x4c, 0x6e, 0xc3, 0xfd, 0xac, 0xea, 0x69, 0x40, 0xa1, 0x4b, 0xfa, 0x59, 0x5b, 0x50, 0xdf, 0xb6, 0x5c, 0xe7, 0x2b, 0xef, 0x46, 0xa4, 0x31, 0x75, 0x60, 0x57, 0xf8, 0xf7, 0x68, 0xfd, 0xd9, 0x19, 0xdf, 0xe9, 0x3f, 0xf6, 0xd7, 0xe5, 0x63, 0xe5, 0x4a, 0x53, 0xff, 0x4c, 0x56, 0x9a, 0x96, 0x1c, 0x11, 0xaf, 0x8d, 0x35, 0x15, 0xa1, 0x71, 0x14, 0xbd, 0xd0, 0xcc, 0xe5, 0x2a, 0xeb, 0xb8, 0x8c, 0xc6, 0x5f, 0xc3, 0x70, 0x76, 0x1b, 0x2d, 0xbe, 0x38, 0x1f, 0x96, 0xab, 0x68, 0x36, 0xd8, 0x62, 0x4e, 0x11, 0x20, 0x6a, 0xe7, 0x97, 0x0d, 0x40, 0x6f, 0x01, 0xa0, 0x9b, 0x70, 0xf9, 0x17, 0x16, 0xea, 0xd3, 0x0c, 0xc5, 0x30, 0x97, 0x7f, 0x11, 0xcb, 0xb6, 0xe4, 0xfa, 0x85, 0xf4, 0xf0, 0x3a, 0x98, 0x45, 0xc1, 0xb1, 0x4b, 0x83, 0xa7, 0xd0, 0x03, 0x5a, 0x84, 0x28, 0x35, 0x4d, 0x17, 0x88, 0x62, 0x2d, 0x0a, 0xe3, 0xbd, 0x84, 0xb6, 0x7f, 0x2a, 0xb9, 0xb4, 0xd7, 0x61, 0x70, 0xd7, 0x0a, 0xa1, 0x36, 0x2b, 0xc6, 0x7b, 0x3a, 0x63, 0xfa, 0x26, 0x99, 0xdd, 0x86, 0x04, 0x6d, 0xb3, 0xf9, 0x4c, 0x53, 0x54, 0xaa, 0xd9, 0x03, 0x76, 0x83, 0x24, 0x73, 0xb0, 0x36, 0x21, 0xc9, 0x57, 0xa4, 0xdc, 0x34, 0x14, 0x16, 0x69, 0x28, 0xcc, 0x33, 0xa1, 0x30, 0x8f, 0x43, 0x61, 0x51, 0xe9, 0xc4, 0xd4, 0x7a, 0xbe, 0xaa, 0x16, 0x15, 0x91, 0x41, 0x45, 0x76, 0xf4, 0x88, 0x65, 0xb3, 0x47, 0xdc, 0x94, 0x47, 0x4b, 0x90, 0xa3, 0x84, 0x5c, 0x94, 0xa9, 0x14, 0x92, 0x6d, 0x94, 0x69, 0x42, 0xbc, 0x14, 0x13, 0x3f, 0xc5, 0x84, 0xc6, 0xfd, 0x86, 0x44, 0x6d, 0xa5, 0x4c, 0xa5, 0xac, 0xf7, 0x29, 0x2a, 0x32, 0x83, 0x8a, 0x68, 0x6e, 0xd7, 0xec, 0x4d, 0x7b, 0xf8, 0x45, 0x7b, 0xaa, 0x20, 0x39, 0x25, 0xed, 0x69, 0x30, 0x45, 0x5d, 0xb4, 0xa7, 0x4f, 0xdb, 0x33, 0x9f, 0x76, 0xd7, 0x9e, 0x73, 0xf3, 0x00, 0xc5, 0x86, 0x6d, 0x19, 0xfc, 0xdd, 0x5d, 0x84, 0x44, 0x5c, 0x6c, 0x48, 0x11, 0x12, 0x79, 0x81, 0x84, 0x6d, 0x68, 0x49, 0x7e, 0xdf, 0x9e, 0x81, 0xe4, 0x65, 0x68, 0x28, 0x06, 0x58, 0x96, 0xeb, 0x26, 0xed, 0x36, 0x32, 0x43, 0x0e, 0x16, 0x0d, 0x2f, 0x83, 0x86, 0x1f, 0xa3, 0x21, 0x2b, 0xbb, 0x4f, 0x55, 0xce, 0xa0, 0xe6, 0xab, 0x52, 0x81, 0xdf, 0x6c, 0x53, 0xbc, 0xbc, 0x4d, 0x29, 0xc2, 0xe0, 0xd5, 0xda, 0x51, 0xec, 0x10, 0xc0, 0x25, 0x34, 0xb2, 0x85, 0x1d, 0x9d, 0x97, 0xaa, 0xcb, 0xc7, 0x68, 0xb5, 0x86, 0xf6, 0x80, 0x4c, 0x65, 0x65, 0x58, 0xd1, 0x77, 0x9c, 0xec, 0x0c, 0xa5, 0x2f, 0x67, 0x92, 0x2a, 0xa1, 0x18, 0x9d, 0x64, 0x16, 0xcc, 0x69, 0x98, 0xc2, 0x5b, 0xbb, 0x4a, 0xfa, 0x7d, 0x74, 0x37, 0x79, 0xb8, 0x2f, 0xa7, 0x19, 0xd3, 0xcf, 0x14, 0x2b, 0xc9, 0x91, 0x5a, 0x47, 0x2a, 0x55, 0xa4, 0x71, 0x78, 0xd0, 0x52, 0x76, 0x30, 0xbb, 0xb9, 0x40, 0x89, 0xf4, 0xf8, 0x24, 0xb2, 0x8f, 0xd7, 0xab, 0x60, 0xad, 0x85, 0x7f, 0xf9, 0xb0, 0x1c, 0xee, 0x84, 0x6e, 0x0c, 0x14, 0xb9, 0x00, 0x55, 0x7b, 0x9a, 0x62, 0xbf, 0x36, 0x06, 0x8a, 0x4c, 0x3a, 0x02, 0xb5, 0x35, 0x77, 0x07, 0xa3, 0x67, 0xc7, 0xdd, 0x11, 0x83, 0x45, 0x7c, 0x3b, 0xfd, 0xe5, 0xd7, 0x80, 0x75, 0xf3, 0x76, 0xb3, 0xf1, 0xe0, 0xa9, 0x16, 0xe4, 0x82, 0x19, 0x99, 0x98, 0x63, 0x37, 0x8f, 0xe7, 0xbe, 0xb9, 0x05, 0x66, 0x15, 0x86, 0x6b, 0xc3, 0xcc, 0x11, 0xae, 0x9c, 0x5f, 0x3e, 0x9a, 0x8f, 0x86, 0xff, 0xef, 0xc3, 0xab, 0x3d, 0x1f, 0xbb, 0x2d, 0x4e, 0x5a, 0x9f, 0x36, 0x68, 0x62, 0x99, 0x70, 0x78, 0x50, 0xe8, 0x4d, 0x79, 0x58, 0x4c, 0x97, 0x77, 0xce, 0xf8, 0xf5, 0x4d, 0xfe, 0x82, 0x8a, 0x8b, 0x72, 0xaa, 0xb7, 0x3e, 0x95, 0x8d, 0x2e, 0x0f, 0xbf, 0xaa, 0x07, 0xca, 0x6b, 0xc3, 0xa3, 0x2b, 0xf5, 0x3f, 0x46, 0x22, 0xcf, 0x2b, 0x48, 0xf4, 0x55, 0xbf, 0x5d, 0xa8, 0x2f, 0x3d, 0x5f, 0xfe, 0xe5, 0x08, 0x28, 0x12, 0x54, 0x57, 0x98, 0xda, 0xf8, 0xb4, 0x67, 0x56, 0x5d, 0x8a, 0x47, 0x8e, 0xe7, 0xa4, 0x58, 0x89, 0x43, 0x60, 0xd2, 0xe1, 0xd7, 0xcd, 0xc9, 0xe3, 0x1d, 0x5e, 0xf5, 0x76, 0x23, 0xc9, 0xc5, 0xfd, 0xc5, 0x33, 0x56, 0xa8, 0x87, 0xfe, 0xf9, 0xee, 0x5f, 0xce, 0xd5, 0xf2, 0x3b, 0x4c, 0x61, 0x3a, 0x1f, 0x1e, 0x56, 0x93, 0xe5, 0x80, 0x47, 0xe8, 0xb8, 0x50, 0xc2, 0x0e, 0x37, 0x17, 0xd2, 0x40, 0x29, 0x4a, 0x2f, 0xc7, 0xdc, 0xf9, 0x23, 0x5a, 0x85, 0xb3, 0xd3, 0xe6, 0xfe, 0x67, 0x87, 0x5f, 0x44, 0x66, 0xc1, 0xa3, 0x71, 0x0e, 0xad, 0x44, 0xc5, 0x7a, 0xeb, 0x13, 0x3b, 0xdb, 0x3e, 0x1f, 0x2f, 0x59, 0xb5, 0x5e, 0x7d, 0x10, 0x87, 0x4d, 0xeb, 0x38, 0x09, 0x28, 0xcd, 0x8d, 0x5b, 0xc5, 0x87, 0xf0, 0x43, 0x38, 0xfd, 0xbc, 0x58, 0xde, 0x2e, 0x3f, 0x3d, 0x3a, 0xbf, 0x2c, 0x16, 0xcb, 0x6f, 0xb6, 0x7f, 0x63, 0x4c, 0x2b, 0x49, 0x69, 0xcf, 0xa5, 0x13, 0x48, 0x54, 0xcc, 0x59, 0x34, 0xad, 0x26, 0x49, 0xfa, 0x95, 0xa7, 0xa6, 0xfe, 0x9a, 0xd8, 0xab, 0x0f, 0x6f, 0xfe, 0xac, 0x4b, 0x38, 0xed, 0xb3, 0x67, 0xac, 0xcd, 0x8a, 0xdf, 0x7a, 0x17, 0xb5, 0x4d, 0x8d, 0xa3, 0xc9, 0x45, 0xe5, 0x73, 0x3b, 0xcb, 0x25, 0x26, 0x2c, 0xaf, 0x44, 0x9f, 0x57, 0x0f, 0xf7, 0xeb, 0xbb, 0xe0, 0x1e, 0x1c, 0xd4, 0xcc, 0x00, 0x86, 0xc3, 0xb4, 0xbc, 0x45, 0xd7, 0xec, 0x5c, 0xe6, 0x74, 0xaa, 0x8e, 0x5a, 0x93, 0x87, 0x57, 0x44, 0x29, 0x31, 0x46, 0x95, 0x28, 0xf1, 0xc1, 0x62, 0x44, 0xdd, 0x46, 0x8c, 0x3e, 0x98, 0xbf, 0x75, 0xb8, 0x10, 0xb1, 0x09, 0xcb, 0xf9, 0xc3, 0x95, 0x10, 0xed, 0x6d, 0x42, 0xfa, 0x5c, 0x56, 0x70, 0x16, 0x90, 0x73, 0xc3, 0x59, 0x7e, 0xe0, 0x24, 0x87, 0x5c, 0x38, 0xfe, 0x1e, 0x7c, 0xbd, 0x10, 0xcc, 0x24, 0x0e, 0x42, 0xcc, 0x39, 0xcb, 0x7c, 0xbf, 0x5a, 0xdd, 0x5e, 0x6b, 0x1f, 0xfd, 0x7e, 0xad, 0xff, 0x7b, 0xe7, 0x65, 0xf4, 0x29, 0x5a, 0x6b, 0xdd, 0xa3, 0x89, 0xdb, 0x99, 0xa9, 0x35, 0xf4, 0x3b, 0x2d, 0x95, 0x2f, 0x1b, 0xb8, 0x95, 0x54, 0x4b, 0xc9, 0x15, 0x26, 0x5a, 0xe8, 0x06, 0xab, 0x33, 0x3c, 0x19, 0x31, 0x33, 0x66, 0x3a, 0x7b, 0x95, 0xed, 0xef, 0x04, 0x79, 0x3b, 0xdb, 0x9e, 0xf2, 0x9b, 0xbe, 0x83, 0xc9, 0x71, 0xdd, 0x0e, 0xe0, 0xa0, 0x77, 0xbd, 0x61, 0x9d, 0xfd, 0x7d, 0xe4, 0x7e, 0x8b, 0x1c, 0x6c, 0xdd, 0xcd, 0x74, 0x27, 0x0e, 0x36, 0x33, 0xe8, 0xde, 0x1a, 0x34, 0xbe, 0x33, 0x68, 0x83, 0xb9, 0xd2, 0xa4, 0xbd, 0xd2, 0x2c, 0x13, 0x7f, 0x1e, 0xaa, 0x37, 0x57, 0xce, 0xcd, 0x2f, 0x2f, 0x2f, 0xd4, 0xb1, 0x54, 0x4c, 0xdc, 0x4c, 0x17, 0x71, 0x11, 0xa4, 0x9b, 0xc1, 0x22, 0x94, 0x9c, 0x38, 0x6f, 0xe6, 0x56, 0x5f, 0x55, 0xd7, 0x0f, 0x0b, 0xe7, 0xbd, 0xf3, 0x72, 0x15, 0x7d, 0x0b, 0x2f, 0x8e, 0x51, 0x01, 0x38, 0xff, 0xd8, 0xc0, 0x9d, 0x6f, 0x32, 0x33, 0x86, 0x50, 0xd5, 0x41, 0xf8, 0x01, 0xc7, 0xad, 0x2f, 0x30, 0xb9, 0x84, 0xd6, 0x5d, 0x8a, 0x1f, 0xa3, 0xc9, 0x4a, 0xeb, 0xd6, 0xe2, 0xd3, 0x46, 0x43, 0xc6, 0x50, 0x6e, 0x44, 0xa1, 0x0c, 0x11, 0x41, 0xba, 0x90, 0x29, 0xc6, 0x69, 0x79, 0x17, 0x86, 0xce, 0xb8, 0x6e, 0x39, 0x94, 0xdc, 0xc7, 0xe4, 0x72, 0x2b, 0x03, 0x3c, 0x99, 0xd9, 0xce, 0x23, 0x31, 0xab, 0x7c, 0xea, 0x93, 0x1c, 0xb9, 0x9e, 0x79, 0xb6, 0xe8, 0xac, 0xa6, 0x79, 0x16, 0xcd, 0x0f, 0xcb, 0xe5, 0xec, 0x36, 0xbc, 0x77, 0xb4, 0x58, 0x9e, 0xf3, 0xe2, 0x73, 0x74, 0xf7, 0x15, 0xc6, 0x42, 0x6d, 0xca, 0xb8, 0x96, 0x0a, 0x82, 0x6f, 0x7b, 0xf8, 0x2a, 0xa6, 0xf5, 0x9b, 0xb2, 0x93, 0x1b, 0x43, 0x58, 0x76, 0x74, 0x6d, 0x34, 0xec, 0xd1, 0xab, 0x69, 0x4c, 0x2f, 0x21, 0x7c, 0x52, 0x78, 0xb3, 0x16, 0x96, 0x61, 0x8d, 0x86, 0x7b, 0x96, 0x11, 0x3a, 0x4e, 0x1d, 0xd9, 0xef, 0xa3, 0x0f, 0xd7, 0xcf, 0x97, 0xeb, 0xa4, 0x0f, 0x2e, 0xc3, 0x99, 0x8d, 0x17, 0x15, 0x89, 0xed, 0x2e, 0xd6, 0x94, 0x4d, 0xa5, 0x59, 0x26, 0x85, 0xe6, 0x94, 0x11, 0x64, 0x62, 0x07, 0x41, 0xac, 0x0d, 0xcd, 0x10, 0xff, 0xe6, 0x5a, 0x04, 0x29, 0xe9, 0xdc, 0x67, 0x41, 0xf2, 0xc1, 0x3e, 0x2d, 0xee, 0x3b, 0xa6, 0x75, 0x9a, 0x42, 0x24, 0xda, 0x5c, 0x04, 0x87, 0xd4, 0xe4, 0xb1, 0x95, 0x67, 0x3f, 0x5d, 0xd0, 0x29, 0x41, 0x27, 0x74, 0xed, 0x22, 0xe8, 0x0b, 0x3a, 0xa5, 0xe4, 0x14, 0x96, 0x83, 0xea, 0x82, 0x4e, 0xd9, 0xed, 0x34, 0x37, 0x17, 0xec, 0x54, 0x14, 0x26, 0xc4, 0x3f, 0x80, 0xdb, 0x77, 0xa9, 0x54, 0x03, 0x1a, 0x5e, 0xb6, 0x31, 0x39, 0x05, 0xe8, 0x7b, 0xb4, 0x51, 0x76, 0xed, 0xf3, 0xca, 0x3a, 0x26, 0x23, 0x62, 0x3b, 0x64, 0x84, 0x59, 0xf6, 0x20, 0xa4, 0xca, 0x13, 0x52, 0xfc, 0xbe, 0x88, 0xf4, 0x7f, 0xf4, 0xe8, 0xfc, 0x2e, 0x07, 0x48, 0xd3, 0x91, 0xe8, 0x0b, 0x2b, 0xe8, 0x0b, 0x2c, 0x05, 0xd8, 0x13, 0x41, 0xd0, 0xc9, 0xab, 0x4a, 0x5c, 0xa1, 0x4f, 0xb6, 0xbb, 0xaa, 0x0c, 0x28, 0x9f, 0xce, 0x9c, 0x35, 0xa9, 0x8a, 0x33, 0xb3, 0x2d, 0x28, 0xa4, 0xd8, 0x3f, 0xd7, 0x4a, 0x53, 0x30, 0xe4, 0x42, 0x48, 0x82, 0x74, 0x25, 0x44, 0x60, 0xe1, 0xc8, 0x3e, 0x49, 0x23, 0x93, 0xb5, 0xfe, 0x7d, 0x7e, 0xf0, 0xf8, 0x63, 0x34, 0xd5, 0x62, 0x1a, 0xd6, 0x83, 0x4c, 0xe7, 0xea, 0x01, 0x16, 0x88, 0x56, 0x53, 0x16, 0xd7, 0xc7, 0x60, 0x6d, 0x49, 0xe1, 0xb5, 0xde, 0x9d, 0x8a, 0xa8, 0x95, 0x8a, 0xd9, 0x8f, 0xe0, 0xb6, 0x79, 0x3b, 0xb0, 0x24, 0x39, 0x8c, 0xb2, 0xfc, 0xcc, 0xde, 0xc7, 0x6b, 0xec, 0x5a, 0xad, 0xe9, 0x8e, 0x39, 0x77, 0x9b, 0xd4, 0x38, 0x52, 0xc3, 0xf8, 0x9c, 0xcf, 0xf4, 0x17, 0xe1, 0x21, 0xe7, 0x99, 0x91, 0x9a, 0x8f, 0x37, 0x70, 0xfa, 0x20, 0xc9, 0xf5, 0x62, 0x79, 0x77, 0x07, 0x3b, 0xa7, 0x4d, 0x93, 0xfb, 0x21, 0xfb, 0xaa, 0xb6, 0x20, 0x6b, 0x20, 0x5d, 0xee, 0xb2, 0x7a, 0x84, 0x62, 0x0a, 0x2e, 0x4f, 0x52, 0x39, 0x57, 0x1e, 0x75, 0x19, 0x63, 0x12, 0xac, 0x84, 0x50, 0x12, 0x48, 0xa0, 0xdb, 0xec, 0x03, 0xc0, 0x7e, 0xe7, 0xd6, 0x4b, 0xb9, 0xed, 0x59, 0x51, 0xed, 0x47, 0x93, 0xba, 0x27, 0x31, 0xfc, 0x2e, 0x39, 0x0c, 0xd9, 0x85, 0x3e, 0x46, 0xfb, 0x41, 0xf9, 0xf5, 0xaf, 0x9d, 0x16, 0x26, 0x3c, 0xe1, 0x0d, 0xde, 0xc5, 0xdc, 0x17, 0xd9, 0x0a, 0xa0, 0x81, 0x91, 0x10, 0x11, 0x7e, 0x01, 0xa9, 0x12, 0x24, 0x9f, 0xb8, 0xb9, 0xb6, 0xd8, 0xcb, 0x51, 0x2b, 0x00, 0x14, 0x90, 0x6c, 0x6d, 0xe2, 0x02, 0x50, 0x35, 0x40, 0xea, 0x72, 0xcc, 0x1a, 0x6d, 0xd1, 0xa6, 0x16, 0xbd, 0x0a, 0xee, 0x1f, 0xc7, 0xef, 0x6e, 0x06, 0x8f, 0x50, 0xac, 0x46, 0x9b, 0xd6, 0xfa, 0x3a, 0x9c, 0x86, 0xd1, 0xb7, 0x81, 0x9f, 0xb2, 0x84, 0x4a, 0x2f, 0xa7, 0x40, 0x7d, 0x9e, 0xb0, 0x3c, 0x2e, 0x62, 0x37, 0x4f, 0x91, 0x6e, 0xef, 0x29, 0xaa, 0x36, 0x59, 0xa1, 0x64, 0x85, 0x1b, 0x2b, 0x2c, 0x42, 0xe8, 0x1d, 0x96, 0x33, 0xd5, 0x9b, 0xf9, 0xdc, 0x70, 0x95, 0xc6, 0xdf, 0x87, 0xae, 0x37, 0x1b, 0x21, 0x18, 0x57, 0x92, 0xc8, 0x99, 0x14, 0xca, 0x95, 0x24, 0x86, 0xe5, 0x98, 0xac, 0x18, 0xa7, 0xc0, 0x26, 0x98, 0x18, 0x9b, 0xc0, 0x9d, 0x58, 0x4e, 0x58, 0x9e, 0x2a, 0xcd, 0xe6, 0x02, 0xb6, 0xf2, 0x3d, 0xc3, 0x7d, 0x44, 0xef, 0x47, 0xd8, 0x35, 0xdc, 0xb6, 0xef, 0x80, 0x50, 0x0b, 0x8e, 0x6f, 0xfb, 0x0e, 0xda, 0x6d, 0xa7, 0x1b, 0xd6, 0x6d, 0x3e, 0x8b, 0x9d, 0x42, 0x9a, 0x35, 0x3b, 0x17, 0x90, 0x72, 0x20, 0x85, 0x41, 0x72, 0xa7, 0xbb, 0x17, 0x90, 0x9a, 0x40, 0x22, 0xe6, 0xdf, 0x5c, 0x40, 0xca, 0xe4, 0x5c, 0x13, 0x90, 0xe2, 0x06, 0x3a, 0x66, 0xc8, 0xbc, 0xf7, 0x0a, 0x92, 0x4d, 0xad, 0x9e, 0x42, 0x56, 0xb1, 0x13, 0x48, 0xf3, 0xd9, 0x16, 0x20, 0xa5, 0xdd, 0x0a, 0x5d, 0x51, 0x92, 0x67, 0xc7, 0x4c, 0x53, 0x04, 0x8a, 0xd9, 0x52, 0xda, 0xe5, 0xc8, 0x01, 0x48, 0xb2, 0xc2, 0x0d, 0x50, 0x17, 0x37, 0xa0, 0xda, 0x2e, 0xb1, 0xc4, 0x0d, 0x28, 0x1c, 0xb9, 0x57, 0xb7, 0xd1, 0x7a, 0x73, 0x39, 0x02, 0x61, 0x72, 0x8f, 0xfd, 0x0c, 0x72, 0xe7, 0x43, 0x26, 0xfa, 0x3b, 0x64, 0xd4, 0xea, 0x0f, 0x61, 0x45, 0xfd, 0x41, 0x68, 0x1c, 0xda, 0xef, 0xa4, 0xfd, 0x56, 0x14, 0xb1, 0x27, 0x65, 0x95, 0xf4, 0xef, 0x27, 0x35, 0xba, 0x64, 0x8b, 0x8a, 0x99, 0x19, 0xc5, 0x21, 0x28, 0x95, 0xac, 0x70, 0x96, 0x26, 0x45, 0xa5, 0x1a, 0x5f, 0x6c, 0x77, 0x09, 0x4c, 0xb3, 0x0b, 0x4c, 0x6d, 0x22, 0x5d, 0x92, 0x85, 0xc9, 0x9e, 0xb3, 0x0b, 0x4e, 0x9b, 0x38, 0x89, 0x0b, 0x4e, 0xad, 0x70, 0x9a, 0x9d, 0x07, 0x4e, 0x31, 0xe9, 0xd5, 0x11, 0x11, 0x63, 0xdb, 0x69, 0xd6, 0x10, 0xfd, 0x83, 0x04, 0x2b, 0x72, 0xc1, 0xaa, 0x35, 0x56, 0x17, 0xbd, 0x6a, 0x8f, 0x95, 0x7f, 0x36, 0x58, 0xc5, 0x86, 0x4b, 0x1c, 0x1f, 0xb5, 0x7c, 0x78, 0x73, 0x41, 0xad, 0x65, 0x52, 0x61, 0x72, 0xf1, 0x24, 0x5a, 0x79, 0x12, 0xf3, 0xb6, 0x38, 0x3d, 0x5a, 0x46, 0x53, 0x9a, 0xfe, 0x7d, 0x31, 0x74, 0x39, 0x91, 0x0b, 0x02, 0x34, 0x0e, 0xdf, 0x26, 0x64, 0xb3, 0x49, 0xff, 0x41, 0xa6, 0x4f, 0x33, 0x33, 0xd5, 0x44, 0x2a, 0x6d, 0x5a, 0x01, 0x8e, 0x02, 0xe6, 0x45, 0x04, 0xdb, 0x43, 0xa3, 0x4a, 0xa0, 0xb9, 0xb9, 0xb8, 0x59, 0xb5, 0x26, 0xbe, 0x33, 0x66, 0x17, 0x23, 0x6f, 0xdb, 0xff, 0x2f, 0xb8, 0x75, 0xc9, 0xfd, 0xb9, 0x65, 0x97, 0x23, 0xd0, 0xff, 0xde, 0x86, 0xf7, 0x17, 0x07, 0x2c, 0x61, 0xfe, 0x75, 0xa7, 0x96, 0x23, 0x29, 0x4f, 0xa1, 0x71, 0xf3, 0xea, 0xb7, 0x1b, 0x07, 0xb6, 0x34, 0x0b, 0xe9, 0x3c, 0xff, 0xe7, 0xe0, 0x16, 0x35, 0x13, 0x45, 0xb1, 0x3b, 0x9e, 0x5b, 0xae, 0x5f, 0x1a, 0x2f, 0x10, 0xb8, 0x89, 0x82, 0xe5, 0xbb, 0x68, 0x2f, 0xea, 0x43, 0xdd, 0x5d, 0x57, 0x8b, 0xed, 0xbe, 0xcd, 0x50, 0x74, 0x53, 0x9f, 0xa9, 0x4b, 0xd0, 0xbb, 0x0a, 0xad, 0x71, 0x4a, 0xb8, 0x5a, 0x6f, 0xa2, 0xc5, 0xbb, 0xa5, 0xe5, 0xb5, 0x5b, 0x4d, 0x83, 0x19, 0x96, 0x21, 0x78, 0x76, 0xfb, 0x5a, 0xa6, 0xb1, 0x30, 0x73, 0xb1, 0x67, 0x6f, 0xf3, 0x78, 0x48, 0x99, 0x24, 0x08, 0xf9, 0x05, 0x80, 0x68, 0xd7, 0x45, 0xcd, 0xa4, 0x62, 0xbc, 0xed, 0xaf, 0x68, 0xf1, 0xf5, 0x61, 0x3d, 0xba, 0xf9, 0x05, 0xbe, 0x5d, 0x9c, 0x40, 0xf4, 0x70, 0xa6, 0xd6, 0x1e, 0x84, 0xb9, 0xe1, 0xb3, 0x3f, 0xc3, 0xd5, 0xf2, 0xeb, 0x2d, 0x6c, 0xec, 0x19, 0xf2, 0x8e, 0xf2, 0x14, 0x1e, 0x72, 0x81, 0x27, 0x85, 0xe7, 0x6f, 0x3f, 0xfc, 0xdd, 0x79, 0xb6, 0x98, 0xad, 0x96, 0xd1, 0xec, 0x6f, 0x3f, 0x30, 0x4f, 0x0a, 0xe6, 0x4b, 0x2e, 0x19, 0xa3, 0x0c, 0x36, 0x52, 0xc0, 0x27, 0xce, 0xe0, 0x17, 0x61, 0x82, 0xb1, 0x91, 0xf7, 0x3c, 0x5a, 0xbf, 0x5c, 0x56, 0x32, 0x0f, 0x75, 0xef, 0x0a, 0xc8, 0xa3, 0xe4, 0x67, 0x51, 0x52, 0xf9, 0x2b, 0x86, 0xb4, 0xb0, 0x9e, 0xc9, 0x46, 0xb5, 0xb8, 0xe7, 0x22, 0x7f, 0xc7, 0x90, 0xda, 0x45, 0x62, 0xa5, 0xa3, 0x58, 0x16, 0x1a, 0x0d, 0x14, 0x83, 0x05, 0x1d, 0x54, 0x6a, 0x24, 0xa4, 0xd4, 0xd8, 0x00, 0x4e, 0x42, 0xea, 0x1f, 0x6a, 0x6c, 0x3c, 0x49, 0x19, 0x2f, 0x60, 0x53, 0x56, 0x70, 0xdb, 0xba, 0x67, 0xc2, 0x3f, 0x27, 0x9c, 0x3c, 0x4e, 0xa5, 0xaf, 0x38, 0xe7, 0x72, 0xae, 0x5d, 0x14, 0x7d, 0x2b, 0x6b, 0x94, 0x88, 0xd6, 0x24, 0x41, 0x5d, 0xc1, 0x54, 0x8a, 0x13, 0xde, 0x31, 0xce, 0x18, 0x1e, 0xa1, 0x06, 0xaa, 0x36, 0x54, 0x50, 0x16, 0x26, 0x51, 0x8a, 0x52, 0xf1, 0x8c, 0x6c, 0xa2, 0xd0, 0xae, 0xe2, 0xd8, 0x20, 0xb6, 0x24, 0xcc, 0xd7, 0x2a, 0xa1, 0x15, 0x44, 0xab, 0x08, 0xd7, 0x9f, 0x3d, 0x26, 0x99, 0xd0, 0xea, 0x41, 0x40, 0x7c, 0x46, 0x5b, 0x89, 0xed, 0xef, 0x76, 0x7c, 0x58, 0xf7, 0xbe, 0xe2, 0x4e, 0xd7, 0x90, 0xe5, 0x3d, 0xf5, 0x0b, 0x1d, 0xa1, 0x19, 0x10, 0xb8, 0xb6, 0x1b, 0x00, 0x04, 0xd7, 0x22, 0x6b, 0x2f, 0x5e, 0x9f, 0x0b, 0x8d, 0x82, 0x3e, 0x27, 0x54, 0x03, 0xa1, 0x98, 0xd7, 0xee, 0xdd, 0xab, 0x2d, 0x8f, 0x89, 0xa8, 0x85, 0x63, 0xe2, 0x77, 0x87, 0x23, 0x51, 0x91, 0x0a, 0x7f, 0xdd, 0x6b, 0xc4, 0x43, 0x23, 0x22, 0xb4, 0xad, 0xf0, 0x34, 0x1e, 0x12, 0xd4, 0x40, 0x82, 0x4a, 0x50, 0x30, 0x1b, 0xfa, 0x13, 0x1f, 0x84, 0x52, 0xe8, 0xeb, 0x83, 0xe0, 0x25, 0x22, 0xf4, 0x97, 0x0f, 0xd7, 0x8a, 0x56, 0x0f, 0x2d, 0x3c, 0x9c, 0x0f, 0xfd, 0xf3, 0xe4, 0x64, 0xbc, 0x5c, 0x7e, 0x9a, 0x2c, 0x17, 0xe1, 0x46, 0x03, 0xf5, 0x76, 0x97, 0x4a, 0x79, 0x46, 0x69, 0x67, 0x73, 0xa6, 0xff, 0x57, 0x2a, 0xe8, 0x95, 0x97, 0x21, 0x18, 0x34, 0x3e, 0x3b, 0xfa, 0xd3, 0x97, 0x3d, 0x33, 0x67, 0xc6, 0x06, 0x29, 0x54, 0x35, 0x7d, 0x39, 0xe1, 0x35, 0xa5, 0x8f, 0x25, 0x53, 0x70, 0x24, 0xe3, 0x67, 0x7e, 0xfd, 0x82, 0xb9, 0xf1, 0x3a, 0xa9, 0x9c, 0xca, 0xf1, 0x3e, 0x54, 0x2e, 0xe6, 0x13, 0xea, 0xde, 0xf9, 0xc8, 0xf3, 0x84, 0x44, 0x7e, 0x15, 0x35, 0x81, 0xc0, 0x78, 0xc7, 0xad, 0xd6, 0xbc, 0xdc, 0xbb, 0x2b, 0xbc, 0xc9, 0xa9, 0xf4, 0x63, 0x1c, 0xde, 0xda, 0x9e, 0xab, 0x1d, 0x5f, 0x5c, 0xed, 0x35, 0x74, 0xcc, 0xcb, 0x9a, 0x55, 0x23, 0xe4, 0x4a, 0x38, 0x99, 0x54, 0x6b, 0x8a, 0x56, 0x11, 0x06, 0x06, 0x8a, 0xa1, 0x83, 0xa3, 0xcc, 0xdd, 0x95, 0x45, 0xc8, 0x78, 0x34, 0x03, 0xc4, 0x68, 0x43, 0x6f, 0x14, 0x3a, 0x33, 0x96, 0xe9, 0xc2, 0xbd, 0x60, 0xa4, 0x2f, 0x3a, 0xb8, 0xd8, 0x40, 0x73, 0xc0, 0xff, 0x21, 0x70, 0xe7, 0x33, 0x08, 0x1d, 0x14, 0xda, 0x7c, 0x37, 0xb5, 0xf1, 0xc3, 0xd6, 0x23, 0xf0, 0x10, 0xc1, 0x0d, 0xc0, 0xbb, 0xcf, 0x03, 0xf7, 0x08, 0x42, 0x0a, 0x70, 0x0a, 0xf4, 0x19, 0xf4, 0x72, 0x18, 0x8d, 0x5f, 0xf5, 0x74, 0x93, 0x9c, 0xf7, 0x19, 0xd3, 0x0e, 0x82, 0xd8, 0x38, 0x63, 0xbd, 0x60, 0x73, 0x8e, 0x0a, 0xe4, 0x33, 0x70, 0x9b, 0x5c, 0xad, 0x40, 0xda, 0xa3, 0x66, 0x10, 0x9d, 0xe3, 0x2f, 0xf8, 0xa4, 0xaf, 0x76, 0x31, 0x64, 0x05, 0x8a, 0x93, 0xc0, 0x53, 0x8f, 0x1a, 0x8e, 0x4a, 0x29, 0x92, 0x79, 0x4f, 0x36, 0x4f, 0x15, 0xe8, 0x9d, 0x76, 0x17, 0x8a, 0xb8, 0xf0, 0x2d, 0x62, 0x4d, 0xa2, 0xea, 0x83, 0x4d, 0xd1, 0x18, 0x6c, 0xf2, 0x2d, 0x25, 0x13, 0xc4, 0x54, 0xc7, 0x8f, 0x25, 0x59, 0x9b, 0x30, 0xba, 0xa5, 0x3e, 0x53, 0x88, 0x16, 0xf1, 0xba, 0x70, 0xd1, 0x31, 0x05, 0xb7, 0x03, 0x32, 0x2c, 0x1e, 0x1a, 0x48, 0x5e, 0x90, 0xac, 0x87, 0x4c, 0x53, 0xad, 0x7a, 0xfa, 0x9d, 0x62, 0xbf, 0xa6, 0xb0, 0x21, 0x8e, 0x7a, 0x05, 0x48, 0xa7, 0xe5, 0xf1, 0xf5, 0x59, 0x15, 0x5a, 0x5e, 0x2d, 0x1b, 0x5c, 0x92, 0xe5, 0xb2, 0x1d, 0x3f, 0xd0, 0x6b, 0x1d, 0xd4, 0xe5, 0x0d, 0xf6, 0x4c, 0x5f, 0x60, 0x50, 0x90, 0x9a, 0xe9, 0xc0, 0x88, 0xcb, 0x49, 0xea, 0x5a, 0x9f, 0xe5, 0xbb, 0x83, 0x4b, 0x5a, 0x62, 0xa0, 0x0a, 0x19, 0x0c, 0x08, 0xa2, 0x14, 0xda, 0x5c, 0x13, 0xb0, 0xaa, 0x3d, 0xbc, 0x3b, 0x7f, 0x7b, 0x6b, 0x9a, 0xb5, 0x9f, 0x2d, 0x53, 0x55, 0xfa, 0x6a, 0x85, 0x6c, 0x2e, 0xe6, 0x74, 0x95, 0xfe, 0x82, 0xc0, 0x50, 0x07, 0x89, 0x70, 0xe6, 0xf4, 0x0d, 0xc3, 0xfa, 0x97, 0xaf, 0xd8, 0xbf, 0x21, 0xb6, 0x7a, 0xa3, 0x2d, 0xa5, 0x93, 0x78, 0x4b, 0x7a, 0xcc, 0x3a, 0xa2, 0xe8, 0x86, 0x82, 0x45, 0x51, 0x90, 0xb3, 0x65, 0xfb, 0x3f, 0x79, 0xdb, 0x26, 0x9a, 0x5a, 0x27, 0x95, 0x24, 0x66, 0x51, 0x20, 0x9e, 0xd7, 0xfe, 0x36, 0x98, 0x4e, 0xfd, 0xf2, 0x04, 0x98, 0x17, 0x89, 0xbe, 0xc0, 0xde, 0xd5, 0x33, 0xe0, 0xdd, 0xb5, 0xb3, 0x70, 0x29, 0xd4, 0x1a, 0x4e, 0x89, 0xe5, 0x06, 0x2a, 0x4d, 0xd6, 0x88, 0xa1, 0xbc, 0x90, 0x48, 0x84, 0xb8, 0x34, 0x51, 0xce, 0xf7, 0x25, 0xd7, 0xdd, 0x51, 0x72, 0x2d, 0x79, 0x43, 0x18, 0x56, 0x19, 0xc2, 0x53, 0x79, 0xde, 0xa2, 0x3b, 0x41, 0x84, 0x5f, 0xea, 0x28, 0xbd, 0x37, 0xa9, 0xa1, 0x92, 0x60, 0x8d, 0x77, 0xa9, 0x02, 0xb7, 0xf6, 0x20, 0x5b, 0x31, 0x55, 0xd7, 0x3a, 0x90, 0xf5, 0xbd, 0x15, 0x1d, 0xbd, 0x2c, 0x1d, 0x7c, 0x78, 0x7b, 0x84, 0xa5, 0xde, 0xd7, 0x2a, 0x07, 0x88, 0xef, 0x0c, 0x90, 0xe8, 0x01, 0x20, 0x97, 0xc6, 0xb3, 0xf9, 0x15, 0x7a, 0xf3, 0x6a, 0x9c, 0x26, 0x15, 0x0f, 0xa1, 0x37, 0xa7, 0x01, 0x0b, 0xa4, 0x17, 0x33, 0xa8, 0x0c, 0x1d, 0x16, 0x7d, 0xfd, 0xa2, 0xf5, 0x86, 0x72, 0x29, 0xc3, 0x70, 0x55, 0x62, 0x41, 0x59, 0xff, 0x4e, 0x41, 0x7e, 0x31, 0x86, 0xe5, 0xaa, 0x37, 0xf7, 0xb0, 0x77, 0x5f, 0x6a, 0x97, 0x92, 0x01, 0xa6, 0x74, 0x24, 0xa6, 0x56, 0x75, 0xcc, 0x8e, 0x55, 0x75, 0x10, 0x1f, 0xae, 0x30, 0xfd, 0x93, 0x27, 0x2e, 0x7c, 0xf6, 0x3e, 0x14, 0xae, 0xb9, 0x0f, 0xb5, 0xe8, 0x53, 0x49, 0xc0, 0xd7, 0x7c, 0xda, 0xc2, 0x6b, 0x7f, 0x5a, 0x9a, 0x6c, 0x0c, 0xc1, 0x38, 0x96, 0xa1, 0xdb, 0x62, 0xbc, 0x6d, 0x9e, 0xfa, 0x9e, 0xc9, 0x0d, 0xd2, 0x7f, 0xa1, 0x2f, 0xee, 0x10, 0x51, 0x5b, 0x47, 0x83, 0xf1, 0x9f, 0xe0, 0xd5, 0x54, 0x01, 0xb7, 0x0b, 0x13, 0x8b, 0xba, 0xa1, 0xe8, 0x06, 0x20, 0x43, 0x2f, 0x2f, 0x00, 0x28, 0x08, 0x55, 0xc2, 0x80, 0x73, 0x81, 0xe8, 0x07, 0x0c, 0xc2, 0x15, 0x86, 0xe5, 0x10, 0xb0, 0x4a, 0xac, 0x50, 0xc1, 0x8d, 0x02, 0x86, 0x95, 0xa7, 0x01, 0x6b, 0x11, 0xa2, 0x7d, 0x65, 0x3b, 0xf7, 0x76, 0xb9, 0x36, 0xdd, 0xa9, 0x90, 0x3c, 0x82, 0xb0, 0xd6, 0x85, 0x80, 0x1d, 0x5b, 0x0b, 0x28, 0xfe, 0x0e, 0x5a, 0x91, 0x92, 0xf4, 0x6f, 0x96, 0x17, 0xb2, 0x1f, 0x5d, 0x39, 0xc1, 0xfe, 0x23, 0xb6, 0x9d, 0xc9, 0xa1, 0x17, 0x98, 0xd2, 0x2c, 0x02, 0xb0, 0xf5, 0x83, 0x26, 0xb9, 0xd8, 0x9e, 0x82, 0x09, 0x4b, 0x68, 0xfe, 0x83, 0xbe, 0x81, 0xd4, 0x43, 0xbb, 0x68, 0x53, 0x56, 0x7f, 0x58, 0x55, 0x78, 0x3f, 0x3e, 0xb1, 0x5c, 0xd9, 0x0e, 0x8d, 0x6c, 0x60, 0x5e, 0xb9, 0x56, 0x05, 0xed, 0xb5, 0x68, 0xb5, 0x50, 0xda, 0x87, 0xd1, 0x4a, 0x82, 0x3f, 0x81, 0x5c, 0xbd, 0x7a, 0x7a, 0x12, 0x6f, 0xd4, 0x8e, 0xec, 0xf8, 0x61, 0x31, 0x86, 0x1b, 0xbf, 0x3e, 0x68, 0x08, 0x57, 0x33, 0x1b, 0xd7, 0x5e, 0xf7, 0x65, 0x9f, 0x35, 0x35, 0xa4, 0x04, 0x3d, 0x3a, 0x2e, 0x47, 0x0f, 0x6d, 0x8d, 0x45, 0x90, 0xd6, 0x22, 0x40, 0x9f, 0x03, 0xee, 0xac, 0x40, 0xcf, 0xad, 0x05, 0x2a, 0xbd, 0xba, 0xf9, 0xa2, 0xb3, 0x9b, 0x5f, 0x58, 0xf7, 0x16, 0x6b, 0x48, 0x97, 0x66, 0x3f, 0x3c, 0x4a, 0xda, 0x32, 0x97, 0xb6, 0xc1, 0x42, 0x83, 0x19, 0x80, 0xa2, 0x61, 0xf1, 0xb0, 0x1f, 0x54, 0x7f, 0xc7, 0x46, 0x10, 0x70, 0x58, 0x52, 0x7b, 0x09, 0xbd, 0x67, 0xd5, 0x7d, 0x67, 0xdd, 0x17, 0xc0, 0xb2, 0xa2, 0x9c, 0x8c, 0xb4, 0x6d, 0x13, 0xdb, 0x48, 0x89, 0xd2, 0xf2, 0xd4, 0xd6, 0xf8, 0xfd, 0xae, 0x25, 0xd6, 0xa2, 0x8e, 0x6f, 0x6a, 0xed, 0x96, 0xd9, 0x4a, 0x5a, 0x9e, 0xad, 0x3c, 0x9d, 0x27, 0x86, 0x84, 0x10, 0xa6, 0x80, 0x08, 0x96, 0x2d, 0x08, 0x3a, 0x1a, 0x50, 0xb0, 0x80, 0x9a, 0x9a, 0x97, 0xd1, 0x8b, 0xfe, 0xf2, 0xe4, 0x45, 0x63, 0xd2, 0xca, 0x60, 0xf4, 0xe2, 0x24, 0x14, 0xab, 0x00, 0x67, 0x2d, 0x1c, 0xe6, 0xae, 0x04, 0x7a, 0x01, 0x14, 0x3d, 0x03, 0xc1, 0x88, 0x79, 0x9b, 0x38, 0x1d, 0x22, 0xce, 0xfb, 0xcd, 0x81, 0xf2, 0x81, 0x40, 0x50, 0x94, 0x67, 0xd8, 0x87, 0xe5, 0x62, 0xd1, 0xd7, 0xfc, 0x94, 0x64, 0x85, 0x73, 0xae, 0xae, 0x0e, 0x39, 0xf0, 0x72, 0x90, 0x6b, 0xae, 0x83, 0x53, 0x44, 0x64, 0xa5, 0x51, 0x3c, 0xe4, 0xe5, 0x7f, 0x5a, 0x65, 0x22, 0x97, 0xa6, 0xa8, 0xb8, 0x25, 0xa8, 0x38, 0x57, 0xb7, 0x0f, 0xf7, 0x07, 0x2f, 0x15, 0x1d, 0xdd, 0x73, 0xc4, 0x44, 0x8d, 0x84, 0xf4, 0x0c, 0x4e, 0x3b, 0x50, 0x8c, 0x26, 0xb0, 0xef, 0x05, 0x2b, 0xd4, 0xa4, 0x12, 0xa6, 0x1d, 0x07, 0x41, 0xda, 0x7b, 0x4a, 0x5d, 0x8a, 0xf4, 0xf6, 0x4f, 0x90, 0xfd, 0xce, 0x86, 0x40, 0x03, 0x28, 0x76, 0x40, 0xe9, 0xfb, 0x10, 0x7d, 0x24, 0xcf, 0x76, 0x2b, 0xd8, 0x68, 0xab, 0x1d, 0x46, 0x67, 0x94, 0x33, 0xde, 0x62, 0x72, 0xc4, 0xc3, 0xc9, 0x05, 0x17, 0x5b, 0x39, 0x40, 0xa1, 0x60, 0x86, 0x44, 0x62, 0xaf, 0x31, 0xba, 0x0e, 0xed, 0x4e, 0xdb, 0x70, 0xfa, 0x66, 0x53, 0xcf, 0xc3, 0xa6, 0x91, 0x27, 0xfb, 0x42, 0xe8, 0x1c, 0x53, 0x39, 0x5a, 0x75, 0xe6, 0x32, 0x54, 0x3e, 0xf0, 0x26, 0xe8, 0x4f, 0x33, 0xe5, 0x2a, 0x01, 0x5d, 0xc6, 0x8a, 0xea, 0x9f, 0x08, 0x19, 0xb6, 0x34, 0x4a, 0x07, 0x48, 0xb8, 0x1f, 0xf9, 0xea, 0xc7, 0xbe, 0x37, 0x86, 0x15, 0x2c, 0x81, 0xb6, 0x89, 0xa2, 0x53, 0xc4, 0x31, 0x8a, 0xf3, 0xd9, 0xe5, 0xd8, 0x65, 0xaa, 0xfe, 0xb4, 0xb6, 0xea, 0x3f, 0xc6, 0xb2, 0xff, 0xb0, 0x3a, 0x21, 0x98, 0x20, 0xd4, 0x60, 0x13, 0x4c, 0xec, 0x02, 0x62, 0xcf, 0x2d, 0xc5, 0x84, 0x9a, 0x51, 0xfb, 0x18, 0x15, 0xe6, 0x6e, 0x1f, 0x98, 0xd2, 0x8d, 0x7d, 0xb6, 0x34, 0x99, 0x12, 0x63, 0x48, 0x8b, 0x41, 0x39, 0x3e, 0x79, 0x65, 0xcf, 0x99, 0xc4, 0xf9, 0x27, 0x33, 0xa8, 0x6c, 0x26, 0xe7, 0x24, 0xb6, 0x7d, 0x42, 0x9b, 0x64, 0xfc, 0xe8, 0xc0, 0x14, 0xb0, 0xe3, 0xa8, 0x72, 0xb7, 0x78, 0xba, 0xb9, 0xcc, 0x6e, 0xb3, 0x50, 0x01, 0x98, 0x31, 0x6c, 0x40, 0xb3, 0xeb, 0x7b, 0x4e, 0xf0, 0x91, 0x37, 0xd2, 0x2c, 0x9e, 0x5f, 0xea, 0x3b, 0xc3, 0x23, 0xd7, 0xf5, 0x57, 0x1d, 0x33, 0xd1, 0xc2, 0x6c, 0x61, 0xf6, 0x94, 0x9f, 0xd9, 0x76, 0x50, 0x42, 0x1d, 0x87, 0x61, 0x7f, 0xa8, 0x6b, 0x7b, 0x27, 0x5d, 0x33, 0x93, 0xb5, 0xf9, 0xcc, 0x7b, 0xf0, 0xba, 0x9b, 0xbc, 0xc6, 0xd6, 0x5e, 0x32, 0xc7, 0xc1, 0x32, 0x57, 0x1a, 0x16, 0x01, 0x89, 0x9d, 0xbd, 0x10, 0x51, 0xc0, 0x71, 0xf5, 0xd3, 0xd2, 0x6f, 0x85, 0x30, 0x7e, 0x1f, 0x9c, 0x47, 0x6d, 0x65, 0x69, 0x9c, 0x8e, 0x67, 0x38, 0x05, 0x60, 0xe2, 0x22, 0x7c, 0x3d, 0xf8, 0x92, 0x28, 0x46, 0x4a, 0xfa, 0xf5, 0x34, 0x28, 0xd3, 0x61, 0x72, 0x29, 0x2d, 0x93, 0x42, 0x0c, 0x89, 0x41, 0x04, 0x4e, 0xaf, 0x41, 0x83, 0xb5, 0x99, 0x30, 0xe6, 0x68, 0x3f, 0xf9, 0x09, 0x8a, 0x52, 0x63, 0x49, 0x29, 0x6e, 0x9d, 0x86, 0x10, 0x03, 0x86, 0x5e, 0x09, 0xf6, 0x68, 0x51, 0xec, 0xda, 0x81, 0xb6, 0x03, 0x32, 0x7a, 0x76, 0x17, 0xfc, 0x7b, 0xb9, 0x70, 0xde, 0x3e, 0x2c, 0x82, 0x3a, 0x9a, 0x21, 0x7e, 0x96, 0xed, 0x06, 0xd5, 0xb8, 0x70, 0x68, 0xd7, 0xe2, 0xe6, 0x56, 0xd1, 0xaf, 0x5b, 0xdf, 0x35, 0xe0, 0x3a, 0xeb, 0xbb, 0xc5, 0x97, 0xa1, 0xd4, 0x9f, 0x46, 0xcf, 0xee, 0x35, 0x14, 0xce, 0x8b, 0x68, 0xfd, 0xe8, 0xbc, 0x8b, 0x16, 0x11, 0xde, 0xe8, 0x0c, 0x6f, 0xf4, 0x98, 0x3d, 0x87, 0xfa, 0x5d, 0xec, 0x5f, 0xf1, 0x60, 0x15, 0x37, 0xd2, 0xeb, 0x3b, 0x3e, 0xbe, 0xd1, 0xdd, 0xcc, 0x8d, 0x4e, 0x2a, 0x5e, 0xaa, 0x6b, 0xfb, 0x0e, 0x21, 0x59, 0x09, 0xe3, 0x37, 0x14, 0xc3, 0x6b, 0x7c, 0xd1, 0xfa, 0x7a, 0x7c, 0xbe, 0x5a, 0x2e, 0xbf, 0x38, 0xef, 0x82, 0xd5, 0xbd, 0x73, 0x35, 0xe6, 0x65, 0xfb, 0xdb, 0xf4, 0x41, 0x7e, 0x32, 0x69, 0x08, 0xb7, 0xb6, 0xa9, 0x84, 0xe1, 0x01, 0xc6, 0xa9, 0x09, 0x89, 0xbc, 0x1d, 0x90, 0xa7, 0xc7, 0x90, 0x5b, 0x92, 0x8e, 0x40, 0x9d, 0x93, 0xe4, 0x1c, 0x5b, 0x54, 0x5d, 0xec, 0xd5, 0x23, 0xd8, 0xaf, 0x29, 0xec, 0x3c, 0x0c, 0x0c, 0x1b, 0x88, 0xd1, 0xab, 0xdb, 0x70, 0xba, 0xbc, 0x73, 0x7e, 0x7d, 0xf1, 0xd3, 0x1f, 0x2e, 0xf9, 0x3d, 0xa3, 0xde, 0x7c, 0x43, 0xbd, 0xb7, 0x53, 0x0c, 0x5a, 0x40, 0x84, 0xb6, 0x88, 0x6a, 0x68, 0x11, 0x04, 0x5a, 0x1b, 0xc7, 0xd8, 0x93, 0x82, 0x1c, 0x6a, 0xb4, 0x14, 0x06, 0xee, 0x29, 0x21, 0x7d, 0x1e, 0xe8, 0x63, 0xad, 0xfd, 0x76, 0x1e, 0x70, 0x46, 0x67, 0x42, 0xc1, 0xe9, 0x11, 0x66, 0xf2, 0x76, 0x18, 0x30, 0x68, 0x81, 0x25, 0xea, 0xbd, 0x40, 0xda, 0x1e, 0x86, 0xbd, 0x9b, 0x12, 0xbf, 0xe3, 0x80, 0xf6, 0xe8, 0xd5, 0xb7, 0xa5, 0xf3, 0xf1, 0x7a, 0xb7, 0x8e, 0x87, 0xbc, 0x48, 0xad, 0x9c, 0xe5, 0x09, 0xb7, 0x94, 0xa2, 0x84, 0x9a, 0x05, 0x82, 0x71, 0x84, 0xf9, 0xfa, 0xf6, 0x71, 0x16, 0x7d, 0x8a, 0x9c, 0x8f, 0xc1, 0xac, 0x94, 0x6c, 0xea, 0x80, 0x31, 0xe6, 0xd7, 0x60, 0x36, 0xbb, 0x0d, 0x89, 0x29, 0x09, 0xe3, 0x67, 0x9a, 0x29, 0x33, 0x1f, 0xb2, 0x58, 0x31, 0x99, 0xc6, 0x6d, 0x93, 0x46, 0x79, 0x93, 0x78, 0x1c, 0x36, 0x98, 0x8e, 0xa3, 0x95, 0xf3, 0x86, 0x7d, 0x3f, 0x14, 0x52, 0x87, 0x28, 0x54, 0xd4, 0x78, 0x35, 0xdc, 0x50, 0xbf, 0x60, 0x49, 0x0b, 0xf9, 0x18, 0x30, 0x87, 0x23, 0x71, 0xb0, 0x0a, 0x28, 0x60, 0xde, 0x2c, 0x97, 0x9f, 0x6e, 0x43, 0xe7, 0x7d, 0xf8, 0x57, 0x49, 0x92, 0x8b, 0x3f, 0xd5, 0xaa, 0x16, 0xd6, 0xfb, 0x4c, 0x1e, 0x19, 0x1a, 0xf3, 0x7d, 0xe8, 0x1f, 0x45, 0x17, 0xdc, 0x0c, 0xd5, 0xf3, 0x18, 0x96, 0xf1, 0x3a, 0x98, 0x45, 0x41, 0xbf, 0x0b, 0xf0, 0xce, 0xad, 0xf2, 0x37, 0x93, 0x66, 0x1b, 0x50, 0x28, 0x4c, 0xa0, 0x9e, 0x98, 0x9e, 0x37, 0x57, 0x2f, 0x9d, 0x9b, 0x97, 0xe5, 0xe9, 0xd1, 0x3d, 0x1d, 0x26, 0xb6, 0x97, 0xc3, 0x24, 0x5a, 0x27, 0x44, 0xed, 0xf1, 0x81, 0x86, 0x38, 0x88, 0xa4, 0xa1, 0xa1, 0xc5, 0xc7, 0x7e, 0x49, 0x28, 0xdf, 0x88, 0xd1, 0xcf, 0xcb, 0x55, 0xe4, 0x3c, 0x0f, 0xd6, 0xeb, 0xdb, 0xf0, 0xa0, 0x8a, 0x42, 0x7b, 0x54, 0x94, 0x92, 0x02, 0x4d, 0xe3, 0x61, 0x4a, 0xa8, 0xa5, 0x60, 0xd4, 0x47, 0x98, 0x49, 0x62, 0x98, 0x7e, 0x30, 0xf6, 0xc6, 0xc0, 0xf2, 0x1a, 0xfe, 0xd4, 0x68, 0xf1, 0x49, 0x1f, 0xa6, 0xbb, 0xbb, 0x60, 0x01, 0xb7, 0x15, 0xcb, 0x15, 0x8c, 0x7b, 0x76, 0xb4, 0xf7, 0xce, 0xf7, 0x56, 0xed, 0x52, 0x72, 0x8f, 0xcf, 0x05, 0xe5, 0x58, 0x61, 0xe0, 0x73, 0x1a, 0xd2, 0x29, 0x9f, 0x0a, 0xce, 0xb9, 0xfe, 0xe4, 0x02, 0x1d, 0xde, 0xfe, 0x01, 0xa9, 0xa8, 0x35, 0xd0, 0x02, 0x5d, 0xb3, 0x25, 0x20, 0xad, 0xc5, 0x86, 0x15, 0xa0, 0xf1, 0xf7, 0x82, 0x0c, 0xd6, 0xaa, 0x38, 0x31, 0xc8, 0xbc, 0x09, 0xef, 0x9c, 0xab, 0x60, 0xe6, 0xb0, 0x14, 0x0a, 0xd5, 0xd3, 0x29, 0xca, 0x85, 0x22, 0xbc, 0xb3, 0xa2, 0x14, 0x9a, 0xe6, 0x3a, 0x46, 0x22, 0xb2, 0x1e, 0x1c, 0x2c, 0x67, 0x72, 0xcb, 0xe7, 0x62, 0xe2, 0x2f, 0xe4, 0x09, 0xc4, 0x5c, 0x44, 0xa2, 0x36, 0x57, 0x2f, 0x9c, 0x57, 0x8b, 0x4f, 0xd1, 0x22, 0xc4, 0x68, 0xbb, 0xe7, 0x88, 0x35, 0x7d, 0x8d, 0x65, 0xe7, 0xdc, 0x0c, 0x1c, 0x30, 0x7c, 0x2a, 0xc8, 0xc3, 0x41, 0xc4, 0x24, 0xb0, 0xa2, 0x8f, 0x2e, 0xb2, 0x79, 0xbe, 0xeb, 0x30, 0x21, 0x8e, 0xc6, 0xa2, 0x10, 0x7b, 0x82, 0x07, 0xdc, 0xbe, 0x17, 0x8e, 0xae, 0x03, 0x47, 0x3e, 0x1e, 0x82, 0x5c, 0x8e, 0x26, 0x87, 0x24, 0x0d, 0x12, 0xe3, 0xef, 0xd1, 0x7a, 0xfa, 0xd9, 0x19, 0x7f, 0xbd, 0x8d, 0xd6, 0xa8, 0xcf, 0x57, 0xb5, 0x39, 0xf8, 0x3d, 0xd6, 0x11, 0x8f, 0x7c, 0x3f, 0xb8, 0x86, 0x27, 0x17, 0xef, 0x09, 0x0f, 0x23, 0x2b, 0x85, 0x03, 0xa0, 0xe6, 0x22, 0xe5, 0xa3, 0x9f, 0x7f, 0xbb, 0xfe, 0xe5, 0xea, 0xd9, 0xcb, 0x18, 0x30, 0xd0, 0x9a, 0x3a, 0x8f, 0xab, 0x5f, 0x5e, 0xd0, 0x53, 0xed, 0x0b, 0xd1, 0x01, 0xb9, 0xaf, 0x5c, 0xac, 0xe7, 0x4c, 0x20, 0xd7, 0x06, 0x06, 0x12, 0xd2, 0xaa, 0xc9, 0x3c, 0xd8, 0xcf, 0x8f, 0x5f, 0xc3, 0xd5, 0x97, 0x68, 0xe1, 0x3c, 0x9b, 0xdd, 0x45, 0x2b, 0x7d, 0xe8, 0xde, 0xcb, 0x5c, 0x5e, 0xe6, 0x47, 0xfb, 0xb7, 0xeb, 0x07, 0xfb, 0xd1, 0xfe, 0xf5, 0x5a, 0x2f, 0x7e, 0x8a, 0x7f, 0x4a, 0xe2, 0xcf, 0x8f, 0x80, 0x4c, 0x9a, 0x99, 0xad, 0x3d, 0x6a, 0x5e, 0xc7, 0xa4, 0x7e, 0xf9, 0x10, 0x17, 0xb3, 0x9c, 0x23, 0x04, 0xff, 0xd7, 0x45, 0xe6, 0x64, 0x82, 0x51, 0x0a, 0x9e, 0x9d, 0xf3, 0x94, 0x0b, 0x79, 0x6e, 0x0d, 0xcf, 0x8f, 0x61, 0xfc, 0xf1, 0x2c, 0xf5, 0x1d, 0xd0, 0x01, 0x33, 0xb0, 0x8e, 0xb1, 0x5c, 0x20, 0x4f, 0x86, 0x39, 0x3b, 0xb6, 0x8d, 0x07, 0x34, 0x83, 0x95, 0x2a, 0x59, 0xde, 0x2e, 0xa1, 0xdf, 0x8e, 0x0c, 0x05, 0x54, 0x14, 0x43, 0xb8, 0xa8, 0xcd, 0x57, 0xac, 0x9f, 0xe7, 0x2a, 0x57, 0x1c, 0xde, 0x78, 0x76, 0xc9, 0x88, 0x8d, 0x72, 0x20, 0x59, 0x80, 0xbc, 0xf0, 0xa3, 0xe8, 0xf9, 0xc3, 0x7c, 0x1e, 0xdc, 0x9a, 0x4a, 0x75, 0x9d, 0x41, 0xf2, 0xb7, 0x8f, 0x75, 0x36, 0xb7, 0xac, 0x10, 0x59, 0xd2, 0x63, 0x5f, 0x41, 0xdf, 0x83, 0x6d, 0xd4, 0x30, 0x07, 0x49, 0xb1, 0x91, 0x9a, 0x5a, 0x62, 0x22, 0x88, 0x51, 0xf4, 0xe1, 0x1a, 0xfd, 0xb2, 0xd0, 0x6f, 0xe2, 0xd9, 0x74, 0xed, 0xbc, 0x59, 0xea, 0xdb, 0x07, 0x33, 0x76, 0xb8, 0xc6, 0x81, 0x6e, 0xb8, 0x85, 0xac, 0x9f, 0xcc, 0x5b, 0x43, 0x6e, 0x4d, 0x30, 0x1a, 0x0a, 0xed, 0x04, 0x1b, 0x47, 0x98, 0x6b, 0x9b, 0x66, 0xda, 0x6e, 0xa0, 0xd2, 0xa2, 0xb4, 0x0b, 0x98, 0x3e, 0xf0, 0xcf, 0xc1, 0xdd, 0x5d, 0xb8, 0xfa, 0x39, 0xd4, 0x77, 0xe6, 0xeb, 0x9b, 0x92, 0x54, 0x23, 0xdb, 0x71, 0xa6, 0x93, 0xe6, 0xd6, 0x73, 0x50, 0x5a, 0x10, 0xbf, 0x8d, 0x35, 0xc8, 0x2f, 0xe8, 0xd8, 0x2c, 0x52, 0xd4, 0xba, 0xc9, 0xb6, 0x15, 0xc1, 0xad, 0x2e, 0x5c, 0xe0, 0x40, 0x2b, 0x4c, 0x5e, 0x61, 0x96, 0x02, 0xa9, 0x6f, 0x08, 0xf2, 0x46, 0x73, 0xf4, 0xba, 0xf8, 0xe8, 0xd7, 0xe5, 0xe3, 0x4f, 0x5a, 0x27, 0x33, 0xfd, 0x13, 0xf4, 0xec, 0xf2, 0xb0, 0xa6, 0xae, 0xc8, 0x2b, 0xc8, 0xa2, 0xb9, 0xf5, 0xb1, 0x5c, 0xe4, 0xa5, 0x32, 0xdc, 0x70, 0xc0, 0xa1, 0x4d, 0xb1, 0xdb, 0xdc, 0xca, 0xef, 0xfc, 0xd7, 0xdb, 0x7f, 0x6c, 0x1c, 0xc8, 0x9e, 0x0b, 0x35, 0xd5, 0x17, 0x81, 0x6a, 0xaa, 0x5a, 0x0b, 0x73, 0xcf, 0x21, 0x85, 0x91, 0x40, 0x16, 0x74, 0x89, 0x5d, 0xf3, 0xc2, 0x8c, 0x2d, 0x9f, 0x87, 0x14, 0x3c, 0x90, 0x73, 0xe5, 0xd3, 0x19, 0xb6, 0xcb, 0xc1, 0x0d, 0xe0, 0xf1, 0xa9, 0x1d, 0x8d, 0x31, 0x9e, 0x48, 0xb9, 0x14, 0x3b, 0x3e, 0xfd, 0x0e, 0xa8, 0x63, 0x0f, 0xad, 0xe9, 0x17, 0x80, 0x3e, 0x35, 0xbc, 0x97, 0x3d, 0xa3, 0x51, 0xf0, 0x2b, 0x7d, 0xde, 0xeb, 0x4d, 0xd4, 0xc5, 0xa1, 0x50, 0x6f, 0xec, 0x78, 0xf0, 0xd1, 0x93, 0xc0, 0x19, 0x19, 0x66, 0x86, 0x74, 0x15, 0x26, 0x2c, 0x15, 0x12, 0xc8, 0x92, 0xf3, 0x90, 0x62, 0x53, 0x77, 0x04, 0x2d, 0xd7, 0x9d, 0xeb, 0x83, 0xe8, 0x4e, 0x33, 0xea, 0x18, 0x93, 0x48, 0xfc, 0xf2, 0xb0, 0x7c, 0x2c, 0x71, 0x30, 0x5a, 0x18, 0xdb, 0x3b, 0xfa, 0xf5, 0x5f, 0x63, 0xe7, 0xd9, 0x86, 0x8f, 0x33, 0x80, 0x0a, 0x31, 0xb6, 0xc5, 0x19, 0x46, 0x3d, 0x88, 0x7a, 0x0d, 0xf9, 0x82, 0x30, 0x4d, 0xd9, 0x90, 0xeb, 0x33, 0xc8, 0x14, 0xdc, 0x3f, 0xf6, 0x64, 0x9a, 0x40, 0xdd, 0xba, 0xe5, 0x0e, 0x30, 0x10, 0x05, 0x41, 0x8d, 0x40, 0x28, 0x18, 0x76, 0x19, 0x50, 0x3c, 0xaa, 0xfa, 0xfb, 0xe8, 0xed, 0xf2, 0x53, 0xb4, 0x0e, 0x75, 0x60, 0xfb, 0x9a, 0x11, 0x77, 0x48, 0x35, 0x16, 0xbc, 0xf0, 0xb8, 0xe5, 0xba, 0x86, 0x0b, 0x8f, 0x60, 0xa8, 0x27, 0xb1, 0x9b, 0x52, 0x65, 0x70, 0x51, 0x07, 0xc5, 0xe5, 0xe8, 0xab, 0x71, 0xf8, 0x14, 0xb7, 0x47, 0x20, 0xb7, 0xb5, 0xb6, 0x33, 0x5e, 0xda, 0xae, 0xa9, 0x30, 0xc4, 0x3f, 0x1a, 0x32, 0xc7, 0x6e, 0x38, 0xe7, 0x18, 0x2a, 0xc7, 0xad, 0xe6, 0x54, 0x9a, 0x44, 0x01, 0xc3, 0xce, 0x45, 0x58, 0x3b, 0x35, 0x50, 0x5c, 0xb0, 0x3e, 0x69, 0x0a, 0x2b, 0x1e, 0x0e, 0x5b, 0x22, 0x99, 0x18, 0x36, 0x0c, 0xe2, 0xda, 0xa9, 0x14, 0x97, 0x37, 0xce, 0x8b, 0xdb, 0xe5, 0xc3, 0xec, 0x48, 0xd3, 0x0a, 0xff, 0xd9, 0x1d, 0xa5, 0xff, 0xec, 0x72, 0xac, 0xe0, 0x08, 0x11, 0x15, 0x18, 0x4f, 0x23, 0x3e, 0x52, 0x76, 0xcc, 0x43, 0xc7, 0x9a, 0xa3, 0xa6, 0xd6, 0xbd, 0x01, 0xe4, 0x62, 0xf9, 0x54, 0x09, 0x19, 0x62, 0x8b, 0x4f, 0xce, 0xe4, 0x24, 0xfe, 0xd8, 0x13, 0x6c, 0x6f, 0x6c, 0x9d, 0xa5, 0xc6, 0x48, 0x01, 0x67, 0x14, 0x7d, 0xbc, 0xbe, 0x39, 0x1e, 0x30, 0x43, 0x3a, 0xcb, 0x46, 0xef, 0x82, 0x4f, 0xd1, 0xd4, 0x79, 0x3f, 0x1e, 0x5a, 0x67, 0x20, 0xb2, 0x43, 0x03, 0x25, 0x90, 0xe5, 0x30, 0x94, 0x99, 0x6d, 0x5e, 0x3a, 0xa6, 0x1a, 0x2c, 0x2e, 0xe0, 0xe4, 0x09, 0x69, 0xab, 0x5f, 0x88, 0x0f, 0x31, 0xd3, 0x23, 0xa8, 0x3b, 0xee, 0x26, 0x2e, 0x83, 0x70, 0x86, 0xc1, 0x02, 0x43, 0x77, 0x3b, 0xd2, 0x3c, 0x82, 0x6b, 0xa3, 0x3f, 0xf9, 0xd0, 0x2d, 0x8c, 0xce, 0x0e, 0x68, 0xcb, 0xe3, 0xfc, 0x36, 0xb8, 0xd7, 0x57, 0x55, 0x70, 0x17, 0xbe, 0x78, 0x98, 0x84, 0xd9, 0x98, 0x01, 0x72, 0x58, 0x98, 0xcf, 0xda, 0x02, 0x9f, 0x34, 0xf5, 0xd4, 0xa2, 0xe3, 0x8a, 0x7a, 0x9b, 0x4d, 0xc5, 0xb1, 0xd0, 0x22, 0x11, 0x9a, 0xb6, 0xcf, 0x57, 0xc5, 0x77, 0x0c, 0xf4, 0x49, 0x6b, 0x89, 0xa7, 0x90, 0xd7, 0x74, 0x33, 0xff, 0xa4, 0x72, 0x57, 0x66, 0xc9, 0x8f, 0xbb, 0xea, 0xae, 0x4b, 0xea, 0xdc, 0x30, 0x8c, 0xe3, 0x70, 0xa0, 0x87, 0x5f, 0x2e, 0x96, 0xab, 0x51, 0xf5, 0xa1, 0x61, 0xf8, 0x49, 0x09, 0x8b, 0x44, 0xb5, 0x02, 0xf7, 0x7c, 0x32, 0xe4, 0xf2, 0x94, 0xd6, 0xf9, 0x82, 0x24, 0x3b, 0xf4, 0x07, 0x27, 0xc2, 0x8e, 0x83, 0xf5, 0xc3, 0x6a, 0x91, 0xd3, 0xe7, 0x38, 0x33, 0xdb, 0x47, 0xb6, 0x7a, 0x23, 0xb7, 0xba, 0x99, 0x8d, 0x4e, 0xff, 0x2f, 0xac, 0xb4, 0x47, 0x5e, 0x34, 0x77, 0xfe, 0x52, 0x57, 0x08, 0x6d, 0xd3, 0x68, 0x66, 0x84, 0xec, 0xdc, 0x05, 0x14, 0x4c, 0x04, 0x7c, 0x06, 0x59, 0x28, 0xed, 0xeb, 0xcc, 0x95, 0xb2, 0xa3, 0xbe, 0xb6, 0xf1, 0x84, 0xb3, 0x54, 0xc0, 0x3f, 0xa2, 0x48, 0x3b, 0xd0, 0xc1, 0xfd, 0xbd, 0x36, 0xdc, 0x59, 0x29, 0xd9, 0x8e, 0x09, 0x76, 0xab, 0xc0, 0x6c, 0x43, 0x70, 0xd5, 0xaf, 0xe9, 0xaa, 0x4e, 0xb5, 0xd7, 0xcd, 0x48, 0x98, 0x25, 0xb6, 0x14, 0x5b, 0x4f, 0x24, 0xba, 0x41, 0x40, 0xf7, 0xc6, 0x63, 0xba, 0xa6, 0x3c, 0x3c, 0x2f, 0x97, 0xb7, 0x5f, 0x3f, 0x47, 0x8b, 0xe7, 0xc1, 0xaa, 0x97, 0x16, 0x70, 0x8b, 0x8c, 0x7b, 0x92, 0xbd, 0xe0, 0xf1, 0xfe, 0x52, 0x1f, 0x6b, 0xd6, 0x4a, 0x9a, 0xc5, 0x95, 0x86, 0xd3, 0x82, 0x64, 0xcd, 0x1c, 0x00, 0xf3, 0x3b, 0xf6, 0x2d, 0x6c, 0x5e, 0x66, 0xac, 0xdf, 0xb2, 0x8c, 0xbd, 0xb4, 0x19, 0xd9, 0x00, 0xa8, 0x02, 0x0e, 0xfb, 0x1f, 0xb8, 0xd5, 0xe0, 0xb8, 0x09, 0x38, 0xa4, 0x14, 0x1c, 0x5e, 0xe1, 0x16, 0x82, 0xfb, 0xc3, 0x71, 0x8c, 0x8d, 0xe2, 0xa2, 0x68, 0x8e, 0xb1, 0xa9, 0x8b, 0xcd, 0x1d, 0xde, 0xe8, 0x5d, 0xf8, 0x29, 0x70, 0x5e, 0xae, 0xa2, 0x6f, 0x61, 0xee, 0x08, 0x1d, 0x6b, 0x10, 0x08, 0x73, 0xe7, 0x98, 0x8c, 0x32, 0x33, 0x5d, 0xa0, 0xda, 0xae, 0x34, 0xeb, 0x25, 0x5c, 0x78, 0x97, 0xf9, 0xc7, 0x3d, 0x07, 0xbb, 0x86, 0xdb, 0x91, 0xe2, 0xfa, 0x20, 0xc3, 0xae, 0x1a, 0x5c, 0x09, 0x62, 0x48, 0xd7, 0xc1, 0xd7, 0xca, 0xc9, 0xb4, 0x1d, 0x19, 0x6e, 0x76, 0x77, 0x78, 0xdd, 0xb6, 0x0e, 0x5c, 0x8e, 0xc3, 0x70, 0xed, 0x2f, 0xc5, 0xa3, 0xa2, 0x20, 0x68, 0xc0, 0xc2, 0x25, 0xec, 0x22, 0x79, 0x17, 0x4d, 0x57, 0xcb, 0xfb, 0xe5, 0x7c, 0xed, 0xbc, 0x7c, 0x08, 0x6e, 0x9d, 0xb1, 0x16, 0xf8, 0x4b, 0x98, 0x29, 0x49, 0x27, 0xa7, 0x64, 0x47, 0xdf, 0x78, 0xc3, 0xa2, 0x6e, 0xcc, 0xcf, 0xaa, 0x52, 0xc5, 0xff, 0x4f, 0x2c, 0x28, 0x35, 0x61, 0x22, 0xad, 0xb3, 0x97, 0x66, 0x2c, 0xca, 0x4e, 0x94, 0x99, 0xe1, 0x4d, 0x17, 0x47, 0xa7, 0x40, 0xb1, 0xfc, 0x8c, 0xac, 0x63, 0x6d, 0xdc, 0xfe, 0x88, 0xb0, 0xb5, 0x33, 0xdf, 0xfb, 0xb5, 0xfd, 0x80, 0xbb, 0x5b, 0x74, 0x7a, 0x8a, 0xce, 0x7d, 0xf5, 0xc2, 0x1c, 0x53, 0x38, 0xab, 0x9d, 0x80, 0xf4, 0x0c, 0xdf, 0x27, 0xd6, 0x3c, 0x40, 0x28, 0x86, 0xac, 0x34, 0x02, 0x45, 0x25, 0x19, 0xc1, 0x6e, 0x26, 0xcb, 0xbf, 0x9c, 0x71, 0xb8, 0x8a, 0xc2, 0xfb, 0x5e, 0x93, 0x05, 0x67, 0xc7, 0x91, 0xc1, 0x67, 0x7c, 0xce, 0x99, 0x76, 0x99, 0x38, 0x17, 0x74, 0x66, 0x7c, 0x42, 0xe1, 0xd1, 0x19, 0x9f, 0x41, 0xdd, 0x97, 0xce, 0x46, 0xef, 0x96, 0xd3, 0x87, 0x75, 0xe8, 0xb8, 0x82, 0xdd, 0x0c, 0x91, 0x43, 0x04, 0x8f, 0x07, 0x43, 0xfe, 0x58, 0x82, 0xfd, 0x91, 0xa6, 0xd7, 0x0b, 0x3b, 0x5c, 0x81, 0x41, 0x2e, 0xc6, 0xe7, 0x9d, 0x06, 0xe8, 0x90, 0x2d, 0xf3, 0x47, 0xaf, 0x01, 0xd8, 0x0d, 0xd8, 0x02, 0x49, 0x56, 0x08, 0xa6, 0x53, 0x0c, 0xef, 0x04, 0x1e, 0x3d, 0xb0, 0x98, 0x03, 0x05, 0x46, 0x09, 0x7d, 0x8d, 0x69, 0xff, 0x5c, 0xe6, 0xf2, 0x93, 0x69, 0xdf, 0xd9, 0xe8, 0xfd, 0xab, 0x9b, 0x0f, 0x65, 0x3d, 0x59, 0x34, 0x8b, 0x90, 0xb7, 0xbd, 0x89, 0xdd, 0x58, 0x6c, 0x58, 0xf4, 0x3b, 0x64, 0xee, 0x52, 0xc4, 0xa4, 0x80, 0x5b, 0xd7, 0x61, 0xa6, 0x42, 0xfb, 0xc9, 0xa7, 0x79, 0xa2, 0x8b, 0xf7, 0xd1, 0x62, 0x1d, 0x2e, 0x66, 0xcb, 0xb6, 0x8d, 0xaf, 0x62, 0x0b, 0xbe, 0x38, 0x71, 0x72, 0x0d, 0xf0, 0x5a, 0xc1, 0x6a, 0x66, 0x71, 0xc1, 0x42, 0x28, 0x33, 0x90, 0x65, 0x79, 0x87, 0xa8, 0x9d, 0xc5, 0x57, 0xda, 0xa9, 0xdc, 0x1a, 0xb1, 0x6d, 0x88, 0x37, 0x6a, 0xcf, 0xc8, 0x5d, 0x74, 0x3f, 0x25, 0x89, 0x6e, 0x1c, 0xe6, 0x68, 0xc4, 0x4b, 0x21, 0xaa, 0x92, 0x4d, 0x9d, 0xe1, 0xd9, 0x31, 0x3f, 0x4b, 0x3b, 0xab, 0x8f, 0xe8, 0x9a, 0x82, 0xad, 0x34, 0x9f, 0xd2, 0xae, 0x4b, 0x16, 0x66, 0x09, 0x84, 0x1d, 0xc3, 0x92, 0x66, 0x0d, 0x02, 0x63, 0xa3, 0xf7, 0xe3, 0xdf, 0x2a, 0x1b, 0x87, 0xb5, 0xdc, 0x49, 0xe7, 0xb0, 0x7e, 0x82, 0xa4, 0x75, 0x98, 0xa6, 0x9d, 0xc3, 0xda, 0x8d, 0xda, 0xda, 0x65, 0xde, 0x3e, 0x5d, 0x65, 0x95, 0x4a, 0x35, 0x8f, 0x2f, 0x88, 0xfa, 0xa4, 0x15, 0x0f, 0xa1, 0x32, 0x58, 0xa7, 0x29, 0x83, 0x86, 0x07, 0x08, 0xf2, 0xb8, 0x10, 0xac, 0x0a, 0x20, 0x84, 0xa7, 0xa9, 0xed, 0x77, 0xf7, 0xea, 0xc6, 0xf6, 0x6d, 0x4a, 0xd8, 0x73, 0x02, 0xa3, 0xe9, 0x1c, 0x37, 0x36, 0x98, 0xce, 0x13, 0x6a, 0x17, 0x5d, 0xc2, 0xca, 0xdc, 0x53, 0x17, 0x20, 0xbe, 0x1b, 0x85, 0xb0, 0x9c, 0x69, 0xcc, 0x28, 0xe6, 0x74, 0xae, 0xcc, 0x70, 0xe9, 0xfb, 0x8f, 0xbf, 0xbc, 0xfc, 0xe5, 0x59, 0xf9, 0xe3, 0x9f, 0x2d, 0x6b, 0x5a, 0xf3, 0xb0, 0x6d, 0x8c, 0x07, 0x71, 0x15, 0xcd, 0x4d, 0xae, 0x0f, 0x1d, 0x0f, 0x6e, 0xf0, 0x98, 0xb5, 0xd1, 0x8f, 0x27, 0x3c, 0x82, 0x0c, 0x79, 0x2c, 0xcb, 0x98, 0xce, 0xb0, 0x2b, 0x51, 0x20, 0x0f, 0xb7, 0xc2, 0xd9, 0x3c, 0x0f, 0x0e, 0x7e, 0xb3, 0x9e, 0x3c, 0xb5, 0xca, 0x3d, 0x0f, 0x85, 0xe4, 0x3e, 0xe7, 0xfa, 0x17, 0x31, 0x16, 0x5d, 0x51, 0xcc, 0xf4, 0x6b, 0x83, 0xa8, 0xb8, 0xf4, 0x87, 0x88, 0x09, 0x5e, 0x05, 0x3e, 0x56, 0xae, 0x08, 0xd6, 0xa9, 0xec, 0x74, 0x12, 0xfa, 0xd2, 0xb0, 0x77, 0x7c, 0x80, 0x98, 0x68, 0x3c, 0x3c, 0xe3, 0x31, 0x62, 0x16, 0x82, 0x62, 0xe2, 0x4e, 0x61, 0x35, 0x0f, 0xd6, 0x68, 0xc9, 0xd1, 0x6f, 0xbf, 0xff, 0xab, 0x14, 0x11, 0x9a, 0x5a, 0x12, 0x2f, 0xb5, 0x24, 0x22, 0x63, 0x49, 0x64, 0x6c, 0x49, 0x6a, 0xa9, 0x8f, 0x0a, 0x7b, 0x09, 0x45, 0x77, 0x5e, 0xe5, 0xa2, 0xa3, 0xa3, 0x4a, 0x5b, 0x81, 0xe0, 0xea, 0x1d, 0x19, 0x2f, 0xad, 0xec, 0xb8, 0xcc, 0x85, 0x10, 0xe6, 0xa8, 0x6c, 0xb4, 0x48, 0x81, 0x1b, 0xb4, 0x3d, 0x0c, 0xdb, 0xa0, 0xb0, 0x0d, 0xbb, 0xb4, 0xdb, 0xaa, 0x21, 0xaa, 0x1e, 0x05, 0x61, 0x46, 0x2b, 0x25, 0x9a, 0x89, 0x19, 0x8c, 0xb6, 0x41, 0x0e, 0x46, 0x23, 0x01, 0x23, 0x49, 0x4c, 0x1b, 0x8d, 0xab, 0x97, 0x57, 0xce, 0xd5, 0x98, 0x39, 0xd7, 0xcb, 0xe9, 0x17, 0xe7, 0x45, 0xb0, 0x98, 0x3d, 0x96, 0xce, 0x5a, 0xdb, 0xc1, 0x74, 0x7b, 0x24, 0x9e, 0xea, 0x64, 0x7a, 0x1c, 0x6b, 0x51, 0xbb, 0x68, 0x4e, 0xa2, 0xcb, 0x09, 0x33, 0xe0, 0x14, 0x37, 0x99, 0x5e, 0xdd, 0x06, 0x8f, 0xe3, 0x75, 0xb0, 0x8e, 0x96, 0x8b, 0xa4, 0x80, 0x5a, 0x40, 0xcb, 0x2f, 0x77, 0x3d, 0xb7, 0x0d, 0xcc, 0x13, 0xc9, 0x58, 0xe3, 0x2a, 0xcf, 0xa2, 0x5b, 0x4a, 0x2b, 0x33, 0x36, 0x19, 0x6a, 0xe8, 0xc2, 0x74, 0x9a, 0xf4, 0x95, 0x94, 0x22, 0x2f, 0xe7, 0x91, 0x1b, 0x09, 0x79, 0x75, 0x84, 0x74, 0x48, 0xce, 0x25, 0x01, 0x8d, 0xcc, 0x30, 0x0f, 0x0f, 0xb1, 0x13, 0x74, 0xbc, 0x17, 0x62, 0xaa, 0x93, 0xc7, 0xec, 0x90, 0x97, 0xb2, 0xa9, 0xb4, 0xc3, 0x41, 0x62, 0x71, 0xb2, 0x02, 0x8e, 0x96, 0x69, 0x3d, 0x24, 0xa3, 0xab, 0xe5, 0x97, 0x2f, 0xe1, 0xe2, 0x00, 0x84, 0x09, 0x2d, 0xe8, 0x11, 0xda, 0x53, 0x21, 0xa0, 0x2f, 0x2a, 0x25, 0x5e, 0xa5, 0x02, 0x13, 0x78, 0x12, 0x69, 0xc2, 0x21, 0xd1, 0x4f, 0x47, 0x57, 0x63, 0xda, 0x4b, 0x0f, 0xc5, 0x7e, 0x3b, 0x27, 0x58, 0x65, 0xd3, 0x57, 0x4d, 0x51, 0x39, 0x0e, 0x52, 0xf8, 0xd4, 0x8e, 0x10, 0x7b, 0x2e, 0xcd, 0x31, 0x24, 0xc1, 0xfd, 0x71, 0xf8, 0x08, 0xe5, 0xb8, 0x4a, 0x9e, 0xda, 0x50, 0xa1, 0x81, 0xe1, 0x44, 0xf8, 0x5a, 0x2b, 0xb8, 0xfe, 0x0e, 0xfe, 0xf9, 0x9c, 0x87, 0x4d, 0xa0, 0xf4, 0x92, 0xe5, 0x3e, 0x71, 0xc7, 0xdc, 0x45, 0xba, 0x24, 0xcf, 0x6c, 0xd8, 0x8c, 0xb7, 0xd7, 0x9a, 0x80, 0xae, 0x3d, 0x3c, 0x01, 0xe1, 0x7d, 0x2e, 0x19, 0x3c, 0x72, 0xd9, 0x07, 0x17, 0xc2, 0x08, 0xb3, 0xc1, 0x16, 0xb9, 0xd7, 0x39, 0xb6, 0xd1, 0x12, 0xa4, 0x0d, 0xd1, 0x3a, 0x35, 0xc8, 0xb3, 0x84, 0x4a, 0x62, 0x78, 0x80, 0x70, 0x17, 0x27, 0x80, 0x84, 0xd1, 0x3e, 0x7c, 0xb9, 0x4c, 0x0d, 0x12, 0x94, 0xa2, 0xd5, 0x9d, 0xf2, 0xa4, 0xd0, 0xe6, 0x59, 0xab, 0xcb, 0x7b, 0x03, 0xe5, 0xec, 0xec, 0x4b, 0x15, 0x3a, 0xfa, 0x4a, 0x0a, 0x2b, 0xd0, 0xa9, 0x62, 0xd8, 0xda, 0x4f, 0x95, 0xf1, 0xc7, 0x56, 0x19, 0xb4, 0xda, 0x68, 0xe6, 0xc7, 0xfa, 0x14, 0x5a, 0x53, 0x34, 0x53, 0x03, 0xd1, 0xfc, 0xa2, 0x40, 0x1b, 0xe8, 0x4c, 0x4d, 0x06, 0xb6, 0x46, 0x81, 0x2e, 0xe8, 0x5c, 0x74, 0x27, 0x69, 0x8d, 0x03, 0xb7, 0x06, 0xfb, 0x11, 0x8d, 0x93, 0x43, 0x59, 0xbc, 0xf9, 0x0d, 0x9a, 0x42, 0xdb, 0x1b, 0x9f, 0xde, 0x93, 0x28, 0xbb, 0x9b, 0x9d, 0xdd, 0xac, 0x8e, 0x65, 0xdc, 0x45, 0xe2, 0x59, 0xec, 0x27, 0x36, 0xbb, 0x2b, 0xb8, 0x5d, 0x37, 0x49, 0x2b, 0xb1, 0x91, 0x4f, 0x00, 0x1b, 0xd5, 0x88, 0x8d, 0xc2, 0xd6, 0x51, 0x68, 0x83, 0x32, 0x7d, 0x62, 0x86, 0x51, 0x4f, 0x9a, 0x39, 0x8b, 0xa6, 0x53, 0x35, 0x84, 0x46, 0x3a, 0xc3, 0x37, 0xeb, 0x31, 0xb3, 0x71, 0xc3, 0x37, 0xf4, 0xfc, 0xb8, 0x30, 0x10, 0x47, 0x53, 0x5a, 0x1b, 0x9e, 0x5d, 0xb2, 0xfa, 0xdb, 0x60, 0xd1, 0x8f, 0xf4, 0xb6, 0x11, 0x1f, 0xe3, 0x25, 0x8e, 0x49, 0x48, 0x86, 0x13, 0xd1, 0x2e, 0x2e, 0x97, 0x76, 0xfb, 0x57, 0x90, 0x33, 0x62, 0x59, 0x00, 0x8a, 0x24, 0x62, 0xf6, 0xfb, 0x98, 0x76, 0x76, 0x64, 0xa3, 0x80, 0x56, 0x54, 0x18, 0xb8, 0xeb, 0xdf, 0xe4, 0x9e, 0xa3, 0xcf, 0x87, 0xcd, 0xe8, 0xc8, 0x3c, 0x68, 0x76, 0x90, 0x62, 0xe5, 0x07, 0x88, 0x3a, 0x88, 0xa1, 0xe9, 0x18, 0xb0, 0x02, 0x29, 0x69, 0x58, 0xc5, 0xe0, 0xcb, 0x35, 0x73, 0xbd, 0x38, 0xc9, 0x4a, 0x30, 0x85, 0xc7, 0x06, 0x8c, 0x8c, 0x67, 0x58, 0xd7, 0xb0, 0xca, 0x81, 0x9b, 0x41, 0xec, 0x6e, 0x10, 0x8a, 0x53, 0x80, 0xfe, 0x70, 0x91, 0x41, 0x92, 0x0e, 0x3c, 0x3f, 0x68, 0x64, 0x24, 0x9e, 0x24, 0xc3, 0x5e, 0x8c, 0x2b, 0x76, 0x06, 0x8d, 0x8c, 0x8f, 0xfe, 0x9d, 0xc4, 0x05, 0x03, 0xb8, 0x72, 0x08, 0x27, 0x8d, 0x38, 0x8e, 0xc2, 0xf8, 0x07, 0xb9, 0xa6, 0x4f, 0x12, 0x18, 0x81, 0xc4, 0xd6, 0x02, 0x19, 0x6f, 0xc0, 0xe9, 0x25, 0x38, 0x25, 0x04, 0xde, 0x8c, 0xc2, 0x41, 0x80, 0x41, 0xaf, 0x5f, 0x42, 0x4e, 0x24, 0x81, 0x1e, 0x1d, 0xb4, 0x3e, 0x7b, 0xe6, 0x8a, 0xc2, 0xdc, 0x30, 0xfa, 0x79, 0x4f, 0x12, 0x1d, 0xd1, 0x16, 0x9d, 0x62, 0xd0, 0x1d, 0x4a, 0x77, 0x5a, 0x48, 0x49, 0x88, 0xa3, 0xe6, 0xb4, 0x8e, 0x1d, 0x5b, 0xd6, 0x00, 0x34, 0xaf, 0x00, 0x68, 0x48, 0x59, 0x09, 0x33, 0x9a, 0x6a, 0x18, 0x55, 0x19, 0xf6, 0x3f, 0x99, 0xde, 0x39, 0x1f, 0xd7, 0x76, 0xd0, 0x26, 0x74, 0x86, 0x10, 0x5d, 0x22, 0xa9, 0x2a, 0xb0, 0x37, 0xe0, 0x1c, 0x23, 0x44, 0x59, 0x31, 0xc5, 0x3d, 0x4c, 0x81, 0xb3, 0xca, 0x13, 0x36, 0x08, 0xfb, 0x83, 0x83, 0xb5, 0x0a, 0xc7, 0x51, 0x14, 0xc6, 0xdd, 0x3e, 0x4e, 0xba, 0x4a, 0x5c, 0xe3, 0x29, 0xb0, 0x66, 0x37, 0x60, 0x74, 0x6c, 0xc4, 0x89, 0xd5, 0x3a, 0xb8, 0xc9, 0x4d, 0x42, 0x0b, 0x87, 0x93, 0x61, 0xb5, 0x9e, 0x7f, 0x7a, 0xe8, 0x54, 0x75, 0xc9, 0xec, 0x17, 0x26, 0x98, 0x83, 0xc4, 0x6e, 0x29, 0xb3, 0x90, 0x17, 0x23, 0x09, 0xd7, 0xc4, 0xa0, 0xa0, 0x4e, 0xa3, 0xff, 0x0d, 0x16, 0x93, 0xc0, 0xe1, 0xd7, 0xcf, 0x5e, 0xf7, 0x3f, 0xa8, 0x73, 0x98, 0xbd, 0x2f, 0x75, 0xbc, 0xaa, 0xc8, 0xee, 0x6f, 0xb8, 0x53, 0x70, 0xc8, 0xd1, 0x93, 0x66, 0x2e, 0xd4, 0xd2, 0x4d, 0x8c, 0xae, 0x83, 0x7f, 0x87, 0x2b, 0xe7, 0xd7, 0x87, 0xc5, 0xa7, 0xdb, 0x70, 0x1a, 0xac, 0x87, 0xe3, 0x18, 0xc7, 0x77, 0xf7, 0xdc, 0xa3, 0x0a, 0x77, 0xd7, 0xcd, 0xdd, 0x49, 0xee, 0xee, 0x36, 0xc8, 0xfc, 0x33, 0xba, 0xff, 0x1c, 0x0d, 0xec, 0xe2, 0xc6, 0x43, 0xe2, 0x59, 0x4e, 0x55, 0xdc, 0xaf, 0x82, 0x8c, 0x43, 0x0c, 0x2d, 0x30, 0xb4, 0xe3, 0xb5, 0x82, 0x66, 0x8f, 0x97, 0xf6, 0x71, 0x77, 0xfb, 0xc5, 0x9a, 0xc3, 0x28, 0x31, 0x9f, 0x84, 0xab, 0x4a, 0x34, 0xe7, 0x3a, 0x88, 0xfe, 0xef, 0xc1, 0x79, 0xb7, 0x9c, 0x44, 0x25, 0x5b, 0xc9, 0x9e, 0x74, 0x87, 0x40, 0x02, 0x8c, 0xba, 0x00, 0x53, 0x0e, 0x8c, 0x6b, 0xaa, 0x97, 0x93, 0x78, 0xaa, 0xc6, 0x00, 0x33, 0x0e, 0x57, 0xdf, 0x82, 0xdb, 0xed, 0x06, 0x8c, 0x4e, 0xc8, 0xc8, 0xd4, 0xb7, 0xa9, 0x05, 0xd2, 0x93, 0xbe, 0xf0, 0x94, 0xa0, 0xae, 0xd0, 0x76, 0x26, 0x5e, 0x71, 0xcd, 0x29, 0x50, 0xd5, 0xe9, 0x0b, 0xf3, 0x3a, 0x84, 0xb5, 0xd6, 0xcf, 0xa3, 0x75, 0x4c, 0x7b, 0x55, 0x98, 0x36, 0xdf, 0xf3, 0xd2, 0x05, 0xd9, 0x4c, 0x15, 0xe3, 0x75, 0x58, 0xa7, 0x40, 0x39, 0x51, 0x1e, 0x34, 0xe8, 0xe2, 0x06, 0x3a, 0xc2, 0x27, 0xfa, 0xb3, 0x8f, 0xcd, 0xba, 0x38, 0x03, 0x90, 0x95, 0xb6, 0x69, 0x6a, 0x70, 0xa7, 0x99, 0xea, 0xad, 0xb7, 0xb3, 0x4b, 0x2c, 0xff, 0x78, 0x76, 0x93, 0x94, 0xc9, 0xe5, 0x43, 0x0e, 0x1f, 0x4b, 0x41, 0x92, 0x9c, 0xbc, 0x00, 0xa9, 0x8e, 0x71, 0x24, 0x47, 0x94, 0x4a, 0xeb, 0x5d, 0xdc, 0x3a, 0x9d, 0xea, 0x5b, 0x9b, 0x35, 0x33, 0xdb, 0x69, 0x18, 0x51, 0x25, 0x19, 0x89, 0xb6, 0xab, 0x66, 0x88, 0x99, 0xca, 0x47, 0x26, 0x50, 0x8e, 0xec, 0x57, 0xa6, 0x41, 0x4f, 0xa1, 0x07, 0x2b, 0x0f, 0xf1, 0xf0, 0x79, 0x07, 0xb6, 0x6c, 0x45, 0x4b, 0x4b, 0x61, 0x30, 0xf4, 0x27, 0xc8, 0xd8, 0xc3, 0xec, 0x78, 0x94, 0x17, 0x93, 0x76, 0x82, 0x3b, 0x6a, 0x84, 0x89, 0x66, 0xce, 0xd5, 0x72, 0xfa, 0x25, 0x5c, 0x97, 0xec, 0x54, 0xee, 0x27, 0x7d, 0xbd, 0x55, 0xeb, 0x65, 0x4f, 0xcd, 0x96, 0xf5, 0xcc, 0x51, 0xcc, 0x40, 0x70, 0x1b, 0x2d, 0xbe, 0x64, 0xc6, 0xbc, 0xb7, 0x95, 0x3d, 0x79, 0xa4, 0xf2, 0xc8, 0xda, 0xb7, 0x94, 0x0f, 0x26, 0x17, 0xcc, 0x98, 0x89, 0xac, 0x19, 0x26, 0x6c, 0xec, 0xb1, 0xfe, 0x7d, 0xfc, 0x1c, 0x87, 0xd5, 0xf1, 0x37, 0x57, 0xcb, 0xd5, 0xba, 0x62, 0x56, 0x5d, 0x64, 0xb6, 0x80, 0x79, 0xe9, 0xb0, 0xba, 0x44, 0x21, 0xf0, 0x0d, 0x66, 0x56, 0x35, 0xf9, 0xe9, 0x55, 0x96, 0xde, 0x64, 0xf6, 0xe0, 0x5b, 0x66, 0x83, 0x0c, 0x69, 0x54, 0xc1, 0x3a, 0xbb, 0x6d, 0xa8, 0x0e, 0x62, 0xeb, 0x5c, 0xd1, 0x25, 0x0d, 0x9d, 0x0e, 0xc0, 0x8d, 0x2a, 0x70, 0x5e, 0x62, 0xa6, 0x7d, 0x14, 0x01, 0x73, 0x26, 0x32, 0x04, 0xd3, 0xf0, 0x74, 0x05, 0x4f, 0xec, 0xa0, 0xe5, 0x99, 0x84, 0xb9, 0x2b, 0x2d, 0xbe, 0xb6, 0x86, 0x38, 0x94, 0x9f, 0x0a, 0x8e, 0x76, 0x3c, 0x95, 0x3c, 0x56, 0x44, 0x9a, 0x68, 0xa2, 0xbf, 0x17, 0x3b, 0x4e, 0x93, 0x30, 0xbe, 0xe2, 0xe8, 0x60, 0xbd, 0x5d, 0x61, 0x85, 0xdd, 0xc3, 0x31, 0x42, 0xcf, 0x30, 0xf6, 0x00, 0xc5, 0x11, 0x04, 0xb2, 0xa7, 0xfd, 0xfc, 0x66, 0x89, 0x12, 0x2e, 0xe7, 0x35, 0x59, 0x1a, 0x02, 0x45, 0x5e, 0x34, 0x08, 0x50, 0xf8, 0xd5, 0x8a, 0x97, 0xce, 0xbb, 0x59, 0x16, 0x91, 0x7e, 0x73, 0x37, 0x7d, 0x2d, 0x63, 0x6c, 0x22, 0x83, 0xd8, 0x0f, 0xe9, 0x33, 0xc3, 0xb2, 0x27, 0x66, 0xfe, 0x90, 0xef, 0x8d, 0xe3, 0x35, 0x08, 0x35, 0x2c, 0x08, 0x4f, 0xb5, 0xbd, 0x7a, 0xb8, 0x9b, 0xdc, 0x86, 0xb0, 0xec, 0x93, 0xee, 0x8f, 0x03, 0xf2, 0x60, 0xb4, 0x98, 0xbc, 0xaa, 0x29, 0xdd, 0x12, 0xe2, 0x52, 0x2c, 0x72, 0x0a, 0x66, 0xb5, 0x08, 0x0b, 0x9d, 0x62, 0x34, 0x0e, 0x16, 0xdf, 0x03, 0x07, 0xc6, 0xbe, 0x7e, 0x5b, 0xdc, 0xe2, 0xa2, 0xda, 0x24, 0xc4, 0x2a, 0x7a, 0xcd, 0xac, 0xcb, 0x11, 0x88, 0x15, 0x9c, 0x57, 0x91, 0xd7, 0xc5, 0xf9, 0x47, 0xec, 0x8a, 0x52, 0xd2, 0x5c, 0x71, 0x9e, 0x71, 0x12, 0x47, 0xc6, 0x8b, 0xdf, 0x6f, 0x5f, 0x54, 0x9b, 0xc4, 0x5a, 0x1c, 0xf2, 0x67, 0x82, 0x97, 0x26, 0x77, 0x85, 0x98, 0x6a, 0x05, 0xb6, 0x3b, 0x09, 0x23, 0x1c, 0x18, 0x20, 0x9c, 0x60, 0x2e, 0x11, 0xac, 0xaf, 0xc9, 0xca, 0x24, 0xe8, 0xaa, 0x99, 0x13, 0xf3, 0xdb, 0x92, 0x0b, 0xe2, 0xc6, 0x74, 0x8a, 0x54, 0xfa, 0xe0, 0xbc, 0x2b, 0x74, 0xe8, 0x39, 0x32, 0xcd, 0xc2, 0x6b, 0x3a, 0xe3, 0xf7, 0xe3, 0x32, 0x53, 0xb0, 0x45, 0xb5, 0xc3, 0x36, 0x35, 0xe3, 0x5a, 0x62, 0x99, 0x5b, 0x5f, 0x08, 0xe3, 0x37, 0xce, 0xcf, 0xa2, 0x64, 0x5d, 0x89, 0xdf, 0x67, 0xd6, 0x5b, 0xed, 0x3c, 0x54, 0xdd, 0x69, 0xcb, 0x84, 0xf1, 0xb1, 0xeb, 0x08, 0x6a, 0x0c, 0x2d, 0x2c, 0x35, 0x6c, 0xb9, 0x40, 0x07, 0x6a, 0xba, 0x5c, 0xed, 0x56, 0x05, 0x5e, 0x89, 0xca, 0x19, 0xe6, 0x79, 0x1b, 0x46, 0x78, 0xb0, 0x59, 0x86, 0x62, 0xd2, 0x9f, 0xe1, 0x84, 0x24, 0xb4, 0xce, 0x70, 0xb3, 0x9e, 0x4e, 0xf2, 0x81, 0xaa, 0x07, 0x45, 0x95, 0x20, 0xb8, 0x67, 0xcd, 0x72, 0xc4, 0x4a, 0xb3, 0x0e, 0x18, 0x73, 0xbc, 0xa3, 0xf1, 0x7b, 0xe6, 0x3a, 0x57, 0x57, 0x3d, 0x84, 0x1f, 0xa7, 0x36, 0x02, 0xc7, 0xea, 0xf6, 0x16, 0x82, 0x1b, 0x81, 0x75, 0x12, 0xdb, 0x75, 0x66, 0xf8, 0xef, 0xb8, 0x61, 0x35, 0x1b, 0x81, 0x47, 0x59, 0xad, 0x27, 0xdd, 0xed, 0x7d, 0x1d, 0x81, 0x53, 0xd3, 0x1b, 0x34, 0xfc, 0x7c, 0x34, 0xf6, 0xe2, 0x0b, 0xcb, 0xa9, 0x5d, 0x17, 0x1f, 0x36, 0x4b, 0x87, 0x7d, 0x12, 0x0f, 0x5d, 0xa0, 0xb6, 0x8f, 0xb9, 0x25, 0xf3, 0x0f, 0x5d, 0xe2, 0xef, 0xf6, 0xa7, 0x7e, 0xf5, 0xf9, 0x23, 0x56, 0xb7, 0x7e, 0xcf, 0xc5, 0x65, 0xf3, 0x30, 0x56, 0x61, 0x66, 0xc7, 0xcd, 0x56, 0x35, 0x6c, 0x49, 0x04, 0xff, 0x66, 0xb9, 0x78, 0x74, 0xae, 0xc6, 0x57, 0x65, 0x6e, 0x96, 0xea, 0xc5, 0xed, 0x6c, 0x72, 0x33, 0x63, 0xff, 0xcc, 0x6b, 0xca, 0x46, 0x62, 0xcf, 0x97, 0xa9, 0xa8, 0x73, 0x74, 0x62, 0xd0, 0x57, 0xc3, 0xcf, 0xb0, 0x58, 0x41, 0x18, 0x59, 0x3e, 0x46, 0xeb, 0x60, 0xfb, 0x80, 0xa3, 0xcc, 0x1a, 0xb6, 0xdd, 0x0d, 0x51, 0x66, 0xd1, 0x1a, 0x02, 0x03, 0xad, 0x51, 0x73, 0x5c, 0xea, 0x36, 0x45, 0x12, 0x91, 0xa9, 0xfe, 0x62, 0x10, 0xd2, 0x2a, 0xdc, 0x8e, 0x28, 0xf5, 0xd9, 0x5d, 0x07, 0xb3, 0x28, 0x18, 0x78, 0x9b, 0x49, 0x8a, 0x87, 0x24, 0x3c, 0x64, 0x1e, 0xf7, 0x04, 0xa3, 0x33, 0xbb, 0xd3, 0x97, 0xc3, 0xf9, 0x6b, 0x83, 0xd2, 0xd9, 0x0e, 0x8d, 0xcd, 0x42, 0xea, 0x99, 0x42, 0x1d, 0x21, 0xae, 0x61, 0x79, 0xb3, 0x66, 0x67, 0x1d, 0x06, 0x77, 0x75, 0x52, 0xcb, 0x58, 0x68, 0x6f, 0x83, 0xac, 0x76, 0x27, 0x66, 0x9d, 0x02, 0x1f, 0x67, 0x2a, 0x91, 0xea, 0x28, 0x91, 0x7c, 0x2a, 0x12, 0x69, 0x39, 0x50, 0x06, 0xea, 0x12, 0x73, 0x9b, 0xcd, 0x55, 0x88, 0x64, 0xbd, 0x5a, 0xa2, 0xf0, 0xd6, 0x52, 0x9e, 0xbf, 0x8f, 0xee, 0x26, 0x0f, 0xf7, 0xfd, 0xed, 0xab, 0xdd, 0xb6, 0x9f, 0xa7, 0x29, 0xab, 0xd1, 0xb8, 0x9d, 0xda, 0xc5, 0xc4, 0x8f, 0x8f, 0x6d, 0x5f, 0x8a, 0x11, 0x3b, 0x9d, 0x06, 0x03, 0xf8, 0xb0, 0x3f, 0x60, 0x53, 0x64, 0x1d, 0xd5, 0xe7, 0xe4, 0x6e, 0xef, 0x73, 0x66, 0xc5, 0xea, 0xe6, 0x6a, 0xe6, 0x85, 0x6b, 0xb8, 0xe0, 0x39, 0x57, 0x22, 0xa8, 0xe1, 0x3d, 0xfd, 0xf0, 0xe6, 0xcf, 0x23, 0x35, 0xa6, 0x1f, 0x9f, 0x61, 0x81, 0x62, 0x47, 0x16, 0x67, 0xf1, 0x08, 0x03, 0xc5, 0x69, 0x32, 0x69, 0xd6, 0x1a, 0x31, 0x39, 0x64, 0x6c, 0x92, 0x06, 0xda, 0xb9, 0x6b, 0x4e, 0x7d, 0x38, 0x73, 0x73, 0x1d, 0xc6, 0x1f, 0x3e, 0xaf, 0x1e, 0xee, 0xd7, 0xef, 0x82, 0x7b, 0xed, 0xcd, 0x3a, 0xe1, 0xf8, 0x7b, 0xf0, 0xb5, 0x89, 0x5c, 0xf9, 0xf8, 0x0d, 0x04, 0xfd, 0x5c, 0xd9, 0x5c, 0x29, 0x28, 0x4a, 0x64, 0xf6, 0x42, 0xe1, 0x4a, 0x6f, 0x85, 0xa4, 0x58, 0x92, 0x8d, 0x3e, 0x7c, 0x8f, 0x16, 0xce, 0xaf, 0xcb, 0x47, 0x7c, 0xdc, 0xdc, 0x12, 0x37, 0xeb, 0x7c, 0x7a, 0xbd, 0x2c, 0x51, 0x89, 0xf7, 0xde, 0x14, 0x3a, 0xd9, 0x68, 0x0b, 0x3c, 0x92, 0xdd, 0x38, 0xc9, 0xea, 0x9c, 0x42, 0x42, 0x54, 0xd4, 0xd1, 0x00, 0x51, 0x3f, 0xe3, 0xce, 0xba, 0x15, 0x0b, 0x94, 0x28, 0x16, 0xb2, 0xb8, 0x75, 0xd1, 0x3d, 0x3b, 0x8a, 0x27, 0x31, 0x46, 0xf2, 0x47, 0x1f, 0x83, 0xdb, 0x6f, 0xa1, 0xd3, 0x78, 0x25, 0xee, 0xd3, 0x01, 0xcc, 0x03, 0xf4, 0x35, 0x98, 0xcd, 0x6e, 0x43, 0x62, 0xfc, 0x73, 0xfc, 0x4c, 0x51, 0xc4, 0x56, 0x27, 0x6e, 0xdb, 0xf1, 0x55, 0x8e, 0xe5, 0x56, 0x68, 0x29, 0xa6, 0x98, 0x27, 0x63, 0xcc, 0xcc, 0xc4, 0x20, 0x0d, 0xce, 0x05, 0x23, 0xcc, 0x24, 0x7a, 0xa8, 0x3d, 0xc4, 0x0c, 0x75, 0xe2, 0x8a, 0x19, 0xac, 0xb9, 0x9b, 0x42, 0xed, 0x68, 0x5f, 0xeb, 0xc9, 0x4e, 0x71, 0x29, 0x19, 0xb3, 0x0c, 0x02, 0x1c, 0xd3, 0xc3, 0xb8, 0xf4, 0x18, 0x4b, 0xc2, 0x9e, 0xa9, 0x5d, 0x0f, 0x09, 0x8b, 0x84, 0x0b, 0x39, 0x34, 0x97, 0x93, 0x17, 0xba, 0x34, 0x47, 0x78, 0x83, 0xdb, 0x78, 0x98, 0x74, 0x07, 0x4d, 0x3c, 0xe1, 0x63, 0x75, 0xc1, 0xc7, 0x2a, 0x83, 0xd9, 0x43, 0x46, 0x63, 0x7a, 0x05, 0x29, 0x5b, 0x42, 0x74, 0x46, 0x93, 0xa9, 0x86, 0xef, 0xd9, 0x74, 0xe0, 0x78, 0xb8, 0x16, 0x5c, 0xe2, 0x59, 0xc1, 0x4a, 0xc4, 0x13, 0x13, 0x57, 0x40, 0x29, 0x61, 0xae, 0x3c, 0x8a, 0xcd, 0x46, 0xcc, 0xcd, 0x74, 0x4e, 0x21, 0xe9, 0x64, 0x2b, 0x71, 0x87, 0xc0, 0x2f, 0x29, 0xb0, 0x0c, 0x45, 0xec, 0x92, 0x66, 0x8e, 0x05, 0x29, 0x18, 0x40, 0xf5, 0xd1, 0x68, 0x3e, 0xb5, 0x53, 0x60, 0x9b, 0xb7, 0xcc, 0x34, 0x36, 0xc3, 0xad, 0x31, 0xcc, 0xf0, 0xa4, 0x21, 0xc5, 0x9e, 0xf7, 0xc4, 0xc4, 0xe5, 0xd0, 0xb9, 0x11, 0x22, 0x25, 0xad, 0x16, 0x54, 0x9f, 0x01, 0x58, 0x33, 0x66, 0xcf, 0x05, 0x24, 0xb2, 0x8d, 0xb8, 0xc7, 0x3e, 0x01, 0xc7, 0x6d, 0x89, 0xe7, 0x33, 0xc0, 0x06, 0xa2, 0x7e, 0x05, 0x19, 0x00, 0x09, 0x9d, 0xbc, 0x59, 0x9c, 0x2e, 0x18, 0x61, 0x07, 0x13, 0xc3, 0x22, 0x2c, 0xb1, 0x43, 0xfb, 0x12, 0xd3, 0x3f, 0xd2, 0x74, 0xb2, 0x48, 0xde, 0x88, 0xd1, 0xb6, 0x93, 0x15, 0xc4, 0x3f, 0xbf, 0xf5, 0x13, 0xd6, 0xe5, 0xf2, 0x89, 0x6b, 0xd7, 0x71, 0xb8, 0x2a, 0x75, 0xb9, 0x7e, 0x5b, 0x84, 0xf5, 0x38, 0x6d, 0xa1, 0x1b, 0xb4, 0x47, 0xb9, 0x4b, 0xea, 0x18, 0x1d, 0xe5, 0x0e, 0x5d, 0x37, 0xde, 0x59, 0x16, 0xb6, 0x96, 0xdb, 0xdf, 0x3e, 0xf3, 0x51, 0xd7, 0x05, 0xd6, 0x0a, 0x9a, 0xfc, 0x90, 0x35, 0x91, 0x5b, 0x54, 0xad, 0x55, 0xf3, 0xd2, 0x9a, 0x02, 0x3a, 0xc9, 0x5c, 0x49, 0xef, 0xe8, 0x58, 0x05, 0xe2, 0x75, 0x30, 0x79, 0xbb, 0xa2, 0xa4, 0xf6, 0x0a, 0xd2, 0x7c, 0xb6, 0x05, 0x48, 0x4f, 0x72, 0xfa, 0x06, 0x37, 0x10, 0x4b, 0x69, 0xf8, 0x5c, 0xa5, 0x6d, 0x25, 0x54, 0xa6, 0x99, 0x0e, 0xda, 0x20, 0xba, 0x21, 0xf3, 0xe4, 0xd8, 0x76, 0xb8, 0xe5, 0x7c, 0x63, 0xb6, 0x19, 0x44, 0x58, 0x22, 0x2b, 0x0f, 0x1b, 0x6b, 0x65, 0xb7, 0xc3, 0xd5, 0xf5, 0x6a, 0x72, 0x4f, 0xc2, 0x10, 0x35, 0x6c, 0x47, 0x84, 0x06, 0x5d, 0x1f, 0x57, 0x2b, 0x53, 0xc9, 0x6d, 0x02, 0x5f, 0x30, 0x6e, 0xc7, 0x18, 0xbc, 0x81, 0xeb, 0x8f, 0xc4, 0x7c, 0x19, 0xb1, 0x73, 0xc5, 0xcc, 0x46, 0x04, 0xc0, 0xdc, 0x04, 0x0e, 0x0e, 0x6b, 0x85, 0x0e, 0x11, 0x67, 0x18, 0x14, 0x97, 0x6f, 0x60, 0x68, 0x2b, 0xef, 0x53, 0x0f, 0x8a, 0x8b, 0xf7, 0x11, 0x8c, 0x3b, 0x6e, 0x66, 0xcf, 0x00, 0xa7, 0x57, 0xb7, 0xd1, 0x3a, 0x74, 0xe8, 0x31, 0xb3, 0x68, 0x27, 0xea, 0xfd, 0x6d, 0x40, 0x35, 0xbe, 0x30, 0x00, 0x27, 0x20, 0x05, 0x17, 0x90, 0x3a, 0x38, 0x81, 0x6a, 0x7e, 0x01, 0xa9, 0x02, 0x24, 0x42, 0xcb, 0x2c, 0x93, 0xed, 0xbf, 0xb8, 0x18, 0xa5, 0x18, 0x25, 0x56, 0xe0, 0xc7, 0x68, 0x89, 0xd2, 0x13, 0xe6, 0x1c, 0x14, 0x76, 0x18, 0x4d, 0x9a, 0xf6, 0x49, 0xac, 0x97, 0x61, 0x27, 0x0f, 0x16, 0x45, 0xfc, 0xfd, 0x21, 0x74, 0xb6, 0x47, 0x8e, 0x28, 0x43, 0xb6, 0xc2, 0x39, 0x23, 0x79, 0x65, 0x8a, 0x82, 0xe5, 0xbb, 0xe8, 0x08, 0xa1, 0xe9, 0xce, 0x0d, 0x30, 0x81, 0xdc, 0x61, 0xad, 0xe8, 0xdf, 0x7e, 0xf8, 0xbb, 0x13, 0xfd, 0x36, 0x4e, 0x01, 0x0a, 0x2c, 0x93, 0x5c, 0xdc, 0xd0, 0x87, 0x3d, 0x7e, 0x33, 0x97, 0x8c, 0xfe, 0x7b, 0xfb, 0xae, 0x37, 0xab, 0x2d, 0xb2, 0xb4, 0xe1, 0x6f, 0x97, 0x1e, 0xbf, 0xca, 0x60, 0xaa, 0x28, 0xb0, 0x16, 0x71, 0x54, 0x2d, 0x23, 0x9f, 0xbb, 0xf2, 0xa9, 0xcb, 0x38, 0x9d, 0xbb, 0xaa, 0x27, 0x19, 0x6b, 0x1b, 0x37, 0xe5, 0xb6, 0x02, 0x77, 0xca, 0x49, 0x75, 0x16, 0x7f, 0x56, 0x26, 0xbe, 0x39, 0xd7, 0x3b, 0xb6, 0x29, 0x1d, 0x41, 0x7a, 0x7b, 0xb4, 0xfd, 0xee, 0x30, 0xcc, 0x7b, 0x84, 0xc1, 0x6a, 0x83, 0x7f, 0x32, 0x78, 0x94, 0xf3, 0x3f, 0x54, 0x00, 0x42, 0x73, 0xe6, 0x8d, 0xee, 0xe5, 0xe8, 0x6f, 0x88, 0xd6, 0xf9, 0xf1, 0xac, 0x65, 0x3a, 0xf6, 0xe3, 0xf1, 0x19, 0x97, 0xd2, 0xcf, 0x0f, 0xcf, 0x64, 0x2f, 0x88, 0xd1, 0xbb, 0xd7, 0x91, 0xf3, 0xea, 0xaf, 0x75, 0xb8, 0x98, 0x85, 0x33, 0xe7, 0x4d, 0x70, 0x17, 0x7e, 0x0d, 0x66, 0x7d, 0x75, 0x49, 0xef, 0xcb, 0x84, 0xd6, 0x5d, 0x90, 0x35, 0x62, 0xd3, 0x82, 0xd8, 0xbd, 0x4b, 0x5b, 0xc5, 0xaa, 0x20, 0x9b, 0xd5, 0x47, 0x85, 0xf6, 0x93, 0xb4, 0x4f, 0xa9, 0xd5, 0x07, 0x1f, 0xf4, 0x7d, 0xb4, 0x80, 0x97, 0xb3, 0x8c, 0x27, 0xfb, 0x7f, 0x5d, 0x3e, 0xfe, 0xa4, 0x5d, 0x1d, 0xe7, 0xbf, 0xde, 0xfe, 0x63, 0xf4, 0xa3, 0xc1, 0x13, 0x9f, 0xea, 0x47, 0x03, 0x29, 0x3e, 0xfa, 0x4f, 0xc9, 0xcf, 0x3d, 0xf3, 0xf9, 0xd1, 0x3c, 0x6f, 0xba, 0x15, 0xb8, 0x8d, 0x42, 0x91, 0x4e, 0x0f, 0xcc, 0xbb, 0x3d, 0x30, 0xc9, 0x3c, 0x30, 0xcd, 0x3c, 0x30, 0xcf, 0x3c, 0x70, 0x62, 0xd7, 0x26, 0xa9, 0xd7, 0x96, 0xce, 0x9b, 0x4d, 0x58, 0xec, 0xb3, 0x6d, 0x48, 0x63, 0x79, 0x06, 0xe4, 0xa6, 0x58, 0x4d, 0xc2, 0x78, 0x34, 0xb9, 0x73, 0x1a, 0x84, 0xf9, 0x9f, 0xeb, 0x7f, 0x0c, 0xea, 0x3e, 0x4a, 0x20, 0x0a, 0xbb, 0x42, 0x94, 0x9b, 0xc6, 0x3b, 0x6f, 0x88, 0x8a, 0xb3, 0x7e, 0x15, 0x10, 0xa9, 0xb6, 0x47, 0x42, 0x03, 0x14, 0xb3, 0xc3, 0x20, 0x1e, 0x31, 0x3d, 0x8c, 0x39, 0xb9, 0xe9, 0xbf, 0x21, 0x09, 0x41, 0x0c, 0xa2, 0x93, 0x82, 0xda, 0xe9, 0x86, 0x68, 0xf9, 0xf4, 0x7e, 0xfc, 0x82, 0xbd, 0xf2, 0x17, 0xbc, 0xd9, 0x44, 0x7f, 0xcc, 0x37, 0x6c, 0xcf, 0xfa, 0x26, 0xf1, 0xc1, 0x81, 0xde, 0xb5, 0x1f, 0x17, 0xdb, 0x5b, 0xa3, 0x75, 0x12, 0xbe, 0x5b, 0x0c, 0xdb, 0xa1, 0xbd, 0xb8, 0xe2, 0x12, 0xb6, 0xc4, 0x8c, 0x34, 0x2c, 0x59, 0x78, 0xca, 0xa6, 0x75, 0x13, 0x13, 0xd4, 0x25, 0x72, 0xc1, 0x24, 0xbb, 0xac, 0x6f, 0x4f, 0x7a, 0x72, 0x96, 0xb1, 0xd0, 0x26, 0x3a, 0x7b, 0xd2, 0x98, 0x53, 0x44, 0x67, 0xbd, 0x7c, 0x98, 0x7e, 0xd6, 0x7e, 0x3b, 0x5a, 0xaf, 0xad, 0xa0, 0xc2, 0x38, 0xfa, 0x44, 0xa1, 0x3a, 0xb6, 0x61, 0x8e, 0xf7, 0x50, 0x24, 0xd7, 0x7f, 0xc3, 0xa6, 0x85, 0x33, 0x36, 0x42, 0x19, 0x45, 0xda, 0x02, 0xa0, 0xf9, 0xbe, 0x00, 0x3a, 0xff, 0x33, 0x97, 0xe4, 0x42, 0x58, 0x2e, 0x55, 0x03, 0x1c, 0x95, 0x77, 0xcb, 0x75, 0x58, 0x88, 0x43, 0x0b, 0x33, 0x5c, 0xed, 0xfe, 0x48, 0xce, 0x76, 0xfe, 0x23, 0xcf, 0x7d, 0xb4, 0xbf, 0x42, 0x1a, 0xf9, 0x14, 0xa4, 0x49, 0x3a, 0x3f, 0x84, 0xa9, 0x1c, 0x5a, 0x37, 0xd1, 0x36, 0xcc, 0x9b, 0xae, 0x8f, 0xd3, 0x31, 0x4a, 0xc9, 0xdc, 0xa1, 0x3e, 0x29, 0xc9, 0xdc, 0x21, 0xa1, 0xf6, 0x33, 0xc3, 0x43, 0x63, 0x3e, 0x73, 0xac, 0x3b, 0x1d, 0xd4, 0x93, 0x2a, 0x42, 0x39, 0xdf, 0x33, 0x94, 0x3d, 0x99, 0xaf, 0x14, 0x53, 0x92, 0xc1, 0x94, 0x65, 0x30, 0xa5, 0x19, 0x4c, 0xf9, 0x81, 0x6f, 0xcb, 0x62, 0xbb, 0x4d, 0x12, 0xc6, 0xb4, 0xe9, 0xe0, 0x7a, 0xca, 0x7e, 0xfb, 0x66, 0x9f, 0xf5, 0x3e, 0x81, 0x39, 0x4b, 0xe7, 0xbd, 0xd8, 0x15, 0x91, 0x84, 0x7b, 0xd9, 0x9a, 0xff, 0xcd, 0x09, 0x29, 0xd0, 0xde, 0x52, 0x2c, 0xdd, 0x70, 0x9a, 0xef, 0x1f, 0xa7, 0x33, 0xf5, 0xe1, 0xff, 0x1f, 0x97, 0x8c, 0x42, 0x5e,
+3
build/baremetalpi/Makefile
··· 32 32 $(TIC80LIB)/libblipbuf.a \ 33 33 $(TIC80LIB)/libsquirrel.a \ 34 34 $(TIC80LIB)/libpython.a \ 35 + $(TIC80LIB)/libpocketpy.a \ 35 36 $(TIC80LIB)/libscheme.a \ 36 37 $(TIC80LIB)/libwren.a \ 37 38 $(TIC80LIB)/libwasm.a \ 38 39 $(TIC80LIB)/libjanet.a \ 39 40 $(TIC80LIB)/libargparse.a \ 40 41 $(TIC80LIB)/libwave_writer.a \ 42 + $(TIC80LIB)/libjs.a \ 41 43 $(TIC80LIB)/libquickjs.a \ 42 44 $(TIC80LIB)/libzlib.a \ 43 45 $(TIC80LIB)/libpng.a \ 46 + $(TIC80LIB)/libruby.a \ 44 47 $(MRUBYDIR)/build/target/lib/libmruby.a \ 45 48 $(NEWLIBDIR)/lib/libc.a \ 46 49 $(NEWLIBDIR)/lib/libcirclenewlib.a \
+2 -46
cmake/core.cmake
··· 18 18 ${TIC80CORE_DIR}/tilesheet.c 19 19 ) 20 20 21 - if(BUILD_WITH_LUA) 22 - list(APPEND TIC80CORE_SRC ${TIC80CORE_DIR}/api/lua.c) 23 - endif() 24 - 25 - if(BUILD_WITH_MOON) 26 - list(APPEND TIC80CORE_SRC ${TIC80CORE_DIR}/api/moonscript.c) 27 - endif() 28 - 29 - if(BUILD_WITH_FENNEL) 30 - list(APPEND TIC80CORE_SRC ${TIC80CORE_DIR}/api/fennel.c) 31 - endif() 32 - 33 - if(BUILD_WITH_JS) 34 - list(APPEND TIC80CORE_SRC ${TIC80CORE_DIR}/api/js.c) 35 - endif() 36 - 37 - if(BUILD_WITH_SCHEME) 38 - list(APPEND TIC80CORE_SRC ${TIC80CORE_DIR}/api/scheme.c) 39 - endif() 40 - 41 - if(BUILD_WITH_SQUIRREL) 42 - list(APPEND TIC80CORE_SRC ${TIC80CORE_DIR}/api/squirrel.c) 43 - endif() 44 - 45 - if(BUILD_WITH_PYTHON) 46 - list(APPEND TIC80CORE_SRC ${TIC80CORE_DIR}/api/python.c) 47 - endif() 48 - 49 - if(BUILD_WITH_WREN) 50 - list(APPEND TIC80CORE_SRC ${TIC80CORE_DIR}/api/wren.c) 51 - endif() 52 - 53 - if(BUILD_WITH_MRUBY) 54 - list(APPEND TIC80CORE_SRC ${TIC80CORE_DIR}/api/mruby.c) 55 - endif() 56 - 57 - if(BUILD_WITH_JANET) 58 - list(APPEND TIC80CORE_SRC ${TIC80CORE_DIR}/api/janet.c) 59 - endif() 60 - 61 - if(BUILD_WITH_WASM) 62 - list(APPEND TIC80CORE_SRC ${TIC80CORE_DIR}/api/wasm.c) 63 - endif() 64 - 65 21 if(${BUILD_DEPRECATED}) 66 22 set(TIC80CORE_SRC ${TIC80CORE_SRC} ${TIC80CORE_DIR}/ext/gif.c) 67 23 endif() ··· 89 45 endif() 90 46 91 47 if(BUILD_WITH_JS) 92 - target_link_libraries(tic80core${SCRIPT} quickjs) 48 + target_link_libraries(tic80core${SCRIPT} js) 93 49 endif() 94 50 95 51 if(BUILD_WITH_SCHEME) ··· 109 65 endif() 110 66 111 67 if(BUILD_WITH_MRUBY) 112 - target_link_libraries(tic80core${SCRIPT} mruby) 68 + target_link_libraries(tic80core${SCRIPT} ruby) 113 69 endif() 114 70 115 71 if(BUILD_WITH_JANET)
+19
cmake/demos.cmake
··· 1 + if(BUILD_DEMO_CARTS) 2 + 3 + foreach(CART_FILE ${DEMO_CARTS}) 4 + 5 + get_filename_component(CART_NAME ${CART_FILE} NAME_WE) 6 + 7 + set(OUTNAME ${CMAKE_SOURCE_DIR}/build/assets/${CART_NAME}.tic.dat) 8 + set(OUTPRJ ${CMAKE_SOURCE_DIR}/build/${CART_NAME}.tic) 9 + 10 + list(APPEND DEMO_CARTS_OUT ${OUTNAME}) 11 + 12 + add_custom_command(OUTPUT ${OUTNAME} 13 + COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/prj2cart ${CART_FILE} ${OUTPRJ} && ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/bin2txt ${OUTPRJ} ${OUTNAME} -z 14 + DEPENDS bin2txt prj2cart ${CART_FILE} 15 + ) 16 + 17 + endforeach(CART_FILE) 18 + 19 + endif()
+25 -3
cmake/janet.cmake
··· 37 37 ) 38 38 endif() 39 39 40 - add_library(janet ${THIRDPARTY_DIR}/janet/build/c/janet.c) 41 - target_include_directories(janet PUBLIC ${THIRDPARTY_DIR}/janet/src/include) 42 - target_include_directories(janet PUBLIC ${CMAKE_SOURCE_DIR}/build/janet/) 40 + set(JANET_SRC 41 + ${THIRDPARTY_DIR}/janet/build/c/janet.c 42 + ${CMAKE_SOURCE_DIR}/src/api/janet.c 43 + ${CMAKE_SOURCE_DIR}/src/api/parse_note.c 44 + ) 45 + 46 + add_library(janet ${TIC_RUNTIME} ${JANET_SRC}) 47 + 48 + if(NOT BUILD_STATIC) 49 + set_target_properties(janet PROPERTIES PREFIX "") 50 + endif() 51 + 52 + target_include_directories(janet 53 + PRIVATE 54 + ${THIRDPARTY_DIR}/janet/src/include 55 + ${CMAKE_SOURCE_DIR}/build/janet 56 + ${CMAKE_SOURCE_DIR}/include 57 + ${CMAKE_SOURCE_DIR}/src 58 + ) 59 + 43 60 target_compile_definitions(janet INTERFACE TIC_BUILD_WITH_JANET=1) 61 + 62 + if(BUILD_DEMO_CARTS) 63 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/janetdemo.janet) 64 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/janetmark.janet) 65 + endif() 44 66 45 67 endif()
+55 -5
cmake/lua.cmake
··· 55 55 ${LUA_DIR}/lutf8lib.c 56 56 ${LUA_DIR}/loadlib.c 57 57 ${LUA_DIR}/linit.c 58 + ${LUA_DIR}/lbitlib.c 58 59 ) 59 60 60 - add_library(lua STATIC ${LUA_SRC}) 61 + list(APPEND LUA_SRC ${CMAKE_SOURCE_DIR}/src/api/lua.c) 62 + list(APPEND LUA_SRC ${CMAKE_SOURCE_DIR}/src/api/parse_note.c) 63 + 64 + if(BUILD_WITH_MOON) 65 + list(APPEND LUA_SRC ${CMAKE_SOURCE_DIR}/src/api/moonscript.c) 66 + endif() 67 + 68 + if(BUILD_WITH_FENNEL) 69 + list(APPEND LUA_SRC ${CMAKE_SOURCE_DIR}/src/api/fennel.c) 70 + endif() 71 + 72 + add_library(lua ${TIC_RUNTIME} ${LUA_SRC}) 73 + 74 + if(NOT BUILD_STATIC) 75 + set_target_properties(lua PROPERTIES PREFIX "") 76 + endif() 61 77 62 78 target_compile_definitions(lua PRIVATE LUA_COMPAT_5_2) 63 - target_include_directories(lua INTERFACE ${THIRDPARTY_DIR}/lua) 79 + target_include_directories(lua 80 + PUBLIC ${THIRDPARTY_DIR}/lua 81 + PRIVATE 82 + ${CMAKE_SOURCE_DIR}/include 83 + ${CMAKE_SOURCE_DIR}/src 84 + ) 64 85 65 86 if(N3DS) 66 87 target_compile_definitions(lua PUBLIC LUA_32BITS) 67 88 endif() 68 89 69 - target_compile_definitions(lua INTERFACE TIC_BUILD_WITH_LUA=1) 90 + target_compile_definitions(lua INTERFACE TIC_BUILD_WITH_LUA) 70 91 71 92 if(BUILD_WITH_MOON) 72 - target_compile_definitions(lua INTERFACE TIC_BUILD_WITH_MOON=1) 93 + target_include_directories(lua PRIVATE ${THIRDPARTY_DIR}/moonscript) 94 + target_compile_definitions(lua INTERFACE TIC_BUILD_WITH_MOON) 73 95 endif() 74 96 75 97 if(BUILD_WITH_FENNEL) 76 - target_compile_definitions(lua INTERFACE TIC_BUILD_WITH_FENNEL=1) 98 + target_include_directories(lua PRIVATE ${THIRDPARTY_DIR}/fennel) 99 + target_compile_definitions(lua INTERFACE TIC_BUILD_WITH_FENNEL) 100 + endif() 101 + 102 + if(BUILD_DEMO_CARTS) 103 + list(APPEND DEMO_CARTS ${CMAKE_SOURCE_DIR}/config.lua) 104 + 105 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/quest.lua) 106 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/car.lua) 107 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/music.lua) 108 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/sfx.lua) 109 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/palette.lua) 110 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bpp.lua) 111 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/tetris.lua) 112 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/font.lua) 113 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/fire.lua) 114 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/benchmark.lua) 115 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/p3d.lua) 116 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/luademo.lua) 117 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/luamark.lua) 118 + 119 + if(BUILD_WITH_MOON) 120 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/moondemo.moon) 121 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/moonmark.moon) 122 + endif() 123 + 124 + if(BUILD_WITH_FENNEL) 125 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/fenneldemo.fnl) 126 + endif() 77 127 endif() 78 128 endif() 79 129
+27 -8
cmake/mruby.cmake
··· 14 14 15 15 if(BUILD_WITH_MRUBY) 16 16 17 + list(APPEND RUBY_SRC ${CMAKE_SOURCE_DIR}/src/api/mruby.c) 18 + list(APPEND RUBY_SRC ${CMAKE_SOURCE_DIR}/src/api/parse_note.c) 19 + 20 + add_library(ruby ${TIC_RUNTIME} ${RUBY_SRC}) 21 + 22 + if(NOT BUILD_STATIC) 23 + set_target_properties(ruby PROPERTIES PREFIX "") 24 + endif() 25 + 17 26 if(CMAKE_BUILD_TYPE) 18 27 string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE_UC) 19 28 endif() ··· 26 35 set(MRUBY_CONFIG ${MRUBY_BUILDDIR}/tic_default.rb) 27 36 endif() 28 37 set(MRUBY_LIB ${MRUBY_DIR}/build/target/lib/libmruby.a) 38 + 39 + target_include_directories(ruby 40 + PUBLIC ${MRUBY_DIR}/include 41 + PRIVATE 42 + ${CMAKE_SOURCE_DIR}/include 43 + ${CMAKE_SOURCE_DIR}/src 44 + ) 29 45 30 46 if(MSVC) 31 47 set(MRUBY_TOOLCHAIN visualcpp) ··· 65 81 BUILD_BYPRODUCTS ${MRUBY_LIB} 66 82 ) 67 83 68 - add_library(mruby STATIC IMPORTED GLOBAL) 69 - set_property(TARGET mruby APPEND 70 - PROPERTY IMPORTED_LOCATION ${MRUBY_LIB} 84 + set_property(TARGET ruby APPEND 85 + PROPERTY IMPORTED_LOCATION ${MRUBY_LIB} 71 86 ) 72 - set_property(TARGET mruby APPEND 73 - PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${MRUBY_DIR}/include 74 - ) 75 - add_dependencies(mruby mruby_vendor) 87 + 88 + add_dependencies(ruby mruby_vendor) 89 + target_link_libraries(ruby PRIVATE ${MRUBY_LIB}) 90 + 91 + target_compile_definitions(ruby INTERFACE TIC_BUILD_WITH_MRUBY=1) 76 92 77 - target_compile_definitions(mruby INTERFACE TIC_BUILD_WITH_MRUBY=1) 93 + if(BUILD_DEMO_CARTS) 94 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/rubydemo.rb) 95 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/rubymark.rb) 96 + endif() 78 97 79 98 endif()
+3
cmake/naett.cmake
··· 23 23 elseif(LINUX) 24 24 target_include_directories(naett PRIVATE ${CURL_INCLUDE_DIRS}) 25 25 target_link_libraries(naett ${CURL_LIBRARIES}) 26 + elseif(APPLE) 27 + target_link_libraries(naett 28 + "-framework Cocoa") 26 29 endif() 27 30 endif()
+26 -5
cmake/pocketpy.cmake
··· 10 10 if(BUILD_WITH_PYTHON) 11 11 12 12 add_subdirectory(${THIRDPARTY_DIR}/pocketpy) 13 - include_directories(${THIRDPARTY_DIR}/pocketpy/include) 14 13 15 14 if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") 16 15 target_compile_options(pocketpy PRIVATE -Wno-psabi) 17 16 endif() 18 17 19 - # alias pocketpy to python for next steps 20 - set_target_properties(pocketpy PROPERTIES OUTPUT_NAME python) 21 - add_library(python ALIAS pocketpy) 18 + set(PYTHON_SRC 19 + ${CMAKE_SOURCE_DIR}/src/api/python.c 20 + ${CMAKE_SOURCE_DIR}/src/api/parse_note.c 21 + ) 22 + 23 + add_library(python ${TIC_RUNTIME} ${PYTHON_SRC}) 24 + 25 + if(NOT BUILD_STATIC) 26 + set_target_properties(python PROPERTIES PREFIX "") 27 + endif() 28 + 29 + target_include_directories(python 30 + PRIVATE 31 + ${THIRDPARTY_DIR}/pocketpy/include 32 + ${CMAKE_SOURCE_DIR}/include 33 + ${CMAKE_SOURCE_DIR}/src 34 + ) 35 + 36 + target_link_libraries(python PRIVATE pocketpy) 22 37 23 38 if(EMSCRIPTEN) 24 39 # exceptions must be enabled for emscripten 25 40 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fexceptions") 26 41 endif() 27 42 28 - target_compile_definitions(pocketpy INTERFACE TIC_BUILD_WITH_PYTHON=1) 43 + target_compile_definitions(python INTERFACE TIC_BUILD_WITH_PYTHON=1) 44 + 45 + if(BUILD_DEMO_CARTS) 46 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/pythondemo.py) 47 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/pythonmark.py) 48 + endif() 49 + 29 50 endif()
+30 -5
cmake/quickjs.cmake
··· 13 13 14 14 file(STRINGS ${QUICKJS_DIR}/VERSION CONFIG_VERSION) 15 15 16 - add_library(quickjs STATIC 16 + set(QUICKJS_SRC 17 17 ${QUICKJS_DIR}/quickjs.c 18 18 ${QUICKJS_DIR}/libregexp.c 19 19 ${QUICKJS_DIR}/libunicode.c 20 - ${QUICKJS_DIR}/cutils.c) 20 + ${QUICKJS_DIR}/cutils.c 21 + ) 21 22 22 - target_compile_definitions(quickjs PUBLIC CONFIG_VERSION="${CONFIG_VERSION}") 23 - target_include_directories(quickjs INTERFACE ${QUICKJS_DIR}) 23 + add_library(quickjs STATIC ${QUICKJS_SRC}) 24 + target_compile_definitions(quickjs PRIVATE CONFIG_VERSION="${CONFIG_VERSION}") 24 25 25 26 if(CMAKE_BUILD_TYPE STREQUAL "Debug") 26 27 target_compile_definitions(quickjs PRIVATE DUMP_LEAKS) ··· 34 35 target_compile_definitions(quickjs PUBLIC _GNU_SOURCE _POSIX_C_SOURCE=200112) 35 36 target_link_libraries(quickjs PUBLIC m dl pthread) 36 37 endif() 38 + 39 + set(JS_SRC 40 + ${CMAKE_SOURCE_DIR}/src/api/js.c 41 + ${CMAKE_SOURCE_DIR}/src/api/parse_note.c 42 + ) 37 43 38 - target_compile_definitions(quickjs INTERFACE TIC_BUILD_WITH_JS=1) 44 + add_library(js ${TIC_RUNTIME} ${JS_SRC}) 45 + 46 + if(NOT BUILD_STATIC) 47 + set_target_properties(js PROPERTIES PREFIX "") 48 + endif() 49 + 50 + target_link_libraries(js PRIVATE quickjs) 51 + target_include_directories(js 52 + PRIVATE 53 + ${QUICKJS_DIR} 54 + ${CMAKE_SOURCE_DIR}/include 55 + ${CMAKE_SOURCE_DIR}/src 56 + ) 57 + 58 + target_compile_definitions(js INTERFACE TIC_BUILD_WITH_JS=1) 59 + 60 + if(BUILD_DEMO_CARTS) 61 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/jsdemo.js) 62 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/jsmark.js) 63 + endif() 39 64 40 65 endif()
+20 -5
cmake/scheme.cmake
··· 10 10 if(BUILD_WITH_SCHEME) 11 11 12 12 set(SCHEME_DIR ${THIRDPARTY_DIR}/s7) 13 - set(SCHEME_SRC 14 - ${SCHEME_DIR}/s7.c 15 - ) 13 + set(SCHEME_SRC ${SCHEME_DIR}/s7.c) 14 + 15 + list(APPEND SCHEME_SRC ${CMAKE_SOURCE_DIR}/src/api/scheme.c) 16 + 17 + add_library(scheme ${TIC_RUNTIME} ${SCHEME_SRC}) 18 + 19 + if(NOT BUILD_STATIC) 20 + set_target_properties(scheme PROPERTIES PREFIX "") 21 + endif() 16 22 17 - add_library(scheme STATIC ${SCHEME_SRC}) 18 23 set_target_properties(scheme PROPERTIES LINKER_LANGUAGE CXX) 19 - target_include_directories(scheme PUBLIC ${SCHEME_DIR}) 24 + target_include_directories(scheme 25 + PUBLIC ${SCHEME_DIR} 26 + PRIVATE 27 + ${CMAKE_SOURCE_DIR}/include 28 + ${CMAKE_SOURCE_DIR}/src 29 + ) 20 30 21 31 if (N3DS) 22 32 target_compile_definitions(scheme PRIVATE S7_N3DS) ··· 27 37 endif() 28 38 29 39 target_compile_definitions(scheme INTERFACE TIC_BUILD_WITH_SCHEME=1) 40 + 41 + if(BUILD_DEMO_CARTS) 42 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/schemedemo.scm) 43 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/schememark.scm) 44 + endif() 30 45 31 46 endif()
+17 -5
cmake/sdl.cmake
··· 12 12 set(SDL_STATIC_PIC ON CACHE BOOL "" FORCE) 13 13 endif() 14 14 15 - set(SDL_SHARED OFF CACHE BOOL "" FORCE) 16 - 17 15 add_subdirectory(${THIRDPARTY_DIR}/sdl2) 18 16 19 17 endif() ··· 41 39 target_link_options(player-sdl PRIVATE -static) 42 40 endif() 43 41 44 - target_link_libraries(player-sdl tic80core SDL2-static SDL2main) 42 + target_link_libraries(player-sdl tic80core SDL2main) 43 + 44 + if(BUILD_STATIC) 45 + target_link_libraries(player-sdl SDL2-static) 46 + else() 47 + target_link_libraries(player-sdl SDL2) 48 + endif() 45 49 endif() 46 50 47 51 ################################ ··· 113 117 endif() 114 118 115 119 if(NOT EMSCRIPTEN) 116 - target_link_libraries(sdlgpu SDL2-static) 120 + if(BUILD_STATIC) 121 + target_link_libraries(sdlgpu SDL2-static) 122 + else() 123 + target_link_libraries(sdlgpu SDL2) 124 + endif() 117 125 endif() 118 126 119 127 endif() ··· 186 194 elseif(RPI) 187 195 target_link_libraries(tic80 libSDL2.a bcm_host) 188 196 else() 189 - target_link_libraries(tic80 SDL2-static) 197 + if(BUILD_STATIC) 198 + target_link_libraries(tic80 SDL2-static) 199 + else() 200 + target_link_libraries(tic80 SDL2) 201 + endif() 190 202 endif() 191 203 endif() 192 204
+25 -4
cmake/squirrel.cmake
··· 34 34 35 35 ) 36 36 37 - add_library(squirrel STATIC ${SQUIRREL_SRC}) 37 + list(APPEND SQUIRREL_SRC ${CMAKE_SOURCE_DIR}/src/api/squirrel.c) 38 + list(APPEND SQUIRREL_SRC ${CMAKE_SOURCE_DIR}/src/api/parse_note.c) 39 + 40 + add_library(squirrel ${TIC_RUNTIME} ${SQUIRREL_SRC}) 41 + 42 + if(NOT BUILD_STATIC) 43 + set_target_properties(squirrel PROPERTIES PREFIX "") 44 + endif() 45 + 38 46 set_target_properties(squirrel PROPERTIES LINKER_LANGUAGE CXX) 39 - target_include_directories(squirrel PUBLIC ${SQUIRREL_DIR}/include) 40 - target_include_directories(squirrel PRIVATE ${SQUIRREL_DIR}/squirrel) 41 - target_include_directories(squirrel PRIVATE ${SQUIRREL_DIR}/sqstdlib) 47 + 48 + target_include_directories(squirrel 49 + PUBLIC ${SQUIRREL_DIR}/include 50 + PRIVATE 51 + ${SQUIRREL_DIR}/squirrel 52 + ${SQUIRREL_DIR}/sqstdlib 53 + ${CMAKE_SOURCE_DIR}/include 54 + ${CMAKE_SOURCE_DIR}/src 55 + ) 56 + 42 57 target_compile_definitions(squirrel INTERFACE TIC_BUILD_WITH_SQUIRREL=1) 58 + 59 + if(BUILD_DEMO_CARTS) 60 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/squirreldemo.nut) 61 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/squirrelmark.nut) 62 + endif() 63 + 43 64 endif()
+1 -115
cmake/tools.cmake
··· 32 32 if(LINUX) 33 33 target_link_libraries(xplode m) 34 34 endif() 35 - 36 - set(DEMO_CARTS_IN ${CMAKE_SOURCE_DIR}/demos) 37 - set(DEMO_CARTS_OUT) 38 - 39 - if(BUILD_WITH_LUA) 40 - list(APPEND DEMO_CARTS 41 - ${CMAKE_SOURCE_DIR}/config.lua 42 - ) 43 - endif() 44 - 45 - if(BUILD_WITH_LUA) 46 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/quest.lua) 47 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/car.lua) 48 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/music.lua) 49 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/sfx.lua) 50 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/palette.lua) 51 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bpp.lua) 52 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/tetris.lua) 53 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/font.lua) 54 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/fire.lua) 55 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/benchmark.lua) 56 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/p3d.lua) 57 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/luademo.lua) 58 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/luamark.lua) 59 - endif() 60 - 61 - if(BUILD_WITH_MOON) 62 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/moondemo.moon) 63 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/moonmark.moon) 64 - endif() 65 - 66 - if(BUILD_WITH_FENNEL) 67 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/fenneldemo.fnl) 68 - endif() 69 - 70 - if(BUILD_WITH_JS) 71 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/jsdemo.js) 72 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/jsmark.js) 73 - endif() 74 - 75 - if(BUILD_WITH_SCHEME) 76 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/schemedemo.scm) 77 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/schememark.scm) 78 - endif() 79 - 80 - if(BUILD_WITH_SQUIRREL) 81 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/squirreldemo.nut) 82 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/squirrelmark.nut) 83 - endif() 84 - 85 - if(BUILD_WITH_PYTHON) 86 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/pythondemo.py) 87 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/pythonmark.py) 88 - endif() 89 - 90 - if(BUILD_WITH_WREN) 91 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/wrendemo.wren) 92 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/wrenmark.wren) 93 - endif() 94 - 95 - if(BUILD_WITH_MRUBY) 96 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/rubydemo.rb) 97 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/rubymark.rb) 98 - endif() 99 - 100 - if(BUILD_WITH_JANET) 101 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/janetdemo.janet) 102 - list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/janetmark.janet) 103 - endif() 104 - 105 - foreach(CART_FILE ${DEMO_CARTS}) 106 - 107 - get_filename_component(CART_NAME ${CART_FILE} NAME_WE) 108 - 109 - set(OUTNAME ${CMAKE_SOURCE_DIR}/build/assets/${CART_NAME}.tic.dat) 110 - set(OUTPRJ ${CMAKE_SOURCE_DIR}/build/${CART_NAME}.tic) 111 - 112 - list(APPEND DEMO_CARTS_OUT ${OUTNAME}) 113 - 114 - add_custom_command(OUTPUT ${OUTNAME} 115 - COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/prj2cart ${CART_FILE} ${OUTPRJ} && ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/bin2txt ${OUTPRJ} ${OUTNAME} -z 116 - DEPENDS bin2txt prj2cart ${CART_FILE} 117 - ) 118 - 119 - endforeach(CART_FILE) 120 - 121 - if(BUILD_WITH_WASM) 122 - 123 - # we need to build these separately combining both the project 124 - # and the external WASM binary chunk since projects do not 125 - # include BINARY chunks 126 - 127 - file(GLOB WASM_DEMOS 128 - ${DEMO_CARTS_IN}/wasm/*.wasmp 129 - ${DEMO_CARTS_IN}/bunny/wasmmark/*.wasmp 130 - ) 131 - 132 - foreach(CART_FILE ${WASM_DEMOS}) 133 - 134 - get_filename_component(CART_NAME ${CART_FILE} NAME_WE) 135 - get_filename_component(DIR ${CART_FILE} DIRECTORY) 136 - 137 - set(OUTNAME ${CMAKE_SOURCE_DIR}/build/assets/${CART_NAME}.tic.dat) 138 - set(WASM_BINARY ${DIR}/${CART_NAME}.wasm) 139 - set(OUTPRJ ${CMAKE_SOURCE_DIR}/build/${CART_NAME}.tic) 140 - list(APPEND DEMO_CARTS_OUT ${OUTNAME}) 141 - add_custom_command(OUTPUT ${OUTNAME} 142 - COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/wasmp2cart ${CART_FILE} ${OUTPRJ} --binary ${WASM_BINARY} && ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/bin2txt ${OUTPRJ} ${OUTNAME} -z 143 - DEPENDS bin2txt wasmp2cart ${CART_FILE} ${WASM_BINARY} 144 - ) 145 - 146 - endforeach(CART_FILE) 147 - 148 - endif() 149 - 35 + 150 36 add_custom_command(OUTPUT ${CMAKE_SOURCE_DIR}/build/assets/cart.png.dat 151 37 COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/bin2txt ${CMAKE_SOURCE_DIR}/build/cart.png ${CMAKE_SOURCE_DIR}/build/assets/cart.png.dat 152 38 DEPENDS bin2txt ${CMAKE_SOURCE_DIR}/build/cart.png)
+43 -2
cmake/wasm.cmake
··· 24 24 ${WASM_DIR}/m3_module.c 25 25 ) 26 26 27 - add_library(wasm STATIC ${WASM_SRC}) 28 - target_include_directories(wasm PUBLIC ${THIRDPARTY_DIR}/wasm3/source) 27 + list(APPEND WASM_SRC ${CMAKE_SOURCE_DIR}/src/api/wasm.c) 28 + 29 + add_library(wasm ${TIC_RUNTIME} ${WASM_SRC}) 30 + 31 + if(NOT BUILD_STATIC) 32 + set_target_properties(wasm PROPERTIES PREFIX "") 33 + endif() 34 + 35 + target_include_directories(wasm 36 + PUBLIC ${WASM_DIR} 37 + PRIVATE 38 + ${CMAKE_SOURCE_DIR}/include 39 + ${CMAKE_SOURCE_DIR}/src 40 + ) 41 + 29 42 target_compile_definitions(wasm INTERFACE TIC_BUILD_WITH_WASM=1) 43 + 44 + # we need to build these separately combining both the project 45 + # and the external WASM binary chunk since projects do not 46 + # include BINARY chunks 47 + 48 + if(BUILD_DEMO_CARTS) 49 + 50 + file(GLOB WASM_DEMOS 51 + ${DEMO_CARTS_IN}/wasm/*.wasmp 52 + ${DEMO_CARTS_IN}/bunny/wasmmark/*.wasmp 53 + ) 54 + 55 + foreach(CART_FILE ${WASM_DEMOS}) 56 + 57 + get_filename_component(CART_NAME ${CART_FILE} NAME_WE) 58 + get_filename_component(DIR ${CART_FILE} DIRECTORY) 59 + 60 + set(OUTNAME ${CMAKE_SOURCE_DIR}/build/assets/${CART_NAME}.tic.dat) 61 + set(WASM_BINARY ${DIR}/${CART_NAME}.wasm) 62 + set(OUTPRJ ${CMAKE_SOURCE_DIR}/build/${CART_NAME}.tic) 63 + list(APPEND DEMO_CARTS_OUT ${OUTNAME}) 64 + add_custom_command(OUTPUT ${OUTNAME} 65 + COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/wasmp2cart ${CART_FILE} ${OUTPRJ} --binary ${WASM_BINARY} && ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/bin2txt ${OUTPRJ} ${OUTNAME} -z 66 + DEPENDS bin2txt wasmp2cart ${CART_FILE} ${WASM_BINARY} 67 + ) 68 + 69 + endforeach(CART_FILE) 70 + endif() 30 71 31 72 endif()
+20 -1
cmake/wren.cmake
··· 22 22 ${WREN_DIR}/vm/wren_vm.c 23 23 ) 24 24 25 - add_library(wren STATIC ${WREN_SRC}) 25 + list(APPEND WREN_SRC ${CMAKE_SOURCE_DIR}/src/api/wren.c) 26 + list(APPEND WREN_SRC ${CMAKE_SOURCE_DIR}/src/api/parse_note.c) 27 + 28 + add_library(wren ${TIC_RUNTIME} ${WREN_SRC}) 29 + 30 + if(NOT BUILD_STATIC) 31 + set_target_properties(wren PROPERTIES PREFIX "") 32 + endif() 33 + 34 + target_include_directories(wren 35 + PRIVATE 36 + ${CMAKE_SOURCE_DIR}/include 37 + ${CMAKE_SOURCE_DIR}/src 38 + ) 39 + 26 40 target_include_directories(wren PUBLIC ${THIRDPARTY_DIR}/wren/src/include) 27 41 target_include_directories(wren PRIVATE ${THIRDPARTY_DIR}/wren/src/optional) 28 42 target_include_directories(wren PRIVATE ${THIRDPARTY_DIR}/wren/src/vm) 29 43 target_compile_definitions(wren INTERFACE TIC_BUILD_WITH_WREN=1) 44 + 45 + if(BUILD_DEMO_CARTS) 46 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/wrendemo.wren) 47 + list(APPEND DEMO_CARTS ${DEMO_CARTS_IN}/bunny/wrenmark.wren) 48 + endif() 30 49 31 50 endif()
+106 -104
src/api/janet.c
··· 28 28 29 29 #include <janet.h> 30 30 31 + extern bool parse_note(const char* noteStr, s32* note, s32* octave); 32 + 31 33 static inline tic_core* getJanetMachine(void); 32 34 33 35 static Janet janet_print(int32_t argc, Janet* argv); ··· 82 84 static void evalJanet(tic_mem* tic, const char* code); 83 85 static void callJanetTick(tic_mem* tic); 84 86 static void callJanetBoot(tic_mem* tic); 85 - static void callJanetIntCallback(tic_mem* memory, s32 value, void* data, const char* name); 86 - static void callJanetScanline(tic_mem* memory, s32 row, void* data); 87 - static void callJanetBorder(tic_mem* memory, s32 row, void* data); 88 - static void callJanetMenu(tic_mem* memory, s32 index, void* data); 87 + static void callJanetIntCallback(tic_mem* tic, s32 value, void* data, const char* name); 88 + static void callJanetScanline(tic_mem* tic, s32 row, void* data); 89 + static void callJanetBorder(tic_mem* tic, s32 row, void* data); 90 + static void callJanetMenu(tic_mem* tic, s32 index, void* data); 89 91 static const tic_outline_item* getJanetOutline(const char* code, s32* size); 90 92 91 93 /* ***************** */ ··· 185 187 { 186 188 const char *noteStr = janet_getcstring(argv, n); 187 189 188 - if (!tic_tool_parse_note(noteStr, &sfxNote.note, &sfxNote.octave)) 190 + if (!parse_note(noteStr, &sfxNote.note, &sfxNote.octave)) 189 191 { 190 192 janet_panicf("invalid note, should be like C#4, got %s\n", noteStr); 191 193 } ··· 290 292 if (argc >= 6) scale = (s32)janet_getinteger(argv, 5); 291 293 if (argc >= 7) alt = janet_getboolean(argv, 6); 292 294 293 - tic_mem* memory = (tic_mem*)getJanetMachine(); 294 - int32_t width = tic_api_print(memory, text, x, y, color, fixed, scale, alt); 295 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 296 + int32_t width = core->api.print(tic, text, x, y, color, fixed, scale, alt); 295 297 return janet_wrap_integer(width); 296 298 } 297 299 ··· 299 301 { 300 302 janet_arity(argc, 0, 1); 301 303 u32 color = (u32)janet_optinteger(argv, argc, 0, 0); 302 - tic_mem* memory = (tic_mem*)getJanetMachine(); 303 - tic_api_cls(memory, color); 304 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 305 + core->api.cls(tic, color); 304 306 return janet_wrap_nil(); 305 307 } 306 308 ··· 321 323 get = false; 322 324 } 323 325 324 - tic_mem* memory = (tic_mem*)getJanetMachine(); 325 - return janet_wrap_integer(tic_api_pix(memory, x, y, color, get)); 326 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 327 + return janet_wrap_integer(core->api.pix(tic, x, y, color, get)); 326 328 } 327 329 328 330 static Janet janet_line(int32_t argc, Janet* argv) ··· 335 337 float y2 = (float)janet_getnumber(argv, 3); 336 338 u8 color = (u8)janet_getinteger(argv, 4); 337 339 338 - tic_mem* memory = (tic_mem*)getJanetMachine(); 339 - tic_api_line(memory, x1, y1, x2, y2, color); 340 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 341 + core->api.line(tic, x1, y1, x2, y2, color); 340 342 return janet_wrap_nil(); 341 343 } 342 344 ··· 350 352 s32 height = (s32)janet_getinteger(argv, 3); 351 353 u8 color = (u8)janet_getinteger(argv, 4); 352 354 353 - tic_mem* memory = (tic_mem*)getJanetMachine(); 354 - tic_api_rect(memory, x, y, width, height, color); 355 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 356 + core->api.rect(tic, x, y, width, height, color); 355 357 return janet_wrap_nil(); 356 358 } 357 359 ··· 365 367 s32 height = (s32)janet_getinteger(argv, 3); 366 368 u8 color = (u8)janet_getinteger(argv, 4); 367 369 368 - tic_mem* memory = (tic_mem*)getJanetMachine(); 369 - tic_api_rectb(memory, x, y, width, height, color); 370 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 371 + core->api.rectb(tic, x, y, width, height, color); 370 372 return janet_wrap_nil(); 371 373 } 372 374 ··· 386 388 s32 w = (s32)janet_optnumber(argv, argc, 7, 1); 387 389 s32 h = (s32)janet_optnumber(argv, argc, 8, 1); 388 390 389 - tic_mem* memory = (tic_mem*)getJanetMachine(); 390 - tic_api_spr(memory, index, x, y, w, h, 391 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 392 + core->api.spr(tic, index, x, y, w, h, 391 393 colorkey.colors, colorkey.count, 392 394 scale, flip, rotate); 393 395 ··· 400 402 401 403 s32 id = (s32)janet_getinteger(argv, 0); 402 404 403 - tic_mem* memory = (tic_mem*)getJanetMachine(); 404 - return janet_wrap_boolean(tic_api_btn(memory, id)); 405 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 406 + return janet_wrap_boolean(core->api.btn(tic, id)); 405 407 } 406 408 407 409 static Janet janet_btnp(int32_t argc, Janet* argv) ··· 412 414 s32 hold = (s32)janet_optinteger(argv, argc, 1, -1); 413 415 s32 period = (s32)janet_optinteger(argv, argc, 2, -1); 414 416 415 - tic_mem* memory = (tic_mem*)getJanetMachine(); 417 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 416 418 417 - return janet_wrap_boolean(tic_api_btnp(memory, id, hold, period)); 419 + return janet_wrap_boolean(core->api.btnp(tic, id, hold, period)); 418 420 } 419 421 420 422 static Janet janet_sfx(int32_t argc, Janet* argv) 421 423 { 422 424 janet_arity(argc, 1, 6); 423 - tic_mem* memory = (tic_mem*)getJanetMachine(); 425 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 424 426 425 427 s32 index = (s32)janet_getinteger(argv, 0); 426 428 if (index >= SFX_COUNT) { ··· 428 430 } 429 431 430 432 // possibly get default values from sfx 431 - tic_sample* effect = memory->ram->sfx.samples.data + index; 433 + tic_sample* effect = tic->ram->sfx.samples.data + index; 432 434 SFXNote defaultSfxNote = {-1, -1}; 433 435 s32 defaultSpeed = SFX_DEF_SPEED; 434 436 if (index >= 0) ··· 451 453 452 454 s32 speed = (s32)janet_optinteger(argv, argc, 5, defaultSpeed); 453 455 454 - tic_api_sfx(memory, index, 456 + core->api.sfx(tic, index, 455 457 sfxNote.note, sfxNote.octave, 456 458 duration, channel, 457 459 volumes[0] & 0xf, volumes[1] & 0xf, ··· 502 504 503 505 s32 scale = (s32)janet_optnumber(argv, argc, 7, 1); 504 506 505 - tic_mem* memory = (tic_mem*)getJanetMachine(); 507 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 506 508 507 509 if (argc < 9) 508 510 { 509 - tic_api_map(memory, x, y, w, h, sx, sy, 511 + core->api.map(tic, x, y, w, h, sx, sy, 510 512 colorkey.colors, colorkey.count, 511 513 scale, NULL, NULL); 512 514 } 513 515 else 514 516 { 515 517 JanetFunction *remap = janet_getfunction(argv, 8); 516 - tic_api_map(memory, x, y, w, h, sx, sy, 518 + core->api.map(tic, x, y, w, h, sx, sy, 517 519 colorkey.colors, colorkey.count, 518 520 scale, 519 521 remapCallback, remap); ··· 529 531 s32 x = (s32)janet_getinteger(argv, 0); 530 532 s32 y = (s32)janet_getinteger(argv, 1); 531 533 532 - tic_mem* memory = (tic_mem*)getJanetMachine(); 533 - return janet_wrap_integer(tic_api_mget(memory, x, y)); 534 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 535 + return janet_wrap_integer(core->api.mget(tic, x, y)); 534 536 } 535 537 536 538 static Janet janet_mset(int32_t argc, Janet* argv) ··· 541 543 s32 y = (s32)janet_getinteger(argv, 1); 542 544 u8 value = (u8)janet_getinteger(argv, 2); 543 545 544 - tic_mem* memory = (tic_mem*)getJanetMachine(); 545 - tic_api_mset(memory, x, y, value); 546 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 547 + core->api.mset(tic, x, y, value); 546 548 return janet_wrap_nil(); 547 549 } 548 550 ··· 552 554 s32 address = (s32)janet_getinteger(argv, 0); 553 555 s32 bits = (s32)janet_optinteger(argv, argc, 1, BITS_IN_BYTE); 554 556 555 - tic_mem* memory = (tic_mem*)getJanetMachine(); 556 - return janet_wrap_integer(tic_api_peek(memory, address, bits)); 557 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 558 + return janet_wrap_integer(core->api.peek(tic, address, bits)); 557 559 } 558 560 559 561 static Janet janet_poke(int32_t argc, Janet* argv) ··· 563 565 u8 value = (s32)janet_getinteger(argv, 1); 564 566 s32 bits = (s32)janet_optinteger(argv, argc, 2, BITS_IN_BYTE); 565 567 566 - tic_mem* memory = (tic_mem*)getJanetMachine(); 567 - tic_api_poke(memory, address, value, bits); 568 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 569 + core->api.poke(tic, address, value, bits); 568 570 569 571 return janet_wrap_nil(); 570 572 } ··· 575 577 576 578 u8 address = (u8)janet_getinteger(argv, 0); 577 579 578 - tic_mem* memory = (tic_mem*)getJanetMachine(); 579 - return janet_wrap_integer(tic_api_peek1(memory, address)); 580 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 581 + return janet_wrap_integer(core->api.peek1(tic, address)); 580 582 } 581 583 582 584 static Janet janet_poke1(int32_t argc, Janet* argv) ··· 586 588 s32 address = (s32)janet_getinteger(argv, 0); 587 589 u8 value = (u8)janet_getinteger(argv, 1); 588 590 589 - tic_mem* memory = (tic_mem*)getJanetMachine(); 590 - tic_api_poke1(memory, address, value); 591 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 592 + core->api.poke1(tic, address, value); 591 593 return janet_wrap_nil(); 592 594 } 593 595 ··· 597 599 598 600 s32 address = janet_getinteger(argv, 0); 599 601 600 - tic_mem* memory = (tic_mem*)getJanetMachine(); 601 - return janet_wrap_integer(tic_api_peek2(memory, address)); 602 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 603 + return janet_wrap_integer(core->api.peek2(tic, address)); 602 604 } 603 605 604 606 static Janet janet_poke2(int32_t argc, Janet* argv) ··· 608 610 s32 address = janet_getinteger(argv, 0); 609 611 u8 value = janet_getinteger(argv, 1); 610 612 611 - tic_mem* memory = (tic_mem*)getJanetMachine(); 612 - tic_api_poke2(memory, address, value); 613 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 614 + core->api.poke2(tic, address, value); 613 615 return janet_wrap_nil(); 614 616 } 615 617 ··· 619 621 620 622 s32 address = janet_getinteger(argv, 0); 621 623 622 - tic_mem* memory = (tic_mem*)getJanetMachine(); 623 - return janet_wrap_integer(tic_api_peek4(memory, address)); 624 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 625 + return janet_wrap_integer(core->api.peek4(tic, address)); 624 626 } 625 627 626 628 static Janet janet_poke4(int32_t argc, Janet* argv) ··· 630 632 s32 address = janet_getinteger(argv, 0); 631 633 u8 value = janet_getinteger(argv, 1); 632 634 633 - tic_mem* memory = (tic_mem*)getJanetMachine(); 634 - tic_api_poke4(memory, address, value); 635 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 636 + core->api.poke4(tic, address, value); 635 637 return janet_wrap_nil(); 636 638 } 637 639 ··· 643 645 s32 src = janet_getinteger(argv, 1); 644 646 s32 size = janet_getinteger(argv, 2); 645 647 646 - tic_mem* memory = (tic_mem*)getJanetMachine(); 647 - tic_api_memcpy(memory, dst, src, size); 648 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 649 + #undef memcpy 650 + core->api.memcpy(tic, dst, src, size); 648 651 return janet_wrap_nil(); 649 652 } 650 653 ··· 656 659 u8 val = janet_getinteger(argv, 1); 657 660 s32 size = janet_getinteger(argv, 2); 658 661 659 - tic_mem* memory = (tic_mem*)getJanetMachine(); 660 - tic_api_memset(memory, dst, val, size); 662 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 663 + 664 + #undef memset 665 + core->api.memset(tic, dst, val, size); 661 666 return janet_wrap_nil(); 662 667 } 663 668 ··· 672 677 color = janet_getinteger(argv, 1); 673 678 } 674 679 675 - tic_mem* memory = (tic_mem*)getJanetMachine(); 676 - tic_api_trace(memory, message, color); 680 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 681 + core->api.trace(tic, message, color); 677 682 return janet_wrap_nil(); 678 683 } 679 684 ··· 684 689 685 690 if(index < TIC_PERSISTENT_SIZE) 686 691 { 687 - tic_mem* memory = (tic_mem*)getJanetMachine(); 688 - u32 val = tic_api_pmem(memory, index, 0, false); 692 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 693 + u32 val = core->api.pmem(tic, index, 0, false); 689 694 690 695 if (argc >= 2) 691 696 { 692 697 u32 value = janet_getinteger(argv, 1); 693 - tic_api_pmem(memory, index, value, true); 698 + core->api.pmem(tic, index, value, true); 694 699 } 695 700 696 701 return janet_wrap_integer(val); ··· 704 709 static Janet janet_time(int32_t argc, Janet* argv) 705 710 { 706 711 janet_fixarity(argc, 0); 707 - tic_mem* memory = (tic_mem*)getJanetMachine(); 708 - return janet_wrap_number(tic_api_time(memory)); 712 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 713 + return janet_wrap_number(core->api.time(tic)); 709 714 } 710 715 711 716 static Janet janet_tstamp(int32_t argc, Janet* argv) 712 717 { 713 718 janet_fixarity(argc, 0); 714 - tic_mem* memory = (tic_mem*)getJanetMachine(); 715 - return janet_wrap_integer(tic_api_tstamp(memory)); 719 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 720 + return janet_wrap_integer(core->api.tstamp(tic)); 716 721 } 717 722 718 723 static Janet janet_exit(int32_t argc, Janet* argv) 719 724 { 720 725 janet_fixarity(argc, 0); 721 - tic_mem* memory = (tic_mem*)getJanetMachine(); 722 - tic_api_exit(memory); 726 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 727 + core->api.exit(tic); 723 728 return janet_wrap_nil(); 724 729 } 725 730 ··· 738 743 s32 scale = (s32)janet_optinteger(argv, argc, 7, 1); 739 744 bool alt = janet_optboolean(argv, argc, 8, false); 740 745 741 - tic_mem* memory = (tic_mem*)getJanetMachine(); 742 - int32_t width = tic_api_font(memory, 746 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 747 + int32_t width = core->api.font(tic, 743 748 text, x, y, &chromakey, 1, 744 749 w, h, fixed, scale, alt); 745 750 return janet_wrap_integer(width); ··· 749 754 { 750 755 janet_fixarity(argc, 0); 751 756 752 - tic_mem* memory = (tic_mem*)getJanetMachine(); 757 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 753 758 Janet result[7]; 754 759 755 760 { 756 - tic_point point = tic_api_mouse(memory); 761 + tic_point point = core->api.mouse(tic); 757 762 result[0] = janet_wrap_integer(point.x); 758 763 result[1] = janet_wrap_integer(point.y); 759 764 } 760 765 761 - tic_core* core = getJanetMachine(); 762 - const tic80_mouse* mouse = &core->memory.ram->input.mouse; 766 + const tic80_mouse* mouse = &tic->ram->input.mouse; 763 767 result[2] = janet_wrap_boolean(mouse->left); 764 768 result[3] = janet_wrap_boolean(mouse->middle); 765 769 result[4] = janet_wrap_boolean(mouse->right); ··· 778 782 s32 radius = janet_getinteger(argv, 2); 779 783 u8 color = janet_getinteger(argv, 3); 780 784 781 - tic_mem* memory = (tic_mem*)getJanetMachine(); 782 - tic_api_circ(memory, x, y, radius, color); 785 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 786 + core->api.circ(tic, x, y, radius, color); 783 787 return janet_wrap_nil(); 784 788 } 785 789 ··· 792 796 s32 radius = janet_getinteger(argv, 2); 793 797 u8 color = janet_getinteger(argv, 3); 794 798 795 - tic_mem* memory = (tic_mem*)getJanetMachine(); 796 - tic_api_circb(memory, x, y, radius, color); 799 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 800 + core->api.circb(tic, x, y, radius, color); 797 801 return janet_wrap_nil(); 798 802 } 799 803 ··· 807 811 s32 b = janet_getinteger(argv, 3); 808 812 u8 color = janet_getinteger(argv, 4); 809 813 810 - tic_mem* memory = (tic_mem*)getJanetMachine(); 811 - tic_api_elli(memory, x, y, a, b, color); 814 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 815 + core->api.elli(tic, x, y, a, b, color); 812 816 return janet_wrap_nil(); 813 817 } 814 818 ··· 822 826 s32 b = janet_getinteger(argv, 3); 823 827 u8 color = janet_getinteger(argv, 4); 824 828 825 - tic_mem* memory = (tic_mem*)getJanetMachine(); 826 - tic_api_ellib(memory, x, y, a, b, color); 829 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 830 + core->api.ellib(tic, x, y, a, b, color); 827 831 return janet_wrap_nil(); 828 832 } 829 833 ··· 839 843 float y3 = janet_getnumber(argv, 5); 840 844 u8 color = janet_getnumber(argv, 6); 841 845 842 - tic_mem* memory = (tic_mem*)getJanetMachine(); 843 - tic_api_tri(memory, x1, y1, x2, y2, x3, y3, color); 846 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 847 + core->api.tri(tic, x1, y1, x2, y2, x3, y3, color); 844 848 return janet_wrap_nil(); 845 849 } 846 850 ··· 856 860 float y3 = janet_getnumber(argv, 5); 857 861 u8 color = janet_getnumber(argv, 6); 858 862 859 - tic_mem* memory = (tic_mem*)getJanetMachine(); 860 - tic_api_trib(memory, x1, y1, x2, y2, x3, y3, color); 863 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 864 + core->api.trib(tic, x1, y1, x2, y2, x3, y3, color); 861 865 return janet_wrap_nil(); 862 866 } 863 867 ··· 898 902 ColorKey trans = tic_optcolorkey(argv, argc, 13); 899 903 TriDepth depth = tic_opttridepth(argv, argc, 14); 900 904 901 - tic_mem* memory = (tic_mem*)getJanetMachine(); 902 - tic_api_ttri(memory, 905 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 906 + core->api.ttri(tic, 903 907 x1, y1, 904 908 x2, y2, 905 909 x3, y3, ··· 917 921 { 918 922 janet_arity(argc, 0, 4); 919 923 920 - tic_mem* memory = (tic_mem*)getJanetMachine(); 924 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 921 925 922 926 if (argc == 0) { 923 - tic_api_clip(memory, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); 927 + core->api.clip(tic, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); 924 928 } else if (argc == 4) { 925 929 s32 x = janet_getinteger(argv, 0); 926 930 s32 y = janet_getinteger(argv, 1); 927 931 s32 w = janet_getinteger(argv, 2); 928 932 s32 h = janet_getinteger(argv, 3); 929 - tic_api_clip(memory, x, y, w, h); 933 + core->api.clip(tic, x, y, w, h); 930 934 } else { 931 935 janet_panic("Error: must provide exactly 0 or 4 args."); 932 936 } ··· 946 950 s32 tempo = janet_optinteger(argv, argc, 5, -1); 947 951 s32 speed = janet_optinteger(argv, argc, 6, -1); 948 952 949 - tic_mem* memory = (tic_mem*)getJanetMachine(); 950 - tic_api_music(memory, track, frame, row, loop, sustain, tempo, speed); 953 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 954 + core->api.music(tic, track, frame, row, loop, sustain, tempo, speed); 951 955 952 956 return janet_wrap_nil(); 953 957 } ··· 960 964 s32 bank = janet_optinteger(argv, argc, 1, 0); 961 965 bool toCart = janet_optboolean(argv, argc, 2, false); 962 966 963 - tic_mem* memory = (tic_mem*)getJanetMachine(); 964 - tic_api_sync(memory, mask, bank, toCart); 967 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 968 + core->api.sync(tic, mask, bank, toCart); 965 969 return janet_wrap_nil(); 966 970 } 967 971 ··· 971 975 972 976 s32 bank = janet_getinteger(argv, 0); 973 977 974 - tic_mem* memory = (tic_mem*)getJanetMachine(); 975 - return janet_wrap_integer(tic_api_vbank(memory, bank)); 978 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 979 + return janet_wrap_integer(core->api.vbank(tic, bank)); 976 980 } 977 981 978 982 static Janet janet_reset(int32_t argc, Janet* argv) ··· 990 994 991 995 if (argc >= 1) key = (tic_key)janet_getinteger(argv, 0); 992 996 993 - tic_mem* memory = (tic_mem*)getJanetMachine(); 994 - return janet_wrap_boolean(tic_api_key(memory, key)); 997 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 998 + return janet_wrap_boolean(core->api.key(tic, key)); 995 999 } 996 1000 997 1001 static Janet janet_keyp(int32_t argc, Janet* argv) ··· 1005 1009 if (argc >= 2) hold = janet_getinteger(argv, 1); 1006 1010 if (argc >= 3) period = janet_getinteger(argv, 2); 1007 1011 1008 - tic_mem* memory = (tic_mem*)getJanetMachine(); 1009 - return janet_wrap_boolean(tic_api_keyp(memory, key, hold, period)); 1012 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 1013 + return janet_wrap_boolean(core->api.keyp(tic, key, hold, period)); 1010 1014 } 1011 1015 1012 1016 static Janet janet_fget(int32_t argc, Janet* argv) ··· 1016 1020 s32 index = janet_getinteger(argv, 0); 1017 1021 u8 flag = janet_getinteger(argv, 1); 1018 1022 1019 - tic_mem* memory = (tic_mem*)getJanetMachine(); 1020 - return janet_wrap_boolean(tic_api_fget(memory, index, flag)); 1023 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 1024 + return janet_wrap_boolean(core->api.fget(tic, index, flag)); 1021 1025 } 1022 1026 1023 1027 ··· 1029 1033 u8 flag = janet_getinteger(argv, 1); 1030 1034 bool value = janet_getboolean(argv, 2); 1031 1035 1032 - tic_mem* memory = (tic_mem*)getJanetMachine(); 1033 - tic_api_fset(memory, index, flag, value); 1036 + tic_core* core = getJanetMachine(); tic_mem* tic = (tic_mem*)core; 1037 + core->api.fset(tic, index, flag, value); 1034 1038 return janet_wrap_nil(); 1035 1039 } 1036 1040 ··· 1264 1268 return items; 1265 1269 } 1266 1270 1267 - /* ***************** */ 1268 - 1269 - const tic_script_config JanetSyntaxConfig = 1271 + JANET_API const tic_script_config JanetSyntaxConfig = 1270 1272 { 1271 1273 .id = 18, 1272 1274 .name = "janet",
+102 -95
src/api/js.c
··· 28 28 #include <string.h> 29 29 #include <quickjs.h> 30 30 31 + extern bool parse_note(const char* noteStr, s32* note, s32* octave); 32 + 31 33 static inline tic_core* getCore(JSContext *ctx) 32 34 { 33 35 return JS_GetContextOpaque(ctx); ··· 124 126 125 127 static JSValue js_print(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 126 128 { 127 - tic_mem* tic = (tic_mem*)getCore(ctx); 129 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 128 130 129 131 const char* text = JS_ToCStringLen(ctx, NULL, argv[0]); 130 132 s32 x = getInteger2(ctx, argv[1], 0); ··· 134 136 s32 scale = getInteger2(ctx, argv[5], 1); 135 137 bool alt = JS_ToBool(ctx, argv[6]); 136 138 137 - s32 size = tic_api_print(tic, text ? text : "nil", x, y, color, fixed, scale, alt); 139 + s32 size = core->api.print(tic, text ? text : "nil", x, y, color, fixed, scale, alt); 138 140 139 141 JS_FreeCString(ctx, text); 140 142 ··· 143 145 144 146 static JSValue js_cls(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 145 147 { 146 - tic_mem* tic = (tic_mem*)getCore(ctx); 148 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 147 149 148 150 s32 color = getInteger2(ctx, argv[0], tic_color_black); 149 151 150 - tic_api_cls(tic, color); 152 + core->api.cls(tic, color); 151 153 152 154 return JS_UNDEFINED; 153 155 } ··· 157 159 s32 x = getInteger2(ctx, argv[0], 0); 158 160 s32 y = getInteger2(ctx, argv[1], 0); 159 161 160 - tic_mem* tic = (tic_mem*)getCore(ctx); 162 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 161 163 162 164 if(JS_IsUndefined(argv[2])) 163 165 { 164 - return JS_NewInt32(ctx, tic_api_pix(tic, x, y, 0, true)); 166 + return JS_NewInt32(ctx, core->api.pix(tic, x, y, 0, true)); 165 167 } 166 168 else 167 169 { 168 170 s32 color = getInteger(ctx, argv[2]); 169 - tic_api_pix(tic, x, y, color, false); 171 + core->api.pix(tic, x, y, color, false); 170 172 } 171 173 172 174 return JS_UNDEFINED; ··· 180 182 float y1 = getNumber(ctx, argv[3]); 181 183 s32 color = getInteger2(ctx, argv[4], tic_color_black); 182 184 183 - tic_mem* tic = (tic_mem*)getCore(ctx); 185 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 184 186 185 - tic_api_line(tic, x0, y0, x1, y1, color); 187 + core->api.line(tic, x0, y0, x1, y1, color); 186 188 187 189 return JS_UNDEFINED; 188 190 } ··· 195 197 s32 h = getInteger2(ctx, argv[3], 0); 196 198 s32 color = getInteger2(ctx, argv[4], 0); 197 199 198 - tic_mem* tic = (tic_mem*)getCore(ctx); 199 - tic_api_rect(tic, x, y, w, h, color); 200 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 201 + core->api.rect(tic, x, y, w, h, color); 200 202 201 203 return JS_UNDEFINED; 202 204 } ··· 209 211 s32 h = getInteger2(ctx, argv[3], 0); 210 212 s32 color = getInteger2(ctx, argv[4], 0); 211 213 212 - tic_mem* tic = (tic_mem*)getCore(ctx); 213 - tic_api_rectb(tic, x, y, w, h, color); 214 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 215 + core->api.rectb(tic, x, y, w, h, color); 214 216 215 217 return JS_UNDEFINED; 216 218 } ··· 249 251 s32 w = getInteger2(ctx, argv[7], 1); 250 252 s32 h = getInteger2(ctx, argv[8], 1); 251 253 252 - tic_mem* tic = (tic_mem*)getCore(ctx); 253 - tic_api_spr(tic, index, x, y, w, h, colors, count, scale, flip, rotate); 254 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 255 + core->api.spr(tic, index, x, y, w, h, colors, count, scale, flip, rotate); 254 256 255 257 return JS_UNDEFINED; 256 258 } 257 259 258 260 static JSValue js_btn(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 259 261 { 260 - tic_mem* tic = (tic_mem*)getCore(ctx); 262 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 261 263 262 264 return JS_IsUndefined(argv[0]) 263 - ? JS_NewUint32(ctx, tic_api_btn(tic, -1)) 264 - : JS_NewBool(ctx, tic_api_btn(tic, getInteger(ctx, argv[0]) & 0x1f)); 265 + ? JS_NewUint32(ctx, core->api.btn(tic, -1)) 266 + : JS_NewBool(ctx, core->api.btn(tic, getInteger(ctx, argv[0]) & 0x1f)); 265 267 } 266 268 267 269 static JSValue js_btnp(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 268 270 { 269 - tic_mem* tic = (tic_mem*)getCore(ctx); 271 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 270 272 271 273 if(JS_IsUndefined(argv[0])) 272 274 { 273 - return JS_NewUint32(ctx, tic_api_btnp(tic, -1, -1, -1)); 275 + return JS_NewUint32(ctx, core->api.btnp(tic, -1, -1, -1)); 274 276 } 275 277 276 278 s32 index = getInteger(ctx, argv[0]); 277 279 u32 hold = getInteger2(ctx, argv[1], -1); 278 280 u32 period = getInteger2(ctx, argv[2], -1); 279 281 280 - return JS_NewBool(ctx, tic_api_btnp(tic, index & 0x1f, hold, period)); 282 + return JS_NewBool(ctx, core->api.btnp(tic, index & 0x1f, hold, period)); 281 283 } 282 284 283 285 static JSValue js_key(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) ··· 286 288 tic_mem* tic = &core->memory; 287 289 288 290 if (JS_IsUndefined(argv[0])) 289 - return JS_NewBool(ctx, tic_api_key(tic, tic_key_unknown)); 291 + return JS_NewBool(ctx, core->api.key(tic, tic_key_unknown)); 290 292 291 293 tic_key key = getInteger(ctx, argv[0]); 292 294 293 295 if(key < tic_keys_count) 294 - return JS_NewBool(ctx, tic_api_key(tic, key)); 296 + return JS_NewBool(ctx, core->api.key(tic, key)); 295 297 else 296 298 { 297 299 JSValue err = JS_NewError(ctx); ··· 315 317 tic_mem* tic = &core->memory; 316 318 317 319 if (JS_IsUndefined(argv[0])) 318 - return JS_NewBool(ctx, tic_api_keyp(tic, tic_key_unknown, -1, -1)); 320 + return JS_NewBool(ctx, core->api.keyp(tic, tic_key_unknown, -1, -1)); 319 321 320 322 tic_key key = getInteger(ctx, argv[0]); 321 323 ··· 324 326 u32 hold = getInteger2(ctx, argv[1], -1); 325 327 u32 period = getInteger2(ctx, argv[2], -1); 326 328 327 - return JS_NewBool(ctx, tic_api_keyp(tic, key, hold, period)); 329 + return JS_NewBool(ctx, core->api.keyp(tic, key, hold, period)); 328 330 } 329 331 else 330 332 { ··· 336 338 337 339 static JSValue js_sfx(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 338 340 { 339 - tic_mem* tic = (tic_mem*)getCore(ctx); 341 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 340 342 341 343 s32 index = getInteger2(ctx, argv[0], -1); 342 344 ··· 360 362 { 361 363 const char *noteStr = JS_ToCStringLen(ctx, NULL, argv[1]); 362 364 363 - if(!tic_tool_parse_note(noteStr, &note, &octave)) 365 + if(!parse_note(noteStr, &note, &octave)) 364 366 { 365 367 throwError(ctx, "invalid note, should be like C#4"); 366 368 } ··· 399 401 400 402 if (channel >= 0 && channel < TIC_SOUND_CHANNELS) 401 403 { 402 - tic_api_sfx(tic, index, note, octave, duration, channel, volumes[0] & 0xf, volumes[1] & 0xf, speed); 404 + core->api.sfx(tic, index, note, octave, duration, channel, volumes[0] & 0xf, volumes[1] & 0xf, speed); 403 405 } 404 406 else throwError(ctx, "unknown channel"); 405 407 ··· 465 467 count = 1; 466 468 } 467 469 468 - tic_mem* tic = (tic_mem*)getCore(ctx); 470 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 469 471 470 472 if(JS_IsFunction(ctx, argv[8])) 471 473 { 472 474 RemapData data = {ctx, argv[8]}; 473 - tic_api_map((tic_mem*)getCore(ctx), x, y, w, h, sx, sy, colors, count, scale, remapCallback, &data); 475 + core->api.map((tic_mem*)getCore(ctx), x, y, w, h, sx, sy, colors, count, scale, remapCallback, &data); 474 476 } 475 477 else 476 478 { 477 - tic_api_map(tic, x, y, w, h, sx, sy, colors, count, scale, NULL, NULL); 479 + core->api.map(tic, x, y, w, h, sx, sy, colors, count, scale, NULL, NULL); 478 480 } 479 481 480 482 return JS_UNDEFINED; ··· 485 487 s32 x = getInteger2(ctx, argv[0], 0); 486 488 s32 y = getInteger2(ctx, argv[1], 0); 487 489 488 - tic_mem* tic = (tic_mem*)getCore(ctx); 490 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 489 491 490 - u8 value = tic_api_mget(tic, x, y); 492 + u8 value = core->api.mget(tic, x, y); 491 493 return JS_NewInt32(ctx, value); 492 494 } 493 495 ··· 497 499 s32 y = getInteger2(ctx, argv[1], 0); 498 500 u8 value = getInteger2(ctx, argv[2], 0); 499 501 500 - tic_mem* tic = (tic_mem*)getCore(ctx); 502 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 501 503 502 - tic_api_mset(tic, x, y, value); 504 + core->api.mset(tic, x, y, value); 503 505 504 506 return JS_UNDEFINED; 505 507 } ··· 509 511 s32 address = getInteger(ctx, argv[0]); 510 512 s32 bits = getInteger2(ctx, argv[1], BITS_IN_BYTE); 511 513 512 - tic_mem* tic = (tic_mem*)getCore(ctx); 514 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 513 515 514 - return JS_NewInt32(ctx, tic_api_peek(tic, address, bits)); 516 + return JS_NewInt32(ctx, core->api.peek(tic, address, bits)); 515 517 } 516 518 517 519 static JSValue js_poke(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) ··· 520 522 u8 value = getInteger(ctx, argv[1]); 521 523 s32 bits = getInteger2(ctx, argv[2], BITS_IN_BYTE); 522 524 523 - tic_mem* tic = (tic_mem*)getCore(ctx); 524 - tic_api_poke(tic, address, value, bits); 525 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 526 + core->api.poke(tic, address, value, bits); 525 527 526 528 return JS_UNDEFINED; 527 529 } ··· 530 532 { 531 533 s32 address = getInteger(ctx, argv[0]); 532 534 533 - tic_mem* tic = (tic_mem*)getCore(ctx); 535 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 534 536 535 - return JS_NewInt32(ctx, tic_api_peek1(tic, address)); 537 + return JS_NewInt32(ctx, core->api.peek1(tic, address)); 536 538 } 537 539 538 540 static JSValue js_poke1(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) ··· 540 542 s32 address = getInteger(ctx, argv[0]); 541 543 u8 value = getInteger(ctx, argv[1]); 542 544 543 - tic_mem* tic = (tic_mem*)getCore(ctx); 544 - tic_api_poke1(tic, address, value); 545 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 546 + core->api.poke1(tic, address, value); 545 547 546 548 return JS_UNDEFINED; 547 549 } ··· 550 552 { 551 553 s32 address = getInteger(ctx, argv[0]); 552 554 553 - tic_mem* tic = (tic_mem*)getCore(ctx); 555 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 554 556 555 - return JS_NewInt32(ctx, tic_api_peek2(tic, address)); 557 + return JS_NewInt32(ctx, core->api.peek2(tic, address)); 556 558 } 557 559 558 560 static JSValue js_poke2(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) ··· 560 562 s32 address = getInteger(ctx, argv[0]); 561 563 u8 value = getInteger(ctx, argv[1]); 562 564 563 - tic_mem* tic = (tic_mem*)getCore(ctx); 564 - tic_api_poke2(tic, address, value); 565 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 566 + core->api.poke2(tic, address, value); 565 567 566 568 return JS_UNDEFINED; 567 569 } ··· 570 572 { 571 573 s32 address = getInteger(ctx, argv[0]); 572 574 573 - tic_mem* tic = (tic_mem*)getCore(ctx); 575 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 574 576 575 - return JS_NewInt32(ctx, tic_api_peek4(tic, address)); 577 + return JS_NewInt32(ctx, core->api.peek4(tic, address)); 576 578 } 577 579 578 580 static JSValue js_poke4(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) ··· 580 582 s32 address = getInteger(ctx, argv[0]); 581 583 u8 value = getInteger(ctx, argv[1]); 582 584 583 - tic_mem* tic = (tic_mem*)getCore(ctx); 584 - tic_api_poke4(tic, address, value); 585 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 586 + core->api.poke4(tic, address, value); 585 587 586 588 return JS_UNDEFINED; 587 589 } ··· 592 594 s32 src = getInteger(ctx, argv[1]); 593 595 s32 size = getInteger(ctx, argv[2]); 594 596 595 - tic_mem* tic = (tic_mem*)getCore(ctx); 596 - tic_api_memcpy(tic, dest, src, size); 597 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 598 + #undef memcpy 599 + core->api.memcpy(tic, dest, src, size); 597 600 598 601 return JS_UNDEFINED; 599 602 } ··· 604 607 u8 value = getInteger(ctx, argv[1]); 605 608 s32 size = getInteger(ctx, argv[2]); 606 609 607 - tic_mem* tic = (tic_mem*)getCore(ctx); 608 - tic_api_memset(tic, dest, value, size); 610 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 611 + 612 + #undef memset 613 + core->api.memset(tic, dest, value, size); 609 614 610 615 return JS_UNDEFINED; 611 616 } 612 617 613 618 static JSValue js_trace(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 614 619 { 615 - tic_mem* tic = (tic_mem*)getCore(ctx); 620 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 616 621 617 622 const char* text = JS_ToCString(ctx, argv[0]); 618 623 u8 color = getInteger2(ctx, argv[1], TIC_DEFAULT_COLOR); 619 624 620 - tic_api_trace(tic, text, color); 625 + core->api.trace(tic, text, color); 621 626 622 627 JS_FreeCString(ctx, text); 623 628 return JS_UNDEFINED; ··· 625 630 626 631 static JSValue js_pmem(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 627 632 { 628 - tic_mem* tic = (tic_mem*)getCore(ctx); 633 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 629 634 u32 index = getInteger(ctx, argv[0]); 630 635 631 636 if(index < TIC_PERSISTENT_SIZE) 632 637 { 633 - u32 val = tic_api_pmem(tic, index, 0, false); 638 + u32 val = core->api.pmem(tic, index, 0, false); 634 639 635 640 if(!JS_IsUndefined(argv[1])) 636 641 { 637 - tic_api_pmem(tic, index, getInteger(ctx, argv[1]), true); 642 + core->api.pmem(tic, index, getInteger(ctx, argv[1]), true); 638 643 } 639 644 640 645 return JS_NewInt32(ctx, val); ··· 646 651 647 652 static JSValue js_time(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 648 653 { 649 - tic_mem* tic = (tic_mem*)getCore(ctx); 654 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 650 655 651 - return JS_NewFloat64(ctx, tic_api_time(tic)); 656 + return JS_NewFloat64(ctx, core->api.time(tic)); 652 657 } 653 658 654 659 static JSValue js_tstamp(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 655 660 { 656 - tic_mem* tic = (tic_mem*)getCore(ctx); 661 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 657 662 658 - return JS_NewInt32(ctx, tic_api_tstamp(tic)); 663 + return JS_NewInt32(ctx, core->api.tstamp(tic)); 659 664 } 660 665 661 666 static JSValue js_exit(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 662 667 { 663 - tic_api_exit((tic_mem*)getCore(ctx)); 668 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 669 + 670 + core->api.exit(tic); 664 671 665 672 return JS_UNDEFINED; 666 673 } 667 674 668 675 static JSValue js_font(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 669 676 { 670 - tic_mem* tic = (tic_mem*)getCore(ctx); 677 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 671 678 672 679 const char* text = JS_ToCString(ctx, argv[0]); 673 680 s32 x = getInteger(ctx, argv[1]); ··· 679 686 s32 scale = getInteger2(ctx, argv[7], 1); 680 687 bool alt = JS_ToBool(ctx, argv[8]); 681 688 682 - s32 size = scale ? tic_api_font(tic, text, x, y, &chromakey, 1, width, height, fixed, scale, alt) : 0; 689 + s32 size = scale ? core->api.font(tic, text, x, y, &chromakey, 1, width, height, fixed, scale, alt) : 0; 683 690 684 691 JS_FreeCString(ctx, text); 685 692 return JS_NewInt32(ctx, size); ··· 693 700 694 701 JSValue arr = JS_NewArray(ctx); 695 702 696 - tic_point pos = tic_api_mouse((tic_mem*)core); 703 + tic_point pos = core->api.mouse((tic_mem*)core); 697 704 698 705 JS_SetPropertyUint32(ctx, arr, 0, JS_NewInt32(ctx, pos.x)); 699 706 JS_SetPropertyUint32(ctx, arr, 1, JS_NewInt32(ctx, pos.y)); ··· 713 720 s32 radius = getInteger(ctx, argv[2]); 714 721 s32 color = getInteger(ctx, argv[3]); 715 722 716 - tic_mem* tic = (tic_mem*)getCore(ctx); 723 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 717 724 718 - tic_api_circ(tic, x, y, radius, color); 725 + core->api.circ(tic, x, y, radius, color); 719 726 720 727 return JS_UNDEFINED; 721 728 } ··· 727 734 s32 radius = getInteger(ctx, argv[2]); 728 735 s32 color = getInteger(ctx, argv[3]); 729 736 730 - tic_mem* tic = (tic_mem*)getCore(ctx); 737 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 731 738 732 - tic_api_circb(tic, x, y, radius, color); 739 + core->api.circb(tic, x, y, radius, color); 733 740 734 741 return JS_UNDEFINED; 735 742 } ··· 742 749 s32 b = getInteger(ctx, argv[3]); 743 750 s32 color = getInteger(ctx, argv[4]); 744 751 745 - tic_mem* tic = (tic_mem*)getCore(ctx); 752 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 746 753 747 - tic_api_elli(tic, x, y, a, b, color); 754 + core->api.elli(tic, x, y, a, b, color); 748 755 749 756 return JS_UNDEFINED; 750 757 } ··· 757 764 s32 b = getInteger(ctx, argv[3]); 758 765 s32 color = getInteger(ctx, argv[4]); 759 766 760 - tic_mem* tic = (tic_mem*)getCore(ctx); 767 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 761 768 762 - tic_api_ellib(tic, x, y, a, b, color); 769 + core->api.ellib(tic, x, y, a, b, color); 763 770 764 771 return JS_UNDEFINED; 765 772 } ··· 773 780 774 781 s32 color = getInteger(ctx, argv[6]); 775 782 776 - tic_mem* tic = (tic_mem*)getCore(ctx); 783 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 777 784 778 - tic_api_tri(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 785 + core->api.tri(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 779 786 780 787 return JS_UNDEFINED; 781 788 } ··· 789 796 790 797 s32 color = getInteger(ctx, argv[6]); 791 798 792 - tic_mem* tic = (tic_mem*)getCore(ctx); 799 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 793 800 794 - tic_api_trib(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 801 + core->api.trib(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 795 802 796 803 return JS_UNDEFINED; 797 804 } ··· 805 812 for (s32 i = 0; i < COUNT_OF(pt); i++) 806 813 pt[i] = getNumber(ctx, argv[i]); 807 814 808 - tic_mem* tic = (tic_mem*)getCore(ctx); 815 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 809 816 bool use_map = JS_ToBool(ctx, argv[12]); 810 817 811 818 static u8 colors[TIC_PALETTE_SIZE]; ··· 847 854 for (s32 i = 0; i < COUNT_OF(pt); i++) 848 855 pt[i] = getNumber(ctx, argv[i]); 849 856 850 - tic_mem* tic = (tic_mem*)getCore(ctx); 857 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 851 858 tic_texture_src src = getInteger(ctx, argv[12]); 852 859 853 860 static u8 colors[TIC_PALETTE_SIZE]; ··· 876 883 else z[i] = getNumber(ctx, argv[index]); 877 884 } 878 885 879 - tic_api_ttri(tic, pt[0], pt[1], // xy 1 886 + core->api.ttri(tic, pt[0], pt[1], // xy 1 880 887 pt[2], pt[3], // xy 2 881 888 pt[4], pt[5], // xy 3 882 889 pt[6], pt[7], // uv 1 ··· 897 904 s32 w = getInteger2(ctx, argv[2], TIC80_WIDTH); 898 905 s32 h = getInteger2(ctx, argv[3], TIC80_HEIGHT); 899 906 900 - tic_mem* tic = (tic_mem*)getCore(ctx); 907 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 901 908 902 - tic_api_clip(tic, x, y, w, h); 909 + core->api.clip(tic, x, y, w, h); 903 910 904 911 return JS_UNDEFINED; 905 912 } 906 913 907 914 static JSValue js_music(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 908 915 { 909 - tic_mem* tic = (tic_mem*)getCore(ctx); 916 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 910 917 911 918 s32 track = getInteger2(ctx, argv[0], -1); 912 - tic_api_music(tic, -1, 0, 0, false, false, -1, -1); 919 + core->api.music(tic, -1, 0, 0, false, false, -1, -1); 913 920 914 921 if(track >= 0) 915 922 { ··· 926 933 s32 tempo = getInteger2(ctx, argv[5], -1); 927 934 s32 speed = getInteger2(ctx, argv[6], -1); 928 935 929 - tic_api_music(tic, track, frame, row, loop, sustain, tempo, speed); 936 + core->api.music(tic, track, frame, row, loop, sustain, tempo, speed); 930 937 } 931 938 932 939 return JS_UNDEFINED; ··· 940 947 s32 prev = core->state.vbank.id; 941 948 942 949 if(!JS_IsUndefined(argv[0])) 943 - tic_api_vbank(tic, getInteger2(ctx, argv[0], 0)); 950 + core->api.vbank(tic, getInteger2(ctx, argv[0], 0)); 944 951 945 952 return JS_NewUint32(ctx, prev); 946 953 } 947 954 948 955 static JSValue js_sync(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 949 956 { 950 - tic_mem* tic = (tic_mem*)getCore(ctx); 957 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 951 958 952 959 u32 mask = getInteger2(ctx, argv[0], 0); 953 960 s32 bank = getInteger2(ctx, argv[1], 0); 954 961 bool toCart = JS_ToBool(ctx, argv[2]); 955 962 956 963 if(bank >= 0 && bank < TIC_BANKS) 957 - tic_api_sync(tic, mask, bank, toCart); 964 + core->api.sync(tic, mask, bank, toCart); 958 965 else 959 966 throwError(ctx, "sync() error, invalid bank"); 960 967 ··· 972 979 973 980 static JSValue js_fget(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 974 981 { 975 - tic_mem* tic = (tic_mem*)getCore(ctx); 982 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 976 983 977 984 u32 index = getInteger2(ctx, argv[0], 0); 978 985 u32 flag = getInteger2(ctx, argv[1], 0); 979 986 980 - bool value = tic_api_fget(tic, index, flag); 987 + bool value = core->api.fget(tic, index, flag); 981 988 982 989 return JS_NewBool(ctx, value); 983 990 } 984 991 985 992 static JSValue js_fset(JSContext *ctx, JSValueConst this_val, s32 argc, JSValueConst *argv) 986 993 { 987 - tic_mem* tic = (tic_mem*)getCore(ctx); 994 + tic_core* core = getCore(ctx); tic_mem* tic = (tic_mem*)core; 988 995 989 996 u32 index = getInteger2(ctx, argv[0], 0); 990 997 u32 flag = getInteger2(ctx, argv[1], 0); 991 998 bool value = JS_ToBool(ctx, argv[2]); 992 999 993 - tic_api_fset(tic, index, flag, value); 1000 + core->api.fset(tic, index, flag, value); 994 1001 995 1002 return JS_UNDEFINED; 996 1003 }
+145 -99
src/api/lua.c
··· 29 29 #include <lualib.h> 30 30 #include <ctype.h> 31 31 32 - s32 luaopen_lpeg(lua_State *lua); 32 + extern bool parse_note(const char* noteStr, s32* note, s32* octave); 33 33 34 34 static inline s32 getLuaNumber(lua_State* lua, s32 index) 35 35 { ··· 52 52 static s32 lua_peek(lua_State* lua) 53 53 { 54 54 s32 top = lua_gettop(lua); 55 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 55 + tic_core* core = getLuaCore(lua); 56 + tic_mem* tic = (tic_mem*)core; 56 57 57 58 if(top >= 1) 58 59 { ··· 62 63 if(top == 2) 63 64 bits = getLuaNumber(lua, 2); 64 65 65 - lua_pushinteger(lua, tic_api_peek(tic, address, bits)); 66 + lua_pushinteger(lua, core->api.peek(tic, address, bits)); 66 67 return 1; 67 68 } 68 69 else luaL_error(lua, "invalid parameters, peek(addr,bits)\n"); ··· 73 74 static s32 lua_poke(lua_State* lua) 74 75 { 75 76 s32 top = lua_gettop(lua); 76 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 77 + tic_core* core = getLuaCore(lua); 78 + tic_mem* tic = (tic_mem*)core; 77 79 78 80 if(top >= 2) 79 81 { ··· 84 86 if(top == 3) 85 87 bits = getLuaNumber(lua, 3); 86 88 87 - tic_api_poke(tic, address, value, bits); 89 + core->api.poke(tic, address, value, bits); 88 90 } 89 91 else luaL_error(lua, "invalid parameters, poke(addr,val,bits)\n"); 90 92 ··· 94 96 static s32 lua_peek1(lua_State* lua) 95 97 { 96 98 s32 top = lua_gettop(lua); 97 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 99 + tic_core* core = getLuaCore(lua); 100 + tic_mem* tic = (tic_mem*)core; 98 101 99 102 if(top == 1) 100 103 { 101 104 s32 address = getLuaNumber(lua, 1); 102 - lua_pushinteger(lua, tic_api_peek1(tic, address)); 105 + lua_pushinteger(lua, core->api.peek1(tic, address)); 103 106 return 1; 104 107 } 105 108 else luaL_error(lua, "invalid parameters, peek1(addr)\n"); ··· 110 113 static s32 lua_poke1(lua_State* lua) 111 114 { 112 115 s32 top = lua_gettop(lua); 113 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 116 + tic_core* core = getLuaCore(lua); 117 + tic_mem* tic = (tic_mem*)core; 114 118 115 119 if(top == 2) 116 120 { 117 121 s32 address = getLuaNumber(lua, 1); 118 122 u8 value = getLuaNumber(lua, 2); 119 123 120 - tic_api_poke1(tic, address, value); 124 + core->api.poke1(tic, address, value); 121 125 } 122 126 else luaL_error(lua, "invalid parameters, poke1(addr,val)\n"); 123 127 ··· 127 131 static s32 lua_peek2(lua_State* lua) 128 132 { 129 133 s32 top = lua_gettop(lua); 130 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 134 + tic_core* core = getLuaCore(lua); 135 + tic_mem* tic = (tic_mem*)core; 131 136 132 137 if(top == 1) 133 138 { 134 139 s32 address = getLuaNumber(lua, 1); 135 - lua_pushinteger(lua, tic_api_peek2(tic, address)); 140 + lua_pushinteger(lua, core->api.peek2(tic, address)); 136 141 return 1; 137 142 } 138 143 else luaL_error(lua, "invalid parameters, peek2(addr)\n"); ··· 143 148 static s32 lua_poke2(lua_State* lua) 144 149 { 145 150 s32 top = lua_gettop(lua); 146 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 151 + tic_core* core = getLuaCore(lua); 152 + tic_mem* tic = (tic_mem*)core; 147 153 148 154 if(top == 2) 149 155 { 150 156 s32 address = getLuaNumber(lua, 1); 151 157 u8 value = getLuaNumber(lua, 2); 152 158 153 - tic_api_poke2(tic, address, value); 159 + core->api.poke2(tic, address, value); 154 160 } 155 161 else luaL_error(lua, "invalid parameters, poke2(addr,val)\n"); 156 162 ··· 160 166 static s32 lua_peek4(lua_State* lua) 161 167 { 162 168 s32 top = lua_gettop(lua); 163 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 169 + tic_core* core = getLuaCore(lua); 170 + tic_mem* tic = (tic_mem*)core; 164 171 165 172 if(top == 1) 166 173 { 167 174 s32 address = getLuaNumber(lua, 1); 168 - lua_pushinteger(lua, tic_api_peek4(tic, address)); 175 + lua_pushinteger(lua, core->api.peek4(tic, address)); 169 176 return 1; 170 177 } 171 178 else luaL_error(lua, "invalid parameters, peek4(addr)\n"); ··· 176 183 static s32 lua_poke4(lua_State* lua) 177 184 { 178 185 s32 top = lua_gettop(lua); 179 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 186 + tic_core* core = getLuaCore(lua); 187 + tic_mem* tic = (tic_mem*)core; 180 188 181 189 if(top == 2) 182 190 { 183 191 s32 address = getLuaNumber(lua, 1); 184 192 u8 value = getLuaNumber(lua, 2); 185 193 186 - tic_api_poke4(tic, address, value); 194 + core->api.poke4(tic, address, value); 187 195 } 188 196 else luaL_error(lua, "invalid parameters, poke4(addr,val)\n"); 189 197 ··· 194 202 { 195 203 s32 top = lua_gettop(lua); 196 204 197 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 205 + tic_core* core = getLuaCore(lua); 206 + tic_mem* tic = (tic_mem*)core; 198 207 199 - tic_api_cls(tic, top == 1 ? getLuaNumber(lua, 1) : 0); 208 + core->api.cls(tic, top == 1 ? getLuaNumber(lua, 1) : 0); 200 209 201 210 return 0; 202 211 } ··· 210 219 s32 x = getLuaNumber(lua, 1); 211 220 s32 y = getLuaNumber(lua, 2); 212 221 213 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 222 + tic_core* core = getLuaCore(lua); 223 + tic_mem* tic = (tic_mem*)core; 214 224 215 225 if(top >= 3) 216 226 { 217 227 s32 color = getLuaNumber(lua, 3); 218 - tic_api_pix(tic, x, y, color, false); 228 + core->api.pix(tic, x, y, color, false); 219 229 } 220 230 else 221 231 { 222 - lua_pushinteger(lua, tic_api_pix(tic, x, y, 0, true)); 232 + lua_pushinteger(lua, core->api.pix(tic, x, y, 0, true)); 223 233 return 1; 224 234 } 225 235 ··· 241 251 float y1 = lua_tonumber(lua, 4); 242 252 s32 color = getLuaNumber(lua, 5); 243 253 244 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 254 + tic_core* core = getLuaCore(lua); 255 + tic_mem* tic = (tic_mem*)core; 245 256 246 - tic_api_line(tic, x0, y0, x1, y1, color); 257 + core->api.line(tic, x0, y0, x1, y1, color); 247 258 } 248 259 else luaL_error(lua, "invalid parameters, line(x0,y0,x1,y1,color)\n"); 249 260 ··· 262 273 s32 h = getLuaNumber(lua, 4); 263 274 s32 color = getLuaNumber(lua, 5); 264 275 265 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 276 + tic_core* core = getLuaCore(lua); 277 + tic_mem* tic = (tic_mem*)core; 266 278 267 - tic_api_rect(tic, x, y, w, h, color); 279 + core->api.rect(tic, x, y, w, h, color); 268 280 } 269 281 else luaL_error(lua, "invalid parameters, rect(x,y,w,h,color)\n"); 270 282 ··· 283 295 s32 h = getLuaNumber(lua, 4); 284 296 s32 color = getLuaNumber(lua, 5); 285 297 286 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 298 + tic_core* core = getLuaCore(lua); 299 + tic_mem* tic = (tic_mem*)core; 287 300 288 - tic_api_rectb(tic, x, y, w, h, color); 301 + core->api.rectb(tic, x, y, w, h, color); 289 302 } 290 303 else luaL_error(lua, "invalid parameters, rectb(x,y,w,h,color)\n"); 291 304 ··· 298 311 299 312 if(top == 4) 300 313 { 301 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 314 + tic_core* core = getLuaCore(lua); 315 + tic_mem* tic = (tic_mem*)core; 302 316 303 317 s32 x = getLuaNumber(lua, 1); 304 318 s32 y = getLuaNumber(lua, 2); 305 319 s32 radius = getLuaNumber(lua, 3); 306 320 s32 color = getLuaNumber(lua, 4); 307 321 308 - tic_api_circ(tic, x, y, radius, color); 322 + core->api.circ(tic, x, y, radius, color); 309 323 } 310 324 else luaL_error(lua, "invalid parameters, circ(x,y,radius,color)\n"); 311 325 ··· 318 332 319 333 if(top == 4) 320 334 { 321 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 335 + tic_core* core = getLuaCore(lua); 336 + tic_mem* tic = (tic_mem*)core; 322 337 323 338 s32 x = getLuaNumber(lua, 1); 324 339 s32 y = getLuaNumber(lua, 2); 325 340 s32 radius = getLuaNumber(lua, 3); 326 341 s32 color = getLuaNumber(lua, 4); 327 342 328 - tic_api_circb(tic, x, y, radius, color); 343 + core->api.circb(tic, x, y, radius, color); 329 344 } 330 345 else luaL_error(lua, "invalid parameters, circb(x,y,radius,color)\n"); 331 346 ··· 338 353 339 354 if(top == 5) 340 355 { 341 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 356 + tic_core* core = getLuaCore(lua); 357 + tic_mem* tic = (tic_mem*)core; 342 358 343 359 s32 x = getLuaNumber(lua, 1); 344 360 s32 y = getLuaNumber(lua, 2); ··· 346 362 s32 b = getLuaNumber(lua, 4); 347 363 s32 color = getLuaNumber(lua, 5); 348 364 349 - tic_api_elli(tic, x, y, a, b, color); 365 + core->api.elli(tic, x, y, a, b, color); 350 366 } 351 367 else luaL_error(lua, "invalid parameters, elli(x,y,a,b,color)\n"); 352 368 ··· 359 375 360 376 if(top == 5) 361 377 { 362 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 378 + tic_core* core = getLuaCore(lua); 379 + tic_mem* tic = (tic_mem*)core; 363 380 364 381 s32 x = getLuaNumber(lua, 1); 365 382 s32 y = getLuaNumber(lua, 2); ··· 367 384 s32 b = getLuaNumber(lua, 4); 368 385 s32 color = getLuaNumber(lua, 5); 369 386 370 - tic_api_ellib(tic, x, y, a, b, color); 387 + core->api.ellib(tic, x, y, a, b, color); 371 388 } 372 389 else luaL_error(lua, "invalid parameters, ellib(x,y,a,b,color)\n"); 373 390 ··· 387 404 388 405 s32 color = getLuaNumber(lua, 7); 389 406 390 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 407 + tic_core* core = getLuaCore(lua); 408 + tic_mem* tic = (tic_mem*)core; 391 409 392 - tic_api_tri(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 410 + core->api.tri(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 393 411 } 394 412 else luaL_error(lua, "invalid parameters, tri(x1,y1,x2,y2,x3,y3,color)\n"); 395 413 ··· 409 427 410 428 s32 color = getLuaNumber(lua, 7); 411 429 412 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 430 + tic_core* core = getLuaCore(lua); 431 + tic_mem* tic = (tic_mem*)core; 413 432 414 - tic_api_trib(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 433 + core->api.trib(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 415 434 } 416 435 else luaL_error(lua, "invalid parameters, trib(x1,y1,x2,y2,x3,y3,color)\n"); 417 436 ··· 431 450 for (s32 i = 0; i < COUNT_OF(pt); i++) 432 451 pt[i] = (float)lua_tonumber(lua, i + 1); 433 452 434 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 453 + tic_core* core = getLuaCore(lua); 454 + tic_mem* tic = (tic_mem*)core; 435 455 static u8 colors[TIC_PALETTE_SIZE]; 436 456 s32 count = 0; 437 457 bool use_map = false; ··· 495 515 for (s32 i = 0; i < COUNT_OF(pt); i++) 496 516 pt[i] = (float)lua_tonumber(lua, i + 1); 497 517 498 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 518 + tic_core* core = getLuaCore(lua); 519 + tic_mem* tic = (tic_mem*)core; 499 520 static u8 colors[TIC_PALETTE_SIZE]; 500 521 s32 count = 0; 501 522 tic_texture_src src = tic_tiles_texture; ··· 546 567 depth = true; 547 568 } 548 569 549 - tic_api_ttri(tic, pt[0], pt[1], // xy 1 570 + core->api.ttri(tic, pt[0], pt[1], // xy 1 550 571 pt[2], pt[3], // xy 2 551 572 pt[4], pt[5], // xy 3 552 573 pt[6], pt[7], // uv 1 ··· 567 588 568 589 if(top == 0) 569 590 { 570 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 591 + tic_core* core = getLuaCore(lua); 592 + tic_mem* tic = (tic_mem*)core; 571 593 572 - tic_api_clip(tic, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); 594 + core->api.clip(tic, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); 573 595 } 574 596 else if(top == 4) 575 597 { ··· 578 600 s32 w = getLuaNumber(lua, 3); 579 601 s32 h = getLuaNumber(lua, 4); 580 602 581 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 603 + tic_core* core = getLuaCore(lua); 604 + tic_mem* tic = (tic_mem*)core; 582 605 583 - tic_api_clip((tic_mem*)getLuaCore(lua), x, y, w, h); 606 + core->api.clip((tic_mem*)getLuaCore(lua), x, y, w, h); 584 607 } 585 608 else luaL_error(lua, "invalid parameters, use clip(x,y,w,h) or clip()\n"); 586 609 ··· 596 619 597 620 if (top == 0) 598 621 { 599 - lua_pushinteger(lua, tic_api_btnp(tic, -1, -1, -1)); 622 + lua_pushinteger(lua, core->api.btnp(tic, -1, -1, -1)); 600 623 } 601 624 else if(top == 1) 602 625 { 603 626 s32 index = getLuaNumber(lua, 1) & 0x1f; 604 627 605 - lua_pushboolean(lua, tic_api_btnp(tic, index, -1, -1)); 628 + lua_pushboolean(lua, core->api.btnp(tic, index, -1, -1)); 606 629 } 607 630 else if (top == 3) 608 631 { ··· 610 633 u32 hold = getLuaNumber(lua, 2); 611 634 u32 period = getLuaNumber(lua, 3); 612 635 613 - lua_pushboolean(lua, tic_api_btnp(tic, index, hold, period)); 636 + lua_pushboolean(lua, core->api.btnp(tic, index, hold, period)); 614 637 } 615 638 else 616 639 { ··· 630 653 631 654 if (top == 0) 632 655 { 633 - lua_pushinteger(lua, tic_api_btn(tic, -1)); 656 + lua_pushinteger(lua, core->api.btn(tic, -1)); 634 657 } 635 658 else if (top == 1) 636 659 { 637 - bool pressed = tic_api_btn(tic, getLuaNumber(lua, 1) & 0x1f); 660 + bool pressed = core->api.btn(tic, getLuaNumber(lua, 1) & 0x1f); 638 661 lua_pushboolean(lua, pressed); 639 662 } 640 663 else ··· 720 743 } 721 744 } 722 745 723 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 746 + tic_core* core = getLuaCore(lua); 747 + tic_mem* tic = (tic_mem*)core; 724 748 725 - tic_api_spr(tic, index, x, y, w, h, colors, count, scale, flip, rotate); 749 + core->api.spr(tic, index, x, y, w, h, colors, count, scale, flip, rotate); 726 750 727 751 return 0; 728 752 } ··· 736 760 s32 x = getLuaNumber(lua, 1); 737 761 s32 y = getLuaNumber(lua, 2); 738 762 739 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 763 + tic_core* core = getLuaCore(lua); 764 + tic_mem* tic = (tic_mem*)core; 740 765 741 - u8 value = tic_api_mget(tic, x, y); 766 + u8 value = core->api.mget(tic, x, y); 742 767 lua_pushinteger(lua, value); 743 768 return 1; 744 769 } ··· 757 782 s32 y = getLuaNumber(lua, 2); 758 783 u8 val = getLuaNumber(lua, 3); 759 784 760 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 785 + tic_core* core = getLuaCore(lua); 786 + tic_mem* tic = (tic_mem*)core; 761 787 762 - tic_api_mset(tic, x, y, val); 788 + core->api.mset(tic, x, y, val); 763 789 } 764 790 else luaL_error(lua, "invalid params, mget(x,y)\n"); 765 791 ··· 855 881 856 882 RemapData data = {lua, remap}; 857 883 858 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 884 + tic_core* core = getLuaCore(lua); 885 + tic_mem* tic = (tic_mem*)core; 859 886 860 - tic_api_map(tic, x, y, w, h, sx, sy, colors, count, scale, remapCallback, &data); 887 + core->api.map(tic, x, y, w, h, sx, sy, colors, count, scale, remapCallback, &data); 861 888 862 889 luaL_unref(lua, LUA_REGISTRYINDEX, data.reg); 863 890 ··· 870 897 } 871 898 } 872 899 873 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 900 + tic_core* core = getLuaCore(lua); 901 + tic_mem* tic = (tic_mem*)core; 874 902 875 - tic_api_map((tic_mem*)getLuaCore(lua), x, y, w, h, sx, sy, colors, count, scale, NULL, NULL); 903 + core->api.map((tic_mem*)getLuaCore(lua), x, y, w, h, sx, sy, colors, count, scale, NULL, NULL); 876 904 877 905 return 0; 878 906 } ··· 880 908 static s32 lua_music(lua_State* lua) 881 909 { 882 910 s32 top = lua_gettop(lua); 883 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 911 + tic_core* core = getLuaCore(lua); 912 + tic_mem* tic = (tic_mem*)core; 884 913 885 - if(top == 0) tic_api_music(tic, -1, 0, 0, false, false, -1, -1); 914 + if(top == 0) core->api.music(tic, -1, 0, 0, false, false, -1, -1); 886 915 else if(top >= 1) 887 916 { 888 917 s32 track = getLuaNumber(lua, 1); ··· 893 922 return 0; 894 923 } 895 924 896 - tic_api_music(tic, -1, 0, 0, false, false, -1, -1); 925 + core->api.music(tic, -1, 0, 0, false, false, -1, -1); 897 926 898 927 s32 frame = -1; 899 928 s32 row = -1; ··· 933 962 } 934 963 } 935 964 936 - tic_api_music(tic, track, frame, row, loop, sustain, tempo, speed); 965 + core->api.music(tic, track, frame, row, loop, sustain, tempo, speed); 937 966 } 938 967 else luaL_error(lua, "invalid params, use music(track)\n"); 939 968 ··· 946 975 947 976 if(top >= 1) 948 977 { 949 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 978 + tic_core* core = getLuaCore(lua); 979 + tic_mem* tic = (tic_mem*)core; 950 980 951 981 s32 note = -1; 952 982 s32 octave = -1; ··· 980 1010 { 981 1011 const char* noteStr = lua_tostring(lua, 2); 982 1012 983 - if(!tic_tool_parse_note(noteStr, &note, &octave)) 1013 + if(!parse_note(noteStr, &note, &octave)) 984 1014 { 985 1015 luaL_error(lua, "invalid note, should be like C#4\n"); 986 1016 return 0; ··· 1018 1048 1019 1049 if (channel >= 0 && channel < TIC_SOUND_CHANNELS) 1020 1050 { 1021 - tic_api_sfx(tic, index, note, octave, duration, channel, volumes[0] & 0xf, volumes[1] & 0xf, speed); 1051 + core->api.sfx(tic, index, note, octave, duration, channel, volumes[0] & 0xf, volumes[1] & 0xf, speed); 1022 1052 } 1023 1053 else luaL_error(lua, "unknown channel\n"); 1024 1054 } ··· 1037 1067 s32 prev = core->state.vbank.id; 1038 1068 1039 1069 if(lua_gettop(lua) == 1) 1040 - tic_api_vbank(tic, getLuaNumber(lua, 1)); 1070 + core->api.vbank(tic, getLuaNumber(lua, 1)); 1041 1071 1042 1072 lua_pushinteger(lua, prev); 1043 1073 return 1; ··· 1045 1075 1046 1076 static s32 lua_sync(lua_State* lua) 1047 1077 { 1048 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 1078 + tic_core* core = getLuaCore(lua); 1079 + tic_mem* tic = (tic_mem*)core; 1049 1080 1050 1081 bool toCart = false; 1051 1082 u32 mask = 0; ··· 1067 1098 } 1068 1099 1069 1100 if(bank >= 0 && bank < TIC_BANKS) 1070 - tic_api_sync(tic, mask, bank, toCart); 1101 + core->api.sync(tic, mask, bank, toCart); 1071 1102 else 1072 1103 luaL_error(lua, "sync() error, invalid bank"); 1073 1104 ··· 1092 1123 1093 1124 if (top == 0) 1094 1125 { 1095 - lua_pushboolean(lua, tic_api_key(tic, tic_key_unknown)); 1126 + lua_pushboolean(lua, core->api.key(tic, tic_key_unknown)); 1096 1127 } 1097 1128 else if (top == 1) 1098 1129 { 1099 1130 tic_key key = getLuaNumber(lua, 1); 1100 1131 1101 1132 if(key < tic_keys_count) 1102 - lua_pushboolean(lua, tic_api_key(tic, key)); 1133 + lua_pushboolean(lua, core->api.key(tic, key)); 1103 1134 else 1104 1135 { 1105 1136 luaL_error(lua, "unknown keyboard code\n"); ··· 1124 1155 1125 1156 if (top == 0) 1126 1157 { 1127 - lua_pushboolean(lua, tic_api_keyp(tic, tic_key_unknown, -1, -1)); 1158 + lua_pushboolean(lua, core->api.keyp(tic, tic_key_unknown, -1, -1)); 1128 1159 } 1129 1160 else 1130 1161 { ··· 1138 1169 { 1139 1170 if(top == 1) 1140 1171 { 1141 - lua_pushboolean(lua, tic_api_keyp(tic, key, -1, -1)); 1172 + lua_pushboolean(lua, core->api.keyp(tic, key, -1, -1)); 1142 1173 } 1143 1174 else if(top == 3) 1144 1175 { 1145 1176 u32 hold = getLuaNumber(lua, 2); 1146 1177 u32 period = getLuaNumber(lua, 3); 1147 1178 1148 - lua_pushboolean(lua, tic_api_keyp(tic, key, hold, period)); 1179 + lua_pushboolean(lua, core->api.keyp(tic, key, hold, period)); 1149 1180 } 1150 1181 else 1151 1182 { ··· 1168 1199 s32 src = getLuaNumber(lua, 2); 1169 1200 s32 size = getLuaNumber(lua, 3); 1170 1201 1171 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 1172 - tic_api_memcpy(tic, dest, src, size); 1202 + tic_core* core = getLuaCore(lua); 1203 + tic_mem* tic = (tic_mem*)core; 1204 + #undef memcpy 1205 + core->api.memcpy(tic, dest, src, size); 1173 1206 } 1174 1207 else luaL_error(lua, "invalid params, memcpy(dest,src,size)\n"); 1175 1208 ··· 1186 1219 u8 value = getLuaNumber(lua, 2); 1187 1220 s32 size = getLuaNumber(lua, 3); 1188 1221 1189 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 1190 - tic_api_memset(tic, dest, value, size); 1222 + tic_core* core = getLuaCore(lua); 1223 + tic_mem* tic = (tic_mem*)core; 1224 + 1225 + #undef memset 1226 + core->api.memset(tic, dest, value, size); 1191 1227 } 1192 1228 else luaL_error(lua, "invalid params, memset(dest,val,size)\n"); 1193 1229 ··· 1210 1246 1211 1247 static s32 lua_font(lua_State* lua) 1212 1248 { 1213 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 1249 + tic_core* core = getLuaCore(lua); 1250 + tic_mem* tic = (tic_mem*)core; 1214 1251 s32 top = lua_gettop(lua); 1215 1252 1216 1253 if(top >= 1) ··· 1263 1300 return 1; 1264 1301 } 1265 1302 1266 - s32 size = tic_api_font(tic, text, x, y, &chromakey, 1, width, height, fixed, scale, alt); 1303 + s32 size = core->api.font(tic, text, x, y, &chromakey, 1, width, height, fixed, scale, alt); 1267 1304 1268 1305 lua_pushinteger(lua, size); 1269 1306 ··· 1279 1316 1280 1317 if(top >= 1) 1281 1318 { 1282 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 1319 + tic_core* core = getLuaCore(lua); 1320 + tic_mem* tic = (tic_mem*)core; 1283 1321 1284 1322 s32 x = 0; 1285 1323 s32 y = 0; ··· 1322 1360 return 1; 1323 1361 } 1324 1362 1325 - s32 size = tic_api_print(tic, text ? text : "nil", x, y, color, fixed, scale, alt); 1363 + s32 size = core->api.print(tic, text ? text : "nil", x, y, color, fixed, scale, alt); 1326 1364 1327 1365 lua_pushinteger(lua, size); 1328 1366 ··· 1335 1373 static s32 lua_trace(lua_State *lua) 1336 1374 { 1337 1375 s32 top = lua_gettop(lua); 1338 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 1376 + tic_core* core = getLuaCore(lua); 1377 + tic_mem* tic = (tic_mem*)core; 1339 1378 1340 1379 if(top >= 1) 1341 1380 { ··· 1347 1386 color = getLuaNumber(lua, 2); 1348 1387 } 1349 1388 1350 - tic_api_trace(tic, text, color); 1389 + core->api.trace(tic, text, color); 1351 1390 } 1352 1391 else luaL_error(lua, "invalid params, trace(text,[color])\n"); 1353 1392 ··· 1366 1405 1367 1406 if(index < TIC_PERSISTENT_SIZE) 1368 1407 { 1369 - u32 val = tic_api_pmem(tic, index, 0, false); 1408 + u32 val = core->api.pmem(tic, index, 0, false); 1370 1409 1371 1410 if(top >= 2) 1372 1411 { 1373 - tic_api_pmem(tic, index, (u32)lua_tointeger(lua, 2), true); 1412 + core->api.pmem(tic, index, (u32)lua_tointeger(lua, 2), true); 1374 1413 } 1375 1414 1376 1415 lua_pushinteger(lua, val); ··· 1387 1426 1388 1427 static s32 lua_time(lua_State *lua) 1389 1428 { 1390 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 1429 + tic_core* core = getLuaCore(lua); 1430 + tic_mem* tic = (tic_mem*)core; 1391 1431 1392 - lua_pushnumber(lua, tic_api_time(tic)); 1432 + lua_pushnumber(lua, core->api.time(tic)); 1393 1433 1394 1434 return 1; 1395 1435 } 1396 1436 1397 1437 static s32 lua_tstamp(lua_State *lua) 1398 1438 { 1399 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 1439 + tic_core* core = getLuaCore(lua); 1440 + tic_mem* tic = (tic_mem*)core; 1400 1441 1401 - lua_pushnumber(lua, tic_api_tstamp(tic)); 1442 + lua_pushnumber(lua, core->api.tstamp(tic)); 1402 1443 1403 1444 return 1; 1404 1445 } 1405 1446 1406 1447 static s32 lua_exit(lua_State *lua) 1407 1448 { 1408 - tic_api_exit((tic_mem*)getLuaCore(lua)); 1449 + tic_core* core = getLuaCore(lua); 1450 + tic_mem* tic = (tic_mem*)core; 1451 + 1452 + core->api.exit(tic); 1409 1453 1410 1454 return 0; 1411 1455 } ··· 1415 1459 tic_core* core = getLuaCore(lua); 1416 1460 1417 1461 { 1418 - tic_point pos = tic_api_mouse((tic_mem*)core); 1462 + tic_point pos = core->api.mouse((tic_mem*)core); 1419 1463 1420 1464 lua_pushinteger(lua, pos.x); 1421 1465 lua_pushinteger(lua, pos.y); ··· 1434 1478 1435 1479 static s32 lua_fget(lua_State* lua) 1436 1480 { 1437 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 1481 + tic_core* core = getLuaCore(lua); 1482 + tic_mem* tic = (tic_mem*)core; 1438 1483 s32 top = lua_gettop(lua); 1439 1484 1440 1485 if(top >= 1) ··· 1444 1489 if(top >= 2) 1445 1490 { 1446 1491 u32 flag = getLuaNumber(lua, 2); 1447 - lua_pushboolean(lua, tic_api_fget(tic, index, flag)); 1492 + lua_pushboolean(lua, core->api.fget(tic, index, flag)); 1448 1493 return 1; 1449 1494 } 1450 1495 } ··· 1456 1501 1457 1502 static s32 lua_fset(lua_State* lua) 1458 1503 { 1459 - tic_mem* tic = (tic_mem*)getLuaCore(lua); 1504 + tic_core* core = getLuaCore(lua); 1505 + tic_mem* tic = (tic_mem*)core; 1460 1506 s32 top = lua_gettop(lua); 1461 1507 1462 1508 if(top >= 1) ··· 1470 1516 if(top >= 3) 1471 1517 { 1472 1518 bool value = lua_toboolean(lua, 3); 1473 - tic_api_fset(tic, index, flag, value); 1519 + core->api.fset(tic, index, flag, value); 1474 1520 return 0; 1475 1521 } 1476 1522 }
-2
src/api/lua_api.h
··· 29 29 #include <lualib.h> 30 30 #include <ctype.h> 31 31 32 - s32 luaopen_lpeg(lua_State *lua); 33 - 34 32 extern void initLuaAPI(tic_core* core); 35 33 extern void callLuaTick(tic_mem* tic); 36 34 extern void callLuaBoot(tic_mem* tic);
+2
src/api/moonscript.c
··· 72 72 } 73 73 } 74 74 75 + extern s32 luaopen_lpeg(lua_State *lua); 76 + 75 77 static bool initMoonscript(tic_mem* tic, const char* code) 76 78 { 77 79 tic_core* core = (tic_core*)tic;
+159 -157
src/api/mruby.c
··· 37 37 #include <mruby/value.h> 38 38 #include <mruby/string.h> 39 39 40 + extern bool parse_note(const char* noteStr, s32* note, s32* octave); 41 + 40 42 typedef struct { 41 43 struct mrb_state* mrb; 42 44 struct mrbc_context* mrb_cxt; ··· 50 52 51 53 static mrb_value mrb_peek(mrb_state* mrb, mrb_value self) 52 54 { 53 - tic_core* machine = getMRubyMachine(mrb); 54 - tic_mem* tic = (tic_mem*)machine; 55 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 55 56 56 57 mrb_int address; 57 58 mrb_int bits = BITS_IN_BYTE; 58 59 mrb_get_args(mrb, "i|i", &address, &bits); 59 60 60 - return mrb_fixnum_value(tic_api_peek(tic, address, bits)); 61 + return mrb_fixnum_value(core->api.peek(tic, address, bits)); 61 62 } 62 63 63 64 static mrb_value mrb_poke(mrb_state* mrb, mrb_value self) 64 65 { 65 - tic_core* machine = getMRubyMachine(mrb); 66 - tic_mem* tic = (tic_mem*)machine; 66 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 67 + 67 68 68 69 mrb_int address, value; 69 70 mrb_int bits = BITS_IN_BYTE; 70 71 mrb_get_args(mrb, "ii|i", &address, &value, &bits); 71 72 72 - tic_api_poke(tic, address, value, bits); 73 + core->api.poke(tic, address, value, bits); 73 74 74 75 return mrb_nil_value(); 75 76 } 76 77 77 78 static mrb_value mrb_peek1(mrb_state* mrb, mrb_value self) 78 79 { 79 - tic_core* machine = getMRubyMachine(mrb); 80 - tic_mem* tic = (tic_mem*)machine; 80 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 81 + 81 82 82 83 mrb_int address; 83 84 mrb_get_args(mrb, "i", &address); 84 85 85 - return mrb_fixnum_value(tic_api_peek1(tic, address)); 86 + return mrb_fixnum_value(core->api.peek1(tic, address)); 86 87 } 87 88 88 89 static mrb_value mrb_poke1(mrb_state* mrb, mrb_value self) 89 90 { 90 - tic_core* machine = getMRubyMachine(mrb); 91 - tic_mem* tic = (tic_mem*)machine; 91 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 92 + 92 93 93 94 mrb_int address, value; 94 95 mrb_get_args(mrb, "ii", &address, &value); 95 96 96 - tic_api_poke1(tic, address, value); 97 + core->api.poke1(tic, address, value); 97 98 98 99 return mrb_nil_value(); 99 100 } 100 101 101 102 static mrb_value mrb_peek2(mrb_state* mrb, mrb_value self) 102 103 { 103 - tic_core* machine = getMRubyMachine(mrb); 104 - tic_mem* tic = (tic_mem*)machine; 104 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 105 + 105 106 106 107 mrb_int address; 107 108 mrb_get_args(mrb, "i", &address); 108 109 109 - return mrb_fixnum_value(tic_api_peek2(tic, address)); 110 + return mrb_fixnum_value(core->api.peek2(tic, address)); 110 111 } 111 112 112 113 static mrb_value mrb_poke2(mrb_state* mrb, mrb_value self) 113 114 { 114 - tic_core* machine = getMRubyMachine(mrb); 115 - tic_mem* tic = (tic_mem*)machine; 115 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 116 + 116 117 117 118 mrb_int address, value; 118 119 mrb_get_args(mrb, "ii", &address, &value); 119 120 120 - tic_api_poke2(tic, address, value); 121 + core->api.poke2(tic, address, value); 121 122 122 123 return mrb_nil_value(); 123 124 } 124 125 125 126 static mrb_value mrb_peek4(mrb_state* mrb, mrb_value self) 126 127 { 127 - tic_core* machine = getMRubyMachine(mrb); 128 - tic_mem* tic = (tic_mem*)machine; 128 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 129 + 129 130 130 131 mrb_int address; 131 132 mrb_get_args(mrb, "i", &address); 132 133 133 - return mrb_fixnum_value(tic_api_peek4(tic, address)); 134 + return mrb_fixnum_value(core->api.peek4(tic, address)); 134 135 } 135 136 136 137 static mrb_value mrb_poke4(mrb_state* mrb, mrb_value self) 137 138 { 138 - tic_core* machine = getMRubyMachine(mrb); 139 - tic_mem* tic = (tic_mem*)machine; 139 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 140 + 140 141 141 142 mrb_int address, value; 142 143 mrb_get_args(mrb, "ii", &address, &value); 143 144 144 - tic_api_poke4(tic, address, value); 145 + core->api.poke4(tic, address, value); 145 146 146 147 return mrb_nil_value(); 147 148 } ··· 151 152 mrb_int color = 0; 152 153 mrb_get_args(mrb, "|i", &color); 153 154 154 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 155 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 155 156 156 - tic_api_cls(memory, color); 157 + core->api.cls(tic, color); 157 158 158 159 return mrb_nil_value(); 159 160 } ··· 163 164 mrb_int x, y, color; 164 165 mrb_int argc = mrb_get_args(mrb, "ii|i", &x, &y, &color); 165 166 166 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 167 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 167 168 168 169 if(argc == 3) 169 170 { 170 - tic_api_pix(memory, x, y, color, false); 171 + core->api.pix(tic, x, y, color, false); 171 172 return mrb_nil_value(); 172 173 } 173 174 else 174 175 { 175 - return mrb_fixnum_value(tic_api_pix(memory, x, y, 0, true)); 176 + return mrb_fixnum_value(core->api.pix(tic, x, y, 0, true)); 176 177 } 177 178 } 178 179 ··· 182 183 mrb_int color; 183 184 mrb_get_args(mrb, "ffffi", &x0, &y0, &x1, &y1, &color); 184 185 185 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 186 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 186 187 187 - tic_api_line(memory, x0, y0, x1, y1, color); 188 + core->api.line(tic, x0, y0, x1, y1, color); 188 189 189 190 return mrb_nil_value(); 190 191 } ··· 194 195 mrb_int x, y, w, h, color; 195 196 mrb_get_args(mrb, "iiiii", &x, &y, &w, &h, &color); 196 197 197 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 198 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 198 199 199 - tic_api_rect(memory, x, y, w, h, color); 200 + core->api.rect(tic, x, y, w, h, color); 200 201 201 202 return mrb_nil_value(); 202 203 } ··· 206 207 mrb_int x, y, w, h, color; 207 208 mrb_get_args(mrb, "iiiii", &x, &y, &w, &h, &color); 208 209 209 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 210 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 210 211 211 - tic_api_rectb(memory, x, y, w, h, color); 212 + core->api.rectb(tic, x, y, w, h, color); 212 213 213 214 return mrb_nil_value(); 214 215 } ··· 219 220 mrb_get_args(mrb, "iiii", &x, &y, &radius, &color); 220 221 221 222 if(radius >= 0) { 222 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 223 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 223 224 224 - tic_api_circ(memory, x, y, radius, color); 225 + core->api.circ(tic, x, y, radius, color); 225 226 } else { 226 227 mrb_raise(mrb, E_ARGUMENT_ERROR, "radius must be greater than or equal 0"); 227 228 } ··· 235 236 mrb_get_args(mrb, "iiii", &x, &y, &radius, &color); 236 237 237 238 if(radius >= 0) { 238 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 239 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 239 240 240 - tic_api_circb(memory, x, y, radius, color); 241 + core->api.circb(tic, x, y, radius, color); 241 242 } else { 242 243 mrb_raise(mrb, E_ARGUMENT_ERROR, "radius must be greater than or equal 0"); 243 244 } ··· 250 251 mrb_int x, y, a, b, color; 251 252 mrb_get_args(mrb, "iiiii", &x, &y, &a, &b, &color); 252 253 253 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 254 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 254 255 255 - tic_api_elli(memory, x, y, a, b, color); 256 + core->api.elli(tic, x, y, a, b, color); 256 257 257 258 return mrb_nil_value(); 258 259 } ··· 262 263 mrb_int x, y, a, b, color; 263 264 mrb_get_args(mrb, "iiiii", &x, &y, &a, &b, &color); 264 265 265 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 266 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 266 267 267 - tic_api_ellib(memory, x, y, a, b, color); 268 + core->api.ellib(tic, x, y, a, b, color); 268 269 269 270 return mrb_nil_value(); 270 271 } ··· 275 276 mrb_int color; 276 277 mrb_get_args(mrb, "ffffffi", &x1, &y1, &x2, &y2, &x3, &y3, &color); 277 278 278 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 279 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 279 280 280 - tic_api_tri(memory, x1, y1, x2, y2, x3, y3, color); 281 + core->api.tri(tic, x1, y1, x2, y2, x3, y3, color); 281 282 282 283 return mrb_nil_value(); 283 284 } ··· 288 289 mrb_int color; 289 290 mrb_get_args(mrb, "ffffffi", &x1, &y1, &x2, &y2, &x3, &y3, &color); 290 291 291 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 292 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 292 293 293 - tic_api_trib(memory, x1, y1, x2, y2, x3, y3, color); 294 + core->api.trib(tic, x1, y1, x2, y2, x3, y3, color); 294 295 295 296 return mrb_nil_value(); 296 297 } ··· 325 326 chromas[0] = mrb_integer(chroma); 326 327 } 327 328 328 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 329 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 329 330 330 - tic_api_ttri(memory, 331 + core->api.ttri(tic, 331 332 x1, y1, x2, y2, x3, y3, 332 333 u1, v1, u2, v2, u3, v3, 333 334 src, chromas, count, z1, z2, z3, argc == 17); ··· 345 346 346 347 if(argc == 0) 347 348 { 348 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 349 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 349 350 350 - tic_api_clip(memory, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); 351 + core->api.clip(tic, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); 351 352 } 352 353 else if(argc == 4) 353 354 { 354 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 355 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 355 356 356 - tic_api_clip((tic_mem*)getMRubyMachine(mrb), x, y, w, h); 357 + core->api.clip((tic_mem*)getMRubyMachine(mrb), x, y, w, h); 357 358 } 358 359 else mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid parameters, use clip(x,y,w,h) or clip()"); 359 360 ··· 362 363 363 364 static mrb_value mrb_btnp(mrb_state* mrb, mrb_value self) 364 365 { 365 - tic_core* machine = getMRubyMachine(mrb); 366 - tic_mem* memory = (tic_mem*)machine; 366 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 367 + 367 368 368 369 mrb_int index, hold, period; 369 370 mrb_int argc = mrb_get_args(mrb, "|iii", &index, &hold, &period); 370 371 371 372 if (argc == 0) 372 373 { 373 - return mrb_fixnum_value(tic_api_btnp(memory, -1, -1, -1)); 374 + return mrb_fixnum_value(core->api.btnp(tic, -1, -1, -1)); 374 375 } 375 376 else if(argc == 1) 376 377 { 377 - return mrb_bool_value(tic_api_btnp(memory, index & 0x1f, -1, -1) != 0); 378 + return mrb_bool_value(core->api.btnp(tic, index & 0x1f, -1, -1) != 0); 378 379 } 379 380 else if (argc == 3) 380 381 { 381 - return mrb_bool_value(tic_api_btnp(memory, index & 0x1f, hold, period) != 0); 382 + return mrb_bool_value(core->api.btnp(tic, index & 0x1f, hold, period) != 0); 382 383 } 383 384 else 384 385 { ··· 389 390 390 391 static mrb_value mrb_btn(mrb_state* mrb, mrb_value self) 391 392 { 392 - tic_core* machine = getMRubyMachine(mrb); 393 - tic_mem* memory = (tic_mem*)machine; 393 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 394 + 394 395 395 396 mrb_int index, hold, period; 396 397 mrb_int argc = mrb_get_args(mrb, "|i", &index, &hold, &period); 397 398 398 399 if (argc == 0) 399 400 { 400 - return mrb_bool_value(tic_api_btn(memory, -1) != 0); 401 + return mrb_bool_value(core->api.btn(tic, -1) != 0); 401 402 } 402 403 else if (argc == 1) 403 404 { 404 - return mrb_bool_value(tic_api_btn(memory, index & 0x1f) != 0); 405 + return mrb_bool_value(core->api.btn(tic, index & 0x1f) != 0); 405 406 } 406 407 else 407 408 { ··· 438 439 return mrb_nil_value(); 439 440 } 440 441 441 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 442 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 442 443 443 - tic_api_spr(memory, index, x, y, w, h, colors, count, scale, flip, rotate); 444 + core->api.spr(tic, index, x, y, w, h, colors, count, scale, flip, rotate); 444 445 445 446 return mrb_nil_value(); 446 447 } ··· 450 451 mrb_int x, y; 451 452 mrb_get_args(mrb, "ii", &x, &y); 452 453 453 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 454 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 454 455 455 - u8 value = tic_api_mget(memory, x, y); 456 + u8 value = core->api.mget(tic, x, y); 456 457 return mrb_fixnum_value(value); 457 458 } 458 459 ··· 461 462 mrb_int x, y, val; 462 463 mrb_get_args(mrb, "iii", &x, &y, &val); 463 464 464 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 465 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 465 466 466 - tic_api_mset(memory, x, y, val); 467 + core->api.mset(tic, x, y, val); 467 468 468 469 return mrb_nil_value(); 469 470 } 470 471 471 472 static mrb_value mrb_tstamp(mrb_state* mrb, mrb_value self) 472 473 { 473 - tic_mem* tic = (tic_mem*)getMRubyMachine(mrb); 474 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 474 475 475 - return mrb_fixnum_value(tic_api_tstamp(tic)); 476 + return mrb_fixnum_value(core->api.tstamp(tic)); 476 477 } 477 478 478 479 static mrb_value mrb_vbank(mrb_state* mrb, mrb_value self) ··· 487 488 488 489 if (argc >= 1) 489 490 { 490 - tic_api_vbank(tic, vbank); 491 + core->api.vbank(tic, vbank); 491 492 } 492 493 493 494 return mrb_fixnum_value(prev); ··· 498 499 mrb_int index, flag; 499 500 mrb_get_args(mrb, "ii", &index, &flag); 500 501 501 - tic_mem* tic = (tic_mem*)getMRubyMachine(mrb); 502 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 502 503 503 - return mrb_bool_value(tic_api_fget(tic, index, flag)); 504 + return mrb_bool_value(core->api.fget(tic, index, flag)); 504 505 } 505 506 506 507 static mrb_value mrb_fset(mrb_state* mrb, mrb_value self) ··· 509 510 mrb_bool value; 510 511 mrb_get_args(mrb, "iib", &index, &flag, &value); 511 512 512 - tic_mem* tic = (tic_mem*)getMRubyMachine(mrb); 513 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 513 514 514 - tic_api_fset(tic, index, flag, value); 515 + core->api.fset(tic, index, flag, value); 515 516 516 517 return mrb_nil_value(); 517 518 } ··· 568 569 569 570 mrb_int argc = mrb_get_args(mrb, "|iiiiiioi&", &x, &y, &w, &h, &sx, &sy, &chroma, &scale, &block); 570 571 571 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 572 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 572 573 573 574 mrb_int count; 574 575 u8 *chromas; ··· 593 594 if (mrb_proc_p(block)) 594 595 { 595 596 RemapData data = { mrb, block }; 596 - tic_api_map(memory, x, y, w, h, sx, sy, chromas, count, scale, remapCallback, &data); 597 + core->api.map(tic, x, y, w, h, sx, sy, chromas, count, scale, remapCallback, &data); 597 598 } 598 599 else 599 600 { 600 - tic_api_map(memory, x, y, w, h, sx, sy, chromas, count, scale, NULL, NULL); 601 + core->api.map(tic, x, y, w, h, sx, sy, chromas, count, scale, NULL, NULL); 601 602 } 602 603 603 604 free(chromas); ··· 617 618 618 619 mrb_int argc = mrb_get_args(mrb, "|iiibbii", &track, &frame, &row, &loop, &sustain, &tempo, &speed); 619 620 620 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 621 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 621 622 622 - tic_api_music(memory, -1, 0, 0, false, false, -1, -1); 623 + core->api.music(tic, -1, 0, 0, false, false, -1, -1); 623 624 624 625 if(track >= 0) 625 626 { 626 627 if(track > MUSIC_TRACKS - 1) 627 628 mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid music track index"); 628 629 else 629 - tic_api_music(memory, track, frame, row, loop, sustain, tempo, speed); 630 + core->api.music(tic, track, frame, row, loop, sustain, tempo, speed); 630 631 } 631 632 632 633 return mrb_nil_value(); ··· 647 648 648 649 mrb_int argc = mrb_get_args(mrb, "i|oiio!i", &index, &note_obj, &duration, &channel, &volume, &speed); 649 650 650 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 651 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 651 652 652 653 if (mrb_array_p(volume)) 653 654 { ··· 673 674 { 674 675 if (index >= 0) 675 676 { 676 - tic_sample* effect = memory->ram->sfx.samples.data + index; 677 + tic_sample* effect = tic->ram->sfx.samples.data + index; 677 678 678 679 note = effect->note; 679 680 octave = effect->octave; ··· 693 694 const char* noteStr = mrb_str_to_cstr(mrb, mrb_funcall(mrb, note_obj, "to_s", 0)); 694 695 695 696 s32 octave32; 696 - if (!tic_tool_parse_note(noteStr, &note, &octave32)) 697 + if (!parse_note(noteStr, &note, &octave32)) 697 698 { 698 699 mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid note, should be like C#4"); 699 700 return mrb_nil_value(); ··· 709 710 710 711 if (channel >= 0 && channel < TIC_SOUND_CHANNELS) 711 712 { 712 - tic_api_sfx(memory, index, note, octave, duration, channel, volumes[0] & 0xf, volumes[1] & 0xf, speed); 713 + core->api.sfx(tic, index, note, octave, duration, channel, volumes[0] & 0xf, volumes[1] & 0xf, speed); 713 714 } 714 715 else mrb_raise(mrb, E_ARGUMENT_ERROR, "unknown channel"); 715 716 } ··· 720 721 721 722 static mrb_value mrb_sync(mrb_state* mrb, mrb_value self) 722 723 { 723 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 724 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 724 725 725 726 mrb_int mask = 0; 726 727 mrb_int bank = 0; ··· 729 730 mrb_int argc = mrb_get_args(mrb, "|iib", &mask, &bank, &toCart); 730 731 731 732 if(bank >= 0 && bank < TIC_BANKS) 732 - tic_api_sync(memory, mask, bank, toCart); 733 + core->api.sync(tic, mask, bank, toCart); 733 734 else 734 735 mrb_raise(mrb, E_ARGUMENT_ERROR, "sync() error, invalid bank"); 735 736 ··· 738 739 739 740 static mrb_value mrb_reset(mrb_state* mrb, mrb_value self) 740 741 { 741 - tic_core* machine = getMRubyMachine(mrb); 742 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 742 743 743 - machine->state.initialized = false; 744 + core->state.initialized = false; 744 745 745 746 return mrb_nil_value(); 746 747 } 747 748 748 749 static mrb_value mrb_key(mrb_state* mrb, mrb_value self) 749 750 { 750 - tic_core* machine = getMRubyMachine(mrb); 751 - tic_mem* tic = &machine->memory; 751 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 752 752 753 753 mrb_int key; 754 754 mrb_int argc = mrb_get_args(mrb, "|i", &key); 755 755 756 756 if (argc == 0) 757 - return mrb_bool_value(tic_api_key(tic, tic_key_unknown)); 757 + return mrb_bool_value(core->api.key(tic, tic_key_unknown)); 758 758 else 759 759 { 760 760 if(key < tic_key_escape) 761 - return mrb_bool_value(tic_api_key(tic, key)); 761 + return mrb_bool_value(core->api.key(tic, key)); 762 762 else 763 763 { 764 764 mrb_raise(mrb, E_ARGUMENT_ERROR, "unknown keyboard code"); ··· 769 769 770 770 static mrb_value mrb_keyp(mrb_state* mrb, mrb_value self) 771 771 { 772 - tic_core* machine = getMRubyMachine(mrb); 773 - tic_mem* memory = (tic_mem*)machine; 772 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 773 + 774 774 775 775 mrb_int key, hold, period; 776 776 mrb_int argc = mrb_get_args(mrb, "|iii", &key, &hold, &period); 777 777 778 778 if (argc == 0) 779 779 { 780 - return mrb_fixnum_value(tic_api_keyp(memory, -1, -1, -1)); 780 + return mrb_fixnum_value(core->api.keyp(tic, -1, -1, -1)); 781 781 } 782 782 else if (key >= tic_key_escape) 783 783 { ··· 785 785 } 786 786 else if(argc == 1) 787 787 { 788 - return mrb_bool_value(tic_api_keyp(memory, key, -1, -1)); 788 + return mrb_bool_value(core->api.keyp(tic, key, -1, -1)); 789 789 } 790 790 else if (argc == 3) 791 791 { 792 - return mrb_bool_value(tic_api_keyp(memory, key, hold, period)); 792 + return mrb_bool_value(core->api.keyp(tic, key, hold, period)); 793 793 } 794 794 else 795 795 { ··· 807 807 808 808 if(size >= 0 && size <= sizeof(tic_ram) && dest >= 0 && src >= 0 && dest <= bound && src <= bound) 809 809 { 810 - u8* base = (u8*)&getMRubyMachine(mrb)->memory; 811 - memcpy(base + dest, base + src, size); 810 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 811 + #undef memcpy 812 + core->api.memcpy(tic, dest, src, size); 812 813 } 813 814 else 814 815 { 815 - mrb_raise(mrb, E_ARGUMENT_ERROR, "memory address not in range!"); 816 + mrb_raise(mrb, E_ARGUMENT_ERROR, "tic address not in range!"); 816 817 } 817 818 818 819 return mrb_nil_value(); ··· 827 828 828 829 if(size >= 0 && size <= sizeof(tic_ram) && dest >= 0 && dest <= bound) 829 830 { 830 - u8* base = (u8*)&getMRubyMachine(mrb)->memory; 831 - memset(base + dest, value, size); 831 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 832 + 833 + #undef memset 834 + core->api.memset(tic, dest, value, size); 832 835 } 833 836 else 834 837 { 835 - mrb_raise(mrb, E_ARGUMENT_ERROR, "memory address not in range!"); 838 + mrb_raise(mrb, E_ARGUMENT_ERROR, "tic address not in range!"); 836 839 } 837 840 838 841 return mrb_nil_value(); ··· 859 862 &text_obj, &x, &y, &chromakey, 860 863 &width, &height, &fixed, &scale, &alt); 861 864 862 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 865 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 863 866 864 867 if(scale == 0) 865 868 return mrb_fixnum_value(0); 866 869 867 870 const char* text = mrb_value_to_cstr(mrb, text_obj); 868 871 869 - s32 size = tic_api_font(memory, text, x, y, (u8*)&chromakey, 1, width, height, fixed, scale, alt); 872 + s32 size = core->api.font(tic, text, x, y, (u8*)&chromakey, 1, width, height, fixed, scale, alt); 870 873 return mrb_fixnum_value(size); 871 874 } 872 875 ··· 883 886 &text_obj, &x, &y, &color, 884 887 &fixed, &scale, &alt); 885 888 886 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 889 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 887 890 888 891 if(scale == 0) 889 892 return mrb_fixnum_value(0); 890 893 891 894 const char* text = mrb_str_to_cstr(mrb, text_obj); 892 895 893 - s32 size = tic_api_print(memory, text, x, y, color, fixed, scale, alt); 896 + s32 size = core->api.print(tic, text, x, y, color, fixed, scale, alt); 894 897 return mrb_fixnum_value(size); 895 898 } 896 899 ··· 900 903 mrb_int color = TIC_DEFAULT_COLOR; 901 904 mrb_get_args(mrb, "o|i", &text_obj, &color); 902 905 903 - tic_core* machine = getMRubyMachine(mrb); 906 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 904 907 905 908 const char* text = mrb_value_to_cstr(mrb, text_obj); 906 - machine->data->trace(machine->data->data, text, color); 909 + core->data->trace(core->data->data, text, color); 907 910 908 911 return mrb_nil_value(); 909 912 } ··· 913 916 mrb_int index, value; 914 917 mrb_int argc = mrb_get_args(mrb, "i|i", &index, &value); 915 918 916 - tic_core* machine = getMRubyMachine(mrb); 917 - tic_mem* memory = &machine->memory; 919 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 918 920 919 921 if(index < TIC_PERSISTENT_SIZE) 920 922 { 921 - u32 val = tic_api_pmem((tic_mem*)machine, index, 0, false); 923 + u32 val = core->api.pmem((tic_mem*)core, index, 0, false); 922 924 923 925 if(argc == 2) 924 926 { 925 - u32 val = tic_api_pmem((tic_mem*)machine, index, value, true); 927 + u32 val = core->api.pmem((tic_mem*)core, index, value, true); 926 928 } 927 929 928 930 return mrb_fixnum_value(val); 929 931 } 930 932 else 931 933 { 932 - mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid persistent memory index"); 934 + mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid persistent tic index"); 933 935 934 936 return mrb_nil_value(); 935 937 } ··· 937 939 938 940 static mrb_value mrb_time(mrb_state *mrb, mrb_value self) 939 941 { 940 - tic_mem* memory = (tic_mem*)getMRubyMachine(mrb); 941 - return mrb_float_value(mrb, tic_api_time(memory)); 942 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 943 + return mrb_float_value(mrb, core->api.time(tic)); 942 944 } 943 945 944 946 static mrb_value mrb_exit(mrb_state *mrb, mrb_value self) 945 947 { 946 - tic_core* machine = getMRubyMachine(mrb); 947 - machine->data->exit(machine->data->data); 948 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 949 + core->data->exit(core->data->data); 948 950 949 951 return mrb_nil_value(); 950 952 } ··· 957 959 mrb_value sym_middle = mrb_symbol_value(mrb_intern_cstr(mrb, "middle")); 958 960 mrb_value sym_right = mrb_symbol_value(mrb_intern_cstr(mrb, "right")); 959 961 960 - tic_core* machine = getMRubyMachine(mrb); 962 + tic_core* core = getMRubyMachine(mrb); tic_mem* tic = (tic_mem*)core; 961 963 962 - const tic80_mouse* mouse = &machine->memory.ram->input.mouse; 964 + const tic80_mouse* mouse = &tic->ram->input.mouse; 963 965 964 966 mrb_value hash = mrb_hash_new(mrb); 965 967 ··· 974 976 975 977 static void closeMRuby(tic_mem* tic) 976 978 { 977 - tic_core* machine = (tic_core*)tic; 979 + tic_core* core = (tic_core*)tic; 978 980 979 - if(machine->currentVM) 981 + if(core->currentVM) 980 982 { 981 - mrbVm *currentVM = (mrbVm*)machine->currentVM; 983 + mrbVm *currentVM = (mrbVm*)core->currentVM; 982 984 mrbc_context_free(currentVM->mrb, currentVM->mrb_cxt); 983 985 mrb_close(currentVM->mrb); 984 986 currentVM->mrb_cxt = NULL; 985 987 currentVM->mrb = NULL; 986 988 987 989 free(currentVM); 988 - CurrentMachine = machine->currentVM = NULL; 990 + CurrentMachine = core->currentVM = NULL; 989 991 } 990 992 } 991 993 992 - static mrb_bool catcherr(tic_core* machine) 994 + static mrb_bool catcherr(tic_core* core) 993 995 { 994 - mrb_state* mrb = ((mrbVm*)machine->currentVM)->mrb; 996 + mrb_state* mrb = ((mrbVm*)core->currentVM)->mrb; 995 997 if (mrb->exc) 996 998 { 997 999 mrb_value ex = mrb_obj_value(mrb->exc); ··· 1002 1004 mrb_ary_unshift(mrb, bt, insp); 1003 1005 mrb_value msg = mrb_ary_join(mrb, bt, mrb_str_new_cstr(mrb, "\n")); 1004 1006 char* cmsg = mrb_str_to_cstr(mrb, msg); 1005 - machine->data->error(machine->data->data, cmsg); 1007 + core->data->error(core->data->data, cmsg); 1006 1008 mrb->exc = NULL; 1007 1009 1008 1010 return false; ··· 1013 1015 1014 1016 static bool initMRuby(tic_mem* tic, const char* code) 1015 1017 { 1016 - tic_core* machine = (tic_core*)tic; 1018 + tic_core* core = (tic_core*)tic; 1017 1019 1018 1020 closeMRuby(tic); 1019 1021 1020 - CurrentMachine = machine; 1022 + CurrentMachine = core; 1021 1023 1022 - machine->currentVM = malloc(sizeof(mrbVm)); 1023 - mrbVm *currentVM = (mrbVm*)machine->currentVM; 1024 + core->currentVM = malloc(sizeof(mrbVm)); 1025 + mrbVm *currentVM = (mrbVm*)core->currentVM; 1024 1026 1025 1027 mrb_state* mrb = currentVM->mrb = mrb_open(); 1026 1028 mrbc_context* mrb_cxt = currentVM->mrb_cxt = mrbc_context_new(mrb); ··· 1045 1047 } 1046 1048 1047 1049 mrb_load_string_cxt(mrb, code, mrb_cxt); 1048 - return catcherr(machine); 1050 + return catcherr(core); 1049 1051 } 1050 1052 1051 1053 static void evalMRuby(tic_mem* tic, const char* code) { 1052 - tic_core* machine = (tic_core*)tic; 1054 + tic_core* core = (tic_core*)tic; 1053 1055 1054 - mrbVm* vm=(mrbVm*)machine->currentVM; 1056 + mrbVm* vm=(mrbVm*)core->currentVM; 1055 1057 if(!vm || !vm->mrb) 1056 1058 return; 1057 1059 1058 1060 mrb_state* mrb = vm->mrb; 1059 1061 1060 - if (((mrbVm*)machine->currentVM)->mrb_cxt) 1062 + if (((mrbVm*)core->currentVM)->mrb_cxt) 1061 1063 { 1062 - mrbc_context_free(mrb, ((mrbVm*)machine->currentVM)->mrb_cxt); 1064 + mrbc_context_free(mrb, ((mrbVm*)core->currentVM)->mrb_cxt); 1063 1065 } 1064 1066 1065 - mrbc_context* mrb_cxt = ((mrbVm*)machine->currentVM)->mrb_cxt = mrbc_context_new(mrb); 1067 + mrbc_context* mrb_cxt = ((mrbVm*)core->currentVM)->mrb_cxt = mrbc_context_new(mrb); 1066 1068 mrbc_filename(mrb, mrb_cxt, "eval"); 1067 1069 mrb_load_string_cxt(mrb, code, mrb_cxt); 1068 - catcherr(machine); 1070 + catcherr(core); 1069 1071 } 1070 1072 1071 1073 static void callMRubyTick(tic_mem* tic) 1072 1074 { 1073 - tic_core* machine = (tic_core*)tic; 1075 + tic_core* core = (tic_core*)tic; 1074 1076 const char* TicFunc = TIC_FN; 1075 1077 1076 - mrb_state* mrb = ((mrbVm*)machine->currentVM)->mrb; 1078 + mrb_state* mrb = ((mrbVm*)core->currentVM)->mrb; 1077 1079 1078 1080 if(mrb) 1079 1081 { 1080 1082 if (mrb_respond_to(mrb, mrb_top_self(mrb), mrb_intern_cstr(mrb, TicFunc))) 1081 1083 { 1082 1084 mrb_funcall(mrb, mrb_top_self(mrb), TicFunc, 0); 1083 - catcherr(machine); 1085 + catcherr(core); 1084 1086 } 1085 1087 else 1086 1088 { 1087 - machine->data->error(machine->data->data, "'def TIC...' isn't found :("); 1089 + core->data->error(core->data->data, "'def TIC...' isn't found :("); 1088 1090 } 1089 1091 } 1090 1092 } 1091 1093 1092 1094 static void callMRubyBoot(tic_mem* tic) 1093 1095 { 1094 - tic_core* machine = (tic_core*)tic; 1096 + tic_core* core = (tic_core*)tic; 1095 1097 const char* BootFunc = BOOT_FN; 1096 1098 1097 - mrb_state* mrb = ((mrbVm*)machine->currentVM)->mrb; 1099 + mrb_state* mrb = ((mrbVm*)core->currentVM)->mrb; 1098 1100 1099 1101 if(mrb) 1100 1102 { 1101 1103 if (mrb_respond_to(mrb, mrb_top_self(mrb), mrb_intern_cstr(mrb, BootFunc))) 1102 1104 { 1103 1105 mrb_funcall(mrb, mrb_top_self(mrb), BootFunc, 0); 1104 - catcherr(machine); 1106 + catcherr(core); 1105 1107 } 1106 1108 } 1107 1109 } 1108 1110 1109 - static void callMRubyIntCallback(tic_mem* memory, s32 value, void* data, const char* name) 1111 + static void callMRubyIntCallback(tic_mem* tic, s32 value, void* data, const char* name) 1110 1112 { 1111 - tic_core* machine = (tic_core*)memory; 1112 - mrb_state* mrb = ((mrbVm*)machine->currentVM)->mrb; 1113 + tic_core* core = (tic_core*)tic; 1114 + mrb_state* mrb = ((mrbVm*)core->currentVM)->mrb; 1113 1115 1114 1116 if (mrb && mrb_respond_to(mrb, mrb_top_self(mrb), mrb_intern_cstr(mrb, name))) 1115 1117 { 1116 1118 mrb_funcall(mrb, mrb_top_self(mrb), name, 1, mrb_fixnum_value(value)); 1117 - catcherr(machine); 1119 + catcherr(core); 1118 1120 } 1119 1121 } 1120 1122 1121 - static void callMRubyScanline(tic_mem* memory, s32 row, void* data) 1123 + static void callMRubyScanline(tic_mem* tic, s32 row, void* data) 1122 1124 { 1123 - callMRubyIntCallback(memory, row, data, SCN_FN); 1125 + callMRubyIntCallback(tic, row, data, SCN_FN); 1124 1126 1125 - callMRubyIntCallback(memory, row, data, "scanline"); 1127 + callMRubyIntCallback(tic, row, data, "scanline"); 1126 1128 } 1127 1129 1128 - static void callMRubyBorder(tic_mem* memory, s32 row, void* data) 1130 + static void callMRubyBorder(tic_mem* tic, s32 row, void* data) 1129 1131 { 1130 - callMRubyIntCallback(memory, row, data, BDR_FN); 1132 + callMRubyIntCallback(tic, row, data, BDR_FN); 1131 1133 } 1132 1134 1133 - static void callMRubyMenu(tic_mem* memory, s32 index, void* data) 1135 + static void callMRubyMenu(tic_mem* tic, s32 index, void* data) 1134 1136 { 1135 - callMRubyIntCallback(memory, index, data, MENU_FN); 1137 + callMRubyIntCallback(tic, index, data, MENU_FN); 1136 1138 } 1137 1139 1138 1140 /**
+24
src/api/parse_note.c
··· 1 + #include "tic.h" 2 + #include <string.h> 3 + 4 + bool parse_note(const char* noteStr, s32* note, s32* octave) 5 + { 6 + if(noteStr && strlen(noteStr) == 3) 7 + { 8 + static const char* Notes[] = SFX_NOTES; 9 + 10 + for(s32 i = 0; i < COUNT_OF(Notes); i++) 11 + { 12 + if(memcmp(Notes[i], noteStr, 2) == 0) 13 + { 14 + *note = i; 15 + *octave = noteStr[2] - '1'; 16 + break; 17 + } 18 + } 19 + 20 + return true; 21 + } 22 + 23 + return false; 24 + }
+144 -140
src/api/python.c
··· 4 4 #include <stdio.h> 5 5 #include <string.h> 6 6 7 + extern bool parse_note(const char* noteStr, s32* note, s32* octave); 8 + 7 9 struct CachedNames{ 8 10 pkpy_CName _tic_core; 9 11 pkpy_CName len; ··· 81 83 82 84 static int py_trace(pkpy_vm* vm) 83 85 { 84 - tic_mem* tic; 85 86 pkpy_CString message; 86 87 int color; 87 88 ··· 91 92 pkpy_pop_top(vm); 92 93 93 94 pkpy_to_int(vm, 1, &color); 94 - get_core(vm, (tic_core**) &tic); 95 + 96 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 95 97 if (pkpy_check_error(vm)) 96 98 { 97 99 return 0; 98 100 } 99 101 100 - tic_api_trace(tic, message, (u8) color); 102 + core->api.trace(tic, message, (u8) color); 101 103 return 0; 102 104 } 103 105 104 106 static int py_cls(pkpy_vm* vm) 105 107 { 106 - tic_mem* tic; 108 + 107 109 int color; 108 110 109 111 pkpy_to_int(vm, 0, &color); 110 - get_core(vm, (tic_core**) &tic); 112 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 111 113 if (pkpy_check_error(vm)) 112 114 return 0; 113 115 114 - tic_api_cls(tic, (u8) color); 116 + core->api.cls(tic, (u8) color); 115 117 return 0; 116 118 } 117 119 118 120 static int py_btn(pkpy_vm* vm) 119 121 { 120 - tic_mem* tic; 122 + 121 123 int button_id; 122 124 123 - get_core(vm, (tic_core**) &tic); 125 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 124 126 pkpy_to_int(vm, 0, &button_id); 125 127 if(pkpy_check_error(vm)) 126 128 return 0; 127 129 128 - bool pressed = tic_api_btn(tic, button_id & 0x1f); 130 + bool pressed = core->api.btn(tic, button_id & 0x1f); 129 131 pkpy_push_bool(vm, pressed); 130 132 return 1; 131 133 } 132 134 133 135 static int py_btnp(pkpy_vm* vm) 134 136 { 135 - tic_mem* tic; 137 + 136 138 int button_id; 137 139 int hold; 138 140 int period; ··· 140 142 pkpy_to_int(vm, 0, &button_id); 141 143 pkpy_to_int(vm, 1, &hold); 142 144 pkpy_to_int(vm, 2, &period); 143 - get_core(vm, (tic_core**) &tic); 145 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 144 146 if(pkpy_check_error(vm)) 145 147 return 0; 146 148 147 - bool pressed = tic_api_btnp(tic, button_id, hold, period); 149 + bool pressed = core->api.btnp(tic, button_id, hold, period); 148 150 pkpy_push_bool(vm, pressed); 149 151 return 1; 150 152 } 151 153 152 154 static int py_circ(pkpy_vm* vm) 153 155 { 154 - tic_mem* tic; 156 + 155 157 int x; 156 158 int y; 157 159 int radius; ··· 161 163 pkpy_to_int(vm, 1, &y); 162 164 pkpy_to_int(vm, 2, &radius); 163 165 pkpy_to_int(vm, 3, &color); 164 - get_core(vm, (tic_core**) &tic); 166 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 165 167 if(pkpy_check_error(vm)) 166 168 return 0; 167 169 168 - tic_api_circ(tic, x, y, radius, color); 170 + core->api.circ(tic, x, y, radius, color); 169 171 return 0; 170 172 } 171 173 172 174 static int py_circb(pkpy_vm* vm) 173 175 { 174 - tic_mem* tic; 176 + 175 177 int x; 176 178 int y; 177 179 int radius; ··· 181 183 pkpy_to_int(vm, 1, &y); 182 184 pkpy_to_int(vm, 2, &radius); 183 185 pkpy_to_int(vm, 3, &color); 184 - get_core(vm, (tic_core**) &tic); 186 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 185 187 if(pkpy_check_error(vm)) 186 188 return 0; 187 189 188 - tic_api_circb(tic, x, y, radius, color); 190 + core->api.circb(tic, x, y, radius, color); 189 191 return 0; 190 192 } 191 193 192 194 static int py_elli(pkpy_vm* vm) 193 195 { 194 - tic_mem* tic; 196 + 195 197 int x; 196 198 int y; 197 199 int a; ··· 203 205 pkpy_to_int(vm, 2, &a); 204 206 pkpy_to_int(vm, 3, &b); 205 207 pkpy_to_int(vm, 4, &color); 206 - get_core(vm, (tic_core**) &tic); 208 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 207 209 if(pkpy_check_error(vm)) 208 210 return 0; 209 211 210 - tic_api_elli(tic, x, y, a, b, color); 212 + core->api.elli(tic, x, y, a, b, color); 211 213 return 0; 212 214 } 213 215 214 216 static int py_ellib(pkpy_vm* vm) 215 217 { 216 - tic_mem* tic; 218 + 217 219 int x; 218 220 int y; 219 221 int a; ··· 225 227 pkpy_to_int(vm, 2, &a); 226 228 pkpy_to_int(vm, 3, &b); 227 229 pkpy_to_int(vm, 4, &color); 228 - get_core(vm, (tic_core**) &tic); 230 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 229 231 if(pkpy_check_error(vm)) 230 232 return 0; 231 233 232 - tic_api_ellib(tic, x, y, a, b, color); 234 + core->api.ellib(tic, x, y, a, b, color); 233 235 return 0; 234 236 } 235 237 236 238 static int py_clip(pkpy_vm* vm) 237 239 { 238 - tic_mem* tic; 240 + 239 241 int x; 240 242 int y; 241 243 int w; ··· 245 247 pkpy_to_int(vm, 1, &y); 246 248 pkpy_to_int(vm, 2, &w); 247 249 pkpy_to_int(vm, 3, &h); 248 - get_core(vm, (tic_core**) &tic); 250 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 249 251 if(pkpy_check_error(vm)) 250 252 return 0; 251 253 252 - tic_api_clip(tic, x, y, w, h); 254 + core->api.clip(tic, x, y, w, h); 253 255 return 0; 254 256 } 255 257 256 258 static int py_exit(pkpy_vm* vm) 257 259 { 258 - tic_mem* tic; 260 + 259 261 260 - get_core(vm, (tic_core**) &tic); 262 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 261 263 if(pkpy_check_error(vm)) 262 264 return 0; 263 265 264 - tic_api_exit(tic); 266 + core->api.exit(tic); 265 267 return 0; 266 268 } 267 269 268 270 static int py_fget(pkpy_vm* vm) 269 271 { 270 - tic_mem* tic; 272 + 271 273 int sprite_id; 272 274 int flag; 273 275 274 276 pkpy_to_int(vm, 0, &sprite_id); 275 277 pkpy_to_int(vm, 1, &flag); 276 - get_core(vm, (tic_core**) &tic); 278 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 277 279 if(pkpy_check_error(vm)) 278 280 return 0; 279 281 280 - bool set = tic_api_fget(tic, sprite_id, (u8)flag); 282 + bool set = core->api.fget(tic, sprite_id, (u8)flag); 281 283 pkpy_push_bool(vm, set); 282 284 return 1; 283 285 } 284 286 285 287 static int py_fset(pkpy_vm* vm) 286 288 { 287 - tic_mem* tic; 289 + 288 290 int sprite_id; 289 291 int flag; 290 292 bool set_to; ··· 292 294 pkpy_to_int(vm, 0, &sprite_id); 293 295 pkpy_to_int(vm, 1, &flag); 294 296 pkpy_to_bool(vm, 2, &set_to); 295 - get_core(vm, (tic_core**) &tic); 297 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 296 298 if(pkpy_check_error(vm)) 297 299 return 0; 298 300 299 - tic_api_fset(tic, sprite_id, (u8)flag, set_to); 301 + core->api.fset(tic, sprite_id, (u8)flag, set_to); 300 302 return 0; 301 303 } 302 304 303 305 static int py_font(pkpy_vm* vm) 304 306 { 305 - tic_mem* tic; 307 + 306 308 pkpy_CString text; 307 309 int x; 308 310 int y; ··· 322 324 pkpy_to_bool(vm, 6, &fixed); 323 325 pkpy_to_int(vm, 7, &scale); 324 326 pkpy_to_bool(vm, 8, &alt); 325 - get_core(vm, (tic_core**) &tic); 327 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 326 328 if(pkpy_check_error(vm)) { 327 329 return 0; 328 330 } ··· 334 336 else 335 337 { 336 338 u8 chromakey = (u8) chromakey_raw; 337 - s32 size = tic_api_font(tic, text, x, y, &chromakey, 1, width, height, fixed, scale, alt); 339 + s32 size = core->api.font(tic, text, x, y, &chromakey, 1, width, height, fixed, scale, alt); 338 340 pkpy_push_int(vm, size); 339 341 } 340 342 ··· 343 345 344 346 static int py_key(pkpy_vm* vm) 345 347 { 346 - tic_mem* tic; 348 + 347 349 int key_id; 348 350 349 351 pkpy_to_int(vm, 0, &key_id); 350 - get_core(vm, (tic_core**) &tic); 352 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 351 353 if(pkpy_check_error(vm)) 352 354 return 0; 353 355 ··· 356 358 return 0; 357 359 } 358 360 359 - bool pressed = tic_api_key(tic, key_id); 361 + bool pressed = core->api.key(tic, key_id); 360 362 pkpy_push_bool(vm, pressed); 361 363 return 1; 362 364 } 363 365 364 366 static int py_keyp(pkpy_vm* vm) 365 367 { 366 - tic_mem* tic; 368 + 367 369 int key_id; 368 370 int hold; 369 371 int period; ··· 371 373 pkpy_to_int(vm, 0, &key_id); 372 374 pkpy_to_int(vm, 1, &hold); 373 375 pkpy_to_int(vm, 2, &period); 374 - get_core(vm, (tic_core**) &tic); 376 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 375 377 if(pkpy_check_error(vm)) 376 378 return 0; 377 379 ··· 380 382 return 0; 381 383 } 382 384 383 - bool pressed = tic_api_keyp(tic, key_id, hold, period); 385 + bool pressed = core->api.keyp(tic, key_id, hold, period); 384 386 pkpy_push_bool(vm, pressed); 385 387 return 1; 386 388 } 387 389 388 390 static int py_line(pkpy_vm* vm) 389 391 { 390 - tic_mem* tic; 392 + 391 393 double x0; 392 394 double y0; 393 395 double x1; ··· 399 401 pkpy_to_float(vm, 2, &x1); 400 402 pkpy_to_float(vm, 3, &y1); 401 403 pkpy_to_int(vm, 4, &color); 402 - get_core(vm, (tic_core**) &tic); 404 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 403 405 if(pkpy_check_error(vm)) 404 406 return 0; 405 407 406 - tic_api_line(tic, x0, y0, x1, y1, color); 408 + core->api.line(tic, x0, y0, x1, y1, color); 407 409 return 0; 408 410 } 409 411 ··· 430 432 431 433 static int py_map(pkpy_vm* vm) 432 434 { 433 - tic_mem* tic; 435 + 434 436 int x; 435 437 int y; 436 438 int w; ··· 452 454 color_count = prepare_colorindex(vm, 6, colors); 453 455 pkpy_to_int(vm, 7, &scale); 454 456 used_remap = !pkpy_is_none(vm, 8); 455 - get_core(vm, (tic_core**) &tic); 457 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 456 458 if(pkpy_check_error(vm)) 457 459 return 0; 458 460 459 461 //last element on the stack should be the function, so no need to adjust anything 460 462 if (used_remap) 461 - tic_api_map(tic, x, y, w, h, sx, sy, colors, color_count, scale, remap_callback, vm); 463 + core->api.map(tic, x, y, w, h, sx, sy, colors, color_count, scale, remap_callback, vm); 462 464 else 463 - tic_api_map(tic, x, y, w, h, sx, sy, colors, color_count, scale, NULL, NULL); 465 + core->api.map(tic, x, y, w, h, sx, sy, colors, color_count, scale, NULL, NULL); 464 466 465 467 return 0; 466 468 } 467 469 468 470 static int py_memcpy(pkpy_vm* vm) { 469 471 470 - tic_mem* tic; 472 + 471 473 int dest; 472 474 int src; 473 475 int size; ··· 475 477 pkpy_to_int(vm, 0, &dest); 476 478 pkpy_to_int(vm, 1, &src); 477 479 pkpy_to_int(vm, 2, &size); 478 - get_core(vm, (tic_core**) &tic); 480 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 479 481 if(pkpy_check_error(vm)) 480 482 return 0; 481 483 482 - tic_api_memcpy(tic, dest, src, size); 484 + #undef memcpy 485 + core->api.memcpy(tic, dest, src, size); 483 486 484 487 return 0; 485 488 } 486 489 487 490 static int py_memset(pkpy_vm* vm) { 488 491 489 - tic_mem* tic; 492 + 490 493 int dest; 491 494 int value; 492 495 int size; ··· 494 497 pkpy_to_int(vm, 0, &dest); 495 498 pkpy_to_int(vm, 1, &value); 496 499 pkpy_to_int(vm, 2, &size); 497 - get_core(vm, (tic_core**) &tic); 500 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 498 501 if(pkpy_check_error(vm)) 499 502 return 0; 500 503 501 - tic_api_memset(tic, dest, value, size); 504 + #undef memset 505 + core->api.memset(tic, dest, value, size); 502 506 503 507 return 0; 504 508 } 505 509 506 510 static int py_mget(pkpy_vm* vm) { 507 511 508 - tic_mem* tic; 512 + 509 513 int x; 510 514 int y; 511 515 512 516 pkpy_to_int(vm, 0, &x); 513 517 pkpy_to_int(vm, 1, &y); 514 - get_core(vm, (tic_core**) &tic); 518 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 515 519 if(pkpy_check_error(vm)) 516 520 return 0; 517 521 518 - int value = tic_api_mget(tic, x, y); 522 + int value = core->api.mget(tic, x, y); 519 523 pkpy_push_int(vm, value); 520 524 521 525 return 1; ··· 523 527 524 528 static int py_mset(pkpy_vm* vm) { 525 529 526 - tic_mem* tic; 530 + 527 531 int x; 528 532 int y; 529 533 int tile_id; ··· 531 535 pkpy_to_int(vm, 0, &x); 532 536 pkpy_to_int(vm, 1, &y); 533 537 pkpy_to_int(vm, 2, &tile_id); 534 - get_core(vm, (tic_core**) &tic); 538 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 535 539 if(pkpy_check_error(vm)) 536 540 return 0; 537 541 538 - tic_api_mset(tic, x, y, tile_id); 542 + core->api.mset(tic, x, y, tile_id); 539 543 540 544 return 0; 541 545 } ··· 548 552 if(pkpy_check_error(vm)) 549 553 return 0; 550 554 551 - tic_point pos = tic_api_mouse((tic_mem*)core); 555 + tic_point pos = core->api.mouse((tic_mem*)core); 552 556 553 557 const tic80_mouse* mouse = &core->memory.ram->input.mouse; 554 558 ··· 565 569 566 570 static int py_music(pkpy_vm* vm) { 567 571 568 - tic_mem* tic; 572 + 569 573 int track; 570 574 int frame; 571 575 int row; ··· 581 585 pkpy_to_bool(vm, 4, &sustain); 582 586 pkpy_to_int(vm, 5, &tempo); 583 587 pkpy_to_int(vm, 6, &speed); 584 - get_core(vm, (tic_core**) &tic); 588 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 585 589 if(pkpy_check_error(vm)) 586 590 return 0; 587 591 ··· 589 593 pkpy_error(vm, "RuntimeError", pkpy_string("invalid music track index\n")); 590 594 591 595 //stop the music first I guess 592 - tic_api_music(tic, -1, 0, 0, false, false, -1, -1); 596 + core->api.music(tic, -1, 0, 0, false, false, -1, -1); 593 597 if (track >= 0) 594 - tic_api_music(tic, track, frame, row, loop, sustain, tempo, speed); 598 + core->api.music(tic, track, frame, row, loop, sustain, tempo, speed); 595 599 596 600 return 0; 597 601 } 598 602 599 603 static int py_peek(pkpy_vm* vm) { 600 604 601 - tic_mem* tic; 605 + 602 606 int address; 603 607 int bits; 604 608 605 609 pkpy_to_int(vm, 0, &address); 606 610 pkpy_to_int(vm, 1, &bits); 607 - get_core(vm, (tic_core**) &tic); 611 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 608 612 if(pkpy_check_error(vm)) 609 613 return 0; 610 614 611 - int value = tic_api_peek(tic, address, bits); 615 + int value = core->api.peek(tic, address, bits); 612 616 pkpy_push_int(vm, value); 613 617 614 618 return 1; ··· 616 620 617 621 static int py_peek1(pkpy_vm* vm) { 618 622 619 - tic_mem* tic; 623 + 620 624 int address; 621 625 622 626 pkpy_to_int(vm, 0, &address); 623 - get_core(vm, (tic_core**) &tic); 627 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 624 628 if(pkpy_check_error(vm)) 625 629 return 0; 626 630 627 - int value = tic_api_peek1(tic, address); 631 + int value = core->api.peek1(tic, address); 628 632 pkpy_push_int(vm, value); 629 633 630 634 return 1; ··· 632 636 633 637 static int py_peek2(pkpy_vm* vm) { 634 638 635 - tic_mem* tic; 639 + 636 640 int address; 637 641 638 642 pkpy_to_int(vm, 0, &address); 639 - get_core(vm, (tic_core**) &tic); 643 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 640 644 if(pkpy_check_error(vm)) 641 645 return 0; 642 646 643 - int value = tic_api_peek2(tic, address); 647 + int value = core->api.peek2(tic, address); 644 648 pkpy_push_int(vm, value); 645 649 646 650 return 1; ··· 648 652 649 653 static int py_peek4(pkpy_vm* vm) { 650 654 651 - tic_mem* tic; 655 + 652 656 int address; 653 657 654 658 pkpy_to_int(vm, 0, &address); 655 - get_core(vm, (tic_core**) &tic); 659 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 656 660 if(pkpy_check_error(vm)) 657 661 return 0; 658 662 659 - int value = tic_api_peek4(tic, address); 663 + int value = core->api.peek4(tic, address); 660 664 pkpy_push_int(vm, value); 661 665 662 666 return 1; 663 667 } 664 668 665 669 static int py_pix(pkpy_vm* vm) { 666 - tic_mem* tic; 670 + 667 671 int x; 668 672 int y; 669 673 int color = -1; ··· 672 676 pkpy_to_int(vm, 1, &y); 673 677 if(!pkpy_is_none(vm, 2)) pkpy_to_int(vm, 2, &color); 674 678 675 - get_core(vm, (tic_core**) &tic); 679 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 676 680 677 681 if(pkpy_check_error(vm)) 678 682 return 0; 679 683 680 684 if(color >= 0) { //set the pixel 681 - tic_api_pix(tic, x, y, color, false); 685 + core->api.pix(tic, x, y, color, false); 682 686 return 0; 683 687 } else { //get the pixel 684 - int value = tic_api_pix(tic, x, y, 0, true); 688 + int value = core->api.pix(tic, x, y, 0, true); 685 689 pkpy_push_int(vm, value); 686 690 return 1; 687 691 } 688 692 } 689 693 690 694 static int py_pmem(pkpy_vm* vm) { 691 - tic_mem* tic; 695 + 692 696 int index; 693 697 bool provided_value = false; 694 698 int value; ··· 698 702 provided_value = true; 699 703 pkpy_to_int(vm, 1, &value); 700 704 } 701 - get_core(vm, (tic_core**) &tic); 705 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 702 706 if(pkpy_check_error(vm)) 703 707 return 0; 704 708 ··· 707 711 return 0; 708 712 } 709 713 710 - int stored = tic_api_pmem(tic, index, 0, false); 714 + int stored = core->api.pmem(tic, index, 0, false); 711 715 pkpy_push_int(vm, stored); 712 716 713 717 if(provided_value) //set the value 714 - tic_api_pmem(tic, index, value, true); 718 + core->api.pmem(tic, index, value, true); 715 719 716 720 return 1; 717 721 } 718 722 719 723 static int py_poke(pkpy_vm* vm) { 720 724 721 - tic_mem* tic; 725 + 722 726 int address; 723 727 int value; 724 728 int bits; ··· 726 730 pkpy_to_int(vm, 0, &address); 727 731 pkpy_to_int(vm, 1, &value); 728 732 pkpy_to_int(vm, 2, &bits); 729 - get_core(vm, (tic_core**) &tic); 733 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 730 734 if(pkpy_check_error(vm)) 731 735 return 0; 732 736 733 - tic_api_poke(tic, address, value, bits); 737 + core->api.poke(tic, address, value, bits); 734 738 735 739 return 0; 736 740 } 737 741 738 742 static int py_poke1(pkpy_vm* vm) { 739 743 740 - tic_mem* tic; 744 + 741 745 int address; 742 746 int value; 743 747 744 748 pkpy_to_int(vm, 0, &address); 745 749 pkpy_to_int(vm, 1, &value); 746 - get_core(vm, (tic_core**) &tic); 750 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 747 751 if(pkpy_check_error(vm)) 748 752 return 0; 749 753 750 - tic_api_poke1(tic, address, value); 754 + core->api.poke1(tic, address, value); 751 755 752 756 return 0; 753 757 } 754 758 755 759 static int py_poke2(pkpy_vm* vm) { 756 760 757 - tic_mem* tic; 761 + 758 762 int address; 759 763 int value; 760 764 761 765 pkpy_to_int(vm, 0, &address); 762 766 pkpy_to_int(vm, 1, &value); 763 - get_core(vm, (tic_core**) &tic); 767 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 764 768 if(pkpy_check_error(vm)) 765 769 return 0; 766 770 767 - tic_api_poke2(tic, address, value); 771 + core->api.poke2(tic, address, value); 768 772 769 773 return 0; 770 774 } 771 775 772 776 static int py_poke4(pkpy_vm* vm) { 773 777 774 - tic_mem* tic; 778 + 775 779 int address; 776 780 int value; 777 781 778 782 pkpy_to_int(vm, 0, &address); 779 783 pkpy_to_int(vm, 1, &value); 780 - get_core(vm, (tic_core**) &tic); 784 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 781 785 if(pkpy_check_error(vm)) 782 786 return 0; 783 787 784 - tic_api_poke4(tic, address, value); 788 + core->api.poke4(tic, address, value); 785 789 786 790 return 0; 787 791 } 788 792 789 793 static int py_print(pkpy_vm* vm) { 790 794 791 - tic_mem* tic; 795 + 792 796 pkpy_CString text; 793 797 int x; 794 798 int y; ··· 808 812 pkpy_to_bool(vm, 4, &fixed); 809 813 pkpy_to_int(vm, 5, &scale); 810 814 pkpy_to_bool(vm, 6, &alt); 811 - get_core(vm, (tic_core**) &tic); 815 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 812 816 if(pkpy_check_error(vm)) { 813 817 return 0; 814 818 } 815 819 816 - s32 size = tic_api_print(tic, text, x, y, color, fixed, scale, alt); 820 + s32 size = core->api.print(tic, text, x, y, color, fixed, scale, alt); 817 821 pkpy_push_int(vm, size); 818 822 return 1; 819 823 } 820 824 821 825 static int py_rect(pkpy_vm* vm) 822 826 { 823 - tic_mem* tic; 827 + 824 828 int x; 825 829 int y; 826 830 int w; ··· 832 836 pkpy_to_int(vm, 2, &w); 833 837 pkpy_to_int(vm, 3, &h); 834 838 pkpy_to_int(vm, 4, &color); 835 - get_core(vm, (tic_core**) &tic); 839 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 836 840 if(pkpy_check_error(vm)) 837 841 return 0; 838 842 839 - tic_api_rect(tic, x, y, w, h, color); 843 + core->api.rect(tic, x, y, w, h, color); 840 844 return 0; 841 845 } 842 846 843 847 static int py_rectb(pkpy_vm* vm) 844 848 { 845 - tic_mem* tic; 849 + 846 850 int x; 847 851 int y; 848 852 int w; ··· 854 858 pkpy_to_int(vm, 2, &w); 855 859 pkpy_to_int(vm, 3, &h); 856 860 pkpy_to_int(vm, 4, &color); 857 - get_core(vm, (tic_core**) &tic); 861 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 858 862 if(pkpy_check_error(vm)) 859 863 return 0; 860 864 861 - tic_api_rectb(tic, x, y, w, h, color); 865 + core->api.rectb(tic, x, y, w, h, color); 862 866 return 0; 863 867 } 864 868 865 869 static int py_sfx(pkpy_vm* vm) 866 870 { 867 - tic_mem* tic; 871 + 868 872 int sfx_id; 869 873 870 - bool parse_note = false; 874 + bool parse_note_flag = false; 871 875 const char* string_note = NULL; 872 876 int int_note; 873 877 ··· 879 883 pkpy_to_int(vm, 0, &sfx_id); 880 884 881 885 if (pkpy_is_string(vm, 1)) { 882 - parse_note = true; 886 + parse_note_flag = true; 883 887 pkpy_to_string(vm, 1, &string_note); 884 888 } else { 885 889 pkpy_to_int(vm, 1, &int_note); ··· 889 893 pkpy_to_int(vm, 3, &channel); 890 894 pkpy_to_int(vm, 4, &volume); 891 895 pkpy_to_int(vm, 5, &speed); 892 - get_core(vm, (tic_core**) &tic); 896 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 893 897 if(pkpy_check_error(vm)) 894 898 goto cleanup; 895 899 s32 note, octave; 896 900 897 - if (parse_note) { 898 - if(!tic_tool_parse_note(string_note, &note, &octave)) { 901 + if (parse_note_flag) { 902 + if(!parse_note(string_note, &note, &octave)) { 899 903 pkpy_error(vm, "RuntimeError", pkpy_string("invalid note, should like C#4\n")); 900 904 goto cleanup; //error in future; 901 905 } ··· 917 921 918 922 919 923 //for now we won't support two channel volumes 920 - tic_api_sfx(tic, sfx_id, note, octave, duration, channel, volume & 0xf, volume & 0xf, speed); 924 + core->api.sfx(tic, sfx_id, note, octave, duration, channel, volume & 0xf, volume & 0xf, speed); 921 925 922 926 cleanup : 923 927 return 0; ··· 925 929 926 930 static int py_spr(pkpy_vm* vm) 927 931 { 928 - tic_mem* tic; 932 + 929 933 int spr_id; 930 934 int x; 931 935 int y; ··· 947 951 pkpy_to_int(vm, 6, &rotate); 948 952 pkpy_to_int(vm, 7, &w); 949 953 pkpy_to_int(vm, 8, &h); 950 - get_core(vm, (tic_core**) &tic); 954 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 951 955 if(pkpy_check_error(vm)) 952 956 return 0; 953 957 954 - tic_api_spr(tic, spr_id, x, y, w, h, colors, color_count, scale, flip, rotate); 958 + core->api.spr(tic, spr_id, x, y, w, h, colors, color_count, scale, flip, rotate); 955 959 956 960 return 0; 957 961 } ··· 969 973 970 974 static int py_sync(pkpy_vm* vm) 971 975 { 972 - tic_mem* tic; 976 + 973 977 int mask; 974 978 int bank; 975 979 bool tocart; ··· 977 981 pkpy_to_int(vm, 0, &mask); 978 982 pkpy_to_int(vm, 1, &bank); 979 983 pkpy_to_bool(vm, 2, &tocart); 980 - get_core(vm, (tic_core**) &tic); 984 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 981 985 if(pkpy_check_error(vm)) 982 986 return 0; 983 987 ··· 987 991 } 988 992 989 993 990 - tic_api_sync(tic, mask, bank, tocart); 994 + core->api.sync(tic, mask, bank, tocart); 991 995 return 0; 992 996 } 993 997 994 998 static int py_time(pkpy_vm* vm) 995 999 { 996 - tic_mem* tic; 997 - get_core(vm, (tic_core**) &tic); 1000 + 1001 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 998 1002 if(pkpy_check_error(vm)) 999 1003 return 0; 1000 1004 1001 - double time = tic_api_time(tic); 1005 + double time = core->api.time(tic); 1002 1006 pkpy_push_float(vm, time); 1003 1007 return 1; 1004 1008 } 1005 1009 1006 1010 static int py_tstamp(pkpy_vm* vm) 1007 1011 { 1008 - tic_mem* tic; 1009 - get_core(vm, (tic_core**) &tic); 1012 + 1013 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 1010 1014 if(pkpy_check_error(vm)) 1011 1015 return 0; 1012 1016 1013 - int tstamp = tic_api_tstamp(tic); 1017 + int tstamp = core->api.tstamp(tic); 1014 1018 pkpy_push_int(vm, tstamp); 1015 1019 return 1; 1016 1020 } 1017 1021 1018 1022 static int py_tri(pkpy_vm* vm) 1019 1023 { 1020 - tic_mem* tic; 1024 + 1021 1025 double x1; 1022 1026 double y1; 1023 1027 double x2; ··· 1033 1037 pkpy_to_float(vm, 4, &x3); 1034 1038 pkpy_to_float(vm, 5, &y3); 1035 1039 pkpy_to_int(vm, 6, &color); 1036 - get_core(vm, (tic_core**) &tic); 1040 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 1037 1041 if(pkpy_check_error(vm)) 1038 1042 return 0; 1039 1043 1040 - tic_api_tri(tic, x1, y1, x2, y2, x3, y3, color); 1044 + core->api.tri(tic, x1, y1, x2, y2, x3, y3, color); 1041 1045 return 0; 1042 1046 } 1043 1047 1044 1048 static int py_trib(pkpy_vm* vm) 1045 1049 { 1046 - tic_mem* tic; 1050 + 1047 1051 double x1; 1048 1052 double y1; 1049 1053 double x2; ··· 1059 1063 pkpy_to_float(vm, 4, &x3); 1060 1064 pkpy_to_float(vm, 5, &y3); 1061 1065 pkpy_to_int(vm, 6, &color); 1062 - get_core(vm, (tic_core**) &tic); 1066 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 1063 1067 if(pkpy_check_error(vm)) 1064 1068 return 0; 1065 1069 1066 - tic_api_trib(tic, x1, y1, x2, y2, x3, y3, color); 1070 + core->api.trib(tic, x1, y1, x2, y2, x3, y3, color); 1067 1071 return 0; 1068 1072 } 1069 1073 1070 1074 static int py_ttri(pkpy_vm* vm) 1071 1075 { 1072 - tic_mem* tic; 1076 + 1073 1077 double x1; 1074 1078 double y1; 1075 1079 double x2; ··· 1111 1115 pkpy_to_float(vm, 15, &z2); 1112 1116 pkpy_to_float(vm, 16, &z3); 1113 1117 1114 - get_core(vm, (tic_core**) &tic); 1118 + tic_core* core; get_core(vm, &core); tic_mem* tic = (tic_mem*)core; 1115 1119 if(pkpy_check_error(vm)) 1116 1120 return 0; 1117 1121 1118 - tic_api_ttri( 1122 + core->api.ttri( 1119 1123 tic, 1120 1124 x1,y1,x2,y2,x3,y3, 1121 1125 u1,v1,u2,v2,u3,v3, ··· 1144 1148 s32 prev = core->state.vbank.id; 1145 1149 1146 1150 if (bank_id >= 0) 1147 - tic_api_vbank(tic, bank_id); 1151 + core->api.vbank(tic, bank_id); 1148 1152 1149 1153 pkpy_push_int(vm, prev); 1150 1154 return 1; ··· 1516 1520 }; 1517 1521 1518 1522 1519 - const tic_script_config PythonSyntaxConfig = 1523 + PK_EXPORT const tic_script_config PythonSyntaxConfig = 1520 1524 { 1521 1525 .id = 20, 1522 1526 .name = "python",
+98 -95
src/api/scheme.c
··· 29 29 #include <string.h> 30 30 31 31 static const char* TicCore = "_TIC80"; 32 - static const char* TicCoreType = "_TIC80Type"; 33 32 34 33 tic_core* getSchemeCore(s7_scheme* sc) 35 34 { ··· 39 38 s7_pointer scheme_print(s7_scheme* sc, s7_pointer args) 40 39 { 41 40 //print(text x=0 y=0 color=15 fixed=false scale=1 smallfont=false) -> width 42 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 41 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 43 42 const char* text = s7_string(s7_car(args)); 44 43 const int argn = s7_list_length(sc, args); 45 44 const s32 x = argn > 1 ? s7_integer(s7_cadr(args)) : 0; ··· 48 47 const bool fixed = argn > 4 ? s7_boolean(sc, s7_list_ref(sc, args, 4)) : false; 49 48 const s32 scale = argn > 5 ? s7_integer(s7_list_ref(sc, args, 5)) : 1; 50 49 const bool alt = argn > 6 ? s7_boolean(sc, s7_list_ref(sc, args, 6)) : false; 51 - const s32 result = tic_api_print(tic, text, x, y, color, fixed, scale, alt); 50 + const s32 result = core->api.print(tic, text, x, y, color, fixed, scale, alt); 52 51 return s7_make_integer(sc, result); 53 52 } 54 53 s7_pointer scheme_cls(s7_scheme* sc, s7_pointer args) 55 54 { 56 55 // cls(color=0) 57 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 56 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 58 57 const int argn = s7_list_length(sc, args); 59 58 const u8 color = (args > 0) ? s7_integer(s7_car(args)) : 0; 60 - tic_api_cls(tic, color); 59 + core->api.cls(tic, color); 61 60 return s7_nil(sc); 62 61 } 63 62 s7_pointer scheme_pix(s7_scheme* sc, s7_pointer args) 64 63 { 65 64 // pix(x y color)\npix(x y) -> color 66 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 65 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 67 66 const s32 x = s7_integer(s7_car(args)); 68 67 const s32 y = s7_integer(s7_cadr(args)); 69 68 ··· 71 70 if (argn == 3) 72 71 { 73 72 const u8 color = s7_integer(s7_caddr(args)); 74 - tic_api_pix(tic, x, y, color, false); 73 + core->api.pix(tic, x, y, color, false); 75 74 return s7_nil(sc); 76 75 } 77 76 else{ 78 - return s7_make_integer(sc, tic_api_pix(tic, x, y, 0, true)); 77 + return s7_make_integer(sc, core->api.pix(tic, x, y, 0, true)); 79 78 } 80 79 81 80 } 82 81 s7_pointer scheme_line(s7_scheme* sc, s7_pointer args) 83 82 { 84 83 // line(x0 y0 x1 y1 color) 85 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 84 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 86 85 const s32 x0 = s7_integer(s7_car(args)); 87 86 const s32 y0 = s7_integer(s7_cadr(args)); 88 87 const s32 x1 = s7_integer(s7_caddr(args)); 89 88 const s32 y1 = s7_integer(s7_cadddr(args)); 90 89 const u8 color = s7_integer(s7_list_ref(sc, args, 4)); 91 - tic_api_line(tic, x0, y0, x1, y1, color); 90 + core->api.line(tic, x0, y0, x1, y1, color); 92 91 return s7_nil(sc); 93 92 } 94 93 s7_pointer scheme_rect(s7_scheme* sc, s7_pointer args) 95 94 { 96 95 // rect(x y w h color) 97 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 96 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 98 97 const s32 x = s7_integer(s7_car(args)); 99 98 const s32 y = s7_integer(s7_cadr(args)); 100 99 const s32 w = s7_integer(s7_caddr(args)); 101 100 const s32 h = s7_integer(s7_cadddr(args)); 102 101 const u8 color = s7_integer(s7_list_ref(sc, args, 4)); 103 - tic_api_rect(tic, x, y, w, h, color); 102 + core->api.rect(tic, x, y, w, h, color); 104 103 return s7_nil(sc); 105 104 } 106 105 s7_pointer scheme_rectb(s7_scheme* sc, s7_pointer args) 107 106 { 108 107 // rectb(x y w h color) 109 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 108 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 110 109 const s32 x = s7_integer(s7_car(args)); 111 110 const s32 y = s7_integer(s7_cadr(args)); 112 111 const s32 w = s7_integer(s7_caddr(args)); 113 112 const s32 h = s7_integer(s7_cadddr(args)); 114 113 const u8 color = s7_integer(s7_list_ref(sc, args, 4)); 115 - tic_api_rectb(tic, x, y, w, h, color); 114 + core->api.rectb(tic, x, y, w, h, color); 116 115 return s7_nil(sc); 117 116 } 118 117 ··· 141 140 { 142 141 // spr(id x y colorkey=-1 scale=1 flip=0 rotate=0 w=1 h=1) 143 142 const int argn = s7_list_length(sc, args); 144 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 143 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 145 144 const s32 id = s7_integer(s7_car(args)); 146 145 const s32 x = s7_integer(s7_cadr(args)); 147 146 const s32 y = s7_integer(s7_caddr(args)); ··· 159 158 const s32 rotate = argn > 6 ? s7_integer(s7_list_ref(sc, args, 6)) : 0; 160 159 const s32 w = argn > 7 ? s7_integer(s7_list_ref(sc, args, 7)) : 1; 161 160 const s32 h = argn > 8 ? s7_integer(s7_list_ref(sc, args, 8)) : 1; 162 - tic_api_spr(tic, id, x, y, w, h, trans_colors, trans_count, scale, (tic_flip)flip, (tic_rotate) rotate); 161 + core->api.spr(tic, id, x, y, w, h, trans_colors, trans_count, scale, (tic_flip)flip, (tic_rotate) rotate); 163 162 return s7_nil(sc); 164 163 } 165 164 s7_pointer scheme_btn(s7_scheme* sc, s7_pointer args) 166 165 { 167 166 // btn(id) -> pressed 168 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 167 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 169 168 const s32 id = s7_integer(s7_car(args)); 170 169 171 - return s7_make_boolean(sc, tic_api_btn(tic, id)); 170 + return s7_make_boolean(sc, core->api.btn(tic, id)); 172 171 } 173 172 s7_pointer scheme_btnp(s7_scheme* sc, s7_pointer args) 174 173 { 175 174 // btnp(id hold=-1 period=-1) -> pressed 176 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 175 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 177 176 const s32 id = s7_integer(s7_car(args)); 178 177 179 178 const int argn = s7_list_length(sc, args); 180 179 const s32 hold = argn > 1 ? s7_integer(s7_cadr(args)) : -1; 181 180 const s32 period = argn > 2 ? s7_integer(s7_caddr(args)) : -1; 182 181 183 - return s7_make_boolean(sc, tic_api_btnp(tic, id, hold, period)); 182 + return s7_make_boolean(sc, core->api.btnp(tic, id, hold, period)); 184 183 } 185 184 186 185 u8 get_note_base(char c) { ··· 214 213 s7_pointer scheme_sfx(s7_scheme* sc, s7_pointer args) 215 214 { 216 215 // sfx(id note=-1 duration=-1 channel=0 volume=15 speed=0) 217 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 216 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 218 217 const s32 id = s7_integer(s7_car(args)); 219 218 220 219 const int argn = s7_list_length(sc, args); ··· 269 268 } 270 269 const s32 speed = argn > 5 ? s7_integer(s7_list_ref(sc, args, 5)) : 0; 271 270 272 - tic_api_sfx(tic, id, note, octave, duration, channel, volumes[0], volumes[1], speed); 271 + core->api.sfx(tic, id, note, octave, duration, channel, volumes[0], volumes[1], speed); 273 272 return s7_nil(sc); 274 273 } 275 274 ··· 302 301 s7_pointer scheme_map(s7_scheme* sc, s7_pointer args) 303 302 { 304 303 // map(x=0 y=0 w=30 h=17 sx=0 sy=0 colorkey=-1 scale=1 remap=nil) 305 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 304 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 306 305 const s32 x = s7_integer(s7_car(args)); 307 306 const s32 y = s7_integer(s7_cadr(args)); 308 307 const s32 w = s7_integer(s7_caddr(args)); ··· 329 328 data.sc = sc; 330 329 data.callback = s7_list_ref(sc, args, 8); 331 330 } 332 - tic_api_map(tic, x, y, w, h, sx, sy, trans_colors, trans_count, scale, remap, &data); 331 + core->api.map(tic, x, y, w, h, sx, sy, trans_colors, trans_count, scale, remap, &data); 333 332 return s7_nil(sc); 334 333 } 335 334 s7_pointer scheme_mget(s7_scheme* sc, s7_pointer args) 336 335 { 337 336 // mget(x y) -> tile_id 338 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 337 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 339 338 const s32 x = s7_integer(s7_car(args)); 340 339 const s32 y = s7_integer(s7_cadr(args)); 341 - return s7_make_integer(sc, tic_api_mget(tic, x, y)); 340 + return s7_make_integer(sc, core->api.mget(tic, x, y)); 342 341 } 343 342 s7_pointer scheme_mset(s7_scheme* sc, s7_pointer args) 344 343 { 345 344 // mset(x y tile_id) 346 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 345 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 347 346 const s32 x = s7_integer(s7_car(args)); 348 347 const s32 y = s7_integer(s7_cadr(args)); 349 348 const u8 tile_id = s7_integer(s7_caddr(args)); 350 - tic_api_mset(tic, x, y, tile_id); 349 + core->api.mset(tic, x, y, tile_id); 351 350 return s7_nil(sc); 352 351 } 353 352 s7_pointer scheme_peek(s7_scheme* sc, s7_pointer args) 354 353 { 355 354 // peek(addr bits=8) -> value 356 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 355 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 357 356 const s32 addr = s7_integer(s7_car(args)); 358 357 const int argn = s7_list_length(sc, args); 359 358 const s32 bits = argn > 1 ? s7_integer(s7_cadr(args)) : 8; 360 - return s7_make_integer(sc, tic_api_peek(tic, addr, bits)); 359 + return s7_make_integer(sc, core->api.peek(tic, addr, bits)); 361 360 } 362 361 s7_pointer scheme_poke(s7_scheme* sc, s7_pointer args) 363 362 { 364 363 // poke(addr value bits=8) 365 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 364 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 366 365 const s32 addr = s7_integer(s7_car(args)); 367 366 const s32 value = s7_integer(s7_cadr(args)); 368 367 const int argn = s7_list_length(sc, args); 369 368 const s32 bits = argn > 2 ? s7_integer(s7_caddr(args)) : 8; 370 - tic_api_poke(tic, addr, value, bits); 369 + core->api.poke(tic, addr, value, bits); 371 370 return s7_nil(sc); 372 371 } 373 372 s7_pointer scheme_peek1(s7_scheme* sc, s7_pointer args) 374 373 { 375 374 // peek1(addr) -> value 376 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 375 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 377 376 const s32 addr = s7_integer(s7_car(args)); 378 - return s7_make_integer(sc, tic_api_peek1(tic, addr)); 377 + return s7_make_integer(sc, core->api.peek1(tic, addr)); 379 378 } 380 379 s7_pointer scheme_poke1(s7_scheme* sc, s7_pointer args) 381 380 { 382 381 // poke1(addr value) 383 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 382 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 384 383 const s32 addr = s7_integer(s7_car(args)); 385 384 const s32 value = s7_integer(s7_cadr(args)); 386 - tic_api_poke1(tic, addr, value); 385 + core->api.poke1(tic, addr, value); 387 386 return s7_nil(sc); 388 387 } 389 388 s7_pointer scheme_peek2(s7_scheme* sc, s7_pointer args) 390 389 { 391 390 // peek2(addr) -> value 392 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 391 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 393 392 const s32 addr = s7_integer(s7_car(args)); 394 - return s7_make_integer(sc, tic_api_peek2(tic, addr)); 393 + return s7_make_integer(sc, core->api.peek2(tic, addr)); 395 394 } 396 395 s7_pointer scheme_poke2(s7_scheme* sc, s7_pointer args) 397 396 { 398 397 // poke2(addr value) 399 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 398 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 400 399 const s32 addr = s7_integer(s7_car(args)); 401 400 const s32 value = s7_integer(s7_cadr(args)); 402 - tic_api_poke2(tic, addr, value); 401 + core->api.poke2(tic, addr, value); 403 402 return s7_nil(sc); 404 403 } 405 404 s7_pointer scheme_peek4(s7_scheme* sc, s7_pointer args) 406 405 { 407 406 // peek4(addr) -> value 408 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 407 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 409 408 const s32 addr = s7_integer(s7_car(args)); 410 - return s7_make_integer(sc, tic_api_peek4(tic, addr)); 409 + return s7_make_integer(sc, core->api.peek4(tic, addr)); 411 410 } 412 411 s7_pointer scheme_poke4(s7_scheme* sc, s7_pointer args) 413 412 { 414 413 // poke4(addr value) 415 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 414 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 416 415 const s32 addr = s7_integer(s7_car(args)); 417 416 const s32 value = s7_integer(s7_cadr(args)); 418 - tic_api_poke4(tic, addr, value); 417 + core->api.poke4(tic, addr, value); 419 418 return s7_nil(sc); 420 419 } 421 420 s7_pointer scheme_memcpy(s7_scheme* sc, s7_pointer args) 422 421 { 423 422 // memcpy(dest source size) 424 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 423 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 425 424 const s32 dest = s7_integer(s7_car(args)); 426 425 const s32 source = s7_integer(s7_cadr(args)); 427 426 const s32 size = s7_integer(s7_caddr(args)); 428 - tic_api_memcpy(tic, dest, source, size); 427 + 428 + #undef memcpy 429 + core->api.memcpy(tic, dest, source, size); 429 430 return s7_nil(sc); 430 431 } 431 432 s7_pointer scheme_memset(s7_scheme* sc, s7_pointer args) 432 433 { 433 434 // memset(dest value size) 434 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 435 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 435 436 const s32 dest = s7_integer(s7_car(args)); 436 437 const s32 value = s7_integer(s7_cadr(args)); 437 438 const s32 size = s7_integer(s7_caddr(args)); 438 - tic_api_memset(tic, dest, value, size); 439 + 440 + #undef memset 441 + core->api.memset(tic, dest, value, size); 439 442 return s7_nil(sc); 440 443 } 441 444 s7_pointer scheme_trace(s7_scheme* sc, s7_pointer args) 442 445 { 443 446 // trace(message color=15) 444 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 447 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 445 448 const char* msg = s7_string(s7_car(args)); 446 449 const int argn = s7_list_length(sc, args); 447 450 const s32 color = argn > 1 ? s7_integer(s7_cadr(args)) : 15; 448 - tic_api_trace(tic, msg, color); 451 + core->api.trace(tic, msg, color); 449 452 return s7_nil(sc); 450 453 } 451 454 s7_pointer scheme_pmem(s7_scheme* sc, s7_pointer args) 452 455 { 453 456 // pmem(index value) 454 457 // pmem(index) -> value 455 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 458 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 456 459 const s32 index = s7_integer(s7_car(args)); 457 460 const int argn = s7_list_length(sc, args); 458 461 s32 value = 0; ··· 462 465 value = s7_integer(s7_cadr(args)); 463 466 shouldSet = true; 464 467 } 465 - return s7_make_integer(sc, (s32)tic_api_pmem(tic, index, value, shouldSet)); 468 + return s7_make_integer(sc, (s32)core->api.pmem(tic, index, value, shouldSet)); 466 469 } 467 470 s7_pointer scheme_time(s7_scheme* sc, s7_pointer args) 468 471 { 469 472 // time() -> ticks 470 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 471 - return s7_make_real(sc, tic_api_time(tic)); 473 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 474 + return s7_make_real(sc, core->api.time(tic)); 472 475 } 473 476 s7_pointer scheme_tstamp(s7_scheme* sc, s7_pointer args) 474 477 { 475 478 // tstamp() -> timestamp 476 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 477 - return s7_make_integer(sc, tic_api_tstamp(tic)); 479 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 480 + return s7_make_integer(sc, core->api.tstamp(tic)); 478 481 } 479 482 s7_pointer scheme_exit(s7_scheme* sc, s7_pointer args) 480 483 { 481 484 // exit() 482 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 483 - tic_api_exit(tic); 485 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 486 + core->api.exit(tic); 484 487 return s7_nil(sc); 485 488 } 486 489 s7_pointer scheme_font(s7_scheme* sc, s7_pointer args) 487 490 { 488 491 // font(text x y chromakey char_width char_height fixed=false scale=1 alt=false) -> width 489 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 492 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 490 493 const char* text = s7_string(s7_car(args)); 491 494 const s32 x = s7_integer(s7_cadr(args)); 492 495 const s32 y = s7_integer(s7_caddr(args)); ··· 503 506 const s32 scale = argn > 7 ? s7_integer(s7_list_ref(sc, args, 7)) : 1; 504 507 const s32 alt = argn > 8 ? s7_boolean(sc, s7_list_ref(sc, args, 8)) : false; 505 508 506 - return s7_make_integer(sc, tic_api_font(tic, text, x, y, trans_colors, trans_count, w, h, fixed, scale, alt)); 509 + return s7_make_integer(sc, core->api.font(tic, text, x, y, trans_colors, trans_count, w, h, fixed, scale, alt)); 507 510 } 508 511 s7_pointer scheme_mouse(s7_scheme* sc, s7_pointer args) 509 512 { 510 513 // mouse() -> x y left middle right scrollx scrolly 511 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 512 - const tic_point point = tic_api_mouse(tic); 514 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 515 + const tic_point point = core->api.mouse(tic); 513 516 const tic80_mouse* mouse = &((tic_core*)tic)->memory.ram->input.mouse; 514 517 515 518 return ··· 525 528 s7_pointer scheme_circ(s7_scheme* sc, s7_pointer args) 526 529 { 527 530 // circ(x y radius color) 528 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 531 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 529 532 const s32 x = s7_integer(s7_car(args)); 530 533 const s32 y = s7_integer(s7_cadr(args)); 531 534 const s32 radius = s7_integer(s7_caddr(args)); 532 535 const s32 color = s7_integer(s7_cadddr(args)); 533 - tic_api_circ(tic, x, y, radius, color); 536 + core->api.circ(tic, x, y, radius, color); 534 537 return s7_nil(sc); 535 538 } 536 539 s7_pointer scheme_circb(s7_scheme* sc, s7_pointer args) 537 540 { 538 541 // circb(x y radius color) 539 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 542 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 540 543 const s32 x = s7_integer(s7_car(args)); 541 544 const s32 y = s7_integer(s7_cadr(args)); 542 545 const s32 radius = s7_integer(s7_caddr(args)); 543 546 const s32 color = s7_integer(s7_cadddr(args)); 544 - tic_api_circb(tic, x, y, radius, color); 547 + core->api.circb(tic, x, y, radius, color); 545 548 return s7_nil(sc); 546 549 } 547 550 s7_pointer scheme_elli(s7_scheme* sc, s7_pointer args) 548 551 { 549 552 // elli(x y a b color) 550 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 553 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 551 554 const s32 x = s7_integer(s7_car(args)); 552 555 const s32 y = s7_integer(s7_cadr(args)); 553 556 const s32 a = s7_integer(s7_caddr(args)); 554 557 const s32 b = s7_integer(s7_cadddr(args)); 555 558 const s32 color = s7_integer(s7_list_ref(sc, args, 4)); 556 - tic_api_elli(tic, x, y, a, b, color); 559 + core->api.elli(tic, x, y, a, b, color); 557 560 return s7_nil(sc); 558 561 } 559 562 s7_pointer scheme_ellib(s7_scheme* sc, s7_pointer args) 560 563 { 561 564 // ellib(x y a b color) 562 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 565 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 563 566 const s32 x = s7_integer(s7_car(args)); 564 567 const s32 y = s7_integer(s7_cadr(args)); 565 568 const s32 a = s7_integer(s7_caddr(args)); 566 569 const s32 b = s7_integer(s7_cadddr(args)); 567 570 const s32 color = s7_integer(s7_list_ref(sc, args, 4)); 568 - tic_api_ellib(tic, x, y, a, b, color); 571 + core->api.ellib(tic, x, y, a, b, color); 569 572 return s7_nil(sc); 570 573 } 571 574 s7_pointer scheme_tri(s7_scheme* sc, s7_pointer args) 572 575 { 573 576 // tri(x1 y1 x2 y2 x3 y3 color) 574 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 577 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 575 578 const s32 x1 = s7_integer(s7_car(args)); 576 579 const s32 y1 = s7_integer(s7_cadr(args)); 577 580 const s32 x2 = s7_integer(s7_caddr(args)); ··· 579 582 const s32 x3 = s7_integer(s7_list_ref(sc, args, 4)); 580 583 const s32 y3 = s7_integer(s7_list_ref(sc, args, 5)); 581 584 const s32 color = s7_integer(s7_list_ref(sc, args, 6)); 582 - tic_api_tri(tic, x1, y1, x2, y2, x3, y3, color); 585 + core->api.tri(tic, x1, y1, x2, y2, x3, y3, color); 583 586 return s7_nil(sc); 584 587 } 585 588 s7_pointer scheme_trib(s7_scheme* sc, s7_pointer args) 586 589 { 587 590 // trib(x1 y1 x2 y2 x3 y3 color) 588 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 591 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 589 592 const s32 x1 = s7_integer(s7_car(args)); 590 593 const s32 y1 = s7_integer(s7_cadr(args)); 591 594 const s32 x2 = s7_integer(s7_caddr(args)); ··· 593 596 const s32 x3 = s7_integer(s7_list_ref(sc, args, 4)); 594 597 const s32 y3 = s7_integer(s7_list_ref(sc, args, 5)); 595 598 const s32 color = s7_integer(s7_list_ref(sc, args, 6)); 596 - tic_api_trib(tic, x1, y1, x2, y2, x3, y3, color); 599 + core->api.trib(tic, x1, y1, x2, y2, x3, y3, color); 597 600 return s7_nil(sc); 598 601 } 599 602 s7_pointer scheme_ttri(s7_scheme* sc, s7_pointer args) 600 603 { 601 604 // ttri(x1 y1 x2 y2 x3 y3 u1 v1 u2 v2 u3 v3 texsrc=0 chromakey=-1 z1=0 z2=0 z3=0) 602 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 605 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 603 606 const s32 x1 = s7_integer(s7_car(args)); 604 607 const s32 y1 = s7_integer(s7_cadr(args)); 605 608 const s32 x2 = s7_integer(s7_caddr(args)); ··· 630 633 const s32 z2 = argn > 15 ? s7_integer(s7_list_ref(sc, args, 15)) : 0; 631 634 const s32 z3 = argn > 16 ? s7_integer(s7_list_ref(sc, args, 16)) : 0; 632 635 633 - tic_api_ttri(tic, x1, y1, x2, y2, x3, y3, u1, v1, u2, v2, u3, v3, texsrc, trans_colors, trans_count, z1, z2, z3, depth); 636 + core->api.ttri(tic, x1, y1, x2, y2, x3, y3, u1, v1, u2, v2, u3, v3, texsrc, trans_colors, trans_count, z1, z2, z3, depth); 634 637 return s7_nil(sc); 635 638 } 636 639 s7_pointer scheme_clip(s7_scheme* sc, s7_pointer args) 637 640 { 638 641 // clip(x y width height) 639 642 // clip() 640 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 643 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 641 644 const int argn = s7_list_length(sc, args); 642 645 if (argn != 4) { 643 - tic_api_clip(tic, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); 646 + core->api.clip(tic, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); 644 647 } else { 645 648 const s32 x = s7_integer(s7_car(args)); 646 649 const s32 y = s7_integer(s7_cadr(args)); 647 650 const s32 w = s7_integer(s7_caddr(args)); 648 651 const s32 h = s7_integer(s7_cadddr(args)); 649 - tic_api_clip(tic, x, y, w, h); 652 + core->api.clip(tic, x, y, w, h); 650 653 } 651 654 return s7_nil(sc); 652 655 } 653 656 s7_pointer scheme_music(s7_scheme* sc, s7_pointer args) 654 657 { 655 658 // music(track=-1 frame=-1 row=-1 loop=true sustain=false tempo=-1 speed=-1) 656 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 659 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 657 660 const int argn = s7_list_length(sc, args); 658 661 const s32 track = argn > 0 ? s7_integer(s7_car(args)) : -1; 659 662 const s32 frame = argn > 1 ? s7_integer(s7_cadr(args)) : -1; ··· 662 665 const bool sustain = argn > 4 ? s7_boolean(sc, s7_list_ref(sc, args, 4)) : false; 663 666 const s32 tempo = argn > 5 ? s7_integer(s7_list_ref(sc, args, 5)) : -1; 664 667 const s32 speed = argn > 6 ? s7_integer(s7_list_ref(sc, args, 6)) : -1; 665 - tic_api_music(tic, track, frame, row, loop, sustain, tempo, speed); 668 + core->api.music(tic, track, frame, row, loop, sustain, tempo, speed); 666 669 return s7_nil(sc); 667 670 } 668 671 s7_pointer scheme_sync(s7_scheme* sc, s7_pointer args) 669 672 { 670 673 // sync(mask=0 bank=0 tocart=false) 671 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 674 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 672 675 const int argn = s7_list_length(sc, args); 673 676 const u32 mask = argn > 0 ? (u32)s7_integer(s7_car(args)) : 0; 674 677 const s32 bank = argn > 1 ? s7_integer(s7_cadr(args)) : 0; 675 678 const bool tocart = argn > 2 ? s7_boolean(sc, s7_caddr(args)) : false; 676 - tic_api_sync(tic, mask, bank, tocart); 679 + core->api.sync(tic, mask, bank, tocart); 677 680 return s7_nil(sc); 678 681 } 679 682 s7_pointer scheme_vbank(s7_scheme* sc, s7_pointer args) 680 683 { 681 684 // vbank(bank) -> prev 682 685 // vbank() -> prev 683 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 686 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 684 687 const int argn = s7_list_length(sc, args); 685 688 686 689 const s32 prev = ((tic_core*)tic)->state.vbank.id; 687 690 if (argn == 1) { 688 691 const s32 bank = s7_integer(s7_car(args)); 689 - tic_api_vbank(tic, bank); 692 + core->api.vbank(tic, bank); 690 693 } 691 694 return s7_make_integer(sc, prev); 692 695 } 693 696 s7_pointer scheme_reset(s7_scheme* sc, s7_pointer args) 694 697 { 695 698 // reset() 696 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 697 - tic_api_reset(tic); 699 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 700 + core->api.reset(tic); 698 701 return s7_nil(sc); 699 702 } 700 703 s7_pointer scheme_key(s7_scheme* sc, s7_pointer args) 701 704 { 702 705 //key(code=-1) -> pressed 703 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 706 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 704 707 const int argn = s7_list_length(sc, args); 705 708 const tic_key code = argn > 0 ? s7_integer(s7_car(args)) : -1; 706 - return s7_make_boolean(sc, tic_api_key(tic, code)); 709 + return s7_make_boolean(sc, core->api.key(tic, code)); 707 710 } 708 711 s7_pointer scheme_keyp(s7_scheme* sc, s7_pointer args) 709 712 { 710 713 // keyp(code=-1 hold=-1 period=-1) -> pressed 711 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 714 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 712 715 const int argn = s7_list_length(sc, args); 713 716 const tic_key code = argn > 0 ? s7_integer(s7_car(args)) : -1; 714 717 const s32 hold = argn > 1 ? s7_integer(s7_cadr(args)) : -1; 715 718 const s32 period = argn > 2 ? s7_integer(s7_caddr(args)) : -1; 716 - return s7_make_boolean(sc, tic_api_keyp(tic, code, hold, period)); 719 + return s7_make_boolean(sc, core->api.keyp(tic, code, hold, period)); 717 720 } 718 721 s7_pointer scheme_fget(s7_scheme* sc, s7_pointer args) 719 722 { 720 723 // fget(sprite_id flag) -> bool 721 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 724 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 722 725 const s32 sprite_id = s7_integer(s7_car(args)); 723 726 const u8 flag = s7_integer(s7_cadr(args)); 724 - return s7_make_boolean(sc, tic_api_fget(tic, sprite_id, flag)); 727 + return s7_make_boolean(sc, core->api.fget(tic, sprite_id, flag)); 725 728 } 726 729 s7_pointer scheme_fset(s7_scheme* sc, s7_pointer args) 727 730 { 728 731 // fset(sprite_id flag bool) 729 - tic_mem* tic = (tic_mem*)getSchemeCore(sc); 732 + tic_core* core = getSchemeCore(sc); tic_mem* tic = (tic_mem*)core; 730 733 const s32 sprite_id = s7_integer(s7_car(args)); 731 734 const u8 flag = s7_integer(s7_cadr(args)); 732 735 const bool val = s7_boolean(sc, s7_caddr(args)); 733 - tic_api_fset(tic, sprite_id, flag, val); 736 + core->api.fset(tic, sprite_id, flag, val); 734 737 return s7_nil(sc); 735 738 } 736 739
+105 -98
src/api/squirrel.c
··· 31 31 #include <sqstdblob.h> 32 32 #include <ctype.h> 33 33 34 + extern bool parse_note(const char* noteStr, s32* note, s32* octave); 35 + 34 36 static const char TicCore[] = "_TIC80"; 35 37 36 38 static float getSquirrelFloat(HSQUIRRELVM vm, s32 index) ··· 116 118 117 119 static SQInteger squirrel_peek(HSQUIRRELVM vm) 118 120 { 119 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 121 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 120 122 SQInteger top = sq_gettop(vm); 121 123 122 124 // check number of args ··· 129 131 if(top == 3) 130 132 bits = getSquirrelNumber(vm, 3); 131 133 132 - sq_pushinteger(vm, tic_api_peek(tic, address, bits)); 134 + sq_pushinteger(vm, core->api.peek(tic, address, bits)); 133 135 return 1; 134 136 } 135 137 136 138 static SQInteger squirrel_poke(HSQUIRRELVM vm) 137 139 { 138 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 140 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 139 141 SQInteger top = sq_gettop(vm); 140 142 141 143 if (top < 3) ··· 148 150 if(top == 4) 149 151 bits = getSquirrelNumber(vm, 4); 150 152 151 - tic_api_poke(tic, address, value, bits); 153 + core->api.poke(tic, address, value, bits); 152 154 153 155 return 0; 154 156 } 155 157 156 158 static SQInteger squirrel_peek1(HSQUIRRELVM vm) 157 159 { 158 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 160 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 159 161 160 162 // check number of args 161 163 if (sq_gettop(vm) != 2) 162 164 return sq_throwerror(vm, "invalid parameters, peek4(address)"); 163 165 s32 address = getSquirrelNumber(vm, 2); 164 166 165 - sq_pushinteger(vm, tic_api_peek1(tic, address)); 167 + sq_pushinteger(vm, core->api.peek1(tic, address)); 166 168 return 1; 167 169 } 168 170 169 171 static SQInteger squirrel_poke1(HSQUIRRELVM vm) 170 172 { 171 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 173 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 172 174 173 175 if (sq_gettop(vm) != 3) 174 176 return sq_throwerror( vm, "invalid parameters, poke4(address,value)" ); ··· 176 178 s32 address = getSquirrelNumber(vm, 2); 177 179 u8 value = getSquirrelNumber(vm, 3); 178 180 179 - tic_api_poke1(tic, address, value); 181 + core->api.poke1(tic, address, value); 180 182 181 183 return 0; 182 184 } 183 185 184 186 static SQInteger squirrel_peek2(HSQUIRRELVM vm) 185 187 { 186 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 188 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 187 189 188 190 // check number of args 189 191 if (sq_gettop(vm) != 2) 190 192 return sq_throwerror(vm, "invalid parameters, peek2(address)"); 191 193 s32 address = getSquirrelNumber(vm, 2); 192 194 193 - sq_pushinteger(vm, tic_api_peek2(tic, address)); 195 + sq_pushinteger(vm, core->api.peek2(tic, address)); 194 196 return 1; 195 197 } 196 198 197 199 static SQInteger squirrel_poke2(HSQUIRRELVM vm) 198 200 { 199 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 201 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 200 202 201 203 if (sq_gettop(vm) != 3) 202 204 return sq_throwerror( vm, "invalid parameters, poke2(address,value)" ); ··· 204 206 s32 address = getSquirrelNumber(vm, 2); 205 207 u8 value = getSquirrelNumber(vm, 3); 206 208 207 - tic_api_poke2(tic, address, value); 209 + core->api.poke2(tic, address, value); 208 210 209 211 return 0; 210 212 } 211 213 212 214 static SQInteger squirrel_peek4(HSQUIRRELVM vm) 213 215 { 214 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 216 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 215 217 216 218 // check number of args 217 219 if (sq_gettop(vm) != 2) 218 220 return sq_throwerror(vm, "invalid parameters, peek4(address)"); 219 221 s32 address = getSquirrelNumber(vm, 2); 220 222 221 - sq_pushinteger(vm, tic_api_peek4(tic, address)); 223 + sq_pushinteger(vm, core->api.peek4(tic, address)); 222 224 return 1; 223 225 } 224 226 225 227 static SQInteger squirrel_poke4(HSQUIRRELVM vm) 226 228 { 227 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 229 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 228 230 229 231 if (sq_gettop(vm) != 3) 230 232 return sq_throwerror( vm, "invalid parameters, poke4(address,value)" ); ··· 232 234 s32 address = getSquirrelNumber(vm, 2); 233 235 u8 value = getSquirrelNumber(vm, 3); 234 236 235 - tic_api_poke4(tic, address, value); 237 + core->api.poke4(tic, address, value); 236 238 237 239 return 0; 238 240 } ··· 241 243 { 242 244 SQInteger top = sq_gettop(vm); 243 245 244 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 246 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 245 247 246 - tic_api_cls(tic, top == 2 ? getSquirrelNumber(vm, 2) : 0); 248 + core->api.cls(tic, top == 2 ? getSquirrelNumber(vm, 2) : 0); 247 249 248 250 return 0; 249 251 } ··· 257 259 s32 x = getSquirrelNumber(vm, 2); 258 260 s32 y = getSquirrelNumber(vm, 3); 259 261 260 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 262 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 261 263 262 264 if(top >= 4) 263 265 { 264 266 s32 color = getSquirrelNumber(vm, 4); 265 - tic_api_pix(tic, x, y, color, false); 267 + core->api.pix(tic, x, y, color, false); 266 268 } 267 269 else 268 270 { 269 - sq_pushinteger(vm, tic_api_pix(tic, x, y, 0, true)); 271 + sq_pushinteger(vm, core->api.pix(tic, x, y, 0, true)); 270 272 return 1; 271 273 } 272 274 ··· 288 290 float y1 = getSquirrelFloat(vm, 5); 289 291 s32 color = getSquirrelNumber(vm, 6); 290 292 291 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 293 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 292 294 293 - tic_api_line(tic, x0, y0, x1, y1, color); 295 + core->api.line(tic, x0, y0, x1, y1, color); 294 296 } 295 297 else return sq_throwerror(vm, "invalid parameters, line(x0,y0,x1,y1,color)\n"); 296 298 ··· 309 311 s32 h = getSquirrelNumber(vm, 5); 310 312 s32 color = getSquirrelNumber(vm, 6); 311 313 312 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 314 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 313 315 314 - tic_api_rect(tic, x, y, w, h, color); 316 + core->api.rect(tic, x, y, w, h, color); 315 317 } 316 318 else return sq_throwerror(vm, "invalid parameters, rect(x,y,w,h,color)\n"); 317 319 ··· 330 332 s32 h = getSquirrelNumber(vm, 5); 331 333 s32 color = getSquirrelNumber(vm, 6); 332 334 333 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 335 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 334 336 335 - tic_api_rectb(tic, x, y, w, h, color); 337 + core->api.rectb(tic, x, y, w, h, color); 336 338 } 337 339 else return sq_throwerror(vm, "invalid parameters, rectb(x,y,w,h,color)\n"); 338 340 ··· 350 352 s32 radius = getSquirrelNumber(vm, 4); 351 353 s32 color = getSquirrelNumber(vm, 5); 352 354 353 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 355 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 354 356 355 - tic_api_circ(tic, x, y, radius, color); 357 + core->api.circ(tic, x, y, radius, color); 356 358 } 357 359 else return sq_throwerror(vm, "invalid parameters, circ(x,y,radius,color)\n"); 358 360 ··· 370 372 s32 radius = getSquirrelNumber(vm, 4); 371 373 s32 color = getSquirrelNumber(vm, 5); 372 374 373 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 375 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 374 376 375 - tic_api_circb(tic, x, y, radius, color); 377 + core->api.circb(tic, x, y, radius, color); 376 378 } 377 379 else return sq_throwerror(vm, "invalid parameters, circb(x,y,radius,color)\n"); 378 380 ··· 391 393 s32 b = getSquirrelNumber(vm, 5); 392 394 s32 color = getSquirrelNumber(vm, 6); 393 395 394 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 396 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 395 397 396 - tic_api_elli(tic, x, y, a, b, color); 398 + core->api.elli(tic, x, y, a, b, color); 397 399 } 398 400 else return sq_throwerror(vm, "invalid parameters, elli(x,y,a,b,color)\n"); 399 401 ··· 412 414 s32 b = getSquirrelNumber(vm, 5); 413 415 s32 color = getSquirrelNumber(vm, 6); 414 416 415 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 417 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 416 418 417 - tic_api_ellib(tic, x, y, a, b, color); 419 + core->api.ellib(tic, x, y, a, b, color); 418 420 } 419 421 else return sq_throwerror(vm, "invalid parameters, ellib(x,y,a,b,color)\n"); 420 422 ··· 434 436 435 437 s32 color = getSquirrelNumber(vm, 8); 436 438 437 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 439 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 438 440 439 - tic_api_tri(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 441 + core->api.tri(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 440 442 } 441 443 else return sq_throwerror(vm, "invalid parameters, tri(x1,y1,x2,y2,x3,y3,color)\n"); 442 444 ··· 456 458 457 459 s32 color = getSquirrelNumber(vm, 8); 458 460 459 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 461 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 460 462 461 - tic_api_trib(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 463 + core->api.trib(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 462 464 } 463 465 else return sq_throwerror(vm, "invalid parameters, trib(x1,y1,x2,y2,x3,y3,color)\n"); 464 466 ··· 476 478 for (s32 i = 0; i < COUNT_OF(pt); i++) 477 479 pt[i] = getSquirrelFloat(vm, i + 2); 478 480 479 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 481 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 480 482 static u8 colors[TIC_PALETTE_SIZE]; 481 483 s32 count = 0; 482 484 tic_texture_src src = tic_tiles_texture; ··· 523 525 depth = true; 524 526 } 525 527 526 - tic_api_ttri(tic, pt[0], pt[1], // xy 1 528 + core->api.ttri(tic, pt[0], pt[1], // xy 1 527 529 pt[2], pt[3], // xy 2 528 530 pt[4], pt[5], // xy 3 529 531 pt[6], pt[7], // uv 1 ··· 544 546 545 547 if(top == 1) 546 548 { 547 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 549 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 548 550 549 - tic_api_clip(tic, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); 551 + core->api.clip(tic, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); 550 552 } 551 553 else if(top == 5) 552 554 { ··· 555 557 s32 w = getSquirrelNumber(vm, 4); 556 558 s32 h = getSquirrelNumber(vm, 5); 557 559 558 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 560 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 559 561 560 - tic_api_clip((tic_mem*)getSquirrelCore(vm), x, y, w, h); 562 + core->api.clip((tic_mem*)getSquirrelCore(vm), x, y, w, h); 561 563 } 562 564 else return sq_throwerror(vm, "invalid parameters, use clip(x,y,w,h) or clip()\n"); 563 565 ··· 573 575 574 576 if (top == 1) 575 577 { 576 - sq_pushinteger(vm, tic_api_btnp(tic, -1, -1, -1)); 578 + sq_pushinteger(vm, core->api.btnp(tic, -1, -1, -1)); 577 579 } 578 580 else if(top == 2) 579 581 { 580 582 s32 index = getSquirrelNumber(vm, 2) & 0x1f; 581 583 582 - sq_pushbool(vm, (tic_api_btnp(tic, index, -1, -1) ? SQTrue : SQFalse)); 584 + sq_pushbool(vm, (core->api.btnp(tic, index, -1, -1) ? SQTrue : SQFalse)); 583 585 } 584 586 else if (top == 4) 585 587 { ··· 587 589 u32 hold = getSquirrelNumber(vm, 3); 588 590 u32 period = getSquirrelNumber(vm, 4); 589 591 590 - sq_pushbool(vm, (tic_api_btnp(tic, index, hold, period) ? SQTrue : SQFalse)); 592 + sq_pushbool(vm, (core->api.btnp(tic, index, hold, period) ? SQTrue : SQFalse)); 591 593 } 592 594 else 593 595 { ··· 606 608 607 609 if (top == 1) 608 610 { 609 - sq_pushinteger(vm, tic_api_btn(tic, -1)); 611 + sq_pushinteger(vm, core->api.btn(tic, -1)); 610 612 } 611 613 else if (top == 2) 612 614 { 613 - bool pressed = tic_api_btn(tic, getSquirrelNumber(vm, 2) & 0x1f); 615 + bool pressed = core->api.btn(tic, getSquirrelNumber(vm, 2) & 0x1f); 614 616 sq_pushbool(vm, pressed ? SQTrue : SQFalse); 615 617 } 616 618 else ··· 696 698 } 697 699 } 698 700 699 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 701 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 700 702 701 - tic_api_spr(tic, index, x, y, w, h, colors, count, scale, flip, rotate); 703 + core->api.spr(tic, index, x, y, w, h, colors, count, scale, flip, rotate); 702 704 703 705 return 0; 704 706 } ··· 712 714 s32 x = getSquirrelNumber(vm, 2); 713 715 s32 y = getSquirrelNumber(vm, 3); 714 716 715 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 717 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 716 718 717 - u8 value = tic_api_mget(tic, x, y); 719 + u8 value = core->api.mget(tic, x, y); 718 720 sq_pushinteger(vm, value); 719 721 return 1; 720 722 } ··· 733 735 s32 y = getSquirrelNumber(vm, 3); 734 736 u8 val = getSquirrelNumber(vm, 4); 735 737 736 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 738 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 737 739 738 - tic_api_mset(tic, x, y, val); 740 + core->api.mset(tic, x, y, val); 739 741 } 740 742 else return sq_throwerror(vm, "invalid params, mget(x,y)\n"); 741 743 ··· 857 859 sq_getstackobj(vm, 10, &data.reg); 858 860 sq_addref(vm, &data.reg); 859 861 860 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 862 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 861 863 862 - tic_api_map(tic, x, y, w, h, sx, sy, colors, count, scale, remapCallback, &data); 864 + core->api.map(tic, x, y, w, h, sx, sy, colors, count, scale, remapCallback, &data); 863 865 864 866 //luaL_unref(lua, LUA_REGISTRYINDEX, data.reg); 865 867 sq_release(vm, &data.reg); ··· 873 875 } 874 876 } 875 877 876 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 878 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 877 879 878 - tic_api_map((tic_mem*)getSquirrelCore(vm), x, y, w, h, sx, sy, colors, count, scale, NULL, NULL); 880 + core->api.map((tic_mem*)getSquirrelCore(vm), x, y, w, h, sx, sy, colors, count, scale, NULL, NULL); 879 881 880 882 return 0; 881 883 } ··· 883 885 static SQInteger squirrel_music(HSQUIRRELVM vm) 884 886 { 885 887 SQInteger top = sq_gettop(vm); 886 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 888 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 887 889 888 - if(top == 1) tic_api_music(tic, -1, 0, 0, false, false, -1, -1); 890 + if(top == 1) core->api.music(tic, -1, 0, 0, false, false, -1, -1); 889 891 else if(top >= 2) 890 892 { 891 - tic_api_music(tic, -1, 0, 0, false, false, -1, -1); 893 + core->api.music(tic, -1, 0, 0, false, false, -1, -1); 892 894 893 895 s32 track = getSquirrelNumber(vm, 2); 894 896 ··· 935 937 } 936 938 } 937 939 938 - tic_api_music(tic, track, frame, row, loop, sustain, tempo, speed); 940 + core->api.music(tic, track, frame, row, loop, sustain, tempo, speed); 939 941 } 940 942 else return sq_throwerror(vm, "invalid params, use music(track)\n"); 941 943 ··· 948 950 949 951 if(top >= 2) 950 952 { 951 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 953 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 952 954 953 955 s32 note = -1; 954 956 s32 octave = -1; ··· 984 986 sq_getstring(vm, 3, &str); 985 987 const char* noteStr = (const char*)str; 986 988 987 - if(!tic_tool_parse_note(noteStr, &note, &octave)) 989 + if(!parse_note(noteStr, &note, &octave)) 988 990 { 989 991 return sq_throwerror(vm, "invalid note, should be like C#4\n"); 990 992 } ··· 1024 1026 1025 1027 if (channel >= 0 && channel < TIC_SOUND_CHANNELS) 1026 1028 { 1027 - tic_api_sfx(tic, index, note, octave, duration, channel, volumes[0] & 0xf, volumes[1] & 0xf, speed); 1029 + core->api.sfx(tic, index, note, octave, duration, channel, volumes[0] & 0xf, volumes[1] & 0xf, speed); 1028 1030 } 1029 1031 else return sq_throwerror(vm, "unknown channel\n"); 1030 1032 } ··· 1043 1045 s32 prev = core->state.vbank.id; 1044 1046 1045 1047 if(sq_gettop(vm) == 2) 1046 - tic_api_vbank(tic, getSquirrelNumber(vm, 2)); 1048 + core->api.vbank(tic, getSquirrelNumber(vm, 2)); 1047 1049 1048 1050 sq_pushinteger(vm, prev); 1049 1051 return 1; ··· 1051 1053 1052 1054 static SQInteger squirrel_sync(HSQUIRRELVM vm) 1053 1055 { 1054 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 1056 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 1055 1057 1056 1058 bool toCart = false; 1057 1059 u32 mask = 0; ··· 1075 1077 } 1076 1078 1077 1079 if(bank >= 0 && bank < TIC_BANKS) 1078 - tic_api_sync(tic, mask, bank, toCart); 1080 + core->api.sync(tic, mask, bank, toCart); 1079 1081 else 1080 1082 return sq_throwerror(vm, "sync() error, invalid bank"); 1081 1083 ··· 1100 1102 1101 1103 if (top == 1) 1102 1104 { 1103 - sq_pushbool(vm, tic_api_key(tic, tic_key_unknown) ? SQTrue : SQFalse); 1105 + sq_pushbool(vm, core->api.key(tic, tic_key_unknown) ? SQTrue : SQFalse); 1104 1106 } 1105 1107 else if (top == 2) 1106 1108 { 1107 1109 tic_key key = getSquirrelNumber(vm, 2); 1108 1110 1109 1111 if(key < tic_keys_count) 1110 - sq_pushbool(vm, tic_api_key(tic, key) ? SQTrue : SQFalse); 1112 + sq_pushbool(vm, core->api.key(tic, key) ? SQTrue : SQFalse); 1111 1113 else 1112 1114 { 1113 1115 return sq_throwerror(vm, "unknown keyboard code\n"); ··· 1130 1132 1131 1133 if (top == 1) 1132 1134 { 1133 - sq_pushbool(vm, tic_api_keyp(tic, tic_key_unknown, -1, -1) ? SQTrue : SQFalse); 1135 + sq_pushbool(vm, core->api.keyp(tic, tic_key_unknown, -1, -1) ? SQTrue : SQFalse); 1134 1136 } 1135 1137 else 1136 1138 { ··· 1144 1146 { 1145 1147 if(top == 2) 1146 1148 { 1147 - sq_pushbool(vm, tic_api_keyp(tic, key, -1, -1) ? SQTrue : SQFalse); 1149 + sq_pushbool(vm, core->api.keyp(tic, key, -1, -1) ? SQTrue : SQFalse); 1148 1150 } 1149 1151 else if(top == 4) 1150 1152 { 1151 1153 u32 hold = getSquirrelNumber(vm, 3); 1152 1154 u32 period = getSquirrelNumber(vm, 4); 1153 1155 1154 - sq_pushbool(vm, tic_api_keyp(tic, key, hold, period) ? SQTrue : SQFalse); 1156 + sq_pushbool(vm, core->api.keyp(tic, key, hold, period) ? SQTrue : SQFalse); 1155 1157 } 1156 1158 else 1157 1159 { ··· 1173 1175 s32 src = getSquirrelNumber(vm, 3); 1174 1176 s32 size = getSquirrelNumber(vm, 4); 1175 1177 1176 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 1177 - tic_api_memcpy(tic, dest, src, size); 1178 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 1179 + 1180 + #undef memcpy 1181 + core->api.memcpy(tic, dest, src, size); 1178 1182 return 0; 1179 1183 } 1180 1184 ··· 1191 1195 u8 value = getSquirrelNumber(vm, 3); 1192 1196 s32 size = getSquirrelNumber(vm, 4); 1193 1197 1194 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 1195 - tic_api_memset(tic, dest, value, size); 1198 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 1199 + 1200 + #undef memset 1201 + core->api.memset(tic, dest, value, size); 1196 1202 return 0; 1197 1203 } 1198 1204 ··· 1213 1219 1214 1220 static SQInteger squirrel_font(HSQUIRRELVM vm) 1215 1221 { 1216 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 1222 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 1217 1223 SQInteger top = sq_gettop(vm); 1218 1224 1219 1225 if(top >= 2) ··· 1271 1277 return 1; 1272 1278 } 1273 1279 1274 - s32 size = tic_api_font(tic, text, x, y, &chromakey, 1, width, height, fixed, scale, alt); 1280 + s32 size = core->api.font(tic, text, x, y, &chromakey, 1, width, height, fixed, scale, alt); 1275 1281 1276 1282 sq_pushinteger(vm, size); 1277 1283 return 1; ··· 1286 1292 1287 1293 if(top >= 2) 1288 1294 { 1289 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 1295 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 1290 1296 1291 1297 s32 x = 0; 1292 1298 s32 y = 0; ··· 1333 1339 return 1; 1334 1340 } 1335 1341 1336 - s32 size = tic_api_print(tic, text ? text : "nil", x, y, color, fixed, scale, alt); 1342 + s32 size = core->api.print(tic, text ? text : "nil", x, y, color, fixed, scale, alt); 1337 1343 1338 1344 sq_pushinteger(vm, size); 1339 1345 ··· 1346 1352 static SQInteger squirrel_trace(HSQUIRRELVM vm) 1347 1353 { 1348 1354 SQInteger top = sq_gettop(vm); 1349 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 1355 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 1350 1356 1351 1357 if(top >= 2) 1352 1358 { ··· 1358 1364 color = getSquirrelNumber(vm, 3); 1359 1365 } 1360 1366 1361 - tic_api_trace(tic, text, color); 1367 + core->api.trace(tic, text, color); 1362 1368 } 1363 1369 1364 1370 return 0; ··· 1367 1373 static SQInteger squirrel_pmem(HSQUIRRELVM vm) 1368 1374 { 1369 1375 SQInteger top = sq_gettop(vm); 1370 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 1376 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 1371 1377 1372 1378 if(top >= 2) 1373 1379 { ··· 1375 1381 1376 1382 if(index < TIC_PERSISTENT_SIZE) 1377 1383 { 1378 - u32 val = tic_api_pmem(tic, index, 0, false); 1384 + u32 val = core->api.pmem(tic, index, 0, false); 1379 1385 1380 1386 if(top >= 3) 1381 1387 { 1382 1388 SQInteger i = 0; 1383 1389 sq_getinteger(vm, 3, &i); 1384 - tic_api_pmem(tic, index, (u32)i, true); 1390 + core->api.pmem(tic, index, (u32)i, true); 1385 1391 } 1386 1392 1387 1393 sq_pushinteger(vm, val); ··· 1397 1403 1398 1404 static SQInteger squirrel_time(HSQUIRRELVM vm) 1399 1405 { 1400 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 1406 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 1401 1407 1402 - sq_pushfloat(vm, (SQFloat)(tic_api_time(tic))); 1408 + sq_pushfloat(vm, (SQFloat)(core->api.time(tic))); 1403 1409 1404 1410 return 1; 1405 1411 } 1406 1412 1407 1413 static SQInteger squirrel_tstamp(HSQUIRRELVM vm) 1408 1414 { 1409 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 1415 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 1410 1416 1411 - sq_pushinteger(vm, tic_api_tstamp(tic)); 1417 + sq_pushinteger(vm, core->api.tstamp(tic)); 1412 1418 1413 1419 return 1; 1414 1420 } 1415 1421 1416 1422 static SQInteger squirrel_exit(HSQUIRRELVM vm) 1417 1423 { 1418 - tic_api_exit((tic_mem*)getSquirrelCore(vm)); 1424 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 1425 + core->api.exit(tic); 1419 1426 1420 1427 return 0; 1421 1428 } ··· 1429 1436 sq_newarray(vm, 0); 1430 1437 1431 1438 { 1432 - tic_point pos = tic_api_mouse((tic_mem*)core); 1439 + tic_point pos = core->api.mouse((tic_mem*)core); 1433 1440 1434 1441 sq_pushinteger(vm, pos.x); 1435 1442 sq_arrayappend(vm, -2); ··· 1453 1460 1454 1461 static SQInteger squirrel_fget(HSQUIRRELVM vm) 1455 1462 { 1456 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 1463 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 1457 1464 1458 1465 SQInteger top = sq_gettop(vm); 1459 1466 ··· 1464 1471 if(top >= 3) 1465 1472 { 1466 1473 u32 flag = getSquirrelNumber(vm, 3); 1467 - sq_pushbool(vm, tic_api_fget(tic, index, flag)); 1474 + sq_pushbool(vm, core->api.fget(tic, index, flag)); 1468 1475 return 1; 1469 1476 } 1470 1477 } ··· 1476 1483 1477 1484 static SQInteger squirrel_fset(HSQUIRRELVM vm) 1478 1485 { 1479 - tic_mem* tic = (tic_mem*)getSquirrelCore(vm); 1486 + tic_core* core = getSquirrelCore(vm); tic_mem* tic = (tic_mem*)core; 1480 1487 1481 1488 SQInteger top = sq_gettop(vm); 1482 1489 ··· 1493 1500 SQBool value = SQFalse; 1494 1501 sq_getbool(vm, 4, &value); 1495 1502 1496 - tic_api_fset(tic, index, flag, value); 1503 + core->api.fset(tic, index, flag, value); 1497 1504 return 0; 1498 1505 } 1499 1506 }
+90 -88
src/api/wasm.c
··· 150 150 m3ApiGetArg (float, y1) 151 151 m3ApiGetArg (int8_t, color) 152 152 153 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 153 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 154 154 155 - tic_api_line(tic, x0, y0, x1, y1, color); 155 + core->api.line(tic, x0, y0, x1, y1, color); 156 156 157 157 m3ApiSuccess(); 158 158 } ··· 166 166 167 167 if (radius >= 0) 168 168 { 169 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 170 - tic_api_circ(tic, x, y, radius, color); 169 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 170 + core->api.circ(tic, x, y, radius, color); 171 171 } 172 172 173 173 m3ApiSuccess(); ··· 182 182 183 183 if (radius >= 0) 184 184 { 185 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 186 - tic_api_circb(tic, x, y, radius, color); 185 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 186 + core->api.circb(tic, x, y, radius, color); 187 187 } 188 188 189 189 m3ApiSuccess(); ··· 199 199 200 200 if (a >= 0 && b >= 0) 201 201 { 202 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 203 - tic_api_elli(tic, x, y, a, b, color); 202 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 203 + core->api.elli(tic, x, y, a, b, color); 204 204 } 205 205 206 206 m3ApiSuccess(); ··· 216 216 217 217 if (a >= 0 && b >= 0) 218 218 { 219 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 220 - tic_api_ellib(tic, x, y, a, b, color); 219 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 220 + core->api.ellib(tic, x, y, a, b, color); 221 221 } 222 222 223 223 m3ApiSuccess(); ··· 231 231 m3ApiGetArg (int32_t, h) 232 232 m3ApiGetArg (int8_t, color) 233 233 234 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 234 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 235 235 236 - tic_api_rect(tic, x, y, w, h, color); 236 + core->api.rect(tic, x, y, w, h, color); 237 237 238 238 m3ApiSuccess(); 239 239 } ··· 246 246 m3ApiGetArg (int32_t, h) 247 247 m3ApiGetArg (int8_t, color) 248 248 249 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 249 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 250 250 251 - tic_api_rectb(tic, x, y, w, h, color); 251 + core->api.rectb(tic, x, y, w, h, color); 252 252 253 253 m3ApiSuccess(); 254 254 } ··· 263 263 m3ApiGetArg (float, y3) 264 264 m3ApiGetArg (int8_t, color) 265 265 266 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 266 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 267 267 268 - tic_api_tri(tic, x1, y1, x2, y2, x3, y3, color); 268 + core->api.tri(tic, x1, y1, x2, y2, x3, y3, color); 269 269 270 270 m3ApiSuccess(); 271 271 } ··· 296 296 colorCount = 0; 297 297 } 298 298 299 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 299 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 300 300 301 - tic_api_ttri(tic, x1, y1, x2, y2, x3, y3, 301 + core->api.ttri(tic, x1, y1, x2, y2, x3, y3, 302 302 u1, v1, u2, v2, u3, v3, texsrc, trans_colors, colorCount, z1, z2, z3, depth); 303 303 304 304 m3ApiSuccess(); ··· 315 315 m3ApiGetArg (float, y3) 316 316 m3ApiGetArg (int8_t, color) 317 317 318 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 318 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 319 319 320 - tic_api_trib(tic, x1, y1, x2, y2, x3, y3, color); 320 + core->api.trib(tic, x1, y1, x2, y2, x3, y3, color); 321 321 322 322 m3ApiSuccess(); 323 323 } ··· 326 326 { 327 327 m3ApiGetArg (int8_t, color) 328 328 329 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 329 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 330 330 331 331 color = (color == -1) ? 0 : color; 332 332 333 - tic_api_cls(tic, color); 333 + core->api.cls(tic, color); 334 334 335 335 m3ApiSuccess(); 336 336 } ··· 345 345 346 346 tic_core* core = getWasmCore(runtime); 347 347 348 - // -1 is a default placeholder here for `id`, but one that `tic_api_btn` already understands, so 348 + // -1 is a default placeholder here for `id`, but one that `core->api.btn` already understands, so 349 349 // it just gets passed straight thru 350 350 351 - m3ApiReturn(tic_api_btn((tic_mem *)core, index)); 351 + m3ApiReturn(core->api.btn((tic_mem *)core, index)); 352 352 353 353 m3ApiSuccess(); 354 354 } ··· 367 367 // knows this so we don't need to do any transaction, we can just pass the -1 values 368 368 // straight thru 369 369 370 - m3ApiReturn(tic_api_btnp((tic_mem *)core, index, hold, period)); 370 + m3ApiReturn(core->api.btnp((tic_mem *)core, index, hold, period)); 371 371 372 372 m3ApiSuccess(); 373 373 } ··· 384 384 385 385 tic_core* core = getWasmCore(runtime); 386 386 387 - m3ApiReturn(tic_api_key((tic_mem *)core, index)); 387 + m3ApiReturn(core->api.key((tic_mem *)core, index)); 388 388 389 389 m3ApiSuccess(); 390 390 } ··· 403 403 404 404 tic_core* core = getWasmCore(runtime); 405 405 406 - m3ApiReturn(tic_api_keyp((tic_mem *)core, index, hold, period)); 406 + m3ApiReturn(core->api.keyp((tic_mem *)core, index, hold, period)); 407 407 408 408 m3ApiSuccess(); 409 409 } ··· 415 415 m3ApiGetArg (int32_t, sprite_index); 416 416 m3ApiGetArg (int8_t, flag); 417 417 418 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 418 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 419 419 420 - m3ApiReturn(tic_api_fget(tic, sprite_index, flag)); 420 + m3ApiReturn(core->api.fget(tic, sprite_index, flag)); 421 421 422 422 m3ApiSuccess(); 423 423 } ··· 428 428 m3ApiGetArg (int8_t, flag); 429 429 m3ApiGetArg (bool, value); 430 430 431 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 431 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 432 432 433 - tic_api_fset(tic, sprite_index, flag, value); 433 + core->api.fset(tic, sprite_index, flag, value); 434 434 435 435 m3ApiSuccess(); 436 436 } ··· 442 442 m3ApiGetArg (int32_t, x); 443 443 m3ApiGetArg (int32_t, y); 444 444 445 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 445 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 446 446 447 - m3ApiReturn(tic_api_mget(tic, x, y)); 447 + m3ApiReturn(core->api.mget(tic, x, y)); 448 448 449 449 m3ApiSuccess(); 450 450 } ··· 455 455 m3ApiGetArg (int32_t, y); 456 456 m3ApiGetArg (int32_t, value); 457 457 458 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 458 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 459 459 460 - tic_api_mset(tic, x, y, value); 460 + core->api.mset(tic, x, y, value); 461 461 462 462 m3ApiSuccess(); 463 463 } ··· 470 470 m3ApiGetArg (int32_t, address) 471 471 m3ApiGetArg (int8_t, bits) 472 472 473 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 473 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 474 474 475 - m3ApiReturn(tic_api_peek(tic, address, bits)); 475 + m3ApiReturn(core->api.peek(tic, address, bits)); 476 476 477 477 m3ApiSuccess(); 478 478 } ··· 483 483 484 484 m3ApiGetArg (int32_t, address) 485 485 486 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 486 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 487 487 488 - m3ApiReturn(tic_api_peek4(tic, address)); 488 + m3ApiReturn(core->api.peek4(tic, address)); 489 489 490 490 m3ApiSuccess(); 491 491 } ··· 496 496 497 497 m3ApiGetArg (int32_t, address) 498 498 499 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 499 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 500 500 501 - m3ApiReturn(tic_api_peek2(tic, address)); 501 + m3ApiReturn(core->api.peek2(tic, address)); 502 502 503 503 m3ApiSuccess(); 504 504 } ··· 509 509 510 510 m3ApiGetArg (int32_t, address) 511 511 512 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 512 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 513 513 514 - m3ApiReturn(tic_api_peek1(tic, address)); 514 + m3ApiReturn(core->api.peek1(tic, address)); 515 515 516 516 m3ApiSuccess(); 517 517 } ··· 522 522 m3ApiGetArg (int8_t, value) 523 523 m3ApiGetArg (int8_t, bits) 524 524 525 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 525 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 526 526 527 - tic_api_poke(tic, address, value, bits); 527 + core->api.poke(tic, address, value, bits); 528 528 529 529 m3ApiSuccess(); 530 530 } ··· 535 535 m3ApiGetArg (int32_t, address) 536 536 m3ApiGetArg (int8_t, value) 537 537 538 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 538 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 539 539 540 - tic_api_poke4(tic, address, value); 540 + core->api.poke4(tic, address, value); 541 541 542 542 m3ApiSuccess(); 543 543 } ··· 548 548 m3ApiGetArg (int32_t, address) 549 549 m3ApiGetArg (int8_t, value) 550 550 551 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 551 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 552 552 553 - tic_api_poke2(tic, address, value); 553 + core->api.poke2(tic, address, value); 554 554 555 555 m3ApiSuccess(); 556 556 } ··· 561 561 m3ApiGetArg (int32_t, address) 562 562 m3ApiGetArg (int8_t, value) 563 563 564 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 564 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 565 565 566 - tic_api_poke1(tic, address, value); 566 + core->api.poke1(tic, address, value); 567 567 568 568 m3ApiSuccess(); 569 569 } ··· 576 576 m3ApiGetArg (int64_t, value) 577 577 bool writeToStorage = true; 578 578 579 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 579 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 580 580 581 581 // read value 582 582 if (value == -1) { 583 583 writeToStorage = false; 584 584 }; 585 585 586 - // TODO: this should move into tic_api_pmem, should it not? 586 + // TODO: this should move into core->api.pmem, should it not? 587 587 if (address >= TIC_PERSISTENT_SIZE) { 588 588 m3ApiReturn(0); 589 589 } else { 590 - u32 val = tic_api_pmem(tic, address, value, writeToStorage); 590 + u32 val = core->api.pmem(tic, address, value, writeToStorage); 591 591 m3ApiReturn(val); 592 592 } 593 593 ··· 602 602 m3ApiGetArg (int32_t, y) 603 603 m3ApiGetArg (int8_t, color) 604 604 605 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 605 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 606 606 607 607 bool getPixel = color < 0; 608 - u8 pix = tic_api_pix(tic, x, y, color, getPixel); 608 + u8 pix = core->api.pix(tic, x, y, color, getPixel); 609 609 m3ApiReturn(pix); 610 610 611 611 m3ApiSuccess(); ··· 627 627 m3ApiGetArg (int32_t, w) 628 628 m3ApiGetArg (int32_t, h) 629 629 630 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 630 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 631 631 632 632 633 633 // defaults ··· 637 637 if (w == -1) { w = 1; } 638 638 if (h == -1) { h = 1; } 639 639 640 - tic_api_spr(tic, index, x, y, w, h, trans_colors, colorCount, scale, flip, rotate) ; 640 + core->api.spr(tic, index, x, y, w, h, trans_colors, colorCount, scale, flip, rotate) ; 641 641 642 642 m3ApiSuccess(); 643 643 } ··· 649 649 m3ApiGetArg (int32_t, w) 650 650 m3ApiGetArg (int32_t, h) 651 651 652 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 652 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 653 653 654 654 // defaults 655 655 if (x == -1) { x = 0; } ··· 657 657 if (w == -1) { w = TIC80_WIDTH; } 658 658 if (h == -1) { h = TIC80_HEIGHT; } 659 659 660 - tic_api_clip(tic, x, y, w, h); 660 + core->api.clip(tic, x, y, w, h); 661 661 662 662 m3ApiSuccess(); 663 663 } ··· 706 706 m3ApiGetArg (i32, map_data_ptr) 707 707 708 708 709 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 709 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 710 710 // depends on their only being 1 module, which SHOULD:tm: be true 711 711 struct RemapInfo info = { .mem = _mem, .core = (tic_core*)tic }; 712 712 if (map_data_ptr > 0) { ··· 722 722 if (h == -1) { h = 17; } 723 723 if (scale == -1) { scale = 1; } 724 724 725 - tic_api_map(tic, x, y, w, h, sx, sy, trans_colors, colorCount, scale, map_data_ptr > 0 ? &wasm_remap : NULL, map_data_ptr > 0 ? &info : NULL); 725 + core->api.map(tic, x, y, w, h, sx, sy, trans_colors, colorCount, scale, map_data_ptr > 0 ? &wasm_remap : NULL, map_data_ptr > 0 ? &info : NULL); 726 726 727 727 m3ApiSuccess(); 728 728 } ··· 741 741 m3ApiGetArg (int8_t, scale) 742 742 m3ApiGetArg (int8_t, alt) 743 743 744 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 744 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 745 745 746 746 // TODO: how to deal with defaults when we can't pass -1 as a bool? 747 747 ··· 749 749 if (scale==0) { 750 750 text_width = 0; 751 751 } else { 752 - text_width = tic_api_print(tic, text, x, y, color, fixed, scale, alt); 752 + text_width = core->api.print(tic, text, x, y, color, fixed, scale, alt); 753 753 } 754 754 m3ApiReturn(text_width); 755 755 ··· 774 774 m3ApiGetArg (int8_t, scale) 775 775 m3ApiGetArg (bool, alt) 776 776 777 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 777 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 778 778 779 779 if (scale == -1) { scale = 1; } 780 780 if (char_width == -1 ) { char_width = TIC_SPRITESIZE; } ··· 784 784 if (scale==0) { 785 785 text_width = 0; 786 786 } else { 787 - text_width = tic_api_font(tic, text, x, y, trans_colors, trans_count, char_width, char_height, fixed, scale, alt); 787 + text_width = core->api.font(tic, text, x, y, trans_colors, trans_count, char_width, char_height, fixed, scale, alt); 788 788 } 789 789 m3ApiReturn(text_width); 790 790 ··· 805 805 m3ApiGetArg (int32_t, volumeRight); 806 806 m3ApiGetArg (int32_t, speed); 807 807 808 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 808 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 809 809 810 810 if (channel >= 0 && channel < TIC_SOUND_CHANNELS) 811 811 { 812 - tic_api_sfx(tic, sfx_id, note, octave, duration, channel, volumeLeft & 0xf, volumeRight & 0xf, speed); 812 + core->api.sfx(tic, sfx_id, note, octave, duration, channel, volumeLeft & 0xf, volumeRight & 0xf, speed); 813 813 } 814 814 815 815 m3ApiSuccess(); ··· 826 826 m3ApiGetArg (int32_t, tempo); 827 827 m3ApiGetArg (int32_t, speed); 828 828 829 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 829 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 830 830 831 831 // TODO: defaults... how with bool vs int 832 832 833 833 if(track > MUSIC_TRACKS - 1) 834 834 m3ApiTrap("invalid music track index"); 835 835 836 - tic_api_music(tic, track, frame, row, loop, sustain, tempo, speed); 836 + core->api.music(tic, track, frame, row, loop, sustain, tempo, speed); 837 837 838 838 m3ApiSuccess(); 839 839 } ··· 846 846 m3ApiGetArg (int32_t, value); 847 847 m3ApiGetArg (int32_t, length); 848 848 849 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 849 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 850 850 851 - tic_api_memset(tic, address, value, length); 851 + #undef memset 852 + core->api.memset(tic, address, value, length); 852 853 853 854 m3ApiSuccess(); 854 855 } ··· 859 860 m3ApiGetArg (int32_t, src); 860 861 m3ApiGetArg (int32_t, length); 861 862 862 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 863 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 863 864 864 - tic_api_memcpy(tic, dest, src, length); 865 + #undef memcpy 866 + core->api.memcpy(tic, dest, src, length); 865 867 866 868 m3ApiSuccess(); 867 869 } ··· 869 871 870 872 m3ApiRawFunction(wasmtic_exit) 871 873 { 872 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 874 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 873 875 874 - tic_api_exit(tic); 876 + core->api.exit(tic); 875 877 876 878 m3ApiSuccess(); 877 879 } ··· 882 884 m3ApiGetArg (int8_t, bank); 883 885 m3ApiGetArg (int8_t, tocart); 884 886 885 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 887 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 886 888 887 889 bool toCart; 888 890 ··· 896 898 897 899 // TODO: how to throw error if bank out of bounds? 898 900 if (bank >=0 && bank < TIC_BANKS) 899 - tic_api_sync(tic, mask, bank, toCart); 901 + core->api.sync(tic, mask, bank, toCart); 900 902 901 903 m3ApiSuccess(); 902 904 } ··· 905 907 { 906 908 m3ApiReturnType (float) // 32 bit float 907 909 908 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 910 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 909 911 910 - m3ApiReturn(tic_api_time(tic)); 912 + m3ApiReturn(core->api.time(tic)); 911 913 912 914 m3ApiSuccess(); 913 915 } ··· 916 918 { 917 919 m3ApiReturnType (uint32_t) 918 920 919 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 921 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 920 922 921 - m3ApiReturn(tic_api_tstamp(tic)); 923 + m3ApiReturn(core->api.tstamp(tic)); 922 924 923 925 m3ApiSuccess(); 924 926 } ··· 928 930 m3ApiGetArgMem(const char*, text); 929 931 m3ApiGetArg(int8_t, color); 930 932 931 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 933 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 932 934 933 935 if (color == -1) { 934 936 color = 15; 935 937 } 936 938 937 - tic_api_trace(tic, text, color); 939 + core->api.trace(tic, text, color); 938 940 939 941 m3ApiSuccess(); 940 942 } ··· 944 946 m3ApiReturnType(int8_t) 945 947 m3ApiGetArg(int8_t, bank); 946 948 947 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 949 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 948 950 949 - uint8_t previous_bank = tic_api_vbank(tic, bank); 951 + uint8_t previous_bank = core->api.vbank(tic, bank); 950 952 m3ApiReturn(previous_bank); 951 953 952 954 m3ApiSuccess(); ··· 969 971 970 972 m3ApiGetArgMem(struct Mouse*, mouse_ptr_addy); 971 973 972 - tic_mem* tic = (tic_mem*)getWasmCore(runtime); 974 + tic_core* core = getWasmCore(runtime); tic_mem* tic = (tic_mem*)core; 973 975 974 976 struct Mouse* mouse_data = mouse_ptr_addy; 975 977 const tic80_mouse* mouse = &tic->ram->input.mouse; 976 978 977 - tic_point pos = tic_api_mouse(tic); 979 + tic_point pos = core->api.mouse(tic); 978 980 979 981 mouse_data->x = pos.x; 980 982 mouse_data->y = pos.y;
+105 -98
src/api/wren.c
··· 30 30 #include "tools.h" 31 31 #include "wren.h" 32 32 33 + extern bool parse_note(const char* noteStr, s32* note, s32* octave); 34 + 33 35 static WrenHandle* game_class = NULL; 34 36 static WrenHandle* new_handle = NULL; 35 37 static WrenHandle* update_handle = NULL; 36 - static WrenHandle* boot_handle = NULL; 38 + static WrenHandle* boot_handle = NULL; 37 39 static WrenHandle* scanline_handle = NULL; 38 40 static WrenHandle* border_handle = NULL; 39 - static WrenHandle* menu_handle = NULL; 41 + static WrenHandle* menu_handle = NULL; 40 42 static WrenHandle* overline_handle = NULL; 41 43 42 44 static bool loaded = false; ··· 279 281 return; 280 282 } 281 283 282 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 284 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 283 285 wrenSetSlotDouble(vm, 0, *(tic->ram->map.data + index)); 284 286 } 285 287 ··· 297 299 298 300 if (top == 1) 299 301 { 300 - wrenSetSlotDouble(vm, 0, tic_api_btn(tic, -1)); 302 + wrenSetSlotDouble(vm, 0, core->api.btn(tic, -1)); 301 303 } 302 304 else if (top == 2) 303 305 { 304 - bool pressed = tic_api_btn(tic, getWrenNumber(vm, 1) & 0x1f); 306 + bool pressed = core->api.btn(tic, getWrenNumber(vm, 1) & 0x1f); 305 307 wrenSetSlotBool(vm, 0, pressed); 306 308 } 307 309 ··· 316 318 317 319 if (top == 1) 318 320 { 319 - wrenSetSlotBool(vm, 0, tic_api_btnp(tic, -1, -1, -1)); 321 + wrenSetSlotBool(vm, 0, core->api.btnp(tic, -1, -1, -1)); 320 322 } 321 323 else if(top == 2) 322 324 { 323 325 s32 index = getWrenNumber(vm, 1) & 0xf; 324 326 325 - wrenSetSlotBool(vm, 0, tic_api_btnp(tic, index, -1, -1)); 327 + wrenSetSlotBool(vm, 0, core->api.btnp(tic, index, -1, -1)); 326 328 } 327 329 else if (top == 4) 328 330 { ··· 330 332 u32 hold = getWrenNumber(vm, 2); 331 333 u32 period = getWrenNumber(vm, 3); 332 334 333 - wrenSetSlotBool(vm, 0, tic_api_btnp(tic, index, hold, period)); 335 + wrenSetSlotBool(vm, 0, core->api.btnp(tic, index, hold, period)); 334 336 } 335 337 } 336 338 ··· 343 345 344 346 if (top == 1) 345 347 { 346 - wrenSetSlotBool(vm, 0, tic_api_key(tic, tic_key_unknown)); 348 + wrenSetSlotBool(vm, 0, core->api.key(tic, tic_key_unknown)); 347 349 } 348 350 else if (top == 2) 349 351 { 350 352 tic_key key = getWrenNumber(vm, 1); 351 353 352 354 if(key < tic_keys_count) 353 - wrenSetSlotBool(vm, 0, tic_api_key(tic, key)); 355 + wrenSetSlotBool(vm, 0, core->api.key(tic, key)); 354 356 else 355 357 { 356 358 wrenError(vm, "unknown keyboard code\n"); ··· 368 370 369 371 if (top == 1) 370 372 { 371 - wrenSetSlotBool(vm, 0, tic_api_keyp(tic, tic_key_unknown, -1, -1)); 373 + wrenSetSlotBool(vm, 0, core->api.keyp(tic, tic_key_unknown, -1, -1)); 372 374 } 373 375 else 374 376 { ··· 382 384 { 383 385 if(top == 2) 384 386 { 385 - wrenSetSlotBool(vm, 0, tic_api_keyp(tic, key, -1, -1)); 387 + wrenSetSlotBool(vm, 0, core->api.keyp(tic, key, -1, -1)); 386 388 } 387 389 else if(top == 4) 388 390 { 389 391 u32 hold = getWrenNumber(vm, 2); 390 392 u32 period = getWrenNumber(vm, 3); 391 393 392 - wrenSetSlotBool(vm, 0, tic_api_keyp(tic, key, hold, period)); 394 + wrenSetSlotBool(vm, 0, core->api.keyp(tic, key, hold, period)); 393 395 } 394 396 } 395 397 } ··· 406 408 wrenSetSlotNewList(vm, 0); 407 409 408 410 { 409 - tic_point pos = tic_api_mouse((tic_mem*)core); 411 + tic_point pos = core->api.mouse((tic_mem*)core); 410 412 411 413 wrenSetSlotDouble(vm, 1, pos.x); 412 414 wrenInsertInList(vm, 0, 0, 1); ··· 429 431 430 432 static void wren_print(WrenVM* vm) 431 433 { 432 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 434 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 433 435 434 436 const char* text = wrenGetSlotString(vm, 1); 435 437 ··· 450 452 451 453 bool alt = wrenGetSlotBool(vm, 7); 452 454 453 - s32 size = tic_api_print(tic, text, x, y, color, fixed, scale, alt); 455 + s32 size = core->api.print(tic, text, x, y, color, fixed, scale, alt); 454 456 455 457 wrenSetSlotDouble(vm, 0, size); 456 458 } 457 459 458 460 static void wren_font(WrenVM* vm) 459 461 { 460 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 462 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 461 463 s32 top = wrenGetSlotCount(vm); 462 464 463 465 if(top > 1) ··· 515 517 return; 516 518 } 517 519 518 - s32 size = tic_api_font(tic, text ? text : "null", x, y, &chromakey, 1, width, height, fixed, scale, alt); 520 + s32 size = core->api.font(tic, text ? text : "null", x, y, &chromakey, 1, width, height, fixed, scale, alt); 519 521 wrenSetSlotDouble(vm, 0, size); 520 522 } 521 523 } 522 524 523 525 static void wren_trace(WrenVM* vm) 524 526 { 525 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 527 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 526 528 527 529 const char* text = wrenGetSlotString(vm, 1); 528 530 u8 color = (u8)getWrenNumber(vm, 2); 529 531 530 - tic_api_trace(tic, text, color); 532 + core->api.trace(tic, text, color); 531 533 } 532 534 533 535 static void wren_spr(WrenVM* vm) ··· 604 606 } 605 607 } 606 608 607 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 609 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 608 610 609 - tic_api_spr(tic, index, x, y, w, h, colors, count, scale, flip, rotate); 611 + core->api.spr(tic, index, x, y, w, h, colors, count, scale, flip, rotate); 610 612 } 611 613 612 614 static void wren_spr_internal(WrenVM* vm) ··· 648 650 s32 flip = getWrenNumber(vm, 6); 649 651 s32 rotate = getWrenNumber(vm, 7); 650 652 651 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 653 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 652 654 653 - tic_api_spr(tic, index, x, y, 1, 1, colors, count, scale, flip, rotate); 655 + core->api.spr(tic, index, x, y, 1, 1, colors, count, scale, flip, rotate); 654 656 } 655 657 656 658 static void wren_map(WrenVM* vm) ··· 717 719 } 718 720 } 719 721 720 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 722 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 721 723 722 - tic_api_map(tic, x, y, w, h, sx, sy, colors, count, scale, NULL, NULL); 724 + core->api.map(tic, x, y, w, h, sx, sy, colors, count, scale, NULL, NULL); 723 725 } 724 726 725 727 static void wren_mset(WrenVM* vm) ··· 728 730 s32 y = getWrenNumber(vm, 2); 729 731 u8 value = getWrenNumber(vm, 3); 730 732 731 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 733 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 732 734 733 - tic_api_mset(tic, x, y, value); 735 + core->api.mset(tic, x, y, value); 734 736 } 735 737 736 738 static void wren_mget(WrenVM* vm) ··· 738 740 s32 x = getWrenNumber(vm, 1); 739 741 s32 y = getWrenNumber(vm, 2); 740 742 741 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 743 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 742 744 743 - u8 value = tic_api_mget(tic, x, y); 745 + u8 value = core->api.mget(tic, x, y); 744 746 wrenSetSlotDouble(vm, 0, value); 745 747 } 746 748 ··· 776 778 pt[i] = (float)wrenGetSlotDouble(vm, i + 1); 777 779 } 778 780 779 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 781 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 780 782 static u8 colors[TIC_PALETTE_SIZE]; 781 783 s32 count = 0; 782 784 tic_texture_src src = tic_tiles_texture; ··· 812 814 count = 1; 813 815 } 814 816 815 - tic_api_ttri(tic, 817 + core->api.ttri(tic, 816 818 pt[0], pt[1], // xy 1 817 819 pt[2], pt[3], // xy 2 818 820 pt[4], pt[5], // xy 3 ··· 894 896 s32 x = getWrenNumber(vm, 1); 895 897 s32 y = getWrenNumber(vm, 2); 896 898 897 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 899 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 898 900 899 901 if(top > 3) 900 902 { 901 903 s32 color = getWrenNumber(vm, 3); 902 - tic_api_pix(tic, x, y, color, false); 904 + core->api.pix(tic, x, y, color, false); 903 905 } 904 906 else 905 907 { 906 - wrenSetSlotDouble(vm, 0, tic_api_pix(tic, x, y, 0, true)); 908 + wrenSetSlotDouble(vm, 0, core->api.pix(tic, x, y, 0, true)); 907 909 } 908 910 } 909 911 ··· 915 917 float y1 = (float)wrenGetSlotDouble(vm, 4); 916 918 s32 color = getWrenNumber(vm, 5); 917 919 918 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 920 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 919 921 920 - tic_api_line(tic, x0, y0, x1, y1, color); 922 + core->api.line(tic, x0, y0, x1, y1, color); 921 923 } 922 924 923 925 static void wren_circ(WrenVM* vm) ··· 927 929 s32 radius = getWrenNumber(vm, 3); 928 930 s32 color = getWrenNumber(vm, 4); 929 931 930 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 932 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 931 933 932 - tic_api_circ(tic, x, y, radius, color); 934 + core->api.circ(tic, x, y, radius, color); 933 935 } 934 936 935 937 static void wren_circb(WrenVM* vm) ··· 939 941 s32 radius = getWrenNumber(vm, 3); 940 942 s32 color = getWrenNumber(vm, 4); 941 943 942 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 944 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 943 945 944 - tic_api_circb(tic, x, y, radius, color); 946 + core->api.circb(tic, x, y, radius, color); 945 947 } 946 948 947 949 static void wren_elli(WrenVM* vm) ··· 952 954 s32 b = getWrenNumber(vm, 4); 953 955 s32 color = getWrenNumber(vm, 5); 954 956 955 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 957 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 956 958 957 - tic_api_elli(tic, x, y, a, b, color); 959 + core->api.elli(tic, x, y, a, b, color); 958 960 } 959 961 960 962 static void wren_ellib(WrenVM* vm) ··· 965 967 s32 b = getWrenNumber(vm, 4); 966 968 s32 color = getWrenNumber(vm, 5); 967 969 968 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 970 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 969 971 970 - tic_api_ellib(tic, x, y, a, b, color); 972 + core->api.ellib(tic, x, y, a, b, color); 971 973 } 972 974 973 975 static void wren_rect(WrenVM* vm) ··· 978 980 s32 h = getWrenNumber(vm, 4); 979 981 s32 color = getWrenNumber(vm, 5); 980 982 981 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 983 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 982 984 983 - tic_api_rect(tic, x, y, w, h, color); 985 + core->api.rect(tic, x, y, w, h, color); 984 986 } 985 987 986 988 static void wren_rectb(WrenVM* vm) ··· 991 993 s32 h = getWrenNumber(vm, 4); 992 994 s32 color = getWrenNumber(vm, 5); 993 995 994 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 996 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 995 997 996 - tic_api_rectb(tic, x, y, w, h, color); 998 + core->api.rectb(tic, x, y, w, h, color); 997 999 } 998 1000 999 1001 static void wren_tri(WrenVM* vm) ··· 1007 1009 1008 1010 s32 color = getWrenNumber(vm, 7); 1009 1011 1010 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1012 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1011 1013 1012 - tic_api_tri(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 1014 + core->api.tri(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 1013 1015 } 1014 1016 1015 1017 static void wren_trib(WrenVM* vm) ··· 1023 1025 1024 1026 s32 color = getWrenNumber(vm, 7); 1025 1027 1026 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1028 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1027 1029 1028 - tic_api_trib(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 1030 + core->api.trib(tic, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5], color); 1029 1031 } 1030 1032 1031 1033 static void wren_cls(WrenVM* vm) 1032 1034 { 1033 1035 s32 top = wrenGetSlotCount(vm); 1034 1036 1035 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1037 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1036 1038 1037 - tic_api_cls(tic, top == 1 ? 0 : getWrenNumber(vm, 1)); 1039 + core->api.cls(tic, top == 1 ? 0 : getWrenNumber(vm, 1)); 1038 1040 } 1039 1041 1040 1042 static void wren_clip(WrenVM* vm) 1041 1043 { 1042 1044 s32 top = wrenGetSlotCount(vm); 1043 1045 1044 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1046 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1045 1047 1046 1048 if(top == 1) 1047 1049 { 1048 - tic_api_clip(tic, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); 1050 + core->api.clip(tic, 0, 0, TIC80_WIDTH, TIC80_HEIGHT); 1049 1051 } 1050 1052 else 1051 1053 { ··· 1054 1056 s32 w = getWrenNumber(vm, 3); 1055 1057 s32 h = getWrenNumber(vm, 4); 1056 1058 1057 - tic_api_clip(tic, x, y, w, h); 1059 + core->api.clip(tic, x, y, w, h); 1058 1060 } 1059 1061 } 1060 1062 1061 1063 static void wren_peek(WrenVM* vm) 1062 1064 { 1063 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1065 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1064 1066 1065 1067 s32 address = getWrenNumber(vm, 1); 1066 1068 s32 bits = BITS_IN_BYTE; ··· 1068 1070 if(wrenGetSlotCount(vm) > 2) 1069 1071 bits = getWrenNumber(vm, 2); 1070 1072 1071 - wrenSetSlotDouble(vm, 0, tic_api_peek(tic, address, bits)); 1073 + wrenSetSlotDouble(vm, 0, core->api.peek(tic, address, bits)); 1072 1074 } 1073 1075 1074 1076 static void wren_poke(WrenVM* vm) 1075 1077 { 1076 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1078 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1077 1079 1078 1080 s32 address = getWrenNumber(vm, 1); 1079 1081 u8 value = getWrenNumber(vm, 2) & 0xff; ··· 1081 1083 if(wrenGetSlotCount(vm) > 3) 1082 1084 bits = getWrenNumber(vm, 3); 1083 1085 1084 - tic_api_poke(tic, address, value, bits); 1086 + core->api.poke(tic, address, value, bits); 1085 1087 } 1086 1088 1087 1089 static void wren_peek1(WrenVM* vm) 1088 1090 { 1089 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1091 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1090 1092 1091 1093 s32 address = getWrenNumber(vm, 1); 1092 1094 1093 - wrenSetSlotDouble(vm, 0, tic_api_peek1(tic, address)); 1095 + wrenSetSlotDouble(vm, 0, core->api.peek1(tic, address)); 1094 1096 } 1095 1097 1096 1098 static void wren_poke1(WrenVM* vm) 1097 1099 { 1098 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1100 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1099 1101 1100 1102 s32 address = getWrenNumber(vm, 1); 1101 1103 u8 value = getWrenNumber(vm, 2); 1102 1104 1103 - tic_api_poke1(tic, address, value); 1105 + core->api.poke1(tic, address, value); 1104 1106 } 1105 1107 1106 1108 static void wren_peek2(WrenVM* vm) 1107 1109 { 1108 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1110 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1109 1111 1110 1112 s32 address = getWrenNumber(vm, 1); 1111 1113 1112 - wrenSetSlotDouble(vm, 0, tic_api_peek2(tic, address)); 1114 + wrenSetSlotDouble(vm, 0, core->api.peek2(tic, address)); 1113 1115 } 1114 1116 1115 1117 static void wren_poke2(WrenVM* vm) 1116 1118 { 1117 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1119 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1118 1120 1119 1121 s32 address = getWrenNumber(vm, 1); 1120 1122 u8 value = getWrenNumber(vm, 2); 1121 1123 1122 - tic_api_poke2(tic, address, value); 1124 + core->api.poke2(tic, address, value); 1123 1125 } 1124 1126 1125 1127 static void wren_peek4(WrenVM* vm) 1126 1128 { 1127 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1129 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1128 1130 1129 1131 s32 address = getWrenNumber(vm, 1); 1130 1132 1131 - wrenSetSlotDouble(vm, 0, tic_api_peek4(tic, address)); 1133 + wrenSetSlotDouble(vm, 0, core->api.peek4(tic, address)); 1132 1134 } 1133 1135 1134 1136 static void wren_poke4(WrenVM* vm) 1135 1137 { 1136 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1138 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1137 1139 1138 1140 s32 address = getWrenNumber(vm, 1); 1139 1141 u8 value = getWrenNumber(vm, 2); 1140 1142 1141 - tic_api_poke4(tic, address, value); 1143 + core->api.poke4(tic, address, value); 1142 1144 } 1143 1145 1144 1146 static void wren_memcpy(WrenVM* vm) ··· 1147 1149 s32 src = getWrenNumber(vm, 2); 1148 1150 s32 size = getWrenNumber(vm, 3); 1149 1151 1150 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1151 - tic_api_memcpy(tic, dest, src, size); 1152 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1153 + 1154 + #undef memcpy 1155 + core->api.memcpy(tic, dest, src, size); 1152 1156 } 1153 1157 1154 1158 static void wren_memset(WrenVM* vm) ··· 1157 1161 u8 value = getWrenNumber(vm, 2); 1158 1162 s32 size = getWrenNumber(vm, 3); 1159 1163 1160 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1161 - tic_api_memset(tic, dest, value, size); 1164 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1165 + 1166 + #undef memset 1167 + core->api.memset(tic, dest, value, size); 1162 1168 } 1163 1169 1164 1170 static void wren_pmem(WrenVM* vm) 1165 1171 { 1166 1172 s32 top = wrenGetSlotCount(vm); 1167 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1173 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1168 1174 1169 1175 u32 index = getWrenNumber(vm, 1); 1170 1176 1171 1177 if(index < TIC_PERSISTENT_SIZE) 1172 1178 { 1173 - u32 val = tic_api_pmem(tic, index, 0, false); 1179 + u32 val = core->api.pmem(tic, index, 0, false); 1174 1180 1175 1181 if(top > 2) 1176 1182 { 1177 - tic_api_pmem(tic, index, getWrenNumber(vm, 2), true); 1183 + core->api.pmem(tic, index, getWrenNumber(vm, 2), true); 1178 1184 } 1179 1185 1180 1186 wrenSetSlotDouble(vm, 0, val); ··· 1186 1192 { 1187 1193 s32 top = wrenGetSlotCount(vm); 1188 1194 1189 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1195 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1190 1196 1191 1197 s32 index = getWrenNumber(vm, 1); 1192 1198 ··· 1221 1227 { 1222 1228 const char* noteStr = wrenGetSlotString(vm, 2); 1223 1229 1224 - if(!tic_tool_parse_note(noteStr, &note, &octave)) 1230 + if(!parse_note(noteStr, &note, &octave)) 1225 1231 { 1226 1232 wrenError(vm, "invalid note, should be like C#4\n"); 1227 1233 return; ··· 1260 1266 1261 1267 if (channel >= 0 && channel < TIC_SOUND_CHANNELS) 1262 1268 { 1263 - tic_api_sfx(tic, index, note, octave, duration, channel, volumes[0] & 0xf, volumes[1] & 0xf, speed); 1269 + core->api.sfx(tic, index, note, octave, duration, channel, volumes[0] & 0xf, volumes[1] & 0xf, speed); 1264 1270 } 1265 1271 else wrenError(vm, "unknown channel\n"); 1266 1272 } ··· 1271 1277 { 1272 1278 s32 top = wrenGetSlotCount(vm); 1273 1279 1274 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1280 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1275 1281 1276 1282 s32 track = -1; 1277 1283 s32 frame = -1; ··· 1322 1328 } 1323 1329 } 1324 1330 1325 - tic_api_music(tic, track, frame, row, loop, sustain, tempo, speed); 1331 + core->api.music(tic, track, frame, row, loop, sustain, tempo, speed); 1326 1332 } 1327 1333 1328 1334 static void wren_time(WrenVM* vm) 1329 1335 { 1330 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1336 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1331 1337 1332 - wrenSetSlotDouble(vm, 0, tic_api_time(tic)); 1338 + wrenSetSlotDouble(vm, 0, core->api.time(tic)); 1333 1339 } 1334 1340 1335 1341 static void wren_tstamp(WrenVM* vm) 1336 1342 { 1337 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1343 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1338 1344 1339 - wrenSetSlotDouble(vm, 0, tic_api_tstamp(tic)); 1345 + wrenSetSlotDouble(vm, 0, core->api.tstamp(tic)); 1340 1346 } 1341 1347 1342 1348 static void wren_vbank(WrenVM* vm) ··· 1347 1353 s32 prev = core->state.vbank.id; 1348 1354 1349 1355 if(wrenGetSlotCount(vm) == 2) 1350 - tic_api_vbank(tic, getWrenNumber(vm, 1)); 1356 + core->api.vbank(tic, getWrenNumber(vm, 1)); 1351 1357 1352 1358 wrenSetSlotDouble(vm, 0, prev); 1353 1359 } 1354 1360 1355 1361 static void wren_sync(WrenVM* vm) 1356 1362 { 1357 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1363 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1358 1364 1359 1365 bool toCart = false; 1360 1366 u32 mask = 0; ··· 1378 1384 } 1379 1385 1380 1386 if(bank >= 0 && bank < TIC_BANKS) 1381 - tic_api_sync(tic, mask, bank, toCart); 1387 + core->api.sync(tic, mask, bank, toCart); 1382 1388 else wrenError(vm, "sync() error, invalid bank"); 1383 1389 } 1384 1390 ··· 1391 1397 1392 1398 static void wren_exit(WrenVM* vm) 1393 1399 { 1394 - tic_api_exit((tic_mem*)getWrenCore(vm)); 1400 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1401 + core->api.exit(tic); 1395 1402 } 1396 1403 1397 1404 static void wren_fget(WrenVM* vm) 1398 1405 { 1399 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1406 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1400 1407 1401 1408 s32 top = wrenGetSlotCount(vm); 1402 1409 ··· 1407 1414 if(top > 2) 1408 1415 { 1409 1416 u32 flag = getWrenNumber(vm, 2); 1410 - wrenSetSlotBool(vm, 0, tic_api_fget(tic, index, flag)); 1417 + wrenSetSlotBool(vm, 0, core->api.fget(tic, index, flag)); 1411 1418 return; 1412 1419 } 1413 1420 } ··· 1417 1424 1418 1425 static void wren_fset(WrenVM* vm) 1419 1426 { 1420 - tic_mem* tic = (tic_mem*)getWrenCore(vm); 1427 + tic_core* core = getWrenCore(vm); tic_mem* tic = (tic_mem*)core; 1421 1428 s32 top = wrenGetSlotCount(vm); 1422 1429 1423 1430 if(top > 1) ··· 1431 1438 if(top > 3) 1432 1439 { 1433 1440 bool value = wrenGetSlotBool(vm, 3); 1434 - tic_api_fset(tic, index, flag, value); 1441 + core->api.fset(tic, index, flag, value); 1435 1442 return; 1436 1443 } 1437 1444 }
+11 -5
src/core/core.c
··· 38 38 #include <3ds.h> 39 39 #endif 40 40 41 + #include "blip_buf.h" 42 + 41 43 static_assert(TIC_BANK_BITS == 3, "tic_bank_bits"); 42 44 static_assert(sizeof(tic_map) < 1024 * 32, "tic_map"); 43 45 static_assert(sizeof(tic_rgb) == 3, "tic_rgb"); ··· 423 425 tic_close_current_vm(core); 424 426 // set current script config and init 425 427 core->currentScript = config; 426 - bool done = config->init( (tic_mem*) core , code); 428 + 429 + bool done = config->init((tic_mem*)core, code); 427 430 if(!done) 428 431 { 429 432 // if it couldn't init, make sure the VM is not left dirty by the implementation 430 433 core->currentVM = NULL; 431 434 } 432 - else 433 - { 434 - //printf("Initialized VM of %s, %d\n", core->currentScript->name, core->currentVM); 435 - } 435 + 436 436 return done; 437 437 } 438 438 ··· 763 763 764 764 blip_set_rates(core->blip.left, CLOCKRATE, samplerate); 765 765 blip_set_rates(core->blip.right, CLOCKRATE, samplerate); 766 + 767 + { 768 + #define API_FUNC_DEF(name, ...) core->api.name = tic_api_ ## name; 769 + TIC_API_LIST(API_FUNC_DEF) 770 + #undef API_FUNC_DEF 771 + } 766 772 767 773 tic_api_reset(&core->memory); 768 774
+10 -4
src/core/core.h
··· 24 24 25 25 #include "api.h" 26 26 #include "tools.h" 27 - #include "blip_buf.h" 28 27 29 28 #define CLOCKRATE (255<<13) 30 29 #define TIC_DEFAULT_COLOR 15 ··· 178 177 179 178 struct 180 179 { 181 - blip_buffer_t* left; 182 - blip_buffer_t* right; 180 + struct blip_t* left; 181 + struct blip_t* right; 183 182 } blip; 184 183 185 184 s32 samplerate; ··· 188 187 189 188 struct 190 189 { 191 - tic_core_state_data state; 190 + tic_core_state_data state; 192 191 tic_ram ram; 193 192 u8 input; 194 193 ··· 198 197 u64 paused; 199 198 } time; 200 199 } pause; 200 + 201 + struct 202 + { 203 + #define API_FUNC_DEF(name, _, __, ___, ____, _____, ret, ...) ret (*name)(__VA_ARGS__); 204 + TIC_API_LIST(API_FUNC_DEF) 205 + #undef API_FUNC_DEF 206 + } api; 201 207 202 208 } tic_core; 203 209
+1
src/core/sound.c
··· 27 27 #include <string.h> 28 28 #include <limits.h> 29 29 #include "tic_assert.h" 30 + #include "blip_buf.h" 30 31 31 32 #define ENVELOPE_FREQ_SCALE 2 32 33 #define SECONDS_PER_MINUTE 60
+4 -2
src/studio/screens/console.c
··· 237 237 238 238 // count the number of replacements needed 239 239 ins = orig; 240 - for (count = 0; tmp = strstr(ins, rep); ++count) { 240 + for (count = 0; (tmp = strstr(ins, rep)); ++count) { 241 241 ins = tmp + len_rep; 242 242 } 243 243 ··· 4419 4419 } 4420 4420 4421 4421 if (args.cart) 4422 + { 4422 4423 if (!cmdLoadCart(console, args.cart)) 4423 4424 { 4424 4425 printf("error: cart `%s` not loaded\n", args.cart); 4425 4426 exit(1); 4426 4427 } 4427 4428 else 4428 - getStartScreen(console->studio)->embed = true; 4429 + getStartScreen(console->studio)->embed = true; 4430 + } 4429 4431 4430 4432 console->active = !start->embed; 4431 4433 }
-22
src/tools.c
··· 63 63 track->data[frame * TRACK_PATTERNS_SIZE + b] = (patternData >> (b * BITS_IN_BYTE)) & 0xff; 64 64 } 65 65 66 - bool tic_tool_parse_note(const char* noteStr, s32* note, s32* octave) 67 - { 68 - if(noteStr && strlen(noteStr) == 3) 69 - { 70 - static const char* Notes[] = SFX_NOTES; 71 - 72 - for(s32 i = 0; i < COUNT_OF(Notes); i++) 73 - { 74 - if(memcmp(Notes[i], noteStr, 2) == 0) 75 - { 76 - *note = i; 77 - *octave = noteStr[2] - '1'; 78 - break; 79 - } 80 - } 81 - 82 - return true; 83 - } 84 - 85 - return false; 86 - } 87 - 88 66 u32 tic_nearest_color(const tic_rgb* palette, const tic_rgb* color, s32 count) 89 67 { 90 68 u32 min = -1;
-1
src/tools.h
··· 89 89 90 90 tic_blitpal tic_tool_palette_blit(const tic_palette* src, tic80_pixel_color_format fmt); 91 91 92 - bool tic_tool_parse_note(const char* noteStr, s32* note, s32* octave); 93 92 s32 tic_tool_get_pattern_id(const tic_track* track, s32 frame, s32 channel); 94 93 void tic_tool_set_pattern_id(tic_track* track, s32 frame, s32 channel, s32 id); 95 94 bool tic_project_ext(const char* name);
+10 -2
tic80.sublime-project
··· 3 3 [ 4 4 { 5 5 "name": "build", 6 - "shell_cmd": "cd ${project_path}/build && cmake -G Ninja -DCMAKE_BUILD_TYPE=MinSizeRel .. && ninja", 6 + "shell_cmd": "cd ${project_path}/build && cmake -G Ninja -DCMAKE_BUILD_TYPE=MinSizeRel ..", 7 7 "file_regex": "/([^/:]+):(\\d+):(\\d+): ", 8 8 "variants": [ 9 9 { 10 + "name": "fresh", 11 + "shell_cmd": "cd ${project_path}/build && cmake -G Ninja -DCMAKE_BUILD_TYPE=MinSizeRel .. --fresh" 12 + }, 13 + { 14 + "name": "make", 15 + "shell_cmd": "cd ${project_path}/build && ninja" 16 + }, 17 + { 10 18 "name": "run", 11 - "shell_cmd": "cd ${project_path}/build && ninja && ${project_path}/build/bin/tic80 --skip" 19 + "shell_cmd": "cd ${project_path}/build && ninja tic80 && ${project_path}/build/bin/tic80 --skip" 12 20 }, 13 21 { 14 22 "name": "clean",