Add Manual time setting from [ESP800],

Add time source selection setting (Internet/manual)
Add websocket IP to make it work with Apple Captive portal thanks @Nathan-ma
Add instant message error and abort command for files upload
Add Available FS space check before upload
Add [ESP290]<delay> command per @josedpedroso
Apply Astyle
Update version
This commit is contained in:
Luc 2019-08-27 11:35:36 +02:00
parent 7c13940d16
commit e93495c6c8
39 changed files with 1545 additions and 1259 deletions

View File

@ -50,8 +50,8 @@ Note:
* Get/Set Telnet port * Get/Set Telnet port
[ESP131]<port>pwd=<admin password> [ESP131]<port>pwd=<admin password>
* Init / Get current time * Sync / Set / Get current time
[ESP140]<INIT> <srv1=XXXXX> <srv2=XXXXX> <srv3=XXXXX> <zone=xxx> <dst=YES/NO> <time=YYYY-MM-DD#H24:MM:SS> pwd=<admin password> [ESP140]<SYNC> <srv1=XXXXX> <srv2=XXXXX> <srv3=XXXXX> <zone=xxx> <dst=YES/NO> <time=YYYY-MM-DD#H24:MM:SS> pwd=<admin password>
* Get/Set boot delay * Get/Set boot delay
[ESP150]<time in milliseconds>[pwd=<admin password>] [ESP150]<time in milliseconds>[pwd=<admin password>]
@ -83,6 +83,9 @@ Flash pins (6~11) cannot be used
No parameter just play beep No parameter just play beep
[ESP250]F=<frequency> D=<duration> [pwd=<user password>] [ESP250]F=<frequency> D=<duration> [pwd=<user password>]
* Delay command
[ESP290]<delay in ms>[pwd=<user password>]
* Get full EEPROM settings content * Get full EEPROM settings content
but do not give any passwords but do not give any passwords
[ESP400] pwd=<admin password> [ESP400] pwd=<admin password>
@ -103,7 +106,7 @@ ESP_NOTIFICATION_TYPE 116 //1 byte = flag
ESP_CALIBRATION 117 //1 byte = flag ESP_CALIBRATION 117 //1 byte = flag
ESP_AP_CHANNEL 118 //1 byte = flag ESP_AP_CHANNEL 118 //1 byte = flag
ESP_BUZZER 119 //1 byte = flag ESP_BUZZER 119 //1 byte = flag
FREE 120 //1 byte = flag ESP_INTERNET_TIME 120 //1 byte = flag
ESP_HTTP_PORT 121 //4 bytes = int ESP_HTTP_PORT 121 //4 bytes = int
ESP_TELNET_PORT 125 //4 bytes = int ESP_TELNET_PORT 125 //4 bytes = int
ESP_OUTPUT_FLAG 129 //1 bytes = flag ESP_OUTPUT_FLAG 129 //1 bytes = flag

View File

@ -1,4 +1,7 @@
cd %~dp0 cd %~dp0
cmd.exe /c npm install
cmd.exe /c npm audit fix
cmd.exe /c npm audit
cmd.exe /c gulp package cmd.exe /c gulp package
cmd.exe /c bin2c -o embedded.h -m tool.html.gz cmd.exe /c bin2c -o embedded.h -m tool.html.gz
cat header.txt > out.h cat header.txt > out.h

View File

@ -25,383 +25,398 @@
/* Generated by bin2c, do not edit manually */ /* Generated by bin2c, do not edit manually */
/* Contents of file tool.html.gz */ /* Contents of file tool.html.gz */
#define tool_html_gz_size 6005 #define tool_html_gz_size 6244
const unsigned char tool_html_gz[6005] PROGMEM = { const unsigned char tool_html_gz[6244] PROGMEM = {
0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xED, 0x3C, 0x69, 0x77, 0xDB, 0xB6, 0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xED, 0x3C, 0x89, 0x72, 0xDB, 0xC6,
0x96, 0x7F, 0x85, 0x41, 0x4F, 0x2D, 0x71, 0x4C, 0x4A, 0xDC, 0xB4, 0x5B, 0xCA, 0x4B, 0x9B, 0xA4, 0x92, 0xBF, 0x02, 0x4F, 0x2A, 0x26, 0xB1, 0x04, 0x48, 0x1C, 0xBC, 0x29, 0x52, 0xCF, 0x89, 0xED,
0xF5, 0x9C, 0xA4, 0xC9, 0x89, 0x9D, 0x97, 0x99, 0x93, 0xE4, 0xE4, 0x50, 0x22, 0x24, 0x71, 0x42, 0x44, 0x5B, 0xBE, 0x4A, 0x92, 0x9F, 0xF7, 0x95, 0xED, 0x52, 0x81, 0xC4, 0x90, 0xC4, 0x1A, 0x04,
0x91, 0x32, 0x09, 0x59, 0x76, 0x1C, 0xCF, 0x6F, 0x9F, 0x7B, 0x01, 0x90, 0x04, 0xB5, 0x79, 0x69, 0x28, 0x60, 0x68, 0x4A, 0x96, 0xB5, 0xDF, 0xBE, 0xDD, 0x33, 0x03, 0x60, 0xC0, 0x4B, 0x47, 0xFC,
0xDE, 0xBC, 0x7E, 0x68, 0x15, 0x89, 0x24, 0x96, 0x8B, 0xBB, 0x2F, 0x00, 0xDD, 0x93, 0x39, 0x5B, 0x36, 0xD9, 0xAA, 0x44, 0x16, 0x01, 0xCE, 0xD1, 0xD3, 0xD3, 0x77, 0xF7, 0x8C, 0x72, 0x34, 0x67,
0x44, 0xA3, 0x93, 0x39, 0xF5, 0x83, 0xD1, 0x49, 0xC6, 0xAE, 0x23, 0x3A, 0xC2, 0x96, 0x9B, 0x69, 0x8B, 0x70, 0x74, 0x34, 0xA7, 0x9E, 0x3F, 0x3A, 0x4A, 0xD9, 0x75, 0x48, 0x47, 0xD8, 0x72, 0x33,
0x12, 0x33, 0x73, 0xEA, 0x2F, 0xC2, 0xE8, 0xBA, 0x9F, 0xF9, 0x71, 0x66, 0x66, 0x34, 0x0D, 0xA7, 0x8D, 0x23, 0x66, 0x4E, 0xBD, 0x45, 0x10, 0x5E, 0xF7, 0x53, 0x2F, 0x4A, 0xCD, 0x94, 0x26, 0xC1,
0x03, 0x73, 0x91, 0x99, 0x8C, 0x5E, 0x31, 0x33, 0x0B, 0xBF, 0x51, 0xD3, 0x0F, 0xFE, 0x67, 0x95, 0x74, 0x60, 0x2E, 0x52, 0x93, 0xD1, 0x2B, 0x66, 0xA6, 0xC1, 0x37, 0x6A, 0x7A, 0xFE, 0x7F, 0xAF,
0xB1, 0xBE, 0x6D, 0x59, 0x3F, 0x0F, 0xCC, 0x35, 0x1D, 0x7F, 0x0D, 0xD9, 0x9E, 0x5E, 0x0E, 0x0E, 0x52, 0xD6, 0xB7, 0x2D, 0xEB, 0xE7, 0x81, 0xB9, 0xA6, 0xE3, 0x2F, 0x01, 0xDB, 0xD3, 0xCB, 0xC1,
0x5B, 0xE1, 0x71, 0x79, 0x75, 0x3B, 0x4E, 0x82, 0xEB, 0xCA, 0x12, 0xE4, 0x77, 0x1A, 0x5D, 0x52, 0x61, 0x2B, 0x7C, 0x5D, 0x5E, 0xDD, 0x8E, 0x63, 0xFF, 0xBA, 0xB4, 0x04, 0xF9, 0x9D, 0x86, 0x5F,
0x16, 0x4E, 0x7C, 0xED, 0x0F, 0xBA, 0xA2, 0xC4, 0x28, 0x9E, 0x8D, 0x67, 0x69, 0xE8, 0x47, 0x86, 0x29, 0x0B, 0x26, 0x9E, 0xF6, 0x86, 0xAE, 0x28, 0x31, 0xF2, 0xEF, 0xC6, 0xB3, 0x24, 0xF0, 0x42,
0x82, 0x83, 0x02, 0xCB, 0x5B, 0x5E, 0x0D, 0xA2, 0x30, 0xA6, 0xE6, 0x9C, 0x86, 0xB3, 0x39, 0xAC, 0x43, 0xC1, 0x41, 0x81, 0xD5, 0x5C, 0x5E, 0x0D, 0xC2, 0x20, 0xA2, 0xE6, 0x9C, 0x06, 0xB3, 0x39,
0xD5, 0xF0, 0x9C, 0x6E, 0xAB, 0x63, 0x7B, 0xEE, 0x60, 0x92, 0x44, 0x49, 0xDA, 0xFF, 0xC9, 0x75, 0xAC, 0x55, 0x6F, 0x3A, 0xDD, 0x56, 0xC7, 0x6E, 0xBA, 0x83, 0x49, 0x1C, 0xC6, 0x49, 0xFF, 0x27,
0xDD, 0xC1, 0xD8, 0x9F, 0x7C, 0x9D, 0xA5, 0xC9, 0x2A, 0x0E, 0x4C, 0xD9, 0x3A, 0x9D, 0x4E, 0x6F, 0xD7, 0x75, 0x07, 0x63, 0x6F, 0xF2, 0x65, 0x96, 0xC4, 0xAB, 0xC8, 0x37, 0x65, 0xEB, 0x74, 0x3A,
0x99, 0x3F, 0x8E, 0xE8, 0xCD, 0x38, 0x49, 0x03, 0x9A, 0xF6, 0xAD, 0x81, 0xB8, 0x31, 0xB3, 0xA5, 0xBD, 0x65, 0xDE, 0x38, 0xA4, 0x37, 0xE3, 0x38, 0xF1, 0x69, 0xD2, 0xB7, 0x06, 0xE2, 0xC5, 0x4C,
0x3F, 0x09, 0xE3, 0x19, 0x34, 0x2C, 0xFC, 0x2B, 0x73, 0x1D, 0x06, 0x6C, 0xCE, 0x29, 0xB8, 0x65, 0x97, 0xDE, 0x24, 0x88, 0x66, 0xD0, 0xB0, 0xF0, 0xAE, 0xCC, 0x75, 0xE0, 0xB3, 0x39, 0xDF, 0xC1,
0xC1, 0xCD, 0x7A, 0x1E, 0x32, 0xCA, 0x47, 0xD0, 0x7E, 0x9C, 0xAC, 0x53, 0x7F, 0x39, 0x58, 0xFA, 0x2D, 0xF3, 0x6F, 0xD6, 0xF3, 0x80, 0x51, 0x3E, 0x82, 0xF6, 0xA3, 0x78, 0x9D, 0x78, 0xCB, 0xC1,
0x41, 0x80, 0xC3, 0x9D, 0xC5, 0xE2, 0x96, 0xCD, 0x6F, 0x38, 0xF1, 0x7E, 0x14, 0xCE, 0xE2, 0x7E, 0xD2, 0xF3, 0x7D, 0x1C, 0xEE, 0x2C, 0x16, 0xB7, 0x6C, 0x7E, 0xC3, 0x37, 0xEF, 0x85, 0xC1, 0x2C,
0x44, 0xA7, 0xEC, 0xB6, 0xC1, 0x17, 0x19, 0x31, 0xA4, 0x77, 0xC4, 0xD2, 0x11, 0x0B, 0x8C, 0xAD, 0xEA, 0x87, 0x74, 0xCA, 0x6E, 0xEB, 0x7C, 0x91, 0x11, 0xC3, 0xFD, 0x8E, 0x58, 0x32, 0x62, 0xBE,
0xA6, 0x79, 0xD1, 0xC4, 0x85, 0x50, 0x1D, 0x55, 0x34, 0xCD, 0x6F, 0xF2, 0xA5, 0xBA, 0xFB, 0x69, 0xB1, 0xD5, 0x34, 0xCF, 0x9B, 0x38, 0x13, 0xCA, 0xA3, 0xF2, 0xA6, 0xF9, 0x4D, 0xB6, 0x54, 0x77,
0xBE, 0xA4, 0x29, 0xB2, 0x2C, 0x92, 0x28, 0xB0, 0x64, 0x99, 0x93, 0x05, 0xB7, 0x7D, 0x7B, 0x79, 0xFF, 0x9E, 0xBF, 0xD2, 0x04, 0x49, 0x16, 0x4A, 0x14, 0x58, 0xBC, 0xCC, 0xB6, 0x05, 0xAF, 0x7D,
0xA5, 0x65, 0x49, 0x14, 0x06, 0xDA, 0x4F, 0x41, 0x10, 0x48, 0xDC, 0xCC, 0x8C, 0xA5, 0xE1, 0x92, 0x7B, 0x79, 0xA5, 0xA5, 0x71, 0x18, 0xF8, 0xDA, 0x4F, 0xBE, 0xEF, 0x4B, 0xDC, 0xCC, 0x94, 0x25,
0x06, 0x05, 0x42, 0xFD, 0x98, 0xCD, 0xCD, 0x64, 0x6A, 0xB2, 0xEB, 0x25, 0xAD, 0x27, 0x41, 0xA0, 0xC1, 0x92, 0xFA, 0x39, 0x42, 0xFD, 0x88, 0xCD, 0xCD, 0x78, 0x6A, 0xB2, 0xEB, 0x25, 0xAD, 0xC6,
0xDF, 0xEC, 0x60, 0x5F, 0x0F, 0x3F, 0xB7, 0xFE, 0xCD, 0x32, 0xC9, 0x42, 0x16, 0x26, 0x71, 0x3F, 0xBE, 0xAF, 0xDF, 0xEC, 0x20, 0x5F, 0x0F, 0x7F, 0x6E, 0xBD, 0x9B, 0x65, 0x9C, 0x06, 0x2C, 0x88,
0xA5, 0x91, 0xCF, 0xC2, 0x4B, 0x3A, 0x08, 0xC2, 0x6C, 0x19, 0xF9, 0xD7, 0xFD, 0x71, 0x94, 0x4C, 0xA3, 0x7E, 0x42, 0x43, 0x8F, 0x05, 0x5F, 0xE9, 0xC0, 0x0F, 0xD2, 0x65, 0xE8, 0x5D, 0xF7, 0xC7,
0xBE, 0x16, 0xEC, 0x41, 0xA1, 0x6B, 0x76, 0x0B, 0x30, 0xE7, 0x1C, 0x0A, 0xE8, 0x24, 0x49, 0x7D, 0x61, 0x3C, 0xF9, 0x92, 0x93, 0x07, 0x99, 0xAE, 0xD9, 0x2D, 0xC0, 0x9C, 0x53, 0xC8, 0xA7, 0x93,
0x3E, 0x31, 0x4E, 0x62, 0x9A, 0xCB, 0x6A, 0x32, 0x99, 0xDC, 0x36, 0xFC, 0x09, 0xC2, 0xB9, 0x29, 0x38, 0xF1, 0xF8, 0xC4, 0x28, 0x8E, 0x68, 0xC6, 0xAB, 0xC9, 0x64, 0x72, 0x5B, 0xF7, 0x26, 0x08,
0x05, 0xB5, 0x43, 0x7C, 0x96, 0x65, 0xE5, 0x03, 0x35, 0xDF, 0xF0, 0xFB, 0xD3, 0x64, 0xB2, 0xCA, 0xE7, 0xA6, 0x60, 0xD4, 0x0E, 0xF6, 0x59, 0x96, 0x95, 0x0D, 0xD4, 0x3C, 0xC3, 0xEB, 0x4F, 0xE3,
0xE0, 0x3A, 0x4F, 0x80, 0x03, 0xCA, 0xD4, 0xDB, 0xC6, 0xD2, 0x8F, 0x69, 0x74, 0xB3, 0xF0, 0xD3, 0xC9, 0x2A, 0x85, 0xE7, 0x3C, 0x06, 0x0A, 0x28, 0x53, 0x6F, 0xEB, 0x4B, 0x2F, 0xA2, 0xE1, 0xCD,
0x59, 0x18, 0x9B, 0xE3, 0x84, 0xB1, 0x64, 0xD1, 0x77, 0x00, 0x99, 0xDD, 0x3A, 0x21, 0xB9, 0xB5, 0xC2, 0x4B, 0x66, 0x41, 0x64, 0x8E, 0x63, 0xC6, 0xE2, 0x45, 0xDF, 0x01, 0x64, 0x76, 0xCB, 0x84,
0xC1, 0xA9, 0x9C, 0x87, 0xA9, 0x1F, 0x84, 0xAB, 0xAC, 0x8F, 0x3A, 0x97, 0x2B, 0xFB, 0x38, 0xB9, 0xA4, 0xD6, 0x06, 0xA5, 0x32, 0x1A, 0x26, 0x9E, 0x1F, 0xAC, 0xD2, 0x3E, 0xCA, 0x5C, 0x26, 0xEC,
0x32, 0xB3, 0xB9, 0x1F, 0x24, 0xEB, 0xBE, 0xA5, 0xE1, 0x2C, 0xFC, 0xA6, 0xB3, 0xB1, 0x5F, 0xB7, 0xE3, 0xF8, 0xCA, 0x4C, 0xE7, 0x9E, 0x1F, 0xAF, 0xFB, 0x96, 0x86, 0xB3, 0xF0, 0x37, 0x99, 0x8D,
0x0C, 0xFC, 0x34, 0xAC, 0x96, 0x3E, 0xB8, 0xCF, 0x20, 0x89, 0xA9, 0xC9, 0x0D, 0xA3, 0xE0, 0x1A, 0xBD, 0xAA, 0x65, 0xE0, 0x4F, 0xDD, 0x6A, 0xE9, 0x83, 0xFB, 0x0C, 0x92, 0x98, 0x9A, 0x5C, 0x31,
0x30, 0x2C, 0xEF, 0x40, 0x45, 0x80, 0xB6, 0x9B, 0x6D, 0x8E, 0x1E, 0x56, 0xF4, 0x16, 0x7E, 0x72, 0x72, 0xAA, 0x01, 0xC1, 0xB2, 0x0E, 0x14, 0x04, 0x68, 0xBB, 0xD9, 0xA6, 0xE8, 0x61, 0x41, 0x6F,
0x0A, 0x64, 0xA3, 0x42, 0x13, 0xE8, 0x85, 0x99, 0xA2, 0x1A, 0xE5, 0xD4, 0xB9, 0xC8, 0x9B, 0xB2, 0xE1, 0x4F, 0xB6, 0x03, 0xD9, 0xA8, 0xEC, 0x09, 0xE4, 0xC2, 0x4C, 0x50, 0x8C, 0xB2, 0xDD, 0xB9,
0x0F, 0xB5, 0x78, 0x47, 0x97, 0xE4, 0xE4, 0xA6, 0x46, 0x4D, 0x93, 0x74, 0x01, 0x8B, 0xC4, 0x2C, 0x48, 0x9B, 0xA2, 0x0F, 0xA5, 0x78, 0x47, 0x97, 0xA4, 0xE4, 0xA6, 0x44, 0x4D, 0xE3, 0x64, 0x01,
0x4D, 0xA2, 0x9B, 0xAA, 0x26, 0x08, 0x4B, 0xF2, 0x57, 0x2C, 0x19, 0x48, 0xBD, 0x75, 0x91, 0x91, 0x8B, 0x44, 0x2C, 0x89, 0xC3, 0x9B, 0xB2, 0x24, 0x08, 0x4D, 0xF2, 0x56, 0x2C, 0x1E, 0x48, 0xB9,
0x39, 0x39, 0x6D, 0xA4, 0xC6, 0x81, 0x86, 0x07, 0x19, 0x77, 0xAB, 0xD5, 0xDA, 0x27, 0xC8, 0xB2, 0x75, 0x91, 0x90, 0xD9, 0x76, 0xDA, 0xB8, 0x1B, 0x07, 0x1A, 0x1E, 0xA4, 0xDC, 0xAD, 0x56, 0x6B,
0x35, 0x5C, 0xF8, 0x33, 0x2A, 0xF4, 0x6C, 0x5B, 0xBC, 0xA0, 0x72, 0xF7, 0x13, 0x6F, 0x18, 0x67, 0x1F, 0x23, 0x8B, 0xD6, 0x60, 0xE1, 0xCD, 0xA8, 0x90, 0xB3, 0x6D, 0xF6, 0x82, 0xC8, 0xDD, 0x8F,
0x94, 0x69, 0x7B, 0xE4, 0xD7, 0xA9, 0x4A, 0xF9, 0xCE, 0xB1, 0x66, 0x62, 0xB2, 0x14, 0x1C, 0x9A, 0xBD, 0x41, 0x94, 0x52, 0xA6, 0xED, 0xE1, 0x5F, 0xA7, 0xCC, 0xE5, 0x3B, 0xC7, 0x9A, 0xB1, 0xC9,
0xB0, 0x1D, 0x55, 0x38, 0x1A, 0xF5, 0x33, 0x6A, 0x82, 0xAE, 0x26, 0x2B, 0xA6, 0x35, 0xEC, 0x56, 0x12, 0x30, 0x68, 0x42, 0x77, 0x54, 0xE6, 0x68, 0xD4, 0x4B, 0xA9, 0x09, 0xB2, 0x1A, 0xAF, 0x98,
0x66, 0x94, 0x70, 0xB7, 0xFA, 0xAA, 0x0C, 0x17, 0x56, 0x70, 0x53, 0x15, 0x75, 0xBB, 0xED, 0x4F, 0x56, 0xB7, 0x5B, 0xA9, 0x51, 0xC0, 0xDD, 0xEA, 0x2B, 0x13, 0x5C, 0x68, 0xC1, 0x4D, 0x99, 0xD5,
0x69, 0x6F, 0x00, 0x33, 0x90, 0x93, 0xE0, 0xD5, 0x1E, 0x41, 0x9A, 0x61, 0x41, 0x67, 0x37, 0xEF, 0xED, 0xB6, 0x37, 0xA5, 0xBD, 0x01, 0xCC, 0x40, 0x4A, 0x82, 0x55, 0x7B, 0xC4, 0xD6, 0x0C, 0x0B,
0xB0, 0x2D, 0xC7, 0xB0, 0x3B, 0x2D, 0xC3, 0x71, 0x5D, 0xA3, 0xD1, 0xD6, 0x25, 0x0E, 0xC8, 0xEB, 0x3A, 0xBB, 0x59, 0x87, 0x6D, 0x39, 0x86, 0xDD, 0x69, 0x19, 0x8E, 0xEB, 0x1A, 0xF5, 0xB6, 0x2E,
0xE5, 0x86, 0x9D, 0x09, 0xF5, 0x1D, 0xB3, 0xB8, 0x50, 0x85, 0x30, 0xE6, 0xF2, 0x14, 0x1A, 0x51, 0x71, 0x40, 0x5A, 0x2F, 0x37, 0xF4, 0x4C, 0x88, 0xEF, 0x98, 0x45, 0xB9, 0x28, 0x04, 0x11, 0xE7,
0x1D, 0x6C, 0x09, 0xC9, 0xAF, 0x85, 0xA8, 0x3D, 0xCB, 0x1A, 0x28, 0xBE, 0x74, 0x42, 0x63, 0x46, 0xA7, 0x90, 0x88, 0xF2, 0x60, 0x4B, 0x70, 0x7E, 0x2D, 0x58, 0xDD, 0xB4, 0xAC, 0x81, 0x62, 0x4B,
0xD3, 0x4D, 0xF7, 0xB6, 0x08, 0x83, 0x20, 0xA2, 0x22, 0x24, 0x25, 0xAB, 0xC9, 0xDC, 0x44, 0x8F, 0x27, 0x34, 0x62, 0x34, 0xD9, 0x34, 0x6F, 0x8B, 0xC0, 0xF7, 0x43, 0x2A, 0x5C, 0x52, 0xBC, 0x9A,
0x00, 0xFC, 0x5C, 0xF8, 0x71, 0xB8, 0x5C, 0x45, 0xDC, 0xBF, 0x0C, 0xF6, 0xF7, 0x4C, 0x56, 0x69, 0xCC, 0x4D, 0xB4, 0x08, 0x40, 0xCF, 0x85, 0x17, 0x05, 0xCB, 0x55, 0xC8, 0xED, 0xCB, 0x60, 0x7F,
0x06, 0x2C, 0x5A, 0x26, 0x21, 0x07, 0x7E, 0x4F, 0x8D, 0xE1, 0x72, 0x5B, 0xFA, 0x29, 0x60, 0x34, 0xCF, 0x64, 0x95, 0xA4, 0x40, 0xA2, 0x65, 0x1C, 0x70, 0xE0, 0xF7, 0x94, 0x18, 0xCE, 0xB7, 0xA5,
0x38, 0x10, 0x0F, 0x1E, 0xA8, 0xCF, 0x3B, 0x54, 0x70, 0x91, 0x7C, 0x33, 0x57, 0x19, 0x46, 0x24, 0x97, 0x00, 0x46, 0x83, 0x03, 0xFE, 0xE0, 0x81, 0xF2, 0xBC, 0x43, 0x04, 0x17, 0xF1, 0x37, 0x73,
0x1A, 0xD1, 0x09, 0x13, 0xE8, 0x20, 0xAD, 0x5B, 0x8D, 0x9B, 0x0D, 0x9C, 0xE7, 0xE6, 0x32, 0x05, 0x95, 0xA2, 0x47, 0xA2, 0x21, 0x9D, 0x30, 0x81, 0x0E, 0xEE, 0x75, 0xAB, 0x71, 0xB3, 0x81, 0xD3,
0x32, 0xD2, 0xEB, 0xC3, 0x8E, 0xD4, 0x75, 0x3B, 0xFE, 0xB8, 0xB3, 0xE1, 0x1E, 0x1C, 0xDA, 0x0E, 0xDC, 0x5C, 0x26, 0xB0, 0x8D, 0xE4, 0xFA, 0xB0, 0x21, 0x75, 0xDD, 0x8E, 0x37, 0xEE, 0x6C, 0x98,
0x7C, 0xAF, 0x02, 0x45, 0x3A, 0x5B, 0xA3, 0xD2, 0x26, 0xBC, 0x6E, 0xA5, 0x89, 0x3B, 0xE0, 0x4A, 0x07, 0x87, 0xB6, 0x7D, 0xAF, 0x59, 0x82, 0x22, 0x8D, 0xAD, 0x51, 0x6A, 0x13, 0x56, 0xB7, 0xD4,
0x53, 0x7F, 0xC7, 0xCC, 0xFE, 0xF6, 0xCC, 0x2D, 0xD7, 0xBD, 0x03, 0x59, 0xA7, 0xDB, 0xB6, 0x7A, 0xC4, 0x0D, 0x70, 0xA9, 0xA9, 0xBF, 0x63, 0x66, 0x7F, 0x7B, 0xE6, 0x96, 0xE9, 0xDE, 0x81, 0xAC,
0xD6, 0x06, 0xB2, 0xB6, 0xE3, 0x8C, 0x3D, 0x8B, 0x23, 0x1B, 0x2E, 0x66, 0x37, 0x52, 0xA8, 0x73, 0xD3, 0x6D, 0x5B, 0x3D, 0x6B, 0x03, 0x59, 0xDB, 0x71, 0xC6, 0x4D, 0x8B, 0x23, 0x1B, 0x2C, 0x66,
0x3F, 0xDE, 0x74, 0xDB, 0xED, 0xC2, 0x7B, 0xA9, 0xF6, 0xCF, 0x83, 0x84, 0x98, 0x2B, 0x51, 0xD8, 0x37, 0x92, 0xA9, 0x73, 0x2F, 0xDA, 0x34, 0xDB, 0xED, 0xDC, 0x7A, 0xA9, 0xFA, 0xCF, 0x9D, 0x84,
0xE1, 0x4F, 0x2C, 0xFC, 0x6C, 0xAC, 0xDB, 0x9E, 0xE0, 0xE7, 0xD1, 0xE6, 0x84, 0xFA, 0x31, 0x4B, 0x98, 0x2B, 0x51, 0xD8, 0x61, 0x4F, 0x2C, 0xFC, 0xD9, 0x58, 0xB7, 0x3D, 0xC1, 0x9F, 0x47, 0xAB,
0xE9, 0xF5, 0x43, 0xDC, 0x46, 0x65, 0x22, 0xC7, 0x9A, 0xA3, 0x79, 0x98, 0x6C, 0xD7, 0x92, 0x46, 0x13, 0xCA, 0xC7, 0x2C, 0xA1, 0xD7, 0x0F, 0x31, 0x1B, 0xA5, 0x89, 0x1C, 0x6B, 0x8E, 0xE6, 0xE1,
0x98, 0x8F, 0xBD, 0x8B, 0xCC, 0x7F, 0x27, 0x45, 0x11, 0x20, 0x05, 0x16, 0xF2, 0xD5, 0x28, 0x6F, 0x6D, 0xBB, 0x96, 0x54, 0xC2, 0x6C, 0xEC, 0x5D, 0xDB, 0xFC, 0x33, 0x77, 0x14, 0x02, 0x52, 0xA0,
0xFB, 0xD5, 0x7C, 0x80, 0x47, 0xFE, 0xB2, 0xB3, 0xA2, 0x35, 0xD8, 0x17, 0xC6, 0xCB, 0x15, 0xFB, 0x21, 0x5F, 0x8C, 0xE2, 0xB5, 0x5F, 0x8E, 0x07, 0xB8, 0xE7, 0x2F, 0x3A, 0x4B, 0x52, 0x83, 0x7D,
0x88, 0xB9, 0xCB, 0x70, 0x1A, 0x46, 0xF4, 0x73, 0xBF, 0x9F, 0xD3, 0x83, 0x8F, 0xE6, 0x6A, 0x19, 0x41, 0xB4, 0x5C, 0xB1, 0x8F, 0x18, 0xBB, 0x0C, 0xA7, 0x41, 0x48, 0x3F, 0xF7, 0xFB, 0xD9, 0x7E,
0x25, 0x7E, 0x60, 0x8E, 0x57, 0xE0, 0x73, 0xFE, 0x76, 0x4B, 0xFF, 0xBF, 0x6E, 0x69, 0x70, 0xD0, 0xF0, 0xAB, 0xB9, 0x5A, 0x86, 0xB1, 0xE7, 0x9B, 0xE3, 0x15, 0xD8, 0x9C, 0xBF, 0xCD, 0xD2, 0xFF,
0xB8, 0x5B, 0xE3, 0x89, 0x15, 0xD0, 0x0D, 0x23, 0xF3, 0xDA, 0xE3, 0x6E, 0xE0, 0x3F, 0x48, 0xA8, 0xAD, 0x59, 0x1A, 0x1C, 0x54, 0xEE, 0xD6, 0x78, 0x62, 0xF9, 0x74, 0x43, 0xC9, 0x9A, 0xED, 0x71,
0x32, 0x0A, 0xFE, 0x2D, 0xDA, 0xBF, 0x8E, 0x68, 0x5D, 0x7B, 0x6C, 0x05, 0x9B, 0x39, 0xA8, 0x3D, 0xD7, 0xF7, 0x1E, 0xC4, 0x54, 0xE9, 0x05, 0xFF, 0x66, 0xED, 0x5F, 0x87, 0xB5, 0xAE, 0x3D, 0xB6,
0x6E, 0x07, 0xDD, 0xD6, 0xC3, 0x44, 0x2B, 0xAC, 0xFD, 0x6F, 0xD1, 0xFE, 0xC5, 0x45, 0xEB, 0xB4, 0xFC, 0xCD, 0x18, 0xD4, 0x1E, 0xB7, 0xFD, 0x6E, 0xEB, 0x61, 0xAC, 0x15, 0xDA, 0xFE, 0x37, 0x6B,
0x7B, 0xFE, 0x78, 0x92, 0x17, 0x2E, 0xD3, 0x24, 0x01, 0x8E, 0x1C, 0xA8, 0x5B, 0xEC, 0x8E, 0xD5, 0xFF, 0xE2, 0xAC, 0x75, 0xDA, 0x3D, 0x6F, 0x3C, 0xC9, 0x12, 0x97, 0x69, 0x1C, 0x03, 0x45, 0x0E,
0xDD, 0x05, 0xFB, 0x1E, 0xA5, 0xCB, 0x56, 0x01, 0xF2, 0x6F, 0x58, 0x72, 0x91, 0x04, 0x7E, 0x59, 0xE4, 0x2D, 0x76, 0xC7, 0xEA, 0xEE, 0x82, 0x7D, 0x8F, 0xD4, 0x65, 0x2B, 0x01, 0xF9, 0x13, 0x96,
0xEC, 0x70, 0x96, 0x15, 0x55, 0xF1, 0x34, 0xBC, 0xA2, 0xC1, 0xE0, 0x1B, 0xE4, 0xEC, 0x01, 0xBD, 0x5C, 0xC4, 0xBE, 0x57, 0x24, 0x3B, 0x9C, 0x64, 0x79, 0x56, 0x3C, 0x0D, 0xAE, 0xA8, 0x3F, 0xF8,
0xC2, 0x6D, 0x04, 0xD0, 0x44, 0x89, 0x95, 0x80, 0x65, 0x61, 0x29, 0x8A, 0x35, 0x16, 0xA8, 0x2C, 0x06, 0x31, 0xBB, 0x4F, 0xAF, 0xB0, 0x8C, 0x00, 0x92, 0x28, 0xB1, 0x12, 0xB0, 0x2C, 0x4C, 0x45,
0x36, 0x58, 0x83, 0x72, 0xC7, 0x21, 0xAF, 0x93, 0xF8, 0x3D, 0x6A, 0xFE, 0x34, 0x82, 0x90, 0xCA, 0x31, 0xC7, 0x02, 0x91, 0xC5, 0x06, 0x6B, 0x50, 0x54, 0x1C, 0xB2, 0x3C, 0x89, 0xBF, 0xA3, 0xE4,
0x2B, 0xA8, 0x9D, 0x15, 0xF1, 0x76, 0xAB, 0x1A, 0x6E, 0x3D, 0x5D, 0xA2, 0xCA, 0xCB, 0x05, 0x50, 0x4F, 0x43, 0x70, 0xA9, 0x3C, 0x83, 0xDA, 0x99, 0x11, 0x6F, 0xB7, 0xAA, 0xEE, 0xB6, 0xA9, 0x4B,
0xB8, 0x9B, 0x3D, 0x55, 0x9E, 0x6D, 0x55, 0x2B, 0xC0, 0x4A, 0x75, 0xA8, 0x76, 0x0A, 0x5B, 0xDB, 0x54, 0x79, 0xBA, 0x00, 0x02, 0x77, 0xB3, 0x27, 0xCB, 0xB3, 0xAD, 0x72, 0x06, 0x58, 0xCA, 0x0E,
0x3B, 0x57, 0x76, 0xEF, 0x9B, 0xDE, 0x77, 0x4A, 0x3E, 0x16, 0x59, 0xA8, 0x52, 0x27, 0x63, 0xBD, 0xD5, 0x4E, 0xA1, 0x6B, 0x7B, 0xE7, 0xCA, 0xEE, 0x7D, 0xD3, 0xFB, 0x4E, 0x41, 0xC7, 0x3C, 0x0A,
0x61, 0xA3, 0xE2, 0x5B, 0x95, 0xAC, 0xC1, 0xD1, 0x07, 0xDB, 0x7B, 0x0E, 0xC2, 0xF8, 0x05, 0x6B, 0x55, 0xF2, 0x64, 0xCC, 0x37, 0x6C, 0x14, 0x7C, 0xAB, 0x14, 0x35, 0x38, 0xFA, 0x60, 0xBB, 0xE6,
0x72, 0xA1, 0xEF, 0x60, 0xC7, 0x4F, 0x53, 0x8A, 0x9F, 0x9C, 0x0F, 0x58, 0x51, 0x2B, 0x5A, 0xE2, 0x20, 0x94, 0x5F, 0x90, 0x26, 0x63, 0xFA, 0x0E, 0x72, 0xFC, 0x34, 0xA5, 0xF8, 0x93, 0xD1, 0x01,
0xC8, 0x05, 0x73, 0x25, 0xE1, 0xD9, 0xD0, 0x4E, 0x25, 0x71, 0xF0, 0xB3, 0xAF, 0x48, 0x7E, 0x20, 0x33, 0x6A, 0x45, 0x4A, 0x1C, 0xB9, 0x60, 0x26, 0x24, 0x3C, 0x1A, 0xDA, 0x29, 0x24, 0x0E, 0xFE,
0xFB, 0x2A, 0xB5, 0xE8, 0x14, 0x3F, 0x39, 0x7A, 0xD5, 0x9D, 0x00, 0x4B, 0x62, 0x97, 0xF7, 0x6E, 0xEC, 0x4B, 0x92, 0x1F, 0x48, 0xBE, 0x52, 0x2E, 0x3A, 0xC5, 0x9F, 0x0C, 0xBD, 0x72, 0x25, 0xC0,
0xAA, 0x78, 0x3B, 0xC7, 0x5E, 0x2A, 0x8D, 0xD7, 0x68, 0xD1, 0xC5, 0xC3, 0x49, 0xD9, 0x46, 0xE7, 0x92, 0xD8, 0x65, 0xBD, 0x9B, 0x22, 0xDE, 0xCE, 0xB0, 0x97, 0x42, 0xD3, 0xAC, 0xB7, 0xE8, 0xE2,
0x4F, 0x4A, 0xFB, 0xB6, 0x31, 0x0F, 0x03, 0xFA, 0x25, 0x64, 0x15, 0x0B, 0xB9, 0xFD, 0xC7, 0x82, 0xE1, 0x5B, 0xD9, 0x46, 0xE7, 0x0F, 0x72, 0xFB, 0xB6, 0x3E, 0x0F, 0x7C, 0x7A, 0x11, 0xB0, 0x92,
0x06, 0xA1, 0xAF, 0xD5, 0x17, 0xE0, 0xB3, 0x85, 0xC6, 0x77, 0xDA, 0x20, 0x71, 0xFD, 0x66, 0x43, 0x86, 0xDC, 0xFE, 0x63, 0x41, 0xFD, 0xC0, 0xD3, 0xAA, 0x0B, 0xB0, 0xD9, 0x42, 0xE2, 0x3B, 0x6D,
0x47, 0x45, 0x5F, 0xAB, 0x8B, 0x90, 0xF2, 0x49, 0xD9, 0x24, 0xA5, 0x34, 0xD6, 0x20, 0xD5, 0x85, 0xE0, 0xB8, 0x7E, 0xB3, 0x21, 0xA3, 0xA2, 0xAF, 0xD5, 0x45, 0x48, 0xD9, 0xA4, 0x74, 0x92, 0x50,
0xF9, 0xC5, 0x1E, 0x5D, 0xA7, 0xDD, 0xD9, 0x3B, 0x9F, 0xEF, 0xDF, 0xDD, 0x9E, 0x34, 0xC5, 0xF6, 0x1A, 0x69, 0x10, 0xEA, 0xC2, 0xFC, 0xBC, 0x46, 0xD7, 0x69, 0x77, 0xF6, 0xCE, 0xE7, 0xF5, 0xBB,
0xE6, 0x09, 0x0B, 0x19, 0x5C, 0x5E, 0x9C, 0xBD, 0x75, 0x9F, 0x6B, 0x2C, 0x49, 0x22, 0x6D, 0x09, 0xDB, 0xA3, 0x86, 0x28, 0x6F, 0x1E, 0xB1, 0x80, 0xC1, 0xE3, 0xC5, 0xD9, 0x3B, 0xF7, 0xB9, 0xC6,
0x1E, 0xFA, 0xA4, 0x29, 0x9A, 0x4F, 0x9A, 0x62, 0x2B, 0x94, 0xEF, 0x86, 0x9D, 0x04, 0xE1, 0xA5, 0xE2, 0x38, 0xD4, 0x96, 0x60, 0xA1, 0x8F, 0x1A, 0xA2, 0xF9, 0xA8, 0x21, 0x4A, 0xA1, 0xBC, 0x1A,
0x36, 0x89, 0xFC, 0x2C, 0x1B, 0x12, 0xEE, 0x5A, 0x08, 0xCC, 0xC6, 0x5D, 0x33, 0x8D, 0x03, 0x1E, 0x76, 0xE4, 0x07, 0x5F, 0xB5, 0x49, 0xE8, 0xA5, 0xE9, 0x90, 0x70, 0xD3, 0x42, 0x60, 0x36, 0x56,
0x12, 0x84, 0x8C, 0x6D, 0x29, 0x7C, 0x61, 0x92, 0x9F, 0x0F, 0x16, 0x15, 0x05, 0xD1, 0xE6, 0x29, 0xCD, 0x34, 0x0E, 0x78, 0x48, 0x10, 0x32, 0xB6, 0x25, 0xF0, 0x0B, 0x93, 0xBC, 0x6C, 0xB0, 0xC8,
0x9D, 0x0E, 0xC9, 0x9C, 0xB1, 0x65, 0xD6, 0x6F, 0x36, 0xD7, 0xEB, 0x75, 0x63, 0x16, 0xB2, 0xF9, 0x28, 0x88, 0x36, 0x4F, 0xE8, 0x74, 0x48, 0xE6, 0x8C, 0x2D, 0xD3, 0x7E, 0xA3, 0xB1, 0x5E, 0xAF,
0x6A, 0xDC, 0x98, 0x24, 0x8B, 0x66, 0xB4, 0x9A, 0x98, 0xE2, 0xB1, 0xC9, 0x91, 0x69, 0x32, 0x20, 0xEB, 0xB3, 0x80, 0xCD, 0x57, 0xE3, 0xFA, 0x24, 0x5E, 0x34, 0xC2, 0xD5, 0xC4, 0x14, 0x5F, 0x1B,
0xAC, 0xE9, 0x36, 0x2C, 0xA2, 0x31, 0xD0, 0x68, 0xCA, 0x86, 0xE4, 0x0B, 0xA4, 0xBA, 0xF1, 0x57, 0x1C, 0x99, 0x06, 0x83, 0x8D, 0x35, 0xDC, 0xBA, 0x45, 0x34, 0x06, 0x12, 0x4D, 0xD9, 0x90, 0x5C,
0x58, 0x21, 0xBB, 0x9C, 0x15, 0x6B, 0xD2, 0x05, 0x00, 0xE6, 0x62, 0x96, 0x0F, 0x97, 0x21, 0x5D, 0x40, 0xA8, 0x1B, 0x7D, 0x81, 0x15, 0xD2, 0xAF, 0xB3, 0x7C, 0x4D, 0xBA, 0x00, 0xC0, 0x9C, 0xCD,
0xFF, 0x92, 0x5C, 0x0D, 0x09, 0xA6, 0xD3, 0xB6, 0x6B, 0xC1, 0x8F, 0x63, 0x59, 0x30, 0x6B, 0x26, 0xF2, 0xCB, 0xD7, 0x80, 0xAE, 0x7F, 0x89, 0xAF, 0x86, 0x04, 0xC3, 0x69, 0xDB, 0xB5, 0xE0, 0xC3,
0x22, 0x0C, 0x56, 0xE8, 0x43, 0xC2, 0x6F, 0xC1, 0x62, 0x68, 0xBD, 0x65, 0x19, 0x38, 0x40, 0x07, 0xB1, 0x2C, 0x98, 0x35, 0x13, 0x1E, 0x06, 0x33, 0xF4, 0x21, 0xE1, 0xAF, 0xA0, 0x31, 0xB4, 0xDA,
0x56, 0xFA, 0x11, 0xAD, 0xDB, 0x86, 0x66, 0xDA, 0x3A, 0x0C, 0x5F, 0xFA, 0x6C, 0xAE, 0x05, 0x43, 0xB2, 0x0C, 0x1C, 0xA0, 0x03, 0x29, 0xBD, 0x90, 0x56, 0x6D, 0x43, 0x33, 0x6D, 0x1D, 0x86, 0x2F,
0xF2, 0xBA, 0x8D, 0x20, 0xEC, 0x8E, 0x77, 0xE1, 0xBA, 0x00, 0xB1, 0xE3, 0x69, 0x66, 0x2B, 0x72, 0x3D, 0x36, 0xD7, 0xFC, 0x21, 0x79, 0xDD, 0x46, 0x10, 0x76, 0xA7, 0x79, 0xE9, 0xBA, 0x00, 0xB1,
0xBB, 0x30, 0xAA, 0xE5, 0x44, 0x2D, 0xB8, 0x5C, 0x78, 0x3D, 0xF8, 0xF5, 0xB4, 0x1E, 0xF4, 0xB8, 0xD3, 0xD4, 0xCC, 0x56, 0xE8, 0x76, 0x61, 0x54, 0xCB, 0x09, 0x5B, 0xF0, 0xB8, 0x6C, 0xF6, 0xE0,
0x3D, 0x6C, 0x72, 0x22, 0xDB, 0xF5, 0xB4, 0xAE, 0x75, 0xD1, 0xB6, 0x35, 0xD3, 0xEB, 0x6A, 0xB6, 0xB3, 0xA9, 0xF5, 0xA0, 0xC7, 0xED, 0x61, 0x93, 0x13, 0xDA, 0x6E, 0x53, 0xEB, 0x5A, 0x97, 0x6D,
0x05, 0x5D, 0xB6, 0xD5, 0x8A, 0xCC, 0xAE, 0x05, 0x37, 0xAE, 0x17, 0xB9, 0x00, 0xE4, 0xC2, 0x81, 0x5B, 0x33, 0x9B, 0x5D, 0xCD, 0xB6, 0xA0, 0xCB, 0xB6, 0x5A, 0xA1, 0xD9, 0xB5, 0xE0, 0xC5, 0x6D,
0xA1, 0x9E, 0xA7, 0xB9, 0x30, 0xBD, 0xE7, 0x46, 0x30, 0xB4, 0x1D, 0x01, 0x4C, 0x00, 0xD2, 0xBD, 0x86, 0x2E, 0x00, 0xB9, 0x74, 0x60, 0x68, 0xB3, 0xA9, 0xB9, 0x30, 0xBD, 0xE7, 0x86, 0x30, 0xB4,
0xC0, 0x1E, 0x57, 0x83, 0xDF, 0x8E, 0x7B, 0x01, 0x53, 0x5C, 0x5C, 0x14, 0x1E, 0xBC, 0xC8, 0x94, 0x1D, 0x02, 0x4C, 0x00, 0xD2, 0xBD, 0xC4, 0x1E, 0x57, 0x83, 0xCF, 0x8E, 0x7B, 0x09, 0x53, 0x5C,
0x23, 0xE0, 0x06, 0xC6, 0x5F, 0xC0, 0x23, 0x8C, 0xEC, 0xE1, 0xC2, 0x1C, 0x88, 0x89, 0x80, 0x23, 0x5C, 0x14, 0xBE, 0x34, 0x43, 0x53, 0x8E, 0x80, 0x17, 0x18, 0x7F, 0x09, 0x5F, 0x61, 0x64, 0x0F,
0xB9, 0xCA, 0x05, 0xAE, 0x6D, 0x22, 0x0E, 0x25, 0x02, 0x1C, 0x31, 0x3B, 0x42, 0x68, 0xEE, 0x05, 0x17, 0xE6, 0x40, 0x4C, 0x04, 0x1C, 0xCA, 0x55, 0x2E, 0x71, 0x6D, 0x13, 0x71, 0x28, 0x10, 0xE0,
0xAE, 0x6E, 0x22, 0x16, 0x12, 0x75, 0x93, 0xE3, 0x6E, 0x0A, 0xE2, 0x6C, 0xED, 0x02, 0x71, 0x10, 0x88, 0xD9, 0x21, 0x42, 0x73, 0x2F, 0x71, 0x75, 0x13, 0xB1, 0x90, 0xA8, 0x9B, 0x1C, 0x77, 0x53,
0xEB, 0x22, 0xBA, 0x26, 0xA7, 0x1F, 0x1F, 0x5A, 0x7C, 0x0C, 0x0C, 0xC1, 0x19, 0xCE, 0x05, 0x22, 0x6C, 0xCE, 0xD6, 0x2E, 0x11, 0x07, 0xB1, 0x2E, 0xA2, 0x6B, 0xF2, 0xFD, 0xE3, 0x97, 0x16, 0x1F,
0x00, 0xF4, 0x23, 0x14, 0x01, 0xC4, 0x15, 0xEB, 0x98, 0x5D, 0xFB, 0xC2, 0x6C, 0x5B, 0x1A, 0x62, 0x03, 0x43, 0x70, 0x86, 0x73, 0x89, 0x08, 0xC0, 0xFE, 0x11, 0x8A, 0x00, 0xE2, 0x8A, 0x75, 0xCC,
0x81, 0x18, 0x20, 0x02, 0x5D, 0x94, 0x89, 0x87, 0x78, 0x02, 0x40, 0x58, 0xDA, 0x43, 0x44, 0xBA, 0xAE, 0x7D, 0x69, 0xB6, 0x2D, 0x0D, 0xB1, 0x40, 0x0C, 0x10, 0x81, 0x2E, 0xF2, 0xA4, 0x89, 0x78,
0x1A, 0xA2, 0xEE, 0x68, 0xED, 0x88, 0xAF, 0x0B, 0xF4, 0x9B, 0x6D, 0xCD, 0x03, 0x3A, 0xDB, 0xC0, 0x02, 0x40, 0x58, 0xBA, 0x89, 0x88, 0x74, 0x35, 0x44, 0xDD, 0xD1, 0xDA, 0x21, 0x5F, 0x17, 0xF6,
0x6E, 0xA0, 0x1F, 0x16, 0x86, 0x3B, 0x60, 0x11, 0xEF, 0x8C, 0x60, 0xE0, 0x85, 0xED, 0x22, 0x58, 0x6F, 0xB6, 0xB5, 0x26, 0xEC, 0xB3, 0x0D, 0xE4, 0x86, 0xFD, 0xC3, 0xC2, 0xF0, 0x06, 0x24, 0xE2,
0x31, 0xD3, 0xD5, 0x04, 0x67, 0x91, 0x64, 0xAF, 0xA3, 0x01, 0xC1, 0xB0, 0x12, 0x5F, 0xCD, 0x86, 0x9D, 0x21, 0x0C, 0xBC, 0xB4, 0x5D, 0x04, 0x2B, 0x66, 0xBA, 0x9A, 0xA0, 0x2C, 0x6E, 0xB9, 0xD9,
0x99, 0xD0, 0x13, 0x21, 0x96, 0xB0, 0x12, 0xAC, 0x27, 0x70, 0x84, 0xDE, 0x88, 0x53, 0x00, 0xCD, 0xD1, 0x60, 0xC3, 0xB0, 0x12, 0x5F, 0xCD, 0x86, 0x99, 0xD0, 0x13, 0x22, 0x96, 0xB0, 0x12, 0xAC,
0xC8, 0x66, 0xA4, 0xE9, 0x1B, 0x17, 0x74, 0x17, 0x18, 0x7A, 0x61, 0x76, 0x7B, 0x48, 0x29, 0x67, 0x27, 0x70, 0x84, 0xDE, 0x90, 0xEF, 0x00, 0x9A, 0x91, 0xCC, 0xB8, 0xA7, 0x6F, 0x9C, 0xD1, 0x5D,
0x75, 0xDB, 0x65, 0xF0, 0xE5, 0x0C, 0x69, 0xB4, 0x58, 0x79, 0x97, 0x77, 0xE2, 0x15, 0x2E, 0xD0, 0x20, 0xE8, 0xA5, 0xD9, 0xED, 0xE1, 0x4E, 0x39, 0xA9, 0xDB, 0x2E, 0x83, 0x5F, 0x4E, 0x90, 0x7A,
0x21, 0xDA, 0xCD, 0xF2, 0x4E, 0x74, 0x7D, 0x03, 0x5D, 0x6A, 0xA2, 0x32, 0xC1, 0x65, 0x06, 0x5F, 0x8B, 0x15, 0x6F, 0x59, 0x27, 0x3E, 0xE1, 0x01, 0x1D, 0xA2, 0xDD, 0x2C, 0xDE, 0x44, 0xD7, 0x37,
0x50, 0xDE, 0x91, 0x76, 0x02, 0xA9, 0x4D, 0x5C, 0xD8, 0x47, 0x5E, 0xC1, 0x91, 0xD1, 0xCB, 0x30, 0x90, 0xA5, 0x06, 0x0A, 0x13, 0x3C, 0x66, 0xF0, 0x0B, 0xC2, 0x3B, 0xD2, 0x8E, 0x20, 0xB4, 0x89,
0x5D, 0xAC, 0x21, 0x05, 0x82, 0x61, 0x30, 0x00, 0x46, 0xFB, 0xF0, 0x45, 0x63, 0xFA, 0xF3, 0x06, 0x72, 0xFD, 0xC8, 0x32, 0x38, 0x32, 0x7A, 0x19, 0x24, 0x8B, 0x35, 0x84, 0x40, 0x30, 0x0C, 0x06,
0x65, 0x7E, 0x78, 0xF1, 0xCB, 0xFB, 0xD3, 0xBF, 0x98, 0x59, 0x59, 0x3D, 0xEF, 0xA2, 0xEB, 0x20, 0xC0, 0x68, 0x0F, 0x7E, 0x51, 0x99, 0xFE, 0xB8, 0x42, 0x99, 0x1F, 0x5E, 0xFC, 0xF2, 0xFE, 0xE4,
0xC4, 0xB6, 0xD5, 0x40, 0xED, 0x73, 0x90, 0xB5, 0x1E, 0x30, 0xBF, 0xD5, 0x63, 0xB6, 0xDD, 0xC6, 0x2F, 0xA6, 0x56, 0x56, 0xAF, 0x79, 0xD9, 0x75, 0x10, 0x62, 0xDB, 0xAA, 0xA3, 0xF4, 0x39, 0x48,
0xB6, 0x2E, 0xB6, 0xF5, 0x3C, 0xBC, 0xED, 0x81, 0x04, 0xBA, 0xFC, 0xE2, 0x39, 0x45, 0x17, 0xAA, 0xDA, 0x26, 0x10, 0xBF, 0xD5, 0x63, 0xB6, 0xDD, 0xC6, 0xB6, 0x2E, 0xB6, 0xF5, 0x9A, 0xF8, 0xDA,
0x5E, 0xAB, 0xC3, 0x19, 0x5E, 0xDC, 0xA1, 0xE2, 0xF2, 0x4E, 0xB3, 0xDD, 0x95, 0x13, 0xCD, 0x02, 0x03, 0x0E, 0x74, 0xF9, 0xA3, 0xE9, 0xE4, 0x5D, 0x28, 0x7A, 0xAD, 0x0E, 0x27, 0x78, 0xFE, 0x86,
0x84, 0xA9, 0x02, 0x36, 0xF3, 0xD5, 0x40, 0x5C, 0xBD, 0x02, 0x05, 0xF9, 0xE0, 0x14, 0x23, 0xF8, 0x82, 0xCB, 0x3B, 0xCD, 0x76, 0x57, 0x4E, 0x34, 0x73, 0x10, 0xA6, 0x0A, 0xD8, 0xCC, 0x56, 0x03,
0x00, 0x3E, 0x4D, 0xCC, 0xE2, 0xC0, 0x7A, 0x39, 0xFC, 0x9E, 0x58, 0x32, 0x07, 0xA8, 0x71, 0x24, 0x76, 0xF5, 0x72, 0x14, 0xE4, 0x17, 0x27, 0x1F, 0xC1, 0x07, 0xF0, 0x69, 0x62, 0x16, 0x07, 0xD6,
0xF2, 0x2B, 0x47, 0x95, 0x77, 0x01, 0xEE, 0xBD, 0x96, 0xC6, 0xF2, 0xB9, 0x0A, 0x3C, 0xB9, 0x84, 0xCB, 0xE0, 0xF7, 0xC4, 0x92, 0x19, 0x40, 0x8D, 0x23, 0x91, 0x3D, 0x39, 0xAA, 0xBC, 0x0B, 0x70,
0xE0, 0x02, 0xAE, 0xFA, 0xED, 0x75, 0xB7, 0xDB, 0x85, 0xBE, 0x1E, 0x37, 0x71, 0xB4, 0x72, 0x1B, 0xEF, 0xB5, 0x34, 0x96, 0xCD, 0x55, 0xE0, 0xC9, 0x25, 0x04, 0x15, 0x70, 0xD5, 0x6F, 0xAF, 0xBB,
0xF4, 0xD5, 0x61, 0x1C, 0x41, 0xEE, 0x39, 0x5A, 0x1D, 0xD4, 0x67, 0x40, 0xAA, 0x87, 0x1E, 0xC2, 0xDD, 0x2E, 0xF4, 0xF5, 0xB8, 0x8A, 0xA3, 0x96, 0xDB, 0x20, 0xAF, 0x0E, 0xE3, 0x08, 0x72, 0xCB,
0x76, 0xD0, 0xDE, 0x80, 0x37, 0x0E, 0x0C, 0xC2, 0x1F, 0x7C, 0x12, 0x37, 0x78, 0x85, 0x1E, 0xB8, 0xD1, 0xEA, 0xA0, 0x3C, 0x03, 0x52, 0x3D, 0xB4, 0x10, 0xB6, 0x83, 0xFA, 0x06, 0xB4, 0x71, 0x60,
0xBD, 0xC0, 0x45, 0x34, 0x07, 0x14, 0xD4, 0x06, 0xB6, 0x6B, 0x76, 0x4F, 0xF3, 0xF8, 0x72, 0x80, 0x10, 0x7E, 0xE0, 0x37, 0xF1, 0x82, 0x4F, 0xE8, 0x81, 0xD7, 0x4B, 0x5C, 0x44, 0x73, 0x40, 0x40,
0x73, 0x07, 0x49, 0x87, 0x11, 0x66, 0x07, 0x80, 0xB5, 0xD1, 0xA1, 0xB5, 0x11, 0x6A, 0x17, 0x9C, 0x6D, 0x20, 0xBB, 0x66, 0xF7, 0xB4, 0x26, 0x5F, 0x0E, 0x70, 0xEE, 0xE0, 0xD6, 0x61, 0x84, 0xD9,
0x88, 0x8D, 0x3A, 0xDF, 0xD6, 0x84, 0xAB, 0xB1, 0x50, 0x16, 0x70, 0x05, 0x14, 0x2F, 0x1C, 0xF4, 0x01, 0x60, 0x6D, 0x34, 0x68, 0x6D, 0x84, 0xDA, 0x05, 0x23, 0x62, 0xA3, 0xCC, 0xB7, 0x35, 0x61,
0x44, 0x60, 0xA8, 0x1D, 0x70, 0x0A, 0x36, 0xC3, 0x89, 0x5D, 0x87, 0xF5, 0x84, 0x60, 0x6C, 0xA0, 0x6A, 0x2C, 0xE4, 0x05, 0x3C, 0x01, 0xC5, 0x4B, 0x07, 0x2D, 0x11, 0x28, 0x6A, 0x07, 0x8C, 0x82,
0x0E, 0x9D, 0x47, 0x17, 0x89, 0x73, 0x5D, 0xCE, 0x58, 0x5C, 0x4C, 0x3E, 0x38, 0x1E, 0xEF, 0xE7, 0xCD, 0x70, 0x62, 0xD7, 0x61, 0x3D, 0xC1, 0x18, 0x1B, 0x76, 0x87, 0xC6, 0xA3, 0x8B, 0x9B, 0x73,
0xDD, 0x7C, 0x46, 0x17, 0x2D, 0xA6, 0x63, 0x89, 0x2B, 0x40, 0xEC, 0xC0, 0x42, 0x17, 0x36, 0x58, 0x5D, 0x4E, 0x58, 0x5C, 0x4C, 0x7E, 0x71, 0x9A, 0xBC, 0x9F, 0x77, 0xF3, 0x19, 0x5D, 0xD4, 0x98,
0x32, 0xB0, 0x4C, 0xF3, 0x72, 0xBE, 0x7A, 0xD0, 0x7B, 0x61, 0xF6, 0xB8, 0x3F, 0x46, 0xA4, 0x80, 0x8E, 0x25, 0x9E, 0x00, 0xB1, 0x03, 0x0B, 0x5D, 0xDA, 0xA0, 0xC9, 0x40, 0x32, 0xAD, 0x99, 0xD1,
0x92, 0x6E, 0xEF, 0xDB, 0x6B, 0x0F, 0x5C, 0x41, 0xC7, 0xE9, 0x80, 0x57, 0x41, 0x6F, 0x22, 0xBD, 0xB5, 0x09, 0xBD, 0x97, 0x66, 0x8F, 0xDB, 0x63, 0x44, 0x0A, 0x76, 0xD2, 0xED, 0x7D, 0x7B, 0xDD,
0x22, 0xFF, 0x72, 0x89, 0xBA, 0xB8, 0x0A, 0x17, 0x3E, 0x9F, 0xEF, 0xC2, 0x54, 0x94, 0x04, 0x92, 0x04, 0x53, 0xD0, 0x71, 0x3A, 0x60, 0x55, 0xD0, 0x9A, 0x48, 0xAB, 0xC8, 0x7F, 0x39, 0x47, 0x5D,
0x65, 0x83, 0x27, 0x41, 0xD2, 0x5C, 0xCD, 0xE5, 0x7A, 0x62, 0xDB, 0xCC, 0x45, 0xA1, 0xD8, 0x9D, 0x5C, 0x85, 0x33, 0x9F, 0xCF, 0x77, 0x61, 0x2A, 0x72, 0x02, 0xB7, 0x65, 0x83, 0x25, 0xC1, 0xAD,
0x08, 0x60, 0x81, 0x3F, 0x81, 0x45, 0x91, 0xFF, 0x88, 0x22, 0x22, 0x0E, 0x58, 0xB4, 0xE5, 0x2D, 0xB9, 0x9A, 0xCB, 0xE5, 0xC4, 0xB6, 0x99, 0x8B, 0x4C, 0xB1, 0x3B, 0x21, 0xC0, 0x02, 0x7B, 0x02,
0xF7, 0x9E, 0xE8, 0x40, 0xC1, 0x59, 0x00, 0x3A, 0xB0, 0x28, 0xC7, 0xD6, 0x74, 0x80, 0xD5, 0x16, 0x8B, 0x22, 0xFD, 0x11, 0x45, 0x44, 0x1C, 0xB0, 0x68, 0xCB, 0x57, 0x6E, 0x3D, 0xD1, 0x80, 0x82,
0x33, 0x5D, 0x07, 0xF9, 0xF9, 0x20, 0xE3, 0x3F, 0xC5, 0x6A, 0x69, 0x0A, 0x25, 0xCF, 0x0E, 0xEB, 0xB1, 0x00, 0x74, 0x60, 0x51, 0x8E, 0xAD, 0xE9, 0x00, 0xA9, 0x2D, 0x66, 0xBA, 0x0E, 0xD2, 0xF3,
0xD7, 0x78, 0xB8, 0x1E, 0x92, 0x32, 0x86, 0x93, 0xAD, 0x3E, 0xA5, 0xAC, 0xE3, 0xA9, 0x07, 0x41, 0x41, 0xCA, 0x7F, 0x82, 0xD9, 0xD2, 0x14, 0x52, 0x9E, 0x1D, 0xDA, 0xAF, 0x71, 0x77, 0x3D, 0x24,
0x97, 0x21, 0x7C, 0x44, 0x13, 0x72, 0x80, 0x69, 0x38, 0xDB, 0x65, 0xF4, 0x88, 0x4B, 0x08, 0x06, 0x85, 0x0F, 0x27, 0x5B, 0x7D, 0x4A, 0x5A, 0xC7, 0x43, 0x0F, 0x82, 0x26, 0x43, 0xD8, 0x88, 0x06,
0xF9, 0xF2, 0xC3, 0x3F, 0x5F, 0xBC, 0x3B, 0x3B, 0x7D, 0xF3, 0x07, 0xD9, 0x81, 0xDA, 0x16, 0x46, 0xC4, 0x00, 0xD3, 0x60, 0xB6, 0x4B, 0xE9, 0x11, 0x97, 0x00, 0x14, 0xF2, 0xE5, 0x87, 0x7F, 0xBE,
0x4D, 0x8C, 0xF2, 0x4D, 0x71, 0x2E, 0x77, 0xD2, 0x84, 0xCC, 0x60, 0x67, 0x7A, 0x20, 0xAA, 0xCB, 0x38, 0x3D, 0x3B, 0x79, 0xFB, 0x86, 0xEC, 0x40, 0x6D, 0x0B, 0xA3, 0x06, 0x7A, 0xF9, 0x86, 0x38,
0xD1, 0xC9, 0xDC, 0xE1, 0x4B, 0xBC, 0x3E, 0xFB, 0x0D, 0x41, 0xCD, 0x1D, 0xF8, 0xC9, 0xBB, 0x76, 0x97, 0x3B, 0x6A, 0x40, 0x64, 0xB0, 0x33, 0x3C, 0x10, 0xD9, 0xE5, 0xE8, 0x68, 0xEE, 0xF0, 0x25,
0xCF, 0xD5, 0x64, 0xA2, 0x44, 0x04, 0x6A, 0xA7, 0xAF, 0x5E, 0x9C, 0xFD, 0xF7, 0xD9, 0xF9, 0x8B, 0x5E, 0x9F, 0xFD, 0x86, 0xA0, 0xE6, 0x0E, 0x7C, 0x64, 0x5D, 0xBB, 0xE7, 0x6A, 0x32, 0x50, 0x22,
0xD7, 0x64, 0x7B, 0x68, 0x7E, 0x18, 0x04, 0xCE, 0x13, 0x5A, 0xE7, 0xDA, 0x4B, 0x28, 0x95, 0xB3, 0x02, 0xB5, 0x93, 0x57, 0x2F, 0xCE, 0xFE, 0x75, 0x76, 0xFE, 0xE2, 0x35, 0xD9, 0x1E, 0x9A, 0x1D,
0xEB, 0x8C, 0xD1, 0xC5, 0x1E, 0xD8, 0x3C, 0x99, 0x04, 0x40, 0xBC, 0xDA, 0xD6, 0x78, 0xB5, 0x4D, 0x06, 0x81, 0xF1, 0x84, 0xD6, 0xB9, 0xF6, 0x12, 0x52, 0xE5, 0xF4, 0x3A, 0x65, 0x74, 0xB1, 0x07,
0xB0, 0xBE, 0x16, 0x6B, 0xF1, 0x4A, 0x5B, 0x94, 0x7C, 0x44, 0x8B, 0xFD, 0x05, 0x74, 0x2E, 0xAE, 0x36, 0x0F, 0x26, 0x01, 0x10, 0xCF, 0xB6, 0x35, 0x9E, 0x6D, 0x13, 0xCC, 0xAF, 0xC5, 0x5A, 0x3C,
0xB1, 0x31, 0xFB, 0xF8, 0x99, 0x68, 0x8B, 0x55, 0xC4, 0xC2, 0x25, 0x32, 0x3B, 0xBF, 0x23, 0x20, 0xD3, 0x16, 0x29, 0x1F, 0xD1, 0x22, 0x6F, 0x01, 0x9D, 0x8B, 0x6B, 0x6C, 0x4C, 0x3F, 0x7E, 0x26,
0x4F, 0x01, 0xA9, 0x74, 0xCE, 0x9A, 0xB2, 0x97, 0x4B, 0xE4, 0x0A, 0xA2, 0x6A, 0x17, 0x6B, 0x54, 0xDA, 0x62, 0x15, 0xB2, 0x60, 0x89, 0xC4, 0xCE, 0xDE, 0x08, 0xF0, 0x53, 0x40, 0x2A, 0x8C, 0xB3,
0x0A, 0x79, 0xA2, 0x25, 0xF1, 0x24, 0x0A, 0x27, 0x5F, 0x87, 0xE4, 0x8C, 0xC6, 0x01, 0x2E, 0x55, 0xA6, 0xD4, 0x72, 0x89, 0x5C, 0x41, 0x64, 0xED, 0x62, 0x8D, 0x52, 0x22, 0x4F, 0xB4, 0x38, 0x9A,
0xD7, 0x07, 0xE0, 0x70, 0xFD, 0x68, 0x05, 0xF3, 0xDE, 0xF3, 0xB1, 0x64, 0x74, 0x14, 0x8F, 0xB3, 0x84, 0xC1, 0xE4, 0xCB, 0x90, 0x9C, 0xD1, 0xC8, 0xC7, 0xA5, 0xAA, 0xFA, 0x00, 0x0C, 0xAE, 0x17,
0xE5, 0x40, 0xFC, 0x9E, 0x2C, 0xD3, 0x64, 0x96, 0xD2, 0x2C, 0xCB, 0x25, 0x7F, 0x19, 0x66, 0xE1, 0xAE, 0x60, 0xDE, 0x7B, 0x3E, 0x96, 0x8C, 0x9E, 0x46, 0xE3, 0x74, 0x39, 0x10, 0x9F, 0x47, 0xCB,
0x38, 0x8C, 0x42, 0x76, 0xDD, 0x07, 0xC6, 0x05, 0x34, 0xCE, 0x51, 0x5F, 0xA6, 0x33, 0xB1, 0x24, 0x24, 0x9E, 0x25, 0x34, 0x4D, 0x33, 0xCE, 0x7F, 0x0D, 0xD2, 0x60, 0x1C, 0x84, 0x01, 0xBB, 0xEE,
0xBF, 0x81, 0x04, 0x91, 0x67, 0x69, 0x5C, 0x29, 0x25, 0x08, 0x48, 0xEE, 0x52, 0xF1, 0xDD, 0x21, 0x03, 0xE1, 0x7C, 0x1A, 0x65, 0xA8, 0x2F, 0x93, 0x99, 0x58, 0x92, 0xBF, 0x40, 0x80, 0xC8, 0xA3,
0xBF, 0x7D, 0xAC, 0x93, 0x72, 0x17, 0x99, 0x5E, 0x1E, 0x33, 0xB8, 0x4A, 0x3E, 0x84, 0x15, 0x15, 0x34, 0x2E, 0x94, 0x12, 0x04, 0x04, 0x77, 0x89, 0xF8, 0xDD, 0xC1, 0xBF, 0x7D, 0xA4, 0x93, 0x7C,
0xBA, 0x7F, 0x4D, 0x16, 0x0B, 0xC8, 0x62, 0xEB, 0xB5, 0x28, 0xCC, 0x58, 0xCD, 0xA8, 0xF9, 0x51, 0x17, 0x91, 0x5E, 0xE6, 0x33, 0xB8, 0x48, 0x3E, 0x84, 0x14, 0xA5, 0x7D, 0xFF, 0x1A, 0x2F, 0x16,
0x54, 0x53, 0xD8, 0xF0, 0x8E, 0x4E, 0x01, 0xDB, 0xB9, 0xA2, 0xF4, 0xEA, 0xAA, 0x88, 0x67, 0x01, 0x10, 0xC5, 0x56, 0x2B, 0x61, 0x90, 0xB2, 0x8A, 0x51, 0xF1, 0xC2, 0xB0, 0xA2, 0x90, 0xE1, 0x94,
0xED, 0xD7, 0x94, 0x42, 0x00, 0x0A, 0xC2, 0xB4, 0xAE, 0x93, 0x8D, 0x88, 0x59, 0x89, 0x71, 0x9E, 0x4E, 0x01, 0xDB, 0xB9, 0x22, 0xF4, 0xEA, 0xAA, 0x88, 0x67, 0x0E, 0xED, 0xD7, 0x84, 0x82, 0x03,
0x55, 0x86, 0x38, 0xBC, 0xAF, 0x44, 0x38, 0x0F, 0xFF, 0xC1, 0xF8, 0x14, 0xF4, 0x40, 0x83, 0xB6, 0xF2, 0x83, 0xA4, 0xAA, 0x93, 0x0D, 0x8F, 0x59, 0xF2, 0x71, 0x4D, 0xAB, 0x70, 0x71, 0xF8, 0x5E,
0x16, 0xD1, 0xAE, 0x91, 0x77, 0x24, 0x9F, 0xED, 0x2A, 0xB3, 0x1D, 0xB8, 0x4F, 0x61, 0x90, 0x03, 0xF2, 0x70, 0x4D, 0xFC, 0x07, 0xE3, 0x13, 0x90, 0x03, 0x0D, 0xDA, 0x5A, 0x44, 0xBB, 0x46, 0xDA,
0x97, 0x6B, 0x7E, 0x01, 0x29, 0x46, 0x43, 0x22, 0x77, 0x04, 0x48, 0xB3, 0x84, 0x83, 0x43, 0xAF, 0x91, 0x6C, 0xB6, 0xAB, 0xCC, 0x76, 0xE0, 0x3D, 0x81, 0x41, 0x0E, 0x3C, 0xAE, 0xF9, 0x03, 0xB8,
0x39, 0xB8, 0x3C, 0xD2, 0xB6, 0x94, 0x40, 0xDB, 0xBA, 0x13, 0x0E, 0xDA, 0x38, 0xC2, 0xB1, 0x05, 0x18, 0x0E, 0x89, 0xAC, 0x08, 0x90, 0x46, 0x01, 0x07, 0x87, 0x5E, 0x73, 0x70, 0x99, 0xA7, 0x6D,
0x42, 0x0E, 0x5C, 0x8A, 0x7D, 0x10, 0x68, 0xED, 0xCA, 0xC7, 0xB5, 0x84, 0xD8, 0x05, 0x61, 0x4B, 0x29, 0x8E, 0xB6, 0x75, 0x27, 0x1C, 0xD4, 0x71, 0x84, 0x63, 0x0B, 0x84, 0x1C, 0x78, 0xE4, 0x75,
0x20, 0x7C, 0x4B, 0x85, 0x8C, 0x8E, 0x81, 0x81, 0x00, 0x43, 0xFA, 0x22, 0x69, 0x22, 0x1B, 0x3C, 0x10, 0x68, 0xED, 0xCA, 0xAF, 0x6B, 0x09, 0xB1, 0x0B, 0xCC, 0x96, 0x40, 0x78, 0x49, 0x85, 0x8C,
0x95, 0xEE, 0x05, 0xB9, 0xCA, 0x75, 0x07, 0xFC, 0x57, 0xC1, 0xC9, 0x30, 0x9E, 0x26, 0xB9, 0x36, 0x6A, 0x40, 0x40, 0x80, 0x21, 0x6D, 0x91, 0x54, 0x91, 0x0D, 0x9A, 0x4A, 0xF3, 0x82, 0x54, 0xE5,
0xAA, 0xB3, 0x2B, 0x0E, 0x41, 0x94, 0x05, 0x72, 0x86, 0x78, 0xA8, 0x9C, 0xAF, 0x93, 0x5C, 0x71, 0xB2, 0x03, 0xF6, 0x2B, 0xA7, 0x64, 0x10, 0x4D, 0xE3, 0x4C, 0x1A, 0xD5, 0xD9, 0x25, 0x83, 0x20,
0xCB, 0x4D, 0x20, 0xD4, 0x2A, 0x51, 0x6C, 0x70, 0xAD, 0x9A, 0xAB, 0xF2, 0x3D, 0x07, 0xB5, 0x01, 0xD2, 0x02, 0x39, 0x43, 0x7C, 0x29, 0x9D, 0xAF, 0x93, 0x4C, 0x70, 0x8B, 0x22, 0x10, 0x4A, 0x95,
0xD8, 0x73, 0x6C, 0x1F, 0xFD, 0x01, 0x8A, 0x5D, 0x3C, 0x9C, 0x01, 0xD9, 0xF9, 0x83, 0x70, 0x15, 0x48, 0x36, 0xB8, 0x54, 0xCD, 0x55, 0xFE, 0x9E, 0x83, 0xD8, 0x00, 0xEC, 0x39, 0xB6, 0x8F, 0xDE,
0x67, 0x5F, 0x58, 0xB8, 0x00, 0x3A, 0xCF, 0xC3, 0x72, 0x58, 0x45, 0x57, 0x36, 0xDA, 0x0A, 0x57, 0x80, 0x60, 0xE7, 0x5F, 0xCE, 0x60, 0xDB, 0xD9, 0x17, 0x61, 0x2A, 0xCE, 0x2E, 0x58, 0xB0, 0x80,
0x3A, 0x2F, 0x68, 0x90, 0x68, 0xA0, 0xAE, 0x17, 0x2E, 0xE1, 0x0B, 0xAA, 0x25, 0x1F, 0x27, 0x6A, 0x7D, 0x9E, 0x07, 0xC5, 0xB0, 0x92, 0xAC, 0x6C, 0xB4, 0xE5, 0xA6, 0x74, 0x9E, 0xEF, 0x41, 0xA2,
0xA1, 0xC3, 0xAE, 0x4F, 0x56, 0xA4, 0xC2, 0xF4, 0x32, 0xE6, 0xB3, 0x55, 0x46, 0x0A, 0x5E, 0x6F, 0x81, 0xB2, 0x9E, 0x9B, 0x84, 0x0B, 0x14, 0x4B, 0x3E, 0x4E, 0xE4, 0x42, 0x87, 0x4D, 0x9F, 0xCC,
0xFD, 0xDE, 0xE1, 0xFC, 0x3E, 0xBC, 0x7F, 0xFB, 0xFC, 0xD9, 0xF9, 0x8B, 0xC3, 0xAE, 0x4F, 0xE6, 0x48, 0x85, 0xEA, 0xA5, 0xCC, 0x63, 0xAB, 0x94, 0xE4, 0xB4, 0xDE, 0xFA, 0xBC, 0xC3, 0xF8, 0x7D,
0x8D, 0xDA, 0xFB, 0x65, 0x00, 0xCA, 0x7F, 0x87, 0xE7, 0xAB, 0x98, 0xEF, 0x5E, 0x47, 0xB8, 0xDE, 0x78, 0xFF, 0xEE, 0xF9, 0xB3, 0xF3, 0x17, 0x87, 0x4D, 0x9F, 0x8C, 0x1B, 0xB5, 0xF7, 0x4B, 0x1F,
0xEB, 0x06, 0x95, 0x9C, 0xF4, 0xC1, 0xAE, 0x0F, 0x1E, 0x14, 0xCB, 0x17, 0xDE, 0x6D, 0xDB, 0xE7, 0x84, 0xFF, 0x0E, 0xCB, 0x57, 0x52, 0xDF, 0xBD, 0x86, 0x70, 0xBD, 0xD7, 0x0C, 0x2A, 0x31, 0xE9,
0x21, 0x11, 0xEA, 0x32, 0x0F, 0x71, 0x78, 0xD3, 0x75, 0xE1, 0xF2, 0xF0, 0x76, 0xB7, 0xD3, 0x2B, 0x83, 0x4D, 0x1F, 0x7C, 0x51, 0x34, 0x5F, 0x58, 0xB7, 0x6D, 0x9B, 0x87, 0x9B, 0x50, 0x97, 0x79,
0x20, 0x17, 0xF1, 0x6F, 0x91, 0xCD, 0xC8, 0x7E, 0xF0, 0xA3, 0x77, 0x14, 0xE4, 0x98, 0x32, 0xE0, 0x88, 0xC1, 0x9B, 0xAE, 0x73, 0x93, 0x87, 0xAF, 0xBB, 0x8D, 0x5E, 0x0E, 0x39, 0xF7, 0x7F, 0x8B,
0xB6, 0xA1, 0x81, 0xDB, 0xF7, 0x33, 0x28, 0x7B, 0xFD, 0x90, 0x35, 0xE0, 0xBF, 0x3C, 0x38, 0x16, 0x74, 0x46, 0xF6, 0x83, 0x1F, 0x9D, 0x52, 0xE0, 0x63, 0xC2, 0x80, 0xDA, 0x86, 0x06, 0x66, 0xDF,
0xA0, 0x26, 0xC9, 0x0A, 0x83, 0x9B, 0x12, 0x36, 0xF7, 0x84, 0xCC, 0x52, 0x4C, 0x38, 0x2D, 0x4A, 0x4B, 0x21, 0xED, 0xF5, 0x02, 0x56, 0x87, 0xFF, 0x32, 0xE7, 0x98, 0x83, 0x9A, 0xC4, 0x2B, 0x74,
0x66, 0xC0, 0x4E, 0x28, 0xBF, 0x0B, 0x63, 0xE3, 0xF5, 0x7B, 0x55, 0xF0, 0x95, 0x92, 0x7E, 0x57, 0x6E, 0x8A, 0xDB, 0xDC, 0xE3, 0x32, 0x0B, 0x36, 0xE1, 0xB4, 0x30, 0x9E, 0x01, 0x39, 0x21, 0xFD,
0x97, 0xD8, 0xC9, 0x81, 0x9E, 0xB9, 0x3B, 0x3A, 0x05, 0xD4, 0x59, 0x38, 0x0D, 0x27, 0x7C, 0x5F, 0xCE, 0x95, 0x8D, 0xE7, 0xEF, 0x65, 0xC6, 0x97, 0x52, 0xFA, 0x5D, 0x5D, 0xA2, 0x92, 0x03, 0x3D,
0x16, 0x22, 0xAF, 0xBB, 0x43, 0xE7, 0xCA, 0x1D, 0x16, 0x99, 0x0E, 0x8C, 0x2A, 0x09, 0x8A, 0xE8, 0x73, 0x77, 0x74, 0x02, 0xA8, 0xB3, 0x60, 0x1A, 0x4C, 0x78, 0x5D, 0x16, 0x3C, 0xAF, 0xBB, 0x43,
0x46, 0x9F, 0x41, 0xB4, 0x22, 0xBD, 0x1F, 0xBD, 0xCF, 0xC0, 0x6C, 0x25, 0x79, 0x1B, 0x01, 0x50, 0xE6, 0x8A, 0x0A, 0x8B, 0x0C, 0x07, 0x46, 0xA5, 0x00, 0x45, 0x74, 0xA3, 0xCD, 0x20, 0x5A, 0x1E,
0x3D, 0x86, 0xCF, 0x55, 0x40, 0x4C, 0xE7, 0x44, 0xA2, 0xFC, 0x2B, 0xC9, 0x0C, 0xEE, 0x54, 0x95, 0xDE, 0x8F, 0xDE, 0xA7, 0xA0, 0xB6, 0x72, 0x7B, 0x1B, 0x0E, 0x50, 0x3D, 0x86, 0xCF, 0x44, 0x40,
0xAC, 0x9A, 0xA7, 0xF7, 0x47, 0xE2, 0x2D, 0xF4, 0xAD, 0xC1, 0x83, 0x3C, 0x00, 0x91, 0xA5, 0x9C, 0x4C, 0xE7, 0x9B, 0x44, 0xFE, 0x97, 0x82, 0x19, 0xAC, 0x54, 0x15, 0xA4, 0x9A, 0x27, 0xF7, 0x47,
0x22, 0x91, 0x59, 0x1E, 0x46, 0x66, 0xBC, 0x2B, 0x41, 0x51, 0xF7, 0x9C, 0x36, 0xD2, 0x88, 0x5C, 0xE2, 0x1D, 0xF4, 0xAD, 0xC1, 0x82, 0x3C, 0x00, 0x91, 0xA5, 0x9C, 0x22, 0x91, 0x59, 0x1E, 0x46,
0xD3, 0xF7, 0xD9, 0x43, 0x19, 0xF1, 0x5E, 0xBD, 0xC3, 0xE8, 0x24, 0xF5, 0xFD, 0x6C, 0x35, 0x5E, 0x66, 0xBC, 0x2B, 0x40, 0x51, 0x6B, 0x4E, 0x1B, 0x61, 0x44, 0x26, 0xE9, 0xFB, 0xF4, 0xA1, 0xF0,
0x84, 0x6C, 0xA7, 0x87, 0xC8, 0x26, 0xE0, 0x30, 0xD9, 0xE8, 0xD2, 0x4F, 0xB5, 0x75, 0xF6, 0x25, 0x78, 0xAF, 0x4E, 0xD1, 0x3B, 0x49, 0x79, 0x3F, 0x5B, 0x8D, 0x17, 0x01, 0xDB, 0x69, 0x21, 0xD2,
0x4B, 0x56, 0xE9, 0x84, 0x1A, 0x93, 0x55, 0x8A, 0xBB, 0xE4, 0xE8, 0x97, 0x21, 0xB5, 0x23, 0x06, 0x09, 0x18, 0x4C, 0x36, 0xFA, 0xEA, 0x25, 0xDA, 0x3A, 0xBD, 0x48, 0xE3, 0x55, 0x32, 0xA1, 0xC6,
0x20, 0x3D, 0x47, 0x41, 0x0B, 0x31, 0x0F, 0x9F, 0xD8, 0xC6, 0x9A, 0x8E, 0x57, 0xDC, 0x88, 0xF0, 0xD5, 0x22, 0xC4, 0xA4, 0x4F, 0x84, 0x11, 0xC6, 0x64, 0x95, 0x60, 0xCD, 0x1C, 0xAD, 0x34, 0x04,
0x61, 0x5A, 0x64, 0x44, 0xB2, 0x2B, 0x4B, 0x26, 0x5F, 0x29, 0xFB, 0xB2, 0x4C, 0x52, 0x36, 0xB4, 0x7A, 0xC4, 0x80, 0x2D, 0xCC, 0x91, 0xED, 0x82, 0xE9, 0xC3, 0x27, 0xB6, 0xB1, 0xA6, 0xE3, 0x15,
0x0C, 0x3F, 0xBB, 0x8E, 0x27, 0x5F, 0xA0, 0x19, 0xAA, 0xC6, 0xC5, 0x2A, 0x56, 0xA0, 0xA0, 0x2E, 0x57, 0x29, 0xFC, 0x32, 0xCD, 0xE3, 0x23, 0xD9, 0x95, 0xC6, 0x93, 0x2F, 0x94, 0x5D, 0x2C, 0xE3,
0x7E, 0x41, 0x3E, 0x11, 0x03, 0x74, 0xF3, 0x4B, 0x32, 0x9D, 0x56, 0x01, 0x70, 0x8B, 0xA0, 0x01, 0x84, 0x0D, 0x2D, 0xA5, 0xE1, 0xE4, 0xDD, 0x90, 0x00, 0xB4, 0xF4, 0x3A, 0x9A, 0x5C, 0x40, 0x2B,
0x34, 0x0E, 0xA6, 0xAB, 0x98, 0x1F, 0x04, 0x80, 0x19, 0x5E, 0x8E, 0x7D, 0x08, 0xBD, 0x37, 0x88, 0xE4, 0x94, 0x8B, 0x55, 0xA4, 0x40, 0x45, 0x49, 0xBD, 0x40, 0x2A, 0x12, 0x03, 0x24, 0xF7, 0x22,
0x32, 0xD0, 0xA6, 0x38, 0x1B, 0x62, 0xB0, 0xA1, 0x82, 0x7A, 0x23, 0x5B, 0x82, 0x85, 0xD5, 0x81, 0x9E, 0x4E, 0xCB, 0x00, 0xB9, 0xBE, 0x50, 0x1F, 0x1B, 0x69, 0xBA, 0xBC, 0xA0, 0x49, 0x12, 0x27,
0x00, 0xDD, 0x88, 0x39, 0x1D, 0xE1, 0x10, 0x00, 0x25, 0x69, 0x9D, 0x1E, 0xE3, 0xBC, 0x40, 0xB2, 0x17, 0x0B, 0xD0, 0x3E, 0x98, 0x87, 0x93, 0x8A, 0xC6, 0x49, 0xEC, 0x53, 0x58, 0x1A, 0x69, 0x28,
0xB1, 0x26, 0x82, 0x77, 0x4D, 0x2B, 0xD8, 0xF7, 0x89, 0xA8, 0x1C, 0xA8, 0x35, 0x6B, 0x03, 0x6D, 0xF6, 0x34, 0xB4, 0x06, 0xD3, 0x55, 0xC4, 0x4F, 0x16, 0x40, 0xAF, 0xBF, 0x8E, 0x3D, 0xF0, 0xE5,
0x7F, 0x0A, 0xF1, 0x89, 0x8C, 0x9A, 0xDC, 0x00, 0xC9, 0x20, 0x3C, 0x61, 0x8D, 0x88, 0xC6, 0x33, 0x37, 0x48, 0x03, 0x98, 0xA8, 0x58, 0x2F, 0x62, 0xB0, 0xA1, 0xB2, 0xFB, 0x7A, 0xBA, 0x04, 0x95,
0x36, 0x37, 0xED, 0x81, 0xBE, 0x67, 0x95, 0x3D, 0x8B, 0x90, 0xE3, 0x7A, 0x7C, 0x3C, 0x64, 0x1F, 0xAD, 0x02, 0x0D, 0x74, 0x23, 0xE2, 0xA4, 0x08, 0x86, 0xF6, 0x00, 0xA4, 0xA0, 0x4A, 0x6B, 0x38,
0xC3, 0xCF, 0xC7, 0x88, 0xF1, 0x31, 0xB9, 0x6B, 0x51, 0x72, 0x2C, 0x06, 0x17, 0xAE, 0x46, 0x62, 0xCF, 0x97, 0x7C, 0xA9, 0x88, 0x68, 0xA0, 0xA2, 0xE5, 0xFC, 0xF8, 0x44, 0x54, 0x22, 0x56, 0x1A,
0x61, 0x84, 0xC7, 0xC7, 0x83, 0x94, 0xB2, 0x55, 0x1A, 0x6B, 0x1C, 0x05, 0xD5, 0x2F, 0x90, 0xDB, 0x95, 0x81, 0xB6, 0x3F, 0x26, 0xF9, 0x44, 0x46, 0x0D, 0xAE, 0xD1, 0x64, 0x10, 0x1C, 0xB1, 0x7A,
0x82, 0x91, 0xA0, 0xE6, 0xD9, 0xFC, 0x4B, 0x08, 0xFA, 0x0B, 0xCC, 0x14, 0xE3, 0x49, 0x9E, 0x46, 0x48, 0xA3, 0x19, 0x9B, 0x9B, 0xF6, 0x40, 0xDF, 0xB3, 0xCA, 0x9E, 0x45, 0x48, 0xAD, 0x1A, 0xD5,
0xD4, 0x5A, 0x4E, 0x0D, 0xC2, 0x7F, 0xCD, 0x86, 0x0B, 0x24, 0x0C, 0xB5, 0x76, 0x0D, 0x13, 0x06, 0x86, 0xEC, 0x63, 0xF0, 0xB9, 0x86, 0x18, 0xD7, 0xC8, 0x5D, 0x8B, 0x92, 0x9A, 0x18, 0x9C, 0xDB,
0xBC, 0x88, 0xA8, 0x56, 0x73, 0x5A, 0xB5, 0x3C, 0xAB, 0xA8, 0x75, 0x6A, 0x52, 0xC5, 0x6B, 0x98, 0x2E, 0x89, 0x85, 0x11, 0xD4, 0x6A, 0x83, 0x84, 0xB2, 0x55, 0x12, 0x69, 0x1C, 0x05, 0xD5, 0xD0,
0x08, 0xF4, 0x53, 0x1A, 0x0C, 0x6A, 0x5A, 0x13, 0x10, 0xD9, 0x06, 0xB7, 0x1B, 0x80, 0x53, 0x05, 0x90, 0xDB, 0x9C, 0x90, 0xA0, 0x37, 0xE9, 0xFC, 0x22, 0x00, 0x85, 0x00, 0x62, 0x8A, 0xF1, 0x24,
0xC0, 0x13, 0x89, 0x2D, 0x10, 0xAE, 0x25, 0x40, 0x74, 0xF7, 0x60, 0xD4, 0xEE, 0x94, 0x00, 0xC1, 0x8B, 0x4B, 0x2A, 0x2D, 0xA7, 0x02, 0xF1, 0x44, 0xC5, 0x86, 0x07, 0x44, 0x20, 0x95, 0x76, 0x05,
0x1B, 0xDF, 0x8D, 0x93, 0x53, 0x05, 0x68, 0x5B, 0x02, 0x22, 0x5E, 0x25, 0xC8, 0xAE, 0x0A, 0xD2, 0x23, 0x10, 0x7C, 0x08, 0x37, 0x59, 0x71, 0x5A, 0x95, 0x2C, 0x4C, 0xA9, 0x74, 0x2A, 0x52, 0x67,
0xBB, 0x37, 0x44, 0xA7, 0xB7, 0x13, 0x82, 0x7B, 0x1F, 0x2A, 0x3D, 0x01, 0xC2, 0x73, 0x05, 0x52, 0x2A, 0x18, 0x59, 0xF4, 0x13, 0xEA, 0x0F, 0x2A, 0x5A, 0x03, 0x10, 0xD9, 0x06, 0xB7, 0x1B, 0x80,
0x1D, 0x81, 0x53, 0xA7, 0x00, 0xA8, 0xC0, 0x6B, 0xDF, 0x0B, 0x60, 0xFB, 0x47, 0x03, 0xEC, 0xFE, 0x53, 0x06, 0xC0, 0x23, 0x93, 0x2D, 0x10, 0xAE, 0x25, 0x40, 0x74, 0xF7, 0x60, 0xD4, 0xEE, 0x14,
0x08, 0x80, 0x22, 0x39, 0x44, 0xB0, 0x65, 0xBE, 0x5C, 0x73, 0x3C, 0x45, 0x25, 0xE0, 0x3E, 0xCF, 0x00, 0xC1, 0xBC, 0xDF, 0x8D, 0x93, 0x53, 0x06, 0x68, 0x5B, 0x02, 0x22, 0x3E, 0x25, 0xC8, 0xAE,
0x97, 0x6B, 0x7C, 0x47, 0xC8, 0xC1, 0xED, 0x89, 0x6E, 0x6D, 0xF4, 0x23, 0x55, 0xF4, 0xCF, 0xEA, 0x0A, 0xB2, 0x79, 0x6F, 0x88, 0x4E, 0x6F, 0x27, 0x04, 0xF7, 0x3E, 0xBB, 0x6C, 0x0A, 0x10, 0x4D,
0xE7, 0x8F, 0x55, 0xCE, 0x1F, 0xAC, 0x99, 0x7F, 0x56, 0x2D, 0x7F, 0xAC, 0x4E, 0xFE, 0x58, 0x85, 0x57, 0x20, 0xD5, 0x11, 0x38, 0x75, 0x72, 0x80, 0x0A, 0xBC, 0xF6, 0xBD, 0x00, 0xB6, 0x7F, 0x34,
0xFC, 0x97, 0x68, 0x63, 0xE9, 0x1A, 0xF1, 0xEC, 0x66, 0xD3, 0x33, 0xDE, 0x57, 0x51, 0x1D, 0x0F, 0xC0, 0xEE, 0x8F, 0x00, 0x28, 0xA2, 0x4D, 0x04, 0x5B, 0x04, 0xE0, 0x15, 0xA7, 0xA9, 0x88, 0x04,
0xFE, 0xD5, 0x8A, 0x7D, 0xC8, 0xDA, 0xEB, 0x8E, 0xE1, 0x6A, 0xAF, 0x1C, 0xA3, 0xAB, 0xBD, 0xEA, 0xBC, 0x67, 0x01, 0x78, 0x85, 0x97, 0x98, 0x1C, 0xAC, 0x77, 0x74, 0x2B, 0xA3, 0x1F, 0x29, 0xA2,
0x18, 0xB6, 0xCB, 0x7F, 0x2D, 0xED, 0x95, 0x2D, 0x2F, 0x5D, 0xC3, 0xB6, 0xC5, 0xA5, 0x25, 0x1A, 0x7F, 0x54, 0x3E, 0x7F, 0xAC, 0x70, 0xFE, 0x60, 0xC9, 0xFC, 0xA3, 0x62, 0xF9, 0x63, 0x65, 0xF2,
0xDB, 0x70, 0xB1, 0xF8, 0xA5, 0x67, 0xD8, 0x1D, 0xFE, 0xDB, 0xE3, 0x4D, 0x0E, 0x0C, 0x77, 0xE4, 0xC7, 0x0A, 0xE4, 0xBF, 0x45, 0x1A, 0x0B, 0xD3, 0x88, 0x87, 0x41, 0x9B, 0x96, 0xF1, 0xBE, 0x82,
0xC5, 0x31, 0xEC, 0x2E, 0xBF, 0x74, 0x79, 0x5B, 0x1B, 0xA1, 0xB6, 0xB5, 0x6F, 0x48, 0x60, 0x9A, 0xEA, 0x34, 0xE1, 0x5F, 0x25, 0x2F, 0x6C, 0x56, 0x5E, 0x77, 0x0C, 0x57, 0x7B, 0xE5, 0x18, 0x5D,
0x7C, 0x05, 0x0A, 0xF9, 0xD6, 0x4A, 0x4D, 0x54, 0x66, 0x35, 0x4E, 0xE9, 0x4E, 0x42, 0x45, 0x02, 0xED, 0x55, 0xC7, 0xB0, 0x5D, 0xFE, 0x69, 0x69, 0xAF, 0x6C, 0xF9, 0xE8, 0x1A, 0xB6, 0x2D, 0x1E,
0xFE, 0x05, 0x6B, 0x59, 0xAA, 0xDF, 0x28, 0xF1, 0xE8, 0x78, 0x48, 0x31, 0x0C, 0x19, 0x6A, 0x04, 0x2D, 0xD1, 0xD8, 0x86, 0x87, 0xC5, 0x1F, 0x3D, 0xC3, 0xEE, 0xF0, 0xCF, 0x1E, 0x6F, 0x72, 0x60,
0x22, 0xBC, 0x44, 0x31, 0x08, 0x44, 0x20, 0xA2, 0x97, 0x30, 0x20, 0xAA, 0xE3, 0xA1, 0xFA, 0x19, 0xB8, 0x23, 0x1F, 0x8E, 0x61, 0x77, 0xF9, 0xA3, 0xCB, 0xDB, 0xDA, 0x08, 0xB5, 0xAD, 0x7D, 0xC3,
0x54, 0x5E, 0xF1, 0x2C, 0xAB, 0x53, 0x83, 0xE5, 0x4C, 0xAB, 0xD3, 0x21, 0x6D, 0xB0, 0xE4, 0x55, 0x0D, 0x26, 0xF1, 0x17, 0xD8, 0x21, 0xAF, 0xD5, 0x54, 0x44, 0xAA, 0x57, 0xE1, 0x3B, 0xDD, 0xB9,
0xB2, 0xA6, 0xE9, 0xAF, 0x90, 0xD0, 0xD6, 0x75, 0xFD, 0xA4, 0xCE, 0x86, 0x6C, 0xA3, 0xED, 0xA9, 0x51, 0x11, 0xD1, 0x5F, 0x60, 0x72, 0x4C, 0xF5, 0x1B, 0xC5, 0x1F, 0xD5, 0x86, 0x14, 0xDD, 0x90,
0x69, 0xF7, 0xD9, 0x09, 0x7D, 0x6A, 0xF7, 0xAD, 0x12, 0x2A, 0x1E, 0x60, 0xF9, 0x6C, 0x32, 0xE7, 0xA1, 0x7A, 0x20, 0xC2, 0x73, 0x1E, 0x83, 0x80, 0x07, 0x22, 0x7A, 0x01, 0x03, 0x02, 0x01, 0x3C,
0xB9, 0x05, 0x2F, 0x70, 0x10, 0x43, 0x8C, 0xF9, 0x0C, 0xD3, 0x05, 0x4C, 0x1F, 0x06, 0xE1, 0x14, 0xA5, 0x3F, 0x83, 0x54, 0x2E, 0x9A, 0xA5, 0x55, 0x6A, 0xB0, 0x8C, 0x68, 0x55, 0x3A, 0xA4, 0x75,
0xA0, 0x11, 0x75, 0xE3, 0xE2, 0x8C, 0x8F, 0xEC, 0x6B, 0xE4, 0x98, 0x36, 0xC4, 0x2C, 0x83, 0x1D, 0x16, 0xBF, 0x8A, 0xD7, 0x34, 0xF9, 0x15, 0x22, 0xE4, 0xAA, 0xAE, 0x1F, 0x55, 0xD9, 0x90, 0x6D,
0x57, 0x87, 0x7C, 0x57, 0x1F, 0xCE, 0x13, 0xE6, 0x47, 0x9A, 0x78, 0x0D, 0x80, 0x4F, 0x62, 0xD8, 0xB4, 0x1D, 0x9B, 0x76, 0x9F, 0x1D, 0xD1, 0x63, 0xBB, 0x6F, 0x15, 0x50, 0xF1, 0x44, 0xCC, 0x63,
0x70, 0x78, 0x0E, 0x64, 0xA6, 0x81, 0x3A, 0x65, 0x05, 0xCF, 0x87, 0x67, 0xBC, 0x99, 0x4C, 0x56, 0x93, 0x39, 0x0F, 0x4F, 0x78, 0xC6, 0x84, 0x18, 0xA2, 0xCF, 0x67, 0x18, 0x2C, 0x60, 0xC4, 0x31,
0x4B, 0xF1, 0x02, 0xB6, 0x46, 0xF8, 0xD0, 0x93, 0x05, 0x85, 0xE4, 0x4E, 0x5B, 0x84, 0x31, 0x28, 0x08, 0xA6, 0x00, 0x8D, 0xA8, 0x95, 0x90, 0x33, 0x3E, 0xB2, 0xAF, 0x91, 0x1A, 0xAD, 0x8B, 0x59,
0x4D, 0x8D, 0x97, 0x10, 0xC2, 0x2F, 0xCC, 0x41, 0xAB, 0x86, 0xB5, 0x1E, 0xDC, 0x89, 0xD4, 0xAD, 0x06, 0xAB, 0x95, 0x87, 0x7C, 0x57, 0xBF, 0x9C, 0xC7, 0xCC, 0x0B, 0x35, 0x71, 0xAF, 0x80, 0x4F,
0x86, 0x2B, 0x24, 0xC5, 0x7C, 0xC8, 0x0A, 0x40, 0x88, 0x7C, 0xB2, 0x2C, 0x91, 0x37, 0xFB, 0x7F, 0x62, 0xD8, 0x70, 0x78, 0x0E, 0x84, 0xBA, 0xBE, 0x3A, 0x65, 0x05, 0xDF, 0x0F, 0xCF, 0x78, 0x3B,
0x26, 0x46, 0x90, 0x4C, 0x56, 0x0B, 0x90, 0x63, 0x63, 0x46, 0xD9, 0x8B, 0x88, 0xE2, 0xED, 0x2F, 0x99, 0xAC, 0x96, 0xE2, 0x46, 0xB7, 0x46, 0xF8, 0xD0, 0xA3, 0x05, 0x85, 0x68, 0x51, 0x5B, 0x04,
0xD7, 0xA7, 0x20, 0x3F, 0x59, 0x28, 0xEA, 0x8D, 0x30, 0x8E, 0x69, 0xFA, 0xFB, 0xF9, 0xEB, 0x57, 0x11, 0x08, 0x4D, 0x85, 0xE7, 0x24, 0xC2, 0x2E, 0xCC, 0x41, 0xAA, 0x86, 0x95, 0x1E, 0xBC, 0x89,
0x43, 0x66, 0x70, 0x76, 0x82, 0xA8, 0x9F, 0xA8, 0xA9, 0x93, 0xE0, 0x74, 0x58, 0xC9, 0xA6, 0x20, 0x58, 0xB0, 0x82, 0x2B, 0xC4, 0xF9, 0x7C, 0x88, 0x0A, 0x80, 0x89, 0x7C, 0xB2, 0xCC, 0xB9, 0x37,
0x8B, 0x61, 0xA7, 0x78, 0xB4, 0xFE, 0x66, 0x8A, 0x39, 0x95, 0x51, 0xE9, 0x13, 0x49, 0x8F, 0xA3, 0xFB, 0x7F, 0x26, 0x86, 0x1F, 0x4F, 0x56, 0x0B, 0xE0, 0x63, 0x7D, 0x46, 0xD9, 0x8B, 0x90, 0xE2,
0x0F, 0x38, 0x75, 0x2C, 0xCD, 0x2D, 0x4D, 0x7D, 0x55, 0xEE, 0x40, 0xEA, 0x53, 0xC9, 0xDA, 0x60, 0xEB, 0x2F, 0xD7, 0x27, 0xC0, 0x3F, 0x99, 0x79, 0xEA, 0xF5, 0x20, 0x8A, 0x68, 0xF2, 0xFB, 0xF9,
0x08, 0xAD, 0x5B, 0x90, 0xC6, 0xD8, 0xF7, 0xC8, 0x82, 0x30, 0xC1, 0x82, 0x54, 0x48, 0xB1, 0xD8, 0xEB, 0x57, 0x43, 0x66, 0x70, 0x72, 0x02, 0xAB, 0x9F, 0xA8, 0xA1, 0x93, 0xA0, 0x74, 0x50, 0x8A,
0x32, 0x23, 0x02, 0xD5, 0x8C, 0x30, 0xCF, 0x06, 0xFF, 0x50, 0x1B, 0x41, 0xE5, 0x8A, 0x95, 0x54, 0xA6, 0x20, 0x8A, 0x61, 0x27, 0x78, 0x56, 0xFF, 0x76, 0x8A, 0x31, 0x95, 0x51, 0xEA, 0x13, 0x41,
0x5E, 0x28, 0x91, 0x5B, 0xDA, 0xE0, 0xBA, 0xD5, 0x00, 0xFC, 0x58, 0x3D, 0xD7, 0x3B, 0x55, 0x7D, 0x8F, 0xA3, 0x0F, 0xF8, 0xEE, 0x58, 0x92, 0x69, 0x9A, 0x7A, 0xF7, 0xEE, 0x40, 0xE8, 0x53, 0x8A,
0xB7, 0x34, 0xBB, 0x81, 0x25, 0xA0, 0xC1, 0xF8, 0x45, 0xBF, 0xD5, 0x91, 0x6B, 0x43, 0x95, 0x45, 0xDA, 0x60, 0x08, 0xAD, 0x5A, 0x10, 0xC6, 0xD8, 0xF7, 0x88, 0x82, 0x30, 0xC0, 0x82, 0x50, 0x48,
0x47, 0x47, 0x75, 0xD0, 0x4B, 0x4B, 0xE7, 0x39, 0x26, 0x32, 0x30, 0xC1, 0x74, 0x36, 0x1A, 0x5A, 0xD1, 0xD8, 0x22, 0x22, 0x02, 0xD1, 0x0C, 0x31, 0x70, 0x07, 0xFB, 0x50, 0x19, 0x41, 0x2A, 0x8C,
0x83, 0xE8, 0x24, 0x5F, 0x4D, 0x70, 0x6A, 0x10, 0x1D, 0x1F, 0xEB, 0xC4, 0xB4, 0x81, 0xEB, 0x02, 0xA9, 0x59, 0x96, 0x79, 0x91, 0x5B, 0x5A, 0xE7, 0xB2, 0x55, 0x07, 0xFC, 0x58, 0x35, 0x93, 0x3B,
0x7A, 0x5D, 0xF6, 0x7F, 0x8C, 0x3E, 0x37, 0x70, 0xAB, 0x45, 0x07, 0x58, 0x9C, 0x95, 0xE7, 0xEF, 0x55, 0x7C, 0xB7, 0x24, 0xBB, 0x8E, 0x39, 0xA5, 0xC1, 0xF8, 0x43, 0xBF, 0xD5, 0x91, 0x6A, 0x43,
0x46, 0x52, 0x65, 0x78, 0x31, 0x09, 0x4E, 0x48, 0xF5, 0x3C, 0x8A, 0x43, 0xDA, 0xE1, 0x84, 0xB4, 0x95, 0x44, 0x4F, 0x9F, 0x56, 0x41, 0x2E, 0x2D, 0x9D, 0xC7, 0x98, 0x48, 0xC0, 0x10, 0x83, 0xDD,
0xD1, 0x27, 0x56, 0xFA, 0x21, 0xDB, 0x70, 0xC0, 0x8F, 0x18, 0x8E, 0x8D, 0xDE, 0xC8, 0xC1, 0xFB, 0x18, 0xA2, 0xD7, 0xF8, 0x28, 0x5B, 0x4D, 0x50, 0x6A, 0x10, 0xD7, 0x6A, 0x3A, 0x31, 0x6D, 0xA0,
0xB6, 0xB8, 0x74, 0x78, 0x9B, 0x8D, 0x1E, 0xE4, 0x95, 0xED, 0xC8, 0x5F, 0x5B, 0xC3, 0x61, 0xF6, 0xBA, 0x80, 0x5E, 0x95, 0xFD, 0x1F, 0xE3, 0xCF, 0x75, 0xAC, 0xDD, 0xE8, 0x00, 0x8B, 0x93, 0xF2,
0x3D, 0x7C, 0x0A, 0xBE, 0x17, 0xA3, 0x5D, 0xD9, 0x22, 0x12, 0x5F, 0xE3, 0xB5, 0xA6, 0x5D, 0x39, 0xFC, 0x74, 0x24, 0x45, 0x86, 0x67, 0xA7, 0x60, 0x84, 0x54, 0xCB, 0xA3, 0x18, 0xA4, 0x1D, 0x46,
0x70, 0x01, 0xDF, 0x7B, 0xED, 0xF0, 0x28, 0xB8, 0x01, 0x41, 0x3C, 0x9A, 0x12, 0x79, 0xBB, 0xD6, 0x48, 0x1B, 0x69, 0xF0, 0x5F, 0x61, 0x89, 0x6C, 0xC3, 0x01, 0x4B, 0x62, 0x38, 0x36, 0xDA, 0x23,
0xCC, 0x49, 0x94, 0x5B, 0x46, 0x3C, 0x8B, 0x85, 0x86, 0xDA, 0xC9, 0xF9, 0x73, 0x99, 0x3D, 0x7F, 0x07, 0xDF, 0xDB, 0xE2, 0xD1, 0xE1, 0x6D, 0x36, 0xDA, 0x90, 0x57, 0xB6, 0x23, 0x3F, 0x6D, 0x0D,
0x92, 0xE9, 0xF3, 0xA7, 0xDC, 0x87, 0x93, 0xE2, 0xD5, 0x83, 0xE5, 0xD5, 0x40, 0xD9, 0x88, 0xAE, 0x87, 0xD9, 0xF7, 0xB0, 0x2A, 0x78, 0xD5, 0x46, 0xBB, 0xB2, 0x85, 0x2F, 0xBE, 0xC6, 0x67, 0x45,
0x81, 0x3D, 0x70, 0x07, 0xA6, 0x30, 0x14, 0xE5, 0x75, 0x5C, 0x2B, 0xF6, 0xA6, 0xC5, 0xD6, 0x74, 0xBB, 0x72, 0xE0, 0x01, 0xD6, 0xF7, 0xDA, 0xE1, 0x7E, 0x70, 0x03, 0x82, 0xF8, 0x6A, 0x4A, 0xF4,
0xA5, 0xE4, 0x52, 0x76, 0xA2, 0x6B, 0xB8, 0xF2, 0xC6, 0x64, 0x83, 0xF0, 0x77, 0x4A, 0x1A, 0xF8, 0xED, 0x4A, 0x23, 0xDB, 0xA4, 0xAC, 0x42, 0xF1, 0x38, 0x16, 0x1A, 0x2A, 0x47, 0xE7, 0xCF, 0x65,
0xB7, 0x3A, 0x8D, 0xD9, 0x37, 0x90, 0xDA, 0xC6, 0x80, 0xA3, 0x23, 0x65, 0xC4, 0x76, 0xF7, 0xF7, 0xFC, 0xFC, 0x49, 0x06, 0xD0, 0x9F, 0x32, 0x2B, 0x4E, 0xF2, 0xDB, 0x0C, 0xCB, 0xAB, 0x81, 0x52,
0xEF, 0xA8, 0x18, 0xB6, 0x2E, 0xA9, 0x14, 0xE5, 0x17, 0xEE, 0x74, 0x9F, 0x3F, 0x1F, 0x01, 0x8D, 0xDB, 0xAE, 0x80, 0x46, 0x70, 0x13, 0xA6, 0x90, 0x14, 0x39, 0x56, 0xAB, 0xE4, 0xE5, 0x6E, 0x51,
0x82, 0xDA, 0x0D, 0x0D, 0x90, 0x63, 0x79, 0xAF, 0xD2, 0x35, 0xF7, 0xB3, 0x37, 0xEB, 0xF8, 0x6D, 0xED, 0x2E, 0x65, 0x71, 0x4A, 0x71, 0xBB, 0x82, 0x2B, 0x6F, 0x4C, 0x36, 0x08, 0xBF, 0xA6, 0x52,
0x9A, 0x2C, 0x69, 0xCA, 0xAE, 0xEB, 0x84, 0x6F, 0x46, 0xE9, 0x4F, 0xEB, 0xA0, 0x6A, 0x96, 0x98, 0xC7, 0x3F, 0xFF, 0xA9, 0xCF, 0xBE, 0x01, 0xDF, 0x36, 0x06, 0x3C, 0x7D, 0xAA, 0x8C, 0xD8, 0xEE,
0xB2, 0x03, 0x1E, 0x0E, 0x52, 0xE0, 0xE9, 0xFD, 0x7C, 0xA0, 0x84, 0x2F, 0x1F, 0x73, 0x75, 0xB2, 0xFE, 0xFE, 0x1D, 0x45, 0xC3, 0xD6, 0xE5, 0x2E, 0x45, 0x46, 0x87, 0xC5, 0xF3, 0xF3, 0xE7, 0x23,
0x7E, 0xAE, 0xA9, 0xDC, 0xF9, 0x24, 0x77, 0x37, 0x3F, 0x11, 0xC5, 0x80, 0x9F, 0x43, 0xE4, 0x60, 0xD8, 0xA3, 0xD8, 0xED, 0x86, 0x0C, 0xC8, 0xB1, 0xBC, 0x57, 0xE9, 0x9A, 0x7B, 0xE9, 0xDB, 0x75,
0xB4, 0xCE, 0xFD, 0x53, 0x95, 0xD1, 0xA4, 0xA6, 0x63, 0x75, 0x82, 0x40, 0xD5, 0x12, 0xA3, 0x42, 0xF4, 0x2E, 0x89, 0x97, 0x34, 0x61, 0xD7, 0x55, 0xC2, 0xEB, 0x5B, 0xFA, 0x71, 0x15, 0x84, 0xCD,
0x3B, 0x2E, 0x2D, 0x2C, 0x11, 0x7F, 0x50, 0xC7, 0x4B, 0xA3, 0xC9, 0xC0, 0x5E, 0xB2, 0x4D, 0x7B, 0x12, 0x53, 0x76, 0xC0, 0xC3, 0x41, 0x0A, 0x3C, 0xBD, 0x9F, 0x0D, 0x94, 0xF0, 0xE5, 0xD7, 0x4C,
0xC9, 0xA4, 0xBD, 0x0C, 0x37, 0xED, 0x25, 0xDB, 0xB6, 0x97, 0x47, 0x59, 0x8A, 0x62, 0x27, 0x3D, 0xA0, 0xAC, 0x9F, 0x2B, 0x2A, 0x75, 0x3E, 0xC9, 0x82, 0xE9, 0x27, 0xA2, 0xA8, 0xF0, 0x73, 0xF0,
0x11, 0x92, 0x7B, 0x18, 0x5C, 0x21, 0x30, 0x43, 0x0C, 0x96, 0x3F, 0x2D, 0x0C, 0xB3, 0x1E, 0xDA, 0x1D, 0x8C, 0x56, 0xB9, 0x85, 0x2A, 0x13, 0x9A, 0x54, 0x74, 0xCC, 0x4F, 0x10, 0xA8, 0x9A, 0x64,
0x85, 0x87, 0x96, 0xD4, 0xE2, 0xE6, 0xE4, 0xF0, 0xA1, 0x78, 0xC1, 0xE0, 0x8C, 0xC6, 0xE5, 0xF2, 0x94, 0xF6, 0x8E, 0x4B, 0x0B, 0x5D, 0xC4, 0x0F, 0x94, 0xF2, 0x42, 0x6D, 0x52, 0xD0, 0x98, 0x74,
0xF9, 0x2D, 0xFE, 0xEB, 0x08, 0xDB, 0x82, 0xFE, 0xFB, 0xC5, 0xE6, 0x52, 0xF9, 0xB9, 0x40, 0xAA, 0x53, 0x63, 0x52, 0xA9, 0x31, 0xC3, 0x4D, 0x8D, 0x49, 0xB7, 0x35, 0xE6, 0x51, 0xBA, 0xA2, 0xE8,
0xB5, 0xA3, 0x56, 0xA8, 0x69, 0x91, 0xC9, 0x6C, 0xBF, 0x75, 0xA5, 0x7A, 0x59, 0x25, 0xBC, 0x2B, 0x49, 0x4F, 0x38, 0xE5, 0x1E, 0xBA, 0x57, 0x70, 0xCD, 0xE0, 0x85, 0xE5, 0x47, 0x0B, 0x1D, 0x6D,
0x82, 0xCA, 0x4A, 0x41, 0x0D, 0x72, 0x49, 0x6D, 0xF4, 0x95, 0xCA, 0x52, 0x68, 0x89, 0xA2, 0x2E, 0x13, 0xF5, 0xA2, 0x89, 0x9A, 0xD4, 0xE2, 0xEA, 0xE4, 0xF0, 0xA1, 0xF8, 0x40, 0xF7, 0x8C, 0xCA,
0xCA, 0xE0, 0xDD, 0xEA, 0x68, 0xA8, 0xDA, 0xF8, 0x70, 0xAD, 0xDA, 0x8F, 0xEF, 0xA3, 0x14, 0x6B, 0xE5, 0xF2, 0xF9, 0x2D, 0xFE, 0xE9, 0x08, 0xDD, 0x82, 0xFE, 0xFB, 0x79, 0xE7, 0x42, 0xF8, 0x39,
0x6F, 0x3C, 0xCC, 0xF7, 0x72, 0xD5, 0x80, 0x98, 0x3C, 0x25, 0xA4, 0x4F, 0x70, 0x73, 0xF7, 0x40, 0x43, 0xCA, 0xD9, 0xA3, 0x96, 0x8B, 0x69, 0x1E, 0xCB, 0x6C, 0x5F, 0xE4, 0x52, 0xED, 0xAC, 0xE2,
0x20, 0xC5, 0x73, 0x26, 0x75, 0x52, 0xFC, 0x94, 0xE0, 0xA9, 0x90, 0x56, 0xF1, 0x12, 0x5A, 0x98, 0xE0, 0x15, 0x46, 0xA5, 0x05, 0xA3, 0x06, 0x19, 0xA7, 0x36, 0xFA, 0x0A, 0x61, 0xC9, 0xA5, 0x44,
0x41, 0x80, 0xCF, 0x32, 0x75, 0x47, 0x4F, 0x1C, 0xCC, 0x68, 0x21, 0x83, 0x35, 0x72, 0x97, 0x55, 0x11, 0x17, 0x65, 0xF0, 0x6E, 0x71, 0x34, 0x54, 0x69, 0x7C, 0xB8, 0x54, 0xED, 0xC7, 0xF7, 0x51,
0x6B, 0xD6, 0x24, 0x4B, 0xB4, 0xDA, 0xC6, 0x86, 0x4E, 0x6D, 0xF4, 0x5B, 0xA2, 0xB1, 0x44, 0x13, 0x82, 0xB5, 0xD7, 0x23, 0x66, 0xE5, 0x61, 0xD5, 0x25, 0x86, 0xC7, 0x84, 0xF4, 0x09, 0xD6, 0x8B,
0x6F, 0xCF, 0x84, 0xE5, 0xF1, 0x9D, 0x3F, 0x3A, 0x80, 0x5D, 0xB9, 0x9D, 0x5C, 0x8D, 0xF4, 0x7B, 0x0F, 0xB8, 0x52, 0x3C, 0xBA, 0x52, 0x27, 0x45, 0xC7, 0x04, 0x0F, 0x9A, 0xB4, 0x92, 0x95, 0xD0,
0x27, 0xF0, 0xFD, 0xF7, 0x0A, 0x3D, 0x72, 0x8F, 0xA5, 0x4C, 0xC7, 0xA4, 0xB9, 0x63, 0x92, 0x88, 0x82, 0x14, 0x5C, 0x7C, 0x9A, 0xAA, 0x45, 0x42, 0x51, 0xD0, 0xD0, 0x02, 0x06, 0x6B, 0x64, 0x26,
0x07, 0x7D, 0xE9, 0xA2, 0x4E, 0x7E, 0x15, 0x37, 0x5A, 0x80, 0x5D, 0x38, 0x26, 0x99, 0xA2, 0x4E, 0xAB, 0xD2, 0xA8, 0x48, 0x92, 0x68, 0x95, 0x8D, 0x1A, 0x51, 0x65, 0xF4, 0x5B, 0xAC, 0xB1, 0x58,
0x8B, 0xAC, 0x08, 0xEC, 0xB1, 0x92, 0x3A, 0xF2, 0x41, 0xC0, 0x52, 0xBA, 0x05, 0x33, 0xCF, 0x3D, 0x13, 0x17, 0x72, 0x82, 0xE2, 0x44, 0xD0, 0x1B, 0x1D, 0xC0, 0xAE, 0xA8, 0x50, 0x97, 0x7D, 0xFD,
0x0F, 0x81, 0x85, 0x31, 0xA0, 0xC7, 0x49, 0x7A, 0x7D, 0x00, 0x36, 0x8C, 0xA9, 0x82, 0x57, 0x8E, 0xDE, 0x09, 0xBC, 0xA4, 0x5F, 0xDA, 0x8F, 0xAC, 0xB2, 0x14, 0x01, 0x99, 0x54, 0x77, 0x0C, 0x13,
0x69, 0xE4, 0x5E, 0xD1, 0x32, 0x85, 0x80, 0xCE, 0xEA, 0xE4, 0x79, 0x0E, 0x8E, 0xEF, 0xE9, 0x42, 0xF1, 0xEC, 0x30, 0x59, 0x54, 0xC9, 0xAF, 0xE2, 0x45, 0xF3, 0xB1, 0x0B, 0xC7, 0xC4, 0x53, 0x94,
0xF6, 0x03, 0x4A, 0x12, 0xAF, 0xA2, 0x08, 0xFC, 0xF6, 0x06, 0xE8, 0x49, 0x0E, 0x03, 0x95, 0x1E, 0x69, 0x11, 0x17, 0x81, 0x3E, 0x96, 0x82, 0x47, 0x3E, 0x08, 0x48, 0x4A, 0xB7, 0x60, 0x66, 0xD1,
0x1C, 0xCF, 0x02, 0xD2, 0xD5, 0x72, 0x05, 0x75, 0x28, 0xCF, 0x1B, 0x70, 0x99, 0x78, 0x18, 0xD3, 0xE7, 0x21, 0xB0, 0x30, 0x06, 0xE4, 0x38, 0x4E, 0xAE, 0x0F, 0xC0, 0x86, 0x31, 0x65, 0xF0, 0xCA,
0xB5, 0xF6, 0x5F, 0xAF, 0x5F, 0xFD, 0xCE, 0xD8, 0xF2, 0x1D, 0xBD, 0x58, 0x41, 0xFA, 0x6A, 0x84, 0xC9, 0x8F, 0xAC, 0x16, 0x2D, 0x13, 0x70, 0xE9, 0xAC, 0x4A, 0x9E, 0x67, 0xE0, 0x78, 0x99, 0x18,
0x43, 0xD2, 0xE4, 0xCA, 0xFC, 0x54, 0xBC, 0xCE, 0x3A, 0x04, 0x32, 0xF6, 0xEB, 0xE5, 0xA6, 0x7A, 0xE2, 0x1F, 0x10, 0x92, 0x68, 0x15, 0x86, 0x60, 0xB7, 0x37, 0x40, 0x4F, 0x32, 0x18, 0x28, 0xF4,
0x21, 0x4F, 0x62, 0xC0, 0x18, 0x34, 0xA9, 0xD1, 0x68, 0xE0, 0x06, 0x0F, 0x24, 0x9B, 0x08, 0x4E, 0x60, 0x78, 0x16, 0x10, 0xB0, 0x16, 0x2B, 0xA8, 0x43, 0x79, 0xE4, 0x80, 0xCB, 0x44, 0xC3, 0x88,
0x6C, 0x49, 0x1F, 0xD3, 0x78, 0x92, 0x04, 0xF4, 0xFD, 0xBB, 0xD3, 0x3A, 0xD3, 0x45, 0xA7, 0xD8, 0xAE, 0xB5, 0xFF, 0x7A, 0xFD, 0xEA, 0x77, 0xC6, 0x96, 0xA7, 0xF4, 0x72, 0x05, 0x01, 0xAC, 0x11,
0xB9, 0x53, 0x3A, 0xD4, 0xDC, 0xCE, 0x88, 0x1B, 0x49, 0x0C, 0x84, 0x05, 0xD7, 0x98, 0x10, 0xD2, 0x0C, 0x49, 0x83, 0x0B, 0xF3, 0xB1, 0xB8, 0x21, 0x3B, 0x84, 0x6D, 0xEC, 0x97, 0xCB, 0x4D, 0xF1,
0x09, 0x24, 0x67, 0x33, 0x3A, 0x2C, 0x32, 0x20, 0xFD, 0xC6, 0x1B, 0x0E, 0xE3, 0x06, 0x1F, 0x80, 0x42, 0x9A, 0x44, 0x80, 0x31, 0x48, 0x52, 0xBD, 0x5E, 0xC7, 0x12, 0x0F, 0x84, 0x9B, 0x08, 0x4E,
0xF9, 0x34, 0xF0, 0xA4, 0xEE, 0x58, 0x16, 0xB6, 0x89, 0x04, 0xF2, 0xE9, 0x8E, 0xDC, 0xFC, 0x3F, 0x54, 0xB9, 0x6B, 0x34, 0xC2, 0x9A, 0xD9, 0xFB, 0xD3, 0x93, 0x2A, 0xD3, 0x45, 0xA7, 0x28, 0xFF,
0xCF, 0xDE, 0xFC, 0x01, 0x71, 0x37, 0x85, 0x84, 0x1E, 0xA7, 0x66, 0xCB, 0x24, 0xCE, 0xE8, 0x39, 0x29, 0x1D, 0x6A, 0x74, 0x67, 0x44, 0xF5, 0x38, 0x82, 0x8D, 0xF9, 0xD7, 0x18, 0x12, 0xD2, 0x09,
0xBD, 0x62, 0xBA, 0xDE, 0xF7, 0x2C, 0x5B, 0x99, 0xFC, 0xEE, 0x55, 0x5D, 0xEF, 0xD7, 0x41, 0xDC, 0x84, 0x67, 0x33, 0x3A, 0xCC, 0x63, 0x20, 0xFD, 0xA6, 0x39, 0x1C, 0x46, 0x75, 0x3E, 0x00, 0x23,
0x59, 0x12, 0xD1, 0x46, 0x94, 0xCC, 0xEA, 0x79, 0x97, 0x6E, 0xBC, 0xFC, 0xF0, 0x22, 0x4D, 0x21, 0x6A, 0xA0, 0x49, 0xD5, 0xB1, 0x2C, 0x6C, 0x13, 0x21, 0xE4, 0xF1, 0x8E, 0xE8, 0xFC, 0x3F, 0xCF,
0x0C, 0xE8, 0xC0, 0x65, 0xC4, 0x72, 0x49, 0xE3, 0x3A, 0xF9, 0xED, 0xC5, 0x39, 0x90, 0x6C, 0x40, 0xDE, 0xBE, 0x01, 0xBF, 0x9B, 0x40, 0x48, 0x8F, 0x53, 0xD3, 0x65, 0x1C, 0xA5, 0xF4, 0x9C, 0x5E,
0x5E, 0x05, 0x4D, 0x19, 0xB0, 0xBC, 0xBE, 0x21, 0x02, 0xB1, 0xBB, 0x2F, 0x65, 0x7C, 0xD0, 0x2A, 0x31, 0x5D, 0xEF, 0x37, 0x2D, 0x5B, 0x99, 0x7C, 0xFA, 0xAA, 0xAA, 0xF7, 0xAB, 0xC0, 0xEE, 0x34,
0xF2, 0x03, 0x07, 0x5D, 0x78, 0x16, 0x2C, 0x20, 0x2C, 0x0C, 0xD6, 0x22, 0xC8, 0xE8, 0x37, 0x7B, 0x0E, 0x69, 0x3D, 0x8C, 0x67, 0xD5, 0xAC, 0x4B, 0x37, 0x5E, 0x7E, 0x78, 0x81, 0x25, 0x40, 0x20,
0x27, 0x57, 0x0F, 0x54, 0xF5, 0x46, 0xE5, 0xEC, 0x34, 0x17, 0xCB, 0x7E, 0xFB, 0x4A, 0x67, 0x30, 0xB2, 0x7E, 0x8B, 0x58, 0x2E, 0x69, 0x54, 0x25, 0xBF, 0xBD, 0x38, 0x87, 0x2D, 0x1B, 0x10, 0x59,
0x87, 0x7B, 0xEC, 0x46, 0xB9, 0xF3, 0x2F, 0x4F, 0x01, 0x22, 0x4A, 0x06, 0xA2, 0xAC, 0x41, 0xBD, 0x41, 0x53, 0x0A, 0x24, 0xAF, 0x6E, 0xB0, 0x40, 0x1C, 0x18, 0x48, 0x1E, 0x1F, 0xD4, 0x8A, 0xEC,
0x79, 0x99, 0xA4, 0x8B, 0xE7, 0x3E, 0xF3, 0x07, 0xAC, 0xE1, 0x2F, 0x97, 0x48, 0xAC, 0xB0, 0x4E, 0x0C, 0x43, 0x17, 0x96, 0x05, 0x53, 0x08, 0x0B, 0x9D, 0xB5, 0x70, 0x32, 0xFA, 0xCD, 0xDE, 0xC9,
0x35, 0xDB, 0x2E, 0x43, 0x65, 0x0C, 0xA1, 0x32, 0x3E, 0xC9, 0xF1, 0x1F, 0xC4, 0x10, 0x24, 0x65, 0xE5, 0x33, 0x5A, 0xBD, 0x5E, 0x3A, 0x8E, 0xCD, 0xD8, 0xB2, 0x5F, 0xBF, 0x92, 0x19, 0xCC, 0xE1,
0xE2, 0x4E, 0x3F, 0xC6, 0x9F, 0xC1, 0x0B, 0xAB, 0x15, 0x5D, 0x28, 0xBD, 0xE8, 0x19, 0x29, 0x81, 0x16, 0xBB, 0x5E, 0x1C, 0x26, 0xC8, 0x83, 0x85, 0x90, 0x92, 0x81, 0x48, 0x6C, 0x50, 0x6E, 0x5E,
0x27, 0x46, 0x28, 0xC2, 0xA7, 0x51, 0xAE, 0x57, 0x1E, 0xC3, 0x00, 0xD7, 0xB7, 0x01, 0xE8, 0xB7, 0xC6, 0xC9, 0xE2, 0xB9, 0xC7, 0xBC, 0x01, 0xAB, 0x7B, 0xCB, 0x25, 0x6E, 0x56, 0x68, 0xA7, 0x1A,
0xB8, 0x42, 0xB4, 0x43, 0xCB, 0x07, 0x91, 0x94, 0xD8, 0xDB, 0x37, 0x67, 0xE7, 0x58, 0x53, 0x70, 0x6F, 0x17, 0xAE, 0x32, 0x02, 0x57, 0x19, 0x1D, 0x65, 0xF8, 0x0F, 0x22, 0x70, 0x92, 0x32, 0x74,
0x38, 0x84, 0x4B, 0x2E, 0x6A, 0x08, 0x16, 0x36, 0x20, 0x5E, 0xBD, 0xB8, 0x04, 0x88, 0xAF, 0xC0, 0xA7, 0x1F, 0xA3, 0xCF, 0x60, 0x85, 0xD5, 0x9C, 0x2E, 0x90, 0x56, 0xF4, 0x8C, 0x14, 0xC0, 0x43,
0x3F, 0x51, 0x50, 0x70, 0xE4, 0x8E, 0x38, 0x33, 0x21, 0x46, 0x99, 0x84, 0xEB, 0x37, 0x20, 0x9A, 0x23, 0x10, 0xEE, 0xD3, 0x28, 0xD6, 0x2B, 0x4E, 0x76, 0x80, 0xEA, 0xDB, 0x00, 0xF4, 0xDB, 0x6A,
0x9C, 0x2E, 0x30, 0xB1, 0xE5, 0x8A, 0x6F, 0x5F, 0xE6, 0x05, 0x20, 0xEA, 0x8D, 0x1F, 0xD0, 0xA0, 0xA9, 0xE2, 0xBC, 0x43, 0xDC, 0x75, 0xC9, 0xB9, 0x77, 0x6F, 0xCF, 0xCE, 0x31, 0xBB, 0xE0, 0xF0,
0x29, 0x0B, 0xB6, 0xFF, 0x80, 0xDA, 0x69, 0xBF, 0x39, 0x09, 0xF6, 0x0B, 0x91, 0x1D, 0xF0, 0x82, 0x08, 0xE7, 0x60, 0x69, 0x6A, 0x5D, 0x3E, 0xC0, 0x87, 0xBD, 0xF8, 0x0A, 0xAB, 0xBC, 0x02, 0x9B,
0x77, 0xC9, 0x58, 0x43, 0x21, 0x1F, 0x63, 0xF1, 0xFA, 0x12, 0x5F, 0x34, 0xAE, 0x5B, 0x3A, 0x56, 0x45, 0x41, 0xE8, 0x91, 0x62, 0xE2, 0x68, 0x86, 0x18, 0x45, 0x68, 0xAE, 0xDF, 0x00, 0xBB, 0xB2,
0x5B, 0xB7, 0xB7, 0x06, 0x26, 0x76, 0x40, 0x7A, 0x8C, 0xE3, 0x54, 0x33, 0xE2, 0x46, 0x33, 0x8C, 0xBD, 0x82, 0xDA, 0x2D, 0x57, 0xBC, 0xA8, 0x99, 0xA5, 0x85, 0x28, 0x4B, 0x9E, 0x4F, 0xFD, 0x86,
0x72, 0xC5, 0xAF, 0x3F, 0x6E, 0xE5, 0x47, 0xE8, 0x95, 0x3C, 0x52, 0x3A, 0x1C, 0x21, 0x4A, 0x5B, 0x4C, 0xE3, 0xFE, 0x03, 0x32, 0xAA, 0xFD, 0x2A, 0x26, 0x58, 0x22, 0xD8, 0x78, 0xC0, 0x32, 0xDE,
0x90, 0xCB, 0xC1, 0xF8, 0x83, 0x76, 0x1D, 0x6D, 0xD8, 0xB5, 0xDE, 0xF7, 0x23, 0x08, 0xFA, 0x75, 0xC5, 0x77, 0x0D, 0x19, 0x5F, 0xC3, 0x94, 0xF6, 0x25, 0xDE, 0x67, 0xAE, 0x5A, 0x3A, 0xE6, 0x60,
0xF2, 0x2C, 0xD6, 0x28, 0x9A, 0xAD, 0x86, 0x75, 0x28, 0xA8, 0x4B, 0xF0, 0x84, 0x80, 0xF9, 0x46, 0xB7, 0xB7, 0x06, 0x0F, 0xF6, 0x8A, 0x0A, 0xB6, 0xBD, 0xB1, 0xF1, 0x38, 0xE2, 0xCD, 0x8A, 0xCE,
0xC2, 0x56, 0x99, 0x7E, 0x5B, 0x5A, 0xEB, 0xEF, 0x61, 0x40, 0x9F, 0x45, 0x11, 0xCA, 0xB7, 0xD8, 0x71, 0x0D, 0x1B, 0x96, 0x47, 0x49, 0x8D, 0xA9, 0x3E, 0x0E, 0xBD, 0x47, 0x08, 0xA4, 0x3C, 0xDE,
0xEF, 0xB7, 0xB6, 0xF7, 0xFB, 0x8F, 0x8E, 0x8A, 0xA3, 0x88, 0xC6, 0x24, 0x4A, 0x70, 0x93, 0xA0, 0x3A, 0xEC, 0x5A, 0x0A, 0x25, 0x92, 0xCB, 0xC1, 0xF8, 0x83, 0x06, 0xA1, 0xBC, 0xA9, 0xB2, 0x71,
0xA4, 0x85, 0xBF, 0x38, 0x3A, 0xAC, 0x3E, 0x1E, 0x93, 0x3A, 0xE0, 0x3E, 0x11, 0x5E, 0x92, 0x06, 0xD0, 0xFB, 0xA2, 0x59, 0xEA, 0xFD, 0xED, 0x06, 0x9D, 0xB8, 0xBA, 0x33, 0xFD, 0xB6, 0x50, 0x78,
0xFA, 0x03, 0x42, 0x37, 0xDD, 0x3F, 0x54, 0x79, 0x2B, 0x24, 0xE7, 0xB2, 0x7C, 0xAD, 0x76, 0x48, 0x08, 0x78, 0xDE, 0xAC, 0x16, 0x63, 0x10, 0x12, 0x6E, 0x71, 0x0B, 0x4D, 0x40, 0xB6, 0xCB, 0xD8,
0xF0, 0xBD, 0xDA, 0x03, 0xAB, 0x14, 0x67, 0xAA, 0xBB, 0x27, 0x96, 0x1C, 0x29, 0x3C, 0xDE, 0x4D, 0x10, 0xAC, 0xB9, 0x14, 0x93, 0x23, 0x36, 0xD0, 0xC1, 0xD8, 0x5A, 0xA4, 0x16, 0x65, 0x45, 0xF1,
0xCE, 0x1B, 0xF2, 0xD2, 0x07, 0xF6, 0x07, 0x18, 0xF6, 0xCB, 0xF3, 0x12, 0x7C, 0x05, 0x16, 0xD2, 0xA8, 0x80, 0x05, 0xBB, 0x7B, 0xF7, 0x2B, 0xBA, 0xFA, 0xDC, 0x7A, 0xA0, 0x2C, 0x83, 0xFA, 0xD1,
0xD3, 0x97, 0x1F, 0x9E, 0xA8, 0x3B, 0x2F, 0x2F, 0x3F, 0xBC, 0xF9, 0x5A, 0x3F, 0xE0, 0xB5, 0xF6, 0xBC, 0x82, 0x8E, 0x14, 0x78, 0x09, 0xAE, 0xE1, 0x5F, 0x14, 0xFD, 0x61, 0x8D, 0x98, 0xA4, 0xA6,
0xC5, 0x11, 0x0A, 0x4A, 0x55, 0x9E, 0xD9, 0x80, 0x7B, 0x7F, 0x14, 0x0B, 0xF8, 0x9F, 0x82, 0x40, 0x60, 0x80, 0xBD, 0xAF, 0xE3, 0x88, 0xCD, 0xA1, 0x0B, 0x62, 0xBC, 0x9D, 0xFD, 0x08, 0x0E, 0x82,
0xAE, 0x57, 0x1C, 0x05, 0x1D, 0x04, 0xB4, 0x97, 0x21, 0x12, 0x4C, 0x49, 0xD5, 0x69, 0x1C, 0xB2, 0x94, 0xDD, 0x9D, 0xBF, 0xC7, 0x90, 0x21, 0xEF, 0xED, 0x7D, 0x1D, 0x44, 0x2B, 0x46, 0xF7, 0xF7,
0xF7, 0xA7, 0xF5, 0x03, 0xD1, 0x94, 0xF2, 0xF7, 0x8D, 0x78, 0xDC, 0x7D, 0x3A, 0x59, 0x04, 0x95, 0x9F, 0x51, 0x30, 0xA3, 0xBE, 0xE8, 0x2F, 0x76, 0xF5, 0x7B, 0xE0, 0xD3, 0x67, 0x61, 0x88, 0x0A,
0x40, 0x47, 0x3E, 0x42, 0xB2, 0xD4, 0xB5, 0xAC, 0xCF, 0x10, 0xD3, 0xF7, 0x1C, 0x3C, 0x6D, 0x9F, 0x93, 0x9F, 0xC4, 0x58, 0xDB, 0x27, 0x31, 0x4F, 0x9F, 0xE6, 0x47, 0x48, 0xF5, 0x49, 0x18, 0x63,
0x66, 0xDD, 0x15, 0x10, 0xC1, 0x19, 0x6D, 0xC4, 0xC4, 0x3C, 0xDC, 0x88, 0x5D, 0xA8, 0x4A, 0x78, 0x2D, 0xA6, 0xE0, 0x3B, 0xBF, 0xF0, 0x3B, 0x2C, 0x7F, 0xAD, 0x91, 0x2A, 0xF0, 0x79, 0x22, 0x5C,
0xCC, 0x9D, 0xD4, 0xFE, 0x90, 0x38, 0xB8, 0x4C, 0xC2, 0x40, 0x43, 0xE7, 0xC0, 0x1A, 0x2F, 0x3F, 0x11, 0xF5, 0xF5, 0x07, 0xC4, 0x47, 0x74, 0xFF, 0x50, 0xE5, 0x36, 0x4F, 0x26, 0x91, 0xF2, 0x3A,
0xFC, 0x93, 0xA6, 0x19, 0x2C, 0xF3, 0xFD, 0xBB, 0xD2, 0xFA, 0x7B, 0x92, 0x31, 0x51, 0x38, 0x2A, 0xF4, 0x90, 0xE0, 0x7D, 0xE8, 0x03, 0xAB, 0xE4, 0x67, 0xE1, 0xBB, 0x27, 0x16, 0x14, 0xC9, 0xDD,
0x8D, 0x1F, 0xE8, 0x58, 0x1C, 0x5C, 0x6F, 0xB6, 0x9E, 0x71, 0xEB, 0xC1, 0xD3, 0xB6, 0xCD, 0x9E, 0xCA, 0x4D, 0x46, 0x1B, 0xF2, 0xD2, 0x03, 0x51, 0xF5, 0x31, 0xB6, 0x2A, 0x4E, 0xB2, 0xF0, 0xEA,
0x5F, 0x55, 0xC2, 0x2B, 0x9D, 0xE5, 0x5B, 0x4C, 0x95, 0xE6, 0x67, 0x15, 0xDE, 0x3C, 0x05, 0x02, 0x32, 0xE4, 0x00, 0x2F, 0x3F, 0x3C, 0x51, 0x0B, 0x5C, 0x2F, 0x3F, 0xBC, 0xFD, 0x52, 0x3D, 0xE0,
0xAD, 0xFE, 0x21, 0xA9, 0xE6, 0xAF, 0x74, 0x55, 0xD4, 0xEC, 0x12, 0xDD, 0x64, 0x41, 0x98, 0x41, 0x1A, 0xF6, 0x39, 0x6B, 0x0A, 0x0A, 0x58, 0x9C, 0xAE, 0x81, 0x0F, 0x7D, 0x14, 0x09, 0xF8, 0x9F,
0xFE, 0x40, 0x9D, 0x7F, 0x52, 0x59, 0x14, 0x74, 0x45, 0x3D, 0x35, 0xB4, 0x0C, 0x35, 0x21, 0x50, 0xF0, 0x40, 0x40, 0x9D, 0x1F, 0xDA, 0x1D, 0x04, 0xB4, 0x97, 0x20, 0x12, 0x4C, 0xB1, 0xAB, 0x93,
0x07, 0xEA, 0xBA, 0x01, 0xF9, 0x5A, 0x86, 0xDE, 0x3F, 0xE0, 0x30, 0x0A, 0x2E, 0x00, 0x08, 0xE5, 0x28, 0x60, 0xEF, 0x4F, 0xAA, 0x07, 0x42, 0x16, 0xCA, 0xEF, 0x89, 0xF1, 0xE0, 0xE6, 0x78, 0xB2,
0x14, 0x72, 0x13, 0x42, 0x31, 0x4C, 0xD7, 0x37, 0x4F, 0x24, 0x37, 0x78, 0x56, 0x99, 0x58, 0x1D, 0xF0, 0x4B, 0xD1, 0x04, 0xF9, 0x08, 0x11, 0x69, 0xD7, 0xB2, 0x3E, 0x63, 0xF8, 0x0C, 0x3D, 0x8A,
0x0A, 0x6B, 0x9F, 0x81, 0x0A, 0xCD, 0xD3, 0x24, 0x4E, 0x56, 0x59, 0xBE, 0x7C, 0x85, 0xA9, 0x80, 0x22, 0xE9, 0x83, 0x3D, 0x67, 0x84, 0xDB, 0x07, 0x91, 0x77, 0x85, 0x21, 0x60, 0xEE, 0x37, 0x22,
0xC5, 0xBE, 0xF3, 0xCD, 0x1D, 0x28, 0x55, 0xA6, 0xEA, 0x98, 0xF0, 0xA0, 0x05, 0x1B, 0xDC, 0xEF, 0x91, 0x4C, 0x4D, 0x45, 0xF5, 0xAF, 0x14, 0x94, 0x64, 0x6E, 0x60, 0x7F, 0x20, 0x32, 0xF8, 0x1A,
0x09, 0x8C, 0xB6, 0x5D, 0x5D, 0xA9, 0x0D, 0x15, 0xA3, 0xDD, 0xBB, 0x33, 0xBB, 0xC1, 0xAF, 0xAA, 0x07, 0xBE, 0x86, 0x56, 0x96, 0xD5, 0x5F, 0x7E, 0xF8, 0x27, 0x4D, 0x52, 0x58, 0xE6, 0xFB, 0x77,
0x44, 0x11, 0xDD, 0x0D, 0xF5, 0xDF, 0x44, 0xB3, 0x3A, 0x01, 0x53, 0x31, 0x1A, 0x41, 0xE9, 0xB2, 0xA5, 0xF5, 0xF7, 0x38, 0x65, 0x22, 0x5D, 0x57, 0x1A, 0x3F, 0xD0, 0xB1, 0xB8, 0x81, 0xB0, 0xD9,
0x2B, 0x8B, 0xDB, 0xE2, 0x7B, 0x61, 0x03, 0xFA, 0x00, 0xE4, 0x53, 0x38, 0xB7, 0xDB, 0x8D, 0x6C, 0x7A, 0xC6, 0xD5, 0x09, 0x0F, 0x4A, 0x77, 0xF7, 0x9C, 0xBC, 0xDB, 0x6C, 0xFF, 0x55, 0x25, 0x48,
0x8E, 0xEE, 0xC9, 0xE6, 0x2A, 0x7C, 0xB8, 0xB9, 0x57, 0x5C, 0xA8, 0x17, 0x4D, 0xC3, 0xDD, 0x72, 0xA9, 0xB3, 0xB8, 0xA6, 0x56, 0x6A, 0x7E, 0x56, 0xA2, 0xD9, 0x31, 0x6C, 0xDC, 0xEA, 0x1F, 0x62,
0x78, 0x8A, 0x0E, 0xA4, 0x10, 0x78, 0x9D, 0xAC, 0xF1, 0x55, 0x66, 0x72, 0x5C, 0x30, 0x19, 0xDC, 0x7F, 0x76, 0x67, 0xAF, 0x24, 0x8F, 0x5F, 0xD1, 0x41, 0xE5, 0x1B, 0x36, 0xC8, 0x1B, 0x54, 0x8E,
0x0F, 0x1F, 0xD7, 0x98, 0x03, 0x97, 0x8F, 0x49, 0x73, 0x0D, 0x89, 0xC8, 0x47, 0xE2, 0xA7, 0xC1, 0x27, 0xA5, 0x45, 0x41, 0xA8, 0xD4, 0x83, 0x60, 0xF0, 0xD3, 0x10, 0x23, 0xA7, 0xE8, 0x5D, 0x7D,
0x2A, 0x8C, 0x13, 0xF2, 0x59, 0xEF, 0x3F, 0x64, 0xBE, 0xC8, 0xB0, 0xFA, 0xE4, 0xB8, 0xAA, 0x47, 0x3E, 0x32, 0xA7, 0x01, 0x0C, 0x54, 0x8E, 0x8F, 0x2D, 0x7D, 0xF3, 0xC4, 0x78, 0x83, 0x30, 0xE5,
0x15, 0x80, 0x7A, 0x63, 0x1C, 0xC6, 0x50, 0xDC, 0x9D, 0xF3, 0x13, 0x7D, 0x3F, 0x4D, 0xFD, 0xEB, 0xF3, 0xE3, 0x12, 0x6D, 0x0C, 0x72, 0x06, 0x62, 0x32, 0x4F, 0xE2, 0x28, 0x5E, 0xA5, 0xD9, 0x22,
0xF1, 0x6A, 0x3A, 0xA5, 0x50, 0x63, 0x94, 0xE4, 0x81, 0xC2, 0x01, 0xBB, 0x86, 0x6A, 0x46, 0xA4, 0x25, 0x02, 0xC1, 0x5A, 0xFB, 0x8E, 0x9B, 0x2D, 0x0C, 0x15, 0x51, 0x2D, 0x0D, 0x6E, 0xCC, 0x04,
0xF2, 0x99, 0x7C, 0x38, 0x23, 0xFA, 0xAE, 0x83, 0x72, 0xEB, 0xB6, 0x02, 0x84, 0x73, 0xA9, 0x02, 0xCC, 0x6D, 0xFB, 0x55, 0x70, 0xB4, 0xA4, 0x89, 0x7B, 0xAB, 0xDA, 0x1B, 0xBB, 0x2E, 0x53, 0x1F,
0x65, 0xD7, 0xE1, 0x7A, 0x45, 0x84, 0xE4, 0x7F, 0x39, 0x6C, 0x19, 0x9F, 0xBF, 0x7F, 0xCF, 0x28, 0xD1, 0xD9, 0x10, 0x61, 0x0B, 0xC2, 0x54, 0x1A, 0x42, 0x5A, 0xB7, 0x2B, 0xC2, 0x45, 0xFA, 0x18,
0xC3, 0x6A, 0x38, 0x59, 0xB1, 0xBA, 0x22, 0x1E, 0xC3, 0xA5, 0xAE, 0x5E, 0x5D, 0x8B, 0xE7, 0x00, 0x3B, 0xC3, 0x5C, 0x7D, 0x00, 0x74, 0xCC, 0x6D, 0xD2, 0xED, 0x46, 0xA4, 0x4B, 0xF7, 0x44, 0xBA,
0x07, 0x31, 0xC6, 0xF2, 0xAC, 0x32, 0x65, 0x01, 0x69, 0x9F, 0x3F, 0xAB, 0x22, 0x08, 0xEE, 0xF4, 0xA5, 0x9D, 0xDE, 0xDC, 0xCB, 0x9C, 0x57, 0xF3, 0xA6, 0xE1, 0x6E, 0x4A, 0x1E, 0xA3, 0xDE, 0xE7,
0x09, 0xA4, 0x7E, 0x60, 0xBA, 0x3E, 0x54, 0xBC, 0xB0, 0x64, 0x3C, 0xA1, 0x50, 0x02, 0x3E, 0x43, 0x4C, 0xA9, 0x92, 0x35, 0xDE, 0x1C, 0x27, 0x35, 0x95, 0x6B, 0x35, 0xC8, 0x54, 0x6B, 0x65, 0x2E,
0x3E, 0xFD, 0xC2, 0xF9, 0xA4, 0x97, 0x69, 0x20, 0x8E, 0xCA, 0x8F, 0xF9, 0xFB, 0xE0, 0xF1, 0x1D, 0xD7, 0x48, 0x63, 0x0D, 0x91, 0xD9, 0x47, 0xE2, 0x25, 0xFE, 0x2A, 0x88, 0x62, 0xF2, 0x59, 0xEF,
0xF4, 0x61, 0x22, 0x6B, 0x04, 0x4D, 0xCF, 0x77, 0x99, 0x4F, 0x9F, 0x13, 0x68, 0xFF, 0x68, 0x7D, 0x3F, 0x0A, 0x50, 0x09, 0x84, 0x5E, 0x1F, 0x07, 0x11, 0xE4, 0xBC, 0xE7, 0xFC, 0xEE, 0x84, 0x97,
0x86, 0xB6, 0xFC, 0x95, 0x03, 0xF6, 0xD1, 0xFE, 0x5C, 0xA5, 0xFB, 0xF4, 0x39, 0x14, 0x97, 0xB2, 0x24, 0xDE, 0xF5, 0x78, 0x35, 0x9D, 0x52, 0x48, 0xBD, 0x8A, 0x9D, 0x81, 0xB4, 0x00, 0xA5, 0x86,
0x1B, 0xBD, 0x8E, 0xF8, 0x53, 0x68, 0x65, 0xAE, 0xEC, 0x7B, 0xC2, 0xE7, 0x1E, 0x1D, 0x15, 0x01, 0x6A, 0x50, 0xA8, 0x92, 0x98, 0x7C, 0x38, 0x23, 0xFA, 0xAE, 0x4B, 0x07, 0xD6, 0x6D, 0x09, 0x08,
0xFB, 0x94, 0x69, 0x19, 0xA5, 0x8B, 0x4C, 0xBB, 0x4E, 0x56, 0x1A, 0xBE, 0x23, 0x25, 0x13, 0x11, 0x27, 0x50, 0x09, 0xCA, 0xCE, 0x8B, 0x0A, 0x25, 0xD0, 0xFF, 0xC3, 0x61, 0x4B, 0x8F, 0xFA, 0xFD,
0x6D, 0x0A, 0xF5, 0xA6, 0xE6, 0xC7, 0x09, 0xD8, 0x13, 0x64, 0xCC, 0x52, 0x4F, 0x0C, 0x1C, 0x96, 0x7B, 0x4A, 0x19, 0x1A, 0xBC, 0x78, 0xC5, 0xAA, 0x0A, 0x67, 0x0C, 0x97, 0xBA, 0x7A, 0x79, 0x2D,
0xF2, 0x71, 0x71, 0xB2, 0xD6, 0xD4, 0xBC, 0x85, 0x80, 0xAD, 0x29, 0xD9, 0x92, 0xFA, 0xEE, 0x12, 0x7E, 0xA9, 0xE1, 0x20, 0xC6, 0x98, 0xB5, 0x96, 0xA6, 0x64, 0xD7, 0x22, 0x36, 0x62, 0xDF, 0x27,
0xB2, 0x65, 0xAB, 0x44, 0xDE, 0x78, 0x29, 0x4B, 0x7B, 0x4A, 0xF4, 0xBB, 0xCB, 0xA0, 0xF5, 0xE3, 0xE0, 0xF5, 0x41, 0xF1, 0x3C, 0x2D, 0x88, 0x60, 0xC9, 0x68, 0x42, 0x21, 0x33, 0x7E, 0x86, 0x74,
0x8B, 0x20, 0x7C, 0xB5, 0xEA, 0x71, 0xF9, 0xA6, 0xB2, 0xE8, 0x23, 0xA6, 0xE3, 0x9B, 0x53, 0x87, 0xFA, 0x85, 0xD3, 0x49, 0x2F, 0x22, 0x61, 0x1C, 0x95, 0xDD, 0x7F, 0xE8, 0x43, 0x72, 0xEB, 0x1C,
0xEA, 0xA7, 0xBB, 0x66, 0x2A, 0xA1, 0xE9, 0x50, 0xCE, 0xF6, 0xF8, 0x74, 0x4F, 0xBC, 0x09, 0x76, 0x0D, 0xB3, 0xAB, 0x09, 0x20, 0xC6, 0x59, 0xF9, 0xFD, 0xE4, 0x39, 0x01, 0x23, 0xF3, 0xD1, 0xFA,
0xB0, 0xC4, 0xCB, 0x4B, 0xB6, 0x6A, 0x99, 0x67, 0xDC, 0x59, 0xC1, 0x11, 0xF0, 0x35, 0x0F, 0xAB, 0x0C, 0x6D, 0xD9, 0xF5, 0x0D, 0xF6, 0xD1, 0xFE, 0x5C, 0xDE, 0xF7, 0xC9, 0x73, 0x0D, 0x03, 0x0F,
0xDC, 0x44, 0xE1, 0x56, 0xCE, 0x7B, 0x40, 0xC1, 0x26, 0x82, 0x29, 0x90, 0xF2, 0x57, 0xA8, 0xD9, 0xDE, 0xAD, 0x83, 0x8A, 0x88, 0x3F, 0x3A, 0x57, 0xE6, 0xCA, 0xBE, 0x27, 0x7C, 0xEE, 0xD3, 0xA7,
0x38, 0x47, 0xEF, 0xAC, 0xDA, 0xB6, 0x24, 0xFC, 0xF8, 0x7A, 0x2D, 0x4F, 0xE4, 0x8A, 0x92, 0xED, 0xB9, 0x8B, 0x3D, 0x61, 0x5A, 0x4A, 0xE9, 0x22, 0xD5, 0xAE, 0xE3, 0x95, 0x86, 0xB7, 0xD1, 0x64,
0x6E, 0x5B, 0xB8, 0x6F, 0xA5, 0xB6, 0x85, 0xE5, 0x81, 0xB7, 0xFD, 0x0E, 0x80, 0xC9, 0xDF, 0xFB, 0xE8, 0xA0, 0x4D, 0x21, 0x0D, 0xD7, 0xBC, 0x28, 0x06, 0x65, 0x4A, 0x34, 0x70, 0x4C, 0x5C, 0x14,
0x7B, 0x9C, 0x31, 0x3C, 0xDE, 0x7E, 0x2B, 0x33, 0xF3, 0x77, 0x5D, 0x97, 0x57, 0xF7, 0xB4, 0xF8, 0x0D, 0x1C, 0x96, 0xF0, 0x71, 0x51, 0xBC, 0xD6, 0xD4, 0x48, 0x03, 0x15, 0xF3, 0xC5, 0xE9, 0xE9,
0xB2, 0xBE, 0xFC, 0x17, 0xF9, 0x87, 0xED, 0xE9, 0x0A, 0x8E, 0x03, 0xE1, 0x10, 0xF7, 0x17, 0xB2, 0xDB, 0xD3, 0x02, 0xDD, 0xED, 0x2B, 0x24, 0xEC, 0xA3, 0xF3, 0x79, 0xF3, 0x12, 0xC9, 0xD6, 0x66,
0xE8, 0x00, 0x89, 0xCD, 0x0F, 0x6D, 0x84, 0xD8, 0x8F, 0x8E, 0x88, 0x57, 0x7D, 0x54, 0x7B, 0xBF, 0x70, 0x50, 0x8D, 0x68, 0xD8, 0xD9, 0xC7, 0x0B, 0x14, 0xF6, 0x67, 0xDD, 0x28, 0xC5, 0x9F, 0x1B,
0x7F, 0x97, 0x65, 0xAF, 0x74, 0xBA, 0x53, 0x5E, 0xAE, 0x61, 0xDA, 0xE5, 0x40, 0xA4, 0xC8, 0x47, 0xE1, 0xA7, 0x37, 0xC6, 0xD3, 0x01, 0xCC, 0x46, 0x95, 0x08, 0xB4, 0x34, 0xE1, 0x06, 0xF3, 0xC7,
0xE9, 0xD5, 0x41, 0x13, 0x8C, 0x62, 0x11, 0xAF, 0x8C, 0x07, 0x3C, 0x9B, 0xC2, 0x35, 0x5D, 0x75, 0xD2, 0xAA, 0xC7, 0x55, 0x2F, 0xA4, 0x30, 0x4B, 0xDE, 0x5B, 0xD3, 0xA6, 0x3C, 0xD2, 0xA8, 0x82,
0xBC, 0xB0, 0x12, 0xEE, 0x0F, 0xEE, 0x34, 0x0A, 0x3C, 0x2E, 0xF6, 0x2C, 0x83, 0x0D, 0x21, 0x36, 0xFB, 0x2C, 0x0D, 0xAB, 0x11, 0x9D, 0x17, 0x33, 0x36, 0x37, 0xA2, 0x6F, 0xDD, 0x84, 0xD1, 0xFB,
0xF3, 0xBF, 0xE9, 0x00, 0x0E, 0xD7, 0x15, 0x45, 0x8E, 0x8F, 0x87, 0xF6, 0xDD, 0xCE, 0x4A, 0x88, 0xBB, 0x00, 0x42, 0x8C, 0x62, 0x80, 0xD1, 0x29, 0x72, 0x8C, 0xFF, 0x07, 0x69, 0xC2, 0x5E, 0xC3,
0x25, 0xBE, 0x8F, 0xB6, 0x95, 0x8A, 0xEB, 0xD9, 0x66, 0x6C, 0x78, 0xD6, 0x09, 0x26, 0x92, 0x13, 0xAB, 0xF7, 0x33, 0x31, 0x00, 0x97, 0x8D, 0x48, 0xA9, 0x86, 0x4F, 0xBD, 0x15, 0x88, 0x6A, 0xB0,
0xD0, 0xDB, 0xB4, 0x58, 0x9F, 0x61, 0xCE, 0x20, 0x53, 0xA1, 0x94, 0xA2, 0x3D, 0xE0, 0x5E, 0xA9, 0x55, 0x29, 0xDA, 0xB8, 0xEE, 0xA8, 0x1D, 0x13, 0xFD, 0xEE, 0x6A, 0xC0, 0xFA, 0xF1, 0xB5, 0x00,
0x61, 0x63, 0x9E, 0xC0, 0x49, 0xDE, 0xC5, 0x36, 0x2C, 0x67, 0xD5, 0xCE, 0x3B, 0xB7, 0x12, 0xCA, 0xBC, 0xB4, 0xF8, 0x38, 0xB2, 0x28, 0x8B, 0x3E, 0x62, 0x3A, 0xDE, 0x49, 0x3C, 0x54, 0x46, 0xB8,
0xE8, 0x88, 0x19, 0xE8, 0x7E, 0xFB, 0x2C, 0x5F, 0x75, 0xDD, 0x53, 0x70, 0x2A, 0x5B, 0x88, 0xF8, 0x6B, 0xA6, 0x12, 0x13, 0x1C, 0x8A, 0xAA, 0x1F, 0x1F, 0x90, 0x8B, 0x3B, 0x96, 0x07, 0x2B, 0x1D,
0xAA, 0xE4, 0xA3, 0x20, 0xF1, 0xA8, 0x30, 0xB8, 0x23, 0xE0, 0x46, 0xA5, 0xA3, 0x90, 0x3B, 0xC8, 0x59, 0xBE, 0x56, 0xAE, 0x76, 0x18, 0x77, 0x16, 0x32, 0x08, 0x78, 0x93, 0x87, 0x15, 0x30, 0x44,
0x20, 0xB8, 0xFD, 0xA3, 0x97, 0x5B, 0xA3, 0xF1, 0xD5, 0x45, 0x8E, 0xC4, 0xD3, 0xF7, 0x67, 0x2F, 0xFD, 0xA2, 0x98, 0xA7, 0xDF, 0xAA, 0x37, 0xCA, 0x8C, 0x07, 0x17, 0x31, 0x44, 0xD0, 0x03, 0xFB,
0xDE, 0xA9, 0xC5, 0x2E, 0x3A, 0x59, 0x40, 0x21, 0x66, 0xE0, 0x7C, 0x8F, 0xC9, 0xD1, 0xDB, 0x67, 0xDB, 0x51, 0xC7, 0xF8, 0x73, 0x0A, 0x18, 0x9C, 0xD6, 0x77, 0x96, 0x30, 0xB6, 0x78, 0x7F, 0xBF,
0x67, 0x67, 0x1F, 0xDE, 0xBC, 0x7B, 0xBE, 0x7B, 0x08, 0xC3, 0x21, 0x67, 0xEF, 0x7F, 0x79, 0x7D, 0xE2, 0xC5, 0x5D, 0xF5, 0x8A, 0x2C, 0xFE, 0xDE, 0x59, 0xB2, 0xB8, 0x5B, 0x7B, 0xEE, 0x6B, 0x82,
0x7A, 0x3E, 0xBC, 0xC6, 0x6D, 0xB9, 0x70, 0x57, 0x44, 0x08, 0xEF, 0xDE, 0x1A, 0x0E, 0xB7, 0xB6, 0xB6, 0xB0, 0x3F, 0x70, 0xF3, 0xF6, 0x00, 0x98, 0xEC, 0x0E, 0xEE, 0xE3, 0xD4, 0xE7, 0xF1, 0x1A,
0x86, 0x9F, 0x40, 0x9B, 0xAC, 0x0B, 0x78, 0x95, 0x10, 0x56, 0xAB, 0x84, 0xA2, 0x0C, 0xA8, 0xE4, 0x5F, 0x9A, 0x99, 0xDD, 0x3B, 0x5F, 0x5E, 0xDD, 0xD3, 0x46, 0x14, 0xF5, 0x95, 0x7F, 0x93, 0x45,
0x5B, 0x61, 0x51, 0x2A, 0xF4, 0xF3, 0x8A, 0x1F, 0x44, 0x1D, 0xAA, 0x65, 0x42, 0xCC, 0xC3, 0x50, 0xD9, 0x9E, 0xAE, 0xE0, 0x38, 0x10, 0x26, 0xF4, 0x7E, 0x85, 0x1C, 0x34, 0x9F, 0xC4, 0xE6, 0x27,
0x98, 0x97, 0x09, 0xEB, 0x30, 0x0E, 0x92, 0xF5, 0x0E, 0xC7, 0x9D, 0xCF, 0xBF, 0x1D, 0x9C, 0x34, 0x9F, 0x42, 0x04, 0x9E, 0x3E, 0x25, 0xCD, 0xF2, 0x57, 0xB5, 0xF7, 0xFB, 0xF7, 0xB2, 0xDB, 0x25,
0xE5, 0xFB, 0xAC, 0x27, 0x4D, 0xF9, 0x1A, 0x3D, 0xFF, 0x1F, 0x2E, 0xFE, 0x1F, 0xE4, 0x44, 0x87, 0x0E, 0xF8, 0xF6, 0xAC, 0x53, 0x2F, 0xFB, 0xBB, 0x09, 0x86, 0x3A, 0xC2, 0xE3, 0x0D, 0x78, 0xB4,
0x45, 0x77, 0x51, 0x00, 0x00 0x8D, 0x4B, 0xB9, 0xEA, 0x78, 0xA1, 0x40, 0xDC, 0x88, 0xDC, 0xA9, 0x2F, 0x78, 0xD9, 0xA2, 0x69,
0x19, 0x6C, 0x08, 0x01, 0x1C, 0xFF, 0x13, 0x2B, 0x20, 0x72, 0x55, 0x91, 0xEB, 0xA8, 0x36, 0xB4,
0xEF, 0xB6, 0x70, 0x82, 0x33, 0xD1, 0x7D, 0x04, 0xAE, 0x90, 0xDD, 0xA6, 0x6D, 0x46, 0x46, 0xD3,
0x3A, 0xC2, 0x54, 0x62, 0x02, 0xA2, 0x9B, 0xE4, 0xEB, 0x33, 0x0C, 0x2C, 0x37, 0x1C, 0x20, 0xC4,
0x84, 0x36, 0x06, 0x93, 0x7C, 0xCB, 0xE5, 0x22, 0xD9, 0x8E, 0xA6, 0x7D, 0x75, 0xB3, 0xC2, 0x8D,
0x62, 0x56, 0xB2, 0x5F, 0x2D, 0x8B, 0xDB, 0xE6, 0x7B, 0x6A, 0x07, 0x4A, 0xC9, 0x1D, 0x6F, 0x2B,
0x3F, 0x0A, 0x12, 0x77, 0x1F, 0x83, 0x3B, 0x3C, 0x73, 0x58, 0xD8, 0x07, 0x79, 0xE2, 0x02, 0xCC,
0xDA, 0x3F, 0x7A, 0xB9, 0x35, 0x1A, 0x2F, 0xFB, 0x72, 0x24, 0x8E, 0xDF, 0x9F, 0xBD, 0x38, 0x55,
0xEB, 0x16, 0x68, 0x73, 0x01, 0x85, 0x88, 0x81, 0x2D, 0xAE, 0x91, 0xA7, 0xEF, 0x9E, 0x9D, 0x9D,
0x7D, 0x78, 0x7B, 0xFA, 0x7C, 0xF7, 0x10, 0x86, 0x43, 0xCE, 0xDE, 0xFF, 0xF2, 0xFA, 0xE4, 0x7C,
0x78, 0x8D, 0xE5, 0xEB, 0x60, 0x87, 0x93, 0x18, 0x04, 0x77, 0x1F, 0xA5, 0x04, 0x5B, 0x47, 0x29,
0x4F, 0xA0, 0x4D, 0xE6, 0x8A, 0x3C, 0x73, 0x0C, 0xCA, 0x99, 0x63, 0x9E, 0x1A, 0x96, 0x62, 0xD7,
0x20, 0x4F, 0x1F, 0xFB, 0x59, 0xF1, 0x06, 0xD8, 0x1E, 0xA8, 0xA9, 0x63, 0xC4, 0x5D, 0x53, 0x90,
0xA5, 0x8E, 0xEB, 0x20, 0xF2, 0xE3, 0xF5, 0x0E, 0xDB, 0x9D, 0xCD, 0xBF, 0x1D, 0x1C, 0x35, 0xE4,
0x95, 0xF2, 0xA3, 0x86, 0xFC, 0x4B, 0x16, 0xFE, 0xFF, 0x3C, 0xFD, 0x5F, 0xA2, 0x56, 0x64, 0x29,
0xFA, 0x54, 0x00, 0x00
}; };
#endif //__embedded_h #endif //__embedded_h

View File

@ -5,7 +5,7 @@
"del": "latest", "del": "latest",
"deprecated": "latest", "deprecated": "latest",
"fs": "latest", "fs": "latest",
"gulp": "^4.0.0", "gulp": "^4.0.2",
"gulp-bytediff": "latest", "gulp-bytediff": "latest",
"gulp-cdnizer": "latest", "gulp-cdnizer": "latest",
"gulp-clean-css": "latest", "gulp-clean-css": "latest",

Binary file not shown.

View File

@ -3,11 +3,16 @@ var authentication = false;
var webupdate = false; var webupdate = false;
var filesystem = false; var filesystem = false;
var websocket_port = 0; var websocket_port = 0;
var websocket_IP = "";
var async_webcommunication = false; var async_webcommunication = false;
var page_id = ""; var page_id = "";
var ws_source; var ws_source;
var log_off =false; var log_off =false;
var websocket_started =false; var websocket_started =false;
var esp_error_message ="";
var esp_error_code = 0;
var xmlhttpupload;
var typeupload = 0;
function navbar(){ function navbar(){
var content="<table><tr>"; var content="<table><tr>";
var tlist = currentpath.split("/"); var tlist = currentpath.split("/");
@ -150,6 +155,7 @@ if (filename != null) {
SendCommand("createdir",filename.trim()); SendCommand("createdir",filename.trim());
} }
} }
function SendCommand(action,filename){ function SendCommand(action,filename){
var xmlhttp = new XMLHttpRequest(); var xmlhttp = new XMLHttpRequest();
var url = "/files?action="+action; var url = "/files?action="+action;
@ -188,10 +194,10 @@ var arg = currentpath + file.name + "S";
//append file size first to check updload is complete //append file size first to check updload is complete
formData.append(arg, file.size); formData.append(arg, file.size);
formData.append('myfiles[]', file, currentpath+file.name);} formData.append('myfiles[]', file, currentpath+file.name);}
var xmlhttp = new XMLHttpRequest(); xmlhttpupload = new XMLHttpRequest();
xmlhttp.open('POST', '/files', true); xmlhttpupload.open('POST', '/files', true);
//progress upload event //progress upload event
xmlhttp.upload.addEventListener("progress", updateProgress, false); xmlhttpupload.upload.addEventListener("progress", updateProgress, false);
//progress function //progress function
function updateProgress (oEvent) { function updateProgress (oEvent) {
if (oEvent.lengthComputable) { if (oEvent.lengthComputable) {
@ -202,17 +208,28 @@ function updateProgress (oEvent) {
// Impossible because size is unknown // Impossible because size is unknown
} }
} }
typeupload = 1;
xmlhttp.onload = function () { xmlhttpupload.onload = function () {
if (xmlhttp.status === 200) { if (xmlhttpupload.status === 200) {
document.getElementById('upload-button').value = 'Upload'; document.getElementById('upload-button').value = 'Upload';
document.getElementById('prg').style.visibility = "hidden"; document.getElementById('prg').style.visibility = "hidden";
document.getElementById('file-select').value=""; document.getElementById('file-select').value="";
var jsonresponse = JSON.parse(xmlhttp.responseText); var jsonresponse = JSON.parse(xmlhttpupload.responseText);
dispatchfilestatus(jsonresponse); dispatchfilestatus(jsonresponse);
} else alert('An error occurred!'); } else uploadError();
}; };
xmlhttp.send(formData);
xmlhttpupload.send(formData);
}
function padNumber(num, size) {
var s = num.toString();
while (s.length < size) s = "0" + s;
return s;
}
function getPCTime(){
var d = new Date();
return d.getFullYear() + "-" + padNumber(d.getMonth() + 1 ,2) + "-" + padNumber(d.getDate(),2) + "-" + padNumber(d.getHours(),2) + "-" + padNumber(d.getMinutes(),2) + "-" + padNumber(d.getSeconds(),2);
} }
function HideAll(msg){ function HideAll(msg){
@ -230,6 +247,7 @@ function HideAll(msg){
function FWError(){ function FWError(){
HideAll("Failed to communicate with FW!"); HideAll("Failed to communicate with FW!");
} }
function FWOk(){ function FWOk(){
document.getElementById('MSG').innerHTML = "Connected"; document.getElementById('MSG').innerHTML = "Connected";
if (filesystem){ if (filesystem){
@ -242,7 +260,7 @@ function FWOk(){
function InitUI(){ function InitUI(){
var xmlhttp = new XMLHttpRequest(); var xmlhttp = new XMLHttpRequest();
var url = "/command?cmd="+encodeURI("[ESP800]"); var url = "/command?cmd="+encodeURI("[ESP800]"+"time=" + getPCTime());
authentication = false; authentication = false;
async_webcommunication = false; async_webcommunication = false;
xmlhttp.onreadystatechange = function() { xmlhttp.onreadystatechange = function() {
@ -250,26 +268,28 @@ xmlhttp.onreadystatechange = function() {
var error = false; var error = false;
if(xmlhttp.status == 200) { if(xmlhttp.status == 200) {
var jsonresponse = JSON.parse(xmlhttp.responseText); var jsonresponse = JSON.parse(xmlhttp.responseText);
if ((typeof jsonresponse.FWVersion === "undefined")|| (typeof jsonresponse.Hostname === "undefined") || (typeof jsonresponse.WebUpdate === "undefined") || (typeof jsonresponse.WebSocketport === "undefined") || (typeof jsonresponse.WebCommunication === "undefined") || (typeof jsonresponse.Filesystem === "undefined") || (typeof jsonresponse.Authentication === "undefined")) { if ((typeof jsonresponse.FWVersion === "undefined")|| (typeof jsonresponse.Hostname === "undefined") || (typeof jsonresponse.WebUpdate === "undefined") || (typeof jsonresponse.WebSocketport === "undefined") || (typeof jsonresponse.WebSocketIP === "undefined") || (typeof jsonresponse.WebCommunication === "undefined") || (typeof jsonresponse.Filesystem === "undefined") || (typeof jsonresponse.Authentication === "undefined")) {
error = true; error = true;
} else { } else {
document.getElementById('FWVERSION').innerHTML = "v"+jsonresponse.FWVersion; document.getElementById('FWVERSION').innerHTML = "v"+jsonresponse.FWVersion;
if (jsonresponse.Filesystem != "None"){ if (jsonresponse.Filesystem != "None"){
filesystem = true; filesystem = true;
console.log(jsonresponse.Filesystem); //console.log(jsonresponse.Filesystem);
} }
if (jsonresponse.WebUpdate != "Disabled"){ if (jsonresponse.WebUpdate != "Disabled"){
webupdate = true; webupdate = true;
console.log(jsonresponse.WebUpdate); //console.log(jsonresponse.WebUpdate);
} }
//websocket port //websocket port
websocket_port = jsonresponse.WebSocketport; websocket_port = jsonresponse.WebSocketport;
console.log(websocket_port); //websocket IP
websocket_IP = jsonresponse.WebSocketIP;
//console.log(websocket_port);
//async communications //async communications
if (jsonresponse.WebCommunication != "Synchronous") { if (jsonresponse.WebCommunication != "Synchronous") {
async_webcommunication = true; async_webcommunication = true;
console.log(jsonresponse.WebCommunication); //console.log(jsonresponse.WebCommunication);
} }
FWOk(); FWOk();
startSocket(); startSocket();
@ -277,7 +297,7 @@ xmlhttp.onreadystatechange = function() {
if (filesystem)SendCommand('list','all'); if (filesystem)SendCommand('list','all');
if (jsonresponse.Authentication != "Disabled"){ if (jsonresponse.Authentication != "Disabled"){
authentication = true; authentication = true;
console.log(jsonresponse.Authentication); //console.log(jsonresponse.Authentication);
} }
} }
} else if (xmlhttp.status == 401){ } else if (xmlhttp.status == 401){
@ -295,17 +315,16 @@ xmlhttp.open("GET", url, true);
xmlhttp.send(); xmlhttp.send();
} }
function startSocket(){ function startSocket(){
if (websocket_started){ if (websocket_started){
ws_source.close(); ws_source.close();
} }
if(async_webcommunication){ if(async_webcommunication){
ws_source = new WebSocket('ws://'+document.location.host+'/ws',['arduino']); ws_source = new WebSocket('ws://'+websocket_IP + ':' + websocket_port +'/ws',['arduino']);
} }
else { else {
//console.log("Socket port is :" + websocket_port); //console.log("Socket port is :" + websocket_port);
ws_source = new WebSocket('ws://'+document.location.hostname+':' + websocket_port,['arduino']); ws_source = new WebSocket('ws://'+websocket_IP + ':' + websocket_port,['arduino']);
} }
ws_source.binaryType = "arraybuffer"; ws_source.binaryType = "arraybuffer";
ws_source.onopen = function(e){ ws_source.onopen = function(e){
@ -328,7 +347,7 @@ function startSocket(){
if(!(e.data instanceof ArrayBuffer)){ if(!(e.data instanceof ArrayBuffer)){
msg = e.data; msg = e.data;
var tval = msg.split(":"); var tval = msg.split(":");
if (tval.length == 2) { if (tval.length >= 2) {
if (tval[0] == 'currentID') { if (tval[0] == 'currentID') {
page_id = tval[1]; page_id = tval[1];
console.log("ID " + page_id); console.log("ID " + page_id);
@ -338,6 +357,13 @@ function startSocket(){
HideAll("It seems you are connect from another location, your are now disconnected"); HideAll("It seems you are connect from another location, your are now disconnected");
} }
} }
if (tval[0] == 'ERROR') {
esp_error_message = tval[2];
esp_error_code = tval[1];
console.log(tval[2] + " code:" + tval[1]);
uploadError();
xmlhttpupload.abort();
}
} }
} }
@ -350,6 +376,26 @@ window.onload = function() {
InitUI(); InitUI();
}; };
function uploadError()
{
if (esp_error_code != 0) {
alert('Update failed(' + esp_error_code + '): ' + esp_error_message);
esp_error_code = 0;
} else {
alert('Update failed!');
}
if (typeupload == 1) {
//location.reload();
document.getElementById('upload-button').value = 'Upload';
document.getElementById('prg').style.visibility = "hidden";
document.getElementById('file-select').value="";
SendCommand('list', 'all');
} else {
location.reload();
}
}
function Uploadfile(){ function Uploadfile(){
if (!confirm("Confirm Firmware Update ?"))return; if (!confirm("Confirm Firmware Update ?"))return;
var files = document.getElementById('fw-select').files; var files = document.getElementById('fw-select').files;
@ -367,10 +413,11 @@ var arg = "/" + file.name + "S";
//append file size first to check updload is complete //append file size first to check updload is complete
formData.append(arg, file.size); formData.append(arg, file.size);
formData.append('myfile[]', file, "/"+file.name);} formData.append('myfile[]', file, "/"+file.name);}
var xmlhttp = new XMLHttpRequest(); typeupload = 0;
xmlhttp.open('POST', '/updatefw', true); xmlhttpupload = new XMLHttpRequest();
xmlhttpupload.open('POST', '/updatefw', true);
//progress upload event //progress upload event
xmlhttp.upload.addEventListener("progress", updateProgress, false); xmlhttpupload.addEventListener("progress", updateProgress, false);
//progress function //progress function
function updateProgress (oEvent) { function updateProgress (oEvent) {
if (oEvent.lengthComputable) { if (oEvent.lengthComputable) {
@ -381,8 +428,8 @@ function updateProgress (oEvent) {
// Impossible because size is unknown // Impossible because size is unknown
} }
} }
xmlhttp.onload = function () { xmlhttpupload.onload = function () {
if (xmlhttp.status === 200) { if (xmlhttpupload.status === 200) {
document.getElementById('ubut').value = 'Upload'; document.getElementById('ubut').value = 'Upload';
document.getElementById('msg').innerHTML="Restarting, please wait...."; document.getElementById('msg').innerHTML="Restarting, please wait....";
document.getElementById('counter').style.visibility = "visible"; document.getElementById('counter').style.visibility = "visible";
@ -392,8 +439,8 @@ document.getElementById('fw-select').value="";
document.getElementById('fw-select').style.visibility = 'hidden'; document.getElementById('fw-select').style.visibility = 'hidden';
document.getElementById('fw-select').style.width = '0px'; document.getElementById('fw-select').style.width = '0px';
var jsonresponse = JSON.parse(xmlhttp.responseText); var jsonresponse = JSON.parse(xmlhttpupload.responseText);
if (jsonresponse.status=='1' || jsonresponse.status=='4' || jsonresponse.status=='1')alert("Update failed"); if (jsonresponse.status=='1' || jsonresponse.status=='4' || jsonresponse.status=='1')uploadError();
if (jsonresponse.status=='2')alert('Update canceled!'); if (jsonresponse.status=='2')alert('Update canceled!');
else if (jsonresponse.status=='3') else if (jsonresponse.status=='3')
{ {
@ -413,12 +460,13 @@ else if (jsonresponse.status=='3')
} }
},1000); },1000);
} }
else alert('Update failed!'); else uploadError()
} else alert('An error occurred!'); } else uploadError()
}; };
xmlhttp.send(formData); xmlhttpupload.send(formData);
} }
function RL(){ function RL(){
document.getElementById('loginpage').style.display='block'; document.getElementById('loginpage').style.display='block';
} }

View File

@ -31,7 +31,7 @@
#define WIFI_FEATURE #define WIFI_FEATURE
//ETH_FEATURE : enable Ethernet function //ETH_FEATURE : enable Ethernet function
#define ETH_FEATURE //#define ETH_FEATURE
//BLUETOOTH_FEATURE : enable BT Serial function //BLUETOOTH_FEATURE : enable BT Serial function
//#define BLUETOOTH_FEATURE //#define BLUETOOTH_FEATURE
@ -50,7 +50,7 @@
//OLED_I2C_SSDSH1106 2 //OLED_I2C_SSDSH1106 2
//TFT_SPI_ILI9341_320X240 3 //TFT_SPI_ILI9341_320X240 3
//TFT_SPI_ILI9488_480X320 4 //TFT_SPI_ILI9488_480X320 4
#define DISPLAY_DEVICE TFT_SPI_ILI9488_480X320 //#define DISPLAY_DEVICE TFT_SPI_ILI9488_480X320
//UI_TYPE_BASIC 1 //UI_TYPE_BASIC 1
//UI_TYPE_ADVANCED 2 //UI_TYPE_ADVANCED 2
@ -109,13 +109,13 @@
//ESP_SPIFFS_FILESYSTEM 0 //ESP_SPIFFS_FILESYSTEM 0
//ESP_FAT_FILESYSTEM 1 //ESP_FAT_FILESYSTEM 1
//ESP_LITTLEFS_FILESYSTEM 2 //Not Yet implemented //ESP_LITTLEFS_FILESYSTEM 2 //Not Yet implemented
#define FILESYSTEM_FEATURE ESP_FAT_FILESYSTEM #define FILESYSTEM_FEATURE ESP_SPIFFS_FILESYSTEM
//DIRECT_PIN_FEATURE: allow to access pin using ESP201 command //DIRECT_PIN_FEATURE: allow to access pin using ESP201 command
#define DIRECT_PIN_FEATURE #define DIRECT_PIN_FEATURE
//TIMESTAMP_FEATURE: set time system //TIMESTAMP_FEATURE: set time system
//#define TIMESTAMP_FEATURE #define TIMESTAMP_FEATURE
//FILESYSTEM_TIMESTAMP_FEATURE: allow to get last write time from FILESYSTEM files //FILESYSTEM_TIMESTAMP_FEATURE: allow to get last write time from FILESYSTEM files
//#define FILESYSTEM_TIMESTAMP_FEATURE //#define FILESYSTEM_TIMESTAMP_FEATURE

View File

@ -316,8 +316,8 @@ bool Commands::execute_internal_command (int cmd, const char* cmd_params, level_
break; break;
#endif //TELNET_FEATURE #endif //TELNET_FEATURE
#ifdef TIMESTAMP_FEATURE #ifdef TIMESTAMP_FEATURE
//Init / Get current time //Sync / Set / Get current time
//[ESP140]<INIT> <srv1=XXXXX> <srv2=XXXXX> <srv3=XXXXX> <zone=xxx> <dst=YES/NO> <time=YYYY-MM-DD#H24:MM:SS> pwd=<admin password> //[ESP140]<SYNC> <srv1=XXXXX> <srv2=XXXXX> <srv3=XXXXX> <zone=xxx> <dst=YES/NO> <time=YYYY-MM-DD#H24:MM:SS> pwd=<admin password>
case 140: case 140:
response = ESP140(cmd_params, auth_type, output); response = ESP140(cmd_params, auth_type, output);
break; break;
@ -381,6 +381,11 @@ bool Commands::execute_internal_command (int cmd, const char* cmd_params, level_
break; break;
#endif //BUZZER_DEVICE #endif //BUZZER_DEVICE
#endif //DISPLAY_DEVICE #endif //DISPLAY_DEVICE
//Delay command
//[ESP290]<delay in ms>[pwd=<user password>]
case 290:
response = ESP290(cmd_params, auth_type, output);
break;
//Get full ESP3D settings //Get full ESP3D settings
//[ESP400]<pwd=admin> //[ESP400]<pwd=admin>
case 400: case 400:
@ -451,8 +456,9 @@ bool Commands::execute_internal_command (int cmd, const char* cmd_params, level_
#endif //FILESYSTEM_FEATURE #endif //FILESYSTEM_FEATURE
//Get fw version firmare target and fw version //Get fw version firmare target and fw version
//eventually set time with pc time
//output is JSON or plain text according parameter //output is JSON or plain text according parameter
//[ESP800]<plain> //[ESP800]<plain><time=YYYY-MM-DD-HH-MM-SS>
case 800: case 800:
response = ESP800(cmd_params, auth_type, output); response = ESP800(cmd_params, auth_type, output);
break; break;

View File

@ -90,6 +90,7 @@ public:
#ifdef DHT_DEVICE #ifdef DHT_DEVICE
bool ESP210(const char* cmd_params, level_authenticate_type auth_level, ESP3DOutput * output); bool ESP210(const char* cmd_params, level_authenticate_type auth_level, ESP3DOutput * output);
#endif //DHT_DEVICE #endif //DHT_DEVICE
bool ESP290(const char* cmd_params, level_authenticate_type auth_level, ESP3DOutput * output);
bool ESP400(const char* cmd_params, level_authenticate_type auth_level, ESP3DOutput * output); bool ESP400(const char* cmd_params, level_authenticate_type auth_level, ESP3DOutput * output);
bool ESP401(const char* cmd_params, level_authenticate_type auth_level, ESP3DOutput * output); bool ESP401(const char* cmd_params, level_authenticate_type auth_level, ESP3DOutput * output);
#if defined (WIFI_FEATURE) #if defined (WIFI_FEATURE)

View File

@ -22,12 +22,7 @@
#include "../commands.h" #include "../commands.h"
#include "../esp3doutput.h" #include "../esp3doutput.h"
#include "../settings_esp3d.h" #include "../settings_esp3d.h"
#if defined (WIFI_FEATURE) #include "../../modules/network/netconfig.h"
#include "../../modules/wifi/wificonfig.h"
#endif //WIFI_FEATURE
#if defined (ETH_FEATURE)
#include "../../modules/ethernet/ethconfig.h"
#endif //ETH_FEATURE
#include "../../modules/authentication/authentication_service.h" #include "../../modules/authentication/authentication_service.h"
//Get current IP //Get current IP
//[ESP111] //[ESP111]
@ -36,24 +31,8 @@ bool Commands::ESP111(const char* cmd_params, level_authenticate_type auth_type,
bool response = true; bool response = true;
String parameter; String parameter;
String res = get_param (cmd_params, ""); String res = get_param (cmd_params, "");
String currentIP="";
(void)auth_type; (void)auth_type;
#if defined( WIFI_FEATURE) res += NetConfig::localIP();
if (WiFi.getMode() == WIFI_STA) {
currentIP = WiFi.localIP().toString();
} else if (WiFi.getMode() == WIFI_AP) {
currentIP = WiFi.softAPIP().toString();
}
#endif //WIFI_FEATURE
#if defined (ETH_FEATURE)
if (EthConfig::started()) {
currentIP = ETH.localIP().toString();
}
#endif //ETH_FEATURE
if (currentIP.length() == 0) {
currentIP = "0.0.0.0";
}
res += currentIP;
//log_esp3d("Client %d", output->client()); //log_esp3d("Client %d", output->client());
output->printMSG (res.c_str()); output->printMSG (res.c_str());
return response; return response;

View File

@ -24,8 +24,8 @@
#include "../settings_esp3d.h" #include "../settings_esp3d.h"
#include "../../modules/authentication/authentication_service.h" #include "../../modules/authentication/authentication_service.h"
#include "../../modules/time/time_server.h" #include "../../modules/time/time_server.h"
//Init / Get current time //Sync / Set / Get current time
//[ESP140]<INIT> <srv1=XXXXX> <srv2=XXXXX> <srv3=XXXXX> <zone=xxx> <dst=YES/NO> <time=YYYY-MM-DD#H24:MM:SS> pwd=<admin password> //[ESP140]<SYNC> <srv1=XXXXX> <srv2=XXXXX> <srv3=XXXXX> <zone=xxx> <dst=YES/NO> <time=YYYY-MM-DD#H24:MM:SS> pwd=<admin password>
bool Commands::ESP140(const char* cmd_params, level_authenticate_type auth_type, ESP3DOutput * output) bool Commands::ESP140(const char* cmd_params, level_authenticate_type auth_type, ESP3DOutput * output)
{ {
bool response = true; bool response = true;
@ -84,13 +84,20 @@ bool Commands::ESP140(const char* cmd_params, level_authenticate_type auth_type,
output->printMSG("Setting time"); output->printMSG("Setting time");
if(!timeserver.setTime(s.c_str())) { if(!timeserver.setTime(s.c_str())) {
output->printERROR("Set time failed!"); output->printERROR("Set time failed!");
response = false;
} }
} }
if (hastag(parameter.c_str(), "INIT")) { if (hastag(parameter.c_str(), "SYNC")) {
if (timeserver.is_internet_time()) {
output->printMSG("Contacting time servers"); output->printMSG("Contacting time servers");
if(!timeserver.begin()) { if(!timeserver.begin()) {
output->printERROR("Init time failed!"); output->printERROR("Init time failed!");
response = false;
}
} else {
output->printERROR("Time is manual!");
response = false;
} }
} }
} }

View File

@ -47,7 +47,7 @@ bool Commands::ESP216(const char* cmd_params, level_authenticate_type auth_type,
parameter.toUpperCase(); parameter.toUpperCase();
if (parameter == "SNAP") { if (parameter == "SNAP") {
output->printMSG("Creating snapshot"); output->printMSG("Creating snapshot");
if(esp3d_display.snapshot()){ if(esp3d_display.snapshot()) {
output->printMSG("Snapshot saved"); output->printMSG("Snapshot saved");
} else { } else {
output->printERROR("Error!"); output->printERROR("Error!");

View File

@ -0,0 +1,46 @@
/*
ESP290.cpp - ESP3D command class
Copyright (c) 2014 Luc Lebosse. All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "../../include/esp3d_config.h"
#include "../commands.h"
#include "../../modules/authentication/authentication_service.h"
#include "../esp3doutput.h"
//Delay command
//[ESP290]<delay in ms>[pwd=<user password>]
bool Commands::ESP290(const char* cmd_params, level_authenticate_type auth_type, ESP3DOutput * output)
{
bool response = true;
String parameter;
#ifdef AUTHENTICATION_FEATURE
if (auth_type == LEVEL_GUEST) {
output->printERROR("Wrong authentication!", 401);
return false;
}
#else
(void)auth_type;
#endif //AUTHENTICATION_FEATURE
parameter = get_param (cmd_params, "");
//get time
if (parameter.length() != 0) {
output->printMSG ("Pause");
Hal::wait(parameter.toInt());
}
output->printMSG ("ok");
return response;
}

View File

@ -191,38 +191,7 @@ bool Commands::ESP400(const char* cmd_params, level_authenticate_type auth_type,
} }
output->printLN ("]}"); output->printLN ("]}");
#endif //WIFI_FEATURE #endif //WIFI_FEATURE
//15 - AP Network Mode (PHY)
//output->print (",{\"F\":\"network\",\"P\":\"");
//output->print (ESP_AP_PHY_MODE);
//output->print ("\",\"T\":\"B\",\"V\":\"");
//output->print (Settings_ESP3D::read_byte(ESP_AP_PHY_MODE));
//output->print ("\",\"H\":\"AP Network Mode\",\"O\":[{\"11b\":\"");
//output->print (WIFI_PHY_MODE_11B);
//output->print ("\"},{\"11g\":\"");
//output->print (WIFI_PHY_MODE_11G);
//output->printLN ("\"}]}");
//16-AP Authentication
//output->print (",{\"F\":\"network\",\"P\":\"");
//output->print (ESP_AP_AUTH_TYPE);
//output->print ("\",\"T\":\"B\",\"V\":\"");
//output->print (Settings_ESP3D::read_byte(ESP_AP_AUTH_TYPE));
//output->print ("\",\"H\":\"Authentication\",\"O\":[{\"Open\":\"");
//output->print (AUTH_OPEN);
//output->print ("\"},{\"WPA\":\"");
//output->print (AUTH_WPA_PSK);
//output->print ("\"},{\"WPA2\":\"");
//output->print (AUTH_WPA2_PSK);
//output->print ("\"},{\"WPA/WPA2\":\"");
//output->print (AUTH_WPA_WPA2_PSK);
//output->printLN ("\"}]}");
//17-AP SSID visibility
//output->print (",{\"F\":\"network\",\"P\":\"");
//output->print (ESP_SSID_VISIBLE);
//output->print ("\",\"T\":\"B\",\"V\":\"");
//output->print (Settings_ESP3D::read_byte(ESP_SSID_VISIBLE));
//output->printLN ("\",\"H\":\"SSID Visible\",\"O\":[{\"No\":\"0\"},{\"Yes\":\"1\"}]}");
#ifdef HTTP_FEATURE #ifdef HTTP_FEATURE
//18-HTTP On //18-HTTP On
output->print (",{\"F\":\"network\",\"P\":\""); output->print (",{\"F\":\"network\",\"P\":\"");
@ -288,7 +257,15 @@ bool Commands::ESP400(const char* cmd_params, level_authenticate_type auth_type,
#endif //AUTHENTICATION_FEATURE #endif //AUTHENTICATION_FEATURE
#ifdef TIMESTAMP_FEATURE #ifdef TIMESTAMP_FEATURE
//24-Time zone
//24a-Time zone
output->print (",{\"F\":\"network\",\"P\":\"");
output->print (ESP_INTERNET_TIME);
output->print("\",\"T\":\"B\",\"V\":\"");
output->print ((int8_t)Settings_ESP3D::read_byte(ESP_INTERNET_TIME));
output->printLN("\",\"H\":\"Internet Time\",\"O\":[{\"No\":\"0\"},{\"Yes\":\"1\"}]}");
//24b-Time zone
output->print (",{\"F\":\"network\",\"P\":\""); output->print (",{\"F\":\"network\",\"P\":\"");
output->print (ESP_TIMEZONE); output->print (ESP_TIMEZONE);
output->print("\",\"T\":\"B\",\"V\":\""); output->print("\",\"T\":\"B\",\"V\":\"");
@ -301,6 +278,7 @@ bool Commands::ESP400(const char* cmd_params, level_authenticate_type auth_type,
output->printf("{\"%d\":\"%d\"}", i, i); output->printf("{\"%d\":\"%d\"}", i, i);
} }
output->printLN("]}"); output->printLN("]}");
//25- DST //25- DST
output->print (",{\"F\":\"network\",\"P\":\""); output->print (",{\"F\":\"network\",\"P\":\"");
output->print (ESP_TIME_IS_DST); output->print (ESP_TIME_IS_DST);

View File

@ -28,6 +28,9 @@
#ifdef BUZZER_DEVICE #ifdef BUZZER_DEVICE
#include "../../modules/buzzer/buzzer.h" #include "../../modules/buzzer/buzzer.h"
#endif //BUZZER_DEVICE #endif //BUZZER_DEVICE
#ifdef TIMESTAMP_FEATURE
#include "../../modules/time/time_server.h"
#endif //TIMESTAMP_FEATURE
//Set EEPROM setting //Set EEPROM setting
//[ESP401]P=<position> T=<type> V=<value> pwd=<user/admin password> //[ESP401]P=<position> T=<type> V=<value> pwd=<user/admin password>
bool Commands::ESP401(const char* cmd_params, level_authenticate_type auth_type, ESP3DOutput * output) bool Commands::ESP401(const char* cmd_params, level_authenticate_type auth_type, ESP3DOutput * output)
@ -64,6 +67,11 @@ bool Commands::ESP401(const char* cmd_params, level_authenticate_type auth_type,
case ESP_TARGET_FW: case ESP_TARGET_FW:
Settings_ESP3D::GetFirmwareTarget(true); Settings_ESP3D::GetFirmwareTarget(true);
break; break;
#ifdef TIMESTAMP_FEATURE
case ESP_INTERNET_TIME:
timeserver.begin();
break;
#endif //TIMESTAMP_FEATURE
#ifdef DHT_DEVICE #ifdef DHT_DEVICE
case ESP_DHT_TYPE: case ESP_DHT_TYPE:
esp3d_DHT.begin(); esp3d_DHT.begin();

View File

@ -35,9 +35,13 @@
#ifdef HTTP_FEATURE #ifdef HTTP_FEATURE
#include "../../modules/http/http_server.h" #include "../../modules/http/http_server.h"
#endif //HTTP_FEATURE #endif //HTTP_FEATURE
#ifdef TIMESTAMP_FEATURE
#include "../../modules/time/time_server.h"
#endif //TIMESTAMP_FEATURE
//get fw version firmare target and fw version //get fw version firmare target and fw version
//eventually set time with pc time
//output is JSON or plain text according parameter //output is JSON or plain text according parameter
//[ESP800]<plain> //[ESP800]<plain><time=YYYY-MM-DD-HH-MM-SS>
bool Commands::ESP800(const char* cmd_params, level_authenticate_type auth_type, ESP3DOutput * output) bool Commands::ESP800(const char* cmd_params, level_authenticate_type auth_type, ESP3DOutput * output)
{ {
bool response = true; bool response = true;
@ -51,6 +55,19 @@ bool Commands::ESP800(const char* cmd_params, level_authenticate_type auth_type,
(void)auth_type; (void)auth_type;
#endif //AUTHENTICATION_FEATURE #endif //AUTHENTICATION_FEATURE
bool plain = hastag(cmd_params,"plain"); bool plain = hastag(cmd_params,"plain");
#ifdef TIMESTAMP_FEATURE
String newtime = get_param (cmd_params, "time=");
String tparm = (timeserver.is_internet_time())?"Auto":"Manual";
if (!timeserver.is_internet_time() && (newtime.length() > 0)) {
if (!timeserver.setTime(newtime.c_str())) {
tparm="Failed to set";
}
} else {
if (!timeserver.is_internet_time() && (newtime.length() == 0)) {
tparm="Not set";
}
}
#endif //TIMESTAMP_FEATURE
//FW version //FW version
if (plain) { if (plain) {
output->print("FW version:"); output->print("FW version:");
@ -123,6 +140,18 @@ bool Commands::ESP800(const char* cmd_params, level_authenticate_type auth_type,
#else #else
output->print("Synchronous"); output->print("Synchronous");
#endif //ASYNCWEBSERVER_FEATURE #endif //ASYNCWEBSERVER_FEATURE
if(plain) {
output->printLN("");
} else {
output->print("\"");
}
//WebSocket IP
if (plain) {
output->print("Web Socket IP:");
} else {
output->print(",\"WebSocketIP\":\"");
}
output->print(NetConfig::localIP().c_str());
if(plain) { if(plain) {
output->printLN(""); output->printLN("");
} else { } else {
@ -134,12 +163,17 @@ bool Commands::ESP800(const char* cmd_params, level_authenticate_type auth_type,
} else { } else {
output->print(",\"WebSocketport\":\""); output->print(",\"WebSocketport\":\"");
} }
#if defined (ASYNCWEBSERVER_FEATURE)
output->print(HTTP_Server::port());
#else
output->print(HTTP_Server::port() +1); output->print(HTTP_Server::port() +1);
#endif
if(plain) { if(plain) {
output->printLN(""); output->printLN("");
} else { } else {
output->print("\""); output->print("\"");
} }
#endif // (WIFI_FEATURE) || ETH_FEATURE) && HTTP_FEATURE) #endif // (WIFI_FEATURE) || ETH_FEATURE) && HTTP_FEATURE)
#if defined(WIFI_FEATURE) || defined(ETH_FEATURE) || defined(BT_FEATURE) #if defined(WIFI_FEATURE) || defined(ETH_FEATURE) || defined(BT_FEATURE)
//Hostname //Hostname
@ -206,6 +240,22 @@ bool Commands::ESP800(const char* cmd_params, level_authenticate_type auth_type,
} else { } else {
output->print("\""); output->print("\"");
} }
//time server
if (plain) {
output->print("Time:");
} else {
output->print(",\"Time\":\"");
}
#ifdef TIMESTAMP_FEATURE
output->print(tparm.c_str());
#else
output->print("None");
#endif //TIMESTAMP_FEATURE
if(plain) {
output->printLN("");
} else {
output->print("\"");
}
//final //final
if(!plain) { if(!plain) {

View File

@ -85,7 +85,7 @@ void Hal::toneESP(uint8_t pin, unsigned int frequency, unsigned int duration, bo
#endif //ARDUINO_ARCH_ESP8266 #endif //ARDUINO_ARCH_ESP8266
#if defined(ARDUINO_ARCH_ESP32) #if defined(ARDUINO_ARCH_ESP32)
int channel = getAnalogWriteChannel(pin); int channel = getAnalogWriteChannel(pin);
if (channel != -1){ if (channel != -1) {
ledcAttachPin(pin, channel); ledcAttachPin(pin, channel);
ledcWriteTone(channel,frequency); ledcWriteTone(channel,frequency);
if (sync) { if (sync) {
@ -103,7 +103,7 @@ void Hal::no_tone(uint8_t pin)
#endif //ARDUINO_ARCH_ESP8266 #endif //ARDUINO_ARCH_ESP8266
#if defined(ARDUINO_ARCH_ESP32) #if defined(ARDUINO_ARCH_ESP32)
int channel = getAnalogWriteChannel(pin); int channel = getAnalogWriteChannel(pin);
if (channel != -1){ if (channel != -1) {
ledcWrite(channel, 0); ledcWrite(channel, 0);
} }
#endif //ARDUINO_ARCH_ESP32 #endif //ARDUINO_ARCH_ESP32

View File

@ -78,6 +78,9 @@
#ifdef BUZZER_DEVICE #ifdef BUZZER_DEVICE
#define DEFAULT_BUZZER_STATE 1 #define DEFAULT_BUZZER_STATE 1
#endif //BUZZER_DEVICE #endif //BUZZER_DEVICE
#ifdef TIMESTAMP_FEATURE
#define DEFAULT_INTERNET_TIME 0
#endif //TIMESTAMP_FEATURE
#define DEFAULT_ESP_BYTE 0 #define DEFAULT_ESP_BYTE 0
#define DEFAULT_ESP_STRING_SIZE 0 #define DEFAULT_ESP_STRING_SIZE 0
@ -221,6 +224,11 @@ uint8_t Settings_ESP3D::get_default_byte_value(int pos)
case ESP_RADIO_MODE: case ESP_RADIO_MODE:
res = DEFAULT_ESP_RADIO_MODE; res = DEFAULT_ESP_RADIO_MODE;
break; break;
#ifdef TIMESTAMP_FEATURE
case ESP_INTERNET_TIME:
res = DEFAULT_INTERNET_TIME;
break;
#endif //TIMESTAMP_FEATURE
#ifdef BUZZER_DEVICE #ifdef BUZZER_DEVICE
case ESP_BUZZER: case ESP_BUZZER:
res = DEFAULT_BUZZER_STATE; res = DEFAULT_BUZZER_STATE;
@ -1071,6 +1079,8 @@ bool Settings_ESP3D::reset()
#endif //SDCARD_FEATURE #endif //SDCARD_FEATURE
#ifdef TIMESTAMP_FEATURE #ifdef TIMESTAMP_FEATURE
//Internet time
Settings_ESP3D::write_byte(ESP_INTERNET_TIME,Settings_ESP3D::get_default_byte_value(ESP_INTERNET_TIME));
//Time Zone //Time Zone
Settings_ESP3D::write_byte(ESP_TIMEZONE,Settings_ESP3D::get_default_byte_value(ESP_TIMEZONE)); Settings_ESP3D::write_byte(ESP_TIMEZONE,Settings_ESP3D::get_default_byte_value(ESP_TIMEZONE));
//Is DST Time Zone //Is DST Time Zone

View File

@ -48,7 +48,7 @@
#define ESP_CALIBRATION 117 //1 byte = flag #define ESP_CALIBRATION 117 //1 byte = flag
#define ESP_AP_CHANNEL 118 //1 byte = flag #define ESP_AP_CHANNEL 118 //1 byte = flag
#define ESP_BUZZER 119 //1 byte = flag #define ESP_BUZZER 119 //1 byte = flag
//#define ESP_SSID_VISIBLE 120 //1 byte = flag #define ESP_INTERNET_TIME 120 //1 byte = flag
#define ESP_HTTP_PORT 121 //4 bytes = int #define ESP_HTTP_PORT 121 //4 bytes = int
#define ESP_TELNET_PORT 125 //4 bytes = int #define ESP_TELNET_PORT 125 //4 bytes = int
#define ESP_OUTPUT_FLAG 129 //1 bytes = flag #define ESP_OUTPUT_FLAG 129 //1 bytes = flag

View File

@ -73,4 +73,19 @@
#define USE_CELSIUS 1 #define USE_CELSIUS 1
#define USE_FAHRENHEIT 2 #define USE_FAHRENHEIT 2
//Errors code
#define ESP_ERROR_AUTHENTICATION 1
#define ESP_ERROR_FILE_CREATION 2
#define ESP_ERROR_FILE_WRITE 3
#define ESP_ERROR_UPLOAD 4
#define ESP_ERROR_NOT_ENOUGH_SPACE 5
#define ESP_ERROR_UPLOAD_CANCELLED 6
#define ESP_ERROR_FILE_CLOSE 7
#define ESP_ERROR_NO_SD 8
#define ESP_ERROR_MOUNT_SD 9
#define ESP_ERROR_RESET_NUMBERING 10
#define ESP_ERROR_BUFFER_OVERFLOW 11
#define ESP_ERROR_START_UPLOAD 12
#define ESP_ERROR_SIZE 13
#endif //_DEFINES_ESP3D_H #endif //_DEFINES_ESP3D_H

View File

@ -22,7 +22,7 @@
#define _VERSION_ESP3D_H #define _VERSION_ESP3D_H
//version and sources location //version and sources location
#define FW_VERSION "3.0.0.a13" #define FW_VERSION "3.0.0.a14"
#define REPOSITORY "https://github.com/luc-github/ESP3D" #define REPOSITORY "https://github.com/luc-github/ESP3D"
#endif //_VERSION_ESP3D_H #endif //_VERSION_ESP3D_H

View File

@ -94,7 +94,7 @@ Ticker esp_lv_tick; /* timer for interrupt handler */
#define ESP_FLASH_LETTER_DRIVE 'F' #define ESP_FLASH_LETTER_DRIVE 'F'
//#define ESP_SD_LETTER_DRIVE 'S' //#define ESP_SD_LETTER_DRIVE 'S'
//Logo //Logo
LV_IMG_DECLARE(esplogo) LV_IMG_DECLARE(esplogo)
/* Display flushing */ /* Display flushing */
@ -155,7 +155,7 @@ bool esp_lv_touch_read(lv_indev_drv_t * indev, lv_indev_data_t * data)
} }
data->point.x = last_x; data->point.x = last_x;
data->point.y = last_y; data->point.y = last_y;
return false; return false;
} }
#endif //DISPLAY_TOUCH_DRIVER #endif //DISPLAY_TOUCH_DRIVER
@ -193,7 +193,9 @@ bool Display::startCalibration()
bool Display::display_network_status(bool force) bool Display::display_network_status(bool force)
{ {
if (esp_lv_network_label == nullptr)return false; if (esp_lv_network_label == nullptr) {
return false;
}
static int sig = -1; static int sig = -1;
bool refresh_signal = false; bool refresh_signal = false;
bool refresh_label = false; bool refresh_label = false;
@ -233,7 +235,7 @@ bool Display::display_network_status(bool force)
} }
if ( force || refresh_signal || refresh_label) { if ( force || refresh_signal || refresh_label) {
String s ; String s ;
if (sig == -1){ if (sig == -1) {
s = LV_SYMBOL_CLOSE; s = LV_SYMBOL_CLOSE;
} else { } else {
s = LV_SYMBOL_WIFI; s = LV_SYMBOL_WIFI;
@ -348,9 +350,9 @@ bool Display::display_IP(bool force)
void Display::show_screenID(uint8_t screenID) void Display::show_screenID(uint8_t screenID)
{ {
if (_screenID != screenID){ if (_screenID != screenID) {
#if defined(AUTO_SNAPSHOT_FEATURE) #if defined(AUTO_SNAPSHOT_FEATURE)
if (_screenID != -1){ if (_screenID != -1) {
String s = "/snap" + String(_screenID); String s = "/snap" + String(_screenID);
s+=".bin"; s+=".bin";
snapshot((char *)s.c_str()); snapshot((char *)s.c_str());
@ -359,8 +361,7 @@ void Display::show_screenID(uint8_t screenID)
_screenID = screenID; _screenID = screenID;
clear_screen(); clear_screen();
switch (screenID) { switch (screenID) {
case SPLASH_SCREEN: case SPLASH_SCREEN: {
{
lv_obj_t * img_splash = lv_img_create(esp_lv_screen, NULL); lv_obj_t * img_splash = lv_img_create(esp_lv_screen, NULL);
lv_img_set_src(img_splash, &esplogo); lv_img_set_src(img_splash, &esplogo);
lv_obj_align(img_splash, NULL, LV_ALIGN_CENTER, 0, -20); lv_obj_align(img_splash, NULL, LV_ALIGN_CENTER, 0, -20);
@ -373,8 +374,7 @@ void Display::show_screenID(uint8_t screenID)
lv_obj_align(labelsplash, NULL, LV_ALIGN_CENTER, 0, 120); lv_obj_align(labelsplash, NULL, LV_ALIGN_CENTER, 0, 120);
} }
break; break;
case MAIN_SCREEN: case MAIN_SCREEN: {
{
lv_obj_t * esp_lv_top_container; lv_obj_t * esp_lv_top_container;
lv_obj_t * esp_lv_main_container; lv_obj_t * esp_lv_main_container;
lv_obj_t * esp_lv_bottom_container; lv_obj_t * esp_lv_bottom_container;
@ -414,8 +414,7 @@ void Display::show_screenID(uint8_t screenID)
} }
break; break;
case CALIBRATION_SCREEN: case CALIBRATION_SCREEN: {
{
lv_obj_t * labeltouch = lv_label_create(esp_lv_screen, NULL); lv_obj_t * labeltouch = lv_label_create(esp_lv_screen, NULL);
lv_label_set_text(labeltouch, "Touch corners when requested."); lv_label_set_text(labeltouch, "Touch corners when requested.");
lv_obj_align(labeltouch, NULL, LV_ALIGN_CENTER, 0, 0); lv_obj_align(labeltouch, NULL, LV_ALIGN_CENTER, 0, 0);
@ -575,7 +574,7 @@ void Display::SetStatus(const char * status)
void Display::clear_screen(bool force) void Display::clear_screen(bool force)
{ {
//clear all objects on screen //clear all objects on screen
if(esp_lv_screen != nullptr){ if(esp_lv_screen != nullptr) {
lv_obj_del(esp_lv_screen); lv_obj_del(esp_lv_screen);
} }
//reset global object //reset global object
@ -639,7 +638,7 @@ bool Display::snapshot(char * filename)
#if defined(DISPLAY_SNAPSHOT_FEATURE) #if defined(DISPLAY_SNAPSHOT_FEATURE)
if(filename) { if(filename) {
fsSnapFile = ESP_FileSystem::open(filename, ESP_FILE_WRITE); fsSnapFile = ESP_FileSystem::open(filename, ESP_FILE_WRITE);
}else { } else {
fsSnapFile = ESP_FileSystem::open(SNAPFILENAME, ESP_FILE_WRITE); fsSnapFile = ESP_FileSystem::open(SNAPFILENAME, ESP_FILE_WRITE);
} }
if (!fsSnapFile) { if (!fsSnapFile) {

View File

@ -48,9 +48,13 @@ lv_fs_res_t esp_flash_open(lv_fs_drv_t * drv, void * file_p, const char * fn, lv
{ {
(void) drv; /*Unused*/ (void) drv; /*Unused*/
const char * flags = ""; const char * flags = "";
if(mode == LV_FS_MODE_WR) flags = "w"; if(mode == LV_FS_MODE_WR) {
else if(mode == LV_FS_MODE_RD) flags = "r"; flags = "w";
else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = "a"; } else if(mode == LV_FS_MODE_RD) {
flags = "r";
} else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) {
flags = "a";
}
char buf[256]; char buf[256];
sprintf(buf, "/%s", fn); sprintf(buf, "/%s", fn);
File * f= new File(); File * f= new File();
@ -64,8 +68,7 @@ lv_fs_res_t esp_flash_open(lv_fs_drv_t * drv, void * file_p, const char * fn, lv
#endif #endif
if(!(*f)) { if(!(*f)) {
return LV_FS_RES_UNKNOWN; return LV_FS_RES_UNKNOWN;
} } else {
else {
f->seek(0); f->seek(0);
file_t * ft = (file_t *)file_p; file_t * ft = (file_t *)file_p;
ft->fileobjecthandle = f; ft->fileobjecthandle = f;
@ -85,7 +88,7 @@ lv_fs_res_t esp_flash_close(lv_fs_drv_t * drv, void * file_p)
{ {
(void) drv; /*Unused*/ (void) drv; /*Unused*/
file_t * ft = (file_t *)file_p; file_t * ft = (file_t *)file_p;
if(ft->fileobjecthandle){ if(ft->fileobjecthandle) {
(ft->fileobjecthandle)->close(); (ft->fileobjecthandle)->close();
delete(ft->fileobjecthandle); delete(ft->fileobjecthandle);
ft->fileobjecthandle = nullptr; ft->fileobjecthandle = nullptr;
@ -107,7 +110,7 @@ lv_fs_res_t esp_flash_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_
{ {
(void) drv; /*Unused*/ (void) drv; /*Unused*/
file_t * ft = (file_t *)file_p; file_t * ft = (file_t *)file_p;
if(ft->fileobjecthandle){ if(ft->fileobjecthandle) {
*br = (ft->fileobjecthandle)->read((uint8_t*)buf,btr); *br = (ft->fileobjecthandle)->read((uint8_t*)buf,btr);
return LV_FS_RES_OK; return LV_FS_RES_OK;
} else { } else {
@ -127,7 +130,7 @@ lv_fs_res_t esp_flash_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos)
{ {
(void) drv; /*Unused*/ (void) drv; /*Unused*/
file_t * ft = (file_t *)file_p; file_t * ft = (file_t *)file_p;
if(ft->fileobjecthandle){ if(ft->fileobjecthandle) {
(ft->fileobjecthandle)->seek(pos); (ft->fileobjecthandle)->seek(pos);
return LV_FS_RES_OK; return LV_FS_RES_OK;
} else { } else {
@ -147,7 +150,7 @@ lv_fs_res_t esp_flash_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
{ {
(void) drv; /*Unused*/ (void) drv; /*Unused*/
file_t * ft = (file_t *)file_p; file_t * ft = (file_t *)file_p;
if(ft->fileobjecthandle){ if(ft->fileobjecthandle) {
*pos_p = (ft->fileobjecthandle)->position(); *pos_p = (ft->fileobjecthandle)->position();
return LV_FS_RES_OK; return LV_FS_RES_OK;
} else { } else {

View File

@ -27,7 +27,7 @@
**********************/ **********************/
typedef struct { typedef struct {
File * fileobjecthandle; File * fileobjecthandle;
}file_t; } file_t;
/********************** /**********************
* PROTOTYPES * PROTOTYPES

View File

@ -145,7 +145,7 @@ size_t ESP_FileSystem::max_update_size()
//Is OTA available ? //Is OTA available ?
if (esp_ota_get_running_partition()) { if (esp_ota_get_running_partition()) {
const esp_partition_t* partition = esp_ota_get_next_update_partition(NULL); const esp_partition_t* partition = esp_ota_get_next_update_partition(NULL);
if (partition){ if (partition) {
flashsize = partition->size; flashsize = partition->size;
} }
} else { } else {

View File

@ -25,383 +25,398 @@
/* Generated by bin2c, do not edit manually */ /* Generated by bin2c, do not edit manually */
/* Contents of file tool.html.gz */ /* Contents of file tool.html.gz */
#define tool_html_gz_size 6005 #define tool_html_gz_size 6244
const unsigned char tool_html_gz[6005] PROGMEM = { const unsigned char tool_html_gz[6244] PROGMEM = {
0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xED, 0x3C, 0x69, 0x77, 0xDB, 0xB6, 0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xED, 0x3C, 0x89, 0x72, 0xDB, 0xC6,
0x96, 0x7F, 0x85, 0x41, 0x4F, 0x2D, 0x71, 0x4C, 0x4A, 0xDC, 0xB4, 0x5B, 0xCA, 0x4B, 0x9B, 0xA4, 0x92, 0xBF, 0x02, 0x4F, 0x2A, 0x26, 0xB1, 0x04, 0x48, 0x1C, 0xBC, 0x29, 0x52, 0xCF, 0x89, 0xED,
0xF5, 0x9C, 0xA4, 0xC9, 0x89, 0x9D, 0x97, 0x99, 0x93, 0xE4, 0xE4, 0x50, 0x22, 0x24, 0x71, 0x42, 0x44, 0x5B, 0xBE, 0x4A, 0x92, 0x9F, 0xF7, 0x95, 0xED, 0x52, 0x81, 0xC4, 0x90, 0xC4, 0x1A, 0x04,
0x91, 0x32, 0x09, 0x59, 0x76, 0x1C, 0xCF, 0x6F, 0x9F, 0x7B, 0x01, 0x90, 0x04, 0xB5, 0x79, 0x69, 0x28, 0x60, 0x68, 0x4A, 0x96, 0xB5, 0xDF, 0xBE, 0xDD, 0x33, 0x03, 0x60, 0xC0, 0x4B, 0x47, 0xFC,
0xDE, 0xBC, 0x7E, 0x68, 0x15, 0x89, 0x24, 0x96, 0x8B, 0xBB, 0x2F, 0x00, 0xDD, 0x93, 0x39, 0x5B, 0x36, 0xD9, 0xAA, 0x44, 0x16, 0x01, 0xCE, 0xD1, 0xD3, 0xD3, 0x77, 0xF7, 0x8C, 0x72, 0x34, 0x67,
0x44, 0xA3, 0x93, 0x39, 0xF5, 0x83, 0xD1, 0x49, 0xC6, 0xAE, 0x23, 0x3A, 0xC2, 0x96, 0x9B, 0x69, 0x8B, 0x70, 0x74, 0x34, 0xA7, 0x9E, 0x3F, 0x3A, 0x4A, 0xD9, 0x75, 0x48, 0x47, 0xD8, 0x72, 0x33,
0x12, 0x33, 0x73, 0xEA, 0x2F, 0xC2, 0xE8, 0xBA, 0x9F, 0xF9, 0x71, 0x66, 0x66, 0x34, 0x0D, 0xA7, 0x8D, 0x23, 0x66, 0x4E, 0xBD, 0x45, 0x10, 0x5E, 0xF7, 0x53, 0x2F, 0x4A, 0xCD, 0x94, 0x26, 0xC1,
0x03, 0x73, 0x91, 0x99, 0x8C, 0x5E, 0x31, 0x33, 0x0B, 0xBF, 0x51, 0xD3, 0x0F, 0xFE, 0x67, 0x95, 0x74, 0x60, 0x2E, 0x52, 0x93, 0xD1, 0x2B, 0x66, 0xA6, 0xC1, 0x37, 0x6A, 0x7A, 0xFE, 0x7F, 0xAF,
0xB1, 0xBE, 0x6D, 0x59, 0x3F, 0x0F, 0xCC, 0x35, 0x1D, 0x7F, 0x0D, 0xD9, 0x9E, 0x5E, 0x0E, 0x0E, 0x52, 0xD6, 0xB7, 0x2D, 0xEB, 0xE7, 0x81, 0xB9, 0xA6, 0xE3, 0x2F, 0x01, 0xDB, 0xD3, 0xCB, 0xC1,
0x5B, 0xE1, 0x71, 0x79, 0x75, 0x3B, 0x4E, 0x82, 0xEB, 0xCA, 0x12, 0xE4, 0x77, 0x1A, 0x5D, 0x52, 0x61, 0x2B, 0x7C, 0x5D, 0x5E, 0xDD, 0x8E, 0x63, 0xFF, 0xBA, 0xB4, 0x04, 0xF9, 0x9D, 0x86, 0x5F,
0x16, 0x4E, 0x7C, 0xED, 0x0F, 0xBA, 0xA2, 0xC4, 0x28, 0x9E, 0x8D, 0x67, 0x69, 0xE8, 0x47, 0x86, 0x29, 0x0B, 0x26, 0x9E, 0xF6, 0x86, 0xAE, 0x28, 0x31, 0xF2, 0xEF, 0xC6, 0xB3, 0x24, 0xF0, 0x42,
0x82, 0x83, 0x02, 0xCB, 0x5B, 0x5E, 0x0D, 0xA2, 0x30, 0xA6, 0xE6, 0x9C, 0x86, 0xB3, 0x39, 0xAC, 0x43, 0xC1, 0x41, 0x81, 0xD5, 0x5C, 0x5E, 0x0D, 0xC2, 0x20, 0xA2, 0xE6, 0x9C, 0x06, 0xB3, 0x39,
0xD5, 0xF0, 0x9C, 0x6E, 0xAB, 0x63, 0x7B, 0xEE, 0x60, 0x92, 0x44, 0x49, 0xDA, 0xFF, 0xC9, 0x75, 0xAC, 0x55, 0x6F, 0x3A, 0xDD, 0x56, 0xC7, 0x6E, 0xBA, 0x83, 0x49, 0x1C, 0xC6, 0x49, 0xFF, 0x27,
0xDD, 0xC1, 0xD8, 0x9F, 0x7C, 0x9D, 0xA5, 0xC9, 0x2A, 0x0E, 0x4C, 0xD9, 0x3A, 0x9D, 0x4E, 0x6F, 0xD7, 0x75, 0x07, 0x63, 0x6F, 0xF2, 0x65, 0x96, 0xC4, 0xAB, 0xC8, 0x37, 0x65, 0xEB, 0x74, 0x3A,
0x99, 0x3F, 0x8E, 0xE8, 0xCD, 0x38, 0x49, 0x03, 0x9A, 0xF6, 0xAD, 0x81, 0xB8, 0x31, 0xB3, 0xA5, 0xBD, 0x65, 0xDE, 0x38, 0xA4, 0x37, 0xE3, 0x38, 0xF1, 0x69, 0xD2, 0xB7, 0x06, 0xE2, 0xC5, 0x4C,
0x3F, 0x09, 0xE3, 0x19, 0x34, 0x2C, 0xFC, 0x2B, 0x73, 0x1D, 0x06, 0x6C, 0xCE, 0x29, 0xB8, 0x65, 0x97, 0xDE, 0x24, 0x88, 0x66, 0xD0, 0xB0, 0xF0, 0xAE, 0xCC, 0x75, 0xE0, 0xB3, 0x39, 0xDF, 0xC1,
0xC1, 0xCD, 0x7A, 0x1E, 0x32, 0xCA, 0x47, 0xD0, 0x7E, 0x9C, 0xAC, 0x53, 0x7F, 0x39, 0x58, 0xFA, 0x2D, 0xF3, 0x6F, 0xD6, 0xF3, 0x80, 0x51, 0x3E, 0x82, 0xF6, 0xA3, 0x78, 0x9D, 0x78, 0xCB, 0xC1,
0x41, 0x80, 0xC3, 0x9D, 0xC5, 0xE2, 0x96, 0xCD, 0x6F, 0x38, 0xF1, 0x7E, 0x14, 0xCE, 0xE2, 0x7E, 0xD2, 0xF3, 0x7D, 0x1C, 0xEE, 0x2C, 0x16, 0xB7, 0x6C, 0x7E, 0xC3, 0x37, 0xEF, 0x85, 0xC1, 0x2C,
0x44, 0xA7, 0xEC, 0xB6, 0xC1, 0x17, 0x19, 0x31, 0xA4, 0x77, 0xC4, 0xD2, 0x11, 0x0B, 0x8C, 0xAD, 0xEA, 0x87, 0x74, 0xCA, 0x6E, 0xEB, 0x7C, 0x91, 0x11, 0xC3, 0xFD, 0x8E, 0x58, 0x32, 0x62, 0xBE,
0xA6, 0x79, 0xD1, 0xC4, 0x85, 0x50, 0x1D, 0x55, 0x34, 0xCD, 0x6F, 0xF2, 0xA5, 0xBA, 0xFB, 0x69, 0xB1, 0xD5, 0x34, 0xCF, 0x9B, 0x38, 0x13, 0xCA, 0xA3, 0xF2, 0xA6, 0xF9, 0x4D, 0xB6, 0x54, 0x77,
0xBE, 0xA4, 0x29, 0xB2, 0x2C, 0x92, 0x28, 0xB0, 0x64, 0x99, 0x93, 0x05, 0xB7, 0x7D, 0x7B, 0x79, 0xFF, 0x9E, 0xBF, 0xD2, 0x04, 0x49, 0x16, 0x4A, 0x14, 0x58, 0xBC, 0xCC, 0xB6, 0x05, 0xAF, 0x7D,
0xA5, 0x65, 0x49, 0x14, 0x06, 0xDA, 0x4F, 0x41, 0x10, 0x48, 0xDC, 0xCC, 0x8C, 0xA5, 0xE1, 0x92, 0x7B, 0x79, 0xA5, 0xA5, 0x71, 0x18, 0xF8, 0xDA, 0x4F, 0xBE, 0xEF, 0x4B, 0xDC, 0xCC, 0x94, 0x25,
0x06, 0x05, 0x42, 0xFD, 0x98, 0xCD, 0xCD, 0x64, 0x6A, 0xB2, 0xEB, 0x25, 0xAD, 0x27, 0x41, 0xA0, 0xC1, 0x92, 0xFA, 0x39, 0x42, 0xFD, 0x88, 0xCD, 0xCD, 0x78, 0x6A, 0xB2, 0xEB, 0x25, 0xAD, 0xC6,
0xDF, 0xEC, 0x60, 0x5F, 0x0F, 0x3F, 0xB7, 0xFE, 0xCD, 0x32, 0xC9, 0x42, 0x16, 0x26, 0x71, 0x3F, 0xBE, 0xAF, 0xDF, 0xEC, 0x20, 0x5F, 0x0F, 0x7F, 0x6E, 0xBD, 0x9B, 0x65, 0x9C, 0x06, 0x2C, 0x88,
0xA5, 0x91, 0xCF, 0xC2, 0x4B, 0x3A, 0x08, 0xC2, 0x6C, 0x19, 0xF9, 0xD7, 0xFD, 0x71, 0x94, 0x4C, 0xA3, 0x7E, 0x42, 0x43, 0x8F, 0x05, 0x5F, 0xE9, 0xC0, 0x0F, 0xD2, 0x65, 0xE8, 0x5D, 0xF7, 0xC7,
0xBE, 0x16, 0xEC, 0x41, 0xA1, 0x6B, 0x76, 0x0B, 0x30, 0xE7, 0x1C, 0x0A, 0xE8, 0x24, 0x49, 0x7D, 0x61, 0x3C, 0xF9, 0x92, 0x93, 0x07, 0x99, 0xAE, 0xD9, 0x2D, 0xC0, 0x9C, 0x53, 0xC8, 0xA7, 0x93,
0x3E, 0x31, 0x4E, 0x62, 0x9A, 0xCB, 0x6A, 0x32, 0x99, 0xDC, 0x36, 0xFC, 0x09, 0xC2, 0xB9, 0x29, 0x38, 0xF1, 0xF8, 0xC4, 0x28, 0x8E, 0x68, 0xC6, 0xAB, 0xC9, 0x64, 0x72, 0x5B, 0xF7, 0x26, 0x08,
0x05, 0xB5, 0x43, 0x7C, 0x96, 0x65, 0xE5, 0x03, 0x35, 0xDF, 0xF0, 0xFB, 0xD3, 0x64, 0xB2, 0xCA, 0xE7, 0xA6, 0x60, 0xD4, 0x0E, 0xF6, 0x59, 0x96, 0x95, 0x0D, 0xD4, 0x3C, 0xC3, 0xEB, 0x4F, 0xE3,
0xE0, 0x3A, 0x4F, 0x80, 0x03, 0xCA, 0xD4, 0xDB, 0xC6, 0xD2, 0x8F, 0x69, 0x74, 0xB3, 0xF0, 0xD3, 0xC9, 0x2A, 0x85, 0xE7, 0x3C, 0x06, 0x0A, 0x28, 0x53, 0x6F, 0xEB, 0x4B, 0x2F, 0xA2, 0xE1, 0xCD,
0x59, 0x18, 0x9B, 0xE3, 0x84, 0xB1, 0x64, 0xD1, 0x77, 0x00, 0x99, 0xDD, 0x3A, 0x21, 0xB9, 0xB5, 0xC2, 0x4B, 0x66, 0x41, 0x64, 0x8E, 0x63, 0xC6, 0xE2, 0x45, 0xDF, 0x01, 0x64, 0x76, 0xCB, 0x84,
0xC1, 0xA9, 0x9C, 0x87, 0xA9, 0x1F, 0x84, 0xAB, 0xAC, 0x8F, 0x3A, 0x97, 0x2B, 0xFB, 0x38, 0xB9, 0xA4, 0xD6, 0x06, 0xA5, 0x32, 0x1A, 0x26, 0x9E, 0x1F, 0xAC, 0xD2, 0x3E, 0xCA, 0x5C, 0x26, 0xEC,
0x32, 0xB3, 0xB9, 0x1F, 0x24, 0xEB, 0xBE, 0xA5, 0xE1, 0x2C, 0xFC, 0xA6, 0xB3, 0xB1, 0x5F, 0xB7, 0xE3, 0xF8, 0xCA, 0x4C, 0xE7, 0x9E, 0x1F, 0xAF, 0xFB, 0x96, 0x86, 0xB3, 0xF0, 0x37, 0x99, 0x8D,
0x0C, 0xFC, 0x34, 0xAC, 0x96, 0x3E, 0xB8, 0xCF, 0x20, 0x89, 0xA9, 0xC9, 0x0D, 0xA3, 0xE0, 0x1A, 0xBD, 0xAA, 0x65, 0xE0, 0x4F, 0xDD, 0x6A, 0xE9, 0x83, 0xFB, 0x0C, 0x92, 0x98, 0x9A, 0x5C, 0x31,
0x30, 0x2C, 0xEF, 0x40, 0x45, 0x80, 0xB6, 0x9B, 0x6D, 0x8E, 0x1E, 0x56, 0xF4, 0x16, 0x7E, 0x72, 0x72, 0xAA, 0x01, 0xC1, 0xB2, 0x0E, 0x14, 0x04, 0x68, 0xBB, 0xD9, 0xA6, 0xE8, 0x61, 0x41, 0x6F,
0x0A, 0x64, 0xA3, 0x42, 0x13, 0xE8, 0x85, 0x99, 0xA2, 0x1A, 0xE5, 0xD4, 0xB9, 0xC8, 0x9B, 0xB2, 0xE1, 0x4F, 0xB6, 0x03, 0xD9, 0xA8, 0xEC, 0x09, 0xE4, 0xC2, 0x4C, 0x50, 0x8C, 0xB2, 0xDD, 0xB9,
0x0F, 0xB5, 0x78, 0x47, 0x97, 0xE4, 0xE4, 0xA6, 0x46, 0x4D, 0x93, 0x74, 0x01, 0x8B, 0xC4, 0x2C, 0x48, 0x9B, 0xA2, 0x0F, 0xA5, 0x78, 0x47, 0x97, 0xA4, 0xE4, 0xA6, 0x44, 0x4D, 0xE3, 0x64, 0x01,
0x4D, 0xA2, 0x9B, 0xAA, 0x26, 0x08, 0x4B, 0xF2, 0x57, 0x2C, 0x19, 0x48, 0xBD, 0x75, 0x91, 0x91, 0x8B, 0x44, 0x2C, 0x89, 0xC3, 0x9B, 0xB2, 0x24, 0x08, 0x4D, 0xF2, 0x56, 0x2C, 0x1E, 0x48, 0xB9,
0x39, 0x39, 0x6D, 0xA4, 0xC6, 0x81, 0x86, 0x07, 0x19, 0x77, 0xAB, 0xD5, 0xDA, 0x27, 0xC8, 0xB2, 0x75, 0x91, 0x90, 0xD9, 0x76, 0xDA, 0xB8, 0x1B, 0x07, 0x1A, 0x1E, 0xA4, 0xDC, 0xAD, 0x56, 0x6B,
0x35, 0x5C, 0xF8, 0x33, 0x2A, 0xF4, 0x6C, 0x5B, 0xBC, 0xA0, 0x72, 0xF7, 0x13, 0x6F, 0x18, 0x67, 0x1F, 0x23, 0x8B, 0xD6, 0x60, 0xE1, 0xCD, 0xA8, 0x90, 0xB3, 0x6D, 0xF6, 0x82, 0xC8, 0xDD, 0x8F,
0x94, 0x69, 0x7B, 0xE4, 0xD7, 0xA9, 0x4A, 0xF9, 0xCE, 0xB1, 0x66, 0x62, 0xB2, 0x14, 0x1C, 0x9A, 0xBD, 0x41, 0x94, 0x52, 0xA6, 0xED, 0xE1, 0x5F, 0xA7, 0xCC, 0xE5, 0x3B, 0xC7, 0x9A, 0xB1, 0xC9,
0xB0, 0x1D, 0x55, 0x38, 0x1A, 0xF5, 0x33, 0x6A, 0x82, 0xAE, 0x26, 0x2B, 0xA6, 0x35, 0xEC, 0x56, 0x12, 0x30, 0x68, 0x42, 0x77, 0x54, 0xE6, 0x68, 0xD4, 0x4B, 0xA9, 0x09, 0xB2, 0x1A, 0xAF, 0x98,
0x66, 0x94, 0x70, 0xB7, 0xFA, 0xAA, 0x0C, 0x17, 0x56, 0x70, 0x53, 0x15, 0x75, 0xBB, 0xED, 0x4F, 0x56, 0xB7, 0x5B, 0xA9, 0x51, 0xC0, 0xDD, 0xEA, 0x2B, 0x13, 0x5C, 0x68, 0xC1, 0x4D, 0x99, 0xD5,
0x69, 0x6F, 0x00, 0x33, 0x90, 0x93, 0xE0, 0xD5, 0x1E, 0x41, 0x9A, 0x61, 0x41, 0x67, 0x37, 0xEF, 0xED, 0xB6, 0x37, 0xA5, 0xBD, 0x01, 0xCC, 0x40, 0x4A, 0x82, 0x55, 0x7B, 0xC4, 0xD6, 0x0C, 0x0B,
0xB0, 0x2D, 0xC7, 0xB0, 0x3B, 0x2D, 0xC3, 0x71, 0x5D, 0xA3, 0xD1, 0xD6, 0x25, 0x0E, 0xC8, 0xEB, 0x3A, 0xBB, 0x59, 0x87, 0x6D, 0x39, 0x86, 0xDD, 0x69, 0x19, 0x8E, 0xEB, 0x1A, 0xF5, 0xB6, 0x2E,
0xE5, 0x86, 0x9D, 0x09, 0xF5, 0x1D, 0xB3, 0xB8, 0x50, 0x85, 0x30, 0xE6, 0xF2, 0x14, 0x1A, 0x51, 0x71, 0x40, 0x5A, 0x2F, 0x37, 0xF4, 0x4C, 0x88, 0xEF, 0x98, 0x45, 0xB9, 0x28, 0x04, 0x11, 0xE7,
0x1D, 0x6C, 0x09, 0xC9, 0xAF, 0x85, 0xA8, 0x3D, 0xCB, 0x1A, 0x28, 0xBE, 0x74, 0x42, 0x63, 0x46, 0xA7, 0x90, 0x88, 0xF2, 0x60, 0x4B, 0x70, 0x7E, 0x2D, 0x58, 0xDD, 0xB4, 0xAC, 0x81, 0x62, 0x4B,
0xD3, 0x4D, 0xF7, 0xB6, 0x08, 0x83, 0x20, 0xA2, 0x22, 0x24, 0x25, 0xAB, 0xC9, 0xDC, 0x44, 0x8F, 0x27, 0x34, 0x62, 0x34, 0xD9, 0x34, 0x6F, 0x8B, 0xC0, 0xF7, 0x43, 0x2A, 0x5C, 0x52, 0xBC, 0x9A,
0x00, 0xFC, 0x5C, 0xF8, 0x71, 0xB8, 0x5C, 0x45, 0xDC, 0xBF, 0x0C, 0xF6, 0xF7, 0x4C, 0x56, 0x69, 0xCC, 0x4D, 0xB4, 0x08, 0x40, 0xCF, 0x85, 0x17, 0x05, 0xCB, 0x55, 0xC8, 0xED, 0xCB, 0x60, 0x7F,
0x06, 0x2C, 0x5A, 0x26, 0x21, 0x07, 0x7E, 0x4F, 0x8D, 0xE1, 0x72, 0x5B, 0xFA, 0x29, 0x60, 0x34, 0xCF, 0x64, 0x95, 0xA4, 0x40, 0xA2, 0x65, 0x1C, 0x70, 0xE0, 0xF7, 0x94, 0x18, 0xCE, 0xB7, 0xA5,
0x38, 0x10, 0x0F, 0x1E, 0xA8, 0xCF, 0x3B, 0x54, 0x70, 0x91, 0x7C, 0x33, 0x57, 0x19, 0x46, 0x24, 0x97, 0x00, 0x46, 0x83, 0x03, 0xFE, 0xE0, 0x81, 0xF2, 0xBC, 0x43, 0x04, 0x17, 0xF1, 0x37, 0x73,
0x1A, 0xD1, 0x09, 0x13, 0xE8, 0x20, 0xAD, 0x5B, 0x8D, 0x9B, 0x0D, 0x9C, 0xE7, 0xE6, 0x32, 0x05, 0x95, 0xA2, 0x47, 0xA2, 0x21, 0x9D, 0x30, 0x81, 0x0E, 0xEE, 0x75, 0xAB, 0x71, 0xB3, 0x81, 0xD3,
0x32, 0xD2, 0xEB, 0xC3, 0x8E, 0xD4, 0x75, 0x3B, 0xFE, 0xB8, 0xB3, 0xE1, 0x1E, 0x1C, 0xDA, 0x0E, 0xDC, 0x5C, 0x26, 0xB0, 0x8D, 0xE4, 0xFA, 0xB0, 0x21, 0x75, 0xDD, 0x8E, 0x37, 0xEE, 0x6C, 0x98,
0x7C, 0xAF, 0x02, 0x45, 0x3A, 0x5B, 0xA3, 0xD2, 0x26, 0xBC, 0x6E, 0xA5, 0x89, 0x3B, 0xE0, 0x4A, 0x07, 0x87, 0xB6, 0x7D, 0xAF, 0x59, 0x82, 0x22, 0x8D, 0xAD, 0x51, 0x6A, 0x13, 0x56, 0xB7, 0xD4,
0x53, 0x7F, 0xC7, 0xCC, 0xFE, 0xF6, 0xCC, 0x2D, 0xD7, 0xBD, 0x03, 0x59, 0xA7, 0xDB, 0xB6, 0x7A, 0xC4, 0x0D, 0x70, 0xA9, 0xA9, 0xBF, 0x63, 0x66, 0x7F, 0x7B, 0xE6, 0x96, 0xE9, 0xDE, 0x81, 0xAC,
0xD6, 0x06, 0xB2, 0xB6, 0xE3, 0x8C, 0x3D, 0x8B, 0x23, 0x1B, 0x2E, 0x66, 0x37, 0x52, 0xA8, 0x73, 0xD3, 0x6D, 0x5B, 0x3D, 0x6B, 0x03, 0x59, 0xDB, 0x71, 0xC6, 0x4D, 0x8B, 0x23, 0x1B, 0x2C, 0x66,
0x3F, 0xDE, 0x74, 0xDB, 0xED, 0xC2, 0x7B, 0xA9, 0xF6, 0xCF, 0x83, 0x84, 0x98, 0x2B, 0x51, 0xD8, 0x37, 0x92, 0xA9, 0x73, 0x2F, 0xDA, 0x34, 0xDB, 0xED, 0xDC, 0x7A, 0xA9, 0xFA, 0xCF, 0x9D, 0x84,
0xE1, 0x4F, 0x2C, 0xFC, 0x6C, 0xAC, 0xDB, 0x9E, 0xE0, 0xE7, 0xD1, 0xE6, 0x84, 0xFA, 0x31, 0x4B, 0x98, 0x2B, 0x51, 0xD8, 0x61, 0x4F, 0x2C, 0xFC, 0xD9, 0x58, 0xB7, 0x3D, 0xC1, 0x9F, 0x47, 0xAB,
0xE9, 0xF5, 0x43, 0xDC, 0x46, 0x65, 0x22, 0xC7, 0x9A, 0xA3, 0x79, 0x98, 0x6C, 0xD7, 0x92, 0x46, 0x13, 0xCA, 0xC7, 0x2C, 0xA1, 0xD7, 0x0F, 0x31, 0x1B, 0xA5, 0x89, 0x1C, 0x6B, 0x8E, 0xE6, 0xE1,
0x98, 0x8F, 0xBD, 0x8B, 0xCC, 0x7F, 0x27, 0x45, 0x11, 0x20, 0x05, 0x16, 0xF2, 0xD5, 0x28, 0x6F, 0x6D, 0xBB, 0x96, 0x54, 0xC2, 0x6C, 0xEC, 0x5D, 0xDB, 0xFC, 0x33, 0x77, 0x14, 0x02, 0x52, 0xA0,
0xFB, 0xD5, 0x7C, 0x80, 0x47, 0xFE, 0xB2, 0xB3, 0xA2, 0x35, 0xD8, 0x17, 0xC6, 0xCB, 0x15, 0xFB, 0x21, 0x5F, 0x8C, 0xE2, 0xB5, 0x5F, 0x8E, 0x07, 0xB8, 0xE7, 0x2F, 0x3A, 0x4B, 0x52, 0x83, 0x7D,
0x88, 0xB9, 0xCB, 0x70, 0x1A, 0x46, 0xF4, 0x73, 0xBF, 0x9F, 0xD3, 0x83, 0x8F, 0xE6, 0x6A, 0x19, 0x41, 0xB4, 0x5C, 0xB1, 0x8F, 0x18, 0xBB, 0x0C, 0xA7, 0x41, 0x48, 0x3F, 0xF7, 0xFB, 0xD9, 0x7E,
0x25, 0x7E, 0x60, 0x8E, 0x57, 0xE0, 0x73, 0xFE, 0x76, 0x4B, 0xFF, 0xBF, 0x6E, 0x69, 0x70, 0xD0, 0xF0, 0xAB, 0xB9, 0x5A, 0x86, 0xB1, 0xE7, 0x9B, 0xE3, 0x15, 0xD8, 0x9C, 0xBF, 0xCD, 0xD2, 0xFF,
0xB8, 0x5B, 0xE3, 0x89, 0x15, 0xD0, 0x0D, 0x23, 0xF3, 0xDA, 0xE3, 0x6E, 0xE0, 0x3F, 0x48, 0xA8, 0xAD, 0x59, 0x1A, 0x1C, 0x54, 0xEE, 0xD6, 0x78, 0x62, 0xF9, 0x74, 0x43, 0xC9, 0x9A, 0xED, 0x71,
0x32, 0x0A, 0xFE, 0x2D, 0xDA, 0xBF, 0x8E, 0x68, 0x5D, 0x7B, 0x6C, 0x05, 0x9B, 0x39, 0xA8, 0x3D, 0xD7, 0xF7, 0x1E, 0xC4, 0x54, 0xE9, 0x05, 0xFF, 0x66, 0xED, 0x5F, 0x87, 0xB5, 0xAE, 0x3D, 0xB6,
0x6E, 0x07, 0xDD, 0xD6, 0xC3, 0x44, 0x2B, 0xAC, 0xFD, 0x6F, 0xD1, 0xFE, 0xC5, 0x45, 0xEB, 0xB4, 0xFC, 0xCD, 0x18, 0xD4, 0x1E, 0xB7, 0xFD, 0x6E, 0xEB, 0x61, 0xAC, 0x15, 0xDA, 0xFE, 0x37, 0x6B,
0x7B, 0xFE, 0x78, 0x92, 0x17, 0x2E, 0xD3, 0x24, 0x01, 0x8E, 0x1C, 0xA8, 0x5B, 0xEC, 0x8E, 0xD5, 0xFF, 0xE2, 0xAC, 0x75, 0xDA, 0x3D, 0x6F, 0x3C, 0xC9, 0x12, 0x97, 0x69, 0x1C, 0x03, 0x45, 0x0E,
0xDD, 0x05, 0xFB, 0x1E, 0xA5, 0xCB, 0x56, 0x01, 0xF2, 0x6F, 0x58, 0x72, 0x91, 0x04, 0x7E, 0x59, 0xE4, 0x2D, 0x76, 0xC7, 0xEA, 0xEE, 0x82, 0x7D, 0x8F, 0xD4, 0x65, 0x2B, 0x01, 0xF9, 0x13, 0x96,
0xEC, 0x70, 0x96, 0x15, 0x55, 0xF1, 0x34, 0xBC, 0xA2, 0xC1, 0xE0, 0x1B, 0xE4, 0xEC, 0x01, 0xBD, 0x5C, 0xC4, 0xBE, 0x57, 0x24, 0x3B, 0x9C, 0x64, 0x79, 0x56, 0x3C, 0x0D, 0xAE, 0xA8, 0x3F, 0xF8,
0xC2, 0x6D, 0x04, 0xD0, 0x44, 0x89, 0x95, 0x80, 0x65, 0x61, 0x29, 0x8A, 0x35, 0x16, 0xA8, 0x2C, 0x06, 0x31, 0xBB, 0x4F, 0xAF, 0xB0, 0x8C, 0x00, 0x92, 0x28, 0xB1, 0x12, 0xB0, 0x2C, 0x4C, 0x45,
0x36, 0x58, 0x83, 0x72, 0xC7, 0x21, 0xAF, 0x93, 0xF8, 0x3D, 0x6A, 0xFE, 0x34, 0x82, 0x90, 0xCA, 0x31, 0xC7, 0x02, 0x91, 0xC5, 0x06, 0x6B, 0x50, 0x54, 0x1C, 0xB2, 0x3C, 0x89, 0xBF, 0xA3, 0xE4,
0x2B, 0xA8, 0x9D, 0x15, 0xF1, 0x76, 0xAB, 0x1A, 0x6E, 0x3D, 0x5D, 0xA2, 0xCA, 0xCB, 0x05, 0x50, 0x4F, 0x43, 0x70, 0xA9, 0x3C, 0x83, 0xDA, 0x99, 0x11, 0x6F, 0xB7, 0xAA, 0xEE, 0xB6, 0xA9, 0x4B,
0xB8, 0x9B, 0x3D, 0x55, 0x9E, 0x6D, 0x55, 0x2B, 0xC0, 0x4A, 0x75, 0xA8, 0x76, 0x0A, 0x5B, 0xDB, 0x54, 0x79, 0xBA, 0x00, 0x02, 0x77, 0xB3, 0x27, 0xCB, 0xB3, 0xAD, 0x72, 0x06, 0x58, 0xCA, 0x0E,
0x3B, 0x57, 0x76, 0xEF, 0x9B, 0xDE, 0x77, 0x4A, 0x3E, 0x16, 0x59, 0xA8, 0x52, 0x27, 0x63, 0xBD, 0xD5, 0x4E, 0xA1, 0x6B, 0x7B, 0xE7, 0xCA, 0xEE, 0x7D, 0xD3, 0xFB, 0x4E, 0x41, 0xC7, 0x3C, 0x0A,
0x61, 0xA3, 0xE2, 0x5B, 0x95, 0xAC, 0xC1, 0xD1, 0x07, 0xDB, 0x7B, 0x0E, 0xC2, 0xF8, 0x05, 0x6B, 0x55, 0xF2, 0x64, 0xCC, 0x37, 0x6C, 0x14, 0x7C, 0xAB, 0x14, 0x35, 0x38, 0xFA, 0x60, 0xBB, 0xE6,
0x72, 0xA1, 0xEF, 0x60, 0xC7, 0x4F, 0x53, 0x8A, 0x9F, 0x9C, 0x0F, 0x58, 0x51, 0x2B, 0x5A, 0xE2, 0x20, 0x94, 0x5F, 0x90, 0x26, 0x63, 0xFA, 0x0E, 0x72, 0xFC, 0x34, 0xA5, 0xF8, 0x93, 0xD1, 0x01,
0xC8, 0x05, 0x73, 0x25, 0xE1, 0xD9, 0xD0, 0x4E, 0x25, 0x71, 0xF0, 0xB3, 0xAF, 0x48, 0x7E, 0x20, 0x33, 0x6A, 0x45, 0x4A, 0x1C, 0xB9, 0x60, 0x26, 0x24, 0x3C, 0x1A, 0xDA, 0x29, 0x24, 0x0E, 0xFE,
0xFB, 0x2A, 0xB5, 0xE8, 0x14, 0x3F, 0x39, 0x7A, 0xD5, 0x9D, 0x00, 0x4B, 0x62, 0x97, 0xF7, 0x6E, 0xEC, 0x4B, 0x92, 0x1F, 0x48, 0xBE, 0x52, 0x2E, 0x3A, 0xC5, 0x9F, 0x0C, 0xBD, 0x72, 0x25, 0xC0,
0xAA, 0x78, 0x3B, 0xC7, 0x5E, 0x2A, 0x8D, 0xD7, 0x68, 0xD1, 0xC5, 0xC3, 0x49, 0xD9, 0x46, 0xE7, 0x92, 0xD8, 0x65, 0xBD, 0x9B, 0x22, 0xDE, 0xCE, 0xB0, 0x97, 0x42, 0xD3, 0xAC, 0xB7, 0xE8, 0xE2,
0x4F, 0x4A, 0xFB, 0xB6, 0x31, 0x0F, 0x03, 0xFA, 0x25, 0x64, 0x15, 0x0B, 0xB9, 0xFD, 0xC7, 0x82, 0xE1, 0x5B, 0xD9, 0x46, 0xE7, 0x0F, 0x72, 0xFB, 0xB6, 0x3E, 0x0F, 0x7C, 0x7A, 0x11, 0xB0, 0x92,
0x06, 0xA1, 0xAF, 0xD5, 0x17, 0xE0, 0xB3, 0x85, 0xC6, 0x77, 0xDA, 0x20, 0x71, 0xFD, 0x66, 0x43, 0x86, 0xDC, 0xFE, 0x63, 0x41, 0xFD, 0xC0, 0xD3, 0xAA, 0x0B, 0xB0, 0xD9, 0x42, 0xE2, 0x3B, 0x6D,
0x47, 0x45, 0x5F, 0xAB, 0x8B, 0x90, 0xF2, 0x49, 0xD9, 0x24, 0xA5, 0x34, 0xD6, 0x20, 0xD5, 0x85, 0xE0, 0xB8, 0x7E, 0xB3, 0x21, 0xA3, 0xA2, 0xAF, 0xD5, 0x45, 0x48, 0xD9, 0xA4, 0x74, 0x92, 0x50,
0xF9, 0xC5, 0x1E, 0x5D, 0xA7, 0xDD, 0xD9, 0x3B, 0x9F, 0xEF, 0xDF, 0xDD, 0x9E, 0x34, 0xC5, 0xF6, 0x1A, 0x69, 0x10, 0xEA, 0xC2, 0xFC, 0xBC, 0x46, 0xD7, 0x69, 0x77, 0xF6, 0xCE, 0xE7, 0xF5, 0xBB,
0xE6, 0x09, 0x0B, 0x19, 0x5C, 0x5E, 0x9C, 0xBD, 0x75, 0x9F, 0x6B, 0x2C, 0x49, 0x22, 0x6D, 0x09, 0xDB, 0xA3, 0x86, 0x28, 0x6F, 0x1E, 0xB1, 0x80, 0xC1, 0xE3, 0xC5, 0xD9, 0x3B, 0xF7, 0xB9, 0xC6,
0x1E, 0xFA, 0xA4, 0x29, 0x9A, 0x4F, 0x9A, 0x62, 0x2B, 0x94, 0xEF, 0x86, 0x9D, 0x04, 0xE1, 0xA5, 0xE2, 0x38, 0xD4, 0x96, 0x60, 0xA1, 0x8F, 0x1A, 0xA2, 0xF9, 0xA8, 0x21, 0x4A, 0xA1, 0xBC, 0x1A,
0x36, 0x89, 0xFC, 0x2C, 0x1B, 0x12, 0xEE, 0x5A, 0x08, 0xCC, 0xC6, 0x5D, 0x33, 0x8D, 0x03, 0x1E, 0x76, 0xE4, 0x07, 0x5F, 0xB5, 0x49, 0xE8, 0xA5, 0xE9, 0x90, 0x70, 0xD3, 0x42, 0x60, 0x36, 0x56,
0x12, 0x84, 0x8C, 0x6D, 0x29, 0x7C, 0x61, 0x92, 0x9F, 0x0F, 0x16, 0x15, 0x05, 0xD1, 0xE6, 0x29, 0xCD, 0x34, 0x0E, 0x78, 0x48, 0x10, 0x32, 0xB6, 0x25, 0xF0, 0x0B, 0x93, 0xBC, 0x6C, 0xB0, 0xC8,
0x9D, 0x0E, 0xC9, 0x9C, 0xB1, 0x65, 0xD6, 0x6F, 0x36, 0xD7, 0xEB, 0x75, 0x63, 0x16, 0xB2, 0xF9, 0x28, 0x88, 0x36, 0x4F, 0xE8, 0x74, 0x48, 0xE6, 0x8C, 0x2D, 0xD3, 0x7E, 0xA3, 0xB1, 0x5E, 0xAF,
0x6A, 0xDC, 0x98, 0x24, 0x8B, 0x66, 0xB4, 0x9A, 0x98, 0xE2, 0xB1, 0xC9, 0x91, 0x69, 0x32, 0x20, 0xEB, 0xB3, 0x80, 0xCD, 0x57, 0xE3, 0xFA, 0x24, 0x5E, 0x34, 0xC2, 0xD5, 0xC4, 0x14, 0x5F, 0x1B,
0xAC, 0xE9, 0x36, 0x2C, 0xA2, 0x31, 0xD0, 0x68, 0xCA, 0x86, 0xE4, 0x0B, 0xA4, 0xBA, 0xF1, 0x57, 0x1C, 0x99, 0x06, 0x83, 0x8D, 0x35, 0xDC, 0xBA, 0x45, 0x34, 0x06, 0x12, 0x4D, 0xD9, 0x90, 0x5C,
0x58, 0x21, 0xBB, 0x9C, 0x15, 0x6B, 0xD2, 0x05, 0x00, 0xE6, 0x62, 0x96, 0x0F, 0x97, 0x21, 0x5D, 0x40, 0xA8, 0x1B, 0x7D, 0x81, 0x15, 0xD2, 0xAF, 0xB3, 0x7C, 0x4D, 0xBA, 0x00, 0xC0, 0x9C, 0xCD,
0xFF, 0x92, 0x5C, 0x0D, 0x09, 0xA6, 0xD3, 0xB6, 0x6B, 0xC1, 0x8F, 0x63, 0x59, 0x30, 0x6B, 0x26, 0xF2, 0xCB, 0xD7, 0x80, 0xAE, 0x7F, 0x89, 0xAF, 0x86, 0x04, 0xC3, 0x69, 0xDB, 0xB5, 0xE0, 0xC3,
0x22, 0x0C, 0x56, 0xE8, 0x43, 0xC2, 0x6F, 0xC1, 0x62, 0x68, 0xBD, 0x65, 0x19, 0x38, 0x40, 0x07, 0xB1, 0x2C, 0x98, 0x35, 0x13, 0x1E, 0x06, 0x33, 0xF4, 0x21, 0xE1, 0xAF, 0xA0, 0x31, 0xB4, 0xDA,
0x56, 0xFA, 0x11, 0xAD, 0xDB, 0x86, 0x66, 0xDA, 0x3A, 0x0C, 0x5F, 0xFA, 0x6C, 0xAE, 0x05, 0x43, 0xB2, 0x0C, 0x1C, 0xA0, 0x03, 0x29, 0xBD, 0x90, 0x56, 0x6D, 0x43, 0x33, 0x6D, 0x1D, 0x86, 0x2F,
0xF2, 0xBA, 0x8D, 0x20, 0xEC, 0x8E, 0x77, 0xE1, 0xBA, 0x00, 0xB1, 0xE3, 0x69, 0x66, 0x2B, 0x72, 0x3D, 0x36, 0xD7, 0xFC, 0x21, 0x79, 0xDD, 0x46, 0x10, 0x76, 0xA7, 0x79, 0xE9, 0xBA, 0x00, 0xB1,
0xBB, 0x30, 0xAA, 0xE5, 0x44, 0x2D, 0xB8, 0x5C, 0x78, 0x3D, 0xF8, 0xF5, 0xB4, 0x1E, 0xF4, 0xB8, 0xD3, 0xD4, 0xCC, 0x56, 0xE8, 0x76, 0x61, 0x54, 0xCB, 0x09, 0x5B, 0xF0, 0xB8, 0x6C, 0xF6, 0xE0,
0x3D, 0x6C, 0x72, 0x22, 0xDB, 0xF5, 0xB4, 0xAE, 0x75, 0xD1, 0xB6, 0x35, 0xD3, 0xEB, 0x6A, 0xB6, 0xB3, 0xA9, 0xF5, 0xA0, 0xC7, 0xED, 0x61, 0x93, 0x13, 0xDA, 0x6E, 0x53, 0xEB, 0x5A, 0x97, 0x6D,
0x05, 0x5D, 0xB6, 0xD5, 0x8A, 0xCC, 0xAE, 0x05, 0x37, 0xAE, 0x17, 0xB9, 0x00, 0xE4, 0xC2, 0x81, 0x5B, 0x33, 0x9B, 0x5D, 0xCD, 0xB6, 0xA0, 0xCB, 0xB6, 0x5A, 0xA1, 0xD9, 0xB5, 0xE0, 0xC5, 0x6D,
0xA1, 0x9E, 0xA7, 0xB9, 0x30, 0xBD, 0xE7, 0x46, 0x30, 0xB4, 0x1D, 0x01, 0x4C, 0x00, 0xD2, 0xBD, 0x86, 0x2E, 0x00, 0xB9, 0x74, 0x60, 0x68, 0xB3, 0xA9, 0xB9, 0x30, 0xBD, 0xE7, 0x86, 0x30, 0xB4,
0xC0, 0x1E, 0x57, 0x83, 0xDF, 0x8E, 0x7B, 0x01, 0x53, 0x5C, 0x5C, 0x14, 0x1E, 0xBC, 0xC8, 0x94, 0x1D, 0x02, 0x4C, 0x00, 0xD2, 0xBD, 0xC4, 0x1E, 0x57, 0x83, 0xCF, 0x8E, 0x7B, 0x09, 0x53, 0x5C,
0x23, 0xE0, 0x06, 0xC6, 0x5F, 0xC0, 0x23, 0x8C, 0xEC, 0xE1, 0xC2, 0x1C, 0x88, 0x89, 0x80, 0x23, 0x5C, 0x14, 0xBE, 0x34, 0x43, 0x53, 0x8E, 0x80, 0x17, 0x18, 0x7F, 0x09, 0x5F, 0x61, 0x64, 0x0F,
0xB9, 0xCA, 0x05, 0xAE, 0x6D, 0x22, 0x0E, 0x25, 0x02, 0x1C, 0x31, 0x3B, 0x42, 0x68, 0xEE, 0x05, 0x17, 0xE6, 0x40, 0x4C, 0x04, 0x1C, 0xCA, 0x55, 0x2E, 0x71, 0x6D, 0x13, 0x71, 0x28, 0x10, 0xE0,
0xAE, 0x6E, 0x22, 0x16, 0x12, 0x75, 0x93, 0xE3, 0x6E, 0x0A, 0xE2, 0x6C, 0xED, 0x02, 0x71, 0x10, 0x88, 0xD9, 0x21, 0x42, 0x73, 0x2F, 0x71, 0x75, 0x13, 0xB1, 0x90, 0xA8, 0x9B, 0x1C, 0x77, 0x53,
0xEB, 0x22, 0xBA, 0x26, 0xA7, 0x1F, 0x1F, 0x5A, 0x7C, 0x0C, 0x0C, 0xC1, 0x19, 0xCE, 0x05, 0x22, 0x6C, 0xCE, 0xD6, 0x2E, 0x11, 0x07, 0xB1, 0x2E, 0xA2, 0x6B, 0xF2, 0xFD, 0xE3, 0x97, 0x16, 0x1F,
0x00, 0xF4, 0x23, 0x14, 0x01, 0xC4, 0x15, 0xEB, 0x98, 0x5D, 0xFB, 0xC2, 0x6C, 0x5B, 0x1A, 0x62, 0x03, 0x43, 0x70, 0x86, 0x73, 0x89, 0x08, 0xC0, 0xFE, 0x11, 0x8A, 0x00, 0xE2, 0x8A, 0x75, 0xCC,
0x81, 0x18, 0x20, 0x02, 0x5D, 0x94, 0x89, 0x87, 0x78, 0x02, 0x40, 0x58, 0xDA, 0x43, 0x44, 0xBA, 0xAE, 0x7D, 0x69, 0xB6, 0x2D, 0x0D, 0xB1, 0x40, 0x0C, 0x10, 0x81, 0x2E, 0xF2, 0xA4, 0x89, 0x78,
0x1A, 0xA2, 0xEE, 0x68, 0xED, 0x88, 0xAF, 0x0B, 0xF4, 0x9B, 0x6D, 0xCD, 0x03, 0x3A, 0xDB, 0xC0, 0x02, 0x40, 0x58, 0xBA, 0x89, 0x88, 0x74, 0x35, 0x44, 0xDD, 0xD1, 0xDA, 0x21, 0x5F, 0x17, 0xF6,
0x6E, 0xA0, 0x1F, 0x16, 0x86, 0x3B, 0x60, 0x11, 0xEF, 0x8C, 0x60, 0xE0, 0x85, 0xED, 0x22, 0x58, 0x6F, 0xB6, 0xB5, 0x26, 0xEC, 0xB3, 0x0D, 0xE4, 0x86, 0xFD, 0xC3, 0xC2, 0xF0, 0x06, 0x24, 0xE2,
0x31, 0xD3, 0xD5, 0x04, 0x67, 0x91, 0x64, 0xAF, 0xA3, 0x01, 0xC1, 0xB0, 0x12, 0x5F, 0xCD, 0x86, 0x9D, 0x21, 0x0C, 0xBC, 0xB4, 0x5D, 0x04, 0x2B, 0x66, 0xBA, 0x9A, 0xA0, 0x2C, 0x6E, 0xB9, 0xD9,
0x99, 0xD0, 0x13, 0x21, 0x96, 0xB0, 0x12, 0xAC, 0x27, 0x70, 0x84, 0xDE, 0x88, 0x53, 0x00, 0xCD, 0xD1, 0x60, 0xC3, 0xB0, 0x12, 0x5F, 0xCD, 0x86, 0x99, 0xD0, 0x13, 0x22, 0x96, 0xB0, 0x12, 0xAC,
0xC8, 0x66, 0xA4, 0xE9, 0x1B, 0x17, 0x74, 0x17, 0x18, 0x7A, 0x61, 0x76, 0x7B, 0x48, 0x29, 0x67, 0x27, 0x70, 0x84, 0xDE, 0x90, 0xEF, 0x00, 0x9A, 0x91, 0xCC, 0xB8, 0xA7, 0x6F, 0x9C, 0xD1, 0x5D,
0x75, 0xDB, 0x65, 0xF0, 0xE5, 0x0C, 0x69, 0xB4, 0x58, 0x79, 0x97, 0x77, 0xE2, 0x15, 0x2E, 0xD0, 0x20, 0xE8, 0xA5, 0xD9, 0xED, 0xE1, 0x4E, 0x39, 0xA9, 0xDB, 0x2E, 0x83, 0x5F, 0x4E, 0x90, 0x7A,
0x21, 0xDA, 0xCD, 0xF2, 0x4E, 0x74, 0x7D, 0x03, 0x5D, 0x6A, 0xA2, 0x32, 0xC1, 0x65, 0x06, 0x5F, 0x8B, 0x15, 0x6F, 0x59, 0x27, 0x3E, 0xE1, 0x01, 0x1D, 0xA2, 0xDD, 0x2C, 0xDE, 0x44, 0xD7, 0x37,
0x50, 0xDE, 0x91, 0x76, 0x02, 0xA9, 0x4D, 0x5C, 0xD8, 0x47, 0x5E, 0xC1, 0x91, 0xD1, 0xCB, 0x30, 0x90, 0xA5, 0x06, 0x0A, 0x13, 0x3C, 0x66, 0xF0, 0x0B, 0xC2, 0x3B, 0xD2, 0x8E, 0x20, 0xB4, 0x89,
0x5D, 0xAC, 0x21, 0x05, 0x82, 0x61, 0x30, 0x00, 0x46, 0xFB, 0xF0, 0x45, 0x63, 0xFA, 0xF3, 0x06, 0x72, 0xFD, 0xC8, 0x32, 0x38, 0x32, 0x7A, 0x19, 0x24, 0x8B, 0x35, 0x84, 0x40, 0x30, 0x0C, 0x06,
0x65, 0x7E, 0x78, 0xF1, 0xCB, 0xFB, 0xD3, 0xBF, 0x98, 0x59, 0x59, 0x3D, 0xEF, 0xA2, 0xEB, 0x20, 0xC0, 0x68, 0x0F, 0x7E, 0x51, 0x99, 0xFE, 0xB8, 0x42, 0x99, 0x1F, 0x5E, 0xFC, 0xF2, 0xFE, 0xE4,
0xC4, 0xB6, 0xD5, 0x40, 0xED, 0x73, 0x90, 0xB5, 0x1E, 0x30, 0xBF, 0xD5, 0x63, 0xB6, 0xDD, 0xC6, 0x2F, 0xA6, 0x56, 0x56, 0xAF, 0x79, 0xD9, 0x75, 0x10, 0x62, 0xDB, 0xAA, 0xA3, 0xF4, 0x39, 0x48,
0xB6, 0x2E, 0xB6, 0xF5, 0x3C, 0xBC, 0xED, 0x81, 0x04, 0xBA, 0xFC, 0xE2, 0x39, 0x45, 0x17, 0xAA, 0xDA, 0x26, 0x10, 0xBF, 0xD5, 0x63, 0xB6, 0xDD, 0xC6, 0xB6, 0x2E, 0xB6, 0xF5, 0x9A, 0xF8, 0xDA,
0x5E, 0xAB, 0xC3, 0x19, 0x5E, 0xDC, 0xA1, 0xE2, 0xF2, 0x4E, 0xB3, 0xDD, 0x95, 0x13, 0xCD, 0x02, 0x03, 0x0E, 0x74, 0xF9, 0xA3, 0xE9, 0xE4, 0x5D, 0x28, 0x7A, 0xAD, 0x0E, 0x27, 0x78, 0xFE, 0x86,
0x84, 0xA9, 0x02, 0x36, 0xF3, 0xD5, 0x40, 0x5C, 0xBD, 0x02, 0x05, 0xF9, 0xE0, 0x14, 0x23, 0xF8, 0x82, 0xCB, 0x3B, 0xCD, 0x76, 0x57, 0x4E, 0x34, 0x73, 0x10, 0xA6, 0x0A, 0xD8, 0xCC, 0x56, 0x03,
0x00, 0x3E, 0x4D, 0xCC, 0xE2, 0xC0, 0x7A, 0x39, 0xFC, 0x9E, 0x58, 0x32, 0x07, 0xA8, 0x71, 0x24, 0x76, 0xF5, 0x72, 0x14, 0xE4, 0x17, 0x27, 0x1F, 0xC1, 0x07, 0xF0, 0x69, 0x62, 0x16, 0x07, 0xD6,
0xF2, 0x2B, 0x47, 0x95, 0x77, 0x01, 0xEE, 0xBD, 0x96, 0xC6, 0xF2, 0xB9, 0x0A, 0x3C, 0xB9, 0x84, 0xCB, 0xE0, 0xF7, 0xC4, 0x92, 0x19, 0x40, 0x8D, 0x23, 0x91, 0x3D, 0x39, 0xAA, 0xBC, 0x0B, 0x70,
0xE0, 0x02, 0xAE, 0xFA, 0xED, 0x75, 0xB7, 0xDB, 0x85, 0xBE, 0x1E, 0x37, 0x71, 0xB4, 0x72, 0x1B, 0xEF, 0xB5, 0x34, 0x96, 0xCD, 0x55, 0xE0, 0xC9, 0x25, 0x04, 0x15, 0x70, 0xD5, 0x6F, 0xAF, 0xBB,
0xF4, 0xD5, 0x61, 0x1C, 0x41, 0xEE, 0x39, 0x5A, 0x1D, 0xD4, 0x67, 0x40, 0xAA, 0x87, 0x1E, 0xC2, 0xDD, 0x2E, 0xF4, 0xF5, 0xB8, 0x8A, 0xA3, 0x96, 0xDB, 0x20, 0xAF, 0x0E, 0xE3, 0x08, 0x72, 0xCB,
0x76, 0xD0, 0xDE, 0x80, 0x37, 0x0E, 0x0C, 0xC2, 0x1F, 0x7C, 0x12, 0x37, 0x78, 0x85, 0x1E, 0xB8, 0xD1, 0xEA, 0xA0, 0x3C, 0x03, 0x52, 0x3D, 0xB4, 0x10, 0xB6, 0x83, 0xFA, 0x06, 0xB4, 0x71, 0x60,
0xBD, 0xC0, 0x45, 0x34, 0x07, 0x14, 0xD4, 0x06, 0xB6, 0x6B, 0x76, 0x4F, 0xF3, 0xF8, 0x72, 0x80, 0x10, 0x7E, 0xE0, 0x37, 0xF1, 0x82, 0x4F, 0xE8, 0x81, 0xD7, 0x4B, 0x5C, 0x44, 0x73, 0x40, 0x40,
0x73, 0x07, 0x49, 0x87, 0x11, 0x66, 0x07, 0x80, 0xB5, 0xD1, 0xA1, 0xB5, 0x11, 0x6A, 0x17, 0x9C, 0x6D, 0x20, 0xBB, 0x66, 0xF7, 0xB4, 0x26, 0x5F, 0x0E, 0x70, 0xEE, 0xE0, 0xD6, 0x61, 0x84, 0xD9,
0x88, 0x8D, 0x3A, 0xDF, 0xD6, 0x84, 0xAB, 0xB1, 0x50, 0x16, 0x70, 0x05, 0x14, 0x2F, 0x1C, 0xF4, 0x01, 0x60, 0x6D, 0x34, 0x68, 0x6D, 0x84, 0xDA, 0x05, 0x23, 0x62, 0xA3, 0xCC, 0xB7, 0x35, 0x61,
0x44, 0x60, 0xA8, 0x1D, 0x70, 0x0A, 0x36, 0xC3, 0x89, 0x5D, 0x87, 0xF5, 0x84, 0x60, 0x6C, 0xA0, 0x6A, 0x2C, 0xE4, 0x05, 0x3C, 0x01, 0xC5, 0x4B, 0x07, 0x2D, 0x11, 0x28, 0x6A, 0x07, 0x8C, 0x82,
0x0E, 0x9D, 0x47, 0x17, 0x89, 0x73, 0x5D, 0xCE, 0x58, 0x5C, 0x4C, 0x3E, 0x38, 0x1E, 0xEF, 0xE7, 0xCD, 0x70, 0x62, 0xD7, 0x61, 0x3D, 0xC1, 0x18, 0x1B, 0x76, 0x87, 0xC6, 0xA3, 0x8B, 0x9B, 0x73,
0xDD, 0x7C, 0x46, 0x17, 0x2D, 0xA6, 0x63, 0x89, 0x2B, 0x40, 0xEC, 0xC0, 0x42, 0x17, 0x36, 0x58, 0x5D, 0x4E, 0x58, 0x5C, 0x4C, 0x7E, 0x71, 0x9A, 0xBC, 0x9F, 0x77, 0xF3, 0x19, 0x5D, 0xD4, 0x98,
0x32, 0xB0, 0x4C, 0xF3, 0x72, 0xBE, 0x7A, 0xD0, 0x7B, 0x61, 0xF6, 0xB8, 0x3F, 0x46, 0xA4, 0x80, 0x8E, 0x25, 0x9E, 0x00, 0xB1, 0x03, 0x0B, 0x5D, 0xDA, 0xA0, 0xC9, 0x40, 0x32, 0xAD, 0x99, 0xD1,
0x92, 0x6E, 0xEF, 0xDB, 0x6B, 0x0F, 0x5C, 0x41, 0xC7, 0xE9, 0x80, 0x57, 0x41, 0x6F, 0x22, 0xBD, 0xB5, 0x09, 0xBD, 0x97, 0x66, 0x8F, 0xDB, 0x63, 0x44, 0x0A, 0x76, 0xD2, 0xED, 0x7D, 0x7B, 0xDD,
0x22, 0xFF, 0x72, 0x89, 0xBA, 0xB8, 0x0A, 0x17, 0x3E, 0x9F, 0xEF, 0xC2, 0x54, 0x94, 0x04, 0x92, 0x04, 0x53, 0xD0, 0x71, 0x3A, 0x60, 0x55, 0xD0, 0x9A, 0x48, 0xAB, 0xC8, 0x7F, 0x39, 0x47, 0x5D,
0x65, 0x83, 0x27, 0x41, 0xD2, 0x5C, 0xCD, 0xE5, 0x7A, 0x62, 0xDB, 0xCC, 0x45, 0xA1, 0xD8, 0x9D, 0x5C, 0x85, 0x33, 0x9F, 0xCF, 0x77, 0x61, 0x2A, 0x72, 0x02, 0xB7, 0x65, 0x83, 0x25, 0xC1, 0xAD,
0x08, 0x60, 0x81, 0x3F, 0x81, 0x45, 0x91, 0xFF, 0x88, 0x22, 0x22, 0x0E, 0x58, 0xB4, 0xE5, 0x2D, 0xB9, 0x9A, 0xCB, 0xE5, 0xC4, 0xB6, 0x99, 0x8B, 0x4C, 0xB1, 0x3B, 0x21, 0xC0, 0x02, 0x7B, 0x02,
0xF7, 0x9E, 0xE8, 0x40, 0xC1, 0x59, 0x00, 0x3A, 0xB0, 0x28, 0xC7, 0xD6, 0x74, 0x80, 0xD5, 0x16, 0x8B, 0x22, 0xFD, 0x11, 0x45, 0x44, 0x1C, 0xB0, 0x68, 0xCB, 0x57, 0x6E, 0x3D, 0xD1, 0x80, 0x82,
0x33, 0x5D, 0x07, 0xF9, 0xF9, 0x20, 0xE3, 0x3F, 0xC5, 0x6A, 0x69, 0x0A, 0x25, 0xCF, 0x0E, 0xEB, 0xB1, 0x00, 0x74, 0x60, 0x51, 0x8E, 0xAD, 0xE9, 0x00, 0xA9, 0x2D, 0x66, 0xBA, 0x0E, 0xD2, 0xF3,
0xD7, 0x78, 0xB8, 0x1E, 0x92, 0x32, 0x86, 0x93, 0xAD, 0x3E, 0xA5, 0xAC, 0xE3, 0xA9, 0x07, 0x41, 0x41, 0xCA, 0x7F, 0x82, 0xD9, 0xD2, 0x14, 0x52, 0x9E, 0x1D, 0xDA, 0xAF, 0x71, 0x77, 0x3D, 0x24,
0x97, 0x21, 0x7C, 0x44, 0x13, 0x72, 0x80, 0x69, 0x38, 0xDB, 0x65, 0xF4, 0x88, 0x4B, 0x08, 0x06, 0x85, 0x0F, 0x27, 0x5B, 0x7D, 0x4A, 0x5A, 0xC7, 0x43, 0x0F, 0x82, 0x26, 0x43, 0xD8, 0x88, 0x06,
0xF9, 0xF2, 0xC3, 0x3F, 0x5F, 0xBC, 0x3B, 0x3B, 0x7D, 0xF3, 0x07, 0xD9, 0x81, 0xDA, 0x16, 0x46, 0xC4, 0x00, 0xD3, 0x60, 0xB6, 0x4B, 0xE9, 0x11, 0x97, 0x00, 0x14, 0xF2, 0xE5, 0x87, 0x7F, 0xBE,
0x4D, 0x8C, 0xF2, 0x4D, 0x71, 0x2E, 0x77, 0xD2, 0x84, 0xCC, 0x60, 0x67, 0x7A, 0x20, 0xAA, 0xCB, 0x38, 0x3D, 0x3B, 0x79, 0xFB, 0x86, 0xEC, 0x40, 0x6D, 0x0B, 0xA3, 0x06, 0x7A, 0xF9, 0x86, 0x38,
0xD1, 0xC9, 0xDC, 0xE1, 0x4B, 0xBC, 0x3E, 0xFB, 0x0D, 0x41, 0xCD, 0x1D, 0xF8, 0xC9, 0xBB, 0x76, 0x97, 0x3B, 0x6A, 0x40, 0x64, 0xB0, 0x33, 0x3C, 0x10, 0xD9, 0xE5, 0xE8, 0x68, 0xEE, 0xF0, 0x25,
0xCF, 0xD5, 0x64, 0xA2, 0x44, 0x04, 0x6A, 0xA7, 0xAF, 0x5E, 0x9C, 0xFD, 0xF7, 0xD9, 0xF9, 0x8B, 0x5E, 0x9F, 0xFD, 0x86, 0xA0, 0xE6, 0x0E, 0x7C, 0x64, 0x5D, 0xBB, 0xE7, 0x6A, 0x32, 0x50, 0x22,
0xD7, 0x64, 0x7B, 0x68, 0x7E, 0x18, 0x04, 0xCE, 0x13, 0x5A, 0xE7, 0xDA, 0x4B, 0x28, 0x95, 0xB3, 0x02, 0xB5, 0x93, 0x57, 0x2F, 0xCE, 0xFE, 0x75, 0x76, 0xFE, 0xE2, 0x35, 0xD9, 0x1E, 0x9A, 0x1D,
0xEB, 0x8C, 0xD1, 0xC5, 0x1E, 0xD8, 0x3C, 0x99, 0x04, 0x40, 0xBC, 0xDA, 0xD6, 0x78, 0xB5, 0x4D, 0x06, 0x81, 0xF1, 0x84, 0xD6, 0xB9, 0xF6, 0x12, 0x52, 0xE5, 0xF4, 0x3A, 0x65, 0x74, 0xB1, 0x07,
0xB0, 0xBE, 0x16, 0x6B, 0xF1, 0x4A, 0x5B, 0x94, 0x7C, 0x44, 0x8B, 0xFD, 0x05, 0x74, 0x2E, 0xAE, 0x36, 0x0F, 0x26, 0x01, 0x10, 0xCF, 0xB6, 0x35, 0x9E, 0x6D, 0x13, 0xCC, 0xAF, 0xC5, 0x5A, 0x3C,
0xB1, 0x31, 0xFB, 0xF8, 0x99, 0x68, 0x8B, 0x55, 0xC4, 0xC2, 0x25, 0x32, 0x3B, 0xBF, 0x23, 0x20, 0xD3, 0x16, 0x29, 0x1F, 0xD1, 0x22, 0x6F, 0x01, 0x9D, 0x8B, 0x6B, 0x6C, 0x4C, 0x3F, 0x7E, 0x26,
0x4F, 0x01, 0xA9, 0x74, 0xCE, 0x9A, 0xB2, 0x97, 0x4B, 0xE4, 0x0A, 0xA2, 0x6A, 0x17, 0x6B, 0x54, 0xDA, 0x62, 0x15, 0xB2, 0x60, 0x89, 0xC4, 0xCE, 0xDE, 0x08, 0xF0, 0x53, 0x40, 0x2A, 0x8C, 0xB3,
0x0A, 0x79, 0xA2, 0x25, 0xF1, 0x24, 0x0A, 0x27, 0x5F, 0x87, 0xE4, 0x8C, 0xC6, 0x01, 0x2E, 0x55, 0xA6, 0xD4, 0x72, 0x89, 0x5C, 0x41, 0x64, 0xED, 0x62, 0x8D, 0x52, 0x22, 0x4F, 0xB4, 0x38, 0x9A,
0xD7, 0x07, 0xE0, 0x70, 0xFD, 0x68, 0x05, 0xF3, 0xDE, 0xF3, 0xB1, 0x64, 0x74, 0x14, 0x8F, 0xB3, 0x84, 0xC1, 0xE4, 0xCB, 0x90, 0x9C, 0xD1, 0xC8, 0xC7, 0xA5, 0xAA, 0xFA, 0x00, 0x0C, 0xAE, 0x17,
0xE5, 0x40, 0xFC, 0x9E, 0x2C, 0xD3, 0x64, 0x96, 0xD2, 0x2C, 0xCB, 0x25, 0x7F, 0x19, 0x66, 0xE1, 0xAE, 0x60, 0xDE, 0x7B, 0x3E, 0x96, 0x8C, 0x9E, 0x46, 0xE3, 0x74, 0x39, 0x10, 0x9F, 0x47, 0xCB,
0x38, 0x8C, 0x42, 0x76, 0xDD, 0x07, 0xC6, 0x05, 0x34, 0xCE, 0x51, 0x5F, 0xA6, 0x33, 0xB1, 0x24, 0x24, 0x9E, 0x25, 0x34, 0x4D, 0x33, 0xCE, 0x7F, 0x0D, 0xD2, 0x60, 0x1C, 0x84, 0x01, 0xBB, 0xEE,
0xBF, 0x81, 0x04, 0x91, 0x67, 0x69, 0x5C, 0x29, 0x25, 0x08, 0x48, 0xEE, 0x52, 0xF1, 0xDD, 0x21, 0x03, 0xE1, 0x7C, 0x1A, 0x65, 0xA8, 0x2F, 0x93, 0x99, 0x58, 0x92, 0xBF, 0x40, 0x80, 0xC8, 0xA3,
0xBF, 0x7D, 0xAC, 0x93, 0x72, 0x17, 0x99, 0x5E, 0x1E, 0x33, 0xB8, 0x4A, 0x3E, 0x84, 0x15, 0x15, 0x34, 0x2E, 0x94, 0x12, 0x04, 0x04, 0x77, 0x89, 0xF8, 0xDD, 0xC1, 0xBF, 0x7D, 0xA4, 0x93, 0x7C,
0xBA, 0x7F, 0x4D, 0x16, 0x0B, 0xC8, 0x62, 0xEB, 0xB5, 0x28, 0xCC, 0x58, 0xCD, 0xA8, 0xF9, 0x51, 0x17, 0x91, 0x5E, 0xE6, 0x33, 0xB8, 0x48, 0x3E, 0x84, 0x14, 0xA5, 0x7D, 0xFF, 0x1A, 0x2F, 0x16,
0x54, 0x53, 0xD8, 0xF0, 0x8E, 0x4E, 0x01, 0xDB, 0xB9, 0xA2, 0xF4, 0xEA, 0xAA, 0x88, 0x67, 0x01, 0x10, 0xC5, 0x56, 0x2B, 0x61, 0x90, 0xB2, 0x8A, 0x51, 0xF1, 0xC2, 0xB0, 0xA2, 0x90, 0xE1, 0x94,
0xED, 0xD7, 0x94, 0x42, 0x00, 0x0A, 0xC2, 0xB4, 0xAE, 0x93, 0x8D, 0x88, 0x59, 0x89, 0x71, 0x9E, 0x4E, 0x01, 0xDB, 0xB9, 0x22, 0xF4, 0xEA, 0xAA, 0x88, 0x67, 0x0E, 0xED, 0xD7, 0x84, 0x82, 0x03,
0x55, 0x86, 0x38, 0xBC, 0xAF, 0x44, 0x38, 0x0F, 0xFF, 0xC1, 0xF8, 0x14, 0xF4, 0x40, 0x83, 0xB6, 0xF2, 0x83, 0xA4, 0xAA, 0x93, 0x0D, 0x8F, 0x59, 0xF2, 0x71, 0x4D, 0xAB, 0x70, 0x71, 0xF8, 0x5E,
0x16, 0xD1, 0xAE, 0x91, 0x77, 0x24, 0x9F, 0xED, 0x2A, 0xB3, 0x1D, 0xB8, 0x4F, 0x61, 0x90, 0x03, 0xF2, 0x70, 0x4D, 0xFC, 0x07, 0xE3, 0x13, 0x90, 0x03, 0x0D, 0xDA, 0x5A, 0x44, 0xBB, 0x46, 0xDA,
0x97, 0x6B, 0x7E, 0x01, 0x29, 0x46, 0x43, 0x22, 0x77, 0x04, 0x48, 0xB3, 0x84, 0x83, 0x43, 0xAF, 0x91, 0x6C, 0xB6, 0xAB, 0xCC, 0x76, 0xE0, 0x3D, 0x81, 0x41, 0x0E, 0x3C, 0xAE, 0xF9, 0x03, 0xB8,
0x39, 0xB8, 0x3C, 0xD2, 0xB6, 0x94, 0x40, 0xDB, 0xBA, 0x13, 0x0E, 0xDA, 0x38, 0xC2, 0xB1, 0x05, 0x18, 0x0E, 0x89, 0xAC, 0x08, 0x90, 0x46, 0x01, 0x07, 0x87, 0x5E, 0x73, 0x70, 0x99, 0xA7, 0x6D,
0x42, 0x0E, 0x5C, 0x8A, 0x7D, 0x10, 0x68, 0xED, 0xCA, 0xC7, 0xB5, 0x84, 0xD8, 0x05, 0x61, 0x4B, 0x29, 0x8E, 0xB6, 0x75, 0x27, 0x1C, 0xD4, 0x71, 0x84, 0x63, 0x0B, 0x84, 0x1C, 0x78, 0xE4, 0x75,
0x20, 0x7C, 0x4B, 0x85, 0x8C, 0x8E, 0x81, 0x81, 0x00, 0x43, 0xFA, 0x22, 0x69, 0x22, 0x1B, 0x3C, 0x10, 0x68, 0xED, 0xCA, 0xAF, 0x6B, 0x09, 0xB1, 0x0B, 0xCC, 0x96, 0x40, 0x78, 0x49, 0x85, 0x8C,
0x95, 0xEE, 0x05, 0xB9, 0xCA, 0x75, 0x07, 0xFC, 0x57, 0xC1, 0xC9, 0x30, 0x9E, 0x26, 0xB9, 0x36, 0x6A, 0x40, 0x40, 0x80, 0x21, 0x6D, 0x91, 0x54, 0x91, 0x0D, 0x9A, 0x4A, 0xF3, 0x82, 0x54, 0xE5,
0xAA, 0xB3, 0x2B, 0x0E, 0x41, 0x94, 0x05, 0x72, 0x86, 0x78, 0xA8, 0x9C, 0xAF, 0x93, 0x5C, 0x71, 0xB2, 0x03, 0xF6, 0x2B, 0xA7, 0x64, 0x10, 0x4D, 0xE3, 0x4C, 0x1A, 0xD5, 0xD9, 0x25, 0x83, 0x20,
0xCB, 0x4D, 0x20, 0xD4, 0x2A, 0x51, 0x6C, 0x70, 0xAD, 0x9A, 0xAB, 0xF2, 0x3D, 0x07, 0xB5, 0x01, 0xD2, 0x02, 0x39, 0x43, 0x7C, 0x29, 0x9D, 0xAF, 0x93, 0x4C, 0x70, 0x8B, 0x22, 0x10, 0x4A, 0x95,
0xD8, 0x73, 0x6C, 0x1F, 0xFD, 0x01, 0x8A, 0x5D, 0x3C, 0x9C, 0x01, 0xD9, 0xF9, 0x83, 0x70, 0x15, 0x48, 0x36, 0xB8, 0x54, 0xCD, 0x55, 0xFE, 0x9E, 0x83, 0xD8, 0x00, 0xEC, 0x39, 0xB6, 0x8F, 0xDE,
0x67, 0x5F, 0x58, 0xB8, 0x00, 0x3A, 0xCF, 0xC3, 0x72, 0x58, 0x45, 0x57, 0x36, 0xDA, 0x0A, 0x57, 0x80, 0x60, 0xE7, 0x5F, 0xCE, 0x60, 0xDB, 0xD9, 0x17, 0x61, 0x2A, 0xCE, 0x2E, 0x58, 0xB0, 0x80,
0x3A, 0x2F, 0x68, 0x90, 0x68, 0xA0, 0xAE, 0x17, 0x2E, 0xE1, 0x0B, 0xAA, 0x25, 0x1F, 0x27, 0x6A, 0x7D, 0x9E, 0x07, 0xC5, 0xB0, 0x92, 0xAC, 0x6C, 0xB4, 0xE5, 0xA6, 0x74, 0x9E, 0xEF, 0x41, 0xA2,
0xA1, 0xC3, 0xAE, 0x4F, 0x56, 0xA4, 0xC2, 0xF4, 0x32, 0xE6, 0xB3, 0x55, 0x46, 0x0A, 0x5E, 0x6F, 0x81, 0xB2, 0x9E, 0x9B, 0x84, 0x0B, 0x14, 0x4B, 0x3E, 0x4E, 0xE4, 0x42, 0x87, 0x4D, 0x9F, 0xCC,
0xFD, 0xDE, 0xE1, 0xFC, 0x3E, 0xBC, 0x7F, 0xFB, 0xFC, 0xD9, 0xF9, 0x8B, 0xC3, 0xAE, 0x4F, 0xE6, 0x48, 0x85, 0xEA, 0xA5, 0xCC, 0x63, 0xAB, 0x94, 0xE4, 0xB4, 0xDE, 0xFA, 0xBC, 0xC3, 0xF8, 0x7D,
0x8D, 0xDA, 0xFB, 0x65, 0x00, 0xCA, 0x7F, 0x87, 0xE7, 0xAB, 0x98, 0xEF, 0x5E, 0x47, 0xB8, 0xDE, 0x78, 0xFF, 0xEE, 0xF9, 0xB3, 0xF3, 0x17, 0x87, 0x4D, 0x9F, 0x8C, 0x1B, 0xB5, 0xF7, 0x4B, 0x1F,
0xEB, 0x06, 0x95, 0x9C, 0xF4, 0xC1, 0xAE, 0x0F, 0x1E, 0x14, 0xCB, 0x17, 0xDE, 0x6D, 0xDB, 0xE7, 0x84, 0xFF, 0x0E, 0xCB, 0x57, 0x52, 0xDF, 0xBD, 0x86, 0x70, 0xBD, 0xD7, 0x0C, 0x2A, 0x31, 0xE9,
0x21, 0x11, 0xEA, 0x32, 0x0F, 0x71, 0x78, 0xD3, 0x75, 0xE1, 0xF2, 0xF0, 0x76, 0xB7, 0xD3, 0x2B, 0x83, 0x4D, 0x1F, 0x7C, 0x51, 0x34, 0x5F, 0x58, 0xB7, 0x6D, 0x9B, 0x87, 0x9B, 0x50, 0x97, 0x79,
0x20, 0x17, 0xF1, 0x6F, 0x91, 0xCD, 0xC8, 0x7E, 0xF0, 0xA3, 0x77, 0x14, 0xE4, 0x98, 0x32, 0xE0, 0x88, 0xC1, 0x9B, 0xAE, 0x73, 0x93, 0x87, 0xAF, 0xBB, 0x8D, 0x5E, 0x0E, 0x39, 0xF7, 0x7F, 0x8B,
0xB6, 0xA1, 0x81, 0xDB, 0xF7, 0x33, 0x28, 0x7B, 0xFD, 0x90, 0x35, 0xE0, 0xBF, 0x3C, 0x38, 0x16, 0x74, 0x46, 0xF6, 0x83, 0x1F, 0x9D, 0x52, 0xE0, 0x63, 0xC2, 0x80, 0xDA, 0x86, 0x06, 0x66, 0xDF,
0xA0, 0x26, 0xC9, 0x0A, 0x83, 0x9B, 0x12, 0x36, 0xF7, 0x84, 0xCC, 0x52, 0x4C, 0x38, 0x2D, 0x4A, 0x4B, 0x21, 0xED, 0xF5, 0x02, 0x56, 0x87, 0xFF, 0x32, 0xE7, 0x98, 0x83, 0x9A, 0xC4, 0x2B, 0x74,
0x66, 0xC0, 0x4E, 0x28, 0xBF, 0x0B, 0x63, 0xE3, 0xF5, 0x7B, 0x55, 0xF0, 0x95, 0x92, 0x7E, 0x57, 0x6E, 0x8A, 0xDB, 0xDC, 0xE3, 0x32, 0x0B, 0x36, 0xE1, 0xB4, 0x30, 0x9E, 0x01, 0x39, 0x21, 0xFD,
0x97, 0xD8, 0xC9, 0x81, 0x9E, 0xB9, 0x3B, 0x3A, 0x05, 0xD4, 0x59, 0x38, 0x0D, 0x27, 0x7C, 0x5F, 0xCE, 0x95, 0x8D, 0xE7, 0xEF, 0x65, 0xC6, 0x97, 0x52, 0xFA, 0x5D, 0x5D, 0xA2, 0x92, 0x03, 0x3D,
0x16, 0x22, 0xAF, 0xBB, 0x43, 0xE7, 0xCA, 0x1D, 0x16, 0x99, 0x0E, 0x8C, 0x2A, 0x09, 0x8A, 0xE8, 0x73, 0x77, 0x74, 0x02, 0xA8, 0xB3, 0x60, 0x1A, 0x4C, 0x78, 0x5D, 0x16, 0x3C, 0xAF, 0xBB, 0x43,
0x46, 0x9F, 0x41, 0xB4, 0x22, 0xBD, 0x1F, 0xBD, 0xCF, 0xC0, 0x6C, 0x25, 0x79, 0x1B, 0x01, 0x50, 0xE6, 0x8A, 0x0A, 0x8B, 0x0C, 0x07, 0x46, 0xA5, 0x00, 0x45, 0x74, 0xA3, 0xCD, 0x20, 0x5A, 0x1E,
0x3D, 0x86, 0xCF, 0x55, 0x40, 0x4C, 0xE7, 0x44, 0xA2, 0xFC, 0x2B, 0xC9, 0x0C, 0xEE, 0x54, 0x95, 0xDE, 0x8F, 0xDE, 0xA7, 0xA0, 0xB6, 0x72, 0x7B, 0x1B, 0x0E, 0x50, 0x3D, 0x86, 0xCF, 0x44, 0x40,
0xAC, 0x9A, 0xA7, 0xF7, 0x47, 0xE2, 0x2D, 0xF4, 0xAD, 0xC1, 0x83, 0x3C, 0x00, 0x91, 0xA5, 0x9C, 0x4C, 0xE7, 0x9B, 0x44, 0xFE, 0x97, 0x82, 0x19, 0xAC, 0x54, 0x15, 0xA4, 0x9A, 0x27, 0xF7, 0x47,
0x22, 0x91, 0x59, 0x1E, 0x46, 0x66, 0xBC, 0x2B, 0x41, 0x51, 0xF7, 0x9C, 0x36, 0xD2, 0x88, 0x5C, 0xE2, 0x1D, 0xF4, 0xAD, 0xC1, 0x82, 0x3C, 0x00, 0x91, 0xA5, 0x9C, 0x22, 0x91, 0x59, 0x1E, 0x46,
0xD3, 0xF7, 0xD9, 0x43, 0x19, 0xF1, 0x5E, 0xBD, 0xC3, 0xE8, 0x24, 0xF5, 0xFD, 0x6C, 0x35, 0x5E, 0x66, 0xBC, 0x2B, 0x40, 0x51, 0x6B, 0x4E, 0x1B, 0x61, 0x44, 0x26, 0xE9, 0xFB, 0xF4, 0xA1, 0xF0,
0x84, 0x6C, 0xA7, 0x87, 0xC8, 0x26, 0xE0, 0x30, 0xD9, 0xE8, 0xD2, 0x4F, 0xB5, 0x75, 0xF6, 0x25, 0x78, 0xAF, 0x4E, 0xD1, 0x3B, 0x49, 0x79, 0x3F, 0x5B, 0x8D, 0x17, 0x01, 0xDB, 0x69, 0x21, 0xD2,
0x4B, 0x56, 0xE9, 0x84, 0x1A, 0x93, 0x55, 0x8A, 0xBB, 0xE4, 0xE8, 0x97, 0x21, 0xB5, 0x23, 0x06, 0x09, 0x18, 0x4C, 0x36, 0xFA, 0xEA, 0x25, 0xDA, 0x3A, 0xBD, 0x48, 0xE3, 0x55, 0x32, 0xA1, 0xC6,
0x20, 0x3D, 0x47, 0x41, 0x0B, 0x31, 0x0F, 0x9F, 0xD8, 0xC6, 0x9A, 0x8E, 0x57, 0xDC, 0x88, 0xF0, 0xD5, 0x22, 0xC4, 0xA4, 0x4F, 0x84, 0x11, 0xC6, 0x64, 0x95, 0x60, 0xCD, 0x1C, 0xAD, 0x34, 0x04,
0x61, 0x5A, 0x64, 0x44, 0xB2, 0x2B, 0x4B, 0x26, 0x5F, 0x29, 0xFB, 0xB2, 0x4C, 0x52, 0x36, 0xB4, 0x7A, 0xC4, 0x80, 0x2D, 0xCC, 0x91, 0xED, 0x82, 0xE9, 0xC3, 0x27, 0xB6, 0xB1, 0xA6, 0xE3, 0x15,
0x0C, 0x3F, 0xBB, 0x8E, 0x27, 0x5F, 0xA0, 0x19, 0xAA, 0xC6, 0xC5, 0x2A, 0x56, 0xA0, 0xA0, 0x2E, 0x57, 0x29, 0xFC, 0x32, 0xCD, 0xE3, 0x23, 0xD9, 0x95, 0xC6, 0x93, 0x2F, 0x94, 0x5D, 0x2C, 0xE3,
0x7E, 0x41, 0x3E, 0x11, 0x03, 0x74, 0xF3, 0x4B, 0x32, 0x9D, 0x56, 0x01, 0x70, 0x8B, 0xA0, 0x01, 0x84, 0x0D, 0x2D, 0xA5, 0xE1, 0xE4, 0xDD, 0x90, 0x00, 0xB4, 0xF4, 0x3A, 0x9A, 0x5C, 0x40, 0x2B,
0x34, 0x0E, 0xA6, 0xAB, 0x98, 0x1F, 0x04, 0x80, 0x19, 0x5E, 0x8E, 0x7D, 0x08, 0xBD, 0x37, 0x88, 0xE4, 0x94, 0x8B, 0x55, 0xA4, 0x40, 0x45, 0x49, 0xBD, 0x40, 0x2A, 0x12, 0x03, 0x24, 0xF7, 0x22,
0x32, 0xD0, 0xA6, 0x38, 0x1B, 0x62, 0xB0, 0xA1, 0x82, 0x7A, 0x23, 0x5B, 0x82, 0x85, 0xD5, 0x81, 0x9E, 0x4E, 0xCB, 0x00, 0xB9, 0xBE, 0x50, 0x1F, 0x1B, 0x69, 0xBA, 0xBC, 0xA0, 0x49, 0x12, 0x27,
0x00, 0xDD, 0x88, 0x39, 0x1D, 0xE1, 0x10, 0x00, 0x25, 0x69, 0x9D, 0x1E, 0xE3, 0xBC, 0x40, 0xB2, 0x17, 0x0B, 0xD0, 0x3E, 0x98, 0x87, 0x93, 0x8A, 0xC6, 0x49, 0xEC, 0x53, 0x58, 0x1A, 0x69, 0x28,
0xB1, 0x26, 0x82, 0x77, 0x4D, 0x2B, 0xD8, 0xF7, 0x89, 0xA8, 0x1C, 0xA8, 0x35, 0x6B, 0x03, 0x6D, 0xF6, 0x34, 0xB4, 0x06, 0xD3, 0x55, 0xC4, 0x4F, 0x16, 0x40, 0xAF, 0xBF, 0x8E, 0x3D, 0xF0, 0xE5,
0x7F, 0x0A, 0xF1, 0x89, 0x8C, 0x9A, 0xDC, 0x00, 0xC9, 0x20, 0x3C, 0x61, 0x8D, 0x88, 0xC6, 0x33, 0x37, 0x48, 0x03, 0x98, 0xA8, 0x58, 0x2F, 0x62, 0xB0, 0xA1, 0xB2, 0xFB, 0x7A, 0xBA, 0x04, 0x95,
0x36, 0x37, 0xED, 0x81, 0xBE, 0x67, 0x95, 0x3D, 0x8B, 0x90, 0xE3, 0x7A, 0x7C, 0x3C, 0x64, 0x1F, 0xAD, 0x02, 0x0D, 0x74, 0x23, 0xE2, 0xA4, 0x08, 0x86, 0xF6, 0x00, 0xA4, 0xA0, 0x4A, 0x6B, 0x38,
0xC3, 0xCF, 0xC7, 0x88, 0xF1, 0x31, 0xB9, 0x6B, 0x51, 0x72, 0x2C, 0x06, 0x17, 0xAE, 0x46, 0x62, 0xCF, 0x97, 0x7C, 0xA9, 0x88, 0x68, 0xA0, 0xA2, 0xE5, 0xFC, 0xF8, 0x44, 0x54, 0x22, 0x56, 0x1A,
0x61, 0x84, 0xC7, 0xC7, 0x83, 0x94, 0xB2, 0x55, 0x1A, 0x6B, 0x1C, 0x05, 0xD5, 0x2F, 0x90, 0xDB, 0x95, 0x81, 0xB6, 0x3F, 0x26, 0xF9, 0x44, 0x46, 0x0D, 0xAE, 0xD1, 0x64, 0x10, 0x1C, 0xB1, 0x7A,
0x82, 0x91, 0xA0, 0xE6, 0xD9, 0xFC, 0x4B, 0x08, 0xFA, 0x0B, 0xCC, 0x14, 0xE3, 0x49, 0x9E, 0x46, 0x48, 0xA3, 0x19, 0x9B, 0x9B, 0xF6, 0x40, 0xDF, 0xB3, 0xCA, 0x9E, 0x45, 0x48, 0xAD, 0x1A, 0xD5,
0xD4, 0x5A, 0x4E, 0x0D, 0xC2, 0x7F, 0xCD, 0x86, 0x0B, 0x24, 0x0C, 0xB5, 0x76, 0x0D, 0x13, 0x06, 0x86, 0xEC, 0x63, 0xF0, 0xB9, 0x86, 0x18, 0xD7, 0xC8, 0x5D, 0x8B, 0x92, 0x9A, 0x18, 0x9C, 0xDB,
0xBC, 0x88, 0xA8, 0x56, 0x73, 0x5A, 0xB5, 0x3C, 0xAB, 0xA8, 0x75, 0x6A, 0x52, 0xC5, 0x6B, 0x98, 0x2E, 0x89, 0x85, 0x11, 0xD4, 0x6A, 0x83, 0x84, 0xB2, 0x55, 0x12, 0x69, 0x1C, 0x05, 0xD5, 0xD0,
0x08, 0xF4, 0x53, 0x1A, 0x0C, 0x6A, 0x5A, 0x13, 0x10, 0xD9, 0x06, 0xB7, 0x1B, 0x80, 0x53, 0x05, 0x90, 0xDB, 0x9C, 0x90, 0xA0, 0x37, 0xE9, 0xFC, 0x22, 0x00, 0x85, 0x00, 0x62, 0x8A, 0xF1, 0x24,
0xC0, 0x13, 0x89, 0x2D, 0x10, 0xAE, 0x25, 0x40, 0x74, 0xF7, 0x60, 0xD4, 0xEE, 0x94, 0x00, 0xC1, 0x8B, 0x4B, 0x2A, 0x2D, 0xA7, 0x02, 0xF1, 0x44, 0xC5, 0x86, 0x07, 0x44, 0x20, 0x95, 0x76, 0x05,
0x1B, 0xDF, 0x8D, 0x93, 0x53, 0x05, 0x68, 0x5B, 0x02, 0x22, 0x5E, 0x25, 0xC8, 0xAE, 0x0A, 0xD2, 0x23, 0x10, 0x7C, 0x08, 0x37, 0x59, 0x71, 0x5A, 0x95, 0x2C, 0x4C, 0xA9, 0x74, 0x2A, 0x52, 0x67,
0xBB, 0x37, 0x44, 0xA7, 0xB7, 0x13, 0x82, 0x7B, 0x1F, 0x2A, 0x3D, 0x01, 0xC2, 0x73, 0x05, 0x52, 0x2A, 0x18, 0x59, 0xF4, 0x13, 0xEA, 0x0F, 0x2A, 0x5A, 0x03, 0x10, 0xD9, 0x06, 0xB7, 0x1B, 0x80,
0x1D, 0x81, 0x53, 0xA7, 0x00, 0xA8, 0xC0, 0x6B, 0xDF, 0x0B, 0x60, 0xFB, 0x47, 0x03, 0xEC, 0xFE, 0x53, 0x06, 0xC0, 0x23, 0x93, 0x2D, 0x10, 0xAE, 0x25, 0x40, 0x74, 0xF7, 0x60, 0xD4, 0xEE, 0x14,
0x08, 0x80, 0x22, 0x39, 0x44, 0xB0, 0x65, 0xBE, 0x5C, 0x73, 0x3C, 0x45, 0x25, 0xE0, 0x3E, 0xCF, 0x00, 0xC1, 0xBC, 0xDF, 0x8D, 0x93, 0x53, 0x06, 0x68, 0x5B, 0x02, 0x22, 0x3E, 0x25, 0xC8, 0xAE,
0x97, 0x6B, 0x7C, 0x47, 0xC8, 0xC1, 0xED, 0x89, 0x6E, 0x6D, 0xF4, 0x23, 0x55, 0xF4, 0xCF, 0xEA, 0x0A, 0xB2, 0x79, 0x6F, 0x88, 0x4E, 0x6F, 0x27, 0x04, 0xF7, 0x3E, 0xBB, 0x6C, 0x0A, 0x10, 0x4D,
0xE7, 0x8F, 0x55, 0xCE, 0x1F, 0xAC, 0x99, 0x7F, 0x56, 0x2D, 0x7F, 0xAC, 0x4E, 0xFE, 0x58, 0x85, 0x57, 0x20, 0xD5, 0x11, 0x38, 0x75, 0x72, 0x80, 0x0A, 0xBC, 0xF6, 0xBD, 0x00, 0xB6, 0x7F, 0x34,
0xFC, 0x97, 0x68, 0x63, 0xE9, 0x1A, 0xF1, 0xEC, 0x66, 0xD3, 0x33, 0xDE, 0x57, 0x51, 0x1D, 0x0F, 0xC0, 0xEE, 0x8F, 0x00, 0x28, 0xA2, 0x4D, 0x04, 0x5B, 0x04, 0xE0, 0x15, 0xA7, 0xA9, 0x88, 0x04,
0xFE, 0xD5, 0x8A, 0x7D, 0xC8, 0xDA, 0xEB, 0x8E, 0xE1, 0x6A, 0xAF, 0x1C, 0xA3, 0xAB, 0xBD, 0xEA, 0xBC, 0x67, 0x01, 0x78, 0x85, 0x97, 0x98, 0x1C, 0xAC, 0x77, 0x74, 0x2B, 0xA3, 0x1F, 0x29, 0xA2,
0x18, 0xB6, 0xCB, 0x7F, 0x2D, 0xED, 0x95, 0x2D, 0x2F, 0x5D, 0xC3, 0xB6, 0xC5, 0xA5, 0x25, 0x1A, 0x7F, 0x54, 0x3E, 0x7F, 0xAC, 0x70, 0xFE, 0x60, 0xC9, 0xFC, 0xA3, 0x62, 0xF9, 0x63, 0x65, 0xF2,
0xDB, 0x70, 0xB1, 0xF8, 0xA5, 0x67, 0xD8, 0x1D, 0xFE, 0xDB, 0xE3, 0x4D, 0x0E, 0x0C, 0x77, 0xE4, 0xC7, 0x0A, 0xE4, 0xBF, 0x45, 0x1A, 0x0B, 0xD3, 0x88, 0x87, 0x41, 0x9B, 0x96, 0xF1, 0xBE, 0x82,
0xC5, 0x31, 0xEC, 0x2E, 0xBF, 0x74, 0x79, 0x5B, 0x1B, 0xA1, 0xB6, 0xB5, 0x6F, 0x48, 0x60, 0x9A, 0xEA, 0x34, 0xE1, 0x5F, 0x25, 0x2F, 0x6C, 0x56, 0x5E, 0x77, 0x0C, 0x57, 0x7B, 0xE5, 0x18, 0x5D,
0x7C, 0x05, 0x0A, 0xF9, 0xD6, 0x4A, 0x4D, 0x54, 0x66, 0x35, 0x4E, 0xE9, 0x4E, 0x42, 0x45, 0x02, 0xED, 0x55, 0xC7, 0xB0, 0x5D, 0xFE, 0x69, 0x69, 0xAF, 0x6C, 0xF9, 0xE8, 0x1A, 0xB6, 0x2D, 0x1E,
0xFE, 0x05, 0x6B, 0x59, 0xAA, 0xDF, 0x28, 0xF1, 0xE8, 0x78, 0x48, 0x31, 0x0C, 0x19, 0x6A, 0x04, 0x2D, 0xD1, 0xD8, 0x86, 0x87, 0xC5, 0x1F, 0x3D, 0xC3, 0xEE, 0xF0, 0xCF, 0x1E, 0x6F, 0x72, 0x60,
0x22, 0xBC, 0x44, 0x31, 0x08, 0x44, 0x20, 0xA2, 0x97, 0x30, 0x20, 0xAA, 0xE3, 0xA1, 0xFA, 0x19, 0xB8, 0x23, 0x1F, 0x8E, 0x61, 0x77, 0xF9, 0xA3, 0xCB, 0xDB, 0xDA, 0x08, 0xB5, 0xAD, 0x7D, 0xC3,
0x54, 0x5E, 0xF1, 0x2C, 0xAB, 0x53, 0x83, 0xE5, 0x4C, 0xAB, 0xD3, 0x21, 0x6D, 0xB0, 0xE4, 0x55, 0x0D, 0x26, 0xF1, 0x17, 0xD8, 0x21, 0xAF, 0xD5, 0x54, 0x44, 0xAA, 0x57, 0xE1, 0x3B, 0xDD, 0xB9,
0xB2, 0xA6, 0xE9, 0xAF, 0x90, 0xD0, 0xD6, 0x75, 0xFD, 0xA4, 0xCE, 0x86, 0x6C, 0xA3, 0xED, 0xA9, 0x51, 0x11, 0xD1, 0x5F, 0x60, 0x72, 0x4C, 0xF5, 0x1B, 0xC5, 0x1F, 0xD5, 0x86, 0x14, 0xDD, 0x90,
0x69, 0xF7, 0xD9, 0x09, 0x7D, 0x6A, 0xF7, 0xAD, 0x12, 0x2A, 0x1E, 0x60, 0xF9, 0x6C, 0x32, 0xE7, 0xA1, 0x7A, 0x20, 0xC2, 0x73, 0x1E, 0x83, 0x80, 0x07, 0x22, 0x7A, 0x01, 0x03, 0x02, 0x01, 0x3C,
0xB9, 0x05, 0x2F, 0x70, 0x10, 0x43, 0x8C, 0xF9, 0x0C, 0xD3, 0x05, 0x4C, 0x1F, 0x06, 0xE1, 0x14, 0xA5, 0x3F, 0x83, 0x54, 0x2E, 0x9A, 0xA5, 0x55, 0x6A, 0xB0, 0x8C, 0x68, 0x55, 0x3A, 0xA4, 0x75,
0xA0, 0x11, 0x75, 0xE3, 0xE2, 0x8C, 0x8F, 0xEC, 0x6B, 0xE4, 0x98, 0x36, 0xC4, 0x2C, 0x83, 0x1D, 0x16, 0xBF, 0x8A, 0xD7, 0x34, 0xF9, 0x15, 0x22, 0xE4, 0xAA, 0xAE, 0x1F, 0x55, 0xD9, 0x90, 0x6D,
0x57, 0x87, 0x7C, 0x57, 0x1F, 0xCE, 0x13, 0xE6, 0x47, 0x9A, 0x78, 0x0D, 0x80, 0x4F, 0x62, 0xD8, 0xB4, 0x1D, 0x9B, 0x76, 0x9F, 0x1D, 0xD1, 0x63, 0xBB, 0x6F, 0x15, 0x50, 0xF1, 0x44, 0xCC, 0x63,
0x70, 0x78, 0x0E, 0x64, 0xA6, 0x81, 0x3A, 0x65, 0x05, 0xCF, 0x87, 0x67, 0xBC, 0x99, 0x4C, 0x56, 0x93, 0x39, 0x0F, 0x4F, 0x78, 0xC6, 0x84, 0x18, 0xA2, 0xCF, 0x67, 0x18, 0x2C, 0x60, 0xC4, 0x31,
0x4B, 0xF1, 0x02, 0xB6, 0x46, 0xF8, 0xD0, 0x93, 0x05, 0x85, 0xE4, 0x4E, 0x5B, 0x84, 0x31, 0x28, 0x08, 0xA6, 0x00, 0x8D, 0xA8, 0x95, 0x90, 0x33, 0x3E, 0xB2, 0xAF, 0x91, 0x1A, 0xAD, 0x8B, 0x59,
0x4D, 0x8D, 0x97, 0x10, 0xC2, 0x2F, 0xCC, 0x41, 0xAB, 0x86, 0xB5, 0x1E, 0xDC, 0x89, 0xD4, 0xAD, 0x06, 0xAB, 0x95, 0x87, 0x7C, 0x57, 0xBF, 0x9C, 0xC7, 0xCC, 0x0B, 0x35, 0x71, 0xAF, 0x80, 0x4F,
0x86, 0x2B, 0x24, 0xC5, 0x7C, 0xC8, 0x0A, 0x40, 0x88, 0x7C, 0xB2, 0x2C, 0x91, 0x37, 0xFB, 0x7F, 0x62, 0xD8, 0x70, 0x78, 0x0E, 0x84, 0xBA, 0xBE, 0x3A, 0x65, 0x05, 0xDF, 0x0F, 0xCF, 0x78, 0x3B,
0x26, 0x46, 0x90, 0x4C, 0x56, 0x0B, 0x90, 0x63, 0x63, 0x46, 0xD9, 0x8B, 0x88, 0xE2, 0xED, 0x2F, 0x99, 0xAC, 0x96, 0xE2, 0x46, 0xB7, 0x46, 0xF8, 0xD0, 0xA3, 0x05, 0x85, 0x68, 0x51, 0x5B, 0x04,
0xD7, 0xA7, 0x20, 0x3F, 0x59, 0x28, 0xEA, 0x8D, 0x30, 0x8E, 0x69, 0xFA, 0xFB, 0xF9, 0xEB, 0x57, 0x11, 0x08, 0x4D, 0x85, 0xE7, 0x24, 0xC2, 0x2E, 0xCC, 0x41, 0xAA, 0x86, 0x95, 0x1E, 0xBC, 0x89,
0x43, 0x66, 0x70, 0x76, 0x82, 0xA8, 0x9F, 0xA8, 0xA9, 0x93, 0xE0, 0x74, 0x58, 0xC9, 0xA6, 0x20, 0x58, 0xB0, 0x82, 0x2B, 0xC4, 0xF9, 0x7C, 0x88, 0x0A, 0x80, 0x89, 0x7C, 0xB2, 0xCC, 0xB9, 0x37,
0x8B, 0x61, 0xA7, 0x78, 0xB4, 0xFE, 0x66, 0x8A, 0x39, 0x95, 0x51, 0xE9, 0x13, 0x49, 0x8F, 0xA3, 0xFB, 0x7F, 0x26, 0x86, 0x1F, 0x4F, 0x56, 0x0B, 0xE0, 0x63, 0x7D, 0x46, 0xD9, 0x8B, 0x90, 0xE2,
0x0F, 0x38, 0x75, 0x2C, 0xCD, 0x2D, 0x4D, 0x7D, 0x55, 0xEE, 0x40, 0xEA, 0x53, 0xC9, 0xDA, 0x60, 0xEB, 0x2F, 0xD7, 0x27, 0xC0, 0x3F, 0x99, 0x79, 0xEA, 0xF5, 0x20, 0x8A, 0x68, 0xF2, 0xFB, 0xF9,
0x08, 0xAD, 0x5B, 0x90, 0xC6, 0xD8, 0xF7, 0xC8, 0x82, 0x30, 0xC1, 0x82, 0x54, 0x48, 0xB1, 0xD8, 0xEB, 0x57, 0x43, 0x66, 0x70, 0x72, 0x02, 0xAB, 0x9F, 0xA8, 0xA1, 0x93, 0xA0, 0x74, 0x50, 0x8A,
0x32, 0x23, 0x02, 0xD5, 0x8C, 0x30, 0xCF, 0x06, 0xFF, 0x50, 0x1B, 0x41, 0xE5, 0x8A, 0x95, 0x54, 0xA6, 0x20, 0x8A, 0x61, 0x27, 0x78, 0x56, 0xFF, 0x76, 0x8A, 0x31, 0x95, 0x51, 0xEA, 0x13, 0x41,
0x5E, 0x28, 0x91, 0x5B, 0xDA, 0xE0, 0xBA, 0xD5, 0x00, 0xFC, 0x58, 0x3D, 0xD7, 0x3B, 0x55, 0x7D, 0x8F, 0xA3, 0x0F, 0xF8, 0xEE, 0x58, 0x92, 0x69, 0x9A, 0x7A, 0xF7, 0xEE, 0x40, 0xE8, 0x53, 0x8A,
0xB7, 0x34, 0xBB, 0x81, 0x25, 0xA0, 0xC1, 0xF8, 0x45, 0xBF, 0xD5, 0x91, 0x6B, 0x43, 0x95, 0x45, 0xDA, 0x60, 0x08, 0xAD, 0x5A, 0x10, 0xC6, 0xD8, 0xF7, 0x88, 0x82, 0x30, 0xC0, 0x82, 0x50, 0x48,
0x47, 0x47, 0x75, 0xD0, 0x4B, 0x4B, 0xE7, 0x39, 0x26, 0x32, 0x30, 0xC1, 0x74, 0x36, 0x1A, 0x5A, 0xD1, 0xD8, 0x22, 0x22, 0x02, 0xD1, 0x0C, 0x31, 0x70, 0x07, 0xFB, 0x50, 0x19, 0x41, 0x2A, 0x8C,
0x83, 0xE8, 0x24, 0x5F, 0x4D, 0x70, 0x6A, 0x10, 0x1D, 0x1F, 0xEB, 0xC4, 0xB4, 0x81, 0xEB, 0x02, 0xA9, 0x59, 0x96, 0x79, 0x91, 0x5B, 0x5A, 0xE7, 0xB2, 0x55, 0x07, 0xFC, 0x58, 0x35, 0x93, 0x3B,
0x7A, 0x5D, 0xF6, 0x7F, 0x8C, 0x3E, 0x37, 0x70, 0xAB, 0x45, 0x07, 0x58, 0x9C, 0x95, 0xE7, 0xEF, 0x55, 0x7C, 0xB7, 0x24, 0xBB, 0x8E, 0x39, 0xA5, 0xC1, 0xF8, 0x43, 0xBF, 0xD5, 0x91, 0x6A, 0x43,
0x46, 0x52, 0x65, 0x78, 0x31, 0x09, 0x4E, 0x48, 0xF5, 0x3C, 0x8A, 0x43, 0xDA, 0xE1, 0x84, 0xB4, 0x95, 0x44, 0x4F, 0x9F, 0x56, 0x41, 0x2E, 0x2D, 0x9D, 0xC7, 0x98, 0x48, 0xC0, 0x10, 0x83, 0xDD,
0xD1, 0x27, 0x56, 0xFA, 0x21, 0xDB, 0x70, 0xC0, 0x8F, 0x18, 0x8E, 0x8D, 0xDE, 0xC8, 0xC1, 0xFB, 0x18, 0xA2, 0xD7, 0xF8, 0x28, 0x5B, 0x4D, 0x50, 0x6A, 0x10, 0xD7, 0x6A, 0x3A, 0x31, 0x6D, 0xA0,
0xB6, 0xB8, 0x74, 0x78, 0x9B, 0x8D, 0x1E, 0xE4, 0x95, 0xED, 0xC8, 0x5F, 0x5B, 0xC3, 0x61, 0xF6, 0xBA, 0x80, 0x5E, 0x95, 0xFD, 0x1F, 0xE3, 0xCF, 0x75, 0xAC, 0xDD, 0xE8, 0x00, 0x8B, 0x93, 0xF2,
0x3D, 0x7C, 0x0A, 0xBE, 0x17, 0xA3, 0x5D, 0xD9, 0x22, 0x12, 0x5F, 0xE3, 0xB5, 0xA6, 0x5D, 0x39, 0xFC, 0x74, 0x24, 0x45, 0x86, 0x67, 0xA7, 0x60, 0x84, 0x54, 0xCB, 0xA3, 0x18, 0xA4, 0x1D, 0x46,
0x70, 0x01, 0xDF, 0x7B, 0xED, 0xF0, 0x28, 0xB8, 0x01, 0x41, 0x3C, 0x9A, 0x12, 0x79, 0xBB, 0xD6, 0x48, 0x1B, 0x69, 0xF0, 0x5F, 0x61, 0x89, 0x6C, 0xC3, 0x01, 0x4B, 0x62, 0x38, 0x36, 0xDA, 0x23,
0xCC, 0x49, 0x94, 0x5B, 0x46, 0x3C, 0x8B, 0x85, 0x86, 0xDA, 0xC9, 0xF9, 0x73, 0x99, 0x3D, 0x7F, 0x07, 0xDF, 0xDB, 0xE2, 0xD1, 0xE1, 0x6D, 0x36, 0xDA, 0x90, 0x57, 0xB6, 0x23, 0x3F, 0x6D, 0x0D,
0x92, 0xE9, 0xF3, 0xA7, 0xDC, 0x87, 0x93, 0xE2, 0xD5, 0x83, 0xE5, 0xD5, 0x40, 0xD9, 0x88, 0xAE, 0x87, 0xD9, 0xF7, 0xB0, 0x2A, 0x78, 0xD5, 0x46, 0xBB, 0xB2, 0x85, 0x2F, 0xBE, 0xC6, 0x67, 0x45,
0x81, 0x3D, 0x70, 0x07, 0xA6, 0x30, 0x14, 0xE5, 0x75, 0x5C, 0x2B, 0xF6, 0xA6, 0xC5, 0xD6, 0x74, 0xBB, 0x72, 0xE0, 0x01, 0xD6, 0xF7, 0xDA, 0xE1, 0x7E, 0x70, 0x03, 0x82, 0xF8, 0x6A, 0x4A, 0xF4,
0xA5, 0xE4, 0x52, 0x76, 0xA2, 0x6B, 0xB8, 0xF2, 0xC6, 0x64, 0x83, 0xF0, 0x77, 0x4A, 0x1A, 0xF8, 0xED, 0x4A, 0x23, 0xDB, 0xA4, 0xAC, 0x42, 0xF1, 0x38, 0x16, 0x1A, 0x2A, 0x47, 0xE7, 0xCF, 0x65,
0xB7, 0x3A, 0x8D, 0xD9, 0x37, 0x90, 0xDA, 0xC6, 0x80, 0xA3, 0x23, 0x65, 0xC4, 0x76, 0xF7, 0xF7, 0xFC, 0xFC, 0x49, 0x06, 0xD0, 0x9F, 0x32, 0x2B, 0x4E, 0xF2, 0xDB, 0x0C, 0xCB, 0xAB, 0x81, 0x52,
0xEF, 0xA8, 0x18, 0xB6, 0x2E, 0xA9, 0x14, 0xE5, 0x17, 0xEE, 0x74, 0x9F, 0x3F, 0x1F, 0x01, 0x8D, 0xDB, 0xAE, 0x80, 0x46, 0x70, 0x13, 0xA6, 0x90, 0x14, 0x39, 0x56, 0xAB, 0xE4, 0xE5, 0x6E, 0x51,
0x82, 0xDA, 0x0D, 0x0D, 0x90, 0x63, 0x79, 0xAF, 0xD2, 0x35, 0xF7, 0xB3, 0x37, 0xEB, 0xF8, 0x6D, 0xED, 0x2E, 0x65, 0x71, 0x4A, 0x71, 0xBB, 0x82, 0x2B, 0x6F, 0x4C, 0x36, 0x08, 0xBF, 0xA6, 0x52,
0x9A, 0x2C, 0x69, 0xCA, 0xAE, 0xEB, 0x84, 0x6F, 0x46, 0xE9, 0x4F, 0xEB, 0xA0, 0x6A, 0x96, 0x98, 0xC7, 0x3F, 0xFF, 0xA9, 0xCF, 0xBE, 0x01, 0xDF, 0x36, 0x06, 0x3C, 0x7D, 0xAA, 0x8C, 0xD8, 0xEE,
0xB2, 0x03, 0x1E, 0x0E, 0x52, 0xE0, 0xE9, 0xFD, 0x7C, 0xA0, 0x84, 0x2F, 0x1F, 0x73, 0x75, 0xB2, 0xFE, 0xFE, 0x1D, 0x45, 0xC3, 0xD6, 0xE5, 0x2E, 0x45, 0x46, 0x87, 0xC5, 0xF3, 0xF3, 0xE7, 0x23,
0x7E, 0xAE, 0xA9, 0xDC, 0xF9, 0x24, 0x77, 0x37, 0x3F, 0x11, 0xC5, 0x80, 0x9F, 0x43, 0xE4, 0x60, 0xD8, 0xA3, 0xD8, 0xED, 0x86, 0x0C, 0xC8, 0xB1, 0xBC, 0x57, 0xE9, 0x9A, 0x7B, 0xE9, 0xDB, 0x75,
0xB4, 0xCE, 0xFD, 0x53, 0x95, 0xD1, 0xA4, 0xA6, 0x63, 0x75, 0x82, 0x40, 0xD5, 0x12, 0xA3, 0x42, 0xF4, 0x2E, 0x89, 0x97, 0x34, 0x61, 0xD7, 0x55, 0xC2, 0xEB, 0x5B, 0xFA, 0x71, 0x15, 0x84, 0xCD,
0x3B, 0x2E, 0x2D, 0x2C, 0x11, 0x7F, 0x50, 0xC7, 0x4B, 0xA3, 0xC9, 0xC0, 0x5E, 0xB2, 0x4D, 0x7B, 0x12, 0x53, 0x76, 0xC0, 0xC3, 0x41, 0x0A, 0x3C, 0xBD, 0x9F, 0x0D, 0x94, 0xF0, 0xE5, 0xD7, 0x4C,
0xC9, 0xA4, 0xBD, 0x0C, 0x37, 0xED, 0x25, 0xDB, 0xB6, 0x97, 0x47, 0x59, 0x8A, 0x62, 0x27, 0x3D, 0xA0, 0xAC, 0x9F, 0x2B, 0x2A, 0x75, 0x3E, 0xC9, 0x82, 0xE9, 0x27, 0xA2, 0xA8, 0xF0, 0x73, 0xF0,
0x11, 0x92, 0x7B, 0x18, 0x5C, 0x21, 0x30, 0x43, 0x0C, 0x96, 0x3F, 0x2D, 0x0C, 0xB3, 0x1E, 0xDA, 0x1D, 0x8C, 0x56, 0xB9, 0x85, 0x2A, 0x13, 0x9A, 0x54, 0x74, 0xCC, 0x4F, 0x10, 0xA8, 0x9A, 0x64,
0x85, 0x87, 0x96, 0xD4, 0xE2, 0xE6, 0xE4, 0xF0, 0xA1, 0x78, 0xC1, 0xE0, 0x8C, 0xC6, 0xE5, 0xF2, 0x94, 0xF6, 0x8E, 0x4B, 0x0B, 0x5D, 0xC4, 0x0F, 0x94, 0xF2, 0x42, 0x6D, 0x52, 0xD0, 0x98, 0x74,
0xF9, 0x2D, 0xFE, 0xEB, 0x08, 0xDB, 0x82, 0xFE, 0xFB, 0xC5, 0xE6, 0x52, 0xF9, 0xB9, 0x40, 0xAA, 0x53, 0x63, 0x52, 0xA9, 0x31, 0xC3, 0x4D, 0x8D, 0x49, 0xB7, 0x35, 0xE6, 0x51, 0xBA, 0xA2, 0xE8,
0xB5, 0xA3, 0x56, 0xA8, 0x69, 0x91, 0xC9, 0x6C, 0xBF, 0x75, 0xA5, 0x7A, 0x59, 0x25, 0xBC, 0x2B, 0x49, 0x4F, 0x38, 0xE5, 0x1E, 0xBA, 0x57, 0x70, 0xCD, 0xE0, 0x85, 0xE5, 0x47, 0x0B, 0x1D, 0x6D,
0x82, 0xCA, 0x4A, 0x41, 0x0D, 0x72, 0x49, 0x6D, 0xF4, 0x95, 0xCA, 0x52, 0x68, 0x89, 0xA2, 0x2E, 0x13, 0xF5, 0xA2, 0x89, 0x9A, 0xD4, 0xE2, 0xEA, 0xE4, 0xF0, 0xA1, 0xF8, 0x40, 0xF7, 0x8C, 0xCA,
0xCA, 0xE0, 0xDD, 0xEA, 0x68, 0xA8, 0xDA, 0xF8, 0x70, 0xAD, 0xDA, 0x8F, 0xEF, 0xA3, 0x14, 0x6B, 0xE5, 0xF2, 0xF9, 0x2D, 0xFE, 0xE9, 0x08, 0xDD, 0x82, 0xFE, 0xFB, 0x79, 0xE7, 0x42, 0xF8, 0x39,
0x6F, 0x3C, 0xCC, 0xF7, 0x72, 0xD5, 0x80, 0x98, 0x3C, 0x25, 0xA4, 0x4F, 0x70, 0x73, 0xF7, 0x40, 0x43, 0xCA, 0xD9, 0xA3, 0x96, 0x8B, 0x69, 0x1E, 0xCB, 0x6C, 0x5F, 0xE4, 0x52, 0xED, 0xAC, 0xE2,
0x20, 0xC5, 0x73, 0x26, 0x75, 0x52, 0xFC, 0x94, 0xE0, 0xA9, 0x90, 0x56, 0xF1, 0x12, 0x5A, 0x98, 0xE0, 0x15, 0x46, 0xA5, 0x05, 0xA3, 0x06, 0x19, 0xA7, 0x36, 0xFA, 0x0A, 0x61, 0xC9, 0xA5, 0x44,
0x41, 0x80, 0xCF, 0x32, 0x75, 0x47, 0x4F, 0x1C, 0xCC, 0x68, 0x21, 0x83, 0x35, 0x72, 0x97, 0x55, 0x11, 0x17, 0x65, 0xF0, 0x6E, 0x71, 0x34, 0x54, 0x69, 0x7C, 0xB8, 0x54, 0xED, 0xC7, 0xF7, 0x51,
0x6B, 0xD6, 0x24, 0x4B, 0xB4, 0xDA, 0xC6, 0x86, 0x4E, 0x6D, 0xF4, 0x5B, 0xA2, 0xB1, 0x44, 0x13, 0x82, 0xB5, 0xD7, 0x23, 0x66, 0xE5, 0x61, 0xD5, 0x25, 0x86, 0xC7, 0x84, 0xF4, 0x09, 0xD6, 0x8B,
0x6F, 0xCF, 0x84, 0xE5, 0xF1, 0x9D, 0x3F, 0x3A, 0x80, 0x5D, 0xB9, 0x9D, 0x5C, 0x8D, 0xF4, 0x7B, 0x0F, 0xB8, 0x52, 0x3C, 0xBA, 0x52, 0x27, 0x45, 0xC7, 0x04, 0x0F, 0x9A, 0xB4, 0x92, 0x95, 0xD0,
0x27, 0xF0, 0xFD, 0xF7, 0x0A, 0x3D, 0x72, 0x8F, 0xA5, 0x4C, 0xC7, 0xA4, 0xB9, 0x63, 0x92, 0x88, 0x82, 0x14, 0x5C, 0x7C, 0x9A, 0xAA, 0x45, 0x42, 0x51, 0xD0, 0xD0, 0x02, 0x06, 0x6B, 0x64, 0x26,
0x07, 0x7D, 0xE9, 0xA2, 0x4E, 0x7E, 0x15, 0x37, 0x5A, 0x80, 0x5D, 0x38, 0x26, 0x99, 0xA2, 0x4E, 0xAB, 0xD2, 0xA8, 0x48, 0x92, 0x68, 0x95, 0x8D, 0x1A, 0x51, 0x65, 0xF4, 0x5B, 0xAC, 0xB1, 0x58,
0x8B, 0xAC, 0x08, 0xEC, 0xB1, 0x92, 0x3A, 0xF2, 0x41, 0xC0, 0x52, 0xBA, 0x05, 0x33, 0xCF, 0x3D, 0x13, 0x17, 0x72, 0x82, 0xE2, 0x44, 0xD0, 0x1B, 0x1D, 0xC0, 0xAE, 0xA8, 0x50, 0x97, 0x7D, 0xFD,
0x0F, 0x81, 0x85, 0x31, 0xA0, 0xC7, 0x49, 0x7A, 0x7D, 0x00, 0x36, 0x8C, 0xA9, 0x82, 0x57, 0x8E, 0xDE, 0x09, 0xBC, 0xA4, 0x5F, 0xDA, 0x8F, 0xAC, 0xB2, 0x14, 0x01, 0x99, 0x54, 0x77, 0x0C, 0x13,
0x69, 0xE4, 0x5E, 0xD1, 0x32, 0x85, 0x80, 0xCE, 0xEA, 0xE4, 0x79, 0x0E, 0x8E, 0xEF, 0xE9, 0x42, 0xF1, 0xEC, 0x30, 0x59, 0x54, 0xC9, 0xAF, 0xE2, 0x45, 0xF3, 0xB1, 0x0B, 0xC7, 0xC4, 0x53, 0x94,
0xF6, 0x03, 0x4A, 0x12, 0xAF, 0xA2, 0x08, 0xFC, 0xF6, 0x06, 0xE8, 0x49, 0x0E, 0x03, 0x95, 0x1E, 0x69, 0x11, 0x17, 0x81, 0x3E, 0x96, 0x82, 0x47, 0x3E, 0x08, 0x48, 0x4A, 0xB7, 0x60, 0x66, 0xD1,
0x1C, 0xCF, 0x02, 0xD2, 0xD5, 0x72, 0x05, 0x75, 0x28, 0xCF, 0x1B, 0x70, 0x99, 0x78, 0x18, 0xD3, 0xE7, 0x21, 0xB0, 0x30, 0x06, 0xE4, 0x38, 0x4E, 0xAE, 0x0F, 0xC0, 0x86, 0x31, 0x65, 0xF0, 0xCA,
0xB5, 0xF6, 0x5F, 0xAF, 0x5F, 0xFD, 0xCE, 0xD8, 0xF2, 0x1D, 0xBD, 0x58, 0x41, 0xFA, 0x6A, 0x84, 0xC9, 0x8F, 0xAC, 0x16, 0x2D, 0x13, 0x70, 0xE9, 0xAC, 0x4A, 0x9E, 0x67, 0xE0, 0x78, 0x99, 0x18,
0x43, 0xD2, 0xE4, 0xCA, 0xFC, 0x54, 0xBC, 0xCE, 0x3A, 0x04, 0x32, 0xF6, 0xEB, 0xE5, 0xA6, 0x7A, 0xE2, 0x1F, 0x10, 0x92, 0x68, 0x15, 0x86, 0x60, 0xB7, 0x37, 0x40, 0x4F, 0x32, 0x18, 0x28, 0xF4,
0x21, 0x4F, 0x62, 0xC0, 0x18, 0x34, 0xA9, 0xD1, 0x68, 0xE0, 0x06, 0x0F, 0x24, 0x9B, 0x08, 0x4E, 0x60, 0x78, 0x16, 0x10, 0xB0, 0x16, 0x2B, 0xA8, 0x43, 0x79, 0xE4, 0x80, 0xCB, 0x44, 0xC3, 0x88,
0x6C, 0x49, 0x1F, 0xD3, 0x78, 0x92, 0x04, 0xF4, 0xFD, 0xBB, 0xD3, 0x3A, 0xD3, 0x45, 0xA7, 0xD8, 0xAE, 0xB5, 0xFF, 0x7A, 0xFD, 0xEA, 0x77, 0xC6, 0x96, 0xA7, 0xF4, 0x72, 0x05, 0x01, 0xAC, 0x11,
0xB9, 0x53, 0x3A, 0xD4, 0xDC, 0xCE, 0x88, 0x1B, 0x49, 0x0C, 0x84, 0x05, 0xD7, 0x98, 0x10, 0xD2, 0x0C, 0x49, 0x83, 0x0B, 0xF3, 0xB1, 0xB8, 0x21, 0x3B, 0x84, 0x6D, 0xEC, 0x97, 0xCB, 0x4D, 0xF1,
0x09, 0x24, 0x67, 0x33, 0x3A, 0x2C, 0x32, 0x20, 0xFD, 0xC6, 0x1B, 0x0E, 0xE3, 0x06, 0x1F, 0x80, 0x42, 0x9A, 0x44, 0x80, 0x31, 0x48, 0x52, 0xBD, 0x5E, 0xC7, 0x12, 0x0F, 0x84, 0x9B, 0x08, 0x4E,
0xF9, 0x34, 0xF0, 0xA4, 0xEE, 0x58, 0x16, 0xB6, 0x89, 0x04, 0xF2, 0xE9, 0x8E, 0xDC, 0xFC, 0x3F, 0x54, 0xB9, 0x6B, 0x34, 0xC2, 0x9A, 0xD9, 0xFB, 0xD3, 0x93, 0x2A, 0xD3, 0x45, 0xA7, 0x28, 0xFF,
0xCF, 0xDE, 0xFC, 0x01, 0x71, 0x37, 0x85, 0x84, 0x1E, 0xA7, 0x66, 0xCB, 0x24, 0xCE, 0xE8, 0x39, 0x29, 0x1D, 0x6A, 0x74, 0x67, 0x44, 0xF5, 0x38, 0x82, 0x8D, 0xF9, 0xD7, 0x18, 0x12, 0xD2, 0x09,
0xBD, 0x62, 0xBA, 0xDE, 0xF7, 0x2C, 0x5B, 0x99, 0xFC, 0xEE, 0x55, 0x5D, 0xEF, 0xD7, 0x41, 0xDC, 0x84, 0x67, 0x33, 0x3A, 0xCC, 0x63, 0x20, 0xFD, 0xA6, 0x39, 0x1C, 0x46, 0x75, 0x3E, 0x00, 0x23,
0x59, 0x12, 0xD1, 0x46, 0x94, 0xCC, 0xEA, 0x79, 0x97, 0x6E, 0xBC, 0xFC, 0xF0, 0x22, 0x4D, 0x21, 0x6A, 0xA0, 0x49, 0xD5, 0xB1, 0x2C, 0x6C, 0x13, 0x21, 0xE4, 0xF1, 0x8E, 0xE8, 0xFC, 0x3F, 0xCF,
0x0C, 0xE8, 0xC0, 0x65, 0xC4, 0x72, 0x49, 0xE3, 0x3A, 0xF9, 0xED, 0xC5, 0x39, 0x90, 0x6C, 0x40, 0xDE, 0xBE, 0x01, 0xBF, 0x9B, 0x40, 0x48, 0x8F, 0x53, 0xD3, 0x65, 0x1C, 0xA5, 0xF4, 0x9C, 0x5E,
0x5E, 0x05, 0x4D, 0x19, 0xB0, 0xBC, 0xBE, 0x21, 0x02, 0xB1, 0xBB, 0x2F, 0x65, 0x7C, 0xD0, 0x2A, 0x31, 0x5D, 0xEF, 0x37, 0x2D, 0x5B, 0x99, 0x7C, 0xFA, 0xAA, 0xAA, 0xF7, 0xAB, 0xC0, 0xEE, 0x34,
0xF2, 0x03, 0x07, 0x5D, 0x78, 0x16, 0x2C, 0x20, 0x2C, 0x0C, 0xD6, 0x22, 0xC8, 0xE8, 0x37, 0x7B, 0x0E, 0x69, 0x3D, 0x8C, 0x67, 0xD5, 0xAC, 0x4B, 0x37, 0x5E, 0x7E, 0x78, 0x81, 0x25, 0x40, 0x20,
0x27, 0x57, 0x0F, 0x54, 0xF5, 0x46, 0xE5, 0xEC, 0x34, 0x17, 0xCB, 0x7E, 0xFB, 0x4A, 0x67, 0x30, 0xB2, 0x7E, 0x8B, 0x58, 0x2E, 0x69, 0x54, 0x25, 0xBF, 0xBD, 0x38, 0x87, 0x2D, 0x1B, 0x10, 0x59,
0x87, 0x7B, 0xEC, 0x46, 0xB9, 0xF3, 0x2F, 0x4F, 0x01, 0x22, 0x4A, 0x06, 0xA2, 0xAC, 0x41, 0xBD, 0x41, 0x53, 0x0A, 0x24, 0xAF, 0x6E, 0xB0, 0x40, 0x1C, 0x18, 0x48, 0x1E, 0x1F, 0xD4, 0x8A, 0xEC,
0x79, 0x99, 0xA4, 0x8B, 0xE7, 0x3E, 0xF3, 0x07, 0xAC, 0xE1, 0x2F, 0x97, 0x48, 0xAC, 0xB0, 0x4E, 0x0C, 0x43, 0x17, 0x96, 0x05, 0x53, 0x08, 0x0B, 0x9D, 0xB5, 0x70, 0x32, 0xFA, 0xCD, 0xDE, 0xC9,
0x35, 0xDB, 0x2E, 0x43, 0x65, 0x0C, 0xA1, 0x32, 0x3E, 0xC9, 0xF1, 0x1F, 0xC4, 0x10, 0x24, 0x65, 0xE5, 0x33, 0x5A, 0xBD, 0x5E, 0x3A, 0x8E, 0xCD, 0xD8, 0xB2, 0x5F, 0xBF, 0x92, 0x19, 0xCC, 0xE1,
0xE2, 0x4E, 0x3F, 0xC6, 0x9F, 0xC1, 0x0B, 0xAB, 0x15, 0x5D, 0x28, 0xBD, 0xE8, 0x19, 0x29, 0x81, 0x16, 0xBB, 0x5E, 0x1C, 0x26, 0xC8, 0x83, 0x85, 0x90, 0x92, 0x81, 0x48, 0x6C, 0x50, 0x6E, 0x5E,
0x27, 0x46, 0x28, 0xC2, 0xA7, 0x51, 0xAE, 0x57, 0x1E, 0xC3, 0x00, 0xD7, 0xB7, 0x01, 0xE8, 0xB7, 0xC6, 0xC9, 0xE2, 0xB9, 0xC7, 0xBC, 0x01, 0xAB, 0x7B, 0xCB, 0x25, 0x6E, 0x56, 0x68, 0xA7, 0x1A,
0xB8, 0x42, 0xB4, 0x43, 0xCB, 0x07, 0x91, 0x94, 0xD8, 0xDB, 0x37, 0x67, 0xE7, 0x58, 0x53, 0x70, 0x6F, 0x17, 0xAE, 0x32, 0x02, 0x57, 0x19, 0x1D, 0x65, 0xF8, 0x0F, 0x22, 0x70, 0x92, 0x32, 0x74,
0x38, 0x84, 0x4B, 0x2E, 0x6A, 0x08, 0x16, 0x36, 0x20, 0x5E, 0xBD, 0xB8, 0x04, 0x88, 0xAF, 0xC0, 0xA7, 0x1F, 0xA3, 0xCF, 0x60, 0x85, 0xD5, 0x9C, 0x2E, 0x90, 0x56, 0xF4, 0x8C, 0x14, 0xC0, 0x43,
0x3F, 0x51, 0x50, 0x70, 0xE4, 0x8E, 0x38, 0x33, 0x21, 0x46, 0x99, 0x84, 0xEB, 0x37, 0x20, 0x9A, 0x23, 0x10, 0xEE, 0xD3, 0x28, 0xD6, 0x2B, 0x4E, 0x76, 0x80, 0xEA, 0xDB, 0x00, 0xF4, 0xDB, 0x6A,
0x9C, 0x2E, 0x30, 0xB1, 0xE5, 0x8A, 0x6F, 0x5F, 0xE6, 0x05, 0x20, 0xEA, 0x8D, 0x1F, 0xD0, 0xA0, 0xA9, 0xE2, 0xBC, 0x43, 0xDC, 0x75, 0xC9, 0xB9, 0x77, 0x6F, 0xCF, 0xCE, 0x31, 0xBB, 0xE0, 0xF0,
0x29, 0x0B, 0xB6, 0xFF, 0x80, 0xDA, 0x69, 0xBF, 0x39, 0x09, 0xF6, 0x0B, 0x91, 0x1D, 0xF0, 0x82, 0x08, 0xE7, 0x60, 0x69, 0x6A, 0x5D, 0x3E, 0xC0, 0x87, 0xBD, 0xF8, 0x0A, 0xAB, 0xBC, 0x02, 0x9B,
0x77, 0xC9, 0x58, 0x43, 0x21, 0x1F, 0x63, 0xF1, 0xFA, 0x12, 0x5F, 0x34, 0xAE, 0x5B, 0x3A, 0x56, 0x45, 0x41, 0xE8, 0x91, 0x62, 0xE2, 0x68, 0x86, 0x18, 0x45, 0x68, 0xAE, 0xDF, 0x00, 0xBB, 0xB2,
0x5B, 0xB7, 0xB7, 0x06, 0x26, 0x76, 0x40, 0x7A, 0x8C, 0xE3, 0x54, 0x33, 0xE2, 0x46, 0x33, 0x8C, 0xBD, 0x82, 0xDA, 0x2D, 0x57, 0xBC, 0xA8, 0x99, 0xA5, 0x85, 0x28, 0x4B, 0x9E, 0x4F, 0xFD, 0x86,
0x72, 0xC5, 0xAF, 0x3F, 0x6E, 0xE5, 0x47, 0xE8, 0x95, 0x3C, 0x52, 0x3A, 0x1C, 0x21, 0x4A, 0x5B, 0x4C, 0xE3, 0xFE, 0x03, 0x32, 0xAA, 0xFD, 0x2A, 0x26, 0x58, 0x22, 0xD8, 0x78, 0xC0, 0x32, 0xDE,
0x90, 0xCB, 0xC1, 0xF8, 0x83, 0x76, 0x1D, 0x6D, 0xD8, 0xB5, 0xDE, 0xF7, 0x23, 0x08, 0xFA, 0x75, 0xC5, 0x77, 0x0D, 0x19, 0x5F, 0xC3, 0x94, 0xF6, 0x25, 0xDE, 0x67, 0xAE, 0x5A, 0x3A, 0xE6, 0x60,
0xF2, 0x2C, 0xD6, 0x28, 0x9A, 0xAD, 0x86, 0x75, 0x28, 0xA8, 0x4B, 0xF0, 0x84, 0x80, 0xF9, 0x46, 0xB7, 0xB7, 0x06, 0x0F, 0xF6, 0x8A, 0x0A, 0xB6, 0xBD, 0xB1, 0xF1, 0x38, 0xE2, 0xCD, 0x8A, 0xCE,
0xC2, 0x56, 0x99, 0x7E, 0x5B, 0x5A, 0xEB, 0xEF, 0x61, 0x40, 0x9F, 0x45, 0x11, 0xCA, 0xB7, 0xD8, 0x71, 0x0D, 0x1B, 0x96, 0x47, 0x49, 0x8D, 0xA9, 0x3E, 0x0E, 0xBD, 0x47, 0x08, 0xA4, 0x3C, 0xDE,
0xEF, 0xB7, 0xB6, 0xF7, 0xFB, 0x8F, 0x8E, 0x8A, 0xA3, 0x88, 0xC6, 0x24, 0x4A, 0x70, 0x93, 0xA0, 0x3A, 0xEC, 0x5A, 0x0A, 0x25, 0x92, 0xCB, 0xC1, 0xF8, 0x83, 0x06, 0xA1, 0xBC, 0xA9, 0xB2, 0x71,
0xA4, 0x85, 0xBF, 0x38, 0x3A, 0xAC, 0x3E, 0x1E, 0x93, 0x3A, 0xE0, 0x3E, 0x11, 0x5E, 0x92, 0x06, 0xD0, 0xFB, 0xA2, 0x59, 0xEA, 0xFD, 0xED, 0x06, 0x9D, 0xB8, 0xBA, 0x33, 0xFD, 0xB6, 0x50, 0x78,
0xFA, 0x03, 0x42, 0x37, 0xDD, 0x3F, 0x54, 0x79, 0x2B, 0x24, 0xE7, 0xB2, 0x7C, 0xAD, 0x76, 0x48, 0x08, 0x78, 0xDE, 0xAC, 0x16, 0x63, 0x10, 0x12, 0x6E, 0x71, 0x0B, 0x4D, 0x40, 0xB6, 0xCB, 0xD8,
0xF0, 0xBD, 0xDA, 0x03, 0xAB, 0x14, 0x67, 0xAA, 0xBB, 0x27, 0x96, 0x1C, 0x29, 0x3C, 0xDE, 0x4D, 0x10, 0xAC, 0xB9, 0x14, 0x93, 0x23, 0x36, 0xD0, 0xC1, 0xD8, 0x5A, 0xA4, 0x16, 0x65, 0x45, 0xF1,
0xCE, 0x1B, 0xF2, 0xD2, 0x07, 0xF6, 0x07, 0x18, 0xF6, 0xCB, 0xF3, 0x12, 0x7C, 0x05, 0x16, 0xD2, 0xA8, 0x80, 0x05, 0xBB, 0x7B, 0xF7, 0x2B, 0xBA, 0xFA, 0xDC, 0x7A, 0xA0, 0x2C, 0x83, 0xFA, 0xD1,
0xD3, 0x97, 0x1F, 0x9E, 0xA8, 0x3B, 0x2F, 0x2F, 0x3F, 0xBC, 0xF9, 0x5A, 0x3F, 0xE0, 0xB5, 0xF6, 0xBC, 0x82, 0x8E, 0x14, 0x78, 0x09, 0xAE, 0xE1, 0x5F, 0x14, 0xFD, 0x61, 0x8D, 0x98, 0xA4, 0xA6,
0xC5, 0x11, 0x0A, 0x4A, 0x55, 0x9E, 0xD9, 0x80, 0x7B, 0x7F, 0x14, 0x0B, 0xF8, 0x9F, 0x82, 0x40, 0x60, 0x80, 0xBD, 0xAF, 0xE3, 0x88, 0xCD, 0xA1, 0x0B, 0x62, 0xBC, 0x9D, 0xFD, 0x08, 0x0E, 0x82,
0xAE, 0x57, 0x1C, 0x05, 0x1D, 0x04, 0xB4, 0x97, 0x21, 0x12, 0x4C, 0x49, 0xD5, 0x69, 0x1C, 0xB2, 0x94, 0xDD, 0x9D, 0xBF, 0xC7, 0x90, 0x21, 0xEF, 0xED, 0x7D, 0x1D, 0x44, 0x2B, 0x46, 0xF7, 0xF7,
0xF7, 0xA7, 0xF5, 0x03, 0xD1, 0x94, 0xF2, 0xF7, 0x8D, 0x78, 0xDC, 0x7D, 0x3A, 0x59, 0x04, 0x95, 0x9F, 0x51, 0x30, 0xA3, 0xBE, 0xE8, 0x2F, 0x76, 0xF5, 0x7B, 0xE0, 0xD3, 0x67, 0x61, 0x88, 0x0A,
0x40, 0x47, 0x3E, 0x42, 0xB2, 0xD4, 0xB5, 0xAC, 0xCF, 0x10, 0xD3, 0xF7, 0x1C, 0x3C, 0x6D, 0x9F, 0x93, 0x9F, 0xC4, 0x58, 0xDB, 0x27, 0x31, 0x4F, 0x9F, 0xE6, 0x47, 0x48, 0xF5, 0x49, 0x18, 0x63,
0x66, 0xDD, 0x15, 0x10, 0xC1, 0x19, 0x6D, 0xC4, 0xC4, 0x3C, 0xDC, 0x88, 0x5D, 0xA8, 0x4A, 0x78, 0x2D, 0xA6, 0xE0, 0x3B, 0xBF, 0xF0, 0x3B, 0x2C, 0x7F, 0xAD, 0x91, 0x2A, 0xF0, 0x79, 0x22, 0x5C,
0xCC, 0x9D, 0xD4, 0xFE, 0x90, 0x38, 0xB8, 0x4C, 0xC2, 0x40, 0x43, 0xE7, 0xC0, 0x1A, 0x2F, 0x3F, 0x11, 0xF5, 0xF5, 0x07, 0xC4, 0x47, 0x74, 0xFF, 0x50, 0xE5, 0x36, 0x4F, 0x26, 0x91, 0xF2, 0x3A,
0xFC, 0x93, 0xA6, 0x19, 0x2C, 0xF3, 0xFD, 0xBB, 0xD2, 0xFA, 0x7B, 0x92, 0x31, 0x51, 0x38, 0x2A, 0xF4, 0x90, 0xE0, 0x7D, 0xE8, 0x03, 0xAB, 0xE4, 0x67, 0xE1, 0xBB, 0x27, 0x16, 0x14, 0xC9, 0xDD,
0x8D, 0x1F, 0xE8, 0x58, 0x1C, 0x5C, 0x6F, 0xB6, 0x9E, 0x71, 0xEB, 0xC1, 0xD3, 0xB6, 0xCD, 0x9E, 0xCA, 0x4D, 0x46, 0x1B, 0xF2, 0xD2, 0x03, 0x51, 0xF5, 0x31, 0xB6, 0x2A, 0x4E, 0xB2, 0xF0, 0xEA,
0x5F, 0x55, 0xC2, 0x2B, 0x9D, 0xE5, 0x5B, 0x4C, 0x95, 0xE6, 0x67, 0x15, 0xDE, 0x3C, 0x05, 0x02, 0x32, 0xE4, 0x00, 0x2F, 0x3F, 0x3C, 0x51, 0x0B, 0x5C, 0x2F, 0x3F, 0xBC, 0xFD, 0x52, 0x3D, 0xE0,
0xAD, 0xFE, 0x21, 0xA9, 0xE6, 0xAF, 0x74, 0x55, 0xD4, 0xEC, 0x12, 0xDD, 0x64, 0x41, 0x98, 0x41, 0x1A, 0xF6, 0x39, 0x6B, 0x0A, 0x0A, 0x58, 0x9C, 0xAE, 0x81, 0x0F, 0x7D, 0x14, 0x09, 0xF8, 0x9F,
0xFE, 0x40, 0x9D, 0x7F, 0x52, 0x59, 0x14, 0x74, 0x45, 0x3D, 0x35, 0xB4, 0x0C, 0x35, 0x21, 0x50, 0xF0, 0x40, 0x40, 0x9D, 0x1F, 0xDA, 0x1D, 0x04, 0xB4, 0x97, 0x20, 0x12, 0x4C, 0xB1, 0xAB, 0x93,
0x07, 0xEA, 0xBA, 0x01, 0xF9, 0x5A, 0x86, 0xDE, 0x3F, 0xE0, 0x30, 0x0A, 0x2E, 0x00, 0x08, 0xE5, 0x28, 0x60, 0xEF, 0x4F, 0xAA, 0x07, 0x42, 0x16, 0xCA, 0xEF, 0x89, 0xF1, 0xE0, 0xE6, 0x78, 0xB2,
0x14, 0x72, 0x13, 0x42, 0x31, 0x4C, 0xD7, 0x37, 0x4F, 0x24, 0x37, 0x78, 0x56, 0x99, 0x58, 0x1D, 0xF0, 0x4B, 0xD1, 0x04, 0xF9, 0x08, 0x11, 0x69, 0xD7, 0xB2, 0x3E, 0x63, 0xF8, 0x0C, 0x3D, 0x8A,
0x0A, 0x6B, 0x9F, 0x81, 0x0A, 0xCD, 0xD3, 0x24, 0x4E, 0x56, 0x59, 0xBE, 0x7C, 0x85, 0xA9, 0x80, 0x22, 0xE9, 0x83, 0x3D, 0x67, 0x84, 0xDB, 0x07, 0x91, 0x77, 0x85, 0x21, 0x60, 0xEE, 0x37, 0x22,
0xC5, 0xBE, 0xF3, 0xCD, 0x1D, 0x28, 0x55, 0xA6, 0xEA, 0x98, 0xF0, 0xA0, 0x05, 0x1B, 0xDC, 0xEF, 0x91, 0x4C, 0x4D, 0x45, 0xF5, 0xAF, 0x14, 0x94, 0x64, 0x6E, 0x60, 0x7F, 0x20, 0x32, 0xF8, 0x1A,
0x09, 0x8C, 0xB6, 0x5D, 0x5D, 0xA9, 0x0D, 0x15, 0xA3, 0xDD, 0xBB, 0x33, 0xBB, 0xC1, 0xAF, 0xAA, 0x07, 0xBE, 0x86, 0x56, 0x96, 0xD5, 0x5F, 0x7E, 0xF8, 0x27, 0x4D, 0x52, 0x58, 0xE6, 0xFB, 0x77,
0x44, 0x11, 0xDD, 0x0D, 0xF5, 0xDF, 0x44, 0xB3, 0x3A, 0x01, 0x53, 0x31, 0x1A, 0x41, 0xE9, 0xB2, 0xA5, 0xF5, 0xF7, 0x38, 0x65, 0x22, 0x5D, 0x57, 0x1A, 0x3F, 0xD0, 0xB1, 0xB8, 0x81, 0xB0, 0xD9,
0x2B, 0x8B, 0xDB, 0xE2, 0x7B, 0x61, 0x03, 0xFA, 0x00, 0xE4, 0x53, 0x38, 0xB7, 0xDB, 0x8D, 0x6C, 0x7A, 0xC6, 0xD5, 0x09, 0x0F, 0x4A, 0x77, 0xF7, 0x9C, 0xBC, 0xDB, 0x6C, 0xFF, 0x55, 0x25, 0x48,
0x8E, 0xEE, 0xC9, 0xE6, 0x2A, 0x7C, 0xB8, 0xB9, 0x57, 0x5C, 0xA8, 0x17, 0x4D, 0xC3, 0xDD, 0x72, 0xA9, 0xB3, 0xB8, 0xA6, 0x56, 0x6A, 0x7E, 0x56, 0xA2, 0xD9, 0x31, 0x6C, 0xDC, 0xEA, 0x1F, 0x62,
0x78, 0x8A, 0x0E, 0xA4, 0x10, 0x78, 0x9D, 0xAC, 0xF1, 0x55, 0x66, 0x72, 0x5C, 0x30, 0x19, 0xDC, 0x7F, 0x76, 0x67, 0xAF, 0x24, 0x8F, 0x5F, 0xD1, 0x41, 0xE5, 0x1B, 0x36, 0xC8, 0x1B, 0x54, 0x8E,
0x0F, 0x1F, 0xD7, 0x98, 0x03, 0x97, 0x8F, 0x49, 0x73, 0x0D, 0x89, 0xC8, 0x47, 0xE2, 0xA7, 0xC1, 0x27, 0xA5, 0x45, 0x41, 0xA8, 0xD4, 0x83, 0x60, 0xF0, 0xD3, 0x10, 0x23, 0xA7, 0xE8, 0x5D, 0x7D,
0x2A, 0x8C, 0x13, 0xF2, 0x59, 0xEF, 0x3F, 0x64, 0xBE, 0xC8, 0xB0, 0xFA, 0xE4, 0xB8, 0xAA, 0x47, 0x3E, 0x32, 0xA7, 0x01, 0x0C, 0x54, 0x8E, 0x8F, 0x2D, 0x7D, 0xF3, 0xC4, 0x78, 0x83, 0x30, 0xE5,
0x15, 0x80, 0x7A, 0x63, 0x1C, 0xC6, 0x50, 0xDC, 0x9D, 0xF3, 0x13, 0x7D, 0x3F, 0x4D, 0xFD, 0xEB, 0xF3, 0xE3, 0x12, 0x6D, 0x0C, 0x72, 0x06, 0x62, 0x32, 0x4F, 0xE2, 0x28, 0x5E, 0xA5, 0xD9, 0x22,
0xF1, 0x6A, 0x3A, 0xA5, 0x50, 0x63, 0x94, 0xE4, 0x81, 0xC2, 0x01, 0xBB, 0x86, 0x6A, 0x46, 0xA4, 0x25, 0x02, 0xC1, 0x5A, 0xFB, 0x8E, 0x9B, 0x2D, 0x0C, 0x15, 0x51, 0x2D, 0x0D, 0x6E, 0xCC, 0x04,
0xF2, 0x99, 0x7C, 0x38, 0x23, 0xFA, 0xAE, 0x83, 0x72, 0xEB, 0xB6, 0x02, 0x84, 0x73, 0xA9, 0x02, 0xCC, 0x6D, 0xFB, 0x55, 0x70, 0xB4, 0xA4, 0x89, 0x7B, 0xAB, 0xDA, 0x1B, 0xBB, 0x2E, 0x53, 0x1F,
0x65, 0xD7, 0xE1, 0x7A, 0x45, 0x84, 0xE4, 0x7F, 0x39, 0x6C, 0x19, 0x9F, 0xBF, 0x7F, 0xCF, 0x28, 0xD1, 0xD9, 0x10, 0x61, 0x0B, 0xC2, 0x54, 0x1A, 0x42, 0x5A, 0xB7, 0x2B, 0xC2, 0x45, 0xFA, 0x18,
0xC3, 0x6A, 0x38, 0x59, 0xB1, 0xBA, 0x22, 0x1E, 0xC3, 0xA5, 0xAE, 0x5E, 0x5D, 0x8B, 0xE7, 0x00, 0x3B, 0xC3, 0x5C, 0x7D, 0x00, 0x74, 0xCC, 0x6D, 0xD2, 0xED, 0x46, 0xA4, 0x4B, 0xF7, 0x44, 0xBA,
0x07, 0x31, 0xC6, 0xF2, 0xAC, 0x32, 0x65, 0x01, 0x69, 0x9F, 0x3F, 0xAB, 0x22, 0x08, 0xEE, 0xF4, 0xA5, 0x9D, 0xDE, 0xDC, 0xCB, 0x9C, 0x57, 0xF3, 0xA6, 0xE1, 0x6E, 0x4A, 0x1E, 0xA3, 0xDE, 0xE7,
0x09, 0xA4, 0x7E, 0x60, 0xBA, 0x3E, 0x54, 0xBC, 0xB0, 0x64, 0x3C, 0xA1, 0x50, 0x02, 0x3E, 0x43, 0x4C, 0xA9, 0x92, 0x35, 0xDE, 0x1C, 0x27, 0x35, 0x95, 0x6B, 0x35, 0xC8, 0x54, 0x6B, 0x65, 0x2E,
0x3E, 0xFD, 0xC2, 0xF9, 0xA4, 0x97, 0x69, 0x20, 0x8E, 0xCA, 0x8F, 0xF9, 0xFB, 0xE0, 0xF1, 0x1D, 0xD7, 0x48, 0x63, 0x0D, 0x91, 0xD9, 0x47, 0xE2, 0x25, 0xFE, 0x2A, 0x88, 0x62, 0xF2, 0x59, 0xEF,
0xF4, 0x61, 0x22, 0x6B, 0x04, 0x4D, 0xCF, 0x77, 0x99, 0x4F, 0x9F, 0x13, 0x68, 0xFF, 0x68, 0x7D, 0x3F, 0x0A, 0x50, 0x09, 0x84, 0x5E, 0x1F, 0x07, 0x11, 0xE4, 0xBC, 0xE7, 0xFC, 0xEE, 0x84, 0x97,
0x86, 0xB6, 0xFC, 0x95, 0x03, 0xF6, 0xD1, 0xFE, 0x5C, 0xA5, 0xFB, 0xF4, 0x39, 0x14, 0x97, 0xB2, 0x24, 0xDE, 0xF5, 0x78, 0x35, 0x9D, 0x52, 0x48, 0xBD, 0x8A, 0x9D, 0x81, 0xB4, 0x00, 0xA5, 0x86,
0x1B, 0xBD, 0x8E, 0xF8, 0x53, 0x68, 0x65, 0xAE, 0xEC, 0x7B, 0xC2, 0xE7, 0x1E, 0x1D, 0x15, 0x01, 0x6A, 0x50, 0xA8, 0x92, 0x98, 0x7C, 0x38, 0x23, 0xFA, 0xAE, 0x4B, 0x07, 0xD6, 0x6D, 0x09, 0x08,
0xFB, 0x94, 0x69, 0x19, 0xA5, 0x8B, 0x4C, 0xBB, 0x4E, 0x56, 0x1A, 0xBE, 0x23, 0x25, 0x13, 0x11, 0x27, 0x50, 0x09, 0xCA, 0xCE, 0x8B, 0x0A, 0x25, 0xD0, 0xFF, 0xC3, 0x61, 0x4B, 0x8F, 0xFA, 0xFD,
0x6D, 0x0A, 0xF5, 0xA6, 0xE6, 0xC7, 0x09, 0xD8, 0x13, 0x64, 0xCC, 0x52, 0x4F, 0x0C, 0x1C, 0x96, 0x7B, 0x4A, 0x19, 0x1A, 0xBC, 0x78, 0xC5, 0xAA, 0x0A, 0x67, 0x0C, 0x97, 0xBA, 0x7A, 0x79, 0x2D,
0xF2, 0x71, 0x71, 0xB2, 0xD6, 0xD4, 0xBC, 0x85, 0x80, 0xAD, 0x29, 0xD9, 0x92, 0xFA, 0xEE, 0x12, 0x7E, 0xA9, 0xE1, 0x20, 0xC6, 0x98, 0xB5, 0x96, 0xA6, 0x64, 0xD7, 0x22, 0x36, 0x62, 0xDF, 0x27,
0xB2, 0x65, 0xAB, 0x44, 0xDE, 0x78, 0x29, 0x4B, 0x7B, 0x4A, 0xF4, 0xBB, 0xCB, 0xA0, 0xF5, 0xE3, 0xE0, 0xF5, 0x41, 0xF1, 0x3C, 0x2D, 0x88, 0x60, 0xC9, 0x68, 0x42, 0x21, 0x33, 0x7E, 0x86, 0x74,
0x8B, 0x20, 0x7C, 0xB5, 0xEA, 0x71, 0xF9, 0xA6, 0xB2, 0xE8, 0x23, 0xA6, 0xE3, 0x9B, 0x53, 0x87, 0xFA, 0x85, 0xD3, 0x49, 0x2F, 0x22, 0x61, 0x1C, 0x95, 0xDD, 0x7F, 0xE8, 0x43, 0x72, 0xEB, 0x1C,
0xEA, 0xA7, 0xBB, 0x66, 0x2A, 0xA1, 0xE9, 0x50, 0xCE, 0xF6, 0xF8, 0x74, 0x4F, 0xBC, 0x09, 0x76, 0x0D, 0xB3, 0xAB, 0x09, 0x20, 0xC6, 0x59, 0xF9, 0xFD, 0xE4, 0x39, 0x01, 0x23, 0xF3, 0xD1, 0xFA,
0xB0, 0xC4, 0xCB, 0x4B, 0xB6, 0x6A, 0x99, 0x67, 0xDC, 0x59, 0xC1, 0x11, 0xF0, 0x35, 0x0F, 0xAB, 0x0C, 0x6D, 0xD9, 0xF5, 0x0D, 0xF6, 0xD1, 0xFE, 0x5C, 0xDE, 0xF7, 0xC9, 0x73, 0x0D, 0x03, 0x0F,
0xDC, 0x44, 0xE1, 0x56, 0xCE, 0x7B, 0x40, 0xC1, 0x26, 0x82, 0x29, 0x90, 0xF2, 0x57, 0xA8, 0xD9, 0xDE, 0xAD, 0x83, 0x8A, 0x88, 0x3F, 0x3A, 0x57, 0xE6, 0xCA, 0xBE, 0x27, 0x7C, 0xEE, 0xD3, 0xA7,
0x38, 0x47, 0xEF, 0xAC, 0xDA, 0xB6, 0x24, 0xFC, 0xF8, 0x7A, 0x2D, 0x4F, 0xE4, 0x8A, 0x92, 0xED, 0xB9, 0x8B, 0x3D, 0x61, 0x5A, 0x4A, 0xE9, 0x22, 0xD5, 0xAE, 0xE3, 0x95, 0x86, 0xB7, 0xD1, 0x64,
0x6E, 0x5B, 0xB8, 0x6F, 0xA5, 0xB6, 0x85, 0xE5, 0x81, 0xB7, 0xFD, 0x0E, 0x80, 0xC9, 0xDF, 0xFB, 0xE8, 0xA0, 0x4D, 0x21, 0x0D, 0xD7, 0xBC, 0x28, 0x06, 0x65, 0x4A, 0x34, 0x70, 0x4C, 0x5C, 0x14,
0x7B, 0x9C, 0x31, 0x3C, 0xDE, 0x7E, 0x2B, 0x33, 0xF3, 0x77, 0x5D, 0x97, 0x57, 0xF7, 0xB4, 0xF8, 0x0D, 0x1C, 0x96, 0xF0, 0x71, 0x51, 0xBC, 0xD6, 0xD4, 0x48, 0x03, 0x15, 0xF3, 0xC5, 0xE9, 0xE9,
0xB2, 0xBE, 0xFC, 0x17, 0xF9, 0x87, 0xED, 0xE9, 0x0A, 0x8E, 0x03, 0xE1, 0x10, 0xF7, 0x17, 0xB2, 0xDB, 0xD3, 0x02, 0xDD, 0xED, 0x2B, 0x24, 0xEC, 0xA3, 0xF3, 0x79, 0xF3, 0x12, 0xC9, 0xD6, 0x66,
0xE8, 0x00, 0x89, 0xCD, 0x0F, 0x6D, 0x84, 0xD8, 0x8F, 0x8E, 0x88, 0x57, 0x7D, 0x54, 0x7B, 0xBF, 0x70, 0x50, 0x8D, 0x68, 0xD8, 0xD9, 0xC7, 0x0B, 0x14, 0xF6, 0x67, 0xDD, 0x28, 0xC5, 0x9F, 0x1B,
0x7F, 0x97, 0x65, 0xAF, 0x74, 0xBA, 0x53, 0x5E, 0xAE, 0x61, 0xDA, 0xE5, 0x40, 0xA4, 0xC8, 0x47, 0xE1, 0xA7, 0x37, 0xC6, 0xD3, 0x01, 0xCC, 0x46, 0x95, 0x08, 0xB4, 0x34, 0xE1, 0x06, 0xF3, 0xC7,
0xE9, 0xD5, 0x41, 0x13, 0x8C, 0x62, 0x11, 0xAF, 0x8C, 0x07, 0x3C, 0x9B, 0xC2, 0x35, 0x5D, 0x75, 0xD2, 0xAA, 0xC7, 0x55, 0x2F, 0xA4, 0x30, 0x4B, 0xDE, 0x5B, 0xD3, 0xA6, 0x3C, 0xD2, 0xA8, 0x82,
0xBC, 0xB0, 0x12, 0xEE, 0x0F, 0xEE, 0x34, 0x0A, 0x3C, 0x2E, 0xF6, 0x2C, 0x83, 0x0D, 0x21, 0x36, 0xFB, 0x2C, 0x0D, 0xAB, 0x11, 0x9D, 0x17, 0x33, 0x36, 0x37, 0xA2, 0x6F, 0xDD, 0x84, 0xD1, 0xFB,
0xF3, 0xBF, 0xE9, 0x00, 0x0E, 0xD7, 0x15, 0x45, 0x8E, 0x8F, 0x87, 0xF6, 0xDD, 0xCE, 0x4A, 0x88, 0xBB, 0x00, 0x42, 0x8C, 0x62, 0x80, 0xD1, 0x29, 0x72, 0x8C, 0xFF, 0x07, 0x69, 0xC2, 0x5E, 0xC3,
0x25, 0xBE, 0x8F, 0xB6, 0x95, 0x8A, 0xEB, 0xD9, 0x66, 0x6C, 0x78, 0xD6, 0x09, 0x26, 0x92, 0x13, 0xAB, 0xF7, 0x33, 0x31, 0x00, 0x97, 0x8D, 0x48, 0xA9, 0x86, 0x4F, 0xBD, 0x15, 0x88, 0x6A, 0xB0,
0xD0, 0xDB, 0xB4, 0x58, 0x9F, 0x61, 0xCE, 0x20, 0x53, 0xA1, 0x94, 0xA2, 0x3D, 0xE0, 0x5E, 0xA9, 0x55, 0x29, 0xDA, 0xB8, 0xEE, 0xA8, 0x1D, 0x13, 0xFD, 0xEE, 0x6A, 0xC0, 0xFA, 0xF1, 0xB5, 0x00,
0x61, 0x63, 0x9E, 0xC0, 0x49, 0xDE, 0xC5, 0x36, 0x2C, 0x67, 0xD5, 0xCE, 0x3B, 0xB7, 0x12, 0xCA, 0xBC, 0xB4, 0xF8, 0x38, 0xB2, 0x28, 0x8B, 0x3E, 0x62, 0x3A, 0xDE, 0x49, 0x3C, 0x54, 0x46, 0xB8,
0xE8, 0x88, 0x19, 0xE8, 0x7E, 0xFB, 0x2C, 0x5F, 0x75, 0xDD, 0x53, 0x70, 0x2A, 0x5B, 0x88, 0xF8, 0x6B, 0xA6, 0x12, 0x13, 0x1C, 0x8A, 0xAA, 0x1F, 0x1F, 0x90, 0x8B, 0x3B, 0x96, 0x07, 0x2B, 0x1D,
0xAA, 0xE4, 0xA3, 0x20, 0xF1, 0xA8, 0x30, 0xB8, 0x23, 0xE0, 0x46, 0xA5, 0xA3, 0x90, 0x3B, 0xC8, 0x59, 0xBE, 0x56, 0xAE, 0x76, 0x18, 0x77, 0x16, 0x32, 0x08, 0x78, 0x93, 0x87, 0x15, 0x30, 0x44,
0x20, 0xB8, 0xFD, 0xA3, 0x97, 0x5B, 0xA3, 0xF1, 0xD5, 0x45, 0x8E, 0xC4, 0xD3, 0xF7, 0x67, 0x2F, 0xFD, 0xA2, 0x98, 0xA7, 0xDF, 0xAA, 0x37, 0xCA, 0x8C, 0x07, 0x17, 0x31, 0x44, 0xD0, 0x03, 0xFB,
0xDE, 0xA9, 0xC5, 0x2E, 0x3A, 0x59, 0x40, 0x21, 0x66, 0xE0, 0x7C, 0x8F, 0xC9, 0xD1, 0xDB, 0x67, 0xDB, 0x51, 0xC7, 0xF8, 0x73, 0x0A, 0x18, 0x9C, 0xD6, 0x77, 0x96, 0x30, 0xB6, 0x78, 0x7F, 0xBF,
0x67, 0x67, 0x1F, 0xDE, 0xBC, 0x7B, 0xBE, 0x7B, 0x08, 0xC3, 0x21, 0x67, 0xEF, 0x7F, 0x79, 0x7D, 0xE2, 0xC5, 0x5D, 0xF5, 0x8A, 0x2C, 0xFE, 0xDE, 0x59, 0xB2, 0xB8, 0x5B, 0x7B, 0xEE, 0x6B, 0x82,
0x7A, 0x3E, 0xBC, 0xC6, 0x6D, 0xB9, 0x70, 0x57, 0x44, 0x08, 0xEF, 0xDE, 0x1A, 0x0E, 0xB7, 0xB6, 0xB6, 0xB0, 0x3F, 0x70, 0xF3, 0xF6, 0x00, 0x98, 0xEC, 0x0E, 0xEE, 0xE3, 0xD4, 0xE7, 0xF1, 0x1A,
0x86, 0x9F, 0x40, 0x9B, 0xAC, 0x0B, 0x78, 0x95, 0x10, 0x56, 0xAB, 0x84, 0xA2, 0x0C, 0xA8, 0xE4, 0x5F, 0x9A, 0x99, 0xDD, 0x3B, 0x5F, 0x5E, 0xDD, 0xD3, 0x46, 0x14, 0xF5, 0x95, 0x7F, 0x93, 0x45,
0x5B, 0x61, 0x51, 0x2A, 0xF4, 0xF3, 0x8A, 0x1F, 0x44, 0x1D, 0xAA, 0x65, 0x42, 0xCC, 0xC3, 0x50, 0xD9, 0x9E, 0xAE, 0xE0, 0x38, 0x10, 0x26, 0xF4, 0x7E, 0x85, 0x1C, 0x34, 0x9F, 0xC4, 0xE6, 0x27,
0x98, 0x97, 0x09, 0xEB, 0x30, 0x0E, 0x92, 0xF5, 0x0E, 0xC7, 0x9D, 0xCF, 0xBF, 0x1D, 0x9C, 0x34, 0x9F, 0x42, 0x04, 0x9E, 0x3E, 0x25, 0xCD, 0xF2, 0x57, 0xB5, 0xF7, 0xFB, 0xF7, 0xB2, 0xDB, 0x25,
0xE5, 0xFB, 0xAC, 0x27, 0x4D, 0xF9, 0x1A, 0x3D, 0xFF, 0x1F, 0x2E, 0xFE, 0x1F, 0xE4, 0x44, 0x87, 0x0E, 0xF8, 0xF6, 0xAC, 0x53, 0x2F, 0xFB, 0xBB, 0x09, 0x86, 0x3A, 0xC2, 0xE3, 0x0D, 0x78, 0xB4,
0x45, 0x77, 0x51, 0x00, 0x00 0x8D, 0x4B, 0xB9, 0xEA, 0x78, 0xA1, 0x40, 0xDC, 0x88, 0xDC, 0xA9, 0x2F, 0x78, 0xD9, 0xA2, 0x69,
0x19, 0x6C, 0x08, 0x01, 0x1C, 0xFF, 0x13, 0x2B, 0x20, 0x72, 0x55, 0x91, 0xEB, 0xA8, 0x36, 0xB4,
0xEF, 0xB6, 0x70, 0x82, 0x33, 0xD1, 0x7D, 0x04, 0xAE, 0x90, 0xDD, 0xA6, 0x6D, 0x46, 0x46, 0xD3,
0x3A, 0xC2, 0x54, 0x62, 0x02, 0xA2, 0x9B, 0xE4, 0xEB, 0x33, 0x0C, 0x2C, 0x37, 0x1C, 0x20, 0xC4,
0x84, 0x36, 0x06, 0x93, 0x7C, 0xCB, 0xE5, 0x22, 0xD9, 0x8E, 0xA6, 0x7D, 0x75, 0xB3, 0xC2, 0x8D,
0x62, 0x56, 0xB2, 0x5F, 0x2D, 0x8B, 0xDB, 0xE6, 0x7B, 0x6A, 0x07, 0x4A, 0xC9, 0x1D, 0x6F, 0x2B,
0x3F, 0x0A, 0x12, 0x77, 0x1F, 0x83, 0x3B, 0x3C, 0x73, 0x58, 0xD8, 0x07, 0x79, 0xE2, 0x02, 0xCC,
0xDA, 0x3F, 0x7A, 0xB9, 0x35, 0x1A, 0x2F, 0xFB, 0x72, 0x24, 0x8E, 0xDF, 0x9F, 0xBD, 0x38, 0x55,
0xEB, 0x16, 0x68, 0x73, 0x01, 0x85, 0x88, 0x81, 0x2D, 0xAE, 0x91, 0xA7, 0xEF, 0x9E, 0x9D, 0x9D,
0x7D, 0x78, 0x7B, 0xFA, 0x7C, 0xF7, 0x10, 0x86, 0x43, 0xCE, 0xDE, 0xFF, 0xF2, 0xFA, 0xE4, 0x7C,
0x78, 0x8D, 0xE5, 0xEB, 0x60, 0x87, 0x93, 0x18, 0x04, 0x77, 0x1F, 0xA5, 0x04, 0x5B, 0x47, 0x29,
0x4F, 0xA0, 0x4D, 0xE6, 0x8A, 0x3C, 0x73, 0x0C, 0xCA, 0x99, 0x63, 0x9E, 0x1A, 0x96, 0x62, 0xD7,
0x20, 0x4F, 0x1F, 0xFB, 0x59, 0xF1, 0x06, 0xD8, 0x1E, 0xA8, 0xA9, 0x63, 0xC4, 0x5D, 0x53, 0x90,
0xA5, 0x8E, 0xEB, 0x20, 0xF2, 0xE3, 0xF5, 0x0E, 0xDB, 0x9D, 0xCD, 0xBF, 0x1D, 0x1C, 0x35, 0xE4,
0x95, 0xF2, 0xA3, 0x86, 0xFC, 0x4B, 0x16, 0xFE, 0xFF, 0x3C, 0xFD, 0x5F, 0xA2, 0x56, 0x64, 0x29,
0xFA, 0x54, 0x00, 0x00
}; };
#endif //__embedded_h #endif //__embedded_h

View File

@ -36,11 +36,12 @@ void HTTP_Server::FSFileupload ()
//Guest cannot upload - only admin //Guest cannot upload - only admin
if (auth_level == LEVEL_GUEST) { if (auth_level == LEVEL_GUEST) {
_webserver->send (401, "text/plain", "Wrong authentication!"); _webserver->send (401, "text/plain", "Wrong authentication!");
return; pushError(ESP_ERROR_AUTHENTICATION, "Upload rejected");
_upload_status=UPLOAD_STATUS_FAILED;
} }
static String filename; static String filename;
static ESP_File fsUploadFile; static ESP_File fsUploadFile;
if (_upload_status != UPLOAD_STATUS_FAILED) {
HTTPUpload& upload = _webserver->upload(); HTTPUpload& upload = _webserver->upload();
//Upload start //Upload start
if(upload.status == UPLOAD_FILE_START) { if(upload.status == UPLOAD_FILE_START) {
@ -50,13 +51,24 @@ void HTTP_Server::FSFileupload ()
} else { } else {
filename = upload.filename; filename = upload.filename;
} }
//Sanity check
if (ESP_FileSystem::exists (filename.c_str()) ) { if (ESP_FileSystem::exists (filename.c_str()) ) {
ESP_FileSystem::remove (filename.c_str()); ESP_FileSystem::remove (filename.c_str());
} }
if (fsUploadFile.isOpen() ) { if (fsUploadFile.isOpen() ) {
fsUploadFile.close(); fsUploadFile.close();
} }
String sizeargname = upload.filename + "S";
if (_webserver->hasArg (sizeargname.c_str()) ) {
size_t freespace = ESP_FileSystem::totalBytes() - ESP_FileSystem::usedBytes();
size_t filesize = _webserver->arg (sizeargname.c_str()).toInt();
if (freespace < filesize ) {
_upload_status=UPLOAD_STATUS_FAILED;
_webserver->send (500, "text/plain", "Not enough space!");
pushError(ESP_ERROR_NOT_ENOUGH_SPACE, "Upload rejected");
}
}
if (_upload_status!=UPLOAD_STATUS_FAILED) {
//create file //create file
fsUploadFile = ESP_FileSystem::open(filename.c_str(), ESP_FILE_WRITE); fsUploadFile = ESP_FileSystem::open(filename.c_str(), ESP_FILE_WRITE);
//check If creation succeed //check If creation succeed
@ -65,27 +77,30 @@ void HTTP_Server::FSFileupload ()
_upload_status= UPLOAD_STATUS_ONGOING; _upload_status= UPLOAD_STATUS_ONGOING;
} else { } else {
//if no set cancel flag //if no set cancel flag
_upload_status=UPLOAD_STATUS_CANCELLED; _upload_status=UPLOAD_STATUS_FAILED;
_webserver->send (500, "text/plain", "Cannot create file!"); _webserver->send (500, "text/plain", "Cannot create file!");
_webserver->client().stop(); pushError(ESP_ERROR_FILE_CREATION, "File creation failed");
}
} }
//Upload write //Upload write
} else if(upload.status == UPLOAD_FILE_WRITE) { } else if(upload.status == UPLOAD_FILE_WRITE) {
//check if file is available and no error //check if file is available and no error
if(fsUploadFile && _upload_status == UPLOAD_STATUS_ONGOING) { if(fsUploadFile && _upload_status == UPLOAD_STATUS_ONGOING) {
//no error so write post date //no error so write post date
fsUploadFile.write(upload.buf, upload.currentSize); if(upload.currentSize != fsUploadFile.write(upload.buf, upload.currentSize)) {
} else { //we have a problem set flag UPLOAD_STATUS_FAILED
//we have a problem set flag UPLOAD_STATUS_CANCELLED _upload_status=UPLOAD_STATUS_FAILED;
_upload_status=UPLOAD_STATUS_CANCELLED;
fsUploadFile.close();
if (ESP_FileSystem::exists (filename.c_str())) {
ESP_FileSystem::remove (filename.c_str());
}
_webserver->send (500, "text/plain", "Cannot write file!"); _webserver->send (500, "text/plain", "Cannot write file!");
_webserver->client().stop(); pushError(ESP_ERROR_FILE_WRITE, "File write failed");
} }
//Upload end } else {
//we have a problem set flag UPLOAD_STATUS_FAILED
_upload_status=UPLOAD_STATUS_FAILED;
_webserver->send (500, "text/plain", "Cannot write file!");
pushError(ESP_ERROR_FILE_WRITE, "File write failed");
}
//Upload end
} else if(upload.status == UPLOAD_FILE_END) { } else if(upload.status == UPLOAD_FILE_END) {
//check if file is still open //check if file is still open
if(fsUploadFile) { if(fsUploadFile) {
@ -95,39 +110,42 @@ void HTTP_Server::FSFileupload ()
String sizeargname = upload.filename + "S"; String sizeargname = upload.filename + "S";
//fsUploadFile = ESP_FileSystem::open (filename, ESP_FILE_READ); //fsUploadFile = ESP_FileSystem::open (filename, ESP_FILE_READ);
uint32_t filesize = fsUploadFile.size(); uint32_t filesize = fsUploadFile.size();
//fsUploadFile.close(); _upload_status = UPLOAD_STATUS_SUCCESSFUL;
if (_webserver->hasArg (sizeargname.c_str()) ) { if (_webserver->hasArg (sizeargname.c_str()) ) {
if (_webserver->arg (sizeargname.c_str()) != String(filesize)) { if (_webserver->arg (sizeargname.c_str()) != String(filesize)) {
_upload_status = UPLOAD_STATUS_FAILED; _upload_status = UPLOAD_STATUS_FAILED;
ESP_FileSystem::remove (filename.c_str()); _webserver->send (500, "text/plain", "Upload error!");
pushError(ESP_ERROR_SIZE, "File upload failed");
} }
} }
if (_upload_status == UPLOAD_STATUS_ONGOING) { if (_upload_status == UPLOAD_STATUS_ONGOING) {
_upload_status = UPLOAD_STATUS_SUCCESSFUL; _upload_status = UPLOAD_STATUS_SUCCESSFUL;
} else {
_webserver->send (500, "text/plain", "Upload error!");
} }
} else { } else {
//we have a problem set flag UPLOAD_STATUS_CANCELLED //we have a problem set flag UPLOAD_STATUS_FAILED
_upload_status=UPLOAD_STATUS_CANCELLED; _upload_status=UPLOAD_STATUS_FAILED;
_webserver->client().stop();
if (ESP_FileSystem::exists (filename.c_str()) ) {
ESP_FileSystem::remove (filename.c_str());
}
_webserver->send (500, "text/plain", "Upload error!"); _webserver->send (500, "text/plain", "Upload error!");
pushError(ESP_ERROR_FILE_CLOSE, "File close failed");
} }
//Upload cancelled //Upload cancelled
} else { } else {
if (_upload_status == UPLOAD_STATUS_ONGOING) { if (_upload_status == UPLOAD_STATUS_ONGOING) {
_upload_status = UPLOAD_STATUS_CANCELLED; _upload_status = UPLOAD_STATUS_FAILED;
}
if(fsUploadFile) {
fsUploadFile.close();
}
if (ESP_FileSystem::exists (filename.c_str()) ) {
ESP_FileSystem::remove (filename.c_str());
} }
_webserver->send (500, "text/plain", "Upload error!"); _webserver->send (500, "text/plain", "Upload error!");
} }
}
if(_upload_status == UPLOAD_STATUS_FAILED) {
cancelUpload();
if(fsUploadFile) {
fsUploadFile.close();
}
if (auth_level != LEVEL_GUEST) {
if (ESP_FileSystem::exists (filename.c_str())) {
ESP_FileSystem::remove (filename.c_str());
}
}
}
} }
#endif //HTTP_FEATURE && FILESYSTEM_FEATURE #endif //HTTP_FEATURE && FILESYSTEM_FEATURE

View File

@ -40,10 +40,11 @@ void HTTP_Server::WebUpdateUpload ()
ESP3DOutput output(ESP_ALL_CLIENTS); ESP3DOutput output(ESP_ALL_CLIENTS);
//only admin can update FW //only admin can update FW
if (AuthenticationService::authenticated_level() != LEVEL_ADMIN) { if (AuthenticationService::authenticated_level() != LEVEL_ADMIN) {
_upload_status = UPLOAD_STATUS_CANCELLED; _upload_status = UPLOAD_STATUS_FAILED;
_webserver->send (401, "text/plain", "Wrong authentication!"); _webserver->send (401, "text/plain", "Wrong authentication!");
return; pushError(ESP_ERROR_AUTHENTICATION, "Upload rejected");
} }
if (_upload_status != UPLOAD_STATUS_FAILED) {
//get current file ID //get current file ID
HTTPUpload& upload = _webserver->upload(); HTTPUpload& upload = _webserver->upload();
//Upload start //Upload start
@ -57,24 +58,23 @@ void HTTP_Server::WebUpdateUpload ()
downloadsize = 0; downloadsize = 0;
} }
if (downloadsize > ESP_FileSystem::max_update_size()) { if (downloadsize > ESP_FileSystem::max_update_size()) {
_upload_status=UPLOAD_STATUS_CANCELLED; _upload_status=UPLOAD_STATUS_FAILED;
output.printERROR("Update oversized!");
_webserver->send (500, "text/plain", "Update oversized!"); _webserver->send (500, "text/plain", "Update oversized!");
return; pushError(ESP_ERROR_NOT_ENOUGH_SPACE, "Upload rejected");
} }
last_upload_update = 0; last_upload_update = 0;
if (_upload_status != UPLOAD_STATUS_FAILED) {
if(!Update.begin(UPDATE_SIZE)) { //start with unknown = max available size if(!Update.begin(UPDATE_SIZE)) { //start with unknown = max available size
_upload_status=UPLOAD_STATUS_CANCELLED; _upload_status=UPLOAD_STATUS_FAILED;
output.printERROR("Update canceled!"); output.printERROR("Update rejected!",500);
_webserver->send (500, "text/plain", "Update canceled!"); pushError(ESP_ERROR_NOT_ENOUGH_SPACE, "Upload rejected");
return;
} else { } else {
output.printMSG("Update 0%"); output.printMSG("Update 0%");
} }
}
//Upload write //Upload write
} else if(upload.status == UPLOAD_FILE_WRITE) { } else if(upload.status == UPLOAD_FILE_WRITE) {
//check if no error //check if no error
if (_upload_status == UPLOAD_STATUS_ONGOING) { if (_upload_status == UPLOAD_STATUS_ONGOING) {
//we do not know the total file size yet but we know the available space so let's use it //we do not know the total file size yet but we know the available space so let's use it
if (downloadsize != 0) { if (downloadsize != 0) {
@ -91,17 +91,16 @@ void HTTP_Server::WebUpdateUpload ()
} }
} }
if(Update.write(upload.buf, upload.currentSize) != upload.currentSize) { if(Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
_upload_status=UPLOAD_STATUS_CANCELLED; _upload_status=UPLOAD_STATUS_FAILED;
output.printERROR("Update write failed!"); output.printERROR("Update write failed!",500);
_webserver->send (500, "text/plain", "Update write failed!"); pushError(ESP_ERROR_FILE_WRITE, "File write failed");
return;
} }
} }
//Upload end //Upload end
} else if(upload.status == UPLOAD_FILE_END) { } else if(upload.status == UPLOAD_FILE_END) {
if ((downloadsize!=0) && (downloadsize < upload.totalSize)) { if ((downloadsize!=0) && (downloadsize < upload.totalSize)) {
_upload_status=UPLOAD_STATUS_CANCELLED; _upload_status=UPLOAD_STATUS_FAILED;
} }
if (_upload_status == UPLOAD_STATUS_ONGOING) { if (_upload_status == UPLOAD_STATUS_ONGOING) {
if(Update.end(true)) { //true to set the size to the current progress if(Update.end(true)) { //true to set the size to the current progress
@ -109,18 +108,23 @@ void HTTP_Server::WebUpdateUpload ()
output.printMSG("Update 100%"); output.printMSG("Update 100%");
_upload_status=UPLOAD_STATUS_SUCCESSFUL; _upload_status=UPLOAD_STATUS_SUCCESSFUL;
} else { } else {
output.printERROR("Update failed!"); output.printERROR("Update failed!",500);
_webserver->send (500, "text/plain", "Update failed!"); _upload_status=UPLOAD_STATUS_FAILED;
pushError(ESP_ERROR_FILE_CLOSE, "File close failed");
} }
} else { } else {
output.printERROR("Update failed!"); _upload_status=UPLOAD_STATUS_FAILED;
_webserver->send (500, "text/plain", "Update failed!"); output.printERROR("Update failed!", 500);
pushError(ESP_ERROR_FILE_CLOSE, "File close failed");
} }
} else if(upload.status == UPLOAD_FILE_ABORTED) { } else {
output.printERROR("Update failed!"); output.printERROR("Update failed!",500);
_webserver->send (500, "text/plain", "Update failed!"); _upload_status=UPLOAD_STATUS_FAILED;
}
}
if(_upload_status == UPLOAD_STATUS_FAILED) {
cancelUpload();
Update.end(); Update.end();
_upload_status=UPLOAD_STATUS_CANCELLED;
} }
} }
#endif //HTTP_FEATURE && WEB_UPDATE_FEATURE #endif //HTTP_FEATURE && WEB_UPDATE_FEATURE

View File

@ -32,6 +32,7 @@
#include "../authentication/authentication_service.h" #include "../authentication/authentication_service.h"
#include "../../core/settings_esp3d.h" #include "../../core/settings_esp3d.h"
#include "../filesystem/esp_filesystem.h" #include "../filesystem/esp_filesystem.h"
#include "../websocket/websocket_server.h"
bool HTTP_Server::_started = false; bool HTTP_Server::_started = false;
uint16_t HTTP_Server::_port = 0; uint16_t HTTP_Server::_port = 0;
@ -112,6 +113,35 @@ bool HTTP_Server::StreamFSFile(const char* filename, const char * contentType)
return true; return true;
} }
void HTTP_Server::pushError(int code, const char * st)
{
if (websocket_terminal_server.started() && st) {
String s = "ERROR:" + String(code) + ":";
s+=st;
websocket_terminal_server.pushMSG(websocket_terminal_server.get_currentID(), s.c_str());
uint32_t t = millis();
while (millis() - t < 1000) {
websocket_terminal_server.handle();
Hal::wait(10);
}
}
}
void HTTP_Server::cancelUpload()
{
HTTPUpload& upload = _webserver->upload();
upload.status = UPLOAD_FILE_ABORTED;
#if defined ( ARDUINO_ARCH_ESP8266)
_webserver->client().stopAll();
#else
//errno = 128;
_webserver->client().stop();
#endif
Hal::wait(100);
}
bool HTTP_Server::begin() bool HTTP_Server::begin()
{ {
bool no_error = true; bool no_error = true;

View File

@ -59,6 +59,8 @@ public:
return _port; return _port;
} }
private: private:
static void pushError(int code, const char * st);
static void cancelUpload();
static bool _started; static bool _started;
static WEBSERVER * _webserver; static WEBSERVER * _webserver;
static uint16_t _port; static uint16_t _port;

View File

@ -113,6 +113,30 @@ bool NetConfig::isHostnameValid (const char * hostname)
return true; return true;
} }
/**
* Get IP string what ever is enabled
*/
String NetConfig::localIP()
{
static String currentIP = "";
#if defined( WIFI_FEATURE)
if (WiFi.getMode() == WIFI_STA) {
currentIP = WiFi.localIP().toString();
} else if (WiFi.getMode() == WIFI_AP) {
currentIP = WiFi.softAPIP().toString();
}
#endif //WIFI_FEATURE
#if defined (ETH_FEATURE)
if (EthConfig::started()) {
currentIP = ETH.localIP().toString();
}
#endif //ETH_FEATURE
if (currentIP.length() == 0) {
currentIP = "0.0.0.0";
}
return currentIP;
}
/** /**
* Check if IP string is valid * Check if IP string is valid
*/ */

View File

@ -73,6 +73,7 @@ public:
{ {
return _started; return _started;
} }
static String localIP();
private : private :
static String _hostname; static String _hostname;
static void onWiFiEvent(WiFiEvent_t event); static void onWiFiEvent(WiFiEvent_t event);

View File

@ -87,7 +87,9 @@ bool NetServices::begin()
#ifdef TIMESTAMP_FEATURE #ifdef TIMESTAMP_FEATURE
if (WiFi.getMode() != WIFI_AP) { if (WiFi.getMode() != WIFI_AP) {
if(!timeserver.begin()) { if(!timeserver.begin()) {
if(timeserver.is_internet_time()) {
output.printERROR("Failed contact time servers!"); output.printERROR("Failed contact time servers!");
}
} else { } else {
String tmp = "Time set :"; String tmp = "Time set :";
tmp+=timeserver.current_time(); tmp+=timeserver.current_time();

View File

@ -30,22 +30,34 @@
#if defined (BLUETOOTH_FEATURE) #if defined (BLUETOOTH_FEATURE)
#include "../bluetooth/BT_service.h" #include "../bluetooth/BT_service.h"
#endif //BLUETOOTH_FEATURE #endif //BLUETOOTH_FEATURE
#if defined (ETH_FEATURE)
#include "../ethernet/ethconfig.h"
#endif //ETH_FEATURE
TimeServer timeserver; TimeServer timeserver;
TimeServer::TimeServer() TimeServer::TimeServer()
{ {
_started = false; _started = false;
_is_internet_time = false;
} }
TimeServer::~TimeServer() TimeServer::~TimeServer()
{ {
end(); end();
} }
bool TimeServer::is_internet_time(bool readfromsettings)
{
if (readfromsettings) {
_is_internet_time = (Settings_ESP3D::read_byte (ESP_INTERNET_TIME) == 0);
}
return _is_internet_time;
}
bool TimeServer::begin() bool TimeServer::begin()
{ {
bool res = true; bool res = true;
_started = false; end();
String s1, s2, s3; String s1, s2, s3;
int8_t t1; int8_t t1;
byte d1; byte d1;
@ -61,9 +73,7 @@ bool TimeServer::begin()
return false; return false;
} }
#endif //BLUETOOTH_FEATURE #endif //BLUETOOTH_FEATURE
#if defined (ETH_FEATURE)
#include "../ethernet/ethconfig.h"
#endif //ETH_FEATURE
#if defined (ETH_FEATURE) #if defined (ETH_FEATURE)
if (!EthConfig::started()) { if (!EthConfig::started()) {
#if defined (WIFI_FEATURE) #if defined (WIFI_FEATURE)
@ -77,6 +87,9 @@ bool TimeServer::begin()
#endif //WIFI_FEATURE #endif //WIFI_FEATURE
} }
#endif //ETH_FEATURE #endif //ETH_FEATURE
if (!is_internet_time()) {
return false;
}
s1 = Settings_ESP3D::read_string (ESP_TIME_SERVER1); s1 = Settings_ESP3D::read_string (ESP_TIME_SERVER1);
s2 = Settings_ESP3D::read_string (ESP_TIME_SERVER2); s2 = Settings_ESP3D::read_string (ESP_TIME_SERVER2);
s3 = Settings_ESP3D::read_string (ESP_TIME_SERVER3); s3 = Settings_ESP3D::read_string (ESP_TIME_SERVER3);
@ -140,6 +153,9 @@ bool TimeServer::setTime(const char* stime)
struct tm tmstruct; struct tm tmstruct;
struct timeval time_val = {0, 0}; struct timeval time_val = {0, 0};
int pos2; int pos2;
//make uniform separators
stmp.replace("#","-");
stmp.replace(":","-");
//Search Year //Search Year
int pos = stmp.indexOf("-"); int pos = stmp.indexOf("-");
if (pos == -1) { if (pos == -1) {
@ -163,7 +179,7 @@ bool TimeServer::setTime(const char* stime)
pos2=pos; pos2=pos;
tmstruct.tm_mon = substmp.toInt() - 1; tmstruct.tm_mon = substmp.toInt() - 1;
//Search day //Search day
pos = stmp.indexOf("#",pos2+1); pos = stmp.indexOf("-",pos2+1);
if (pos == -1) { if (pos == -1) {
return false; return false;
} }
@ -175,7 +191,7 @@ bool TimeServer::setTime(const char* stime)
tmstruct.tm_mday = substmp.toInt(); tmstruct.tm_mday = substmp.toInt();
//Search hour //Search hour
pos = stmp.indexOf(":", pos2+1); pos = stmp.indexOf("-", pos2+1);
if (pos == -1) { if (pos == -1) {
return false; return false;
} }
@ -188,7 +204,7 @@ bool TimeServer::setTime(const char* stime)
tmstruct.tm_hour = substmp.toInt(); tmstruct.tm_hour = substmp.toInt();
//Search min //Search min
pos = stmp.indexOf(":", pos2+1); pos = stmp.indexOf("-", pos2+1);
if (pos == -1) { if (pos == -1) {
return false; return false;
} }
@ -202,6 +218,9 @@ bool TimeServer::setTime(const char* stime)
if ((substmp.toInt() > 59) || (substmp.toInt() < 0 )) { if ((substmp.toInt() > 59) || (substmp.toInt() < 0 )) {
return false; return false;
} }
tmstruct.tm_isdst = 0; //ignore dst
//reset servers, time zone and dst
configTime (0, 0,"", "", "");
tmstruct.tm_sec = substmp.toInt(); tmstruct.tm_sec = substmp.toInt();
time_val.tv_sec = mktime (&tmstruct); time_val.tv_sec = mktime (&tmstruct);
if(settimeofday(&time_val,0) == -1) { if(settimeofday(&time_val,0) == -1) {
@ -218,10 +237,8 @@ bool TimeServer::started()
//currently not used //currently not used
void TimeServer::end() void TimeServer::end()
{ {
if(!_started) {
return;
}
_started = false; _started = false;
_is_internet_time = false;
} }
//currently not used //currently not used

View File

@ -35,8 +35,10 @@ public:
const char * current_time(); const char * current_time();
bool setTime(const char* stime); bool setTime(const char* stime);
bool started(); bool started();
bool is_internet_time(bool readfromsettings = false);
private: private:
bool _started; bool _started;
bool _is_internet_time;
}; };
extern TimeServer timeserver; extern TimeServer timeserver;