diff --git a/src/rcommand.cpp b/src/rcommand.cpp index fa061f9f..6b446f78 100644 --- a/src/rcommand.cpp +++ b/src/rcommand.cpp @@ -1,6 +1,7 @@ // remote command interpreter -// parses multiple number of command / value pairs from LoRaWAN remote command port (RCMDPORT) -// checks commands and executes each command with 1 argument per command +// parses multiple number of command / value pairs from LoRaWAN remote command +// port (RCMDPORT) checks commands and executes each command with 1 argument per +// command // Basic Config #include "globals.h" @@ -14,297 +15,351 @@ static const char TAG[] = "main"; // table of remote commands and assigned functions typedef struct { - const uint8_t nam; - void (*func)(uint8_t); - const bool store; + const uint8_t nam; + void (*func)(uint8_t); + const bool store; } cmd_t; // function defined in antenna.cpp #ifdef HAS_ANTENNA_SWITCH - void antenna_select(const uint8_t _ant); +void antenna_select(const uint8_t _ant); #endif // function defined in adcread.cpp #ifdef HAS_BATTERY_PROBE - uint32_t read_voltage(void); +uint32_t read_voltage(void); #endif // function sends result of get commands to LoRaWAN network -void do_transmit(osjob_t* j){ - // check if there is a pending TX/RX job running, if yes then reschedule transmission - if (LMIC.opmode & OP_TXRXPEND) { - ESP_LOGI(TAG, "LoRa busy, rescheduling"); - sprintf(display_lmic, "LORA BUSY"); - os_setTimedCallback(&rcmdjob, os_getTime()+sec2osticks(RETRANSMIT_RCMD), do_transmit); - } - LMIC_setTxData2(RCMDPORT, rcmd_data, rcmd_data_size, 0); // send data unconfirmed on RCMD Port - ESP_LOGI(TAG, "%d bytes queued to send", rcmd_data_size); - sprintf(display_lmic, "PACKET QUEUED"); +void do_transmit(osjob_t *j) { + // check if there is a pending TX/RX job running, if yes then reschedule + // transmission + if (LMIC.opmode & OP_TXRXPEND) { + ESP_LOGI(TAG, "LoRa busy, rescheduling"); + sprintf(display_lmic, "LORA BUSY"); + os_setTimedCallback(&rcmdjob, os_getTime() + sec2osticks(RETRANSMIT_RCMD), + do_transmit); + } + LMIC_setTxData2(RCMDPORT, rcmd_data, rcmd_data_size, + 0); // send data unconfirmed on RCMD Port + ESP_LOGI(TAG, "%d bytes queued to send", rcmd_data_size); + sprintf(display_lmic, "PACKET QUEUED"); } -// help function to transmit result of get commands, since callback function do_transmit() cannot have params -void transmit(xref2u1_t mydata, u1_t mydata_size){ - rcmd_data = mydata; - rcmd_data_size = mydata_size; - do_transmit(&rcmdjob); +// help function to transmit result of get commands, since callback function +// do_transmit() cannot have params +void transmit(xref2u1_t mydata, u1_t mydata_size) { + rcmd_data = mydata; + rcmd_data_size = mydata_size; + do_transmit(&rcmdjob); } // help function to assign LoRa datarates to numeric spreadfactor values -void switch_lora (uint8_t sf, uint8_t tx) { - if ( tx > 20 ) return; - cfg.txpower = tx; - switch (sf) { - case 7: LMIC_setDrTxpow(DR_SF7,tx); cfg.lorasf=sf; break; - case 8: LMIC_setDrTxpow(DR_SF8,tx); cfg.lorasf=sf; break; - case 9: LMIC_setDrTxpow(DR_SF9,tx); cfg.lorasf=sf; break; - case 10: LMIC_setDrTxpow(DR_SF10,tx); cfg.lorasf=sf; break; - case 11: - #if defined(CFG_eu868) - LMIC_setDrTxpow(DR_SF11,tx); cfg.lorasf=sf; break; - #elif defined(CFG_us915) - LMIC_setDrTxpow(DR_SF11CR,tx); cfg.lorasf=sf; break; - #endif - case 12: - #if defined(CFG_eu868) - LMIC_setDrTxpow(DR_SF12,tx); cfg.lorasf=sf; break; - #elif defined(CFG_us915) - LMIC_setDrTxpow(DR_SF12CR,tx); cfg.lorasf=sf; break; - #endif - default: break; - } +void switch_lora(uint8_t sf, uint8_t tx) { + if (tx > 20) + return; + cfg.txpower = tx; + switch (sf) { + case 7: + LMIC_setDrTxpow(DR_SF7, tx); + cfg.lorasf = sf; + break; + case 8: + LMIC_setDrTxpow(DR_SF8, tx); + cfg.lorasf = sf; + break; + case 9: + LMIC_setDrTxpow(DR_SF9, tx); + cfg.lorasf = sf; + break; + case 10: + LMIC_setDrTxpow(DR_SF10, tx); + cfg.lorasf = sf; + break; + case 11: +#if defined(CFG_eu868) + LMIC_setDrTxpow(DR_SF11, tx); + cfg.lorasf = sf; + break; +#elif defined(CFG_us915) + LMIC_setDrTxpow(DR_SF11CR, tx); + cfg.lorasf = sf; + break; +#endif + case 12: +#if defined(CFG_eu868) + LMIC_setDrTxpow(DR_SF12, tx); + cfg.lorasf = sf; + break; +#elif defined(CFG_us915) + LMIC_setDrTxpow(DR_SF12CR, tx); + cfg.lorasf = sf; + break; +#endif + default: + break; + } } // set of functions that can be triggered by remote commands void set_reset(uint8_t val) { - switch (val) { - case 0: // restart device - ESP_LOGI(TAG, "Remote command: restart device"); - sprintf(display_lora, "Reset pending"); - vTaskDelay(10000/portTICK_PERIOD_MS); // wait for LMIC to confirm LoRa downlink to server - esp_restart(); - break; - case 1: // reset MAC counter - ESP_LOGI(TAG, "Remote command: reset MAC counter"); - reset_counters(); // clear macs - reset_salt(); // get new salt - sprintf(display_lora, "Reset counter"); - break; - case 2: // reset device to factory settings - ESP_LOGI(TAG, "Remote command: reset device to factory settings"); - sprintf(display_lora, "Factory reset"); - eraseConfig(); - break; - } + switch (val) { + case 0: // restart device + ESP_LOGI(TAG, "Remote command: restart device"); + sprintf(display_lora, "Reset pending"); + vTaskDelay( + 10000 / + portTICK_PERIOD_MS); // wait for LMIC to confirm LoRa downlink to server + esp_restart(); + break; + case 1: // reset MAC counter + ESP_LOGI(TAG, "Remote command: reset MAC counter"); + reset_counters(); // clear macs + reset_salt(); // get new salt + sprintf(display_lora, "Reset counter"); + break; + case 2: // reset device to factory settings + ESP_LOGI(TAG, "Remote command: reset device to factory settings"); + sprintf(display_lora, "Factory reset"); + eraseConfig(); + break; + } }; void set_rssi(uint8_t val) { - cfg.rssilimit = val * -1; - ESP_LOGI(TAG, "Remote command: set RSSI limit to %d", cfg.rssilimit); -}; + cfg.rssilimit = val * -1; + ESP_LOGI(TAG, "Remote command: set RSSI limit to %d", cfg.rssilimit); +}; void set_sendcycle(uint8_t val) { - cfg.sendcycle = val; - ESP_LOGI(TAG, "Remote command: set payload send cycle to %d seconds", cfg.sendcycle*2); -}; + cfg.sendcycle = val; + ESP_LOGI(TAG, "Remote command: set payload send cycle to %d seconds", + cfg.sendcycle * 2); +}; void set_wifichancycle(uint8_t val) { - cfg.wifichancycle = val; - // modify wifi channel rotation IRQ - timerAlarmWrite(channelSwitch, cfg.wifichancycle * 10000, true); // reload interrupt after each trigger of channel switch cycle - ESP_LOGI(TAG, "Remote command: set Wifi channel switch interval to %.1f seconds", cfg.wifichancycle/float(100)); -}; + cfg.wifichancycle = val; + // modify wifi channel rotation IRQ + timerAlarmWrite( + channelSwitch, cfg.wifichancycle * 10000, + true); // reload interrupt after each trigger of channel switch cycle + ESP_LOGI(TAG, + "Remote command: set Wifi channel switch interval to %.1f seconds", + cfg.wifichancycle / float(100)); +}; void set_blescantime(uint8_t val) { - cfg.blescantime = val; - ESP_LOGI(TAG, "Remote command: set BLE scan time to %.1f seconds", cfg.blescantime/float(100)); - #ifdef BLECOUNTER - // stop & restart BLE scan task to apply new parameter - if (cfg.blescan) - { - stop_BLEscan(); - start_BLEscan(); - } - #endif + cfg.blescantime = val; + ESP_LOGI(TAG, "Remote command: set BLE scan time to %.1f seconds", + cfg.blescantime / float(100)); +#ifdef BLECOUNTER + // stop & restart BLE scan task to apply new parameter + if (cfg.blescan) { + stop_BLEscan(); + start_BLEscan(); + } +#endif }; void set_countmode(uint8_t val) { - switch (val) { - case 0: // cyclic unconfirmed - cfg.countermode = 0; - ESP_LOGI(TAG, "Remote command: set counter mode to cyclic unconfirmed"); - break; - case 1: // cumulative - cfg.countermode = 1; - ESP_LOGI(TAG, "Remote command: set counter mode to cumulative"); - break; - default: // cyclic confirmed - cfg.countermode = 2; - ESP_LOGI(TAG, "Remote command: set counter mode to cyclic confirmed"); - break; - } + switch (val) { + case 0: // cyclic unconfirmed + cfg.countermode = 0; + ESP_LOGI(TAG, "Remote command: set counter mode to cyclic unconfirmed"); + break; + case 1: // cumulative + cfg.countermode = 1; + ESP_LOGI(TAG, "Remote command: set counter mode to cumulative"); + break; + default: // cyclic confirmed + cfg.countermode = 2; + ESP_LOGI(TAG, "Remote command: set counter mode to cyclic confirmed"); + break; + } }; void set_screensaver(uint8_t val) { - ESP_LOGI(TAG, "Remote command: set screen saver to %s ", val ? "on" : "off"); - switch (val) { - case 1: cfg.screensaver = val; break; - default: cfg.screensaver = 0; break; - } + ESP_LOGI(TAG, "Remote command: set screen saver to %s ", val ? "on" : "off"); + switch (val) { + case 1: + cfg.screensaver = val; + break; + default: + cfg.screensaver = 0; + break; + } }; void set_display(uint8_t val) { - ESP_LOGI(TAG, "Remote command: set screen to %s", val ? "on" : "off"); - switch (val) { - case 1: cfg.screenon = val; break; - default: cfg.screenon = 0; break; - } + ESP_LOGI(TAG, "Remote command: set screen to %s", val ? "on" : "off"); + switch (val) { + case 1: + cfg.screenon = val; + break; + default: + cfg.screenon = 0; + break; + } }; void set_gps(uint8_t val) { - ESP_LOGI(TAG, "Remote command: set GPS to %s", val ? "on" : "off"); - switch (val) { - case 1: cfg.gpsmode = val; break; - default: cfg.gpsmode = 0; break; - } + ESP_LOGI(TAG, "Remote command: set GPS to %s", val ? "on" : "off"); + switch (val) { + case 1: + cfg.gpsmode = val; + break; + default: + cfg.gpsmode = 0; + break; + } }; void set_lorasf(uint8_t val) { - ESP_LOGI(TAG, "Remote command: set LoRa SF to %d", val); - switch_lora(val, cfg.txpower); + ESP_LOGI(TAG, "Remote command: set LoRa SF to %d", val); + switch_lora(val, cfg.txpower); }; void set_loraadr(uint8_t val) { - ESP_LOGI(TAG, "Remote command: set LoRa ADR mode to %s", val ? "on" : "off"); - switch (val) { - case 1: cfg.adrmode = val; break; - default: cfg.adrmode = 0; break; - } - LMIC_setAdrMode(cfg.adrmode); + ESP_LOGI(TAG, "Remote command: set LoRa ADR mode to %s", val ? "on" : "off"); + switch (val) { + case 1: + cfg.adrmode = val; + break; + default: + cfg.adrmode = 0; + break; + } + LMIC_setAdrMode(cfg.adrmode); }; void set_blescan(uint8_t val) { - ESP_LOGI(TAG, "Remote command: set BLE scanner to %s", val ? "on" : "off"); - switch (val) { - case 0: - cfg.blescan = 0; - macs_ble = 0; // clear BLE counter - #ifdef BLECOUNTER - stop_BLEscan(); - #endif - break; - default: - cfg.blescan = 1; - #ifdef BLECOUNTER - start_BLEscan(); - #endif - break; - } + ESP_LOGI(TAG, "Remote command: set BLE scanner to %s", val ? "on" : "off"); + switch (val) { + case 0: + cfg.blescan = 0; + macs_ble = 0; // clear BLE counter +#ifdef BLECOUNTER + stop_BLEscan(); +#endif + break; + default: + cfg.blescan = 1; +#ifdef BLECOUNTER + start_BLEscan(); +#endif + break; + } }; void set_wifiant(uint8_t val) { - ESP_LOGI(TAG, "Remote command: set Wifi antenna to %s", val ? "external" : "internal"); - switch (val) { - case 1: cfg.wifiant = val; break; - default: cfg.wifiant = 0; break; - } - #ifdef HAS_ANTENNA_SWITCH - antenna_select(cfg.wifiant); - #endif + ESP_LOGI(TAG, "Remote command: set Wifi antenna to %s", + val ? "external" : "internal"); + switch (val) { + case 1: + cfg.wifiant = val; + break; + default: + cfg.wifiant = 0; + break; + } +#ifdef HAS_ANTENNA_SWITCH + antenna_select(cfg.wifiant); +#endif }; void set_vendorfilter(uint8_t val) { - ESP_LOGI(TAG, "Remote command: set vendorfilter mode to %s", val ? "on" : "off"); - switch (val) { - case 1: cfg.vendorfilter = val; break; - default: cfg.vendorfilter = 0; break; - } + ESP_LOGI(TAG, "Remote command: set vendorfilter mode to %s", + val ? "on" : "off"); + switch (val) { + case 1: + cfg.vendorfilter = val; + break; + default: + cfg.vendorfilter = 0; + break; + } }; void set_rgblum(uint8_t val) { - // Avoid wrong parameters - cfg.rgblum = (val>=0 && val<=100) ? (uint8_t) val : RGBLUMINOSITY; - ESP_LOGI(TAG, "Remote command: set RGB Led luminosity %d", cfg.rgblum); + // Avoid wrong parameters + cfg.rgblum = (val >= 0 && val <= 100) ? (uint8_t)val : RGBLUMINOSITY; + ESP_LOGI(TAG, "Remote command: set RGB Led luminosity %d", cfg.rgblum); }; void set_lorapower(uint8_t val) { - ESP_LOGI(TAG, "Remote command: set LoRa TXPOWER to %d", val); - switch_lora(cfg.lorasf, val); + ESP_LOGI(TAG, "Remote command: set LoRa TXPOWER to %d", val); + switch_lora(cfg.lorasf, val); }; -void get_config (uint8_t val) { - ESP_LOGI(TAG, "Remote command: get configuration"); - transmit((byte*)&cfg, sizeof(cfg)); +void get_config(uint8_t val) { + ESP_LOGI(TAG, "Remote command: get configuration"); + transmit((byte *)&cfg, sizeof(cfg)); }; -void get_uptime (uint8_t val) { - ESP_LOGI(TAG, "Remote command: get uptime"); - transmit((byte*)&uptimecounter, sizeof(uptimecounter)); +void get_uptime(uint8_t val) { + ESP_LOGI(TAG, "Remote command: get uptime"); + transmit((byte *)&uptimecounter, sizeof(uptimecounter)); }; -void get_cputemp (uint8_t val) { - ESP_LOGI(TAG, "Remote command: get cpu temperature"); - float temp = temperatureRead(); - transmit((byte*)&temp, sizeof(temp)); +void get_cputemp(uint8_t val) { + ESP_LOGI(TAG, "Remote command: get cpu temperature"); + float temp = temperatureRead(); + transmit((byte *)&temp, sizeof(temp)); }; -void get_voltage (uint8_t val) { - ESP_LOGI(TAG, "Remote command: get battery voltage"); - #ifdef HAS_BATTERY_PROBE - uint16_t voltage = read_voltage(); - #else - uint16_t voltage = 0; - #endif - transmit((byte*)&voltage, sizeof(voltage)); +void get_voltage(uint8_t val) { + ESP_LOGI(TAG, "Remote command: get battery voltage"); +#ifdef HAS_BATTERY_PROBE + uint16_t voltage = read_voltage(); +#else + uint16_t voltage = 0; +#endif + transmit((byte *)&voltage, sizeof(voltage)); }; -void get_gps (uint8_t val) { - ESP_LOGI(TAG, "Remote command: get gps status"); - #ifdef HAS_GPS - gps_read(); - transmit((byte*)&gps_status, sizeof(gps_status)); - ESP_LOGI(TAG, "lat=%f / lon=%f | Sats=%u | HDOP=%u | Alti=%u", gps_status.latitude / 1000000, gps_status.longitude / 1000000, gps_status.satellites, gps_status.hdop, gps_status.altitude); - #else - ESP_LOGE(TAG, "GPS not present"); - #endif +void get_gps(uint8_t val) { + ESP_LOGI(TAG, "Remote command: get gps status"); +#ifdef HAS_GPS + gps_read(); + transmit((byte *)&gps_status, sizeof(gps_status)); + ESP_LOGI(TAG, "lat=%f / lon=%f | Sats=%u | HDOP=%u | Alti=%u", + gps_status.latitude / 1000000, gps_status.longitude / 1000000, + gps_status.satellites, gps_status.hdop, gps_status.altitude); +#else + ESP_LOGE(TAG, "GPS not present"); +#endif }; // assign previously defined functions to set of numeric remote commands // format: opcode, function, flag (1 = do make settings persistent / 0 = don't) -// -cmd_t table[] = { - {0x01, set_rssi, true}, - {0x02, set_countmode, true}, - {0x03, set_gps, true}, - {0x04, set_display, true}, - {0x05, set_lorasf, true}, - {0x06, set_lorapower, true}, - {0x07, set_loraadr, true}, - {0x08, set_screensaver, true}, - {0x09, set_reset, false}, - {0x0a, set_sendcycle, true}, - {0x0b, set_wifichancycle, true}, - {0x0c, set_blescantime, true}, - {0x0d, set_vendorfilter, false}, - {0x0e, set_blescan, true}, - {0x0f, set_wifiant, true}, - {0x10, set_rgblum, true}, - {0x80, get_config, false}, - {0x81, get_uptime, false}, - {0x82, get_cputemp, false}, - {0x83, get_voltage, false}, - {0x84, get_gps, false} - }; +// +cmd_t table[] = {{0x01, set_rssi, true}, {0x02, set_countmode, true}, + {0x03, set_gps, true}, {0x04, set_display, true}, + {0x05, set_lorasf, true}, {0x06, set_lorapower, true}, + {0x07, set_loraadr, true}, {0x08, set_screensaver, true}, + {0x09, set_reset, false}, {0x0a, set_sendcycle, true}, + {0x0b, set_wifichancycle, true}, {0x0c, set_blescantime, true}, + {0x0d, set_vendorfilter, false}, {0x0e, set_blescan, true}, + {0x0f, set_wifiant, true}, {0x10, set_rgblum, true}, + {0x80, get_config, false}, {0x81, get_uptime, false}, + {0x82, get_cputemp, false}, {0x83, get_voltage, false}, + {0x84, get_gps, false}}; // check and execute remote command void rcommand(uint8_t cmd, uint8_t arg) { - int i = sizeof(table) / sizeof(table[0]); // number of commands in command table - bool store_flag = false; - while(i--) { - if(cmd == table[i].nam) { // check if valid command - table[i].func(arg); // then execute assigned function - if ( table[i].store ) store_flag = true; // set save flag if function needs to store configuration - break; // exit check loop, since command was found - } + int i = + sizeof(table) / sizeof(table[0]); // number of commands in command table + bool store_flag = false; + while (i--) { + if (cmd == table[i].nam) { // check if valid command + table[i].func(arg); // then execute assigned function + if (table[i].store) + store_flag = + true; // set save flag if function needs to store configuration + break; // exit check loop, since command was found } - if (store_flag) saveConfig(); // if save flag is set: store new configuration in NVS to make it persistent + } + if (store_flag) + saveConfig(); // if save flag is set: store new configuration in NVS to make + // it persistent } \ No newline at end of file diff --git a/src/rgb_led.cpp b/src/rgb_led.cpp index 899ded9e..772f0a0b 100644 --- a/src/rgb_led.cpp +++ b/src/rgb_led.cpp @@ -6,23 +6,22 @@ // RGB Led instance SmartLed rgb_led(LED_WS2812, 1, HAS_RGB_LED); -float rgb_CalcColor(float p, float q, float t) -{ - if (t < 0.0f) - t += 1.0f; - if (t > 1.0f) - t -= 1.0f; +float rgb_CalcColor(float p, float q, float t) { + if (t < 0.0f) + t += 1.0f; + if (t > 1.0f) + t -= 1.0f; - if (t < 1.0f / 6.0f) - return p + (q - p) * 6.0f * t; + if (t < 1.0f / 6.0f) + return p + (q - p) * 6.0f * t; - if (t < 0.5f) - return q; + if (t < 0.5f) + return q; - if (t < 2.0f / 3.0f) - return p + ((q - p) * (2.0f / 3.0f - t) * 6.0f); + if (t < 2.0f / 3.0f) + return p + ((q - p) * (2.0f / 3.0f - t) * 6.0f); - return p; + return p; } // ------------------------------------------------------------------------ @@ -30,45 +29,41 @@ float rgb_CalcColor(float p, float q, float t) // HslColor using H, S, L values (0.0 - 1.0) // L should be limited to between (0.0 - 0.5) // ------------------------------------------------------------------------ -RGBColor rgb_hsl2rgb(float h, float s, float l) -{ - RGBColor RGB_color; - float r; - float g; - float b; +RGBColor rgb_hsl2rgb(float h, float s, float l) { + RGBColor RGB_color; + float r; + float g; + float b; - if (s == 0.0f || l == 0.0f) - { - r = g = b = l; // achromatic or black - } - else - { - float q = l < 0.5f ? l * (1.0f + s) : l + s - (l * s); - float p = 2.0f * l - q; - r = rgb_CalcColor(p, q, h + 1.0f / 3.0f); - g = rgb_CalcColor(p, q, h); - b = rgb_CalcColor(p, q, h - 1.0f / 3.0f); - } + if (s == 0.0f || l == 0.0f) { + r = g = b = l; // achromatic or black + } else { + float q = l < 0.5f ? l * (1.0f + s) : l + s - (l * s); + float p = 2.0f * l - q; + r = rgb_CalcColor(p, q, h + 1.0f / 3.0f); + g = rgb_CalcColor(p, q, h); + b = rgb_CalcColor(p, q, h - 1.0f / 3.0f); + } - RGB_color.R = (uint8_t)(r * 255.0f); - RGB_color.G = (uint8_t)(g * 255.0f); - RGB_color.B = (uint8_t)(b * 255.0f); + RGB_color.R = (uint8_t)(r * 255.0f); + RGB_color.G = (uint8_t)(g * 255.0f); + RGB_color.B = (uint8_t)(b * 255.0f); - return RGB_color; + return RGB_color; } void rgb_set_color(uint16_t hue) { if (hue == COLOR_NONE) { // Off - rgb_led[0] = Rgb(0,0,0); + rgb_led[0] = Rgb(0, 0, 0); } else { // see http://www.workwithcolor.com/blue-color-hue-range-01.htm // H (is color from 0..360) should be between 0.0 and 1.0 // S is saturation keep it to 1 // L is brightness should be between 0.0 and 0.5 // cfg.rgblum is between 0 and 100 (percent) - RGBColor target = rgb_hsl2rgb( hue / 360.0f, 1.0f, 0.005f * cfg.rgblum); - //uint32_t color = target.R<<16 | target.G<<8 | target.B; + RGBColor target = rgb_hsl2rgb(hue / 360.0f, 1.0f, 0.005f * cfg.rgblum); + // uint32_t color = target.R<<16 | target.G<<8 | target.B; rgb_led[0] = Rgb(target.R, target.G, target.B); } // Show diff --git a/src/rgb_led.h b/src/rgb_led.h index 589b3f94..49aa5f76 100644 --- a/src/rgb_led.h +++ b/src/rgb_led.h @@ -3,27 +3,26 @@ // value for HSL color // see http://www.workwithcolor.com/blue-color-hue-range-01.htm -#define COLOR_RED 0 -#define COLOR_ORANGE 30 -#define COLOR_ORANGE_YELLOW 45 -#define COLOR_YELLOW 60 -#define COLOR_YELLOW_GREEN 90 -#define COLOR_GREEN 120 -#define COLOR_GREEN_CYAN 165 -#define COLOR_CYAN 180 -#define COLOR_CYAN_BLUE 210 -#define COLOR_BLUE 240 -#define COLOR_BLUE_MAGENTA 275 -#define COLOR_MAGENTA 300 -#define COLOR_PINK 350 -#define COLOR_WHITE 360 -#define COLOR_NONE 999 +#define COLOR_RED 0 +#define COLOR_ORANGE 30 +#define COLOR_ORANGE_YELLOW 45 +#define COLOR_YELLOW 60 +#define COLOR_YELLOW_GREEN 90 +#define COLOR_GREEN 120 +#define COLOR_GREEN_CYAN 165 +#define COLOR_CYAN 180 +#define COLOR_CYAN_BLUE 210 +#define COLOR_BLUE 240 +#define COLOR_BLUE_MAGENTA 275 +#define COLOR_MAGENTA 300 +#define COLOR_PINK 350 +#define COLOR_WHITE 360 +#define COLOR_NONE 999 -struct RGBColor -{ - uint8_t R; - uint8_t G; - uint8_t B; +struct RGBColor { + uint8_t R; + uint8_t G; + uint8_t B; }; // Exported Functions diff --git a/src/rokkithash.cpp b/src/rokkithash.cpp index 98b6c5c3..62e12656 100644 --- a/src/rokkithash.cpp +++ b/src/rokkithash.cpp @@ -36,48 +36,52 @@ #include -uint32_t rokkit(const char * data, int len) { +uint32_t rokkit(const char *data, int len) { uint32_t hash, tmp; int rem; - if (len <= 0 || data == 0) return 0; - hash = len; - rem = len & 3; - len >>= 2; + if (len <= 0 || data == 0) + return 0; + hash = len; + rem = len & 3; + len >>= 2; - /* Main loop */ - while (len > 0) { - hash += *((uint16_t*)data); - tmp = (*((uint16_t*)(data+2)) << 11) ^ hash; - hash = (hash << 16) ^ tmp; - data += 2*2; - hash += hash >> 11; - len--; - } + /* Main loop */ + while (len > 0) { + hash += *((uint16_t *)data); + tmp = (*((uint16_t *)(data + 2)) << 11) ^ hash; + hash = (hash << 16) ^ tmp; + data += 2 * 2; + hash += hash >> 11; + len--; + } - /* Handle end cases */ - switch (rem) { - case 3: hash += *((uint16_t*)data); - hash ^= hash << 16; - hash ^= ((signed char)data[2]) << 18; - hash += hash >> 11; - break; - case 2: hash += *((uint16_t*)data); - hash ^= hash << 11; - hash += hash >> 17; - break; - case 1: hash += (signed char)*data; - hash ^= hash << 10; - hash += hash >> 1; - } - - /* Force "avalanching" of final 127 bits */ - hash ^= hash << 3; - hash += hash >> 5; - hash ^= hash << 4; + /* Handle end cases */ + switch (rem) { + case 3: + hash += *((uint16_t *)data); + hash ^= hash << 16; + hash ^= ((signed char)data[2]) << 18; + hash += hash >> 11; + break; + case 2: + hash += *((uint16_t *)data); + hash ^= hash << 11; hash += hash >> 17; - hash ^= hash << 25; - hash += hash >> 6; + break; + case 1: + hash += (signed char)*data; + hash ^= hash << 10; + hash += hash >> 1; + } - return hash; + /* Force "avalanching" of final 127 bits */ + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + + return hash; } diff --git a/src/vendor_array.h b/src/vendor_array.h index 9b610782..fd555495 100644 --- a/src/vendor_array.h +++ b/src/vendor_array.h @@ -1,1435 +1,206 @@ std::array vendors = { - 0x38f23e, - 0x807abf, - 0x90e7c4, - 0x7c6193, - 0x485073, - 0x74e28c, - 0x8463d6, - 0xd48f33, - 0x2c8a72, - 0x980d2e, - 0xa826d9, - 0xd4206d, - 0x00155d, - 0x806c1b, - 0xa470d6, - 0x985fd3, - 0x1c69a5, - 0x382de8, - 0xd087e2, - 0x205531, - 0x5440ad, - 0x842e27, - 0x50f0d3, - 0x84119e, - 0x08eca9, - 0x10d38a, - 0x382dd1, - 0xe0cbee, - 0x64b853, - 0xf4428f, - 0x188331, - 0x8455a5, - 0xa87c01, - 0xc01173, - 0xbce63f, - 0xb857d8, - 0x94b10a, - 0xe458b8, - 0x088c2c, - 0xb86ce8, - 0x9c65b0, - 0xc8a823, - 0xc44202, - 0xd059e4, - 0x64b310, - 0x9476b7, - 0x8c1abf, - 0xb47443, - 0x30cbf8, - 0x182195, - 0xa88195, - 0x88add2, - 0xd0fccc, - 0x14c913, - 0x4c6641, - 0x3cbdd8, - 0x38256b, - 0x849866, - 0xe89309, - 0x0016db, - 0x5c3c27, - 0x10d542, - 0xa0821f, - 0xc45006, - 0x88329b, - 0xbc8ccd, - 0x400e85, - 0xec9bf3, - 0xf8042e, - 0x843838, - 0x54880e, - 0xbc79ad, - 0x30d6c9, - 0xb0df3a, - 0x805719, - 0x78a873, - 0x041bba, - 0x08fd0e, - 0x08d42b, - 0x00e3b2, - 0xc81479, - 0xf0728c, - 0x94350a, - 0x001fcd, - 0xd0dfc7, - 0x1c62b8, - 0x18e2c2, - 0x001a8a, - 0x002567, - 0xa8f274, - 0x001599, - 0x0012fb, - 0x7cf854, - 0x8cc8cd, - 0xe81132, - 0xa02195, - 0x8c71f8, - 0x04180f, - 0x9463d1, - 0x0cdfa4, - 0xcc051b, - 0x68ebae, - 0x60d0a9, - 0x60a10a, - 0xa07591, - 0x001fcc, - 0xec107b, - 0xa01081, - 0xf4f524, - 0x9c99a0, - 0x185936, - 0x98fae3, - 0x640980, - 0x8cbebe, - 0xf8a45f, - 0xbc8385, - 0x900628, - 0xd4ae05, - 0x3c0518, - 0xc40bcb, - 0xe8bba8, - 0xbc3aea, - 0x8c0ee3, - 0x6c5c14, - 0x78abbb, - 0x1816c9, - 0xfc8f90, - 0x244b03, - 0x988389, - 0x14bb6e, - 0x1c3ade, - 0xf83f51, - 0xd8e0e1, - 0xecf342, - 0x5092b9, - 0xb4bff6, - 0xc8d7b0, - 0x982d68, - 0xecd09f, - 0xe446da, - 0xf4f5db, - 0xd80831, - 0xdc5583, - 0x2c54cf, - 0x001fe3, - 0x0026e2, - 0x001e75, - 0x6cd68a, - 0x2021a5, - 0x0c4885, - 0xdc0b34, - 0xac0d1b, - 0x60e3ac, - 0xf895c7, - 0xc4438f, - 0xa816b2, - 0xe892a4, - 0x700514, - 0x88c9d0, - 0x2c598a, - 0x18f0e4, - 0xec8350, - 0x4cdd31, - 0x703eac, - 0x6c94f8, - 0x84788b, - 0x2cf0ee, - 0x68d93c, - 0x24e314, - 0x28f076, - 0x285aeb, - 0x087402, - 0xccc760, - 0x705aac, - 0xfc643a, - 0xd4e6b7, - 0x2802d8, - 0x9c2ea1, - 0x68967b, - 0xbc6778, - 0xa82066, - 0xb065bd, - 0xf0dce2, - 0x7cd1c3, - 0x705681, - 0x2cbe08, - 0x783a84, - 0x84b153, - 0x6476ba, - 0x54ae27, - 0xf437b7, - 0xf0d1a9, - 0x34c059, - 0x04f7e4, - 0x10ddb1, - 0xb4f0ab, - 0x848506, - 0x7831c1, - 0x8c7c92, - 0xd0e140, - 0xacfdec, - 0xf82793, - 0x40a6d9, - 0x109add, - 0xf0b479, - 0x58b035, - 0x34159e, - 0x286aba, - 0xec852f, - 0x44d884, - 0x003ee1, - 0x7c11be, - 0x04e536, - 0x881fa1, - 0x04db56, - 0x9cfc01, - 0xc81ee7, - 0x34363b, - 0xc01ada, - 0xacbc32, - 0x70700d, - 0x7c5049, - 0x503237, - 0xd4619d, - 0xb0481a, - 0x989e63, - 0xdca904, - 0x48a195, - 0x6cab31, - 0x6c96cf, - 0x3035ad, - 0xa8be27, - 0xb8634d, - 0x9ce33f, - 0xf0989d, - 0xace4b5, - 0xe42b34, - 0x1c36bb, - 0x3c2eff, - 0xf0766f, - 0x40cbc0, - 0x4098ad, - 0x6c4d73, - 0xc48466, - 0xd02b20, - 0x3010e4, - 0x380f4a, - 0x685b35, - 0xc86f1d, - 0x701124, - 0x38484c, - 0x041552, - 0x786c1c, - 0xbc3baf, - 0x00a040, - 0x60fec5, - 0xcc4463, - 0x6c72e7, - 0x18af61, - 0x00cdfe, - 0xac61ea, - 0x38b54d, - 0x60c547, - 0x28e02c, - 0x50ead6, - 0x4860bc, - 0x403004, - 0x0c74c2, - 0xa4b197, - 0x7cf05f, - 0xa4f1e8, - 0x70a2b3, - 0x4c57ca, - 0x68fb7e, - 0x90c1c6, - 0x9cf48e, - 0xfcd848, - 0x64b9e8, - 0x001cb3, - 0x000d93, - 0x30d9d9, - 0x6030d4, - 0x94bf2d, - 0xc49880, - 0xe0338e, - 0x68fef7, - 0xbce143, - 0x645aed, - 0xc0b658, - 0x881908, - 0xfc2a9c, - 0x48605f, - 0x188796, - 0x002376, - 0x84100d, - 0x04c23e, - 0x5c5188, - 0xe89120, - 0x9c6c15, - 0x4886e8, - 0x2c2997, - 0x102f6b, - 0x00eebd, - 0x281878, - 0x6045bd, - 0x7ced8d, - 0xe85b5b, - 0x000d3a, - 0xe09861, - 0xf4f1e1, - 0x60beb5, - 0xb4e1c4, - 0x70aab2, - 0x0026ff, - 0x406f2a, - 0x002557, - 0xf05a09, - 0x503275, - 0x28cc01, - 0xb46293, - 0x04fe31, - 0x845181, - 0xd831cf, - 0xf8d0bd, - 0xfcc734, - 0xe4b021, - 0xb0ec71, - 0x3cbbfd, - 0x2cae2b, - 0xc488e5, - 0x7c9122, - 0xe8b4c8, - 0x18895b, - 0xe0db10, - 0xe09971, - 0x6077e2, - 0x680571, - 0x6c2f2c, - 0x300d43, - 0x6c2779, - 0x607edd, - 0x9c2a83, - 0xe45d75, - 0xe4faed, - 0xc83f26, - 0x54f201, - 0xa06090, - 0xac3743, - 0x141f78, - 0x006f64, - 0xdc6672, - 0x001e7d, - 0x3c6200, - 0x0024e9, - 0x002399, - 0xe4e0c5, - 0xe8039a, - 0xc4731e, - 0x8c7712, - 0x2013e0, - 0x0007ab, - 0x0021d2, - 0xbc4760, - 0xd0176a, - 0x2cbaba, - 0x24920e, - 0x40d3ae, - 0xf01dbc, - 0x24dbed, - 0xac3613, - 0x1449e0, - 0xc0bdd1, - 0xe8508b, - 0xf025b7, - 0xc8ba94, - 0xec1f72, - 0x9852b1, - 0x1489fd, - 0xccfe3c, - 0x789ed0, - 0xe440e2, - 0x1caf05, - 0xe492fb, - 0x0073e0, - 0xbc4486, - 0x380b40, - 0x002490, - 0x0023d7, - 0xfca13e, - 0xa00798, - 0x945103, - 0xc819f7, - 0x2c4401, - 0x28e31f, - 0x0c1daf, - 0x14f65a, - 0x742344, - 0xf0b429, - 0xec51bc, - 0xf079e8, - 0x887598, - 0xd0b128, - 0xd00401, - 0xf06d78, - 0x10683f, - 0x74a722, - 0x58a2b5, - 0x64899a, - 0x88074b, - 0x64bc0c, - 0xa039f7, - 0x041b6d, - 0x001f6b, - 0x30b4b8, - 0x503cea, - 0x0c9838, - 0x54fcf0, - 0x08aed6, - 0xa816d0, - 0x88bd45, - 0x544e90, - 0xd03311, - 0x70e72c, - 0xc0cecd, - 0x98e0d9, - 0xe0accb, - 0x78d75f, - 0x2078f0, - 0x985aeb, - 0xa45e60, - 0x006d52, - 0x5cadcf, - 0xb8e856, - 0x90b21f, - 0xa8bbcf, - 0xc8b5b7, - 0x18af8f, - 0xf4f951, - 0xf0c1f1, - 0xec3586, - 0x88cb87, - 0xac3c0b, - 0xcc785f, - 0xe88d28, - 0x3ce072, - 0xf41ba1, - 0xa85b78, - 0x9cf387, - 0x34a395, - 0x48437c, - 0xac87a3, - 0x00f76f, - 0xc0f2fb, - 0x1caba7, - 0x60facd, - 0x680927, - 0x78a3e4, - 0x68a86d, - 0xb817c2, - 0xb88d12, - 0x5c8d4e, - 0xe06678, - 0x1c1ac0, - 0xc8f650, - 0x60d9c7, - 0x44fb42, - 0x64a3cb, - 0xd8d1cb, - 0x542696, - 0x14109f, - 0xbc52b7, - 0xe0c97a, - 0x5c95ae, - 0x8cfaba, - 0x0cbc9f, - 0xbc4cc4, - 0x0c1539, - 0x908d6c, - 0x80006e, - 0xb418d1, - 0x1499e2, - 0xe0c767, - 0xa860b6, - 0x24f094, - 0x90b0ed, - 0xc4b301, - 0xe05f45, - 0x483b38, - 0x88e87f, - 0xb853ac, - 0x2c3361, - 0x784f43, - 0x404d7f, - 0xbc926b, - 0x0452f3, - 0x241eeb, - 0xf431c3, - 0x64a5c3, - 0x606944, - 0xe498d6, - 0x0cd746, - 0x440010, - 0x1c9e46, - 0x7c04d0, - 0xbc9fef, - 0x8866a5, - 0x70f087, - 0x886b6e, - 0x4c74bf, - 0x844167, - 0xb4f61c, - 0xe49adc, - 0xb8c111, - 0x3408bc, - 0xd0817a, - 0xc4618b, - 0x68ab1e, - 0x2c61f6, - 0x0026bb, - 0x00254b, - 0x002436, - 0x002332, - 0x002312, - 0x0019e3, - 0x001451, - 0x000a27, - 0x003065, - 0x0050e4, - 0xd023db, - 0xe0b9ba, - 0x3451c9, - 0x8c5877, - 0x9803d8, - 0xc82a14, - 0x88c663, - 0x8c7b9d, - 0x5855ca, - 0xcc08e0, - 0xe80688, - 0x641cb0, - 0x3cdcbc, - 0xf47190, - 0x587a6a, - 0xe4c483, - 0x8cf5a3, - 0x14568e, - 0x8058f8, - 0xf0d7aa, - 0xc49ded, - 0xb0aa36, - 0x2c5bb8, - 0x1c48ce, - 0x24f5aa, - 0xf877b8, - 0x682737, - 0x5056bf, - 0x9097f3, - 0x58c5cb, - 0xacafb9, - 0x30074d, - 0x5c5181, - 0x389af6, - 0xe0aa96, - 0x507705, - 0x2c4053, - 0x084acf, - 0x1cddea, - 0x08152f, - 0xd461da, - 0xc8d083, - 0x88e9fe, - 0x88ae07, - 0x5c0947, - 0x38892c, - 0x40831d, - 0x50bc96, - 0x9ce65e, - 0x90dd5d, - 0x08f69c, - 0x00092d, - 0xf8db7f, - 0xe899c4, - 0x24da9b, - 0x1c56fe, - 0xe4907e, - 0x80c5e6, - 0x800184, - 0xf8cfc5, - 0xc808e9, - 0x206274, - 0x30d587, - 0xc0eefb, - 0x502e5c, - 0x847a88, - 0x0025ae, - 0x002538, - 0x0022a1, - 0x00125a, - 0x9cd917, - 0x9068c3, - 0x408805, - 0xf8f1b6, - 0x001ccc, - 0x94ebcd, - 0xa4e4b8, - 0x389496, - 0x0cb319, - 0x08ee8b, - 0xa89fba, - 0xfc1910, - 0x083d88, - 0x5c2e59, - 0x646cb2, - 0xf884f2, - 0x14b484, - 0x608f5c, - 0x4cbca5, - 0x78595e, - 0xb0d09c, - 0x4ca56d, - 0xa48431, - 0xe4f8ef, - 0x1432d1, - 0xe458e7, - 0x8cbfa6, - 0x7840e4, - 0x9000db, - 0x183a2d, - 0x08373d, - 0x50f520, - 0xa4ebd3, - 0x28987b, - 0xf40e22, - 0x9c3aaf, - 0x0821ef, - 0xa0cbfd, - 0x34145f, - 0x6c8fb5, - 0xac5f3e, - 0x509ea7, - 0xdccf96, - 0x6c2483, - 0xc09727, - 0xd85b2a, - 0xacc33a, - 0x88797e, - 0x00e091, - 0x6cd032, - 0xc041f6, - 0x0017d5, - 0x001247, - 0xe4121d, - 0x684898, - 0xf409d8, - 0xb479a7, - 0x002339, - 0xd487d8, - 0x184617, - 0x5001bb, - 0x380a94, - 0xd857ef, - 0x1c66aa, - 0x58c38b, - 0x001ee2, - 0x001c43, - 0x001d25, - 0x3c5a37, - 0x549b12, - 0x3c8bfe, - 0x00265d, - 0xd4e8b2, - 0x0808c2, - 0xb0c4e7, - 0xd890e8, - 0x34aa8b, - 0x24c696, - 0x181eb0, - 0x20d390, - 0x343111, - 0x34be00, - 0x78521a, - 0x7825ad, - 0xf4d9fb, - 0x0017c9, - 0x00166b, - 0x00166c, - 0xe47cf9, - 0x002454, - 0x20d5bf, - 0x30cda7, - 0xc87e75, - 0x00233a, - 0x60a4d0, - 0x2c0e3d, - 0xd4970b, - 0x64cc2e, - 0xb0e235, - 0x38a4ed, - 0xf48b32, - 0x7c787e, - 0xc0d3c0, - 0x440444, - 0xc09f05, - 0xcc2d83, - 0x38295a, - 0x4c1a3d, - 0xa81b5a, - 0xdc6dcd, - 0x54fa3e, - 0x0c8910, - 0xfcf136, - 0x981dfa, - 0x84a466, - 0x1867b0, - 0xccb11a, - 0xb8bbaf, - 0x60c5ad, - 0x28395e, - 0xc4ae12, - 0xdc74a8, - 0xc087eb, - 0x74f61c, - 0x986f60, - 0x4c189a, - 0x3cf591, - 0x602101, - 0xa89675, - 0x608e08, - 0x7c2edd, - 0x3cf7a4, - 0x342d0d, - 0x94d029, - 0x308454, - 0x4c49e3, - 0x087808, - 0xd03169, - 0xbc5451, - 0x00bf61, - 0xf80cf3, - 0x30766f, - 0x8c3ae3, - 0x78f882, - 0xb4f1da, - 0x0021fb, - 0xd013fd, - 0xa8b86e, - 0x04b167, - 0xd86375, - 0xdcbfe9, - 0x306a85, - 0x2047da, - 0x8035c1, - 0xd02598, - 0xa8667f, - 0x7014a6, - 0x10417f, - 0xac293a, - 0x94e96a, - 0x0c4de9, - 0x907240, - 0xa88808, - 0xc8e0eb, - 0x54e43a, - 0x28e14c, - 0x848e0c, - 0xb03495, - 0xf0f61c, - 0x0c3021, - 0xd89695, - 0x649abe, - 0x5cf5da, - 0x20a2e4, - 0xf02475, - 0x24a074, - 0x8863df, - 0x609217, - 0x34e2fd, - 0x0c3e9f, - 0x6c709f, - 0x6c4008, - 0x5c97f3, - 0x90fd61, - 0x006171, - 0x80e650, - 0xdc2b2a, - 0xb844d9, - 0xe0f5c6, - 0x949426, - 0xcc29f5, - 0x58404e, - 0xdc0c5c, - 0x2c200b, - 0xdca4ca, - 0x8c8fe9, - 0x9810e8, - 0xb49cdf, - 0xa4e975, - 0xc0a53e, - 0x9800c6, - 0x787b8a, - 0x3866f0, - 0x20ee28, - 0x08f4ab, - 0x8c8590, - 0xb48b19, - 0xe49a79, - 0x28a02b, - 0xb44bd2, - 0x2cf0a2, - 0xecadb8, - 0x9801a7, - 0x609ac1, - 0xf07960, - 0x9c8ba0, - 0x4c3275, - 0xe4e4ab, - 0xc8334b, - 0x00f4b9, - 0x0c771a, - 0x74e1b6, - 0x64200c, - 0xc0847a, - 0x183451, - 0xfc253f, - 0x1040f3, - 0x6cc26b, - 0x182032, - 0x70dee2, - 0x00c610, - 0x101c0c, - 0x7cfadf, - 0x5cf938, - 0x3871de, - 0xbc5436, - 0x9c4fda, - 0x1c5cf2, - 0x60fb42, - 0x002500, - 0x00236c, - 0x0021e9, - 0x001ff3, - 0x001f5b, - 0x001e52, - 0x001d4f, - 0x001124, - 0xa8fad8, - 0x5c969d, - 0xe48b7f, - 0x84fcfe, - 0x444c0c, - 0x8c2daa, - 0x6c3e6d, - 0x189efc, - 0xc09f42, - 0xb8f6b1, - 0x406c8f, - 0xa4d1d2, - 0x040cce, - 0xd89e3f, - 0x28e7cf, - 0xc8bcc8, - 0xd8a25e, - 0x90840d, - 0xf81edf, - 0xb0ca68, - 0x98ca33, - 0x68ef43, - 0xcc2db7, - 0xd4a33d, - 0xe4e0a6, - 0x70ef00, - 0x80ad16, - 0x641cae, - 0x14205e, - 0x5c1dd9, - 0x18f1d8, - 0xf86fc1, - 0xf099b6, - 0xdcd3a2, - 0x38e7d8, - 0xd8b377, - 0xb4cef6, - 0xd40b1a, - 0x5882a8, - 0xb4ae2b, - 0x0c413e, - 0xd0929e, - 0x4480eb, - 0xb84fd5, - 0xec59e7, - 0x3059b7, - 0x501ac5, - 0x1cb094, - 0xa0f450, - 0x002248, - 0xec8892, - 0xb07994, - 0x141aa3, - 0xccc3ea, - 0x34bb26, - 0x40786a, - 0xf40b93, - 0x68ed43, - 0x34bb1f, - 0x489d24, - 0x000f86, - 0xacee9e, - 0xc08997, - 0x2827bf, - 0xf05b7b, - 0x7cf90e, - 0xac5a14, - 0xb0c559, - 0xbcd11f, - 0xa0b4a5, - 0x80656d, - 0x48137e, - 0xe83a12, - 0x9c0298, - 0x6c8336, - 0xb8c68e, - 0x74458a, - 0xa49a58, - 0xb4ef39, - 0x14a364, - 0x3ca10d, - 0x206e9c, - 0x183f47, - 0x0c715d, - 0x0c1420, - 0xa80600, - 0x6cf373, - 0x78c3e9, - 0xc83870, - 0x288335, - 0x44783e, - 0x202d07, - 0x98398e, - 0x348a7b, - 0xbc765e, - 0x78009e, - 0x68c44d, - 0xf8e61a, - 0x888322, - 0x84b541, - 0x0015b9, - 0x001df6, - 0xece09b, - 0x606bbd, - 0x0000f0, - 0x4844f7, - 0x1c5a3e, - 0xf47b5e, - 0x008701, - 0xfc4203, - 0x1c232c, - 0xcc61e5, - 0x404e36, - 0x009ec8, - 0xacf7f3, - 0x102ab3, - 0x584498, - 0xa086c6, - 0x7c1dd9, - 0x9893cc, - 0x3ccd93, - 0xf06bca, - 0x3423ba, - 0xd022be, - 0xd02544, - 0xbc20a4, - 0x14f42a, - 0xbc851f, - 0xb85e7b, - 0xc462ea, - 0x0023d6, - 0x002491, - 0x001b98, - 0x44f459, - 0x34c3ac, - 0x94d771, - 0x4c3c16, - 0x9401c2, - 0xb43a28, - 0xd0c1b1, - 0xf008f1, - 0x78471d, - 0x3816d1, - 0xd48890, - 0x002566, - 0x00265f, - 0xacc1ee, - 0x5cba37, - 0x7802f8, - 0x3096fb, - 0xf0ee10, - 0xa43d78, - 0xec01ee, - 0xb83765, - 0xc4576e, - 0x90f1aa, - 0x78bdbc, - 0xd47ae2, - 0x84c0ef, - 0x7c1c68, - 0xd463c6, - 0x508f4c, - 0x7c6456, - 0x448f17, - 0x04d6aa, - 0x9ce063, - 0xf06e0b, - 0x5c865c, - 0xf0b0e7, - 0x209bcd, - 0xcc20e8, - 0x04d13a, - 0x0cf346, - 0x003de8, - 0x485929, - 0x34fcef, - 0x002483, - 0x001c62, - 0x583f54, - 0x40b0fa, - 0xa8922c, - 0x98d6f7, - 0x505527, - 0x0034da, - 0xa09169, - 0x88365f, - 0x9c8c6e, - 0xbcffeb, - 0x685acf, - 0x48746e, - 0x54724f, - 0x04f13e, - 0x600308, - 0x80ea96, - 0x24a2e1, - 0x90b931, - 0x280b5c, - 0xa8968a, - 0x9c04eb, - 0x885395, - 0x80929f, - 0x98b8e3, - 0xd8004d, - 0x98fe94, - 0x68644b, - 0xf099bf, - 0xfce998, - 0x48e9f1, - 0x4c7c5f, - 0x60f81d, - 0x689c70, - 0x2cb43a, - 0x042665, - 0xf4f15a, - 0x207d74, - 0x4c8d79, - 0xfcfc48, - 0x38c986, - 0x70ece4, - 0xd81d72, - 0x94f6a3, - 0x78fd94, - 0x48d705, - 0x7c6df8, - 0x3cab8e, - 0x787e61, - 0xd4f46f, - 0xc88550, - 0xac7f3e, - 0xa4c361, - 0x087045, - 0x40331a, - 0xdc3714, - 0x789f70, - 0x64b0a6, - 0x84fcac, - 0x6c19c0, - 0x20ab37, - 0xc0d012, - 0xd4dccd, - 0x484baa, - 0xf80377, - 0x14bd61, - 0x78886d, - 0xa85c2c, - 0x00db70, - 0xbcec5d, - 0xdc415f, - 0x30636b, - 0x0c5101, - 0x086d41, - 0x04d3cf, - 0x203cae, - 0x748d08, - 0xa03be3, - 0x186590, - 0x0010fa, - 0x000502, - 0xb8782e, - 0xa4d18c, - 0xcc25ef, - 0x68dbca, - 0x044bed, - 0x6c8dc1, - 0x38cada, - 0xf45c89, - 0x581faa, - 0x24ab81, - 0x70cd60, - 0x7cc537, - 0xc42c03, - 0xd83062, - 0x40d32d, - 0x7c6d62, - 0x286ab8, - 0x403cfc, - 0xb8c75d, - 0xe8040b, - 0xe4ce8f, - 0x3c0754, - 0xa46706, - 0x80b03d, - 0xc83c85, - 0xa04ea7, - 0x409c28, - 0x08e689, - 0x4cb199, - 0x98d6bb, - 0x3cd0f8, - 0x7cc3a1, - 0x002608, - 0x001ec2, - 0x001b63, - 0x0017f2, - 0x0016cb, - 0x000393, - 0x804971, - 0x64e682, - 0xb4f7a1, - 0x785dc8, - 0x48c796, - 0x804e70, - 0x3880df, - 0x1094bb, - 0xf01898, - 0x48a91c, - 0xa056f3, - 0x549963, - 0x28ff3c, - 0x902155, - 0x64a769, - 0xbccfcc, - 0xa4516f, - 0x3c8375, - 0x149a10, - 0x0ce725, - 0xc0335e, - 0x20a99b, - 0x4c0bbe, - 0x7c1e52, - 0xdcb4c4, - 0x001dd8, - 0x0017fa, - 0x0003ff, - 0xf8e079, - 0x1430c6, - 0xe0757d, - 0x9cd35b, - 0x60af6d, - 0xb85a73, - 0x103047, - 0x109266, - 0xb047bf, - 0x7c0bc6, - 0x804e81, - 0x244b81, - 0x50a4c8, - 0x8425db, - 0xd8c4e9, - 0x50c8e5, - 0x446d6c, - 0x38d40b, - 0x647791, - 0x781fdb, - 0x08fc88, - 0x30c7ae, - 0x18227e, - 0x00f46f, - 0x9ce6e7, - 0xe498d1, - 0x5cca1a, - 0x70288b, - 0x4849c7, - 0x205ef7, - 0x182666, - 0xc06599, - 0xcc07ab, - 0xe84e84, - 0x50fc9f, - 0xe432cb, - 0x889b39, - 0xbcb1f3, - 0x38ece4, - 0xccf9e8, - 0xf0e77e, - 0x5ce8eb, - 0xb8d9ce, - 0x70f927, - 0x301966, - 0x28bab5, - 0x103b59, - 0x6cb7f4, - 0x001ee1, - 0x0018af, - 0xbc72b1, - 0x78f7be, - 0xf49f54, - 0x00214c, - 0x001632, - 0xd0667b, - 0x001377, - 0x50b7c3, - 0x8018a7, - 0x444e1a, - 0xe8e5d6, - 0x5492be, - 0x101dc0, - 0x0021d1, - 0x68dfdd, - 0xc46ab7, - 0xfc64ba, - 0x2082c0, - 0x3480b3, - 0x7451ba, - 0x64b473, - 0xcc2d8c, - 0x949aa9, - 0x20dbab, - 0x5c9960, - 0x948bc1, - 0x4827ea, - 0x388c50, - 0xa09347, - 0xc8f230, - 0x1c77f6, - 0xe44790, - 0xd4503f, - 0x40163b, - 0x5c497d, - 0xe47dbd, - 0x503da1, - 0x508569, - 0x1077b1, - 0x5cf6dc, - 0x380195, - 0xbc1485, - 0x88d50c, - 0x947be7, - 0x00ec0a, - 0x54bd79, - 0xdc44b6, - 0x1007b6, - 0xc0174d, - 0xa407b6, - 0x149f3c, - 0x88b4a6, - 0x2c5491, - 0x5c70a3, - 0x10f96f, - 0xf01c13, - 0x00aa70, - 0xbcf5ac, - 0xccfa00, - 0xf8a9d0, - 0x805a04, - 0x5caf06, - 0xb81daa, - 0x10f1f2, - 0x0025e5, - 0x0022a9, - 0xc49a02, - 0x344df7, - 0xd41a3f, - 0xcc6ea4, - 0xa46cf1, - 0x0ca8a7, - 0x54b802, - 0x0469f8, - 0xbc6c21, - 0xc869cd, - 0x80d605, - 0x587f57, - 0xa4b805, - 0x70480f, - 0x18f643, - 0x748114, - 0x18ee69, - 0xf0dbe2, - 0xb8098a, - 0x549f13, - 0x2c1f23, - 0x507a55, - 0x9c35eb, - 0xa43135, - 0xd0034b, - 0xa01828, - 0xd0a637, - 0xd04f7e, - 0xd8bb2c, - 0x80be05, - 0xe0b52d, - 0x68ae20, - 0xe8802e, - 0x7c0191, - 0x9c293f, - 0x341298, - 0x903c92, - 0x24240e, - 0xa0999b, - 0xe0f847, - 0x442a60, - 0x1093e9, - 0xdc2b61, - 0xb8ff61, - 0x18e7f4, - 0x78ca39, - 0x5c5948, - 0x60334b, - 0x9027e4, - 0xd49a20, - 0xb09fba, - 0x8c006d, - 0xc06394, - 0x843835, - 0xe4c63d, - 0x54eaa8, - 0xa886dd, - 0xaccf5c, - 0xf0dbf8, - 0x98f0ab, - 0xdc9b9c, - 0x8c2937, - 0xdc86d8, - 0xa88e24, - 0xd8cf9c, - 0x04489a, - 0x3c15c2, - 0x20c9d0, - 0x74e2f5, - 0x842999, - 0x9c207b, - 0x283737, - 0x148fc6, - 0x28cfda, - 0x145a05, - 0xa0edcd, - 0x1ce62b, - 0x3090ab, - 0x7073cb, - 0xf0cba1, - 0x045453, - 0x40b395, - 0x008865, - 0x30f7c5, - 0x20768f, - 0xc0ccf8, - 0x80ed2c, - 0xe8b2ac, - 0x8489ad, - 0x8c8ef2, - 0xf40f24, - 0x84a134, - 0x1c9148, - 0x5cf7e6, - 0xa0d795, - 0xcc088d, - 0x00b362, - 0xf86214, - 0xb0702d, - 0xd0c5f3, - 0x60f445, - 0x5082d5, - 0x9c84bf, - 0x48bf6b, - 0x245ba7, - 0xbca920, - 0xb019c6, - 0x58e28f, - 0xac1f74, - 0x080007, - 0xe425e7, - 0x28cfe9, - 0x9060f1, - 0x741bb2, - 0x28ed6a, - 0x34ab37, - 0x60a37d, - 0x0056cd, - 0x7081eb, - 0x086698, - 0x24f677, - 0x7867d7, - 0x5433cb, - 0xd0d2b0, - 0xd88f76, - 0x3c2ef9, - 0xdc56e7, - 0x347c25, - 0xd4909c, - 0x041e64, - 0x0026b0, - 0x00264a, - 0x0025bc, - 0x0023df, - 0x002241, - 0x000a95, - 0x38e60a, - 0x24181d, - 0xf4c248, - 0xa8515b, - 0xc048e6, - 0xd07714, - 0x749eaf, - 0xb841a4, - 0xf895ea, - 0x50a67f, - 0x647033, - 0x846878 -}; + 0x38f23e, 0x807abf, 0x90e7c4, 0x7c6193, 0x485073, 0x74e28c, 0x8463d6, + 0xd48f33, 0x2c8a72, 0x980d2e, 0xa826d9, 0xd4206d, 0x00155d, 0x806c1b, + 0xa470d6, 0x985fd3, 0x1c69a5, 0x382de8, 0xd087e2, 0x205531, 0x5440ad, + 0x842e27, 0x50f0d3, 0x84119e, 0x08eca9, 0x10d38a, 0x382dd1, 0xe0cbee, + 0x64b853, 0xf4428f, 0x188331, 0x8455a5, 0xa87c01, 0xc01173, 0xbce63f, + 0xb857d8, 0x94b10a, 0xe458b8, 0x088c2c, 0xb86ce8, 0x9c65b0, 0xc8a823, + 0xc44202, 0xd059e4, 0x64b310, 0x9476b7, 0x8c1abf, 0xb47443, 0x30cbf8, + 0x182195, 0xa88195, 0x88add2, 0xd0fccc, 0x14c913, 0x4c6641, 0x3cbdd8, + 0x38256b, 0x849866, 0xe89309, 0x0016db, 0x5c3c27, 0x10d542, 0xa0821f, + 0xc45006, 0x88329b, 0xbc8ccd, 0x400e85, 0xec9bf3, 0xf8042e, 0x843838, + 0x54880e, 0xbc79ad, 0x30d6c9, 0xb0df3a, 0x805719, 0x78a873, 0x041bba, + 0x08fd0e, 0x08d42b, 0x00e3b2, 0xc81479, 0xf0728c, 0x94350a, 0x001fcd, + 0xd0dfc7, 0x1c62b8, 0x18e2c2, 0x001a8a, 0x002567, 0xa8f274, 0x001599, + 0x0012fb, 0x7cf854, 0x8cc8cd, 0xe81132, 0xa02195, 0x8c71f8, 0x04180f, + 0x9463d1, 0x0cdfa4, 0xcc051b, 0x68ebae, 0x60d0a9, 0x60a10a, 0xa07591, + 0x001fcc, 0xec107b, 0xa01081, 0xf4f524, 0x9c99a0, 0x185936, 0x98fae3, + 0x640980, 0x8cbebe, 0xf8a45f, 0xbc8385, 0x900628, 0xd4ae05, 0x3c0518, + 0xc40bcb, 0xe8bba8, 0xbc3aea, 0x8c0ee3, 0x6c5c14, 0x78abbb, 0x1816c9, + 0xfc8f90, 0x244b03, 0x988389, 0x14bb6e, 0x1c3ade, 0xf83f51, 0xd8e0e1, + 0xecf342, 0x5092b9, 0xb4bff6, 0xc8d7b0, 0x982d68, 0xecd09f, 0xe446da, + 0xf4f5db, 0xd80831, 0xdc5583, 0x2c54cf, 0x001fe3, 0x0026e2, 0x001e75, + 0x6cd68a, 0x2021a5, 0x0c4885, 0xdc0b34, 0xac0d1b, 0x60e3ac, 0xf895c7, + 0xc4438f, 0xa816b2, 0xe892a4, 0x700514, 0x88c9d0, 0x2c598a, 0x18f0e4, + 0xec8350, 0x4cdd31, 0x703eac, 0x6c94f8, 0x84788b, 0x2cf0ee, 0x68d93c, + 0x24e314, 0x28f076, 0x285aeb, 0x087402, 0xccc760, 0x705aac, 0xfc643a, + 0xd4e6b7, 0x2802d8, 0x9c2ea1, 0x68967b, 0xbc6778, 0xa82066, 0xb065bd, + 0xf0dce2, 0x7cd1c3, 0x705681, 0x2cbe08, 0x783a84, 0x84b153, 0x6476ba, + 0x54ae27, 0xf437b7, 0xf0d1a9, 0x34c059, 0x04f7e4, 0x10ddb1, 0xb4f0ab, + 0x848506, 0x7831c1, 0x8c7c92, 0xd0e140, 0xacfdec, 0xf82793, 0x40a6d9, + 0x109add, 0xf0b479, 0x58b035, 0x34159e, 0x286aba, 0xec852f, 0x44d884, + 0x003ee1, 0x7c11be, 0x04e536, 0x881fa1, 0x04db56, 0x9cfc01, 0xc81ee7, + 0x34363b, 0xc01ada, 0xacbc32, 0x70700d, 0x7c5049, 0x503237, 0xd4619d, + 0xb0481a, 0x989e63, 0xdca904, 0x48a195, 0x6cab31, 0x6c96cf, 0x3035ad, + 0xa8be27, 0xb8634d, 0x9ce33f, 0xf0989d, 0xace4b5, 0xe42b34, 0x1c36bb, + 0x3c2eff, 0xf0766f, 0x40cbc0, 0x4098ad, 0x6c4d73, 0xc48466, 0xd02b20, + 0x3010e4, 0x380f4a, 0x685b35, 0xc86f1d, 0x701124, 0x38484c, 0x041552, + 0x786c1c, 0xbc3baf, 0x00a040, 0x60fec5, 0xcc4463, 0x6c72e7, 0x18af61, + 0x00cdfe, 0xac61ea, 0x38b54d, 0x60c547, 0x28e02c, 0x50ead6, 0x4860bc, + 0x403004, 0x0c74c2, 0xa4b197, 0x7cf05f, 0xa4f1e8, 0x70a2b3, 0x4c57ca, + 0x68fb7e, 0x90c1c6, 0x9cf48e, 0xfcd848, 0x64b9e8, 0x001cb3, 0x000d93, + 0x30d9d9, 0x6030d4, 0x94bf2d, 0xc49880, 0xe0338e, 0x68fef7, 0xbce143, + 0x645aed, 0xc0b658, 0x881908, 0xfc2a9c, 0x48605f, 0x188796, 0x002376, + 0x84100d, 0x04c23e, 0x5c5188, 0xe89120, 0x9c6c15, 0x4886e8, 0x2c2997, + 0x102f6b, 0x00eebd, 0x281878, 0x6045bd, 0x7ced8d, 0xe85b5b, 0x000d3a, + 0xe09861, 0xf4f1e1, 0x60beb5, 0xb4e1c4, 0x70aab2, 0x0026ff, 0x406f2a, + 0x002557, 0xf05a09, 0x503275, 0x28cc01, 0xb46293, 0x04fe31, 0x845181, + 0xd831cf, 0xf8d0bd, 0xfcc734, 0xe4b021, 0xb0ec71, 0x3cbbfd, 0x2cae2b, + 0xc488e5, 0x7c9122, 0xe8b4c8, 0x18895b, 0xe0db10, 0xe09971, 0x6077e2, + 0x680571, 0x6c2f2c, 0x300d43, 0x6c2779, 0x607edd, 0x9c2a83, 0xe45d75, + 0xe4faed, 0xc83f26, 0x54f201, 0xa06090, 0xac3743, 0x141f78, 0x006f64, + 0xdc6672, 0x001e7d, 0x3c6200, 0x0024e9, 0x002399, 0xe4e0c5, 0xe8039a, + 0xc4731e, 0x8c7712, 0x2013e0, 0x0007ab, 0x0021d2, 0xbc4760, 0xd0176a, + 0x2cbaba, 0x24920e, 0x40d3ae, 0xf01dbc, 0x24dbed, 0xac3613, 0x1449e0, + 0xc0bdd1, 0xe8508b, 0xf025b7, 0xc8ba94, 0xec1f72, 0x9852b1, 0x1489fd, + 0xccfe3c, 0x789ed0, 0xe440e2, 0x1caf05, 0xe492fb, 0x0073e0, 0xbc4486, + 0x380b40, 0x002490, 0x0023d7, 0xfca13e, 0xa00798, 0x945103, 0xc819f7, + 0x2c4401, 0x28e31f, 0x0c1daf, 0x14f65a, 0x742344, 0xf0b429, 0xec51bc, + 0xf079e8, 0x887598, 0xd0b128, 0xd00401, 0xf06d78, 0x10683f, 0x74a722, + 0x58a2b5, 0x64899a, 0x88074b, 0x64bc0c, 0xa039f7, 0x041b6d, 0x001f6b, + 0x30b4b8, 0x503cea, 0x0c9838, 0x54fcf0, 0x08aed6, 0xa816d0, 0x88bd45, + 0x544e90, 0xd03311, 0x70e72c, 0xc0cecd, 0x98e0d9, 0xe0accb, 0x78d75f, + 0x2078f0, 0x985aeb, 0xa45e60, 0x006d52, 0x5cadcf, 0xb8e856, 0x90b21f, + 0xa8bbcf, 0xc8b5b7, 0x18af8f, 0xf4f951, 0xf0c1f1, 0xec3586, 0x88cb87, + 0xac3c0b, 0xcc785f, 0xe88d28, 0x3ce072, 0xf41ba1, 0xa85b78, 0x9cf387, + 0x34a395, 0x48437c, 0xac87a3, 0x00f76f, 0xc0f2fb, 0x1caba7, 0x60facd, + 0x680927, 0x78a3e4, 0x68a86d, 0xb817c2, 0xb88d12, 0x5c8d4e, 0xe06678, + 0x1c1ac0, 0xc8f650, 0x60d9c7, 0x44fb42, 0x64a3cb, 0xd8d1cb, 0x542696, + 0x14109f, 0xbc52b7, 0xe0c97a, 0x5c95ae, 0x8cfaba, 0x0cbc9f, 0xbc4cc4, + 0x0c1539, 0x908d6c, 0x80006e, 0xb418d1, 0x1499e2, 0xe0c767, 0xa860b6, + 0x24f094, 0x90b0ed, 0xc4b301, 0xe05f45, 0x483b38, 0x88e87f, 0xb853ac, + 0x2c3361, 0x784f43, 0x404d7f, 0xbc926b, 0x0452f3, 0x241eeb, 0xf431c3, + 0x64a5c3, 0x606944, 0xe498d6, 0x0cd746, 0x440010, 0x1c9e46, 0x7c04d0, + 0xbc9fef, 0x8866a5, 0x70f087, 0x886b6e, 0x4c74bf, 0x844167, 0xb4f61c, + 0xe49adc, 0xb8c111, 0x3408bc, 0xd0817a, 0xc4618b, 0x68ab1e, 0x2c61f6, + 0x0026bb, 0x00254b, 0x002436, 0x002332, 0x002312, 0x0019e3, 0x001451, + 0x000a27, 0x003065, 0x0050e4, 0xd023db, 0xe0b9ba, 0x3451c9, 0x8c5877, + 0x9803d8, 0xc82a14, 0x88c663, 0x8c7b9d, 0x5855ca, 0xcc08e0, 0xe80688, + 0x641cb0, 0x3cdcbc, 0xf47190, 0x587a6a, 0xe4c483, 0x8cf5a3, 0x14568e, + 0x8058f8, 0xf0d7aa, 0xc49ded, 0xb0aa36, 0x2c5bb8, 0x1c48ce, 0x24f5aa, + 0xf877b8, 0x682737, 0x5056bf, 0x9097f3, 0x58c5cb, 0xacafb9, 0x30074d, + 0x5c5181, 0x389af6, 0xe0aa96, 0x507705, 0x2c4053, 0x084acf, 0x1cddea, + 0x08152f, 0xd461da, 0xc8d083, 0x88e9fe, 0x88ae07, 0x5c0947, 0x38892c, + 0x40831d, 0x50bc96, 0x9ce65e, 0x90dd5d, 0x08f69c, 0x00092d, 0xf8db7f, + 0xe899c4, 0x24da9b, 0x1c56fe, 0xe4907e, 0x80c5e6, 0x800184, 0xf8cfc5, + 0xc808e9, 0x206274, 0x30d587, 0xc0eefb, 0x502e5c, 0x847a88, 0x0025ae, + 0x002538, 0x0022a1, 0x00125a, 0x9cd917, 0x9068c3, 0x408805, 0xf8f1b6, + 0x001ccc, 0x94ebcd, 0xa4e4b8, 0x389496, 0x0cb319, 0x08ee8b, 0xa89fba, + 0xfc1910, 0x083d88, 0x5c2e59, 0x646cb2, 0xf884f2, 0x14b484, 0x608f5c, + 0x4cbca5, 0x78595e, 0xb0d09c, 0x4ca56d, 0xa48431, 0xe4f8ef, 0x1432d1, + 0xe458e7, 0x8cbfa6, 0x7840e4, 0x9000db, 0x183a2d, 0x08373d, 0x50f520, + 0xa4ebd3, 0x28987b, 0xf40e22, 0x9c3aaf, 0x0821ef, 0xa0cbfd, 0x34145f, + 0x6c8fb5, 0xac5f3e, 0x509ea7, 0xdccf96, 0x6c2483, 0xc09727, 0xd85b2a, + 0xacc33a, 0x88797e, 0x00e091, 0x6cd032, 0xc041f6, 0x0017d5, 0x001247, + 0xe4121d, 0x684898, 0xf409d8, 0xb479a7, 0x002339, 0xd487d8, 0x184617, + 0x5001bb, 0x380a94, 0xd857ef, 0x1c66aa, 0x58c38b, 0x001ee2, 0x001c43, + 0x001d25, 0x3c5a37, 0x549b12, 0x3c8bfe, 0x00265d, 0xd4e8b2, 0x0808c2, + 0xb0c4e7, 0xd890e8, 0x34aa8b, 0x24c696, 0x181eb0, 0x20d390, 0x343111, + 0x34be00, 0x78521a, 0x7825ad, 0xf4d9fb, 0x0017c9, 0x00166b, 0x00166c, + 0xe47cf9, 0x002454, 0x20d5bf, 0x30cda7, 0xc87e75, 0x00233a, 0x60a4d0, + 0x2c0e3d, 0xd4970b, 0x64cc2e, 0xb0e235, 0x38a4ed, 0xf48b32, 0x7c787e, + 0xc0d3c0, 0x440444, 0xc09f05, 0xcc2d83, 0x38295a, 0x4c1a3d, 0xa81b5a, + 0xdc6dcd, 0x54fa3e, 0x0c8910, 0xfcf136, 0x981dfa, 0x84a466, 0x1867b0, + 0xccb11a, 0xb8bbaf, 0x60c5ad, 0x28395e, 0xc4ae12, 0xdc74a8, 0xc087eb, + 0x74f61c, 0x986f60, 0x4c189a, 0x3cf591, 0x602101, 0xa89675, 0x608e08, + 0x7c2edd, 0x3cf7a4, 0x342d0d, 0x94d029, 0x308454, 0x4c49e3, 0x087808, + 0xd03169, 0xbc5451, 0x00bf61, 0xf80cf3, 0x30766f, 0x8c3ae3, 0x78f882, + 0xb4f1da, 0x0021fb, 0xd013fd, 0xa8b86e, 0x04b167, 0xd86375, 0xdcbfe9, + 0x306a85, 0x2047da, 0x8035c1, 0xd02598, 0xa8667f, 0x7014a6, 0x10417f, + 0xac293a, 0x94e96a, 0x0c4de9, 0x907240, 0xa88808, 0xc8e0eb, 0x54e43a, + 0x28e14c, 0x848e0c, 0xb03495, 0xf0f61c, 0x0c3021, 0xd89695, 0x649abe, + 0x5cf5da, 0x20a2e4, 0xf02475, 0x24a074, 0x8863df, 0x609217, 0x34e2fd, + 0x0c3e9f, 0x6c709f, 0x6c4008, 0x5c97f3, 0x90fd61, 0x006171, 0x80e650, + 0xdc2b2a, 0xb844d9, 0xe0f5c6, 0x949426, 0xcc29f5, 0x58404e, 0xdc0c5c, + 0x2c200b, 0xdca4ca, 0x8c8fe9, 0x9810e8, 0xb49cdf, 0xa4e975, 0xc0a53e, + 0x9800c6, 0x787b8a, 0x3866f0, 0x20ee28, 0x08f4ab, 0x8c8590, 0xb48b19, + 0xe49a79, 0x28a02b, 0xb44bd2, 0x2cf0a2, 0xecadb8, 0x9801a7, 0x609ac1, + 0xf07960, 0x9c8ba0, 0x4c3275, 0xe4e4ab, 0xc8334b, 0x00f4b9, 0x0c771a, + 0x74e1b6, 0x64200c, 0xc0847a, 0x183451, 0xfc253f, 0x1040f3, 0x6cc26b, + 0x182032, 0x70dee2, 0x00c610, 0x101c0c, 0x7cfadf, 0x5cf938, 0x3871de, + 0xbc5436, 0x9c4fda, 0x1c5cf2, 0x60fb42, 0x002500, 0x00236c, 0x0021e9, + 0x001ff3, 0x001f5b, 0x001e52, 0x001d4f, 0x001124, 0xa8fad8, 0x5c969d, + 0xe48b7f, 0x84fcfe, 0x444c0c, 0x8c2daa, 0x6c3e6d, 0x189efc, 0xc09f42, + 0xb8f6b1, 0x406c8f, 0xa4d1d2, 0x040cce, 0xd89e3f, 0x28e7cf, 0xc8bcc8, + 0xd8a25e, 0x90840d, 0xf81edf, 0xb0ca68, 0x98ca33, 0x68ef43, 0xcc2db7, + 0xd4a33d, 0xe4e0a6, 0x70ef00, 0x80ad16, 0x641cae, 0x14205e, 0x5c1dd9, + 0x18f1d8, 0xf86fc1, 0xf099b6, 0xdcd3a2, 0x38e7d8, 0xd8b377, 0xb4cef6, + 0xd40b1a, 0x5882a8, 0xb4ae2b, 0x0c413e, 0xd0929e, 0x4480eb, 0xb84fd5, + 0xec59e7, 0x3059b7, 0x501ac5, 0x1cb094, 0xa0f450, 0x002248, 0xec8892, + 0xb07994, 0x141aa3, 0xccc3ea, 0x34bb26, 0x40786a, 0xf40b93, 0x68ed43, + 0x34bb1f, 0x489d24, 0x000f86, 0xacee9e, 0xc08997, 0x2827bf, 0xf05b7b, + 0x7cf90e, 0xac5a14, 0xb0c559, 0xbcd11f, 0xa0b4a5, 0x80656d, 0x48137e, + 0xe83a12, 0x9c0298, 0x6c8336, 0xb8c68e, 0x74458a, 0xa49a58, 0xb4ef39, + 0x14a364, 0x3ca10d, 0x206e9c, 0x183f47, 0x0c715d, 0x0c1420, 0xa80600, + 0x6cf373, 0x78c3e9, 0xc83870, 0x288335, 0x44783e, 0x202d07, 0x98398e, + 0x348a7b, 0xbc765e, 0x78009e, 0x68c44d, 0xf8e61a, 0x888322, 0x84b541, + 0x0015b9, 0x001df6, 0xece09b, 0x606bbd, 0x0000f0, 0x4844f7, 0x1c5a3e, + 0xf47b5e, 0x008701, 0xfc4203, 0x1c232c, 0xcc61e5, 0x404e36, 0x009ec8, + 0xacf7f3, 0x102ab3, 0x584498, 0xa086c6, 0x7c1dd9, 0x9893cc, 0x3ccd93, + 0xf06bca, 0x3423ba, 0xd022be, 0xd02544, 0xbc20a4, 0x14f42a, 0xbc851f, + 0xb85e7b, 0xc462ea, 0x0023d6, 0x002491, 0x001b98, 0x44f459, 0x34c3ac, + 0x94d771, 0x4c3c16, 0x9401c2, 0xb43a28, 0xd0c1b1, 0xf008f1, 0x78471d, + 0x3816d1, 0xd48890, 0x002566, 0x00265f, 0xacc1ee, 0x5cba37, 0x7802f8, + 0x3096fb, 0xf0ee10, 0xa43d78, 0xec01ee, 0xb83765, 0xc4576e, 0x90f1aa, + 0x78bdbc, 0xd47ae2, 0x84c0ef, 0x7c1c68, 0xd463c6, 0x508f4c, 0x7c6456, + 0x448f17, 0x04d6aa, 0x9ce063, 0xf06e0b, 0x5c865c, 0xf0b0e7, 0x209bcd, + 0xcc20e8, 0x04d13a, 0x0cf346, 0x003de8, 0x485929, 0x34fcef, 0x002483, + 0x001c62, 0x583f54, 0x40b0fa, 0xa8922c, 0x98d6f7, 0x505527, 0x0034da, + 0xa09169, 0x88365f, 0x9c8c6e, 0xbcffeb, 0x685acf, 0x48746e, 0x54724f, + 0x04f13e, 0x600308, 0x80ea96, 0x24a2e1, 0x90b931, 0x280b5c, 0xa8968a, + 0x9c04eb, 0x885395, 0x80929f, 0x98b8e3, 0xd8004d, 0x98fe94, 0x68644b, + 0xf099bf, 0xfce998, 0x48e9f1, 0x4c7c5f, 0x60f81d, 0x689c70, 0x2cb43a, + 0x042665, 0xf4f15a, 0x207d74, 0x4c8d79, 0xfcfc48, 0x38c986, 0x70ece4, + 0xd81d72, 0x94f6a3, 0x78fd94, 0x48d705, 0x7c6df8, 0x3cab8e, 0x787e61, + 0xd4f46f, 0xc88550, 0xac7f3e, 0xa4c361, 0x087045, 0x40331a, 0xdc3714, + 0x789f70, 0x64b0a6, 0x84fcac, 0x6c19c0, 0x20ab37, 0xc0d012, 0xd4dccd, + 0x484baa, 0xf80377, 0x14bd61, 0x78886d, 0xa85c2c, 0x00db70, 0xbcec5d, + 0xdc415f, 0x30636b, 0x0c5101, 0x086d41, 0x04d3cf, 0x203cae, 0x748d08, + 0xa03be3, 0x186590, 0x0010fa, 0x000502, 0xb8782e, 0xa4d18c, 0xcc25ef, + 0x68dbca, 0x044bed, 0x6c8dc1, 0x38cada, 0xf45c89, 0x581faa, 0x24ab81, + 0x70cd60, 0x7cc537, 0xc42c03, 0xd83062, 0x40d32d, 0x7c6d62, 0x286ab8, + 0x403cfc, 0xb8c75d, 0xe8040b, 0xe4ce8f, 0x3c0754, 0xa46706, 0x80b03d, + 0xc83c85, 0xa04ea7, 0x409c28, 0x08e689, 0x4cb199, 0x98d6bb, 0x3cd0f8, + 0x7cc3a1, 0x002608, 0x001ec2, 0x001b63, 0x0017f2, 0x0016cb, 0x000393, + 0x804971, 0x64e682, 0xb4f7a1, 0x785dc8, 0x48c796, 0x804e70, 0x3880df, + 0x1094bb, 0xf01898, 0x48a91c, 0xa056f3, 0x549963, 0x28ff3c, 0x902155, + 0x64a769, 0xbccfcc, 0xa4516f, 0x3c8375, 0x149a10, 0x0ce725, 0xc0335e, + 0x20a99b, 0x4c0bbe, 0x7c1e52, 0xdcb4c4, 0x001dd8, 0x0017fa, 0x0003ff, + 0xf8e079, 0x1430c6, 0xe0757d, 0x9cd35b, 0x60af6d, 0xb85a73, 0x103047, + 0x109266, 0xb047bf, 0x7c0bc6, 0x804e81, 0x244b81, 0x50a4c8, 0x8425db, + 0xd8c4e9, 0x50c8e5, 0x446d6c, 0x38d40b, 0x647791, 0x781fdb, 0x08fc88, + 0x30c7ae, 0x18227e, 0x00f46f, 0x9ce6e7, 0xe498d1, 0x5cca1a, 0x70288b, + 0x4849c7, 0x205ef7, 0x182666, 0xc06599, 0xcc07ab, 0xe84e84, 0x50fc9f, + 0xe432cb, 0x889b39, 0xbcb1f3, 0x38ece4, 0xccf9e8, 0xf0e77e, 0x5ce8eb, + 0xb8d9ce, 0x70f927, 0x301966, 0x28bab5, 0x103b59, 0x6cb7f4, 0x001ee1, + 0x0018af, 0xbc72b1, 0x78f7be, 0xf49f54, 0x00214c, 0x001632, 0xd0667b, + 0x001377, 0x50b7c3, 0x8018a7, 0x444e1a, 0xe8e5d6, 0x5492be, 0x101dc0, + 0x0021d1, 0x68dfdd, 0xc46ab7, 0xfc64ba, 0x2082c0, 0x3480b3, 0x7451ba, + 0x64b473, 0xcc2d8c, 0x949aa9, 0x20dbab, 0x5c9960, 0x948bc1, 0x4827ea, + 0x388c50, 0xa09347, 0xc8f230, 0x1c77f6, 0xe44790, 0xd4503f, 0x40163b, + 0x5c497d, 0xe47dbd, 0x503da1, 0x508569, 0x1077b1, 0x5cf6dc, 0x380195, + 0xbc1485, 0x88d50c, 0x947be7, 0x00ec0a, 0x54bd79, 0xdc44b6, 0x1007b6, + 0xc0174d, 0xa407b6, 0x149f3c, 0x88b4a6, 0x2c5491, 0x5c70a3, 0x10f96f, + 0xf01c13, 0x00aa70, 0xbcf5ac, 0xccfa00, 0xf8a9d0, 0x805a04, 0x5caf06, + 0xb81daa, 0x10f1f2, 0x0025e5, 0x0022a9, 0xc49a02, 0x344df7, 0xd41a3f, + 0xcc6ea4, 0xa46cf1, 0x0ca8a7, 0x54b802, 0x0469f8, 0xbc6c21, 0xc869cd, + 0x80d605, 0x587f57, 0xa4b805, 0x70480f, 0x18f643, 0x748114, 0x18ee69, + 0xf0dbe2, 0xb8098a, 0x549f13, 0x2c1f23, 0x507a55, 0x9c35eb, 0xa43135, + 0xd0034b, 0xa01828, 0xd0a637, 0xd04f7e, 0xd8bb2c, 0x80be05, 0xe0b52d, + 0x68ae20, 0xe8802e, 0x7c0191, 0x9c293f, 0x341298, 0x903c92, 0x24240e, + 0xa0999b, 0xe0f847, 0x442a60, 0x1093e9, 0xdc2b61, 0xb8ff61, 0x18e7f4, + 0x78ca39, 0x5c5948, 0x60334b, 0x9027e4, 0xd49a20, 0xb09fba, 0x8c006d, + 0xc06394, 0x843835, 0xe4c63d, 0x54eaa8, 0xa886dd, 0xaccf5c, 0xf0dbf8, + 0x98f0ab, 0xdc9b9c, 0x8c2937, 0xdc86d8, 0xa88e24, 0xd8cf9c, 0x04489a, + 0x3c15c2, 0x20c9d0, 0x74e2f5, 0x842999, 0x9c207b, 0x283737, 0x148fc6, + 0x28cfda, 0x145a05, 0xa0edcd, 0x1ce62b, 0x3090ab, 0x7073cb, 0xf0cba1, + 0x045453, 0x40b395, 0x008865, 0x30f7c5, 0x20768f, 0xc0ccf8, 0x80ed2c, + 0xe8b2ac, 0x8489ad, 0x8c8ef2, 0xf40f24, 0x84a134, 0x1c9148, 0x5cf7e6, + 0xa0d795, 0xcc088d, 0x00b362, 0xf86214, 0xb0702d, 0xd0c5f3, 0x60f445, + 0x5082d5, 0x9c84bf, 0x48bf6b, 0x245ba7, 0xbca920, 0xb019c6, 0x58e28f, + 0xac1f74, 0x080007, 0xe425e7, 0x28cfe9, 0x9060f1, 0x741bb2, 0x28ed6a, + 0x34ab37, 0x60a37d, 0x0056cd, 0x7081eb, 0x086698, 0x24f677, 0x7867d7, + 0x5433cb, 0xd0d2b0, 0xd88f76, 0x3c2ef9, 0xdc56e7, 0x347c25, 0xd4909c, + 0x041e64, 0x0026b0, 0x00264a, 0x0025bc, 0x0023df, 0x002241, 0x000a95, + 0x38e60a, 0x24181d, 0xf4c248, 0xa8515b, 0xc048e6, 0xd07714, 0x749eaf, + 0xb841a4, 0xf895ea, 0x50a67f, 0x647033, 0x846878};